From dd9e9f054cca08264fc0346a5ea1bc548bf525a1 Mon Sep 17 00:00:00 2001 From: bancika Date: Sun, 26 Feb 2012 03:54:12 +0000 Subject: [PATCH] Expand selection feature, useful for debugging Limit length of text in the status bar using "and X more" suffix --- .../org/diylc/common/ISelectionProcessor.java | 9 +++ .../src/org/diylc/core/ExpansionMode.java | 8 +++ .../src/org/diylc/presenter/Presenter.java | 65 +++++++++++++++++- .../diylc-swing/lib/diylc-core.jar | Bin 194656 -> 195916 bytes .../src/org/diylc/images/IconLoader.java | 3 +- .../src/org/diylc/images/branch_add.png | Bin 0 -> 867 bytes .../src/org/diylc/swing/ActionFactory.java | 46 ++++++++++++- .../swing/plugins/canvas/CanvasPlugin.java | 44 ++++++++++++ .../swing/plugins/edit/EditMenuPlugin.java | 36 ++++++++++ .../swing/plugins/statusbar/StatusBar.java | 10 ++- .../diylc-swing/update.xml | 20 ++++++ 11 files changed, 234 insertions(+), 7 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/ExpansionMode.java create mode 100644 diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/images/branch_add.png diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ISelectionProcessor.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ISelectionProcessor.java index ae5c834a..2956baf5 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ISelectionProcessor.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/common/ISelectionProcessor.java @@ -3,6 +3,7 @@ package org.diylc.common; import java.awt.Point; import java.util.List; +import org.diylc.core.ExpansionMode; import org.diylc.core.IDIYComponent; public interface ISelectionProcessor { @@ -32,6 +33,14 @@ public interface ISelectionProcessor { */ List> findComponentsAt(Point point); + /** + * Expands the current selection to include surrounding components. + * Options are controlled with expansionMode flag. + * + * @param expansionMode + */ + void expandSelection(ExpansionMode expansionMode); + /** * Selects all components in the project. */ diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/ExpansionMode.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/ExpansionMode.java new file mode 100644 index 00000000..1de715af --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/core/ExpansionMode.java @@ -0,0 +1,8 @@ +package org.diylc.core; + +public enum ExpansionMode { + + ALL, + SAME_TYPE, + IMMEDIATE, +} diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java index 97916d44..6d81f032 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-core/src/org/diylc/presenter/Presenter.java @@ -37,6 +37,7 @@ import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; import org.diylc.common.PropertyWrapper; import org.diylc.components.connectivity.SolderPad; +import org.diylc.core.ExpansionMode; import org.diylc.core.IDIYComponent; import org.diylc.core.IView; import org.diylc.core.Project; @@ -55,7 +56,7 @@ public class Presenter implements IPlugInPort { private static final Logger LOG = Logger.getLogger(Presenter.class); - public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 2, 0); + public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 3, 0); public static final String DEFAULTS_KEY_PREFIX = "default."; public static final List> EMPTY_SELECTION = Collections.emptyList(); @@ -1078,6 +1079,7 @@ public class Presenter implements IPlugInPort { @Override public void refresh() { + LOG.info("refresh()"); messageDispatcher.dispatchMessage(EventType.REPAINT); } @@ -1093,6 +1095,7 @@ public class Presenter implements IPlugInPort { @Override public void renumberSelectedComponents(final boolean xAxisFirst) { + LOG.info("renumberSelectedComponents(" + xAxisFirst + ")"); if (getSelectedComponents().isEmpty()) { return; } @@ -1183,6 +1186,66 @@ public class Presenter implements IPlugInPort { controlPointMap.keySet()); } + @Override + public void expandSelection(ExpansionMode expansionMode) { + List> newSelection = new ArrayList>( + this.selectedComponents); + // Find control points of all selected components and all types + Set selectedNamePrefixes = new HashSet(); + if (expansionMode == ExpansionMode.SAME_TYPE) { + for (IDIYComponent component : getSelectedComponents()) { + selectedNamePrefixes.add(ComponentProcessor.getInstance().extractComponentTypeFrom( + (Class>) component.getClass()).getNamePrefix()); + } + } + // Now try to find components that intersect with at least one component + // in the pool. + for (IDIYComponent component : getCurrentProject().getComponents()) { + // Skip already selected components or ones that cannot be stuck to + // other components. + Area area = drawingManager.getComponentArea(component); + if (newSelection.contains(component) || !component.isControlPointSticky(0) || area == null) + continue; + boolean matches = false; + for (IDIYComponent selectedComponent : this.selectedComponents) { + Area selectedArea = drawingManager.getComponentArea(selectedComponent); + if (selectedArea == null) + continue; + Area intersection = new Area(area); + intersection.intersect(selectedArea); + if (!intersection.isEmpty()) { + matches = true; + break; + } + } + + if (matches) { + switch (expansionMode) { + case ALL: + case IMMEDIATE: + newSelection.add(component); + break; + case SAME_TYPE: + if (selectedNamePrefixes.contains(ComponentProcessor.getInstance() + .extractComponentTypeFrom( + (Class>) component.getClass()) + .getNamePrefix())) { + newSelection.add(component); + } + break; + } + } + } + + int oldSize = this.getSelectedComponents().size(); + updateSelection(newSelection); + // Go deeper if possible. + if (newSelection.size() > oldSize && expansionMode != ExpansionMode.IMMEDIATE) { + expandSelection(expansionMode); + } + messageDispatcher.dispatchMessage(EventType.REPAINT); + } + /** * Removes all the groups that contain at least one of the specified * components. diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/lib/diylc-core.jar b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/lib/diylc-core.jar index 1d0d7b1a4c45be8465b5c02e789a59b8be24915c..76339b12d1a40c2800133a17bc5d6318c3c0a0e4 100644 GIT binary patch delta 27159 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 delta 25886 zcmY(p1yCH%^FGYs4#6!D+}+*XA-F^E;I0?kA;I0<{ctA)cXtTE0|fV%5BK~2tKO^H zny0#Zx}WKu-PxPju?M8Bb0icMc_?T^i2r`l_3A%RXrQF()$4eu08kS3>Io(Q5-7>H zHV8lo^`=g!05H6_D*%@F76p>-z2$@CdT(7I+27j=0AY#}9RMz26cX`Wums8c-XcQL zzqdS4kN>p|T+n|Z-vKq89~hJ%ID!EIG8xpnN*Ij+!W3+g0OeO$;Zr>chqs@-ix=4 z-8VCsXxbUk3A}7cnONd4NWzRS?rReg<-iUxt!B&IvbQz)ZlgY>@B1s-V#P6CfC9)I zv%h7rMB*K%#5tL^+npvx9~kAyUUsYC*nQs~<;Qr^h0vsF{u{pfrDLgYIs#{e`fG~M zlZQ1Z@P~m0p{#5z?jo*1&FF|4eLBZAwUp(WuHDmi1;_Ab(Huid|23*lR(bxSTjS`S z8@F>}t1jU|q2!ZcJT`Yrmk3I>hZz5_$ngIaxxxD*4&XgY6?p4Hs*n&6!O#h!(6}kt zW005)zlim~*`^}>3!Dxw6rkq`Q~P#1lP!j6$`9#XZHbvD^6|LcN=8^ zRItQY=oSogMSmi^tH|Zk(B46}?kU($jUg4-X2}@$y|fMgOz6N8k}r^8z+olv4ibE9 z+WzaEz+*f8?gjZP8`whB-V_Xq9f!droIMu65_xYJ@Yv5B5^5h5B}jiipIsw{N`Fav3s#klN7)j66HUVd$z=67*G%pC<)BRcqz==kZ_f>n8Vhk*4IS0B}-#|3IRG2E+h5VB1ep|4YcZET9Z5%Txqhy{8|P zpaPHv%huHas$dzbCV=L>k|2Fu01+7Z7y^dS-=_#YW@>!W+u*-LrUV=Ua8r5?->5k` z01CjF!*vE6f)SJ(02vD9ze4`MjHCph0PsK@o&ZAdpi{E-3MJo|i~KieycEMDNO+L1 z4?r2rXu=;L_&$F?sBr)>g!egdyyv(d_SPd13LIVJ_-(L3sem8geBx#TzJoiL=K#9E z$hP2rdH+@n&;r}7lmXPhh`9>j3%0AS1(<;mRwLjO7;%FDG=TRpe6K~YIDZ@VF}UVZ zf8T1J-15Jflh6);1NX@40yu%uhdzKT7#R!#D#6i^hXJ!t?}huNz+blh=5OikB1`!( z`!-9E&mqx4*yDhGaQG7e-US%F*Sq--zy-|H{SeR%R`MJJO2M&F<|fWO z-$J;gkY>Ks4(1FH1NQVbFB8Ft;RX-_Hf|zEm*spjW_dSGLA!!P0&U;_??xkk{=bNz zkXL{hIOGTcgU_a#j7 z*XYNMx5qdMR0_H}BteSf4J0&(kQ(v@@ZrDrfMP5AZ@yS>cQgY81WhtEByP&_9V8a8 zi5I~)LE|4g^H550O(K`#>L+*_xs^Z-iA0u&P~ z>*9-o*sgBORX*W(6e<@&jt;kuXfDLe)bhjCKz67iTDbKlx{!Dy;*`N*J-zs(5i~Y!71s^^q+1rzw zJB^63@jEsmAT1z2cMuW#!4Uz9K1hvTj-g=-nLc?}fw+ujP_B_y+dKqw$}n(VTRpPr zfTmZ+6EbL7Gc$IEX~nOUILzop04>i~?IaX5VaL1>`?GcCOff{x_&ff3F-pov9!M6Yy< z&&T5zZ+d?$;h$T(0yhX7|3cL|J}lDS$#M-V3jCvm<@)n?7Fno&%`aIm$IQSlyLbHS zfF9PG31vnVU2m3WMIcD$0?Cu#hThg@mR~%zV}M-bpPL`ro;$lH0*G@!tHM+J>j!xW+mf|kukPDmHGLis zN-k%57DUWw(24C&qNIbiO?0&v2oQ#L0vvq}K5djbvEigX_~h&5lL_=vqxxiyf9bUhrwMF~!Zw zIt*A5w!3x4nb4&pnx;UT#HkVSAH9r6DmXi1;{nDroP88#_)u0)Zm?!fx*irAQ|*^y z3Q77OBBI^P_2$uAV>1$2%YT{%n9P5Sj)B?v?W$TVAW6%@)yzwPrvZ}8*CR0Nov!=N z=dEL=^^$L)x$R?^H2Uwriel|xS#InB6n9A1h*FmEGfb~RFeDKeK=@&dK5*OEm$Hv- zAJ}WR&IfH~`z1WlKnj*{O^oXnjw|FdUk0KQjVCuJ`qL}SsmG5952lY~`^OPdOd4>z z@ZIi8_mVywEL<2w(Tq;GJlcreyrV~cHXW^w+zwI(cE2U3E6t|lk7=2L=l=LQj8OC0 zX$=V_7jQaMjt-Ro_2o%bduwR#+~i0R{euF@D4}4w%eDj&|EirE!g$y&p9;ZXh8sO> z9u$Vd+%-P_-078R@!ETh8HwF*{1{dB8iviMhri%MCR#6LQb_kn&A4_qio#ht#vv1t z3fA&t2qyk0J_q0W$$7J}r|l;!qWoW}q(Lm3USFkml8|C!fc+gTD+)W5)N-E~{J4(> zXQ29)hw4l&l5Tpx6NES8eBo3>c4^_on}|GMitipybErIgYTuF|)xR=g77{vM(Jlb6 z>5Y9P(&%U9)L!j$Lc8GB96G-HH1mPxb5}BxZR~F+A$raJb^_N zMmrCL!no-#42JtwYp0IrDp?S4S}BPDw95O`nLy6Q4+LZi@Hv+;EIqC3L zhDh(3Xaw4JzboC&w9^QOhrBN|NzysAfUJ}9j@da~A232aGe&YAPe&q#tC`uUri6y4 zSW1@0SHG8jS_2FQQ7Dy8+B-u^jVuZHCgC1{iF z?qkpe`om=6}-6R7E!ZfMEQd9%5=e*`u&bC2)IS~xfbWAZZLjp z*SOkiLT@+43*oDHn#4}VUGji<$MWhO&K`P1*hP5YnT!BpjSS!pCyiIUm=YZcRZWm+ zSqfd!eDbhxjT$0g=hG;FF(gw>Z5UXL3h*l|Bt0;BUI6IYjP&V4FUi#F5!~SPr;#pm0X%}8K)XOu9j_?ZkW~9&A-+$slct zL7=IxZse>)0ai(afMqzPTIR4GGq$B{okFJKuvVnYfHQ46e2-wQe56I4Sf9ZcW+$eg zB;<*HZi+RecC0!%MBL+=5LM-$uQJmkjG%Lx{1~NptCW0k&mx|jFs&#hNmp}1K}=D~ zr=a=i@s$f!{su`jFOatQ*C<2Uhx2eOe;};wcG6eGw59xTH?>M!LYgHd>k&{yKjyrv z+ErAHn*Jv)8K=A!`0YYd>hY?IT6*;2d?vcVK~o45RFmvtlWfgG;-no697c%tgD);_ zF^)fdstH^?7pmkxg~+TB~qfPxAuFVA9yU;(EHW|c8&wj?Wiopw41oE~kwi+;^RJ4dC} zi1h^KF+8+ab7cDS*r*>Uuh~Y>Sr~llTzHKO2%*YW>tVoW!DGgB*72uRO zPtTv;w()gV3psf3BY2ICWH~I1O8>#fYp_(2ne`IKSMeHir z{l>KgwqxC2*&(iGcJKCI?4>%8A7=ukQb(Tf{xO2yuuAX)%9VH9dbXirq|U?0$we8Z zc?ShjtDH1bG{>fmIz@qIS5KX;)hg2sE4zr} zhO$&`P#??6Mu;rbgEV+6TRZ*u9FQU}dIdZmp02K&JsQtP(|?dW()_*xdUAX6smFcO zDKV<)`jA-lw6MQACOv4NrJaol6N$#yzv4s8dNdZvbjU5l)T(~TW%(XN!=f~lWOTjJfr6!2>yD~ffg~ik z&+5lS+(3I>=c0TYm-}NIP*#*(Ml<__5DD3))y;5Q(kwClo<{>R#;=z?Rm{IAgia+ALiK7BpG2 zS(Y}QIK!wv?FQSQ7OBl{to2R99{y|OA@0}s87xBN+G#~4koz`}X|xM%sJ=48FQgHg zJw)7X!nZB=6OlOu`mrW+ob94E-}BGfg)(OxMI&=3P8=XJx3B-NU#aQO^?C_F7oHi}G!#-l+vk&NC<7tx*1R7mk&eq3f)0DM#=DIkXONV~Pmf%K za|a7^E+uJaaVBkc%tF;-pWHykxSu|{!%5BiR#+m!$_vC-YugszUjz!M@6jWQ`F+s) z67yw5?O6pnG<Sf`*rUZw4;>d z-qPplF0PAZ8xtLN4YfnbJdwdr`4yL^6DE(EB&wOSoo})I!Mgo^C_ultt6%((#szic zvSmx3*M9W*-kmcj>J6rq{4#^J}nG#nlT*#6l1kvzk-$T(j!@0QPaOmd_aC$ z`DaZRed(VmuoNfXt+Tm43QKC+7r8o@tHM=$q^-Mw#9}mlc@%wbh@v6+*7QMr<}=SH z6EO*m8uE(BnAw?9K7wUALOe6wV36g_@O8M(gh0vc+%U|Ul)J3M1xBn<>%#G2eQ^56 zvS=N?!acLo6kamH=Qublg~ptFU4H%b)33jmhaQRofWF2wZtV&NT$ek!)B-{)zM@W= zNruXCQJGmYOU*RP0)uOPyX{MrvoH!dPm;?OjTr5%fANH!3An9&(n1T$<+yma@tWAi z!uYo|A!x#Mo+QMoF#OAMYoPvy)&Tkz%NVx^IbIZxE}z~Ok;jb+KbY=&>rLnr(x=C! z8^Z^ApvCp=^rnC6+zMJ@7u;6w*pv9xEsH>Y6G_Mr+iu+KCgwRs)2P)6EsxA|Nf`(! z+Bnyt(x1fm*&jVA6dEtV*c)riN3@JvOZP^6*s#_@x9A#9zLTY(%a=KEk^3Yh zjYC^BD9NXnYrazMo1gG!k9lT3cy?Tk1&Ta(ARNt41Qvpuz@QMxJDgrVbZJs#SeUM= z9uKTLrd-HPemQm>@xaiT8Q&b77l`a>bCqgXgeHhTqeo|9_z5gg$j=Ap^i`NzKBiQ*zm3V*XbqD+-K? z#|V4#l0#9K?!4xm;`;M+|AH4v?Pcr@xOLfcMG>f)!&W4v2|aQ*-&QZhve@)LUMLs( zdUb1>wzDl=f0I{@v&9!y>^Y`#sDhkm5IUQhS0a1&nj;D(l}T$9NK05JIZ;*V;ef3j z&0jr*uQUQ)|E!8)tk z7Xs-X=(Tg;g3wYrEJfGOQ&fMC%07waxN6V54k$usDIDekBtt`|f2Ay0;Yr$UeS2I^iWlPl^jpU!d<~O=(X8PXR0pG%)9UCfqV?P# zq@#<@XJi=Ut$uk%gr@wpg0%U>I6R0ctw*#Fgg*78z;C@kp?_M-)*2Q0@L94;S*O9T zoa|J6fgwltjD{C}kyq{?C(fkRm?T`;zfbz{^mgV_==Q|}pJZNLD67Ykfi2E_5pUdb z+-Q!8ii2vu^&N1^wlw#e$n}MlU4HmWvBek3|A2?Ey9D?f`s^qeG8OmF6H-V@+n0uF zdsjyG8k1LT-lDKAudKdTRaSy3_C-^k*%%9MP<}^?g{;feiaS#o;n+7QuA3_C5P4P& zPu9F8WqWL-zg8xIWMv~1s9{MIN)UAau|+a~g!bI5zpr1#o(FoO-MMaM1lh6GIbC*4;-hbdHj5j}u|9jG z`=b~tvkJ=W;yidq{N1N~1PU(>b)E)f1fsGTQhVhjA)SaT1t zHe+PlQMcf`E40Mg)D1K6!HNZMr0g{=I(dR3%#4wdLX>v(j6(<-bVIn*@%hIUi}!z3=C%pkV{ZX7DCypz+%=+56V0!n!Vc`rFp1BVw0{6a>VgRonZA%|0%&VJa85J($P>4w~`C3E+bSZ$V&rFNXbI)YqFf5^4^tunt z+gKMeJvU8|4IOl%ok1&frcp{P)WS>l=F=$tb$yirIYcnzLUO!xJ}ogiM8zj$`00zM zGaZveVQ{vTIJ=OtrGraZeRk8&2hRx9em)Icjd@8+O&qn987a7K)s}t;Sm9~i743-p z?=a%$KxsEuXS&&VlT)R%?ujgf>29hqBY3yJjr{AUyDwS8HKo~3Y-`82R8GPXw})u2 zojoz*&WxY;n3ny{j1!U3sN2t|vEjK&Gf zJ4k-rX2qr=7g@z))%4U9x2bBOdBw)|bfX*w`k(Or#_dLjPW;r%!`YD6sGkS#?b?~n z8OrmLVwxmod5%3IG=L_ZdE}U+Vl_#RGc| zQK}x9d^<8qE*VJV`H+)aBHH$~Xk^uO&zZo9fBu1m^^`pQpQ=G?;L-)FL93dUPg?c~9TrQ05#_fuxIehoeMlv!u>S}8rZ zYX9W%$oSkUuIpZu#44jipVEVKMK$u_2$Oe5OxId9y@%CE7IBMQ*)5Hc+TWR^_Cx=; z;x&0&_Z;c_dgpFwe9bPglp62E8d@~;8sb9W=pyGHp(`-l;@VNDqvoV|R4)CHxJ_Uu zfOJpQdquv0vTQ?0arsOYm1dJ-K`il$z0NYxaDS1%05EM=BOFe$ZbR|iDx1S9rIKe$#gLAMAbk4DG?UyDcNfn4`) z=T>(IMufi`cPa+I{9rnp+EaGDXE%5e^LtHN*mbzN@-Vm$tA0wrYtmJJ*$YTX^f>&- zG8Twk?MGi(bS@p03$(F1w)s=;odZhdHSALhSFi?UhOxn!-5wQWGv{& zH*F&2_(?y%IEIP7^!1Ws(agmC_4 z97ZSb>YV;=DEw8+=4qE>PJ^I(rN8e9lVkKF!E519;Xw#IJi8wYe)oA)cqlbr`K#kk;PmKz_ zlqQ3o+`?zIS52Vb63JoJncRTb55r2`DWaGG%oiEcDq#V;XxlPmrNDH8*#wv$c;0>Atd9RGA>h(@Y zR9RT_pQJ3p_7$#1ww~+$kZV?&6a47G+L?0gs~KbEz~0|uU1Q8hW!3ZMw>N+t+aE!( zsIL&3IthmLG(Hbz@f({YF>~Df(mFKOi?Dq`opv9H8r+{yS2QC=@=as~@T87{0PR}& z?bHOa1Nqw;(<&4Jz%Ojt8M3#Y$Zm6Ih*X)EU!y1jq3L8jop@FnD9x^}nzgO{EgY!p zGyi6@bPd5T@|-;SISRVt;DVfE+hWRMD%XveB+T z&YMVw9z`dK5(EBFF=gE;VB@weUm&|oF93X|fiZ3EGr`D2Z_d)>ZTqas&iIWz`ez+w zP2p`|b#S*O5~30asLoS*Ve2U99TZVq^`eq0$0bqleA-*p%c4}*ee@$yR(*g-i* z68-%_%9~2V-f<4pjqd!L#rnue&V2p=kxiKB8t$YVTgMkyO6VKVwj+3YFA)5z_X zYV%NZich5X(2;{N43e3o87WuXB|vJU5v{ryHNruq(iCocESr=`yi`6?n%fB8k~1S5 zA*!7Ua-zcHon|UIR5#Q+Xnzuzq?+*Lr#MFIi z!$ARis|SoHlU<3wz+<^-jTrmwy^<)0hO>%YRKp+L9sJXVmz|3^Nz#iDELxUX&Apg3 zbqq!>wyF97F-|8fcmlHOAyJ0TYM`$g(>E?({I26oMz4TE4d)nx*{iSpZ!n1VYcn+W zBV2#s30z>^fcvaqPKLNTpPZ&W24B`sUIcz1`?bm6YV@xWv7g+h#pxO5P761*T^&E+ zT5t6JD&0h^D{z0kF|HJ(qny%MrfQ>?%%L+@F6D2-I%Siap~_!TjV=z!L}bKSi?)|0 z8EFw;XnPDSyrj0w;JXOn5EH0yZ%!el$5d5U$q&~5oi6tS>r+@@sMmfCQf~^OrGHX_CzKP184KFq^qLr8EN&x7Cc307zT)hLO~^Mz@yleXWJ*fr?}oUv*QHSHmdwlZ#z*B41Qi) zg;o5_V2q$@LjtI_KGnmn*nVoY(;RZ;I3wn)rJKrBw)Nh46#>D9lY#G{LRkhD)+zYA z!vMat24#qQ?Qu+M+@HucQf_9MCb3O!g&tf+g?tPR15`UyF*(sNu87lGw~ar=@TYi45(eP9Qgj&8fsT> zwW-!_dK^Xy;fc39l#>6G3=!=%H{OYqJ7!RVGQ%C$(*E)|UPX>ou3as2Ei(bb1V-c4 z1WT>6QU{`jUvUxpUCa|z5HMR1=y0BKkBgoT`%2b5xW#{81xvEij_gm^y}spf&d-X@ zahI~>f$WdlO*m-Qm^!m{d%ijw8n2qyd$xCre?oXdYVCX?^Ie90ssAgew|nf2J5jf2 z!Z^o*f69*Ij^#1-XSeBj&A%G_C%_HtQEJ^cYZ?u?re2cYM%;JYcjB->VCosyl3^FM zAYMPItse&iFj%nWLOP^VT1%{6|;_^?_S_gtB>l+QE0n?YNlv`-HLe48LX}ErX5k>m>Fskp5Ew0T!=ym(} zFAU{%m5BcBBLYS)MzxkvK;~)OtB``uuJP$qW^@H(ZQ`6TC2?B@oEYmTJ=j;SS5!zY z>2q4`akPK?$S($D&T7TXjjk+MsNXSLTvd(og*#FS?wjv-h2{c(80Rj4tXV{NhiVg< zF06o4xRFC}K~9^^D*2PRavV%6Sb7S=@g3B&-#!ho++9BT9I&Z=1de>2o0Wlm74jkW zOLcpBI~M!LJP4m2ZVYjB^qE$bLe4KdqE6fFoP_1~P^7(RGYK&0Lu4LQ7x8xP(EfdT zt)q|Y6fOw|Nps$pdkobaV1h74xK!z;=Tv$3z?SfD=3Me*>}==a_vVlk7Kk?^uF%-3n{q}zJ|$&{l7$ZnF*dKU)boD9Ie#H zNLCFU&T}qu$W_!&aA{qGUIV-HFSJlzY3?+6PK{N?*z`Cq8o ziVwNww;V1u3FYe8dbfaEHF!^UFVaEX;wi$a8N!#{cqcf`vp^LkDpFbntyhBAir&|s zulDD_b0EQ!5ry{|!IPl-udTC7C}gFCT)js8XPr!U9s+(Jdj`DJc29gJifUXY_&tCc zQ3Uq`$BRP{$xfJ4qvZ9RV;wYB-x=;xc(3rMH2<_`WYHaD7ey4~XBE2G_@}PWrhC?x z;@-H+58^OM*1&SpQlkBlm)JIC4ULrIHWUqYH}P?G!B95UwBQGQ_#EX@{k-_u1;#cV z27`i0mCJj@bem7J^N{-Vuf}96k$|Q=oN`G#I5j$cEPM&R4B0zXbG#8`^Wr?53QWAQ z$r+Rzbexxl`M$(yLVO#9Blf1mX8`tW`mbaeS3L>MK45^~bFYLE$2X44{du+-B@mts zZ&myX7W|e16^7ZF1|o_Z2J5NE(HFH=5J9DGF&qTQjy8k&tN7s_5gqBg!Vt`GLwjer0All#ovTKzW~Im z_CYK(GA@!R*H|yH#b-v%L5Eoorn zNLLncE<#a%dq(`gf-K3%VH{rhyDEoG(?kZ`iWRXgbp27uIjNG;P*D2%Qz^Ny&Eqx$ zAM=dn5Z$$C&ILi1=|i7ct$@v+;6K$>Ka8gRlqd5G^*hk+s=ib-sMB(M&S--y$igy| zx#J?YfGiyiL1ep~kSU#1UsWw_t0muQRQRbdk`_%mf|&AijPrwJ=t^Gh@WE#RSf8vX z;L>5MIK-v(O&N4flGVp~jqvJuiwVjiDwJzqwV#xSX^^g8o(?)HDpWD}3x1#6jUR5U zOcS-u*((|ZmEu@gpjjX3iW`&|8kZiIeF^doSTZR4mG&)_QP2xA+4bWW3HgWgLEwUlsgIvlqJUCm>=CtjMQH)wtnr{E%H}s= zk;rSEM*5>cxTXS4FY@JJ)AS zn^&;>0U^S}NBU?{>hG42cY{vab#_iG*JUhBtWU3hOKoeF<-;3>8 z=W17!9SwdNucQWAmVV$&hh1~xhA%a0j7~9^ESaeF)Zj?Q(>mDKgJeXuBE-4JRE_>Q z;u1-|<9+f)Jv|Rcnw&~MH7njpq8zyHS9ieGjea3pkXh6FfNMcLCMonPyct?@m7(;= zft5C;6yRc}hBY${7_o>F`h8PGxY)d@9RBOa=%lFL#JCbC)-uufQj{CTYimxW{X`An z)IlmD1AR(z>sEfvj&?1s88wH3D|U&%1YVAg9TlijDqf3}5Cd}-BM|5Ffh$lkM|cCj zgD66sd?&eU-IiH<*q9=NMG@~YDZ~0NFE?t4@W=KAVNN1=fM+rH8fV%Gy1$5iS?ziGP-vqpcDolBA7qUGEnbP5BJ`N9WeAJ zj;PL@Ljwq=uUt>?KmQ?XvYrD5K`pO+JUxMoknx}qH9b7fO_3_t&J`9@S=!R4Yam)p zy4@0Ih+!2&Qow&ELL%tVsL-mmvirNS)KyY(L! zq8y)BeVdzxx}GKXzv@nFzvH7AgLTFAD#DCOyCZ!ia@^%Zr|qTbiRnK;6`l@M!CO~m zbv!z8XhjPt)aRj3F!sphF7Qr1s7chfkj@{g^QNkp+s3nv_Lh9YEh3iwNp=eoM~6IZ zPlW|lu%QJq5HyhtX&xTHeIDTsGZj5TDEKvCytZNIu3kyl8`h=|r&u33mPpde@F7VO z4=H3PR{Rsk;~y*Np<{<$V5>x(*nGrAZdJMBUk8k=;^{ArBc(^o`!DTF{F7e_+^)W=cC8B`th;QMeoM*vVQB;<+Q^UJ*PXulGT7h-U zY<&*2)62_nM$WDIF*=XM1&kuGhplG4F9(`z9syg$y@q^wm_TII@G4o3&kgO(A-~uj z;VjHj8YEL1%0`zp{aeMqc;VCFHm8+5vk8s;g0=8Yx(cV0hS3kQVnC0)>$gI5gqEvy zGchLhOoY0978O42A2@DTxs!@oOn=@cPB@iJ1Yt%upt5K2F-gx3p(hKw{o-}=md!*X zk~Yh_+lisxL_4M4vS^$M2Ujk*h;(elwO)1}!7g#}ilglwuhDWL0|j!5@>NpDEdRa|`k`(93JP!(UU@uh}GdS(cRejh#4ZY{3BUUXn&+-NLr zQnWi&lwSp^l6%x}`5eiS{_Lb|>7=JovI50~AmMt^ei=QKP_X%FU>XH&iBRw@ZD$^^2IelOre;b`^D-V56nB62wsQ05|v_K&h zMhT|zPGgP$ab$LW0ta6Vez9W}2Uc&b0G7<6!Y(mzS0}?ik=s0QkX12FuL(&Vj_so} z|AQ0p{^nOtvBDp_+G1%73Oq}kRXsYW9aI=?U#Aof8slorhPc8HZ$3xq;cPZA;>bZ) z?WXr#Nx;GFB!-7W2d0d2NTXiQNGbJlnfiGpV~sXpd}tM*FB>`?(kXaWjk%|Q`d(hg z0X4n~WLD?>>=F3v@r8CkdE`r-jDa>#t}e0u*+~vnX_Qa;Kp$z&w!nXENp2jPyZYmf za$YxM8gKDYUL+Fbeu_!BNL|Rxta7-+2jGJ!30Gxw#1edy*k20KX0q{Z*u4<7iyA7; zPX5R>b~DTp!|Wt_n&Bg5YI2%_RNjIRG3T`3z=7u3`dDJlA`QxgQSva;py=H6a&qOP zKLb#RjFL~T_9NN0Is%ql_S-;aRof~v!a&iF{%UU3cmZ-RgA<6YUp3iU+#B(jZ*wf# zR2LBdBS>mw-&;`Fmx@@R@S^%8QpGG6A$sJ)tOooD+ljjEhAcxAhi=gt;MbFQ>ckPh|jM>7y?n~D~5#7qXD+WQ`wzCha2R&)eFZfS>$p)6)Kvdvj1L44B z%n6m#t3bQXT6a$u&0kP$mM3!_X7r99Zu_`BkpJbcu}9=Sb6xwuvwgyZ&v*ZClG?Y1 z?j(lY(GJ`Jh=?1)I-O|RoSR5;oU2HgKqecvaYIK9Vc5Udk0Pr`d_sS!v~B||nSYl= zqWCiO4E1%Y1jh~D@t80tZkf>vC7*^k`)0OuJ*fWLgiE;T`{H|@UZZ}~_u03qCvx_t zPquw92Zh~Tn2>9jA8swMWA?V^3M1zMdQ5xLHlBqYp`q=j|Abn3b59``t;bgYzd*?bM7zdw1LUuAjll_@a$-_=-q_;CkjprKa+`g z&3x(;aU&a#yug9vj%KtG!5*f+E|4PUicMQV87-sX4%X)vQ5~|SDEX1h!EcJp%kMh7 zCe5pr)6nUumW)nSvd(r)ZWayEE92{}NOS8~Y}^R)>gszv7TdeTH{r|cA9->K&sOXH z%F0^#qms>YKIVq-%zL9R;ySZ{Aqt95)B5ERL)=#8ig0 zoeb9Te51ja6h|qgEc=lOIqAVlQE87${tdm*Unp5;C6lTq;g-0^CrJh)Fsb3f6X*?a zUNpBKG*7}V8ABINnxu3MI^lqA@l%SQR-kOha5S$eDw9YSoSuxk4L+sFINJ%%*VjI# z#;hy;8A}h3N8u@@wK;91k(mjZ=lu0E>KujoAql$4iO$> z$^`Xu-yoGbr^*Az%^iiWU!WlEkXhqz0)OA+HiXo8%ZbHAKi$_d&K5&p@5E8t+*XDy znh0~icHmI1gP*JwiT+CI0wTi{S%y`rtTH639>Kcd{IQalXO1@ zvjjd;W|KB2dhj&g$W^?6@Knr_{&Oa$4h?6iPYzPN)Gs*<)Vw^!)%3K{{;JwQR3O+^?1fivKc1`+! z3k|V(g4_#E9C+5=9ogSP&A;5`NE+IrE4(=Bblmg5lNgRwvy$(lmOUdQ=Ce`ckg!o? z@h!*PcOUm}amTG(Ma%h_GMU@l!-N2pBM7lbtG#+mbC(%dRqf!4($9gJ9K-a;ZgK*P zdfWj|YE2$0ZJ%2Mq>b5uT4XK7#Pi(3YqUKHBkwHS{WUn4;1{TKFVS`7!r0FH zPh&~SMm#j%q|7ZuF}lJZeoQB#=(t9u{`*Zp(B6z%!+&9!3zY1hugHfbz$g##77_g7 z9w@T9SEMP2VQ=fIS2-Jwk*|MyM776$FkC1wS>bhw+H;D`VE-~xaT>z2ItsvL-WN^1u zj$w(tk9g8RA81-VEx+{F{DvL#hwX`Bc)D5?WP?&9da%zkPA3^y^2#3;l@(t@0BU)_`xv zBn2z}!c5hG_acXrOG-s^%zflR%e28?=XI3qBMM(P?R#L5bsQSqe!6lDfl%UTng6LZ zjs4th50oJz0vgr!@g?zhvG%ZoJh&%~)X7b$T3<8x$PWAEyS!%+sV543hlVd6W`<3; zizKHv*{*~ZCPTZ|=sfVa^M+_EJtnEEsbQFn#^>SRL@|gJ`wS5v9f;}bpT9FK4<*zB z;W^UrI!S=v&!jl#U;nUVXpawcI%4su!e)zO%3x&}5sQa>qezJKUsDSkIH4X$b%s@z zyF8iy+S9@H#)bM>apTP`eT)(KuM z@spqSe_d{-Iw3r6p?MMOk&I(>(LCwsk_fBxw8AShWL5=qLVQ674h;Lmhv6G&LP<1eBMS*`{n zj0KZ09y>ES_{4tKM0nxF*a6!e5TygR+9UKOqaO8~IHZB|X4I?}(v557JRT^{P5{!8 zG}j#ldi$O)d<ekwvhg;aHzKmI!dYs$lT27yUN6659Z zv>0tA@!7$Dy&@PSF${&^G0P9PEq53Zgh`0KfDvCkIp_L)eRkM?`K6(iI~qBX2}`aj zGzcOR(3Pf(_ffxKKQ?7X&xHRqB#nHuEvA$*BXx@?651LeQX3@XnEPmv!~s)3kSAO| z_V&5_Rs4Artey6fC5FVw{0R#}4TsepK|YOmi*~jhi%}8KC%|SM_AEVQFFl6!V<(`7 z2`JV*$?@j`R=G7S_g)_MwnyEtbIk?9P(7D52SR}a8vTsSP4{%(F3Jbj{rAlu z>g`3JE$+oNZ~n@xmZM;)ARnTv|LnL7Dx@D^A&Oz2YA=?{7Iep~le;9RY+D zdm$OK>eW}CV>spfogy=+Vvr!dR%CWhEH(wadTxk{-(1 zasIVyndoEfmOzP!FJl2R5uaG!y6%2B=F2`NUgh#)HN326KsS7(rMCUPcL^tz+Ovi} z{iuCqZhbU_y#c-}Dd(t~sT4c7nKB5craU5ldxcms+wg+p?o{*MoSLVzPl(>0)YvQN z>tG{eb*r)(S#D`mr=#C5;NtyBy@R%GNyfO!Sz2AsHaUx@tf1;MmFjn<72@@JE7RB( zKiZ!I7Ejt@SJOt5Z-)^cT#$Wjbkr`jB0Tzj`rRAfuUgM*ow8Z29&|^>Ul{u<5f1i; z^i9_$MzL9&NqlCLm*i;+FYr)XlpapY8n!UlJp*1;%dYY}S7|mC(Yt-i9t*psf9Q^a zuGuXY0ma8tnk{=g#zKb`i|G0zUU{v(lKlS~fv+c{4oU`dt7Qas&D;M}@>yupy zH#aRCPY8jk*JZg!v+W1f%BW?U?q%O!kb?w%X&A@Z6D10S_AxrLf1Q*-4 zssUvkc50rZkb$5TD{zHQvUOX7^_zv8mF}_{bnRQecctx*Xc2xT8KFasfOP93!i=(i zi1*uJx{O4=rL#*bF9dUywiZn2|CB$T-uPWf?B`~)gHBR1TxMnxGV{{L7D4Kn!GwH5 zf_toOAtLv{TZ zClfrb+^Dy|sd{(o?vpQG>C3i0(2>?uJRdhQx?`9(vG1Bra^ShXjqSPbyr&(dpVku^ zzO5LzO~#M0mj*0e_nnqD2;*w7<<`#H_%%pk?CPWhqv4q0(q-n3Fd?S!GdE@(75l4i z)bcoGYK7eg#Qbe>vF;~o{8rwX%N@gCgm#4PGY>NzgEd5`%I z!{I{;suj)#YTEOov$b(lA`1)3MaEi^gxt{&e)D&{8MKl&M5gNMyrrvc{n}eYrmiF*Rr6*!-r!-)iMaTn{@OD=#y!S5mOt{(ZDg3p zd+0ZN!Om{hB>BnfE=!w9+5=kx1$&B2vbqSaDF+3v@`}mJ1DQnTlm%K>OMNYVx!;L` zszm>9l2Q)A#N)Oyhe8{=EQsY`P9xN8x7oq3Po_S|$4~@TL(PW#^ZS z?65UKMUI9Ij?rPB@c~&|8<_L2)200M3mjT;YMHIo<@<5kC;vm>dj3Nr_?-#k#D7hd@Y;@c;-m6mgOQ|kPAn9&XjDX>g zq(-t@m;e4KD~T?DS?UT`tyoU|qkChYa%XA=4y&Hz&5@KGkBOaB@spA8l9guUc_^1% zEoE~(@ZDU4=&nO%OghJnS2L|*lu9n2uzRs{^D@Dg=1?Az?sj&ck)jPl*LAZ^T7{|% zkzHN|Ira%bXp?U+3Zox@%r`?7Um>~NEDQPox}SuoP- z@%&e43T5Own$~c8pAYtKQTE5qR2EyAhq!62h1%=uq-TzN^_riJVILfl2o6nLV;8!& zOc-<~+-TA-QAo9#pxWU2?d}~3L#suB!~`PIz5I@Yv=NxH>gszl2WX z@(2Aq(=o&V{|B0N=G&X@B{)xO8a&-tkv24)dod!Zp!~w5&inl2BwH|X-pqH|!SP_- zj@Pryx5}aq6zaUp7~A&jN#C`hXyKb*HsAF{ZYUEt?Wt>09dmauH5&~wj9z!v zu$j#b@EfE*r~F#Ey;<;spLc1Mx!usk3pN|7&H?f8%#@3xO?Hb3_BL#?u2QMjJVo79 zrnp86sTKDg=5?7fkW_Ryd4MHD@;Zae(bE@X=X_}C!aa@{r4j~S-|f=$0cTTPgPB?@ z_BqoJ!_SVh49w)_XuRSQdntYC#%C+XywaSd!j4&?@KSouDOsNzwlc4ez~3MX$Om63 zJ(XD1MwG>Jc&GQ$ImPe!MWbSmXL+U)P_G$&QXMDAzV^@sMJt9Ie;<9e3CRCzahhr4Zz!a!AXwc9!R z%X^g$4PJ;S&U>6N)l*}$^|Yfx^;OJvGCLi6BLUtpkUT&kB;Zb71 zyHe^<1;n9~LRzQNHxi0Xl1k0aQ;Aq$7&u&wsH3$5!R=~fCtB(UbXUWo zf3U0;pnHp`p{yXP2H^(|ZxK=Kr=YipF4lST7SY5ylr_k1tYcDx=wlsdp^bG~Y9K4h z!CH%GVV!-ohz-_xSc~k#I?J_)G1l2#hnQlWxH@Dn))}coOt6k}J#ql+gw-P!Sf}?- zN4bGy9@v1G{ili`=xRVrgrR@k$&oCn0a)V58Gf=x04Iq|>UZLok2#(G+B7zvo(gaZ(aU9icBB4$wY9fiFQB8=j2}tQ=|Q8?m?}|0h7)8hAq<%M`}YFE!>~%#b81-qh)kVD5m&cWGSZ+N1_rnh|M`(}u8N z{@Hb_V=Le|Ny5TXTggnNwTWkSl!%eqG+^zI`+Af^Lk9|Wf`EF20rOtWqVhCg69oky zEaId}MzIB0v?9AOKU@j3{ie(m6sJW0tMtnR(g}mMRzwt|>;CoKGyz6KLqkEKPDU3G zSlbXIESbY?Fpw}u)RNfe$cF`k30^?~WdZ1IL)0*~kW*X+Q!u|E$S6+6)&P{>A*xt# zU3w+*Z=jOQUrI~Ih>9)}^85EvA{-mg8l2cCy>xfIzTrv(2b>xXxELAh@8dwc9Z|+; zQ(UAUUVzdt*d)lb3{DZlPfLM>cG9$FwZn8MU5Q3+GGOKpxQc?Eu7JM-k;eF*vTTpw zgI;rBm{!YATD7fAUO$7o#Mkii96!fCN_KQHM1`#ACT;c^v?@6iXyoZvnftUpN zzemI{-$^JMbQwj3K=*q@21{tMBjeROn9LZQYVw34{{f<1q*LTb7qra|K>?SSV$^B=_9>M`}ft!ciet*~>bxz>aLkf+x8xrZ?z$D;aH$wL>6IgvT@dPrRgiNpw z+4@&{(B#c^eGx2`N|a?h8b_D95pFD%>w0U_E|B0IToF?1=IFK$iNjTmKOp>=YGaYJ zd^}uj!BAb6OjRMCg!!s~HV9+FI!brDhm?A%tB>gsNH7llkq2Cq@~=8kD2?vl z{Ll74HitA!Onmu(4&?tCnF>@gpNSiO??L#mKo2aLYn*@qo`y|~EYQ+yT-D?w!iA|m z@nP3I3TLuuksRD#MIPh7tL}GZFx?3leLsv|hK!l&@gH>>qFVtSSp7(vJjPxa zVnG2h=nXsA(TfOR*Dre%B$h*v14Q;B93p6m$bZXhQc&=ak!!sMmA!~0cEy`SP4`u! zrbOm8Y9P{w@M4_WeNb?vc3t58M{pArWH(^WD*E6B1HFO{pebOnUOr*56hSpNE?J% zpb?Y~!U(2+ zZm2Hb3%EX>!bYxod@rtAVMfUS&VC~8uFIdGLwj>v^!O7z&d>pEM$rrl483hlNxtXM zWj?)Nbbby-GX)#@o$ay}I=1X!_h*C~8(^o;kW1najz)ckgM<<|X-BZfuuxD$!bUzh z2KMW!RN&)hgcXZu24!LLz(r^=S|Bq)TISjlP&9aUT|^JgPas^FRTL^}^j;T z^wn}#U|N@9BX{AGw6016`oEAe`QQ4qBdj1iv+L}+v0bHlyeIcr! zDB~5gu&D>ZYMrieg;!a~j@3phLf2*Y__Lxu>`)EcGjd zIb?Tdi>ile)v$??IkYduRl!$85L0b+zv71#!iBkrlBu33!&NKF|DU5%zD!Di1DY_y zMn3306`)`So(J3EKUg;AGcX&;DjfZ%nsVb`iz+-p=~6NzLZ4K~56{lGs2P4zeMEV3 z>Tw=eff(QBaVz3Dx#dgMPH!-HeTzslmE&&cM4ZkTOgf<*agFJ7DovSa7&=+y5xORwt&W_u#w08 zZ2?y`{|@7BU4U`J2?7J?W#`flTm-8xb7QE?B1ET_anyE^v^4`z)ciM&W-XF7p<&+u z_YvsL?yr!E6kuQx{-p-g55qTTD^G<2JYd&1(xq{|ZZo`PCO`aM(BP^O-$*ws`}Q44 z?}qz=0Zs_{LSLi>mEYh>Lf_I%K{xR4N+7_38{q;X-{Ap=!aKf0@6GgpM789fSq5!=iISWqIZZ5Vb&5 zz~i5AiJ(E3qj2he43+^pR>(#`zf6+xEyIC5ei#fc!xGms4)9uyz68R|JW-L5BPtRB zdCR0R|F<~Ie~)Z&XH<0y_JV_~1_{|=2$vMfm$pQDWLyE|!&&fjIHLRCF*`s+`FOzH z71HB+(^b diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/images/IconLoader.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/images/IconLoader.java index 75f1cede..f2034622 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/images/IconLoader.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/images/IconLoader.java @@ -31,7 +31,8 @@ public enum IconLoader { "donate.png"), Bug("bug.png"), IconLarge("icon_large.png"), IconMedium( "icon_medium.png"), IconSmall("icon_small.png"), DocumentEdit("document_edit.png"), EditComponent( "edit_component.png"), Size("size.png"), Front("front.png"), Back("back.png"), Pens( - "pens.png"), Sort("sort.png"), ElementsSelection("elements_selection.png"); + "pens.png"), Sort("sort.png"), ElementsSelection("elements_selection.png"), BranchAdd( + "branch_add.png"); protected String name; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/images/branch_add.png b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/images/branch_add.png new file mode 100644 index 0000000000000000000000000000000000000000..cd047e540b5bcf6b08e2737f7e77078c8885a327 GIT binary patch literal 867 zcmV-p1DyPcP)WdKueATl!`MrC3kGB7YRATcpIGdMaiH6SZ6F)%QqnH)+0000McNliru z)&&<0F(wfeq}Tue010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00O&7 zL_t(|+ND!nNK;`Le$Mf1I)7%3Er+35h!@(AhO+WPx-gO?h*8l+NLM3@5DGIfp`f6k zjOA5}E|j_uOfe`5r5hm&iO6g#M7OEiQ0LCvuV>rY>HW3^Ue!ehp6@;9yx;ph&-Xsx z2mI&5{d0zCtO)VsF33?Hd=QB7fD(&hvBytYS@>7IM#BxCY%Obdtws=t>LIICSf85@ z$AQC?_6RVImm(C{fpm)0M1VYE;6xEWZb$6jr0ZvUhg%OFX@Yl7L?W(&tkXmJ$qhJfutgIBtne^ahE$4%1ijyZxzm3EkB*Ky zCfAJB4Gq=J!DtFwk_?&WvEo>gVosQ7=7PWqt(QA8#gZhUx1$X*b^N|<0`&)K3d%nO zo0^Z+;_de!0#Y8*dIMzp3Ohe12*Uzn?Cc-PDCoV|hI>!nkwj!*|M_u#-RsvZE5$}H zbt9}Pgrwb>?EqlR*oYof(aRb1;bCSATlCeB*EFtPg(U#J#W&vfym3xA2IG3W;g%<002ovPDHLkV1f(BdB*?% literal 0 HcmV?d00001 diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/ActionFactory.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/ActionFactory.java index 3343ff89..638c3118 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -16,6 +16,7 @@ import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.IPlugInPort; import org.diylc.common.ITask; import org.diylc.common.PropertyWrapper; +import org.diylc.core.ExpansionMode; import org.diylc.core.IDIYComponent; import org.diylc.core.IView; import org.diylc.core.Theme; @@ -128,6 +129,11 @@ public class ActionFactory { return new DeleteSelectionAction(plugInPort); } + public ExpandSelectionAction createExpandSelectionAction(IPlugInPort plugInPort, + ExpansionMode expansionMode) { + return new ExpandSelectionAction(plugInPort, expansionMode); + } + public SendToBackAction createSendToBackAction(IPlugInPort plugInPort) { return new SendToBackAction(plugInPort); } @@ -142,11 +148,11 @@ public class ActionFactory { boolean defaultValue) { return new ConfigAction(plugInPort, title, configKey, defaultValue); } - + public ThemeAction createThemeAction(IPlugInPort plugInPort, Theme theme) { return new ThemeAction(plugInPort, theme); } - + public RenumberAction createRenumberAction(IPlugInPort plugInPort, boolean xAxisFirst) { return new RenumberAction(plugInPort, xAxisFirst); } @@ -756,6 +762,40 @@ public class ActionFactory { } } + public static class ExpandSelectionAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private ExpansionMode expansionMode; + + public ExpandSelectionAction(IPlugInPort plugInPort, ExpansionMode expansionMode) { + super(); + this.plugInPort = plugInPort; + this.expansionMode = expansionMode; + switch (expansionMode) { + case ALL: + putValue(AbstractAction.NAME, "All Connected"); + break; + case IMMEDIATE: + putValue(AbstractAction.NAME, "Immediate Only"); + break; + case SAME_TYPE: + putValue(AbstractAction.NAME, "Same Type Only"); + break; + + default: + break; + } + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Expand Selection triggered: " + expansionMode); + plugInPort.expandSelection(expansionMode); + } + } + public static class SendToBackAction extends AbstractAction { private static final long serialVersionUID = 1L; @@ -846,7 +886,7 @@ public class ActionFactory { plugInPort.setSelectedTheme(theme); } } - + public static class RenumberAction extends AbstractAction { private static final long serialVersionUID = 1L; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java index d75bb0db..d2ad0de6 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java @@ -29,6 +29,7 @@ import org.diylc.common.BadPositionException; import org.diylc.common.EventType; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; +import org.diylc.core.ExpansionMode; import org.diylc.core.IDIYComponent; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; @@ -49,6 +50,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { private CanvasPanel canvasPanel; private JPopupMenu popupMenu; private JMenu selectionMenu; + private JMenu expandMenu; private ActionFactory.CutAction cutAction; private ActionFactory.CopyAction copyAction; @@ -59,6 +61,9 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { private ActionFactory.UngroupAction ungroupAction; private ActionFactory.SendToBackAction sendToBackAction; private ActionFactory.BringToFrontAction bringToFrontAction; + private ActionFactory.ExpandSelectionAction expandSelectionAllAction; + private ActionFactory.ExpandSelectionAction expandSelectionImmediateAction; + private ActionFactory.ExpandSelectionAction expandSelectionSameTypeAction; private IPlugInPort plugInPort; private ISwingUI swingUI; @@ -104,6 +109,9 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { } getEditSelectionAction().setEnabled(enabled); getDeleteSelectionAction().setEnabled(enabled); + getExpandSelectionAllAction().setEnabled(enabled); + getExpandSelectionImmediateAction().setEnabled(enabled); + getExpandSelectionSameTypeAction().setEnabled(enabled); getGroupAction().setEnabled(enabled); getUngroupAction().setEnabled(enabled); getSendToBackAction().setEnabled(enabled); @@ -193,6 +201,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { popupMenu.add(getUngroupAction()); popupMenu.add(getSendToBackAction()); popupMenu.add(getBringToFrontAction()); + popupMenu.add(getExpandMenu()); popupMenu.addSeparator(); popupMenu.add(ActionFactory.getInstance().createEditProjectAction(plugInPort)); } @@ -207,6 +216,17 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { return selectionMenu; } + public JMenu getExpandMenu() { + if (expandMenu == null) { + expandMenu = new JMenu("Expand Selection"); + expandMenu.setIcon(IconLoader.BranchAdd.getIcon()); + expandMenu.add(getExpandSelectionAllAction()); + expandMenu.add(getExpandSelectionImmediateAction()); + expandMenu.add(getExpandSelectionSameTypeAction()); + } + return expandMenu; + } + private void updateSelectionMenu(int x, int y) { getSelectionMenu().removeAll(); for (IDIYComponent component : plugInPort.findComponentsAt(new Point(x, y))) { @@ -290,6 +310,30 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { return bringToFrontAction; } + public ActionFactory.ExpandSelectionAction getExpandSelectionAllAction() { + if (expandSelectionAllAction == null) { + expandSelectionAllAction = ActionFactory.getInstance().createExpandSelectionAction( + plugInPort, ExpansionMode.ALL); + } + return expandSelectionAllAction; + } + + public ActionFactory.ExpandSelectionAction getExpandSelectionImmediateAction() { + if (expandSelectionImmediateAction == null) { + expandSelectionImmediateAction = ActionFactory.getInstance() + .createExpandSelectionAction(plugInPort, ExpansionMode.IMMEDIATE); + } + return expandSelectionImmediateAction; + } + + public ActionFactory.ExpandSelectionAction getExpandSelectionSameTypeAction() { + if (expandSelectionSameTypeAction == null) { + expandSelectionSameTypeAction = ActionFactory.getInstance() + .createExpandSelectionAction(plugInPort, ExpansionMode.SAME_TYPE); + } + return expandSelectionSameTypeAction; + } + @Override public EnumSet getSubscribedEventTypes() { return EnumSet.of(EventType.PROJECT_LOADED, EventType.ZOOM_CHANGED, EventType.REPAINT); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java index 6d981954..3f06e6ca 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java @@ -13,6 +13,7 @@ import org.diylc.appframework.undo.UndoHandler; import org.diylc.common.EventType; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; +import org.diylc.core.ExpansionMode; import org.diylc.core.Project; import org.diylc.images.IconLoader; import org.diylc.swing.ActionFactory; @@ -22,6 +23,7 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { private static final String EDIT_TITLE = "Edit"; private static final String RENUMBER_TITLE = "Renumber Selection"; + private static final String EXPAND_TITLE = "Expand Selection"; private IPlugInPort plugInPort; private ISwingUI swingUI; @@ -39,6 +41,9 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { private ActionFactory.BringToFrontAction bringToFrontAction; private ActionFactory.RenumberAction renumberXAxisAction; private ActionFactory.RenumberAction renumberYAxisAction; + private ActionFactory.ExpandSelectionAction expandSelectionAllAction; + private ActionFactory.ExpandSelectionAction expandSelectionImmediateAction; + private ActionFactory.ExpandSelectionAction expandSelectionSameTypeAction; private UndoHandler undoHandler; @@ -149,6 +154,30 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { return renumberYAxisAction; } + public ActionFactory.ExpandSelectionAction getExpandSelectionAllAction() { + if (expandSelectionAllAction == null) { + expandSelectionAllAction = ActionFactory.getInstance().createExpandSelectionAction( + plugInPort, ExpansionMode.ALL); + } + return expandSelectionAllAction; + } + + public ActionFactory.ExpandSelectionAction getExpandSelectionImmediateAction() { + if (expandSelectionImmediateAction == null) { + expandSelectionImmediateAction = ActionFactory.getInstance().createExpandSelectionAction( + plugInPort, ExpansionMode.IMMEDIATE); + } + return expandSelectionImmediateAction; + } + + public ActionFactory.ExpandSelectionAction getExpandSelectionSameTypeAction() { + if (expandSelectionSameTypeAction == null) { + expandSelectionSameTypeAction = ActionFactory.getInstance().createExpandSelectionAction( + plugInPort, ExpansionMode.SAME_TYPE); + } + return expandSelectionSameTypeAction; + } + @Override public void connect(IPlugInPort plugInPort) { this.plugInPort = plugInPort; @@ -173,6 +202,10 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { swingUI.injectSubmenu(RENUMBER_TITLE, IconLoader.Sort.getIcon(), EDIT_TITLE); swingUI.injectMenuAction(getRenumberXAxisAction(), RENUMBER_TITLE); swingUI.injectMenuAction(getRenumberYAxisAction(), RENUMBER_TITLE); + swingUI.injectSubmenu(EXPAND_TITLE, IconLoader.BranchAdd.getIcon(), EDIT_TITLE); + swingUI.injectMenuAction(getExpandSelectionAllAction(), EXPAND_TITLE); + swingUI.injectMenuAction(getExpandSelectionImmediateAction(), EXPAND_TITLE); + swingUI.injectMenuAction(getExpandSelectionSameTypeAction(), EXPAND_TITLE); swingUI.injectMenuAction(null, EDIT_TITLE); swingUI.injectMenuAction(actionFactory.createEditProjectAction(plugInPort), EDIT_TITLE); @@ -209,6 +242,9 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { getEditSelectionAction().setEnabled(enabled); getDeleteSelectionAction().setEnabled(enabled); getGroupAction().setEnabled(enabled); + getExpandSelectionAllAction().setEnabled(enabled); + getExpandSelectionImmediateAction().setEnabled(enabled); + getExpandSelectionSameTypeAction().setEnabled(enabled); getUngroupAction().setEnabled(enabled); getSendToBackAction().setEnabled(enabled); getBringToFrontAction().setEnabled(enabled); diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/statusbar/StatusBar.java b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/statusbar/StatusBar.java index a552e562..7c940112 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/statusbar/StatusBar.java +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/src/org/diylc/swing/plugins/statusbar/StatusBar.java @@ -261,10 +261,16 @@ public class StatusBar extends JPanel implements IPlugIn { statusText = "Drag control point(s) of " + formattedNames + ""; } else if (selectedComponentNames != null && !selectedComponentNames.isEmpty()) { StringBuilder builder = new StringBuilder(); - builder.append(Utils.toCommaString(selectedComponentNames)); + builder.append(Utils.toCommaString(selectedComponentNames.subList(0, 20))); + if (selectedComponentNames.size() > 20) { + builder.append(" and " + (selectedComponentNames.size() - 20) + " more"); + } if (!stuckComponentNames.isEmpty()) { builder.append(" (hold Ctrl and drag to unstuck from "); - builder.append(Utils.toCommaString(stuckComponentNames)); + builder.append(Utils.toCommaString(stuckComponentNames.subList(0, 5))); + if (stuckComponentNames.size() > 5) { + builder.append(" and " + (stuckComponentNames.size() - 5) + " more"); + } builder.append(")"); } statusText = "Selection: " + builder.toString() + ""; diff --git a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml index e6d38750..8cab12b5 100644 --- a/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml +++ b/ diy-layout-creator --username bancika@gmail.com/diylc-swing/update.xml @@ -453,5 +453,25 @@ http://code.google.com/p/diy-layout-creator/downloads/list + + + 3 + 3 + 0 + + 2012-02-25 20:00:00.000 CET + + + + NEW_FEATURE + Expand selection feature, useful for debugging + + + IMPROVEMENT + Limit length of text in the status bar using "and X more" suffix + + + http://code.google.com/p/diy-layout-creator/downloads/list + \ No newline at end of file