Search in sources :

Example 1 with AreaOwner

use of org.pentaho.di.core.gui.AreaOwner in project pentaho-kettle by pentaho.

the class TransGraph method mouseUp.

@Override
public void mouseUp(MouseEvent e) {
    try {
        TransGraphExtension ext = new TransGraphExtension(null, e, getArea());
        ExtensionPointHandler.callExtensionPoint(LogChannel.GENERAL, KettleExtensionPoint.TransGraphMouseUp.id, ext);
        if (ext.isPreventDefault()) {
            redraw();
            clearSettings();
            return;
        }
    } catch (Exception ex) {
        LogChannel.GENERAL.logError("Error calling TransGraphMouseUp extension point", ex);
    }
    boolean control = (e.stateMask & SWT.MOD1) != 0;
    TransHopMeta selectedHop = findHop(e.x, e.y);
    updateErrorMetaForHop(selectedHop);
    if (iconoffset == null) {
        iconoffset = new Point(0, 0);
    }
    Point real = screen2real(e.x, e.y);
    Point icon = new Point(real.x - iconoffset.x, real.y - iconoffset.y);
    AreaOwner areaOwner = getVisibleAreaOwner(real.x, real.y);
    try {
        TransGraphExtension ext = new TransGraphExtension(this, e, real);
        ExtensionPointHandler.callExtensionPoint(LogChannel.GENERAL, KettleExtensionPoint.TransGraphMouseUp.id, ext);
        if (ext.isPreventDefault()) {
            redraw();
            clearSettings();
            return;
        }
    } catch (Exception ex) {
        LogChannel.GENERAL.logError("Error calling TransGraphMouseUp extension point", ex);
    }
    // 
    if (candidate != null && areaOwner != null && areaOwner.getAreaType() != null) {
        switch(areaOwner.getAreaType()) {
            case STEP_ICON:
                currentStep = (StepMeta) areaOwner.getOwner();
                break;
            case STEP_INPUT_HOP_ICON:
                currentStep = (StepMeta) areaOwner.getParent();
                break;
            default:
                break;
        }
        addCandidateAsHop(e.x, e.y);
        redraw();
    } else {
        // 
        if (selectionRegion != null) {
            selectionRegion.width = real.x - selectionRegion.x;
            selectionRegion.height = real.y - selectionRegion.y;
            transMeta.unselectAll();
            selectInRect(transMeta, selectionRegion);
            selectionRegion = null;
            stopStepMouseOverDelayTimers();
            redraw();
        } else {
            // 
            if (selectedStep != null && startHopStep == null) {
                if (e.button == 1) {
                    Point realclick = screen2real(e.x, e.y);
                    if (lastclick.x == realclick.x && lastclick.y == realclick.y) {
                        // Flip selection when control is pressed!
                        if (control) {
                            selectedStep.flipSelected();
                        } else {
                            // Otherwise, select only the icon clicked on!
                            transMeta.unselectAll();
                            selectedStep.setSelected(true);
                        }
                    } else {
                        // Find out which Steps & Notes are selected
                        selectedSteps = transMeta.getSelectedSteps();
                        selectedNotes = transMeta.getSelectedNotes();
                        // We moved around some items: store undo info...
                        // 
                        boolean also = false;
                        if (selectedNotes != null && selectedNotes.size() > 0 && previous_note_locations != null) {
                            int[] indexes = transMeta.getNoteIndexes(selectedNotes);
                            addUndoPosition(selectedNotes.toArray(new NotePadMeta[selectedNotes.size()]), indexes, previous_note_locations, transMeta.getSelectedNoteLocations(), also);
                            also = selectedSteps != null && selectedSteps.size() > 0;
                        }
                        if (selectedSteps != null && previous_step_locations != null) {
                            int[] indexes = transMeta.getStepIndexes(selectedSteps);
                            addUndoPosition(selectedSteps.toArray(new StepMeta[selectedSteps.size()]), indexes, previous_step_locations, transMeta.getSelectedStepLocations(), also);
                        }
                    }
                }
                // If so, ask to split the hop!
                if (split_hop) {
                    TransHopMeta hi = findHop(icon.x + iconsize / 2, icon.y + iconsize / 2, selectedStep);
                    if (hi != null) {
                        splitHop(hi);
                    }
                    split_hop = false;
                }
                selectedSteps = null;
                selectedNotes = null;
                selectedStep = null;
                selectedNote = null;
                startHopStep = null;
                endHopLocation = null;
                redraw();
                spoon.setShellText();
            } else {
                if (selectedNote != null) {
                    if (e.button == 1) {
                        if (lastclick.x == e.x && lastclick.y == e.y) {
                            // Flip selection when control is pressed!
                            if (control) {
                                selectedNote.flipSelected();
                            } else {
                                // Otherwise, select only the note clicked on!
                                transMeta.unselectAll();
                                selectedNote.setSelected(true);
                            }
                        } else {
                            // Find out which Steps & Notes are selected
                            selectedSteps = transMeta.getSelectedSteps();
                            selectedNotes = transMeta.getSelectedNotes();
                            // We moved around some items: store undo info...
                            boolean also = false;
                            if (selectedNotes != null && selectedNotes.size() > 0 && previous_note_locations != null) {
                                int[] indexes = transMeta.getNoteIndexes(selectedNotes);
                                addUndoPosition(selectedNotes.toArray(new NotePadMeta[selectedNotes.size()]), indexes, previous_note_locations, transMeta.getSelectedNoteLocations(), also);
                                also = selectedSteps != null && selectedSteps.size() > 0;
                            }
                            if (selectedSteps != null && selectedSteps.size() > 0 && previous_step_locations != null) {
                                int[] indexes = transMeta.getStepIndexes(selectedSteps);
                                addUndoPosition(selectedSteps.toArray(new StepMeta[selectedSteps.size()]), indexes, previous_step_locations, transMeta.getSelectedStepLocations(), also);
                            }
                        }
                    }
                    selectedNotes = null;
                    selectedSteps = null;
                    selectedStep = null;
                    selectedNote = null;
                    startHopStep = null;
                    endHopLocation = null;
                } else {
                    if (areaOwner == null && selectionRegion == null) {
                        // Hit absolutely nothing: clear the settings
                        // 
                        clearSettings();
                    }
                }
            }
        }
    }
    lastButton = 0;
}
Also used : AreaOwner(org.pentaho.di.core.gui.AreaOwner) TransHopMeta(org.pentaho.di.trans.TransHopMeta) Point(org.pentaho.di.core.gui.Point) KettleExtensionPoint(org.pentaho.di.core.extension.KettleExtensionPoint) NotePadMeta(org.pentaho.di.core.NotePadMeta) StepMeta(org.pentaho.di.trans.step.StepMeta) XulException(org.pentaho.ui.xul.XulException) InvocationTargetException(java.lang.reflect.InvocationTargetException) KettleValueException(org.pentaho.di.core.exception.KettleValueException) KettleStepException(org.pentaho.di.core.exception.KettleStepException) KettleRepositoryLostException(org.pentaho.di.repository.KettleRepositoryLostException) KettleException(org.pentaho.di.core.exception.KettleException)

