/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.graphical.editors.process; import java.util.Iterator; import java.util.List; import org.eclipse.draw2d.ActionEvent; import org.eclipse.draw2d.ActionListener; import org.eclipse.draw2d.Clickable; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.Graphics; import org.eclipse.draw2d.GridData; import org.eclipse.draw2d.GridLayout; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseMotionListener; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.draw2d.geometry.Dimension; import org.eclipse.draw2d.geometry.Point; import org.eclipse.draw2d.geometry.Rectangle; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.widgets.Menu; import org.eclipse.zest.core.widgets.CGraphNode; import org.eclipse.zest.core.widgets.Graph; import org.eclipse.zest.core.widgets.GraphItem; import org.jboss.tools.smooks.configuration.SmooksConfigurationActivator; import org.jboss.tools.smooks.configuration.editors.GraphicsConstants; import org.jboss.tools.smooks.graphical.actions.DeleteTaskNodeAction; import org.jboss.tools.smooks.graphical.editors.SmooksProcessGraphicalEditor; import org.jboss.tools.smooks.graphical.editors.TaskTypeManager; /** * @author Dart * */ public class TaskNodeFigure extends Figure { private TaskType task; private Label problemTooltip; private IFigure mainFigure; private IFigure addTaskFigure; private Image image; private String labelText; private SmooksProcessGraphicalEditor processGraphicalViewerEditor; private Label label; private IFigure imageFigure; private Color oldLabelColor = null; private boolean showAddFigure = false; private Rectangle imageSourceRectangle = null; private boolean showRectangle = false; public TaskNodeFigure(TaskType task, SmooksProcessGraphicalEditor graph, Image image, String text) { super(); this.task = task; this.processGraphicalViewerEditor = graph; this.image = image; this.labelText = text; this.problemTooltip = new Label(); initFigure(); hookTaskNodeFigure(); } public TaskType getTask() { return task; } public void setProblemMessage(String message) { if (message == null) { this.setToolTip(null); } else { this.problemTooltip.setText(message); this.setToolTip(problemTooltip); } } public Label getLabel() { return label; } private void hookTaskNodeFigure() { addTaskFigure.addMouseMotionListener(new MouseMotionListener() { public void mouseDragged(MouseEvent me) { } public void mouseEntered(MouseEvent me) { showAddFigure = true; imageSourceRectangle = null; addTaskFigure.repaint(); } public void mouseExited(MouseEvent me) { showAddFigure = false; addTaskFigure.repaint(); } public void mouseHover(MouseEvent me) { } public void mouseMoved(MouseEvent me) { } }); } @Override protected void paintBorder(Graphics graphics) { // super.paintBorder(graphics); if (showRectangle) { graphics.setLineWidth(2); // graphics.setForegroundColor(ColorConstants.blue); // graphics.setLineStyle(SWT.LINE_DOT); graphics.drawRectangle(getBounds().x+1,getBounds().y+1,getBounds().width - 2 , getBounds().height - 2); } } protected void initFigure() { initMainFigure(); initAddTaskFigure(); GridLayout girdlLayout = new GridLayout(); girdlLayout.numColumns = 2; this.setLayoutManager(girdlLayout); GridData d = new GridData(GridData.FILL_VERTICAL); // ToolbarLayout layout = new ToolbarLayout(true); // layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER); this.add(mainFigure); this.add(addTaskFigure); girdlLayout.setConstraint(addTaskFigure, d); // this.setLayoutManager(layout); } private void initAddTaskFigure() { addTaskFigure = new Clickable() { @Override protected void paintBorder(Graphics graphics) { } @Override protected void paintFigure(Graphics graphics) { super.paintFigure(graphics); Rectangle rect = getBounds(); Point center = rect.getCenter(); String taskId = task.getId(); if (!showAddFigure || TaskTypeManager.TASK_ID_FREEMARKER_CSV_TEMPLATE .equals(taskId) || TaskTypeManager.TASK_ID_FREEMARKER_XML_TEMPLATE .equals(taskId)) { // int feet = 4; graphics.fillRectangle(rect); return; // imageSourceRectangle = new Rectangle(rect.x + feet, // rect.y + feet, rect.width - feet * 2, // rect.height - feet * 2); } else { Graph g = processGraphicalViewerEditor .getProcessGraphViewer().getGraphControl(); // processGraphicalViewerEditor.setNeedupdatewhenshow(false); List<?> nodes = g.getNodes(); for (Iterator<?> iterator = nodes.iterator(); iterator .hasNext();) { GraphItem item = (GraphItem) iterator.next(); if (item instanceof CGraphNode) { if (TaskNodeFigure.this == ((CGraphNode) item) .getFigure()) { processGraphicalViewerEditor .updateProcessActions(new StructuredSelection( item.getData())); break; } } } List<IAction> actionsList = processGraphicalViewerEditor .getProcessPanelActionList(); boolean hideAddIcon = true; for (IAction iAction : actionsList) { if (iAction.isEnabled() && !(iAction instanceof DeleteTaskNodeAction)) { hideAddIcon = false; break; } } if (hideAddIcon) { graphics.fillRectangle(rect); return; } } Image image = SmooksConfigurationActivator.getDefault() .getImageRegistry() .get(GraphicsConstants.IMAGE_ADD_TASK_BUTTON); if (image != null) { // System.out.println(center.x - image.getBounds().width / // 2); Point location = new Point(center.x - image.getBounds().width / 2, center.y - image.getBounds().height / 2); graphics.drawImage(image, location); if (imageSourceRectangle == null) { // graphics.drawImage(image, getLocation()); } else { // graphics.drawImage(image, sourceRectangle, // imageSourceRectangle); } } } }; ((Clickable) addTaskFigure).addActionListener(new ActionListener() { public void actionPerformed(ActionEvent event) { if (!showAddFigure) { return; } processGraphicalViewerEditor.showTaskControl(task); Graph g = processGraphicalViewerEditor.getProcessGraphViewer() .getGraphControl(); processGraphicalViewerEditor.setNeedupdatewhenshow(false); List<?> nodes = g.getNodes(); for (Iterator<?> iterator = nodes.iterator(); iterator .hasNext();) { GraphItem item = (GraphItem) iterator.next(); if (item instanceof CGraphNode) { if (TaskNodeFigure.this == ((CGraphNode) item) .getFigure()) { processGraphicalViewerEditor .updateProcessActions(new StructuredSelection( item.getData())); break; } } } Menu menu = processGraphicalViewerEditor .getProcessGraphViewer().getGraphControl().getMenu(); menu.setVisible(true); // processGraphicalViewerEditor.setNeedupdatewhenshow(true); } }); addTaskFigure.setSize(16, 16); } private void initMainFigure() { mainFigure = new Figure(); imageFigure = new Figure() { /* * (non-Javadoc) * * @see * org.eclipse.draw2d.Figure#paintFigure(org.eclipse.draw2d.Graphics * ) */ @Override protected void paintFigure(Graphics graphics) { super.paintFigure(graphics); if (image != null) { graphics.drawImage(image, getLocation()); } else { graphics.drawRectangle(0, 0, 24, 24); } } }; if (image != null) { imageFigure.setSize(new Dimension(image.getBounds().width, image .getBounds().height)); } else { imageFigure.setSize(24, 24); } mainFigure.add(imageFigure); label = new Label(); // label.setForegroundColor(GraphicsConstants.BORDER_CORLOR); label.setText(labelText); oldLabelColor = label.getForegroundColor(); mainFigure.add(label); ToolbarLayout layout = new ToolbarLayout(false); layout.setMinorAlignment(ToolbarLayout.ALIGN_CENTER); mainFigure.setLayoutManager(layout); } /** * @return the image */ public Image getImage() { return image; } /** * @param image * the image to set */ public void setImage(Image image) { this.image = image; } /** * @return the labelText */ public String getLabelText() { return labelText; } /** * @param labelText * the labelText to set */ public void setLabelText(String labelText) { this.labelText = labelText; } public void highlightLabel(Color highlightColor) { oldLabelColor = label.getForegroundColor(); // label.setForegroundColor(highlightColor); showRectangle = true; this.repaint(); } public void unhighlightLabel() { if (oldLabelColor != null) { label.setForegroundColor(oldLabelColor); showRectangle = false; this.repaint(); } } }