package com.baselet.plugin.gui; import java.awt.Cursor; import java.awt.Frame; import java.awt.Toolkit; import java.awt.datatransfer.DataFlavor; import java.awt.datatransfer.Transferable; import java.util.Collection; import java.util.HashMap; import javax.swing.text.JTextComponent; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.swt.widgets.Display; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.baselet.control.CanCloseProgram; import com.baselet.control.config.Config; import com.baselet.diagram.CurrentDiagram; import com.baselet.diagram.DiagramHandler; import com.baselet.diagram.DrawPanel; import com.baselet.element.interfaces.GridElement; import com.baselet.element.old.custom.CustomElementHandler; import com.baselet.gui.BaseGUI; import com.baselet.gui.CurrentGui; import com.baselet.gui.pane.OwnSyntaxPane; import com.baselet.plugin.gui.Contributor.ActionName; public class EclipseGUI extends BaseGUI { public enum Pane { PROPERTY, CUSTOMCODE, DIAGRAM } private static final Logger log = LoggerFactory.getLogger(EclipseGUI.class); private Editor editor; private final HashMap<DiagramHandler, Editor> diagrams; private Contributor contributor; public EclipseGUI(CanCloseProgram main) { super(main); diagrams = new HashMap<DiagramHandler, Editor>(); } @Override public void close(DiagramHandler diagram) { // eclipse does the closing } @Override public void closeWindow() { main.closeProgram(); } @Override public void diagramSelected(DiagramHandler handler) { // the menues are only visible if a diagram is selected. (contributor manages this) // AB: just update the export menu DrawPanel currentDiagram = CurrentGui.getInstance().getGui().getCurrentDiagram(); if (currentDiagram == null) { return; // Possible if method is called at loading a palette } boolean enable = handler != null && !currentDiagram.getGridElements().isEmpty(); contributor.setExportAsEnabled(enable); } @Override public void enablePasteMenuEntry() { if (contributor != null) { contributor.setPaste(true); } } @Override public CustomElementHandler getCurrentCustomHandler() { if (editor == null) { return null; } return editor.getCustomElementHandler(); } @Override public DrawPanel getCurrentDiagram() { if (editor == null) { return null; } return editor.getDiagram(); } @Override public int getMainSplitPosition() { return Config.getInstance().getMain_split_position(); // in Eclipse the Editors overwrite this constant everytime they are closed (editor.getMainSplitLocation() wouldn't work because the editor is already null) } @Override public int getRightSplitPosition() { return Config.getInstance().getRight_split_position(); } @Override public int getMailSplitPosition() { return Config.getInstance().getMail_split_position(); } @Override public String getSelectedPalette() { if (editor != null) { return editor.getSelectedPaletteName(); } return null; } @Override protected void init() {} @Override public void open(DiagramHandler diagram) { if (editor != null) { editor.open(diagram); } } @Override public void jumpTo(DiagramHandler diagram) { // not called by eclipse plugin (handles open by createEditor function) } @Override public void showPalette(String palette) { super.showPalette(palette); if (editor != null) { editor.showPalette(palette); } } @Override public void setCustomElementChanged(CustomElementHandler handler, boolean changed) { } @Override public void setCustomElementSelected(boolean selected) { if (editor != null && contributor != null) { contributor.setCustomElementSelected(selected); } } @Override public void setCustomPanelEnabled(boolean enable) { if (editor != null) { editor.setCustomPanelEnabled(enable); if (contributor != null) { contributor.setCustomPanelEnabled(enable); } } } @Override public void setMailPanelEnabled(boolean enable) { if (editor != null) { editor.setMailPanelEnabled(enable); } } @Override public boolean isMailPanelVisible() { return editor.isMailPanelVisible(); } @Override public void updateDiagramName(DiagramHandler diagram, String name) { Editor editor = diagrams.get(diagram); if (editor != null) { editor.diagramNameChanged(); } } @Override public void setDiagramChanged(DiagramHandler diagram, boolean changed) { Editor editor = diagrams.get(diagram); if (editor != null) { editor.dirtyChanged(); } } @Override public void setCursor(Cursor cursor) { if (editor != null) { editor.setCursor(cursor); } } public void registerEditorForDiagramHandler(Editor editor, DiagramHandler handler) { diagrams.put(handler, editor); } public void setCurrentDiagramHandler(DiagramHandler handler) { CurrentDiagram.getInstance().setCurrentDiagramHandler(handler); } public void setCurrentEditor(Editor editor) { this.editor = editor; } public void editorRemoved(Editor editor) { // Before removing the editor, we have to store the actual splitpositions and lastUsedPalette to variables so that a new editor has the same values Config.getInstance().setMain_split_position(editor.getMainSplitLocation()); Config.getInstance().setRight_split_position(editor.getRightSplitLocation()); Config.getInstance().setLastUsedPalette(getSelectedPalette()); diagrams.remove(editor.getDiagram().getHandler()); if (editor.equals(this.editor)) { this.editor = null; } } @Override public OwnSyntaxPane getPropertyPane() { if (editor != null) { return editor.getPropertyPane(); } else { return null; } } public void panelDoAction(Pane pane, ActionName actionName) { JTextComponent textpane = null; if (pane == Pane.PROPERTY) { textpane = editor.getPropertyPane().getTextComponent(); } else if (pane == Pane.CUSTOMCODE) { textpane = editor.getCustomPane(); } if (textpane != null) { if (actionName == ActionName.COPY) { textpane.copy(); } else if (actionName == ActionName.CUT) { textpane.cut(); int pos = textpane.getSelectionStart(); textpane.setCaretPosition(pos); } else if (actionName == ActionName.PASTE) { try { // We retrieve the content from the system clipboard Transferable cont = Toolkit.getDefaultToolkit().getSystemClipboard().getContents(this); if (cont != null) { // If it's not null we save the length of the content and add the actual selection start int pos = ((String) cont.getTransferData(DataFlavor.stringFlavor)).length() + textpane.getSelectionStart(); textpane.paste(); // After pasting the clipboard content we want to set the actual cursor position to the end of the pasted content textpane.setCaretPosition(pos); } } catch (Exception e) { log.error(null, e); } } else if (actionName == ActionName.SELECTALL) { textpane.selectAll(); } } } @Override public void requestFocus() { if (editor != null) { editor.requestFocus(); } } public void setContributor(Contributor contributor) { this.contributor = contributor; } @Override public void elementsSelected(Collection<GridElement> selectedElements) { super.elementsSelected(selectedElements); if (contributor != null) { contributor.setElementsSelected(selectedElements); } } public void setPaneFocused(final Pane pane) { if (contributor != null) { // must be executed from within the SWT Display thread (see https://stackoverflow.com/questions/5980316/invalid-thread-access-error-with-java-swt) Display.getDefault().syncExec(new Runnable() { @Override public void run() { contributor.setGlobalActionHandlers(pane); } }); } } @Override public void setValueOfZoomDisplay(int i) { if (contributor != null) { contributor.updateZoomMenuRadioButton(i); } } @Override public void afterSaving() { super.afterSaving(); EclipseGUI.refreshWorkspace(); } @Override public void focusPropertyPane() { editor.focusPropertyPane(); } @Override public Frame getMainFrame() { return editor.getMainFrame(); } public static void refreshWorkspace() { IWorkspaceRoot myWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); try { myWorkspaceRoot.refreshLocal(IResource.DEPTH_INFINITE, null); } catch (CoreException e) { log.error("Error at refreshing the workspace", e); } } @Override public boolean hasExtendedContextMenu() { return false; } @Override public boolean saveWindowSizeInConfig() { return false; } }