Example 2 with AreaOwner

use of org.pentaho.di.core.gui.AreaOwner in project pentaho-kettle by pentaho.

the class TransGraph method mouseMove.

@Override
public void mouseMove(MouseEvent e) {
    boolean shift = (e.stateMask & SWT.SHIFT) != 0;
    noInputStep = null;
    // disable the tooltip
    // 
    toolTip.hide();
    Point real = screen2real(e.x, e.y);
    // Remember the last position of the mouse for paste with keyboard
    // 
    lastMove = real;
    if (iconoffset == null) {
        iconoffset = new Point(0, 0);
    }
    Point icon = new Point(real.x - iconoffset.x, real.y - iconoffset.y);
    if (noteoffset == null) {
        noteoffset = new Point(0, 0);
    }
    Point note = new Point(real.x - noteoffset.x, real.y - noteoffset.y);
    // Moved over an area?
    // 
    AreaOwner areaOwner = getVisibleAreaOwner(real.x, real.y);
    if (areaOwner != null && areaOwner.getAreaType() != null) {
        switch(areaOwner.getAreaType()) {
            case STEP_ICON:
                StepMeta stepMeta = (StepMeta) areaOwner.getOwner();
                resetDelayTimer(stepMeta);
                break;
            case // Give the timer a bit more time
            MINI_ICONS_BALLOON:
                stepMeta = (StepMeta) areaOwner.getParent();
                resetDelayTimer(stepMeta);
                break;
            default:
                break;
        }
    }
    try {
        TransGraphExtension ext = new TransGraphExtension(this, e, real);
        ExtensionPointHandler.callExtensionPoint(LogChannel.GENERAL, KettleExtensionPoint.TransGraphMouseMoved.id, ext);
    } catch (Exception ex) {
        LogChannel.GENERAL.logError("Error calling TransGraphMouseMoved extension point", ex);
    }
    // 
    if (selectedStep != null && !selectedStep.isSelected()) {
        transMeta.unselectAll();
        selectedStep.setSelected(true);
        selectedSteps = new ArrayList<>();
        selectedSteps.add(selectedStep);
        previous_step_locations = new Point[] { selectedStep.getLocation() };
        redraw();
    } else if (selectedNote != null && !selectedNote.isSelected()) {
        transMeta.unselectAll();
        selectedNote.setSelected(true);
        selectedNotes = new ArrayList<>();
        selectedNotes.add(selectedNote);
        previous_note_locations = new Point[] { selectedNote.getLocation() };
        redraw();
    } else if (selectionRegion != null && startHopStep == null) {
        // Did we select a region...?
        // 
        selectionRegion.width = real.x - selectionRegion.x;
        selectionRegion.height = real.y - selectionRegion.y;
        redraw();
    } else if (selectedStep != null && lastButton == 1 && !shift && startHopStep == null) {
        // 
        // One or more icons are selected and moved around...
        // 
        // new : new position of the ICON (not the mouse pointer) dx : difference with previous position
        // 
        int dx = icon.x - selectedStep.getLocation().x;
        int dy = icon.y - selectedStep.getLocation().y;
        // See if we have a hop-split candidate
        // 
        TransHopMeta hi = findHop(icon.x + iconsize / 2, icon.y + iconsize / 2, selectedStep);
        if (hi != null) {
            // 
            if (!hi.getFromStep().equals(selectedStep) && !hi.getToStep().equals(selectedStep)) {
                split_hop = true;
                last_hop_split = hi;
                hi.split = true;
            }
        } else {
            if (last_hop_split != null) {
                last_hop_split.split = false;
                last_hop_split = null;
                split_hop = false;
            }
        }
        selectedNotes = transMeta.getSelectedNotes();
        selectedSteps = transMeta.getSelectedSteps();
        // Adjust location of selected steps...
        if (selectedSteps != null) {
            for (int i = 0; i < selectedSteps.size(); i++) {
                StepMeta stepMeta = selectedSteps.get(i);
                PropsUI.setLocation(stepMeta, stepMeta.getLocation().x + dx, stepMeta.getLocation().y + dy);
                stopStepMouseOverDelayTimer(stepMeta);
            }
        }
        // Adjust location of selected hops...
        if (selectedNotes != null) {
            for (int i = 0; i < selectedNotes.size(); i++) {
                NotePadMeta ni = selectedNotes.get(i);
                PropsUI.setLocation(ni, ni.getLocation().x + dx, ni.getLocation().y + dy);
            }
        }
        redraw();
    } else if ((startHopStep != null && endHopStep == null) || (endHopStep != null && startHopStep == null)) {
        // Are we creating a new hop with the middle button or pressing SHIFT?
        // 
        StepMeta stepMeta = transMeta.getStep(real.x, real.y, iconsize);
        endHopLocation = new Point(real.x, real.y);
        if (stepMeta != null && ((startHopStep != null && !startHopStep.equals(stepMeta)) || (endHopStep != null && !endHopStep.equals(stepMeta)))) {
            StepIOMetaInterface ioMeta = stepMeta.getStepMetaInterface().getStepIOMeta();
            if (candidate == null) {
                // 
                if (startHopStep != null) {
                    if (ioMeta.isInputAcceptor()) {
                        candidate = new TransHopMeta(startHopStep, stepMeta);
                        endHopLocation = null;
                    } else {
                        noInputStep = stepMeta;
                        toolTip.setImage(null);
                        toolTip.setText("This step does not accept any input from other steps");
                        toolTip.show(new org.eclipse.swt.graphics.Point(real.x, real.y));
                    }
                } else if (endHopStep != null) {
                    if (ioMeta.isOutputProducer()) {
                        candidate = new TransHopMeta(stepMeta, endHopStep);
                        endHopLocation = null;
                    } else {
                        noInputStep = stepMeta;
                        toolTip.setImage(null);
                        toolTip.setText("This step doesn't pass any output to other steps. (except perhaps for targetted output)");
                        toolTip.show(new org.eclipse.swt.graphics.Point(real.x, real.y));
                    }
                }
            }
        } else {
            if (candidate != null) {
                candidate = null;
                redraw();
            }
        }
        redraw();
    }
    // 
    if (selectedNote != null) {
        if (lastButton == 1 && !shift) {
            /*
         * One or more notes are selected and moved around...
         *
         * new : new position of the note (not the mouse pointer) dx : difference with previous position
         */
            int dx = note.x - selectedNote.getLocation().x;
            int dy = note.y - selectedNote.getLocation().y;
            selectedNotes = transMeta.getSelectedNotes();
            selectedSteps = transMeta.getSelectedSteps();
            // Adjust location of selected steps...
            if (selectedSteps != null) {
                for (int i = 0; i < selectedSteps.size(); i++) {
                    StepMeta stepMeta = selectedSteps.get(i);
                    PropsUI.setLocation(stepMeta, stepMeta.getLocation().x + dx, stepMeta.getLocation().y + dy);
                }
            }
            // Adjust location of selected hops...
            if (selectedNotes != null) {
                for (int i = 0; i < selectedNotes.size(); i++) {
                    NotePadMeta ni = selectedNotes.get(i);
                    PropsUI.setLocation(ni, ni.getLocation().x + dx, ni.getLocation().y + dy);
                }
            }
            redraw();
        }
    }
}
Also used : ArrayList(java.util.ArrayList) StepIOMetaInterface(org.pentaho.di.trans.step.StepIOMetaInterface) Point(org.pentaho.di.core.gui.Point) KettleExtensionPoint(org.pentaho.di.core.extension.KettleExtensionPoint) StepMeta(org.pentaho.di.trans.step.StepMeta) XulException(org.pentaho.ui.xul.XulException) InvocationTargetException(java.lang.reflect.InvocationTargetException) KettleValueException(org.pentaho.di.core.exception.KettleValueException) KettleStepException(org.pentaho.di.core.exception.KettleStepException) KettleRepositoryLostException(org.pentaho.di.repository.KettleRepositoryLostException) KettleException(org.pentaho.di.core.exception.KettleException) Point(org.pentaho.di.core.gui.Point) KettleExtensionPoint(org.pentaho.di.core.extension.KettleExtensionPoint) AreaOwner(org.pentaho.di.core.gui.AreaOwner) TransHopMeta(org.pentaho.di.trans.TransHopMeta) NotePadMeta(org.pentaho.di.core.NotePadMeta)

