package com.baselet.gwt.client.view; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import com.baselet.control.SharedUtils; import com.baselet.control.basics.geom.Point; import com.baselet.element.Selector; import com.baselet.element.facet.common.GroupFacet; import com.baselet.element.interfaces.Diagram; import com.baselet.element.interfaces.GridElement; import com.baselet.element.sticking.StickableMap; import com.baselet.gwt.client.element.DiagramXmlParser; import com.baselet.gwt.client.element.ElementFactoryGwt; import com.baselet.gwt.client.view.palettes.Resources; import com.baselet.gwt.client.view.widgets.propertiespanel.PropertiesTextArea; import com.google.gwt.event.dom.client.ChangeEvent; import com.google.gwt.event.dom.client.ChangeHandler; import com.google.gwt.event.dom.client.MouseDownEvent; import com.google.gwt.event.dom.client.MouseDownHandler; import com.google.gwt.resources.client.TextResource; import com.google.gwt.user.client.ui.ListBox; public class DrawPanelPalette extends DrawPanel { private static final List<TextResource> PALETTELIST = Arrays.asList( Resources.INSTANCE.UML_Common_Elements(), Resources.INSTANCE.Custom_Drawings(), Resources.INSTANCE.Generic_Colors(), Resources.INSTANCE.Generic_Layers(), Resources.INSTANCE.Generic_Text_and_Alignment(), Resources.INSTANCE.UML_Activity(), Resources.INSTANCE.UML_Class(), Resources.INSTANCE.UML_Composite_Structure(), Resources.INSTANCE.UML_Package(), Resources.INSTANCE.UML_Sequence(), Resources.INSTANCE.UML_Sequence_All_in_one(), Resources.INSTANCE.UML_State_Machine(), Resources.INSTANCE.UML_Structure_and_Deployment(), Resources.INSTANCE.UML_Use_Case(), Resources.INSTANCE.Plots()); private final Map<TextResource, Diagram> paletteCache = new HashMap<TextResource, Diagram>(); private final ListBox paletteChooser; public DrawPanelPalette(MainView mainView, PropertiesTextArea propertiesPanel, final ListBox paletteChooser) { super(mainView, propertiesPanel); setDiagram(parsePalette(PALETTELIST.get(0))); this.paletteChooser = paletteChooser; for (TextResource r : PALETTELIST) { paletteChooser.addItem(r.getName().replaceAll("_", " ")); } paletteChooser.addChangeHandler(new ChangeHandler() { @Override public void onChange(ChangeEvent event) { setDiagram(parsePalette(PALETTELIST.get(paletteChooser.getSelectedIndex()))); selector.deselectAll(); } }); paletteChooser.addMouseDownHandler(new MouseDownHandler() { @Override public void onMouseDown(MouseDownEvent event) { event.stopPropagation(); // avoid propagation of mouseclick to palette which can be under the opened listbox } }); } private Diagram parsePalette(TextResource res) { Diagram diagram = paletteCache.get(res); if (diagram == null) { diagram = DiagramXmlParser.xmlToDiagram(res.getText()); paletteCache.put(res, diagram); } return diagram; } @Override public void onDoubleClick(GridElement ge) { if (ge != null && !propertiesPanel.getPaletteShouldIgnoreMouseClicks()) { otherDrawFocusPanel.setFocus(true); GridElement e = ElementFactoryGwt.create(ge, otherDrawFocusPanel.getDiagram()); e.setProperty(GroupFacet.KEY, null); commandInvoker.realignElementsToVisibleRect(otherDrawFocusPanel, Arrays.asList(e)); commandInvoker.addElements(otherDrawFocusPanel, Arrays.asList(e)); } } private final List<GridElement> draggedElements = new ArrayList<GridElement>(); @Override void onMouseDown(GridElement element, boolean isControlKeyDown) { super.onMouseDown(element, isControlKeyDown); for (GridElement original : selector.getSelectedElements()) { draggedElements.add(ElementFactoryGwt.create(original, getDiagram())); } } @Override public void onMouseDragEnd(GridElement gridElement, Point lastPoint) { if (lastPoint.getX() < 0) { // mouse moved from palette to diagram -> insert elements to diagram List<GridElement> elementsToMove = new ArrayList<GridElement>(); for (GridElement original : selector.getSelectedElements()) { GridElement copy = ElementFactoryGwt.create(original, otherDrawFocusPanel.getDiagram()); int verticalScrollbarDiff = otherDrawFocusPanel.scrollPanel.getVerticalScrollPosition() - scrollPanel.getVerticalScrollPosition(); int horizontalScrollbarDiff = otherDrawFocusPanel.scrollPanel.getHorizontalScrollPosition() - scrollPanel.getHorizontalScrollPosition(); copy.setLocationDifference(otherDrawFocusPanel.getVisibleBounds().width + horizontalScrollbarDiff, paletteChooser.getOffsetHeight() + verticalScrollbarDiff); copy.setRectangle(SharedUtils.realignToGrid(copy.getRectangle(), false)); // realign location to grid (width and height should not be changed) elementsToMove.add(copy); } Selector.replaceGroupsWithNewGroups(elementsToMove, otherDrawFocusPanel.getSelector()); commandInvoker.removeSelectedElements(this); commandInvoker.addElements(this, draggedElements); selector.deselectAll(); commandInvoker.addElements(otherDrawFocusPanel, elementsToMove); } draggedElements.clear(); super.onMouseDragEnd(gridElement, lastPoint); } @Override protected StickableMap getStickablesToMoveWhenElementsMove(GridElement draggedElement, List<GridElement> elements) { // Moves at the palette NEVER stick return StickableMap.EMPTY_MAP; } }