package org.eclipse.iee.pad.graph.ui; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.FocusEvent; import org.eclipse.draw2d.FocusListener; import org.eclipse.draw2d.ImageFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.ToolbarLayout; import org.eclipse.iee.editor.core.bindings.IObservableValue; import org.eclipse.iee.editor.core.bindings.IObserver; import org.eclipse.iee.editor.core.bindings.ObservableProperty; import org.eclipse.iee.editor.core.pad.common.text.AbstractVisualTextEditor; import org.eclipse.iee.editor.core.pad.common.text.IEditorLocation; import org.eclipse.iee.editor.core.pad.common.text.TextPartEditor; import org.eclipse.iee.editor.core.pad.common.ui.IMenuContributor; import org.eclipse.iee.pad.formula.ui.utils.UIFormulaRenderer; import org.eclipse.iee.pad.graph.model.GraphElement; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.MenuManager; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.resource.StringConverter; import org.eclipse.jface.window.IShellProvider; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.RGB; import org.eclipse.swt.widgets.Caret; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.jfree.chart.plot.DrawingSupplier; import org.jfree.experimental.swt.SWTUtils; import org.jfree.util.PaintUtilities; import com.google.common.base.Optional; import com.google.common.base.Strings; public class GraphElementEditor extends AbstractVisualTextEditor<GraphElement, Figure> implements IMenuContributor { private ImageFigure fFormulaImage; private Figure fTextFigure; private Label fLine; private UIFormulaRenderer fFormulaRenderer; private DrawingSupplier fDrawingSupplier; private IShellProvider fShellProvider; private TextPartEditor fTextPartEditor; private ObservableProperty<String> fColorValue; private ObservableProperty<String> fFunctionValue; private ObservableProperty<Integer> fWidthValue; public GraphElementEditor(UIFormulaRenderer formulaRenderer, DrawingSupplier drawingSupplier, IShellProvider shellProvider) { this.fFormulaRenderer = formulaRenderer; fDrawingSupplier = drawingSupplier; fShellProvider = shellProvider; } protected Figure createFigure() { final Figure figure = new Figure(); figure.setLayoutManager(new ToolbarLayout(false)); fFormulaImage = new ImageFigure(); fTextPartEditor = new TextPartEditor(); fTextPartEditor.bindValue(fFunctionValue); addEditor(fTextPartEditor); fTextFigure = (Figure) fTextPartEditor.getFigure(); fLine = new Label(); figure.addMouseListener(new MouseListener() { @Override public void mouseReleased(MouseEvent me) { if (me.button == 1) { toggleInputText(); } } @Override public void mousePressed(MouseEvent me) { } @Override public void mouseDoubleClicked(MouseEvent me) { } }); figure.addFocusListener(new FocusListener() { @Override public void focusGained(FocusEvent fe) { } @Override public void focusLost(FocusEvent fe) { toggleFormulaImage(); }}); toggleFormulaImage(figure); return figure; } public void toggleInputText() { Figure figure = (Figure) getFigure(); figure.removeAll(); figure.add(fTextFigure); figure.add(fLine); fTextFigure.requestFocus(); } public void toggleFormulaImage() { Figure figure = (Figure) getFigure(); toggleFormulaImage(figure); } private void toggleFormulaImage(Figure figure) { figure.removeAll(); Image newImage = createImage(); if (newImage != null) { fFormulaImage.setImage(newImage); } figure.add(fFormulaImage); figure.add(fLine); figure.revalidate(); } @Override public boolean isSelectable() { return false; } @Override public void setSelected(boolean b) { } @Override public void setActive(boolean b) { } private Image createImage() { String fTexExpression = fTextPartEditor.getModel(); if (Strings.isNullOrEmpty(fTexExpression)) { fTexExpression = "o"; } Image image = null; if (fTexExpression != null) { image = fFormulaRenderer.getFormulaImage(fTexExpression); } return image; } @Override public void contribute(MenuManager menuManager) { menuManager.add(new ActionContributionItem(new Action("Add function") { @Override public void runWithEvent(Event event) { GraphModelEditor graphModelEditor = (GraphModelEditor) getParent().get(); GraphElement newElement = new GraphElement(); newElement.setNumberOfPoints(100); newElement.setColor(getNextColor()); graphModelEditor.getModel().addElement(newElement); } })); menuManager.add(new ActionContributionItem(new Action("Remove function") { @Override public void runWithEvent(Event event) { GraphModelEditor graphModelEditor = (GraphModelEditor) getParent().get(); graphModelEditor.getModel().removeElement(getModel()); } })); menuManager.add(new ActionContributionItem(new Action("Properties") { @Override public void runWithEvent(final Event event) { Dialog dialog = new Dialog(fShellProvider) { private ElementProperties elementProperties; @Override protected Control createDialogArea(Composite parent) { elementProperties = new ElementProperties(parent, SWT.NONE); GraphElement model = getModel(); elementProperties.getWidthSpinner().setSelection(model.getWidth()); RGB rgb = SWTUtils.toSwtColor(event.display, PaintUtilities.stringToColor(model.getColor())).getRGB(); elementProperties.getColorSelector().setColorValue(rgb); elementProperties.getPointsText().setText(StringConverter.asString(model.getNumberOfPoints())); return elementProperties; } @Override protected void okPressed() { int width = elementProperties.getWidthSpinner().getSelection(); getModel().setWidth(width); RGB colorValue = elementProperties.getColorSelector().getColorValue(); java.awt.Color awtColor = SWTUtils.toAwtColor(new Color(event.display, colorValue)); getModel().setColor(PaintUtilities.colorToString(awtColor)); getModel().setNumberOfPoints(StringConverter.asInt(elementProperties.getPointsText().getText())); super.okPressed(); setColor(awtColor); setWidth(width); } }; dialog.open(); } })); } public void setColor(java.awt.Color awtColor) { if (fLine != null) { fLine.setBackgroundColor(SWTUtils.toSwtColor(Display.getDefault(), awtColor)); } } public void setWidth(int width) { if (fLine != null) { fLine.setSize(getFigure().getSize().width, width); } } public String getNextColor() { return PaintUtilities.colorToString((java.awt.Color) fDrawingSupplier.getNextPaint()); } public void bindValue(IObservableValue<GraphElement> value) { setValue(Optional.of(value)); } @Override protected void doBindValue(GraphElement value) { IObserver<Integer> fWidthObserver = new IObserver<Integer>() { @Override public void valueChanged(Integer oldValue, Integer newValue) { setWidth(newValue); } }; IObserver<String> fColorObserver = new IObserver<String>() { @Override public void valueChanged(String oldValue, String newValue) { setColor(PaintUtilities.stringToColor(newValue)); } }; fColorValue = new ObservableProperty<String>(value, "color", String.class); fColorValue.addObserver(fColorObserver); String color = fColorValue.getValue(); if (color == null) { color = getNextColor(); fColorValue.setValue(color); } fWidthValue = new ObservableProperty<Integer>(value, "width", Integer.class); fWidthValue.addObserver(fWidthObserver); fFunctionValue = new ObservableProperty<String>(value, "function", String.class); setColor(PaintUtilities.stringToColor(color)); setWidth(fWidthValue.getValue()); } @Override protected void doUnbindValue(GraphElement value) { fWidthValue.dispose(); fFunctionValue.dispose(); fWidthValue.dispose(); } }