Example 3 with AreaOwner

use of org.pentaho.di.core.gui.AreaOwner in project pentaho-kettle by pentaho.

the class JobPainter method drawJobEntryCopy.

protected void drawJobEntryCopy(JobEntryCopy jobEntryCopy) {
    if (!jobEntryCopy.isDrawn()) {
        return;
    }
    int alpha = gc.getAlpha();
    Point pt = jobEntryCopy.getLocation();
    if (pt == null) {
        pt = new Point(50, 50);
    }
    Point screen = real2screen(pt.x, pt.y);
    int x = screen.x;
    int y = screen.y;
    String name = jobEntryCopy.getName();
    if (jobEntryCopy.isSelected()) {
        gc.setLineWidth(3);
    } else {
        gc.setLineWidth(1);
    }
    gc.setBackground(EColor.BACKGROUND);
    gc.fillRoundRectangle(x - 1, y - 1, iconsize + 1, iconsize + 1, 7, 7);
    gc.drawJobEntryIcon(x, y, jobEntryCopy, magnification);
    if (!shadow) {
        areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_ICON, x, y, iconsize, iconsize, offset, subject, jobEntryCopy));
    }
    gc.setForeground(jobEntryCopy.isMissing() ? EColor.RED : EColor.CRYSTAL);
    gc.drawRoundRectangle(x - 1, y - 1, iconsize + 1, iconsize + 1, 7, 7);
    gc.setForeground(EColor.CRYSTAL);
    Point textsize = new Point(gc.textExtent("" + name).x, gc.textExtent("" + name).y);
    gc.setBackground(EColor.BACKGROUND);
    gc.setLineWidth(1);
    int xpos = x + (iconsize / 2) - (textsize.x / 2);
    int ypos = y + iconsize + 5;
    gc.setForeground(EColor.BLACK);
    gc.drawText(name, xpos, ypos, true);
    if (activeJobEntries != null && activeJobEntries.contains(jobEntryCopy)) {
        gc.setForeground(EColor.BLUE);
        int iconX = (x + iconsize) - (MINI_ICON_SIZE / 2);
        int iconY = y - (MINI_ICON_SIZE / 2);
        gc.drawImage(EImage.BUSY, iconX, iconY, magnification);
        areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_BUSY, iconX, iconY, MINI_ICON_SIZE, MINI_ICON_SIZE, offset, subject, jobEntryCopy));
    } else {
        gc.setForeground(EColor.BLACK);
    }
    JobEntryResult jobEntryResult = findJobEntryResult(jobEntryCopy);
    if (jobEntryResult != null) {
        Result result = jobEntryResult.getResult();
        int iconX = (x + iconsize) - (MINI_ICON_SIZE / 2);
        int iconY = y - (MINI_ICON_SIZE / 2);
        // 
        if (jobEntryResult.isCheckpoint()) {
            gc.drawImage(EImage.CHECKPOINT, iconX, iconY, magnification);
            areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_RESULT_CHECKPOINT, iconX, iconY, MINI_ICON_SIZE, MINI_ICON_SIZE, offset, jobEntryCopy, jobEntryResult));
        } else {
            if (result.getResult()) {
                gc.drawImage(EImage.TRUE, iconX, iconY, magnification);
                areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_RESULT_SUCCESS, iconX, iconY, MINI_ICON_SIZE, MINI_ICON_SIZE, offset, jobEntryCopy, jobEntryResult));
            } else {
                gc.drawImage(EImage.FALSE, iconX, iconY, magnification);
                areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_RESULT_FAILURE, iconX, iconY, MINI_ICON_SIZE, MINI_ICON_SIZE, offset, jobEntryCopy, jobEntryResult));
            }
        }
    }
    // 
    if (mouseOverEntries.contains(jobEntryCopy)) {
        gc.setTransform(translationX, translationY, 0, BasePainter.FACTOR_1_TO_1);
        EImage[] miniIcons = new EImage[] { EImage.INPUT, EImage.EDIT, EImage.CONTEXT_MENU, EImage.OUTPUT };
        // First drawn the mini-icons balloon below the job entry
        // 
        int totalHeight = 0;
        int totalIconsWidth = 0;
        int totalWidth = 2 * MINI_ICON_MARGIN;
        for (EImage miniIcon : miniIcons) {
            Point bounds = gc.getImageBounds(miniIcon);
            totalWidth += bounds.x + MINI_ICON_MARGIN;
            totalIconsWidth += bounds.x + MINI_ICON_MARGIN;
            if (bounds.y > totalHeight) {
                totalHeight = bounds.y;
            }
        }
        totalHeight += 2 * MINI_ICON_MARGIN;
        gc.setFont(EFont.SMALL);
        String trimmedName = jobEntryCopy.getName().length() < 30 ? jobEntryCopy.getName() : jobEntryCopy.getName().substring(0, 30);
        Point nameExtent = gc.textExtent(trimmedName);
        nameExtent.y += 2 * MINI_ICON_MARGIN;
        nameExtent.x += 3 * MINI_ICON_MARGIN;
        totalHeight += nameExtent.y;
        if (nameExtent.x > totalWidth) {
            totalWidth = nameExtent.x;
        }
        int areaX = translateToCurrentScale(x) + translateToCurrentScale(iconsize) / 2 - totalWidth / 2 + MINI_ICON_SKEW;
        int areaY = translateToCurrentScale(y) + translateToCurrentScale(iconsize) + MINI_ICON_DISTANCE + BasePainter.CONTENT_MENU_INDENT;
        gc.setForeground(EColor.CRYSTAL);
        gc.setBackground(EColor.CRYSTAL);
        gc.setLineWidth(1);
        gc.fillRoundRectangle(areaX, areaY, totalWidth, totalHeight, BasePainter.CORNER_RADIUS_5, BasePainter.CORNER_RADIUS_5);
        gc.setBackground(EColor.WHITE);
        gc.fillRoundRectangle(areaX, areaY + nameExtent.y, totalWidth, (totalHeight - nameExtent.y), BasePainter.CORNER_RADIUS_5, BasePainter.CORNER_RADIUS_5);
        gc.fillRectangle(areaX, areaY + nameExtent.y, totalWidth, (totalHeight - nameExtent.y) / 2);
        gc.drawRoundRectangle(areaX, areaY, totalWidth, totalHeight, BasePainter.CORNER_RADIUS_5, BasePainter.CORNER_RADIUS_5);
        gc.setForeground(EColor.WHITE);
        gc.drawText(trimmedName, areaX + (totalWidth - nameExtent.x) / 2 + MINI_ICON_MARGIN, areaY + MINI_ICON_MARGIN, true);
        gc.setForeground(EColor.CRYSTAL);
        gc.setBackground(EColor.CRYSTAL);
        gc.setFont(EFont.GRAPH);
        areaOwners.add(new AreaOwner(AreaType.MINI_ICONS_BALLOON, translateTo1To1(areaX), translateTo1To1(areaY), translateTo1To1(totalWidth), translateTo1To1(totalHeight), offset, jobMeta, jobEntryCopy));
        gc.fillPolygon(new int[] { areaX + totalWidth / 2 - MINI_ICON_TRIANGLE_BASE / 2 + 1, areaY + 2, areaX + totalWidth / 2 + MINI_ICON_TRIANGLE_BASE / 2, areaY + 2, areaX + totalWidth / 2 - MINI_ICON_SKEW, areaY - MINI_ICON_DISTANCE - 3 });
        gc.setBackground(EColor.WHITE);
        // Put on the icons...
        // 
        int xIcon = areaX + (totalWidth - totalIconsWidth) / 2 + MINI_ICON_MARGIN;
        int yIcon = areaY + 5 + nameExtent.y;
        for (int i = 0; i < miniIcons.length; i++) {
            EImage miniIcon = miniIcons[i];
            Point bounds = gc.getImageBounds(miniIcon);
            boolean enabled = false;
            switch(i) {
                case // INPUT
                0:
                    enabled = !jobEntryCopy.isStart();
                    areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_MINI_ICON_INPUT, translateTo1To1(xIcon), translateTo1To1(yIcon), translateTo1To1(bounds.x), translateTo1To1(bounds.y), offset, jobMeta, jobEntryCopy));
                    break;
                case // EDIT
                1:
                    enabled = true;
                    areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_MINI_ICON_EDIT, translateTo1To1(xIcon), translateTo1To1(yIcon), translateTo1To1(bounds.x), translateTo1To1(bounds.y), offset, jobMeta, jobEntryCopy));
                    break;
                case // Job entry context menu
                2:
                    enabled = true;
                    areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_MINI_ICON_CONTEXT, translateTo1To1(xIcon), translateTo1To1(yIcon), translateTo1To1(bounds.x), translateTo1To1(bounds.y), offset, jobMeta, jobEntryCopy));
                    break;
                case // OUTPUT
                3:
                    enabled = true;
                    areaOwners.add(new AreaOwner(AreaType.JOB_ENTRY_MINI_ICON_OUTPUT, translateTo1To1(xIcon), translateTo1To1(yIcon), translateTo1To1(bounds.x), translateTo1To1(bounds.y), offset, jobMeta, jobEntryCopy));
                    break;
                default:
                    break;
            }
            if (enabled) {
                gc.setAlpha(255);
            } else {
                gc.setAlpha(100);
            }
            gc.drawImage(miniIcon, xIcon, yIcon, BasePainter.FACTOR_1_TO_1);
            xIcon += bounds.x + 5;
        }
        gc.setTransform(translationX, translationY, 0, magnification);
    }
    // Restore the previous alpha value
    // 
    gc.setAlpha(alpha);
}
Also used : EImage(org.pentaho.di.core.gui.PrimitiveGCInterface.EImage) AreaOwner(org.pentaho.di.core.gui.AreaOwner) Point(org.pentaho.di.core.gui.Point) KettleExtensionPoint(org.pentaho.di.core.extension.KettleExtensionPoint) Point(org.pentaho.di.core.gui.Point) KettleExtensionPoint(org.pentaho.di.core.extension.KettleExtensionPoint) Result(org.pentaho.di.core.Result)

