From 27bac25c8b1b68a38b2b6115bc0ea96e99dae226 Mon Sep 17 00:00:00 2001 From: bancika Date: Wed, 12 Jan 2011 00:39:39 +0000 Subject: [PATCH] added group/ungroup --- .../src/org/diylc/common/IPlugInPort.java | 10 ++- .../DIYLC/src/org/diylc/core/Project.java | 16 +++- .../src/org/diylc/images/IconLoader.java | 2 +- .../DIYLC/src/org/diylc/images/group.png | Bin 0 -> 771 bytes .../DIYLC/src/org/diylc/images/ungroup.png | Bin 0 -> 883 bytes .../plugins/clipboard/ClipboardManager.java | 44 +++++++++- .../src/org/diylc/presenter/Presenter.java | 75 +++++++++++++++--- 7 files changed, 128 insertions(+), 19 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/images/group.png create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/images/ungroup.png 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 8478c3b8..58e1b47f 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 @@ -169,11 +169,9 @@ public interface IPlugInPort { ComponentSelection getSelectedComponents(); /** - * Changes component selection. - * - * @param selection + * Selects all components in the project. */ - void setSelectedComponents(ComponentSelection selection); + void selectAll(); /** * Returns the {@link Area} occupied by the component. @@ -306,4 +304,8 @@ public interface IPlugInPort { * @param isMetric */ void setMetric(boolean isMetric); + + void groupSelectedComponents(); + + void ungroupSelectedComponents(); } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java index 216f28d9..c659734b 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java @@ -2,7 +2,9 @@ package org.diylc.core; import java.io.Serializable; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import org.diylc.core.annotations.EditableProperty; import org.diylc.core.measures.Size; @@ -29,9 +31,11 @@ public class Project implements Serializable { private Size width; private Size height; private List> components; + private Set>> groups; public Project() { components = new ArrayList>(); + groups = new HashSet>>(); title = DEFAULT_TITLE; author = System.getProperty("user.name"); width = DEFAULT_WIDTH; @@ -39,7 +43,7 @@ public class Project implements Serializable { } public Project(String title, String author, String description, Size width, Size height, - List> components) { + List> components, Set>> groups) { super(); this.title = title; this.author = author; @@ -47,6 +51,7 @@ public class Project implements Serializable { this.width = width; this.height = height; this.components = components; + this.groups = groups; } @EditableProperty @@ -103,6 +108,15 @@ public class Project implements Serializable { return components; } + /** + * Set of grouped components. + * + * @return + */ + public Set>> getGroups() { + return groups; + } + @Override public int hashCode() { final int prime = 31; diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/images/IconLoader.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/images/IconLoader.java index aa73e8a0..c0ced882 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/images/IconLoader.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/images/IconLoader.java @@ -21,7 +21,7 @@ public enum IconLoader { "csv.png"), HTML("html.png"), Image("image.png"), Cut("cut.png"), Copy("copy.png"), Paste( "paste.png"), Selection("selection.png"), BOM("bom.png"), BlackBoard("blackboard.png"), IdCard( "id_card.png"), IdCardAdd("id_card_add.png"), Chest("chest.png"), Upload("upload.png"), Wrench( - "wrench.png"), ; + "wrench.png"), Group("group.png"), Ungroup("ungroup.png"); protected String name; diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/images/group.png b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/images/group.png new file mode 100644 index 0000000000000000000000000000000000000000..be9d2df1ac235499c4618d59c7e44c61ced1c192 GIT binary patch literal 771 zcmV+e1N{7nP)WdKcYATl%{MrC3kGB7YRATc*OG&MRjIUp-AF)%PD++897000McNliru z)&&<0G6A15LT~^8010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00LV{ zL_t(|+KrRTYZFlv#=kq6NjhnRuNb2NE7YnHT-B8gTB#5>g1G2Pa2eD^{{|6VxDZ@Q zT?o1oSAvVu3Pp4!1yO=vim9o2M?&+Mnat~Y?qt%;M(AOFch11M_nz;ZGYoUjIfV5J zw=p&Qdf)zLZkpDH?0?*)HB2lJDGcrEfBj_k620e%4cR+&xcLWBOk|!sjUS1f(@Ynp zeeIFRw<9W!CsjlbGuTpyP*A62yN)Ab6eJd(Vdssgi?%1>U}oiQA{k4+T&pV<8n7%5 z+vTL4!7v?6FD<~OY{*z3>+L-W>Dk2jrJEPj?`0jOj)R)PptCTf*c7Vo*ZGy5FUG6F zW`SZ&Ujh$GV7u3E=P~aqQsCa21_^kE06E2QCx{Akc1Z`K@?t-dAS`-IT&G2u+H>u|4fI;vKOXkTC87=MJoiD2y;wT?xTt5g1AYEOvnM^R(;YBBB~B z{73>X%!HUM`x=mF<0xI}kU@>`yE8XUq6%+9zA+SY@d2F!VV7OfgrTNFzS zfH*`Gtq#u4P(m_0?~SK0QDM<%VfFQ89J@C3Tc7SBo+*2N^W%M5Bcq<4Br+nzA5USG zz|SK#oe20TfAcTmt2khSIOJ&qR6kJPhuWdKcYATl%{MrC3kGB7YRATc*OG&MRjIUp-AF)%PD++897000McNliru z)&&<0G6A15LT~^8010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00PTN zL_t(|+KrQKNK;`H$N#&#n{DRH)?AjUrLB~LAXCgl4Y3Itgkf()ACeF&lRosx2zrBF zAgl=TOH%ZP9|Wx|&B#ol7>0=wWu-BvbCa2yZqx1Fr*r3B>`Tyr-+f;0Ip;a&IpWj@7ey=zB18e80Sb=6?{p5k2QOA5sp2y19cI!OcsV5L-tNqd20@1 zwVT*8QwBTR?qG(i6D%sP(L<^&L<3PJ_f8>U^L1I&f}sC&(}{{5_OAH4Y(0^p2Oe zzi7=qRGEyScXnp;2ySzRI 0) { -// break; -// } + // // If CTRL is pressed, we only care about the top most component. + // if (altDown && components.size() > 0) { + // break; + // } } messageDispatcher.dispatchMessage(EventType.MOUSE_MOVED, scaledPoint); @@ -454,8 +456,8 @@ public class Presenter implements IPlugInPort { } @Override - public void setSelectedComponents(ComponentSelection selection) { - this.selectedComponents = new ComponentSelection(selection); + public void selectAll() { + this.selectedComponents = new ComponentSelection(currentProject.getComponents()); messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, calculateSelectionDimension()); @@ -502,7 +504,7 @@ public class Presenter implements IPlugInPort { // it into the only selected component. if (!selectedComponents.contains(component)) { selectedComponents.clear(); - selectedComponents.add(component); + selectedComponents.addAll(findAllGroupedComponents(component)); messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, selectedComponents); messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, calculateSelectionDimension()); @@ -587,7 +589,7 @@ public class Presenter implements IPlugInPort { for (IDIYComponent component : currentProject.getComponents()) { Area area = componentAreaMap.get(component); if ((area != null) && (selectionRect != null) && area.intersects(selectionRect)) { - selectedComponents.add(component); + selectedComponents.addAll(findAllGroupedComponents(component)); } } selectionRect = null; @@ -622,6 +624,8 @@ public class Presenter implements IPlugInPort { public void deleteSelectedComponents() { LOG.debug("deleteSelectedComponents()"); Project oldProject = cloner.deepClone(currentProject); + // Remove selected components from any groups. + ungroupComponents(selectedComponents); currentProject.getComponents().removeAll(selectedComponents); messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner .deepClone(currentProject), "Delete"); @@ -673,6 +677,55 @@ public class Presenter implements IPlugInPort { calculateSelectionDimension()); } + @Override + public void groupSelectedComponents() { + LOG.debug("groupSelectedComponents()"); + Project oldProject = cloner.deepClone(currentProject); + // First remove the selected components from other groups. + ungroupComponents(selectedComponents); + // Then group them together + currentProject.getGroups().add(new HashSet>(selectedComponents)); + // Notify the listeners. + if (!oldProject.equals(currentProject)) { + messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner + .deepClone(currentProject), "Group"); + } + } + + @Override + public void ungroupSelectedComponents() { + LOG.debug("ungroupSelectedComponents()"); + Project oldProject = cloner.deepClone(currentProject); + ungroupComponents(selectedComponents); + // Notify the listeners. + if (!oldProject.equals(currentProject)) { + messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, cloner + .deepClone(currentProject), "Group"); + } + } + + private void ungroupComponents(Collection> components) { + Iterator>> groupIterator = currentProject.getGroups().iterator(); + while (groupIterator.hasNext()) { + Set> group = groupIterator.next(); + group.removeAll(components); + if (group.isEmpty()) { + groupIterator.remove(); + } + } + } + + private Set> findAllGroupedComponents(IDIYComponent component) { + Set> components = new HashSet>(); + components.add(component); + for (Set> group : currentProject.getGroups()) { + if (group.contains(component)) { + components.addAll(group); + } + } + return components; + } + /** * @return selection size expressed in either inches or centimeters, based * on the user preference.