package com.baselet.element.old.custom; import java.util.Iterator; import java.util.Timer; import java.util.TimerTask; import com.baselet.control.HandlerElementMap; import com.baselet.control.Main; import com.baselet.control.basics.geom.Rectangle; import com.baselet.control.constants.Constants; import com.baselet.control.enums.Program; import com.baselet.custom.CustomCodeSyntaxPane; import com.baselet.custom.CustomElementPanel; import com.baselet.diagram.CurrentDiagram; import com.baselet.diagram.CustomPreviewHandler; import com.baselet.diagram.DiagramHandler; import com.baselet.diagram.DrawPanel; import com.baselet.element.ElementFactorySwing; import com.baselet.element.interfaces.GridElement; import com.baselet.gui.CurrentGui; public class CustomElementHandler { private final Timer timer; private final CustomCodeSyntaxPane codepane; private final CustomPreviewHandler preview; private GridElement editedEntity; private GridElement originalElement; private TimerTask compiletask; private boolean changed; private final ErrorHandler errorhandler; private boolean compilation_running; private final CustomElementPanel panel; boolean keypressed; private String old_text; public CustomElementHandler() { codepane = new CustomCodeSyntaxPane(); errorhandler = new ErrorHandler(codepane); codepane.getTextComponent().addMouseMotionListener(errorhandler); preview = new CustomPreviewHandler(); timer = new Timer("customElementTimer", true); changed = false; compilation_running = false; old_text = null; panel = new CustomElementPanel(this); } public CustomElementPanel getPanel() { return panel; } public void newEntity() { this.newEntity("Default"); } public void newEntity(String template) { preview.closePreview(); originalElement = null; editedEntity = CustomElementCompiler.getInstance().genEntityFromTemplate(template, errorhandler); if (editedEntity instanceof CustomElement) { codepane.setCode(((CustomElement) editedEntity).getCode()); } else { codepane.setCode(""); } editedEntity.setPanelAttributes("// Modify the text below and" + Constants.NEWLINE + "// observe the element preview." + Constants.NEWLINE + Constants.NEWLINE + "Hello, World! " + Constants.NEWLINE + "Enjoy " + Program.getInstance().getProgramName() + "!"); editedEntity.setRectangle(new Rectangle(20, 20, 200, 200)); updatePreview(editedEntity); getPreviewHandler().getDrawPanel().getSelector().select(editedEntity); setChanged(false); start(); } public void editEntity(CustomElement e) { preview.closePreview(); originalElement = e; editedEntity = e.cloneFromMe(); editedEntity.setLocation(20, 20); codepane.setCode(e.getCode()); updatePreview(editedEntity); getPreviewHandler().getDrawPanel().getSelector().select(editedEntity); setChanged(false); start(); } public void saveEntity() { GridElement e = CustomElementCompiler.getInstance().genEntity(codepane.getText(), errorhandler); editedEntity = e; updatePreview(e); // update preview panel to set the entities bounds... updateElement(e); setChanged(false); } public boolean closeEntity() { if (changed) { setChanged(false); } stop(); preview.closePreview(); preview.getDrawPanel().getSelector().deselectAll(); // clear controller before editing new custom element CurrentDiagram.getInstance().getDiagramHandler().getController().clear(); DrawPanel dia = CurrentGui.getInstance().getGui().getCurrentDiagram(); if (dia != null) { dia.getSelector().updateSelectorInformation(); } else { Main.getInstance().setPropertyPanelToGridElement(null); } return true; } public CustomPreviewHandler getPreviewHandler() { return preview; } public CustomCodeSyntaxPane getCodePane() { return codepane; } private void updatePreview(GridElement e) { if (e != null) { Iterator<GridElement> iter = preview.getDrawPanel().getGridElements().iterator(); if (iter.hasNext()) { GridElement element = iter.next(); e.setRectangle(element.getRectangle()); e.setPanelAttributes(element.getPanelAttributes()); preview.getDrawPanel().removeElement(element); } preview.setHandlerAndInitListeners(e); preview.getDrawPanel().addElement(e); e.repaint(); } } // starts the task private void start() { compiletask = new CustomElementCompileTask(this); timer.schedule(compiletask, Constants.CUSTOM_ELEMENT_COMPILE_INTERVAL, Constants.CUSTOM_ELEMENT_COMPILE_INTERVAL); } // stops the task private void stop() { if (compiletask != null) { compiletask.cancel(); } } // runs compilation every 1 seconds and updates gui/errors... protected void runCompilation() { if (!compilation_running && !keypressed) // prevent 2 compilations to run at the same time (if compilation takes more then 1sec) { compilation_running = true; String txt = codepane.getText(); if (!txt.equals(old_text)) { setChanged(true); errorhandler.clearErrors(); old_text = txt; editedEntity = CustomElementCompiler.getInstance().genEntity(txt, errorhandler); panel.setCustomElementSaveable(true); updatePreview(editedEntity); } compilation_running = false; } keypressed = false; } private void setChanged(boolean changed) { this.changed = changed; CurrentGui.getInstance().getGui().setCustomElementChanged(this, changed); } // reloads the element on all open panels and adds it to the custom element panel if not already there. private void updateElement(GridElement element) { // if a new element has been created add it to current diagram if (originalElement == null) { DiagramHandler current = null; DrawPanel c = CurrentGui.getInstance().getGui().getCurrentDiagram(); if (c == null) { Main.getInstance().doNew(); current = CurrentGui.getInstance().getGui().getCurrentDiagram().getHandler(); } else { current = c.getHandler(); } // set location for element int x = 10, y = 10; for (GridElement e : current.getDrawPanel().getGridElements()) { if (e.getRectangle().y + e.getRectangle().height + 10 > y) { y = e.getRectangle().y + e.getRectangle().height + 10; } } Rectangle bounds = new Rectangle(x, y, element.getRectangle().width, element.getRectangle().height); addElementToDiagram(element, current, true, bounds, element.getPanelAttributes()); } else { // replace edited element (and ONLY edited element) HandlerElementMap.getHandlerForElement(originalElement).getDrawPanel().removeElement(originalElement); addElementToDiagram(element, HandlerElementMap.getHandlerForElement(originalElement), true, originalElement.getRectangle(), originalElement.getPanelAttributes()); } } private void addElementToDiagram(GridElement e, DiagramHandler d, boolean setchanged, Rectangle bounds, String state) { // TODO bug if custom elements get inserted in zoomed drawpanel // the zoom to 100% bugfix works for inserting new elements but editing old elements with zoom will not work anymore // We must zoom to the defaultGridsize before execution // int oldZoom = d.getGridSize(); // d.setGridAndZoom(Constants.DEFAULTGRIDSIZE, false); GridElement e2 = ElementFactorySwing.createCopy(e, d); e2.setPanelAttributes(state); e2.setRectangle(bounds); d.getDrawPanel().addElement(e2); if (setchanged) { d.setChanged(true); } // And zoom back to the oldGridsize after execution // d.setGridAndZoom(oldZoom, false); } }