Example 4 with AreaOwner

use of org.pentaho.di.core.gui.AreaOwner in project pentaho-kettle by pentaho.

the class AutoDoc method processRow.

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {
    meta = (AutoDocMeta) smi;
    data = (AutoDocData) sdi;
    Object[] row = getRow();
    if (row == null) {
        if (data.filenames.isEmpty()) {
            // Nothing to see here, move along!
            // 
            setOutputDone();
            return false;
        }
        // End of the line, create the documentation...
        // 
        FileObject targetFile = KettleVFS.getFileObject(environmentSubstitute(meta.getTargetFilename()));
        String targetFilename = KettleVFS.getFilename(targetFile);
        // Create the report builder
        // 
        KettleReportBuilder kettleReportBuilder = new KettleReportBuilder(this, data.filenames, KettleVFS.getFilename(targetFile), meta);
        try {
            // 
            if (ClassicEngineBoot.getInstance().isBootDone() == false) {
                ObjectUtilities.setClassLoader(getClass().getClassLoader());
                ObjectUtilities.setClassLoaderSource(ObjectUtilities.CLASS_CONTEXT);
                LibLoaderBoot.getInstance().start();
                LibFontBoot.getInstance().start();
                ClassicEngineBoot.getInstance().start();
            }
            // Do the reporting thing...
            // 
            kettleReportBuilder.createReport();
            kettleReportBuilder.render();
            Object[] outputRowData = RowDataUtil.allocateRowData(data.outputRowMeta.size());
            int outputIndex = 0;
            outputRowData[outputIndex++] = targetFilename;
            // Pass along the data to the next steps...
            // 
            putRow(data.outputRowMeta, outputRowData);
            // Add the target file to the result file list
            // 
            ResultFile resultFile = new ResultFile(ResultFile.FILE_TYPE_GENERAL, targetFile, getTransMeta().getName(), toString());
            resultFile.setComment("This file was generated by the 'Auto Documentation Output' step");
            addResultFile(resultFile);
        } catch (Exception e) {
            throw new KettleException(BaseMessages.getString(PKG, "AutoDoc.Exception.UnableToRenderReport"), e);
        }
        setOutputDone();
        return false;
    }
    if (first) {
        first = false;
        data.outputRowMeta = getInputRowMeta().clone();
        meta.getFields(data.outputRowMeta, getStepname(), null, null, this, repository, metaStore);
        // Get the filename field index...
        // 
        String filenameField = environmentSubstitute(meta.getFilenameField());
        data.fileNameFieldIndex = getInputRowMeta().indexOfValue(filenameField);
        if (data.fileNameFieldIndex < 0) {
            throw new KettleException(BaseMessages.getString(PKG, "AutoDoc.Exception.FilenameFieldNotFound", filenameField));
        }
        // Get the file type field index...
        // 
        String fileTypeField = environmentSubstitute(meta.getFileTypeField());
        data.fileTypeFieldIndex = getInputRowMeta().indexOfValue(fileTypeField);
        if (data.fileTypeFieldIndex < 0) {
            throw new KettleException(BaseMessages.getString(PKG, "AutoDoc.Exception.FileTypeFieldNotFound", fileTypeField));
        }
        data.repository = getTrans().getRepository();
        if (data.repository != null) {
            data.tree = data.repository.loadRepositoryDirectoryTree();
        }
        // Initialize the repository information handlers (images, metadata, loading, etc)
        // 
        TransformationInformation.init(getTrans().getRepository());
        JobInformation.init(getTrans().getRepository());
    }
    // One more transformation or job to place in the documentation.
    // 
    String fileName = getInputRowMeta().getString(row, data.fileNameFieldIndex);
    String fileType = getInputRowMeta().getString(row, data.fileTypeFieldIndex);
    RepositoryObjectType objectType;
    if ("Transformation".equalsIgnoreCase(fileType)) {
        objectType = RepositoryObjectType.TRANSFORMATION;
    } else if ("Job".equalsIgnoreCase(fileType)) {
        objectType = RepositoryObjectType.JOB;
    } else {
        throw new KettleException(BaseMessages.getString(PKG, "AutoDoc.Exception.UnknownFileTypeValue", fileType));
    }
    ReportSubjectLocation location = null;
    if (getTrans().getRepository() == null) {
        switch(objectType) {
            case TRANSFORMATION:
                location = new ReportSubjectLocation(fileName, null, null, objectType);
                break;
            case JOB:
                location = new ReportSubjectLocation(fileName, null, null, objectType);
                break;
            default:
                break;
        }
    } else {
        int lastSlashIndex = fileName.lastIndexOf(RepositoryDirectory.DIRECTORY_SEPARATOR);
        if (lastSlashIndex < 0) {
            fileName = RepositoryDirectory.DIRECTORY_SEPARATOR + fileName;
            lastSlashIndex = 0;
        }
        String directoryName = fileName.substring(0, lastSlashIndex + 1);
        String objectName = fileName.substring(lastSlashIndex + 1);
        RepositoryDirectoryInterface directory = data.tree.findDirectory(directoryName);
        if (directory == null) {
            throw new KettleException(BaseMessages.getString(PKG, "AutoDoc.Exception.RepositoryDirectoryNotFound", directoryName));
        }
        location = new ReportSubjectLocation(null, directory, objectName, objectType);
    }
    if (location == null) {
        throw new KettleException(BaseMessages.getString(PKG, "AutoDoc.Exception.UnableToDetermineLocation", fileName, fileType));
    }
    if (meta.getOutputType() != OutputType.METADATA) {
        // Add the file location to the list for later processing in one output report
        // 
        data.filenames.add(location);
    } else {
        // Load the metadata from the transformation / job...
        // Output it in one row for each input row
        // 
        Object[] outputRow = RowDataUtil.resizeArray(row, data.outputRowMeta.size());
        int outputIndex = getInputRowMeta().size();
        List<AreaOwner> imageAreaList = null;
        switch(location.getObjectType()) {
            case TRANSFORMATION:
                TransformationInformation ti = TransformationInformation.getInstance();
                TransMeta transMeta = ti.getTransMeta(location);
                imageAreaList = ti.getImageAreaList(location);
                // TransMeta
                outputRow[outputIndex++] = transMeta;
                break;
            case JOB:
                JobInformation ji = JobInformation.getInstance();
                JobMeta jobMeta = ji.getJobMeta(location);
                imageAreaList = ji.getImageAreaList(location);
                // TransMeta
                outputRow[outputIndex++] = jobMeta;
                break;
            default:
                break;
        }
        // Name
        if (meta.isIncludingName()) {
            outputRow[outputIndex++] = KettleFileTableModel.getName(location);
        }
        // Description
        if (meta.isIncludingDescription()) {
            outputRow[outputIndex++] = KettleFileTableModel.getDescription(location);
        }
        // Extended Description
        if (meta.isIncludingExtendedDescription()) {
            outputRow[outputIndex++] = KettleFileTableModel.getExtendedDescription(location);
        }
        // created
        if (meta.isIncludingCreated()) {
            outputRow[outputIndex++] = KettleFileTableModel.getCreation(location);
        }
        // modified
        if (meta.isIncludingModified()) {
            outputRow[outputIndex++] = KettleFileTableModel.getModification(location);
        }
        // image
        if (meta.isIncludingImage()) {
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
            try {
                BufferedImage image = KettleFileTableModel.getImage(location);
                ImageIO.write(image, "png", outputStream);
                outputRow[outputIndex++] = outputStream.toByteArray();
            } catch (Exception e) {
                throw new KettleException("Unable to serialize image to PNG", e);
            } finally {
                try {
                    outputStream.close();
                } catch (IOException e) {
                    throw new KettleException("Unable to serialize image to PNG", e);
                }
            }
        }
        if (meta.isIncludingLoggingConfiguration()) {
            outputRow[outputIndex++] = KettleFileTableModel.getLogging(location);
        }
        if (meta.isIncludingLastExecutionResult()) {
            outputRow[outputIndex++] = KettleFileTableModel.getLogging(location);
        }
        if (meta.isIncludingImageAreaList()) {
            outputRow[outputIndex++] = imageAreaList;
        }
        putRow(data.outputRowMeta, outputRow);
    }
    return true;
}
Also used : KettleException(org.pentaho.di.core.exception.KettleException) RepositoryDirectoryInterface(org.pentaho.di.repository.RepositoryDirectoryInterface) JobMeta(org.pentaho.di.job.JobMeta) TransMeta(org.pentaho.di.trans.TransMeta) ByteArrayOutputStream(java.io.ByteArrayOutputStream) IOException(java.io.IOException) ResultFile(org.pentaho.di.core.ResultFile) KettleException(org.pentaho.di.core.exception.KettleException) IOException(java.io.IOException) BufferedImage(java.awt.image.BufferedImage) AreaOwner(org.pentaho.di.core.gui.AreaOwner) RepositoryObjectType(org.pentaho.di.repository.RepositoryObjectType) FileObject(org.apache.commons.vfs2.FileObject) FileObject(org.apache.commons.vfs2.FileObject)

