From ef443925c208318c0bf642a4010df48df69036ee Mon Sep 17 00:00:00 2001 From: bancika Date: Fri, 14 Jan 2011 10:00:04 +0000 Subject: [PATCH] added export trace improved status message on selection --- .../DIYLC/config.xml | 8 +- .../src/org/diylc/common/IPlugInPort.java | 14 ++- .../DIYLC/src/org/diylc/gui/IView.java | 11 ++- .../DIYLC/src/org/diylc/gui/MainFrame.java | 24 ++++- .../org/diylc/plugins/file/FileManager.java | 39 ++++++-- .../plugins/file/ProjectDrawingProvider.java | 6 -- .../diylc/plugins/file/ProjectPreview.java | 5 + .../file/TraceMaskDrawingProvider.java | 43 +++++++++ .../diylc/plugins/statusbar/StatusBar.java | 32 ++++++- .../src/org/diylc/presenter/Presenter.java | 92 ++++++++++++++----- 10 files changed, 217 insertions(+), 57 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/TraceMaskDrawingProvider.java diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml index d6460070..6b58cd31 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -6,14 +6,14 @@ K - - lastPath - C:\Documents and Settings\Branislav Stojkovic\Desktop - metric true + + lastPath + C:\Documents and Settings\Branislav Stojkovic\Desktop + default.org.diylc.components.semiconductors.DIL_IC:Value LM366 diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java index 750d9044..88b1d40a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/common/IPlugInPort.java @@ -10,6 +10,7 @@ import java.util.Map; import java.util.Set; import javax.swing.Action; +import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.SwingConstants; import javax.swing.JPopupMenu.Separator; @@ -123,7 +124,18 @@ public interface IPlugInPort { * @param menuName * name of the menu to insert into */ - public void injectMenuAction(Action action, String menuName); + void injectMenuAction(Action action, String menuName); + + /** + * Injects a custom submenu into application's main menu. If + * action is set to null {@link Separator} will be added. If + * the specified menu does not exist it will be automatically created. + * + * @param name + * @param icon + * @param parentMenuName + */ + void injectSubmenu(String name, Icon icon, String parentMenuName); /** * Returns current zoom level where zoomLevel = 1.0d means diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/IView.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/IView.java index e224105d..f11c566a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/IView.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/IView.java @@ -1,12 +1,12 @@ package org.diylc.gui; import javax.swing.Action; +import javax.swing.Icon; import javax.swing.JComponent; import org.diylc.common.BadPositionException; import org.diylc.common.IPlugInPort; - /** * Base interface for the main GUI component. * @@ -38,4 +38,13 @@ public interface IView { * @see IPlugInPort#injectMenuAction */ void addMenuAction(Action action, String menuName); + + /** + * Adds a submenu to an existing menu. + * + * @param name + * @param icon + * @param parentMenuName + */ + void addSubmenu(String name, Icon icon, String parentMenuName); } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java index 9882310b..8dc97c25 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java @@ -12,6 +12,7 @@ import java.util.Map; import javax.swing.Action; import javax.swing.BoxLayout; +import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JMenu; @@ -177,6 +178,23 @@ public class MainFrame extends JFrame implements IView { @Override public void addMenuAction(Action action, String menuName) { + JMenu menu = findOrCreateMenu(menuName); + if (action == null) { + menu.addSeparator(); + } else { + menu.add(action); + } + } + + @Override + public void addSubmenu(String name, Icon icon, String parentMenuName) { + JMenu menu = findOrCreateMenu(parentMenuName); + JMenu submenu = new JMenu(name); + menu.add(submenu); + menuMap.put(name, submenu); + } + + private JMenu findOrCreateMenu(String menuName) { JMenu menu; if (menuMap.containsKey(menuName)) { menu = menuMap.get(menuName); @@ -185,10 +203,6 @@ public class MainFrame extends JFrame implements IView { menuMap.put(menuName, menu); getMainMenuBar().add(menu); } - if (action == null) { - menu.addSeparator(); - } else { - menu.add(action); - } + return menu; } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/FileManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/FileManager.java index 7774f638..c1a7357a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/FileManager.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/FileManager.java @@ -19,6 +19,7 @@ import org.diylc.core.Project; import org.diylc.gui.DialogFactory; import org.diylc.images.IconLoader; +import com.diyfever.gui.IDrawingProvider; import com.diyfever.gui.export.DrawingExporter; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; @@ -33,8 +34,11 @@ public class FileManager implements IPlugIn { private static final Logger LOG = Logger.getLogger(FileManager.class); private static final String FILE_TITLE = "File"; + private static final String TRACE_MASK_TITLE = "Trace Mask"; + private IPlugInPort plugInPort; private ProjectDrawingProvider drawingProvider; + private TraceMaskDrawingProvider traceMaskDrawingProvider; private XStream xStream = new XStream(new DomDriver()); @@ -42,18 +46,24 @@ public class FileManager implements IPlugIn { public void connect(IPlugInPort plugInPort) { this.plugInPort = plugInPort; this.drawingProvider = new ProjectDrawingProvider(plugInPort); + this.traceMaskDrawingProvider = new TraceMaskDrawingProvider(plugInPort); plugInPort.injectMenuAction(new NewAction(), FILE_TITLE); plugInPort.injectMenuAction(new OpenAction(), FILE_TITLE); plugInPort.injectMenuAction(new SaveAction(), FILE_TITLE); plugInPort.injectMenuAction(new SaveAsAction(), FILE_TITLE); plugInPort.injectMenuAction(null, FILE_TITLE); + plugInPort.injectMenuAction(new ExportPDFAction(drawingProvider), FILE_TITLE); + plugInPort.injectMenuAction(new ExportPNGAction(drawingProvider), FILE_TITLE); + plugInPort.injectMenuAction(new PrintAction(drawingProvider), FILE_TITLE); + plugInPort.injectSubmenu(TRACE_MASK_TITLE, null, FILE_TITLE); + plugInPort + .injectMenuAction(new ExportPDFAction(traceMaskDrawingProvider), TRACE_MASK_TITLE); + plugInPort + .injectMenuAction(new ExportPNGAction(traceMaskDrawingProvider), TRACE_MASK_TITLE); + plugInPort.injectMenuAction(new PrintAction(traceMaskDrawingProvider), TRACE_MASK_TITLE); plugInPort.injectMenuAction(new CreateBomAction(), FILE_TITLE); plugInPort.injectMenuAction(null, FILE_TITLE); - plugInPort.injectMenuAction(new ExportPDFAction(), FILE_TITLE); - plugInPort.injectMenuAction(new ExportPNGAction(), FILE_TITLE); - plugInPort.injectMenuAction(new PrintAction(), FILE_TITLE); - plugInPort.injectMenuAction(null, FILE_TITLE); plugInPort.injectMenuAction(new ExitAction(), FILE_TITLE); } @@ -194,8 +204,11 @@ public class FileManager implements IPlugIn { private static final long serialVersionUID = 1L; - public ExportPDFAction() { + private IDrawingProvider drawingProvider; + + public ExportPDFAction(IDrawingProvider drawingProvider) { super(); + this.drawingProvider = drawingProvider; putValue(AbstractAction.NAME, "Export to PDF"); putValue(AbstractAction.SMALL_ICON, IconLoader.PDF.getIcon()); } @@ -205,7 +218,7 @@ public class FileManager implements IPlugIn { File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.PDF.getFilter(), null, FileFilterEnum.PDF.getExtensions()[0], null); if (file != null) { - DrawingExporter.getInstance().exportPDF(drawingProvider, file); + DrawingExporter.getInstance().exportPDF(this.drawingProvider, file); } } } @@ -214,8 +227,11 @@ public class FileManager implements IPlugIn { private static final long serialVersionUID = 1L; - public ExportPNGAction() { + private IDrawingProvider drawingProvider; + + public ExportPNGAction(IDrawingProvider drawingProvider) { super(); + this.drawingProvider = drawingProvider; putValue(AbstractAction.NAME, "Export to PNG"); putValue(AbstractAction.SMALL_ICON, IconLoader.Image.getIcon()); } @@ -225,7 +241,7 @@ public class FileManager implements IPlugIn { File file = DialogFactory.getInstance().showSaveDialog(FileFilterEnum.PNG.getFilter(), null, FileFilterEnum.PNG.getExtensions()[0], null); if (file != null) { - DrawingExporter.getInstance().exportPNG(drawingProvider, file); + DrawingExporter.getInstance().exportPNG(this.drawingProvider, file); } } } @@ -234,15 +250,18 @@ public class FileManager implements IPlugIn { private static final long serialVersionUID = 1L; - public PrintAction() { + private IDrawingProvider drawingProvider; + + public PrintAction(IDrawingProvider drawingProvider) { super(); + this.drawingProvider = drawingProvider; putValue(AbstractAction.NAME, "Print..."); putValue(AbstractAction.SMALL_ICON, IconLoader.Print.getIcon()); } @Override public void actionPerformed(ActionEvent e) { - DrawingExporter.getInstance().print(drawingProvider); + DrawingExporter.getInstance().print(this.drawingProvider); } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/ProjectDrawingProvider.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/ProjectDrawingProvider.java index ad34afab..fc24f3fe 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/ProjectDrawingProvider.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/ProjectDrawingProvider.java @@ -6,7 +6,6 @@ import java.awt.Graphics2D; import java.util.EnumSet; import org.diylc.common.DrawOption; -import org.diylc.common.IComponentFiler; import org.diylc.common.IPlugInPort; import com.diyfever.gui.IDrawingProvider; @@ -31,11 +30,6 @@ public class ProjectDrawingProvider implements IDrawingProvider { plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ZOOM, DrawOption.ANTIALIASING), null); } - public void draw(Graphics g, IComponentFiler filter) { - plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ZOOM, DrawOption.ANTIALIASING), - filter); - } - @Override public Dimension getSize() { return plugInPort.getCanvasDimensions(true); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/ProjectPreview.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/ProjectPreview.java index 64e24957..6abc6c1b 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/ProjectPreview.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/ProjectPreview.java @@ -12,6 +12,7 @@ import java.io.FileInputStream; import java.util.EnumSet; import javax.swing.Action; +import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JFileChooser; import javax.swing.JLabel; @@ -59,6 +60,10 @@ public class ProjectPreview extends JPanel implements PropertyChangeListener, IF @Override public void addMenuAction(Action action, String menuName) { } + + @Override + public void addSubmenu(String name, Icon icon, String parentMenuName) { + } }); xStream = new XStream(new DomDriver()); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/TraceMaskDrawingProvider.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/TraceMaskDrawingProvider.java new file mode 100644 index 00000000..ac711f7a --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/file/TraceMaskDrawingProvider.java @@ -0,0 +1,43 @@ +package org.diylc.plugins.file; + +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Graphics2D; +import java.util.EnumSet; + +import org.diylc.common.DrawOption; +import org.diylc.common.IComponentFiler; +import org.diylc.common.IPlugInPort; +import org.diylc.core.IDIYComponent; +import org.diylc.presenter.ComponentZOrderFiler; + +import com.diyfever.gui.IDrawingProvider; + +/** + * {@link IDrawingProvider} implementation that uses {@link IPlugInPort} to draw + * a project onto the canvas. + * + * @author Branislav Stojkovic + */ +public class TraceMaskDrawingProvider implements IDrawingProvider { + + private IPlugInPort plugInPort; + private IComponentFiler filter; + + public TraceMaskDrawingProvider(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + this.filter = new ComponentZOrderFiler(IDIYComponent.ABOVE_BOARD); + } + + @Override + public void draw(Graphics g) { + plugInPort.draw((Graphics2D) g, EnumSet.of(DrawOption.ZOOM, DrawOption.ANTIALIASING), + this.filter); + } + + @Override + public Dimension getSize() { + return plugInPort.getCanvasDimensions(true); + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/statusbar/StatusBar.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/statusbar/StatusBar.java index a6d4f3d9..6397846d 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/statusbar/StatusBar.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/statusbar/StatusBar.java @@ -57,6 +57,7 @@ public class StatusBar extends JPanel implements IPlugIn { private ComponentType componentSlot; private List> componentsUnderCursor; private List selectedComponentNames; + private List stuckComponentNames; public StatusBar() { super(); @@ -189,12 +190,19 @@ public class StatusBar extends JPanel implements IPlugIn { break; case SELECTION_CHANGED: ComponentSelection selection = (ComponentSelection) params[0]; + Collection> stuckComponents = (Collection>) params[1]; Collection componentNames = new HashSet(); for (IDIYComponent component : selection) { componentNames.add(component.getName()); } this.selectedComponentNames = new ArrayList(componentNames); Collections.sort(this.selectedComponentNames); + this.stuckComponentNames = new ArrayList(); + for (IDIYComponent component : stuckComponents) { + this.stuckComponentNames.add(component.getName()); + } + this.stuckComponentNames.removeAll(this.selectedComponentNames); + Collections.sort(this.stuckComponentNames); refreshStatusText(); break; case SELECTION_SIZE_CHANGED: @@ -245,18 +253,32 @@ public class StatusBar extends JPanel implements IPlugIn { } getStatusLabel().setText("Drag " + formattedNames); } else if (selectedComponentNames != null && !selectedComponentNames.isEmpty()) { - String formattedNames = ""; + StringBuilder builder = new StringBuilder(); for (int i = 0; i < selectedComponentNames.size(); i++) { if (i > 0) { if (i == selectedComponentNames.size() - 1) { - formattedNames += " and "; + builder.append(" and "); } else { - formattedNames += ", "; + builder.append(", "); } } - formattedNames += selectedComponentNames.get(i); + builder.append(selectedComponentNames.get(i)); } - getStatusLabel().setText("Selection: " + formattedNames); + if (!stuckComponentNames.isEmpty()) { + builder.append(" ("); + for (int i = 0; i < stuckComponentNames.size(); i++) { + if (i > 0) { + if (i == stuckComponentNames.size() - 1) { + builder.append(" and "); + } else { + builder.append(", "); + } + } + builder.append(stuckComponentNames.get(i)); + } + builder.append(" would be affected by dragging as well)"); + } + getStatusLabel().setText("Selection: " + builder.toString()); } else { getStatusLabel().setText(""); } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java index a701425b..2455d1f8 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java @@ -22,6 +22,7 @@ import java.util.Map; import java.util.Set; import javax.swing.Action; +import javax.swing.Icon; import javax.swing.JComponent; import org.apache.log4j.Logger; @@ -341,6 +342,12 @@ public class Presenter implements IPlugInPort { view.addMenuAction(action, menuName); } + @Override + public void injectSubmenu(String name, Icon icon, String parentMenuName) { + LOG.info(String.format("injectSubmenu(%s, icon, %s)", name, parentMenuName)); + view.addSubmenu(name, icon, parentMenuName); + } + /** * Finds all components whose areas include the specified {@link Point}. * Point is not scaled by the zoom factor. @@ -394,9 +401,11 @@ public class Presenter implements IPlugInPort { selectedComponents.addAll(findAllGroupedComponents(component)); } } - messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); - messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - calculateSelectionDimension()); + fireSelectionChanged(); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); messageDispatcher.dispatchMessage(EventType.REPAINT); } } @@ -458,9 +467,11 @@ public class Presenter implements IPlugInPort { public void selectAll() { LOG.info("selectAll()"); this.selectedComponents = new ComponentSelection(currentProject.getComponents()); - messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); - messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - calculateSelectionDimension()); + fireSelectionChanged(); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); messageDispatcher.dispatchMessage(EventType.REPAINT); } @@ -486,16 +497,20 @@ public class Presenter implements IPlugInPort { // If we're dragging control points reset selection. selectedComponents.clear(); selectedComponents.addAll(controlPointMap.keySet()); - messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); - messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - calculateSelectionDimension()); + fireSelectionChanged(); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); messageDispatcher.dispatchMessage(EventType.REPAINT); } else if (components.isEmpty()) { // If there are no components are under the cursor, reset selection. selectedComponents.clear(); - messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); - messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - calculateSelectionDimension()); + fireSelectionChanged(); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); messageDispatcher.dispatchMessage(EventType.REPAINT); } else { // Take the last component, i.e. the top order component. @@ -505,9 +520,11 @@ public class Presenter implements IPlugInPort { if (!selectedComponents.contains(component)) { selectedComponents.clear(); selectedComponents.addAll(findAllGroupedComponents(component)); - messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); - messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - calculateSelectionDimension()); + fireSelectionChanged(); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); messageDispatcher.dispatchMessage(EventType.REPAINT); } // If there aren't any control points, try to add all the selected @@ -659,9 +676,10 @@ public class Presenter implements IPlugInPort { } } selectionRect = null; - messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); - messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - calculateSelectionDimension()); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); } // There is selection, so we need to finalize the drag&drop // operation. @@ -670,6 +688,7 @@ public class Presenter implements IPlugInPort { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, preDragProject, cloner .deepClone(currentProject), "Move"); } + fireSelectionChanged(); messageDispatcher.dispatchMessage(EventType.REPAINT); dragInProgress = false; } @@ -749,9 +768,10 @@ public class Presenter implements IPlugInPort { Project oldProject = cloner.deepClone(currentProject); // First remove the selected components from other groups. ungroupComponents(selectedComponents); - // Then group them together + // Then group them together. currentProject.getGroups().add(new HashSet>(selectedComponents)); // Notify the listeners. + messageDispatcher.dispatchMessage(EventType.REPAINT); if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Group"); @@ -764,12 +784,29 @@ public class Presenter implements IPlugInPort { Project oldProject = cloner.deepClone(currentProject); ungroupComponents(selectedComponents); // Notify the listeners. + messageDispatcher.dispatchMessage(EventType.REPAINT); if (!oldProject.equals(currentProject)) { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Group"); } } + private void fireSelectionChanged() { + Map, Set> controlPointMap = new HashMap, Set>(); + for (IDIYComponent component : selectedComponents) { + Set indices = new HashSet(); + for (int i = 0; i < component.getControlPointCount(); i++) { + indices.add(i); + } + controlPointMap.put(component, indices); + } + includeStuckComponents(controlPointMap); + messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents, + controlPointMap.keySet()); + messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + calculateSelectionDimension()); + } + /** * Removes all the groups that contain at least one of the specified * components. @@ -926,9 +963,12 @@ public class Presenter implements IPlugInPort { messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Add " + componentType.getName()); } - messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); - messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - calculateSelectionDimension()); + + fireSelectionChanged(); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); messageDispatcher.dispatchMessage(EventType.REPAINT); } @@ -965,9 +1005,11 @@ public class Presenter implements IPlugInPort { : componentType.getName())); this.componentSlot = componentType; selectedComponents.clear(); - messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); - messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, - calculateSelectionDimension()); + fireSelectionChanged(); + // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, + // selectedComponents); + // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, + // calculateSelectionDimension()); messageDispatcher.dispatchMessage(EventType.SLOT_CHANGED, componentSlot); }