Example 5 with AreaOwner

use of org.pentaho.di.core.gui.AreaOwner in project pentaho-kettle by pentaho.

the class JobInformation method loadValues.

private JobInformationValues loadValues(ReportSubjectLocation location) throws KettleException {
    // Load the job
    // 
    JobMeta jobMeta = loadJob(location);
    Point min = jobMeta.getMinimum();
    Point area = jobMeta.getMaximum();
    area.x += 30;
    area.y += 30;
    int iconsize = 32;
    ScrollBarInterface bar = new ScrollBarInterface() {

        public void setThumb(int thumb) {
        }

        public int getSelection() {
            return 0;
        }
    };
    // Paint the transformation...
    // 
    GCInterface gc = new SwingGC(null, area, iconsize, 50, 20);
    List<AreaOwner> areaOwners = new ArrayList<AreaOwner>();
    JobPainter painter = new JobPainter(gc, jobMeta, area, bar, bar, null, null, null, areaOwners, new ArrayList<JobEntryCopy>(), iconsize, 1, 0, 0, true, "FreeSans", 10);
    painter.setMagnification(0.25f);
    painter.drawJob();
    BufferedImage bufferedImage = (BufferedImage) gc.getImage();
    int newWidth = bufferedImage.getWidth() - min.x;
    int newHeigth = bufferedImage.getHeight() - min.y;
    BufferedImage image = new BufferedImage(newWidth, newHeigth, bufferedImage.getType());
    image.getGraphics().drawImage(bufferedImage, 0, 0, newWidth, newHeigth, min.x, min.y, min.x + newWidth, min.y + newHeigth, null);
    JobInformationValues values = new JobInformationValues();
    values.jobMeta = jobMeta;
    values.image = image;
    values.areaOwners = areaOwners;
    return values;
}
Also used : JobMeta(org.pentaho.di.job.JobMeta) JobPainter(org.pentaho.di.job.JobPainter) ArrayList(java.util.ArrayList) Point(org.pentaho.di.core.gui.Point) SwingGC(org.pentaho.di.core.gui.SwingGC) Point(org.pentaho.di.core.gui.Point) ScrollBarInterface(org.pentaho.di.core.gui.ScrollBarInterface) BufferedImage(java.awt.image.BufferedImage) GCInterface(org.pentaho.di.core.gui.GCInterface) JobEntryCopy(org.pentaho.di.job.entry.JobEntryCopy) AreaOwner(org.pentaho.di.core.gui.AreaOwner)

Aggregations

AreaOwner (org.pentaho.di.core.gui.AreaOwner)25 Point (org.pentaho.di.core.gui.Point)23 KettleExtensionPoint (org.pentaho.di.core.extension.KettleExtensionPoint)17 KettleException (org.pentaho.di.core.exception.KettleException)12 StepMeta (org.pentaho.di.trans.step.StepMeta)12 JobEntryCopy (org.pentaho.di.job.entry.JobEntryCopy)9 KettleRepositoryLostException (org.pentaho.di.repository.KettleRepositoryLostException)8 XulException (org.pentaho.ui.xul.XulException)8 InvocationTargetException (java.lang.reflect.InvocationTargetException)6 ArrayList (java.util.ArrayList)6 KettleStepException (org.pentaho.di.core.exception.KettleStepException)6 KettleValueException (org.pentaho.di.core.exception.KettleValueException)6 SwingGC (org.pentaho.di.core.gui.SwingGC)6 BufferedImage (java.awt.image.BufferedImage)5 NotePadMeta (org.pentaho.di.core.NotePadMeta)5 TransHopMeta (org.pentaho.di.trans.TransHopMeta)5 EImage (org.pentaho.di.core.gui.PrimitiveGCInterface.EImage)4 ScrollBarInterface (org.pentaho.di.core.gui.ScrollBarInterface)4 JobHopMeta (org.pentaho.di.job.JobHopMeta)4 TransMeta (org.pentaho.di.trans.TransMeta)4