From e9615d4d647dd00e2f0e12ba5eb5d6336201f9e8 Mon Sep 17 00:00:00 2001 From: Branislav Stojkovic Date: Tue, 25 Dec 2018 16:49:18 +0100 Subject: [PATCH] don't group pasted components fix: click twice on a building block makes components jump to top-left various minor updates --- .../src/org/diylc/common/IPlugInPort.java | 5 +- .../diylc/presenter/ComponentProcessor.java | 16 +- .../diylc/presenter/InstantiationManager.java | 19 +- .../src/org/diylc/presenter/Presenter.java | 16 +- diylc/diylc-library/lib/diylc-core.jar | Bin 248390 -> 248824 bytes .../components/chassis/ChassisPanel.java | 2 +- .../components/chassis/EllipticalCutout.java | 150 +- .../components/chassis/PolygonalCutout.java | 250 +- .../components/chassis/RectangularCutout.java | 184 +- .../electromechanical/BatterySnap9V.java | 2 +- .../electromechanical/CliffJack1_4.java | 2 +- .../electromechanical/ClosedJack1_4.java | 2 +- .../electromechanical/MiniRelay.java | 2 +- .../electromechanical/MiniToggleSwitch.java | 2 +- .../electromechanical/OpenJack1_4.java | 2 +- .../electromechanical/PlasticDCJack.java | 2 +- .../components/semiconductors/DIL_IC.java | 6 +- .../components/semiconductors/SIL_IC.java | 2 +- .../semiconductors/TransistorTO220.java | 4 +- .../diylc/components/tube/SubminiTube.java | 623 ++++ diylc/diylc-swing/lib/diylc-core.jar | Bin 248390 -> 248824 bytes diylc/diylc-swing/library/main.jar | Bin 443121 -> 452991 bytes .../src/org/diylc/swing/ActionFactory.java | 2560 ++++++++--------- .../diylc/swing/plugins/tree/TreePanel.java | 1435 ++++----- diylc/diylc-swing/update.xml | 8 + 25 files changed, 2963 insertions(+), 2331 deletions(-) create mode 100644 diylc/diylc-library/src/org/diylc/components/tube/SubminiTube.java diff --git a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java index f25c8d5d..20865023 100644 --- a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java +++ b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java @@ -202,9 +202,10 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP /** * Adds a list of components to the project. * - * @param components + * @param components + * @param autoGroup */ - void pasteComponents(Collection> components); + void pasteComponents(Collection> components, boolean autoGroup); /** * Duplicates selected components and places them nearby. diff --git a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java index e241c18d..a279c84d 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java +++ b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java @@ -117,21 +117,7 @@ public class ComponentProcessor { keywordTag = annotation.keywordTag(); continuity = annotation.continuity(); } else { // default - name = clazz.getSimpleName(); - description = ""; - creationMethod = CreationMethod.SINGLE_CLICK; - category = "Uncategorized"; - namePrefix = "Unknown"; - author = "Unknown"; - zOrder = IDIYComponent.COMPONENT; - flexibleZOrder = false; - stretchable = true; - bomPolicy = BomPolicy.SHOW_ALL_NAMES; - autoEdit = true; - transformer = null; - keywordPolicy = KeywordPolicy.NEVER_SHOW; - keywordTag = null; - continuity = false; + return null; } icon = null; // Draw component icon. diff --git a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java index 7ef31690..c847d523 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java @@ -29,7 +29,7 @@ import java.util.Collection; import java.util.HashMap; import java.util.List; import java.util.Map; - + import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.common.ComponentType; @@ -61,9 +61,12 @@ public class InstantiationManager { private Point firstControlPoint; private Point potentialControlPoint; - private static final ComponentType clipboardType = new ComponentType("Clipboard contents", + public static final ComponentType clipboardType = new ComponentType("Clipboard contents", "Components from the clipboard", CreationMethod.SINGLE_CLICK, "Multi", "", "", null, null, 0, false, false, null, - false, null, KeywordPolicy.NEVER_SHOW, null, false); + false, null, KeywordPolicy.NEVER_SHOW, null, false); + public static final ComponentType blockType = new ComponentType("Building block", + "Components from the building block", CreationMethod.SINGLE_CLICK, "Multi", "", "", null, null, 0, false, false, null, + false, null, KeywordPolicy.NEVER_SHOW, null, false); public InstantiationManager() {} @@ -85,7 +88,11 @@ public class InstantiationManager { public Point getPotentialControlPoint() { return potentialControlPoint; - } + } + + public void setPotentialControlPoint(Point potentialControlPoint) { + this.potentialControlPoint = potentialControlPoint; +} public void setComponentTypeSlot(ComponentType componentTypeSlot, Template template, Project currentProject) throws Exception { @@ -133,7 +140,7 @@ public class InstantiationManager { } public void pasteComponents(Collection> components, Point scaledPoint, boolean snapToGrid, - Size gridSpacing) { + Size gridSpacing, boolean autoGroup) { // Adjust location of components so they are centered under the mouse // cursor int minX = Integer.MAX_VALUE; @@ -176,7 +183,7 @@ public class InstantiationManager { // Update the component type slot so the app knows that something's // being instantiated. - this.componentTypeSlot = clipboardType; + this.componentTypeSlot = autoGroup ? blockType : clipboardType; if (snapToGrid) { scaledPoint = new Point(scaledPoint); diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 9ac15193..cfd8f4e4 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -356,6 +356,8 @@ public class Presenter implements IPlugInPort { if (!Modifier.isAbstract(clazz.getModifiers()) && IDIYComponent.class.isAssignableFrom(clazz)) { ComponentType componentType = ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) clazz); + if (componentType == null) + continue; List nestedList; if (componentTypes.containsKey(componentType.getCategory())) { nestedList = componentTypes.get(componentType.getCategory()); @@ -517,8 +519,8 @@ public class Presenter implements IPlugInPort { addComponent(component, true); newSelection.add(component); } - // group components if there's more than one, e.g. building blocks - if (componentSlot.size() > 1) { + // group components if there's more than one, e.g. building blocks, but not clipboard contents + if (componentSlot.size() > 1 && !componentTypeSlot.getName().toLowerCase().contains("clipboard")) { this.currentProject.getGroups().add(new HashSet>(componentSlot)); } // Select the new component @@ -1452,10 +1454,10 @@ public class Presenter implements IPlugInPort { } @Override - public void pasteComponents(Collection> components) { - LOG.info(String.format("pasteComponents(%s)", components)); + public void pasteComponents(Collection> components, boolean autoGroup) { + LOG.info(String.format("pasteComponents(%s, %s)", components, autoGroup)); instantiationManager.pasteComponents(components, this.previousScaledPoint, isSnapToGrid(), - currentProject.getGridSpacing()); + currentProject.getGridSpacing(), autoGroup); messageDispatcher.dispatchMessage(EventType.REPAINT); messageDispatcher.dispatchMessage(EventType.SLOT_CHANGED, instantiationManager.getComponentTypeSlot(), instantiationManager.getFirstControlPoint()); @@ -2327,6 +2329,8 @@ public class Presenter implements IPlugInPort { Collection> components = blocks.get(blockName); if (components == null) throw new InvalidBlockException(); + // clear potential control point every time! + instantiationManager.setPotentialControlPoint(null); // clone components List> clones = new ArrayList>(); List> testComponents = new ArrayList>(currentProject.getComponents()); @@ -2341,7 +2345,7 @@ public class Presenter implements IPlugInPort { LOG.error("Could not clone component: " + c); } // paste them to the project - pasteComponents(clones); + pasteComponents(clones, true); } else throw new InvalidBlockException(); } diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 3c24d50f395c45092b9ec12134c77352090732b6..5c31a81b4a2a30ed7848e01a8f5c2b2382076e32 100644 GIT binary patch delta 37709 zcmY&eySoRM;2sDN2oAwLxO)iJ1b2c%@Zj$5PLSYEaCetr8|MA?d3Jxy zoKxrCx>eoP)3>^&x<4NME(sk)=_51@5)>2y6x4P=3N%Pue2OQlB91Bf{#OiMtUt1 zK(oGv{O}*RL;n{NTHw`o04?$gj4ABR8N%p>;;XZz=S7Vtgax+MFsnYRBi3(a+fMhR?SloA$U$!Z@jZ{Y8p!_8` zJ!#vbbLBm@PT2N?pM9STMZCX&-Z914UhQQEogN9+ycK-g@^}k8-?LFQOTN4ruRyvw z1V81Ab+C+|B3(UzpWfv(Ra+9LJN9#_W>Jn9#b2A8kuOz-K^ zp5-LppA%hTiO2)fdsROsnp%)_JaeWdM~hdmZl)Abaq{AR8ZUz(wit>GV^9m@Nb*sFf2|+*S?9VEMyy;F14?5GHC3J=br5w@_L|OW zZ2Eo!w-o;I9;taVVvXJiCtzDMhqw<~{jI~3yE4Z|%gU6Gw&EuPqwMaTq?-CntiZH? zrN%)s^%w*HyTOkOKjwRpHF*p4*`C>UcDjjV*8|e}mbW~c`qY$}b=6vz(fqq?=QiJ1 zIkxV@da@d~2z_39H`K=Ujp;T`bnpYaJP*{v#71}S*B{O~Bev9g%}cDOLr}cRvO8b9 zG8~lLj7jX>RJsfa?#^tYgGlO?g$TXRBKenLcrZ}{+BG*ZT7v}FfIh}ae5?_^x3++ZuPqyj7S5&6w+|yh zPGkw4myI^jwb%Not&J`&QW3>fF@ky?>S|oJf9yD~bm3!aznYayB(S!hTDxnY?#Pgc z{Vu(*O>{R73l@ryz6c!OOF{e${In=#;V->dUbCr=)=(qIjh39)a7<^7N(pm`w)Q5? zv!QY9ZWS74=F*T`eazm+>hX_l85EljCR%oApd0Nofh$Awkr2D?Ql((8{yrUhpcq z`!p-P+rQ(V9lZbDakSIXKgXMd{D-YSURD3>AKsy!5Fc!i zAiF*%ySaf+{BkUU&o-5C4h*Q58zwDSM0mR%waNdY`eogCvDL@DU)(6-!^Yc|YkoIM z@jj$RdI|PP#4cMQyNCMGualHZ!5T)U7k3DIGhWau7sDW?{_$L= zSwZEQ6a`^-9Mq|wf6zK+ZMI|R*xkS5Gt78a>P!(aH)@5YYCpZ^zwJd1BtwXuclM4y zGf7Ky;@Lv8%E8;0E5(fznS|p-co*hZ zv2pstj~u?ee60c`n!Q#5En2i@4<(wnM%<~$bVql_i~ES;pxlMrImURW)48gC_Qf|d zM8J=ykA5X_PxatGfo>su0Ud97pu3CtL_x1nwo!kjlvL@D|IqZ&Q$=KC zE5wI+TamLvbd+psjPu^vLu2T64`1b3<&N?%+y71T2>;T2&C=URNJgvR#)se_j|v1y z_{Jf4!XE=kkl%zdAxI_44N0I{;unyzyks&2ccni=P)_#vH9gk|D$zmwKC4ndFi`!! zM9iz@1@WuXNk)D3Q?x{flnt#NAbyi}*(k5Nt0x>p_x2{lek~_|zk!s$$KgW~d{GiT zq&%7O1JX~sR4z#U+zbLpxjmB!Vn57=hTvHa+ACJ)*S|tsW8umxBo|G-2Dd3zhB$SU z8bgq}f*1K!*KM|i1RZXhgXp=PaFF1oU4)SGK+k`TT=j)R%HIZ8ApS-pkm*5<|7hu} ze;miy>?TPX(jO~pbd2BWI9=j6C z`tIyw_s&P(N*|HhUrgOt>!*)`v3_$qprUTYsq}%2GGM&;6v4chgOi<;9mMe#ng9w) z3Hg5$KgbmUJpnlhapqG`ujjyQ`o9YUn8AP?W6YckWB`_zx**4zxq1%KV>kXl&W+>N ze={n&-EN5e;NS#eUp)4K*tJie|HJbZh#mjB0AlaFU4iIX_l)rW+N~P_RlVvB05quW zwZR4v1W@0rk_3wk%6%0|kU@|xG}xj4&zBMlw1$GZ^>0EZ{HDXw0U8R*Iw?jKM9@G- z4)TZoH{Wb1p#ot+NCz#56GATEfM_9vh#7hJqSOT6Y8yBzfjQV>W29 zffm585x6)(gfOo}kq4v-QF8e}jToZC66#J46#ieR?S^#wU;je&CQ(-Z3&oxX zjo4771e$_W3{nL>K%>2OSE!!zYuLZ;20|yTmw@n-I`g1W8)`H_@sMybI{)jmo<1l7 zQuELdB=uhdQ-)uZlK$0S;?6pP#2^ZRE9e2D;JSmdAf&+qBnS6;l(64Gp%9<%0iZ<)u?Yb^ zL42&kK_4MXV-%XbOZ1iT809BmyDf3m^{&f&T*%fz*;d21y{kb}-@w z^zVZHN0k18VjyJm3Doi5APmY07XA4*%Jct?a&*w{_jM}Qh;S4N+LD53_>L7!P5{z%mgNe5I$D0AB41WfPElDh#TAlA-8+PVy#R?1qAs*J?^w%3k z1ED=w6hgF}z|e57ih(=W7^3uef<<4QlVH5T6R(yzZ?Nxc`e@LK0aHT4c*TMlA*3)4 zOb#Kx;=%uZj{kfzlE8xy#Ucf)1W}q(!H}%cFq96)g(&Np;8Y0l`3dfZ5b->49)#={ zfN>zbcqs-qfY4qa3oSjO)-<4rlEiwT34nA>L_-~o1mU^F$2u>z^Vs+M zSmxH-pUP5$)Z8RUmt>~rqlg6&6|^VG_m|YEKAy~J)S!H1$QBz`d84C}$O@ei*eCz4 zoFl%IJ>JN7LBq@l&dew|a3Pte_Iml@x^6y}bc)a8rTuob<+RmvtmU@tC0(QAQOFm~ zV=Xts&!!N#q@q;h^tJ%1gdAgfckaC~?;ht6*p>T|1n-LuK$8 z4!81B4O>mz&{1in=xfNkBV}l(?mLw|*JEg>@4L;r69%0d zPy3hMy+wZ}0kYTF{@j6{Wy3md)}$UIKLAX9=s?@NUx(`1Em`fRG?EW<)=O6)aJ80s zHb$nlPVe_%fb*!9|DXZ;veTuYbqn?U$N!~ML-#HP{w4H9^ zWoS6_<2f*S@zdg~OcyTt4drn++tz(GPQ@GdPjIZ2R(|5We~RS7oX~>?*Za_%7}eIP z`T$ARAZa_x3wDx=uw0L#*y7y6L=ZPpnR4N*zh}|!kJr-_q;s+Zu18$jV`78!GpLgf zMEe^t2X!jC^nKSC#yReHyHwmB7TC6l#^J&BlRSZT4ik|`_pl%1#76@zo}oPv+n)nC z$j0+)&jQFoX!{#7QLgCw2V8UF*24PZ@&P>bLzs>k7A#?6WcYj(;i3WgKL}SebOl(B ziNO)?H5KWwIg6c!KFI9{eXW;v!76@Gw7Rwa7Ec%n3s=ihXN3f zXOt*v@dakXi%Wd`r1f?>pyrUAUofwRQGAT8V99S)wXjd6m9=7ieB)PD07nsV;`39* zJD{*2fXABbw9zieNyP4kw`^rND&u{?fErq=_8ks2;e}gRxy4hc!E2QmKV86Bodex5j41*z;5*&dcEPHkcRsDUx) zvK?uFz=Se?^f?b9j8Yk1nkkAWAnv1Qh1JR&!i~1sqS%m}WtEX|e(^;2ty1Y)!1~|*X-^}ak#bG(_us_ zGlN58h-g$Jp>Qd;qE1Ak3aBdS(&vDA!oqH9?&e^sFXRh0pj@tOR?6Ej66)6BJKgct zcJhNx4C7rNWh9H=05SY_eg`b=s|UIjUI{D~ZJ4_dum4TxfzI|0y{~f@GP1(szSQ%) zHkl7msA5w?QYnztb7_%n*;7x@XX_)KE}OKA@yOjv_!)guSetZHgcG}=uvnqe@d28v z&=_v4(8V`Mt@)z>c|3j(SGSHW?d+xXFxH~wTa5JS{_D<@>G@>4y%^y8^t`sqhwL6k z(rjLg11IlW&U^Zw>n73_;yH|@dA!9gX(yj#aR5xUWR7aF~PW4MnR zi0wEboH1iLLE8}gDXmK@Xx5wnF^9w0g0q?<35GaFNH-fX;irqrbeal-RGLIFp1nS< z;@Ynx6m{zcBMb8~4V(f1M%q|Gt`(EdzmQAv7E@c@LEnJJN>+W?j(+9l>rtCP4QpwN zM*vg;$__GZ=&nqtvq<>Zd7{pb)Gq};t3qs=E^>bhpB79prf2K$$FnVnGp3uexI`uI zMrt5`U~H4|dNK0|Pu?kG6c!UiB)(*X$L=XQ>-Du$prPWAds_t$U`NLNAk4tfc}uY( z8u>X?O{hC>qA{hcrK!#FPR+$COt7}0q2!9kLn*Jpe22ecQgDw_fu6BVH6Or_EWEN? zU!Cplt9*gO-f^(9Vl=8OL&{(Me(J`K%bOGD0U{;K59XgNxk4z}8S*q?YuCuT4Yd^w zLS}5sB>S`v?YHX>PzlrRykK~1=0zh!MNbakG-qv4HWyBAUO5JeWKYuXs|LtxL?*QQ zX1r&_voxXNGDGV$i+@^n2kL`OGbKS5dEzu0a&L*vr2@VHIy-Zk1GwvtIS z3?@60N$7klZ^4d}2-V~o5xTAzx9#w`ap?{*X_;kSEHOFKyU7;aY|x=$O_+T7%_xxqL!}w!Ole(aQhC1;a6C-*T$x8*Xh_;22o=>J<7KU z5egp3#eZI$@OoP@mdb^iPW^5Ng^I;vFpu3_6!`(7o;Vdl}ml1^x zxb{^0rg>Bx8b}SRpNz&$lbxK1PA6%&J$6#?CTc674xCCdB9K1g)+No;*+j~MfJ*zy zhEob^!2Hk@!$do3)iuN@BBHv4R?^(B4-TmE7Vr>!+h4}yZkaOo!{iUA0SSVF9vYMr zHcODkI47qOjRLZUBx&74c+bF0#ns39>0-5bI|h`DbjkOp!X7TJ#Cv;I(cLAhw0*wO zVNb&aDkIV9OiS*0^ZPNwX{NlCRUMXnUhC`Wz`q4JYGr3*nfZDS8K~m%)6Eh}YiD{@ z`dBwko3mh9v!G&Kx_UY0iKwx6j%ew&dDHmZ3j^$kT4q$KUuk>Er$^&4$I=e|G;w2{ zyve?q4?WA#R>w;rqEowa?UHKzWLw?8vK zL;`GaicLw>gu(;9q(0UWOg}yzT0aG9?AkQ%CNN@aJ1L2NmTj&fQ#cfaB`0|twl#V) zVY0dv4`aXTL=Hy7Kc|$IPSUllkqdd>{J9GEihV)1^_n^*TFFkq(<{F+sIeLzrK{)s zV&q$u=@Hh@$S*i~t>4q566br~48sbuXiGr-@*lOD(pqWcRP_@(?e*}bpXE3B@hd2y z)nubzun&1yv>k8c3%p5ntU`0|61Cn?B>I>zlzqUXYoQ`8)%myNr1bam1virkwT(ET z0(4;~ToY3DR*a5_=sRV_qn* zv}N!_JC0nKCcUu7Jd_FR=pD3#c)C+fqSix7-cNl~xs(^0$;&&|Jt2fnA64UW0exFp_nwcc~q!yN8Zxz^@a z?Bp8Kc4gT;zwT z*w%Lz(G2v68b)%gYU@UK&-lG@Mf!HFv`+2LcnaHxf*1|zD*7Apv)%BP{9UyU5nFYJ z9eXu+d(2*V%5qQ}f4Nzc{Fd+Nj6>Ef`*bD(d#Z6(c>MycwXPhG&2UHYLZ*5~X=m8L zW@vH`LK4vx3fPWzw?*=aFW6)PN{*kA<)jlb9|$W|)}F6N@8O1D1kKKyQ@$RVQ2pWQ zJnrhM-~GZj^o5T&4K=FZOhw1P#$Qi2M#|h)gQ&rv6Wtrvbv~j0kZtXfYNcyKQpmQ! z&7hyv%#SnpPwQg_mj|0+BzGF%ZTw}%htP#PyjJ>6CGVbH%76$QW^vnFAo8gR#9T0O zddCPSHJs<@z!wSqZcHdh%A2*M>)_z>L)YTT#`hz<^{hftG!Gr`*2x%7k`%M3H%Dhj zT){O{XEiq;%rdxE99Cqeka4xB>&#l0ml@TKq0!?~)kvyI+epi8kqadxXD#t@g%pl{ zX|NZsZ6b-BbLt)yCSfd<0c&v@mD`ehwqLx%fPc9;q9p*GB+l38{QWSA6ztOkC^71M z#X7a;Pw#K!N(c0+sUW{7^-StW-s)sMJ=bymXisVHR+icdc{Z<(PiH(v^a75{{YxkV zOcs@fB6YsD4%&@uW<)qbEM9+Sn9lT#)Cl7SlYgdn_vk>0{ey=u)mSlJ)OmB=!d4-Xkim z56E?;4TYJVr&x@9mz!?#Do+#8P)JYxsuZI<$0)40vpa_F?l1w>x0}(!ut2xTtW&2+ zc+?c^M`pCJ)lfO(1L#`|d)u*2h8VmL9@EQ^GA5Fr4aet`Z7efS7dDL4`?5re|69vO zXYMaa{$%4RKSA03)_An+DOiy zQ?oKfZbfvGttN7jFKbfHt+XweS;Wp*s(uG-N;|~+=NILXsg2s%SKdni(VuTKtYTsu%AX3(uL_!*;lM|JAmJI?P( zhcbGe#x~3Z@rkB{XZQW~2z%|G$gD4GgW|O2`xNQX6=P`1P5%U;(^``AT9A z!59BM)K(6L(&l19LG9Be#T!cLMxcy~qclya?Mwc*nHQgjSh*?rvYu+IdxU7<9;ow{cct++~nf#>h3nU0sz z%a0tqz($bgnxZf}8nE*%vxg1l&Kcc(jZLWbc37p6>{-RPgE7$Q&RYK&x8e~s^Fasy zF&zpx{Ra2~S7Pvwaq!QC&wXxlS68*ic0YBHUXV@`x+~UK8}GmLpAp+V_sCm3$EChp zbOJpu?6a##XB}jkFdd(P-cx7ipd?X4-*+e zJk8y14}6}p)|gZ}be>Jl6-$P`=uS^CD_fwB18s%wc6W)4yN&BQ_p-sTV9A|WD)Q3( zl@+K0+aVHp?&8S9PW`J`m+N#Vn@}aTU?Js_aRKt&+bC8LuS17&r#vf4<5`Z~9skN& zw;jIMP^9quFsCixwvLCt@@7pPMhpXbqOjCeD%V{%ih918*Z%#PYsun=aGW^t9H)=( zNt>+9KQ;((Qdu7(tYo0@RcAZci7c|^Apc9K46S45l5 z6q9I2TaFzfSQzo1RyZ58IN|G3$)z&?u6 zWaoGb-J}pnJ)Y#lkVFckMCPmjYz4I)}NRB)Kl{g z)9iq{@VzvZllgnZV{uL8tf+89W7|)}H=#suvX_AvFQSb@c|W*CZT4cbA7IyuUVz0U zymVYjc{+fRS2AG<%c+7(s=fVrqjg8dGA8Q7L`-5ODKM=q7MK>|*;<@lWx=g8rCHED~=q>>iJv z{1*%ZE-E2J#n3ZLccp;fH6zTME@~@vc_Y&XO5D5bDH)GfD#C?r0 zqk0fAO-ZDZMX`6OqSgvSkWO$M@ul9+Bi~Xo4}G+B4d0Z1UIv7l%-gqNNU%A=ibFVB z<;4K`UcO0VrCykm{43fGzL-v7KFW<_0<3eiR@Gj`PG~A0EHaEUR?O3W&-afwK@1CK zt@i2pGT29c%u8)lLR~}mB)p0n`k1FZ50ZRvGR?pg^TTGYF5smm|GxYA4Qj9nz=avg zjB^g6DH4tJ#N62tw3ZeR4KR&7$P_!k%LYCH%>m~nJwEB;IiqYF{&(L)&^JXuW-viYKHEZzM<0 z9Z882z|1tG*4V0H+<0qK<9{cKd18(#;@?B%gV-@*EePwS-Yap3i<$X3pRBhc><-{g z!#O*Ydm^S1iGFzR1v1DT$;fVy35%Yrlik2KfnzeGueVf*fWrx<^1<$qj3Vao_aMZL zv!(J$O?bf4d8!PNJ}V4i+vEVn@!!x8)#<5;%2Dt|==W|OVRL3=QI)BNRd)p?Sj>~x z492z>d_SB-jhCILY03K_euJ(W@BpZ~76O_x2q(BZYcx5YxM)<&znl?iPw3sffBqup z+_#WY3cDjZ84kylI2-*TZcf{-!|-dQwk>qyu^)w-_FzuhG|oaZVKWFnO18zcBOY`3 zf*!#80q)l~|JLqr?{H}*8y!TSdq@_r$SO~LE|XMBs#m8#%pAbkB@(zQSqKb&z|3h$ z;V~(r{obC4Xb_E)u(wXJaeG!~tg^d|t;Xz{e_;L-cV?8TkZyA!F+Di}Co5!iK-J`# z%!yR8bBgL23K%?ph#RmN8Mjbnwoc=zhEhCXGRcwDGG^Fw8IE0*ne&Ug~%{>+I5)1 zLj3au91@ zmR)7itl43A8rAIb^E(U)g(0QSSm#y6<>Th{_>_7hH9Pui35xcrv;w92VhFL5dAZ(h z3csB>wub|B2@*EiF35~005b08gXW*b+^ZdgGj7F*v!|soUXdDkwsBAKxmZvRR0Ag| z$;a_j*{LCH)zU>$?mgZIQu2tGhXM{Ux3En?I&--e%YRuNzkMOF&KcAx&(x!1?2E7r z+q(!CA-;5{U`9)cRU=c3p~Po+j?ErPe3J2#=~bm^?c1Vq)lGjV$w)AZ z;I2F4Ru{o=j*&{IP#=oMM2*NID4$9$%ZXAp^oyDtj4899?S;jYj=#Q0W%HZF)3Tvq zAkwq5=-1~1JEHkq2Ov3zK}l#sXfxh%+vhhj!bi498=!c0SgqZWuGC6El`)a_uY67= zX8m|xmXgEhn0)9x87-PJ&kUVkb#9;(!zjLlP5?&WTct6tiBi zdATzdqh3;k!pbtFoJlNl z!2)K8oSGK9V)^sCsRaqR5r6b)eOeD*s| z%HE>2et;6vGg(Sp^npXeI)AinX|i>?m(+g7@@hiBlSUe@k!(mWI+i%Y4Id<30}Ebf z2lanengqsOP;4R#vTH%n-@LJ!qkPAcVKlIohxOTi>wk8Df*ble>mCCu+>o7JwNK*? zXH&naw3r4HllXP4EAq0^@rd6l-7vF8v(T?%a$doj=&1uP4(}uHM0@04sG2Pc3&ZWI zAkB6@R(_Hg=Vx&17TZ*d##JM;+9xcx30llNcSEh)bm28#HLYa8ADv?Qby)*K`61N06BhcPqUmWqP3ttw zL>5A5bvB+ApG6y^J2zw;$iC5T)%D8Kw&+bcYA#OorcHBm&D%=p3^`;{Q9 z*`Xxe%*S~Ly+L5-G?=lXE#=zoRv=n~W&-t&eeuGgx4fAE*n>$@DmsEA< zxEUW#e(&jw(6GR@a#lfjmXN&5v3IzZOgfoNtMsIlfLgw$39747ZgbHssnKvfMge(| zZbkrZe7HK@IwKM7x>Xp4^U9EyfLBzIRQ)}-Orsl;dV<&`!(L^bK$}8lkFgIe@bTE$ zJss|0i-pj zpU#JxU!A>vt9k65AWl<*y4aFr@Axto4fj z&Z7mhq?>DuMbr5~mo1N55T9f>3y8aRhg%%$k^<$!xSKW!GOebFxX1QabX%*(dS~3g z9GuovSaKqCz>(Uz5r6&OlSb|bE5d0THy1PHs(Pjzu%-{su#-e$!i&KbsE=Hx$wOu8 z5@$P4=`ko~tFT0r`Da%M)TXG)s{fY%sb<5M(6YGGk&N+8tUkRXp6a}jDiGTD^2L|* zLY^t}ghJ6#*}xObgI&)e(^z#&V?(>u#p7ACKaMt=v_38WXzG5U*{cAZY$y<>FT zWvH({g|)uVrD`a(h(k;skf`Pt9APLl^rSQD9M~aGOA{G)K|+fSw#oF1rj+X%a1L2b zrSl1w@j`NApDv??6Ad`$0;Wy*n@zrR`wj-Gw2N>d&Y6G$!@z;wLF6jjzn2l|zF?=2 zXrgz2O}1|w{K5bw3YEgSpcN&J)L#bnQuJ+jLt;7MKpulNbGwd{7DV2Oj@Y+!7PT#c z9{a#o7#+KX8S8b2Gq_AxK4lTGRD)4lR%BT#ZciPopTk1x?v|Op4p=kqUMOMgjPg@3 zWLb|m)W*z_3Z}UZV=ZZXkG|4eIj3H{b1Y`vNPV*<&@1(f(=_o#~E;bYb`j+-5lz5L)IKhS72aYjc{x%zF+&J zpVUraSIrZf+PE#U3dn3l9P%l&6aXn_ZldPrFWTq*I^^Iy=%gvg<2Bm#X-uOqMtN6j z|2ZTX(TIXt@H8`^THlO9Auq`%S&akK5wuDGi+*^-h{5!`hotAPeN5k&xFG6pf`&AA zyyYP5(i}Oe&VRXxv{3-&E;QBes9@iT*92zPrm*izOs?p*%#^%jLaTov}JZCX86{xqABj8WGCnY9mB z;r0~t|E&X6K7%D+_cYYqLN`G6HdI1GlS0TCEOaP@Xd^&F_PjOhB0)n#wmlr7LYsmi z+a92O@hK;yp`dh1k_<4QSpc=Zr@Il)w-5R}Z16I8nz0`mCD8n`lzS*OIzJ$M025Sp z$1+#OnrxoH_0Hy$Y3P)+P5Y^r&Xj9g!Vs>*#n|S)XbzQGxG)j<=U9 z?QK{`6@bVN>E+Jj%Ic|?x%c|?Tqae($VJ5O9Q#9kHrM9zHfM?J1M}$O*^x8THR8Ep4;u-ezmA9NR!Ql0?N-EXTz*iUj#7 z?WRd8W2+qdb!dw~GQ1Fs7sZx4~832TQDZLhN7xx;HhcT4uG z6iu)E?6Hfq7ig;IuYgRt$ddE(FzJ}V%dNwp^K*qs)$Swj>@xq@-Hp@OJy7{^rHVYN zC>XZa$MDAA@>V-P)AYc6vu&azGbhvfV0XRkSIOAK?uN$>CCcum$M3NM(Mfy?96X}G zRLuGj$BFLOX5K|fD`jjwQuu~i;Y9`^xJjPZ>fW%4wdf_fXHHp$Pu`5U=etSEgtn170bWT3m+iQ^S9h$^ysJHI7Bt7>g zEH?69d-86~a)9%?#BtubGTQolzeoRx`mgl)wSZ~|S&}>S?-!|3@3H~G=`9bE4Xs}|#*XyNg!Ly667415!{+%7z zY+u&5k=>h?#&37x8lNRqJMd2py0@2u*P2$RJ0g1e?3c98&G;TP;|eh zzb?RNS{v&Fd+AoT+|UBJ<#^o^Dm;8faO8K znFvfk4}uVf73Zi)b60W_9vEr;f<4ihbOBFnRLGsf@b5_PM>6J!uOMP((dc-NVG~$( zM|A{eGs!nL4mYI)A0i?zsx|sJ?vj866-0?!$rv<-rRLYKVyJ3nym- zHqTV-s*&P85!tjR{Wipw$BQFud!1QQSWVw0_pr8(6y_zqR#b}gH$Ew=&&i&gj?TdY#apYFr zkfd!oYwiUkFPpauvM`;Dae5}zGYHFWajwZWs8N-8t8?p9eRPLh3m$RVZ;X?YkD%#V zrcH?D>wlSm;%s@el72PI<8dwE#r@ml&y#kKONX3t#OZH)J87+jj)8Q@twpZz7O<)I ziPMYv5Sq+vRh`@g*Lt;CI$$CwS3hMk?vBrTF5BugZbB~p!60zcAo5VlkR3y;p~hPN z#_0X6wA{^vkQ-?WnP&&6`gr4%_ABlfUpr z-dIfqWA-R$wxYLo_O26?@AxienqXtzL-_#&^^@u%HW+xhI=Sadd8gQMS1Y{ zZ?mW-UvtstTtJVR2TUr-KO3+SAJOaoMf2=4tROlnpnFJ3dY0}O`S>!b|8{;1^#++u zI9o^mFPSGPTSqTj2j_f68xdgI!7*Kc|h+!H)u!7dxR z((FV?`#kGlVl9y+I$p;zKaRcPF>8uiwqB;=AHyGy!=hi~;p(h2&|f!NvZSM4udKpm z^(ENt+T~s9GfRw^y@NSlb(>LEhad(rPbsR@&uj;SC9zYp35osKojd?}uGX#AUUy}= z$#LdjCyxbRRb|pc%TPKin|{2ZE?XE6@!B@97&g4edqOjdt)6H6Ek;0Bsz&L--tzp) z@?vYF1d2X$Dr&E|Flt%01q#u2U2y#ktT8mE1-sz!rS6<=OLvT+#Bgll@4oewX9t5y zHl7Bv=d}BIiQ$a|TVh~IXO>r0T*rl?myy7-uREN#+)h8j+F)^Vak(6sPztF9jtbMF zl@Y6*c^)^%#O5!-!7xdwHTq0d3HiF-){oUNF;O+GIBiZ|Y~~);q6XgOxypIrA(AFK zCUy*DwkR0rDhC)ivUdDrm#hjl669Ve$BCfCz+d%0-{y3f8(IS&$*)v-FaEvU6*~0O zNQP@3It#%~P*o0E+!JG+i>Yqws#1L#_at1hTezeTB7FLl=&HDoEG#N27|kgJaennVYP0=6YJ z^?C`)*o#SlG{FG?OnDlaRrSqyY#wWMN-t7;86J)<9X{DSp>-!%6Hvq`t|HA|Q;?N1 z_jP26@3~cO>$1RU*2N0Dfj6cQq#E?)50K!RURuRIYHKx;^q}6`|9QL0h`i2y`k~tQ zJ;rxRC`YDFX!d{W+wmYCLGkr(Z`MppC`hDp*A65R>jSNTpFyLW`bRd|P=p9vEpa#H zVv3bIuA3>u2grRp{#<3h(JJ??LAl{Qe<<>iV6Z$rzN?Cle>Qcs<2~70h zZpW`30P8J%>lFm2diudVKpR?Gv)4OFQ%w8Q9`>xS%&tWlqBAdP2z&d7S0)9(^B^B- zk9QW)3+RJ^z=?Qq^){H`;o#zMc&Z5p6G~9zC_29M?hDD|wMaGze92F9?d5eB8nlPu0{0NtqSxw$R52*V)NSKt4{jcr8#^e5ih&`BctJ z**&X*n9e~etah0Q<(BRf*LY~xGl~Mso6`1gCuQ&Es_{)QTjdeOG~1q3D||d$8EIWS9+h%x*8w_;zCG zX_IB$Li~<)#*zxv(u9pReP)012>6UlWmu|I+lKC9@2*7yRfw6-O+`Tu zPPPBf6(t(1sK#B2kFm~B=-LZ3-9vg!fwBAibP2WzWiL-SHLgj)d-f-XQk6ZSpYz=JqVsNVDnRSE44SY5RQNcf{$;bqr!~R#=PA zce7NFtWE&Md_M+1jVpLvs3Efw?$5Z>)P{3I_t7eQG7}RP3cgf&{~o6`rrBfflQ2Uy zor(I_0PNB?@H!>dSp%s01J{`Pzk|3~*m~hD+#|MJ=<#Vw>x||Cey9Q8V;QJ{iuV}y zu;WW%-{!@#22xTsmN5iSBdL?OyO(RVyh$}HpWazUNBa+C==~}e=w{VTQZI02JX-JQ z2IAA=o{wwcaO^mk`-E?Q&1lhx=kGdpS*i(+O5*3SXlGI8T#nSyKZO|`r1OxBJ3))` z_7Pg2A|h|3h{R6OnY!QXIM?(73@SS2AsL4DqAG2jr>o=MW=&Ahy31L}m{4H3aXk=WF+y3R`?kG1iIxURn8c5vtFprb26;8V|JzBPBeoN${`bKZ=VYrI;f-Td<8 zK^$c%| zne8rwFiw`lbsDZa4Qx0FGP2u2?CSVZexPvAukBqd;rM6b;rN#Jnu{{W@p41CAdDqt2=F zOR_hK^sOzAwS)T(Yx{U?k;nN=7E$ZVg;gudB+LtY2MX9;MfBvSVh@*XBcBO~9VtAhNCP)Q*13UPEAN|%R&@sThgPNjWh1OF@$M=2!Zt=M|Jx|VjJ zI)hs{^dG2UMsw>%#-R0kLc$AW8_Psc%P7VXPYx3y)H=Sl7r#BMpWg>q!XdPY~-69FsrRvl{&J}6^kU^UFxoEU)-D)h$tSdxEXdC2V| zrBg!4qU6rJ?3Igh4nyzK1WTO~nz->ke0EN^5&RiQZTd>!w{!WK6|3j85X zxy}M6ZTyk?PU}MP|FHEHU{N*i+rZM@-Q5U?(y4TJhk|ss2umZP)B;O~bc52}(kY^} z2!b?-lHzxk_4W7XeLt>i9QJpp(Tbs}$Rz9kM4_);1>T|Z89G?|10HZu#eR99q=q8uF1wRc7+{we2WS`ncJt$`X$sA$D@EcQk8}BB~U>~ z2JH}O%1=yu_TP-1bJIa(zg{Lr5DI;+szRi1D9c*VRQ|k=u{Jn_Pj3F~(uS@F-2LPi z??j^mv+L|MEgDDF*p$4<|-5 zOg6Emaje(y)$>5x@QTA4%_8RGsZs)^8p1h6>=4EV$S+y2tQ-k!7E%A1N|n|r)Uf0} zdbp@qyNqv1t84mFRaF@k6}kzBT{Y;#FP!VU6=H%Ss7I%2F;cyqHb=JSKS;s2dwX=qVb;ZFI@S@bOygT7rScxh<0MmAS@>KF}RX$y5rH&!O;QL)x((I(yf_^ zv$*Z(4^X7*T8t5Lz^ImbguNMIdLF-v0_0~CYih!LP&N6Ztdbu|sin)N?y~+gG@TCZ z>;t2>n5Ar{)BYw%zm$?MUApclVrle}&o%%qg^6jjulBJK(UkizYTuK*@ItJAa#FY@ zj9#=n(v*s1TP$z9DD}BIcyU0SuBLhBrycd&gG)*XSm)lMyvPQ} zV9X7v`m>2MN7COS^CSK$yBb}`%|ESbTDA7~A4sTN(mH5O5FVlKZz~1}DJk)r2R7Io zSC!EiBKig-oxN6T^5<|wjCubc%x8J*jzsygM7x7Rf6n7p`zZ+=uI_17>-PJ%mEI&JsgO^C z<#v)@X=RPp6B+vmxwLvFjx}HQyj004 z48VBn$!+E5C=&P><-VTvNzHh}kmW_Ge&!v%dX)u$QWAdw508^{M_3^Oa~(WaWJ8r3R?GEKWq<$G>z-b2bY^>RH%TI_-;s<9l9F# zoH&ve`>RqgZFyHL`l)xG8q^m0P-j$`;C|j=)(@1Yh?I+85K)iGSNY~=5>v8klxo!V za?#9U%q#=LU-L^dKKZ`;GW?Ou-B=uh|)3rN#2l>hm2mMCWi2dYI{@3}I&Sx4z9TM6d|@6)m<=tjZFF^6WB^pzl+G zE3LTFK$@%5b;G7H-r@ziT|)b!@vb||ADyV!Jvt&X_=BR|Rk`J?MOr!E$Qm^~K=DBCvPw^tI*7) z9Xz|piw^!6F`u7A-25}Rz|U!I2T`tfn|kE2KPG!=ARUL7Vpqf+CjKMMCabBg6dswH z9FvO+v`2gVxy$BaF4z|QrfJ9hT$h>d4_)zo>LTw`RunQc@Q5Se(#29bH!*T@-Zyo+ zpPu~|6B|)Nh#TXSH#*#B@DqtiwpKRb2=LW0&tZEo&)9L2eNJs}?4<38GTGtIG`ee) zlMYL=m)R`Bi)c=pc4JzLf#vXkFV-ZvJ`Yq@olGLIWSye(T0>gLQ>ZF(>7!NaN&te{ckkj-svv}_kM--K zRVoD$Sa`8?OCU>y)v_)|(z>Swt?r>KeM+E-=*Z%mqQK$C|DtKPLn`fAr zcELm+*%}Dg)+HZ@tTSA2#v(U{q9ULnR|lf^yj4Kej|oj#QtaVe$DiCvdgYu^b7(l* zAYI4f_Yhkzxv7x#ObnfiVrwKbm0?jtHRwc-5A1&5Q{68!>+xE9o*kJw3nueiBTJn( zed5y;bRDh@Qak7%`(WCx*fRyszI|Nu3%4dV@~si?k5=vNF$v<5jBinc1w-290xb@2khC>YTRE>Rh zawWn2JY8n~Vv32XsAG!1WG7d3lOugBb+T~Ku{^VbhL~TOqPfL)iplaPaa29e!~*Xu zc@+)kWmRL*GIDg`%Nv$*`W^`OKJ}zqL_)7JZa?n%+D}7eV!&%U-G*#^;kMbPiO5Az z=!efudOukxtYwhX?obnW&Z>uHGB0YGU5N!2%P??tIxze=)#iSLg0+zHdGMk7*B9s# zmPL6LjSYqEHd-o~eI+Cu2$;>xExN>E+^b?J`?Z@1cY5 zfz;U_o(}nsjtj&k5J~l?VRmhOxZ`rQxxne*kH747mcnWp^%$3?E$;6AaFRx^wyVkFLo_xFtEn`S0WIBzRqKE_IKAx}?qnyR(!Q2D%;?S(SeMZ2vKtAi+i_b@xex zB?fJ`UyV3!K;EkFspd~syr$m=Tzh<*U>S)z+muK~t%N)qIyc{}bguy9)QA>NY*s7m zGoJbmHotS}T(+gfga$2l<5&yghmORB0#CR%8%CFu>ivowiy?)lGt_7lQ8uTi?!ez7 z0*;?Q{n?B0&1~}-$&Mn}BFCn%!|BTdtq!bCkGqt(j`R1c>|9(ennrD8i2HhKUVxW_ zEB#q*pS0V0`lSmH>U+xYkC?tgn)3=bD5hOVRGjd&;r=30H7du_Foej=$4G05r|Pmo zA^V+kQi{SsgS4LQ@!pV+`~YSGj!bkz-oq?0^~*a9o(1nYJ+&EGjW`jCBbk=+I;7+3 zYWXEz(@>iu&X$et>u3mmeg2Lc_rwd#v7r@iM27VKXI_V(LZ8ew`C95T?nTOFikIBD z55k5#J+zTsu^!Ba(1p?agv$>Sm80XGa9!8gBzjb9EeRXl$pQ7Q3HddPO@k*1hXXn9oFme#p<=*(XgNo~ExMCjtow zn(E;5fPJjd$d740>*aCv@o^JBntr*^mXq4OX)lXjti@Patot%nTcPFwx~a9ZmH^lH z$z$}oCR(r+;|q83RZ|Kkfo=_LWiVf3Ck8o}QQMo!$3KQYyeiiZbu0)XirT||(1kw= z#H$t{nCr{4*5L7ZK7ywbi>yAhYsavXvX1SWqcX1;D}4{0O1B%qlYtW})$F7)=@`gj zy6RNq`}v`HdsIht|1>9lw!JGm(E(GTet+52@IY~~{!ZWDKA7!D=$^JERNyf*%<>Z_ ztVb?5noq`=8N>%Wkgq?JXYa|_U+NajQ&K#^p$txSe-TBWn6${N-FpXp<0?s;_Wf>* z^3+7R3G%zx((!x#?xGrBu|*<=-rnamf?VoGP!ZbIRYHQL2hDOw1Ka<$PvMD`Pk75h*lsZuD#~sJ;bDQMRj}X-Y#LUxq3L$Mq1+tM{3e|6#dTk8W zUF^Z8R|qnW>MuwVi&&yc0&`?l`~r-0{kM-ZbKH$)$dH^loljYqa+JluG;c?q&yRQY z5yUN6o}r%@9%52}$7DNsdZbL}iQ16B(S1HVhF)yb*?e+~ijl;K!u~JjUW&$%l)5*1 zQQWaF_=Gtb>k;&ThvW5(klC=m$(2=o1XucfAFnDT61RavTTh#pBzb7PE*NGBPl-DM zO>!-Ulf|RzvOxZ7)N90T%nOiVC&zfu(&dbI zGN|w2YB1cwBh61%ZKnpNRQ?9Cp82pP$H+U`sdR~w)<(ZSO7Ay>d~uILqvR{Y;~`;j zizumwF`G`S`*WD}jA#1T6O=T;r&`7sZP2w=ebfU<=el2JRG__gEz7?S@2hi>O^_HD z&g^5KQ5|d-V_vg1EwlBk0FN%eOQKvCwajaTb#B)k%+ymJnU>FjqXXLS$t_aVrMdBS zLz3458+=k`_MOfg-;WbaY&vX42SCyfs14DUH(wlkPd>@MM_0AkyMPl;fU|G#0h_R0 zUP{^!M?zZITwJIg?YWj`YHC&(^8vz9&*LCAD&`M}+6WU7nxFD`#}3T)d~Py5j;QaWwsYF{ zcg!A)hyV@uYe+$r4jtj5t%R?LEP;Mn&3pOu8@dgJjU0*(#1hjoT8s;$;l^@7P4H>Ds z^v$bUcBTpRJPJcRLiJ(mvdEjqOnp&}a>#~(ctczbx)0OoxsYk+w@GM4cSvaG(+ywI zu{&+hzEKpnYaQ|*w+v8}P@kS4wALd!{mxV{Jwde2NUjK8L}O_(jgO) zuzrJ7qa)4s_bdeN@aszSUqXvTU+SgVNYI8vsW9r%b`yA08pqRrSqFwXNvAJr@M_`g z>0=xto`2Q`(?|-tQnC23JiE{0h_bkmQM>pgK?pa-t2BbIC)%ewlbEWJ(bzH1%vX&E zK?1${8u=3;+eW3KClxmq0xq_&KKm&Q4--=ybq;6 zK5K@p%dr^9P#J!g9-4LQ*00ioCN2zaX6a2ZK6_qA5SQmoIsa5{!O{*&K93f>k1nEK z76+-71EW)%r)eT+N}zA4I3py`(o-{M=_y{#A)r)dtGox@I^3|kMC64Z~Twtt4rIF}K56L@2D9`2S=iS!5 z377BhvpOU7-%s9sgpeQSF3|W4&%Q({K8}v%3;1Y;;TS{N&BYYlgo@fs;r9dL{%F>c z<{9s1Ky>$7_&2<_QCS!WIGN10z0;s~N*(sRx$pXm$Bd!rLu|o{hu|xGS<}TtWoE_k z%b`k)V~$MLj@i(wbFY3{{7AwG+eWLm6YoKod0y#MuX1QeU%gez50i&%y(L5R7!N;n z;Q?rPaj$jW(%nK>aerA(wh-Ck=RPYHUSh!Nw-~k2iC997 zXIo;z2-9cnQG?LCb_c#Bi^VchbS`V|+NI#FvS_iKgsAJLujbTm-O~y-K@oXa z8WtuPeaf8Xl1pqasWi@CH-hbasjJlbPI1}&{ZxdkLQY(XC@yNw-RP&eVdj+@NSV7} zv|uJ7Gpu}ZkEC7Id7(Ij+|Cq~$&tihUY0oJ!|}ckhfN3e$0gxP9?dM5?$H>>sRf+1 zUE%Fr?`Dzcx=~URBt4qncGZUGFcYmKtuXP_~1 z|4v^>7_<9~jDX*B>i5!$oK>Fu5(rq9;O4*(=lk-jD!MToWs54n#Xo}=(N90(mq<4A zA;v!6oT0gu-pI}-km7*@3g#%>gzB)}<~ZWqMTrNvSS|kF?)blcTND&8&Vi2Y_oI|4 zl;iU^s@!*aX`G7j#WHa-ta!=c5fgVXtTYp4$xxi_DAr8(q?ni#6U4D3>CY2hkkkG?2*7@~5UZU%zTA|+) zmG+A^V#Ry=76=88+Yjg~!3Nq0oC{4g%!xl#I&8}=qZ6L4327uw5nc)+^XE9)f!Lm7 ztOvd@W!8O%DziNE70O<)7d#*ayxa)v}h{l(nT(sBkTldc4Cgv>E*>i2Mj^yy!mv>p@B1mE65U*o7UPT}rS)B2J^VH0w z`dQ~NV$))0{3K+8jE>8Z&wtRCg69a=?+=DwU&$Ps45`_F$XP+s;a4vb+Gu?+b$~3w zI!F~Oe7qTk(DVAfFGRZzEr@T=7nJw>033gCM`0!hO7GflUl6H%gg@N=Grvc*vZnKj z;I5KR#~t!(>vFvZ$2t9n9$&!;sFf>ThCfPG^Y5uIyXWpqM8#geC@aIEy#^N%1iuX# zLFMTF+1zn~qp1s?i+&Z0L`4&U?iv#N_DCr&zhuB7d@DF(HEL=N(G<5UyK_)}a*7fh z^7!S#On^l&vp;5h!EnTDFgtO(!%lDGFLR7O@IC|C;OFHdMNNN}l6dnFsa@LZ!l!-` z94=01vZ*w`VHv7l>NILn|U6dIz9DJ#84>Y^{Tk_+!0B3fFgs> zOYs^qyV3nect>SN+EgD_6K5uC@eEI_=4DNW^e?D?F$8|ns>)%8XvBk`$hAH_=6Hio zoRen;D)JlR5Ey4MDxRQb%vb8D8K^Eg!`oN4vC7t<6rAS{nQ;8|gKbE6>Tnxk{bu*G zY5YQceq4xOg|NK7{ftJU=%-5z0jl*U?nWJ(!W@2NFICFS$^#9RW%f|+An-JurjQvN zut0`mig#I(H~Mu>6Ztp5{WCukwKn?6c3I9h`W;VS+rM)18pc1- zCvIslG!$Az^(V%v`vQ4{*sFgi%Y~~2tAy+5_l?rIfbOMxf&M+Or9XL^(Z0g_h084q zau54p^=wO~4$-*QHkD=4gyZ3>)`}?*vDW(ckNS#Cqi*+=CRssXeP28Z+YyU=RJNgK z*)qys)(H{h1{Bl+#p&o1kF?&!8E2{@OWPcfO1^eX?9r0PR7lpAD7Sdk*0-LXY6#H^ zaTLfDqL2h}CsRt%6)bKdhU6k!hdy<&zx$=Hmr^abczKHljIK9gdX|9%p4~Rb1Kakl zP)NR=qGBVF6#S41CS$Yli}J;K@qPDGjLk-`VTX7Q*_=&Mh9e%G9mV>hW5TY?9 z+NpX}K;oxxZ?H#j$|q8cW^>MQEupv=*+S6}lCH0s$%~O_M!N#y4zr#j`hB>B@8{4- zYrn?^iml(H{5ZlSuS~G>-UHj0fS}9R7xQymgk&63AC4QF=GT0wDeIya!M0bCd>WkQ z?=}0+KGP4M@rAG#J@$c!$(RYJ{FYdMl9{!Vk^A^m=l3gcPG?L-ZJ}z1gXZ>xFGjL( z+Uxtqk|Qjh$AS9VUkzhNhYSRw?)DAoHg@YMzsnOy!m6RUW6aw(+dStVxh7|hNMURh z)oVxL5#`2`!p3gbs3a|lHt1orhrQ6!nNQ>&&~|s8qcV@KILCwCo`d5H$}VymhN@TS zXzs(uu@J%<@M_E!hk)AQjE`lad7i55Ab*$XJEc6Y1J=+EgqRD7HwaIGKeuRonx3^B zW18nOy=bccNnc4QoKJ*19bNA-a=~i%i+}ISi_?8gf_a)ych*w3blLkSb+2*FSW6Q} z4p_g>w1rdf@*!dX-yxFz$%y8{v6A6MV*Y?jN)BhCrx5&ni){$Il*X2pjQR)0-V>5v zt)MGSzC|%Ne+9(^O>M6?lk_K3+M+h*99g1t`>(KRDc^F|7B49Sql@zrGb89b`Zoov z&##%RGn&}8?$$k~EuJMgB|N{QVR|GGsIw7h>B(%d`K5B;-9E|=D2Fnw>2skEByI)m zea(!mCDI<5L_azlu9aHZDD=r6Q=HpLR#+lCxy`Jml>h9>us|hj`4{FP# z<=m|^86cr!BbjeS=0Bm8IS(xV$q`XdD6Qb{#y9kU5WK)v;#l;~eR11Kka_mXQfZV$ z4s~xoK7@xH`$4gDP^zR(`)l?)&z@)#r^*uF=|szO%AiwCqmvcg%+pcvubk{^Q(qKU z%J0I{Jn=tK-AHr6x7NxYrdQNHe~@UPte$8j;$3nd&mqY8^5xq2BN9?;;4;-`^6>5a zX430(LO*an`7?iY=~LD0ZBnk^b04^Eqm|!=tBi6=Zz+crAn8KBkM6OhA{K~e|qdeigmMgR& zZQ-$?)Jq42l&L$S$<^X_om9`uoro)c#VB)9o)p=)%&*MYGVu7udcrNvj*Opt(p!JV z&bYL(M(}vit7_uQgNNVxIT7Ry$|U4li2Fh}@w32am3BnAZ|+g7$tS^w1X@&4P~L6Ha>e0%*n{>mwv z6@Q|>$%uw!Wu)oy_HgmIz&9ys;c>F`55q&0J+RB{OeZ?o&)NIkl^h;Qx+jyFuUuJZ z_$mT2c|&}08~4u-r@1ZCTdC6UiIOEF?}=|Q>c%Nx*s`yDCZJp`6p?`rD8;CJA1|*x z{lt&?YgCIN4GV9^hCMuoqJXS!_PrGun*9hO0Ry;5QigA_^6B_KnmV&QzhVrF!`ovA zhCAR@V9C=q_GU=MNWFYx(5m238N`c_i*9)((oSHckzP0wk)13fJ8Tawr^K*bvUI?g_0wmkq)emor+h)6b-EI)VwBK4Xq7l1P4u*9&a+e zZ$saakL4RXL#jb#t?ZxIBk{3$s>M|8)h-Qw)rQHAB+_$=&lkzvh3h?nU|Sw6U|UYl zYh=cYxXE(1rF85BDZEd5hN;`#zW%gxgA1Q)@RZ~^O1JEMZKY{lbr-2x>yT`P7?v8b zVZL7^$`VFZ)ib9Ki0*u$(G(J1ZQLio_qWGn za+^uH7mR~c>a*fBlr=e}^CrbsB1s}$o#WRpv1S`PcUB|BN$6ToO;$H$<`e3Iq~xB- zt&@(PAf#WT7Y-vVGhtBMw?0CefR@tBfvs8h>5FuoNWEo90|}VB0+^K*LaHMf(b`+T zz2gt>(lRT$*E1HV=JWK$Xl<*VqE=OepsfZA-ZX=L9}Fp$zHt}sc*hO0eB>dD6Bw|kvd^SE z6>fc~iEJiKFKD!HOA@t(ipqSf=<#{BPdp;P*+8cj`Yc=b-T~&`XXuBCfc4kRWgXai zYsDdDDjvDYRHS-48oj-4nm>ZW%JiAR;!Qiex*^o4_Lm{VSWUgoh)n2eD6*Eu5u9!L z0-blG%LL!Q({`77aQ~43EvkUW79ttu{leGyavIwz^gmPv>gGMvRdOdE5D#;xx=pw? z3Yvv{8naK8i1OnPcg2i+rn$w}ACH@U-fE4#_KEMyGyCTs4(GH;!ruj(y-3UFO9oGK zRNX-~7wD$;tX44AZ7`@M<>4&s=8SM?!Rr%P-n?vTdYpuK@M^UK%iBAL+YZ%sg^6~* z9!tE3v6WBK3leAGvL>h}zrZuG@c!L%(i$-HRJx2FVa1esgJM}DM3RE!%+ep+b8 zj}eV^cTdgDOrK>EtLzIaJ<$}iS+xRheJP)3;#9|vFE#ZlS`DvCx=V9cGMZZRCzbBwa;nPft})8bGaPHUhj(q1ryK?9j54P<9Dv(PY{Kl(k;+ zV!jUD{b8ufSiI2Cn4yh9(f;7RX9UG*H}}s4hM9>K--}0dzSV3 z$g8vE1pK%F0%-h7;{7c2wKc`2Fwj6{@21f2PVy;0J@Bztl!; zEf4+pPFTGJyGiov?qFMqz&Bcg)Ndn^RW(#*q5Ej|onee@Yz`G!M6;1bA^F{{c5!&^ zdGxI1Id0m-9>L#^xh;oDiIk&R8ALAU+-mlR{_UEbilp899w}vL-iVf-s zTkZ2yX@r>xdQvnjv~- z9w%W%6t}&l4u4@r=RoblzD=6^nvO`PQ`W}1Xeu_VmC={~&6Dc)qL1ob48iH23hhv% zSul(s!9_1#@I2kauyql8zsO7A*(z|kcpW41?9M6my+IN2Qi+XWvxoc=^j{AdvTL3B z__5LhUQ$2OY335p`O2Gb!0`SJzoJ@f-@*Di`4nZ$=W{9%R-Ye(L<^aj;exeeLqoWN zwYzDXr9=VqS{!)YeUlZ*q(6kfchH=xoON0odgizBW*o&FQNKmuO-KLuR@Ck2@+-t4 zjH~{0ZG`AnQk)%fSiNuI0FM-B>Zj$FgoP+~kNkR2abcxo3wCJ~`JgWm=8+e~rTd#x4*L6y}qa$fKmwRKpnK5Eg0F= z{R&U5#M7?M-Y{p4mF(5m#3HQcw$DdNIioNWT4bEDD-AHeBD)yvQ}!?s*?ad%641_^ z7lk#3VY-?iFH7E|UY3mYyL@o3t^G&mz=Cswgp=#Dm7RgLqTf`c2R@IFzG`0#S=BTt zSrUxC82KVsSRB)Da(&6+$kdFLok>M#-JqT6l zI27+io6A832VH@$b$<1+ZtI)%fSxBW@qUTsf30|*Zs*vt#Xq+760iLZn44A#OzFqX z)^<&ttHs!+ z?{efN=DA3OfrF?ZgH2nXW$-ihgvH}|oaa?k1*Y6#`#x=vkLvXL_ASbStGfz*3hus| zIvS!Wd|Y6eBp_iP+_Ey&0WNQlYF3TP_we-B_?k!0qNHCkTQ|F3>>HFenp|)cLd>o1 z`M7pDq6@iwL|q9?K^epVe6gLgzg<-n;*Cx=szUt~rIEA0YHZTCyPsN=^O>^y{2GQC za(B#3W9)oZW&S;qt-)UP?nWtr6RgfT;7x(OC;RGC3-n7d{5D4%GT?)5^lh?J=2I|j z-&jt}&zXRb>W;f|1t~l%0o#5p_awjG@aJQYmYkH*0>uCak z4hNzR=bn)5CZ*znvQ@_0EOnVpd)E#7$ox`M*PJOq7URs{v%vmYXF!fMgTYS=0 zd^zHTe=OIipJm~HpVq2AE)RXrFRn~8?QU{rbyJ9c7B1-+R`R~fe*M@mN%AqfiD^Nt zRfy;pEbDVa(G2q~aLu=T_L2|;+PUZ0=g$qh>XO*AR%i;#k1{Uk&mTV9YCOvOrG%6w ztxAvo)I~3(oxt4Hj!&hO8$ z)Oq#JsL74hlJaHqh|U}bDV^Z!xB`S0os&DM1nLm}uh{nBJn*GolsJ>hg5!+Fj%tmL zs~v+ZrwracEBWu>;ixsa>i#HN6=U|dQL|1KbR6#q*utD2VMOiBG7M{9glEm3OHpsU zX8i*Gkg;+$AQ^w3WK~8IG#Dz@FTP|uIB}$2ZvV;;s_4XY&PZ@Y$S}b=@+y1CBdo=q zB==Ne8nJOMau94v@`Oa4@k+2R=W%c`Igw1}qleg?!OIqNL8Xd2nBH$}o5!qAhDf|i z6^h@z7bAZtl9a2_AGQ1v@(AO~^*t75g_vUA-i#&1EQ8S3;)33kHIW>`g|m{b^#>|r zUkx-j=H^|A?UySU+ihd2I@1X3YKPud@@5&lD|)j10n_6WY!-;yHe398FRj84l=0of z{WzJG^~v`NMS>LTpP6b;e#ap4IvroFv>pW@Tj?d(tUn1BTmFrN(2*uizYk^r6ZuBR zarB9o?#gt%qfp}sP5IEXSFe*Qg}d%KDnfN;Vs|38_loF_EpN7!X} z@H_#FxixJFBAEGS%bP}rxOj@givcZxG3Ru;WSPP_h)=Wd$2WLoeC1-wq+#CD`y?b= zjSJgx@kSIsy_4lICq@eP$lS`)tMMEVjltLi*O#^8sb!O>Ze;g5M6a-3tg=%$(xvsx98>>b zdy4SW??eeK&dw+{;qlBPr2Q0ccdx(gU`_kNBlOz3v8!~&1Wg+w?uX?gNz)g*%r47G zc%*M7JhBys%5^%1tY3bZJ8x6RmF|$j6XaxFIQOq!&E*sA@+bA3YNN0jdv$JjkB4O? zcY6Fj{luD#M9%%MBXL&1I?0DOvnl4tzoS7{Q2qP?7CVJXR(mMK z@5CM?4xY_s6zrE@br(>|jBi1;D8iU&OMD?%IyQT3Ab9=ymmWu{-nOOpV@xH+Q;kxC zaKjzVJWSbzzEgI!`Ao+6r=+8r(G8t4=PNW^J3d0nIU@r4qsNp2SkB%b``z&;?|J{^ zB3=ou5Zp2O(ib<4eXRPa$j{9BsyWnxT?>q%zxR8T zRhBRVP1wa(v4T|M@|(64PQo{booz~^_{H$_a3B1;{tB1SX>|>b%_ngPBh}h(-_4r8 z>!t7j@1bLyeNyyd2IG7+O>*EXT2D}|{jM1N7JC%Wzuw$E<=xi`;-EKEX0j(b)^9DL zI7+X7H~yrHSc@K}6Q%!f?8xNIQ(AnaJ;z)my1L0!rF14xnbx7&zBkg9uG$&h>|FRG zRrtsu^!iETu#Kvwn~S-wc!ubphKnxdQb)(JJU~txckB2|uw& z`~F_tsa#AF4$yfQ>A`D$ZnsXOU+6?%${mg`bA!K$Ohm_x9@W5BpnYMaq|3%d(FZ#Buh0{c|$h2d`=)XUzQFd7Cv%SAcn zi;h|SxW_Y6KDg6Tc_P}iIoD~NJJ_@L-+JE%t4P?q@7u9?z&rFD+Dz1P$9YG9g6=J- zf^$3eSY<%J8B! z8T=dFZH|Vyk&8KpZT0$;V09nVGy}HlrT=M~s#sepm{pFbtQ&4d{c#c*vDY`wB|fuL z!)CjP=;U|BMQP5p_Qg+`i-~s#H78l>akvc=owQ7iv_-%7#Z`ZUWWRi*5A= zKx1J;s9;0;R{CK+9hs(Qg{4f%uJ1>_969*sl%4EME<~8aGd@2DyiNZ+1f?Ichi=#x_o||n)eES;yL)%)FAouI(*iHNIXGIMq5w7$ zd3d~K@GZ#wH`68VCGF59`2W7RC`~Qa`^@wL3jyIPu&o_8u)UtEhb>>@wgHG6wy9tv zxitv&=3Pbfwjf}iF96AO0QJN6D{Or11_JhX1AdY81o_ z4HyL5DH-}23{rsgfD$znEf~ZO`v7Q4zyEA zK}fC;j14`B29d%nV7~w?G~c_iAT3M))p!Bozp*gB)ov66XeR)Bu5tXM4)g^fIKqF} zz*c*JKbVzIFe@t}kOXmJC{_%J7KU-f0GNk3fH6WHW8gf07)B%o=o3N9Vu06T0lXm? zrYsA?AZ`z_pbsNJgfN`qC4fsl{DTug&0fN7IKuFc3O6<~UxFxM+$I<%p?t%2RVIO6 z|KVc40&s548{Axz3~HD0r#}8~N1!vnrgL^E2nhVQveVVMVMprFLu=0KYbf|hf2%8QzD9{hp?=^7{5XdRv z$Jaj^1tCSy_*nSN9*YHhN!!D;=^^osc#v3ov>OYsH2LBHp%$<$BV0%aeHjOjFdZi7 zb@@kt3&D3qg?7fmg%>d4lK_~I4pI?_2c?Ju5yQ-x#sdPEz<&fJe>K`*g6Q}g0rWf` zek@Wa0AL6N&hCUzacim|0-LtM_B@AeeVL|~Ijv;+9+)u~Kt=BVlN-<%grq~^raBWq ztT&SjX-J(|0ieG454AT9MkRx)fkBv1)c9YM*j`=77Aj4Ve>G|V-Uc&{+$f^W69ZF)=T`U^6E|@Lr-5j1 zs(x!%*jvn#Nf;9qzDX>!CKjGdZW`dVdcyn^9)?{AFXPY2P#k~B;Q zii!)J0zN{M(*HQD9-XXi1;T;=LoIU4A=`%=?Spg>Crq0v1F$Ia5t28@_rK+bH}v!1 zGhi(50b_Z4aSdODgsf9Rt6^Gz_86>JSp5gXgyLty*KPJpKp^@B5HLV(GvO;{01Ttp z05C2nW#*qX>X3&4F9>kO1Gu_91;#glpeP}loA^-5EO`3tS%8Ja9T*O^%mUHh)b>m> z5k&+@^#{;y2OGM7!)(cdujHR#+DL~t7(q6O43+?AHViwy!5;m=0$^C@j~nc5Hhe%P zVVK?74Q81G9Q%Yh@I{I}2M{P;{3E!jN)Uj7ybuu~Q>RSOt{iwpKEgmYWEe;R#n1gy zrd$C0iVg=YbKz%;XE3l53l8#OA!0&1a^d-p!X!G_a0zlAhys=ZT^<0E;={pIJVb*3 z6_;W{h&Ue`0RaoRVq&;83x)`x?yo^a&|*ND{??|tz*yW~7s}~iRAT699*{9`-GcKP z$XJI74obZS5#H$IY3CUo1CwnJXw0`<*|Nf@0ynG{0~Cu5fU)`?Rt5)*MFCv|{<)!E z7Z$n=0<>PBvD`A)!wskM<^%Nt0#eQg0vh9kgX(;USkRaGK)nD-I!v-C0Fw|yM}e(= zVc-f3JiP}^C;&i$0ua%SyVhBUtUzFESwEoB-EyZY0;d`l{E6)KI02b8P$mnY0fqhh zQxJlx45PBbyfha8UUJposyhY15deU{VIYqdEFL1*e!(O+uCIol&h!Jey8csoUR^lV z51_*I;|c+NE<-p7>?2G80~cW6kqI2cE&>tX7?r)e{A37}P6ueWgG8}_Q-jSB(V)gf z@JiVg0Y)HJa0#vzAj$nBse(xstf5xLK)HY|h~Y8+Z}VXU1lqq9fUWlBb}%X#l)Ly3 zwSgz0*BD4m??34oI>D&yuq0xN0WaIGa4+qE{!J3-F1?&cfZ8u03C3Gqf;|3G(V%!G ze_Tm0eMfEwxK01zcX|IGzQsR$k3_9|#sF6jXq>m~xBLAczO)~3P<55SD>YsML~0Rm zBTgy(z>A$w`e($*`owfPfIymo z#&pXDaWtG7_Z*QBI#vje;|ykm=p|ed8-qv+l`4Zv)XD&fWgJ`*RQ4ytyU7AiPXN;g zK)Zc_Q$XO<0e}h%ZwaRVFa-{FB_pEWI(GturY7Kw(+ia;2TmctN9S^YZ=404DhFmr zPWhh&L8XzIR|6=AGSF_XJ)U_mD&NfrPdeKwK>$W9&~6`gh=ni~B~-KmL>{!^chH!wai)E=P1A^}$d{s`;g^{J@@P9y+01Op|S;o!v|CVmwFnzqA1nJRdB z4PhYbI2^Q?LBzbn>*iwne=oaW>oGds^ZpVblzgDE-U|P0@~ zmlX<}3hdHN0NnzN+(hzs3vYmbd&ah+|K(%xyZrx#%NM%>EDz|(0PXeyfR7E=jln{~ zga*HX2ORqb2sjQ8E^#A7LWSbvA>saexIV*JKM4P_2yb11!e&XLfrr*UklGe-HGli? zAt!~aJ$?%xAn;qjmK+%zta%IE0|S$G5(auv{sl3hn04?uPG1K|f@t89b7~}fC`Tnc zbXS<w?4t@~5!j>ft;e<1fF;D+_~=|++nPTi`5AIHC7`g?3}khdO0Ob1Kk?=I`W zbiX}Ty-=%q5dRG+5O0!61#ki@^z9qwv5)N1Z z1MT*7Ul)R_SqLGaL(LoD`8qWK26IHxFiUe#W(pTC3_-E0Zv5!6X|DYO(XooIS8F0K|JgmNo5*lCS~B4GdjJwz}1u0vpp4D6(I`v&!a&0l5g ze+?P53ub-B?k@oa`m+VTj^nff5^M)3S1X8}0rr3)a&~mI2RIm|fE$t9OE$G55;VdA zi4B_33XC^!&0Y%Vf*75Upm`y{HLr9V2o+l9h(rXv_#;Pe1LWPV|C2M_c%ax!B4_}P zFcsW?KNdpr{2vz;`oiOnts5=pFlRGzAZbt3e?JC7^Z&nEaelyI{!aw-?Z7$S5t`Qy z;)GrWAmKsrJ3-ht=E_w>W`lt=5!5+NYG z52NzfRib3RM7%6;7 zD18t7p|N=npqWqt(`19vmjEZ4(w;xze`zsq^a5g%17f=UxTv@s#;1fH^nj>t!nc1K zr{)gKIc|o3KN+;F{7XfFD)s*1bMRU{_|AT6($MWflJEwfSJ|U z2VCUA#^HbaTmJh{@ZI~%r-V}V!+mh{1D0%m!zE_@@aHW-Ft7>{n(z*oCbWpa6$fml z-CDZdyGMj*nn02Q8y&zC~HgGIS8Rl#ty`=G91@rXd<;*IGLaD6fx{Eq6sziWR jqIQP@YMG}?)-X#?H#o)2!S{*b6N9lY1H*dIAQb}u=l&{j delta 37012 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%0D)`J-sq*YgRS0gP} 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 NhJ<7i0Hzq}{{cC(GeiIY diff --git a/diylc/diylc-library/src/org/diylc/components/chassis/ChassisPanel.java b/diylc/diylc-library/src/org/diylc/components/chassis/ChassisPanel.java index a43098c3..bf351d5e 100644 --- a/diylc/diylc-library/src/org/diylc/components/chassis/ChassisPanel.java +++ b/diylc/diylc-library/src/org/diylc/components/chassis/ChassisPanel.java @@ -38,7 +38,7 @@ import org.diylc.core.annotations.EditableProperty; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; -@ComponentDescriptor(name = "Chassis Panel", author = "Branislav Stojkovic", category = "Electromechanical", +@ComponentDescriptor(name = "Chassis Panel", author = "Branislav Stojkovic", category = "Electro-Mechanical", instanceNamePrefix = "CP", description = "One side of a chassis, with or withouth rounded edges", zOrder = IDIYComponent.CHASSIS, bomPolicy = BomPolicy.SHOW_ONLY_TYPE_NAME, autoEdit = false, transformer = SimpleComponentTransformer.class) diff --git a/diylc/diylc-library/src/org/diylc/components/chassis/EllipticalCutout.java b/diylc/diylc-library/src/org/diylc/components/chassis/EllipticalCutout.java index d1521142..c1ec859e 100644 --- a/diylc/diylc-library/src/org/diylc/components/chassis/EllipticalCutout.java +++ b/diylc/diylc-library/src/org/diylc/components/chassis/EllipticalCutout.java @@ -1,75 +1,75 @@ -/* - * - * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. - * - * This file is part of DIYLC. - * - * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU - * General Public License as published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with DIYLC. If not, see - * . - */ -package org.diylc.components.chassis; - -import java.awt.AlphaComposite; -import java.awt.Composite; -import java.awt.Graphics2D; - -import org.diylc.common.ObjectCache; -import org.diylc.common.SimpleComponentTransformer; -import org.diylc.components.shapes.AbstractShape; -import org.diylc.core.ComponentState; -import org.diylc.core.IDIYComponent; -import org.diylc.core.IDrawingObserver; -import org.diylc.core.Project; -import org.diylc.core.annotations.BomPolicy; -import org.diylc.core.annotations.ComponentDescriptor; - -@ComponentDescriptor(name = "Elliptical Cutout", author = "Branislav Stojkovic", category = "Electromechanical", - instanceNamePrefix = "ELC", description = "Elliptical chassis cutout", zOrder = IDIYComponent.CHASSIS + 0.1, - bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class) -public class EllipticalCutout extends AbstractShape { - - private static final long serialVersionUID = 1L; - - public EllipticalCutout() { - this.borderColor = LIGHT_METAL_COLOR.darker(); - } - - @Override - public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, - IDrawingObserver drawingObserver) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); - - if (componentState != ComponentState.DRAGGING) { - Composite oldComposite = g2d.getComposite(); - if (alpha < MAX_ALPHA) { - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); - } - g2d.setColor(color); - g2d.fillOval(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y); - g2d.setComposite(oldComposite); - } - // Do not track any changes that follow because the whole oval has been - // tracked so far. - drawingObserver.stopTracking(); - g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : borderColor); - g2d.drawOval(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y); - } - - @Override - public void drawIcon(Graphics2D g2d, int width, int height) { - int factor = 32 / width; - g2d.setColor(COLOR); - g2d.fillOval(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor); - g2d.setColor(LIGHT_METAL_COLOR.darker()); - g2d.drawOval(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor); - } -} +/* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +package org.diylc.components.chassis; + +import java.awt.AlphaComposite; +import java.awt.Composite; +import java.awt.Graphics2D; + +import org.diylc.common.ObjectCache; +import org.diylc.common.SimpleComponentTransformer; +import org.diylc.components.shapes.AbstractShape; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; + +@ComponentDescriptor(name = "Elliptical Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical", + instanceNamePrefix = "ELC", description = "Elliptical chassis cutout", zOrder = IDIYComponent.CHASSIS + 0.1, + bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class) +public class EllipticalCutout extends AbstractShape { + + private static final long serialVersionUID = 1L; + + public EllipticalCutout() { + this.borderColor = LIGHT_METAL_COLOR.darker(); + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); + + if (componentState != ComponentState.DRAGGING) { + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + g2d.setColor(color); + g2d.fillOval(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y); + g2d.setComposite(oldComposite); + } + // Do not track any changes that follow because the whole oval has been + // tracked so far. + drawingObserver.stopTracking(); + g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : borderColor); + g2d.drawOval(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int factor = 32 / width; + g2d.setColor(COLOR); + g2d.fillOval(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor); + g2d.setColor(LIGHT_METAL_COLOR.darker()); + g2d.drawOval(2 / factor, 2 / factor, width - 4 / factor, height - 4 / factor); + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/chassis/PolygonalCutout.java b/diylc/diylc-library/src/org/diylc/components/chassis/PolygonalCutout.java index 23dc1164..ea528b47 100644 --- a/diylc/diylc-library/src/org/diylc/components/chassis/PolygonalCutout.java +++ b/diylc/diylc-library/src/org/diylc/components/chassis/PolygonalCutout.java @@ -1,125 +1,125 @@ -/* - * - * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. - * - * This file is part of DIYLC. - * - * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU - * General Public License as published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with DIYLC. If not, see - * . - */ -package org.diylc.components.chassis; - -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Composite; -import java.awt.Graphics2D; -import java.awt.Point; -import java.util.Arrays; - -import org.diylc.common.ObjectCache; -import org.diylc.common.SimpleComponentTransformer; -import org.diylc.components.shapes.AbstractShape; -import org.diylc.core.ComponentState; -import org.diylc.core.IDIYComponent; -import org.diylc.core.IDrawingObserver; -import org.diylc.core.Project; -import org.diylc.core.annotations.BomPolicy; -import org.diylc.core.annotations.ComponentDescriptor; -import org.diylc.core.annotations.EditableProperty; - -@ComponentDescriptor(name = "Polygonal Cutout", author = "Branislav Stojkovic", category = "Electromechanical", - instanceNamePrefix = "POLYC", description = "Polygonal chassis cutout", zOrder = IDIYComponent.CHASSIS + 0.1, - bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class) -public class PolygonalCutout extends AbstractShape { - - private static final long serialVersionUID = 1L; - - protected PointCount pointCount = PointCount._4; - - public PolygonalCutout() { - super(); - this.borderColor = LIGHT_METAL_COLOR.darker(); - this.controlPoints = - new Point[] {new Point(0, 0), new Point(0, (int) DEFAULT_HEIGHT.convertToPixels()), - new Point((int) DEFAULT_WIDTH.convertToPixels(), (int) DEFAULT_HEIGHT.convertToPixels()), - new Point((int) DEFAULT_WIDTH.convertToPixels(), 0)}; - } - - @Override - public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, - IDrawingObserver drawingObserver) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); - g2d.setColor(color); - int[] xPoints = new int[controlPoints.length]; - int[] yPoints = new int[controlPoints.length]; - for (int i = 0; i < controlPoints.length; i++) { - xPoints[i] = controlPoints[i].x; - yPoints[i] = controlPoints[i].y; - } - - Composite oldComposite = g2d.getComposite(); - if (this.alpha < MAX_ALPHA) { - g2d.setComposite(AlphaComposite.getInstance(3, 1.0F * this.alpha / MAX_ALPHA)); - } - g2d.fillPolygon(xPoints, yPoints, controlPoints.length); - g2d.setComposite(oldComposite); - - // Do not track any changes that follow because the whole board has been - // tracked so far. - drawingObserver.stopTracking(); - Color lineColor = - componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : borderColor; - g2d.setColor(lineColor); - g2d.drawPolygon(xPoints, yPoints, controlPoints.length); - } - - @EditableProperty(name = "Edges") - public PointCount getPointCount() { - return pointCount; - } - - public void setPointCount(PointCount pointCount) { - if (this.pointCount == pointCount) - return; - int oldPointCount = Integer.parseInt(this.pointCount.toString()); - int newPointCount = Integer.parseInt(pointCount.toString()); - this.controlPoints = Arrays.copyOf(this.controlPoints, newPointCount); - if (oldPointCount < newPointCount) { - this.controlPoints[newPointCount - 1] = this.controlPoints[oldPointCount - 1]; - for (int i = oldPointCount - 1; i < newPointCount - 1; i++) { - this.controlPoints[i] = - new Point((this.controlPoints[i - 1].x + this.controlPoints[newPointCount - 1].x) / 2, - (this.controlPoints[i - 1].y + this.controlPoints[newPointCount - 1].y) / 2); - } - } - this.pointCount = pointCount; - } - - @Override - public void drawIcon(Graphics2D g2d, int width, int height) { - int factor = 32 / width; - g2d.setColor(COLOR); - int[] x = {2 / factor, width - 2 / factor, width - 4 / factor, 3 / factor}; - int[] y = {4 / factor, 2 / factor, height - 5 / factor, height - 2 / factor}; - g2d.fillPolygon(x, y, 4); - g2d.setColor(LIGHT_METAL_COLOR.darker()); - g2d.drawPolygon(x, y, 4); - } - - public enum PointCount { - _3, _4, _5, _6, _7, _8; - - public String toString() { - return name().substring(1); - }; - } -} +/* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +package org.diylc.components.chassis; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.Graphics2D; +import java.awt.Point; +import java.util.Arrays; + +import org.diylc.common.ObjectCache; +import org.diylc.common.SimpleComponentTransformer; +import org.diylc.components.shapes.AbstractShape; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; + +@ComponentDescriptor(name = "Polygonal Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical", + instanceNamePrefix = "POLYC", description = "Polygonal chassis cutout", zOrder = IDIYComponent.CHASSIS + 0.1, + bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, transformer = SimpleComponentTransformer.class) +public class PolygonalCutout extends AbstractShape { + + private static final long serialVersionUID = 1L; + + protected PointCount pointCount = PointCount._4; + + public PolygonalCutout() { + super(); + this.borderColor = LIGHT_METAL_COLOR.darker(); + this.controlPoints = + new Point[] {new Point(0, 0), new Point(0, (int) DEFAULT_HEIGHT.convertToPixels()), + new Point((int) DEFAULT_WIDTH.convertToPixels(), (int) DEFAULT_HEIGHT.convertToPixels()), + new Point((int) DEFAULT_WIDTH.convertToPixels(), 0)}; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); + g2d.setColor(color); + int[] xPoints = new int[controlPoints.length]; + int[] yPoints = new int[controlPoints.length]; + for (int i = 0; i < controlPoints.length; i++) { + xPoints[i] = controlPoints[i].x; + yPoints[i] = controlPoints[i].y; + } + + Composite oldComposite = g2d.getComposite(); + if (this.alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(3, 1.0F * this.alpha / MAX_ALPHA)); + } + g2d.fillPolygon(xPoints, yPoints, controlPoints.length); + g2d.setComposite(oldComposite); + + // Do not track any changes that follow because the whole board has been + // tracked so far. + drawingObserver.stopTracking(); + Color lineColor = + componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : borderColor; + g2d.setColor(lineColor); + g2d.drawPolygon(xPoints, yPoints, controlPoints.length); + } + + @EditableProperty(name = "Edges") + public PointCount getPointCount() { + return pointCount; + } + + public void setPointCount(PointCount pointCount) { + if (this.pointCount == pointCount) + return; + int oldPointCount = Integer.parseInt(this.pointCount.toString()); + int newPointCount = Integer.parseInt(pointCount.toString()); + this.controlPoints = Arrays.copyOf(this.controlPoints, newPointCount); + if (oldPointCount < newPointCount) { + this.controlPoints[newPointCount - 1] = this.controlPoints[oldPointCount - 1]; + for (int i = oldPointCount - 1; i < newPointCount - 1; i++) { + this.controlPoints[i] = + new Point((this.controlPoints[i - 1].x + this.controlPoints[newPointCount - 1].x) / 2, + (this.controlPoints[i - 1].y + this.controlPoints[newPointCount - 1].y) / 2); + } + } + this.pointCount = pointCount; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int factor = 32 / width; + g2d.setColor(COLOR); + int[] x = {2 / factor, width - 2 / factor, width - 4 / factor, 3 / factor}; + int[] y = {4 / factor, 2 / factor, height - 5 / factor, height - 2 / factor}; + g2d.fillPolygon(x, y, 4); + g2d.setColor(LIGHT_METAL_COLOR.darker()); + g2d.drawPolygon(x, y, 4); + } + + public enum PointCount { + _3, _4, _5, _6, _7, _8; + + public String toString() { + return name().substring(1); + }; + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/chassis/RectangularCutout.java b/diylc/diylc-library/src/org/diylc/components/chassis/RectangularCutout.java index 310acfc1..2901f55a 100644 --- a/diylc/diylc-library/src/org/diylc/components/chassis/RectangularCutout.java +++ b/diylc/diylc-library/src/org/diylc/components/chassis/RectangularCutout.java @@ -1,92 +1,92 @@ -/* - * - * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. - * - * This file is part of DIYLC. - * - * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU - * General Public License as published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with DIYLC. If not, see - * . - */ -package org.diylc.components.chassis; - -import java.awt.AlphaComposite; -import java.awt.Composite; -import java.awt.Graphics2D; - -import org.diylc.common.ObjectCache; -import org.diylc.common.SimpleComponentTransformer; -import org.diylc.components.shapes.AbstractShape; -import org.diylc.core.ComponentState; -import org.diylc.core.IDIYComponent; -import org.diylc.core.IDrawingObserver; -import org.diylc.core.Project; -import org.diylc.core.annotations.BomPolicy; -import org.diylc.core.annotations.ComponentDescriptor; -import org.diylc.core.annotations.EditableProperty; -import org.diylc.core.measures.Size; -import org.diylc.core.measures.SizeUnit; - -@ComponentDescriptor(name = "Rectangular Cutout", author = "Branislav Stojkovic", category = "Electromechanical", - instanceNamePrefix = "RECTC", description = "Rectangular chassis cutout, with or without rounded edges", - zOrder = IDIYComponent.CHASSIS + 0.1, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, - transformer = SimpleComponentTransformer.class) -public class RectangularCutout extends AbstractShape { - - private static final long serialVersionUID = 1L; - - protected Size edgeRadius = new Size(0d, SizeUnit.mm); - - public RectangularCutout() { - this.borderColor = LIGHT_METAL_COLOR.darker(); - } - - @Override - public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, - IDrawingObserver drawingObserver) { - g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); - int radius = (int) edgeRadius.convertToPixels(); - if (componentState != ComponentState.DRAGGING) { - Composite oldComposite = g2d.getComposite(); - if (alpha < MAX_ALPHA) { - g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); - } - g2d.setColor(color); - g2d.fillRoundRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y, radius, - radius); - g2d.setComposite(oldComposite); - } - // Do not track any changes that follow because the whole rect has been - // tracked so far. - drawingObserver.stopTracking(); - g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR - : borderColor); - g2d.drawRoundRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y, radius, - radius); - } - - @EditableProperty(name = "Radius") - public Size getEdgeRadius() { - return edgeRadius; - } - - public void setEdgeRadius(Size edgeRadius) { - this.edgeRadius = edgeRadius; - } - - @Override - public void drawIcon(Graphics2D g2d, int width, int height) { - int factor = 32 / width; - g2d.setColor(COLOR); - g2d.fillRect(2 / factor, 4 / factor, width - 4 / factor, height - 8 / factor); - g2d.setColor(LIGHT_METAL_COLOR.darker()); - g2d.drawRect(2 / factor, 4 / factor, width - 4 / factor, height - 8 / factor); - } -} +/* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +package org.diylc.components.chassis; + +import java.awt.AlphaComposite; +import java.awt.Composite; +import java.awt.Graphics2D; + +import org.diylc.common.ObjectCache; +import org.diylc.common.SimpleComponentTransformer; +import org.diylc.components.shapes.AbstractShape; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.annotations.BomPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; + +@ComponentDescriptor(name = "Rectangular Cutout", author = "Branislav Stojkovic", category = "Electro-Mechanical", + instanceNamePrefix = "RECTC", description = "Rectangular chassis cutout, with or without rounded edges", + zOrder = IDIYComponent.CHASSIS + 0.1, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, + transformer = SimpleComponentTransformer.class) +public class RectangularCutout extends AbstractShape { + + private static final long serialVersionUID = 1L; + + protected Size edgeRadius = new Size(0d, SizeUnit.mm); + + public RectangularCutout() { + this.borderColor = LIGHT_METAL_COLOR.darker(); + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke((int) borderThickness.convertToPixels())); + int radius = (int) edgeRadius.convertToPixels(); + if (componentState != ComponentState.DRAGGING) { + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + g2d.setColor(color); + g2d.fillRoundRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y, radius, + radius); + g2d.setComposite(oldComposite); + } + // Do not track any changes that follow because the whole rect has been + // tracked so far. + drawingObserver.stopTracking(); + g2d.setColor(componentState == ComponentState.SELECTED || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : borderColor); + g2d.drawRoundRect(firstPoint.x, firstPoint.y, secondPoint.x - firstPoint.x, secondPoint.y - firstPoint.y, radius, + radius); + } + + @EditableProperty(name = "Radius") + public Size getEdgeRadius() { + return edgeRadius; + } + + public void setEdgeRadius(Size edgeRadius) { + this.edgeRadius = edgeRadius; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int factor = 32 / width; + g2d.setColor(COLOR); + g2d.fillRect(2 / factor, 4 / factor, width - 4 / factor, height - 8 / factor); + g2d.setColor(LIGHT_METAL_COLOR.darker()); + g2d.drawRect(2 / factor, 4 / factor, width - 4 / factor, height - 8 / factor); + } +} diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/BatterySnap9V.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/BatterySnap9V.java index 2e92e54c..618c27a2 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/BatterySnap9V.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/BatterySnap9V.java @@ -51,7 +51,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "9V Battery Snap", category = "Electromechanical", author = "Branislav Stojkovic", +@ComponentDescriptor(name = "9V Battery Snap", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "BTR", autoEdit = false, transformer = BatterySnapTransformer.class) public class BatterySnap9V extends AbstractTransparentComponent { diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java index 528aef9c..cab17aef 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/CliffJack1_4.java @@ -53,7 +53,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "Cliff 1/4\" Jack", category = "Electromechanical", author = "Branislav Stojkovic", +@ComponentDescriptor(name = "Cliff 1/4\" Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Cliff-style closed panel mount 1/4\" phono jack", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", autoEdit = false, transformer = CliffJackTransformer.class) public class CliffJack1_4 extends AbstractTransparentComponent { diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java index 59f6ef86..8702a4a3 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/ClosedJack1_4.java @@ -53,7 +53,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "Closed 1/4\" Jack", category = "Electromechanical", author = "Branislav Stojkovic", +@ComponentDescriptor(name = "Closed 1/4\" Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Enclosed panel mount 1/4\" phono jack", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", autoEdit = false, transformer = ClosedJackTransformer.class) public class ClosedJack1_4 extends AbstractTransparentComponent { diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java index 25aafa23..aac507a4 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniRelay.java @@ -52,7 +52,7 @@ import org.diylc.core.measures.Voltage; import org.diylc.core.measures.VoltageUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "Mini Relay", author = "Branislav Stojkovic", category = "Electromechanical", +@ComponentDescriptor(name = "Mini Relay", author = "Branislav Stojkovic", category = "Electro-Mechanical", instanceNamePrefix = "RY", description = "Miniature PCB mount relay, like Omron G5V-1 or G5V-2", stretchable = false, zOrder = IDIYComponent.COMPONENT) public class MiniRelay extends AbstractTransparentComponent { diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniToggleSwitch.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniToggleSwitch.java index dd77418a..5a806f6d 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniToggleSwitch.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/MiniToggleSwitch.java @@ -48,7 +48,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "Mini Toggle Switch", category = "Electromechanical", author = "Branislav Stojkovic", +@ComponentDescriptor(name = "Mini Toggle Switch", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Panel mounted mini toggle switch", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "SW", autoEdit = false) public class MiniToggleSwitch extends AbstractTransparentComponent { diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_4.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_4.java index b2c5af2a..96dec254 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_4.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/OpenJack1_4.java @@ -51,7 +51,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "Open 1/4\" Jack", category = "Electromechanical", author = "Branislav Stojkovic", +@ComponentDescriptor(name = "Open 1/4\" Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Switchcraft-style open panel mount 1/4\" phono jack, stereo and mono", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J") public class OpenJack1_4 extends AbstractTransparentComponent { diff --git a/diylc/diylc-library/src/org/diylc/components/electromechanical/PlasticDCJack.java b/diylc/diylc-library/src/org/diylc/components/electromechanical/PlasticDCJack.java index 1b1589fd..6f720cb2 100644 --- a/diylc/diylc-library/src/org/diylc/components/electromechanical/PlasticDCJack.java +++ b/diylc/diylc-library/src/org/diylc/components/electromechanical/PlasticDCJack.java @@ -49,7 +49,7 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@ComponentDescriptor(name = "Plastic DC Jack", category = "Electromechanical", author = "Branislav Stojkovic", +@ComponentDescriptor(name = "Plastic DC Jack", category = "Electro-Mechanical", author = "Branislav Stojkovic", description = "Panel mount plastic DC jack", stretchable = false, zOrder = IDIYComponent.COMPONENT, instanceNamePrefix = "J", autoEdit = false) public class PlasticDCJack extends AbstractTransparentComponent { diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java index b83f4b11..ebaa3c8d 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/DIL_IC.java @@ -134,7 +134,7 @@ public class DIL_IC extends AbstractTransparentComponent { body = null; } - @EditableProperty(name = "Pin spacing") + @EditableProperty(name = "Pin Spacing") public Size getPinSpacing() { return pinSpacing; } @@ -146,7 +146,7 @@ public class DIL_IC extends AbstractTransparentComponent { body = null; } - @EditableProperty(name = "Row spacing") + @EditableProperty(name = "Row Spacing") public Size getRowSpacing() { return rowSpacing; } @@ -527,7 +527,7 @@ public class DIL_IC extends AbstractTransparentComponent { this.indentColor = indentColor; } - @EditableProperty(name = "Display pin numbers") + @EditableProperty(name = "Display Pin #s") public DisplayNumbers getDisplayNumbers() { return displayNumbers; } diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/SIL_IC.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/SIL_IC.java index 816890bc..b89ad001 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/SIL_IC.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/SIL_IC.java @@ -131,7 +131,7 @@ public class SIL_IC extends AbstractTransparentComponent { body = null; } - @EditableProperty(name = "Pin spacing") + @EditableProperty(name = "Pin Spacing") public Size getPinSpacing() { return pinSpacing; } diff --git a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java index 9501a2c4..ae2a4c68 100644 --- a/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java +++ b/diylc/diylc-library/src/org/diylc/components/semiconductors/TransistorTO220.java @@ -463,7 +463,7 @@ public class TransistorTO220 extends AbstractTransparentComponent { this.body = null; } - @EditableProperty(name = "Lead length") + @EditableProperty(name = "Lead Length") public Size getLeadLength() { if (leadLength == null) { leadLength = LEAD_LENGTH; @@ -477,7 +477,7 @@ public class TransistorTO220 extends AbstractTransparentComponent { this.body = null; } - @EditableProperty(name = "Tab border") + @EditableProperty(name = "Tab Border") public Color getTabBorderColor() { return tabBorderColor; } diff --git a/diylc/diylc-library/src/org/diylc/components/tube/SubminiTube.java b/diylc/diylc-library/src/org/diylc/components/tube/SubminiTube.java new file mode 100644 index 00000000..629941cd --- /dev/null +++ b/diylc/diylc-library/src/org/diylc/components/tube/SubminiTube.java @@ -0,0 +1,623 @@ +/* + + DIY Layout Creator (DIYLC). + Copyright (c) 2009-2018 held jointly by the individual authors. + + This file is part of DIYLC. + + DIYLC is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DIYLC is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DIYLC. If not, see . + + */ +package org.diylc.components.tube; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Composite; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.Shape; +import java.awt.geom.Area; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; + +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.Display; +import org.diylc.common.IPlugInPort; +import org.diylc.common.ObjectCache; +import org.diylc.common.Orientation; +import org.diylc.components.AbstractTransparentComponent; +import org.diylc.components.transform.TO220Transformer; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.Theme; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.annotations.KeywordPolicy; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +//@ComponentDescriptor(name = "Sub-Mini Tube", author = "Branislav Stojkovic", category = "Tubes", instanceNamePrefix = "V", description = "Sub-miniature (pencil) vacuum tube", stretchable = false, zOrder = IDIYComponent.COMPONENT, keywordPolicy = KeywordPolicy.SHOW_VALUE, transformer = TO220Transformer.class) +public class SubminiTube extends AbstractTransparentComponent { + + private static final long serialVersionUID = 1L; + + public static Color BODY_COLOR = Color.lightGray; + public static Color BORDER_COLOR = Color.gray; + public static Color PIN_COLOR = Color.decode("#00B2EE"); + public static Color PIN_BORDER_COLOR = PIN_COLOR.darker(); + public static Color LABEL_COLOR = Color.white; + public static Size PIN_SIZE = new Size(0.03d, SizeUnit.in); + public static Size PIN_SPACING = new Size(0.1d, SizeUnit.in); + public static Size BODY_WIDTH = new Size(0.4d, SizeUnit.in); + public static Size BODY_THICKNESS = new Size(4.5d, SizeUnit.mm); + public static Size BODY_HEIGHT = new Size(9d, SizeUnit.mm); + public static Size DIAMETER = new Size(0.4d, SizeUnit.in); + public static Size LENGTH = new Size(1.375d, SizeUnit.in); + public static Size LEAD_LENGTH = new Size(0.2d, SizeUnit.in); + public static Size LEAD_THICKNESS = new Size(0.8d, SizeUnit.mm); + + private String value = ""; + private Orientation orientation = Orientation.DEFAULT; + private Point[] controlPoints = new Point[] { new Point(0, 0), + new Point(0, 0), new Point(0, 0) }; + transient private Shape[] body; + private Color bodyColor = BODY_COLOR; + private Color borderColor = BORDER_COLOR; + private Display display = Display.NAME; + private boolean folded = false; + private Size leadLength = LEAD_LENGTH; + private PinArrangement leadArrangement = PinArrangement.Circular; + private boolean topLead = false; + private Size diameter = DIAMETER; + private Size length = LENGTH; + private PinCount pinCount = PinCount._8; + private Size leadSpacing = PIN_SPACING; + + public SubminiTube() { + super(); + updateControlPoints(); + } + + @EditableProperty + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @EditableProperty + public Orientation getOrientation() { + return orientation; + } + + public void setOrientation(Orientation orientation) { + this.orientation = orientation; + updateControlPoints(); + // Reset body shape; + body = null; + } + + @Override + public int getControlPointCount() { + return controlPoints.length; + } + + @Override + public Point getControlPoint(int index) { + return controlPoints[index]; + } + + @Override + public boolean isControlPointSticky(int index) { + return true; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + public void setControlPoint(Point point, int index) { + controlPoints[index].setLocation(point); + body = null; + } + + private void updateControlPoints() { + int pinSpacing = (int) PIN_SPACING.convertToPixels(); + // Update control points. + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int newPointCount = getPinCount().getValue(); + // Need a new array + if (newPointCount != controlPoints.length) { + controlPoints = new Point[newPointCount]; + for (int i = 0; i < controlPoints.length; i++) { + controlPoints[i] = new Point(x, y); + } + } + int dx; + int dy; + if (folded) { + switch (orientation) { + case DEFAULT: + dx = 0; + dy = pinSpacing; + break; + case _90: + dx = -pinSpacing; + dy = 0; + break; + case _180: + dx = 0; + dy = -pinSpacing; + break; + case _270: + dx = pinSpacing; + dy = 0; + break; + default: + throw new RuntimeException("Unexpected orientation: " + + orientation); + } + for (int i = 1; i < controlPoints.length; i++) { + controlPoints[i].setLocation(controlPoints[0].x + i * dx, controlPoints[0].y + i * dy); + } + } else { + switch (orientation) { + case DEFAULT: + controlPoints[1].setLocation(x, y + pinSpacing); + controlPoints[2].setLocation(x, y + 2 * pinSpacing); + break; + case _90: + controlPoints[1].setLocation(x - pinSpacing, y); + controlPoints[2].setLocation(x - 2 * pinSpacing, y); + break; + case _180: + controlPoints[1].setLocation(x, y - pinSpacing); + controlPoints[2].setLocation(x, y - 2 * pinSpacing); + break; + case _270: + controlPoints[1].setLocation(x + pinSpacing, y); + controlPoints[2].setLocation(x + 2 * pinSpacing, y); + break; + default: + throw new RuntimeException("Unexpected orientation: " + + orientation); + } + } + } + + public Shape[] getBody() { + if (body == null) { + body = new Shape[2]; + int x = controlPoints[0].x; + int y = controlPoints[0].y; + int pinSpacing = (int) PIN_SPACING.convertToPixels(); + int bodyWidth = getClosestOdd(BODY_WIDTH.convertToPixels()); + int bodyThickness = getClosestOdd(BODY_THICKNESS.convertToPixels()); + int bodyHeight = getClosestOdd(BODY_HEIGHT.convertToPixels()); + int tabThickness = 0; // (int) TAB_THICKNESS.convertToPixels(); + int tabHeight = 0;// (int) TAB_HEIGHT.convertToPixels(); + int tabHoleDiameter = 0;// (int) + // TAB_HOLE_DIAMETER.convertToPixels(); + double leadLength = getLeadLength().convertToPixels(); + + switch (orientation) { + case DEFAULT: + if (folded) { + body[0] = new Rectangle2D.Double(x + leadLength, y + + pinSpacing - bodyWidth / 2, bodyHeight, bodyWidth); + body[1] = new Area(new Rectangle2D.Double(x + leadLength + + bodyHeight, y + pinSpacing - bodyWidth / 2, + tabHeight, bodyWidth)); + ((Area) body[1]).subtract(new Area(new Ellipse2D.Double(x + + leadLength + bodyHeight + tabHeight / 2 + - tabHoleDiameter / 2, y + pinSpacing + - tabHoleDiameter / 2, tabHoleDiameter, + tabHoleDiameter))); + } else { + body[0] = new Rectangle2D.Double(x - bodyThickness / 2, y + + pinSpacing - bodyWidth / 2, bodyThickness, + bodyWidth); + body[1] = new Rectangle2D.Double(x + bodyThickness / 2 + - tabThickness, y + pinSpacing - bodyWidth / 2, + tabThickness, bodyWidth); + } + break; + case _90: + if (folded) { + body[0] = new Rectangle2D.Double(x - pinSpacing - bodyWidth + / 2, y + leadLength, bodyWidth, bodyHeight); + body[1] = new Area(new Rectangle2D.Double(x - pinSpacing + - bodyWidth / 2, y + leadLength + bodyHeight, + bodyWidth, tabHeight)); + ((Area) body[1]).subtract(new Area(new Ellipse2D.Double(x + - pinSpacing - tabHoleDiameter / 2, y + leadLength + + bodyHeight + tabHeight / 2 - tabHoleDiameter / 2, + tabHoleDiameter, tabHoleDiameter))); + } else { + body[0] = new Rectangle2D.Double(x - pinSpacing - bodyWidth + / 2, y - bodyThickness / 2, bodyWidth, + bodyThickness); + body[1] = new Rectangle2D.Double(x - pinSpacing - bodyWidth + / 2, y + bodyThickness / 2 - tabThickness, + bodyWidth, tabThickness); + } + break; + case _180: + if (folded) { + body[0] = new Rectangle2D.Double(x - leadLength + - bodyHeight, y - pinSpacing - bodyWidth / 2, + bodyHeight, bodyWidth); + body[1] = new Area(new Rectangle2D.Double(x - leadLength + - bodyHeight - tabHeight, y - pinSpacing + - bodyWidth / 2, tabHeight, bodyWidth)); + ((Area) body[1]).subtract(new Area(new Ellipse2D.Double(x + - leadLength - bodyHeight - tabHeight / 2 + - tabHoleDiameter / 2, y - pinSpacing + - tabHoleDiameter / 2, tabHoleDiameter, + tabHoleDiameter))); + } else { + body[0] = new Rectangle2D.Double(x - bodyThickness / 2, y + - pinSpacing - bodyWidth / 2, bodyThickness, + bodyWidth); + body[1] = new Rectangle2D.Double(x - bodyThickness / 2, y + - pinSpacing - bodyWidth / 2, tabThickness, + bodyWidth); + } + break; + case _270: + if (folded) { + body[0] = new Rectangle2D.Double(x + pinSpacing - bodyWidth + / 2, y - leadLength - bodyHeight, bodyWidth, + bodyHeight); + body[1] = new Area(new Rectangle2D.Double(x + pinSpacing + - bodyWidth / 2, y - leadLength - bodyHeight + - tabHeight, bodyWidth, tabHeight)); + ((Area) body[1]).subtract(new Area(new Ellipse2D.Double(x + + pinSpacing - tabHoleDiameter / 2, y - leadLength + - bodyHeight - tabHeight / 2 - tabHoleDiameter / 2, + tabHoleDiameter, tabHoleDiameter))); + } else { + body[0] = new Rectangle2D.Double(x + pinSpacing - bodyWidth + / 2, y - bodyThickness / 2, bodyWidth, + bodyThickness); + body[1] = new Rectangle2D.Double(x + pinSpacing - bodyWidth + / 2, y - bodyThickness / 2, bodyWidth, tabThickness); + } + break; + default: + throw new RuntimeException("Unexpected orientation: " + + orientation); + } + } + return body; + } + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, + boolean outlineMode, Project project, + IDrawingObserver drawingObserver) { + if (checkPointsClipped(g2d.getClip())) { + return; + } + int pinSize = (int) PIN_SIZE.convertToPixels() / 2 * 2; + Shape mainArea = getBody()[0]; + Shape tabArea = getBody()[1]; + Composite oldComposite = g2d.getComposite(); + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance( + AlphaComposite.SRC_OVER, 1f * alpha / MAX_ALPHA)); + } + g2d.setColor(outlineMode ? Constants.TRANSPARENT_COLOR : bodyColor); + g2d.fill(mainArea); + + Theme theme = (Theme) ConfigurationManager.getInstance().readObject( + IPlugInPort.THEME_KEY, Constants.DEFAULT_THEME); + + // Draw pins. + + if (folded) { + int leadThickness = getClosestOdd(LEAD_THICKNESS.convertToPixels()); + int leadLength = (int) getLeadLength().convertToPixels(); + Color finalPinColor; + Color finalPinBorderColor; + if (outlineMode) { + finalPinColor = new Color(0, 0, 0, 0); + finalPinBorderColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? SELECTION_COLOR + : theme.getOutlineColor(); + } else { + finalPinColor = METAL_COLOR; + finalPinBorderColor = METAL_COLOR.darker(); + } + for (Point point : controlPoints) { + switch (orientation) { + case DEFAULT: + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( + leadThickness)); + g2d.setColor(finalPinBorderColor); + g2d.drawLine(point.x, point.y, point.x + leadLength + - leadThickness / 2, point.y); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( + leadThickness - 2)); + g2d.setColor(finalPinColor); + g2d.drawLine(point.x, point.y, point.x + leadLength + - leadThickness / 2, point.y); + break; + case _90: + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( + leadThickness)); + g2d.setColor(finalPinBorderColor); + g2d.drawLine(point.x, point.y, point.x, point.y + + leadLength - leadThickness / 2); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( + leadThickness - 2)); + g2d.setColor(finalPinColor); + g2d.drawLine(point.x, point.y, point.x, point.y + + leadLength - leadThickness / 2); + break; + case _180: + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( + leadThickness)); + g2d.setColor(finalPinBorderColor); + g2d.drawLine(point.x, point.y, point.x - leadLength + - leadThickness / 2, point.y); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( + leadThickness - 2)); + g2d.setColor(finalPinColor); + g2d.drawLine(point.x, point.y, point.x - leadLength + - leadThickness / 2, point.y); + break; + case _270: + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( + leadThickness)); + g2d.setColor(finalPinBorderColor); + g2d.drawLine(point.x, point.y, point.x, point.y + - leadLength); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke( + leadThickness - 2)); + g2d.setColor(finalPinColor); + g2d.drawLine(point.x, point.y, point.x, point.y + - leadLength); + break; + } + } + } else { + if (!outlineMode) { + for (Point point : controlPoints) { + + g2d.setColor(PIN_COLOR); + g2d.fillOval(point.x - pinSize / 2, point.y - pinSize / 2, + pinSize, pinSize); + g2d.setColor(outlineMode ? theme.getOutlineColor() + : PIN_BORDER_COLOR); + g2d.drawOval(point.x - pinSize / 2, point.y - pinSize / 2, + pinSize, pinSize); + } + } + } + + // Draw label. + g2d.setFont(project.getFont()); + Color finalLabelColor; + if (outlineMode) { + finalLabelColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : theme.getOutlineColor(); + } else { + finalLabelColor = componentState == ComponentState.SELECTED + || componentState == ComponentState.DRAGGING ? LABEL_COLOR_SELECTED + : LABEL_COLOR; + } + g2d.setColor(finalLabelColor); + String label = ""; + label = (getDisplay() == Display.NAME) ? getName() : getValue(); + if (getDisplay() == Display.NONE) { + label = ""; + } + if (getDisplay() == Display.BOTH) { + label = getName() + " " + + (getValue() == null ? "" : getValue().toString()); + } + FontMetrics fontMetrics = g2d.getFontMetrics(g2d.getFont()); + Rectangle2D rect = fontMetrics.getStringBounds(label, g2d); + int textHeight = (int) (rect.getHeight()); + int textWidth = (int) (rect.getWidth()); + // Center text horizontally and vertically + Rectangle bounds = mainArea.getBounds(); + int x = bounds.x + (bounds.width - textWidth) / 2; + int y = bounds.y + (bounds.height - textHeight) / 2 + + fontMetrics.getAscent(); + g2d.drawString(label, x, y); + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + int margin = 2 * width / 32; + int bodySize = width * 5 / 10; + int tabSize = bodySize * 6 / 10; + int holeSize = 5 * width / 32; + Area a = new Area(new Rectangle2D.Double((width - bodySize) / 2, + margin, bodySize, tabSize)); + a.subtract(new Area(new Ellipse2D.Double(width / 2 - holeSize / 2, + margin + tabSize / 2 - holeSize / 2, holeSize, holeSize))); + g2d.setColor(BORDER_COLOR); + g2d.draw(a); + g2d.setColor(BODY_COLOR); + g2d.fillRect((width - bodySize) / 2, margin + tabSize, bodySize, + bodySize); + g2d.setColor(BORDER_COLOR); + g2d.drawRect((width - bodySize) / 2, margin + tabSize, bodySize, + bodySize); + g2d.setColor(METAL_COLOR); + g2d.setStroke(ObjectCache.getInstance().fetchBasicStroke(2)); + g2d.drawLine(width / 2, margin + tabSize + bodySize, width / 2, height + - margin); + g2d.drawLine(width / 2 - bodySize / 3, margin + tabSize + bodySize, + width / 2 - bodySize / 3, height - margin); + g2d.drawLine(width / 2 + bodySize / 3, margin + tabSize + bodySize, + width / 2 + bodySize / 3, height - margin); + } + + @EditableProperty(name = "Body") + public Color getBodyColor() { + return bodyColor; + } + + public void setBodyColor(Color bodyColor) { + this.bodyColor = bodyColor; + } + + @EditableProperty(name = "Border") + public Color getBorderColor() { + return borderColor; + } + + public void setBorderColor(Color borderColor) { + this.borderColor = borderColor; + } + + @EditableProperty + public boolean getFolded() { + return folded; + } + + public void setFolded(boolean folded) { + this.folded = folded; + // Invalidate the body + this.body = null; + } + + @EditableProperty(name = "Lead Length") + public Size getLeadLength() { + if (leadLength == null) { + leadLength = LEAD_LENGTH; + } + return leadLength; + } + + public void setLeadLength(Size leadLength) { + this.leadLength = leadLength; + // Invalidate the body + this.body = null; + } + + @EditableProperty + public Display getDisplay() { + if (display == null) { + display = Display.NAME; + } + return display; + } + + public void setDisplay(Display display) { + this.display = display; + } + + @EditableProperty(name = "Pin Arrangement") + public PinArrangement getPinArrangement() { + return leadArrangement; + } + + public void setPinArrangement(PinArrangement pinArrangement) { + this.leadArrangement = pinArrangement; + } + + @EditableProperty(name = "Top Lead") + public boolean getTopLead() { + return topLead; + } + + public void setTopLead(boolean topLead) { + this.topLead = topLead; + updateControlPoints(); + } + + @EditableProperty + public Size getDiameter() { + return diameter; + } + + public void setDiameter(Size diameter) { + this.diameter = diameter; + updateControlPoints(); + } + + @EditableProperty + public Size getLength() { + return length; + } + + public void setLength(Size length) { + this.length = length; + } + + @EditableProperty(name = "Lead Count") + public PinCount getPinCount() { + return pinCount; + } + + public void setPinCount(PinCount pinCount) { + this.pinCount = pinCount; + updateControlPoints(); + } + + @EditableProperty(name = "Lead Spacing") + public Size getLeadSpacing() { + return leadSpacing; + } + + public void setLeadSpacing(Size leadSpacing) { + this.leadSpacing = leadSpacing; + updateControlPoints(); + } + + public static enum PinArrangement { + Inline("In-line"), Circular("Circular"); + + private String label; + + private PinArrangement(String label) { + this.label = label; + } + + @Override + public String toString() { + return label; + } + } + + public static enum PinCount { + _3, _4, _5, _6, _7, _8, _9, _10; + + @Override + public String toString() { + return name().replace("_", ""); + } + + public int getValue() { + return Integer.parseInt(toString()); + } + } +} diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 6e599bcfea0bf61d2cf7dec23a9b172b66209c33..5c31a81b4a2a30ed7848e01a8f5c2b2382076e32 100644 GIT binary patch delta 37709 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 delta 37012 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 delta 55016 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 LFag`@CjR$7J=RiX diff --git a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java index 204388b0..c30cd548 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -1,1280 +1,1280 @@ -/* - * - * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. - * - * This file is part of DIYLC. - * - * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU - * General Public License as published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with DIYLC. If not, see - * . - */ -package org.diylc.swing; - -import java.awt.Toolkit; -import java.awt.datatransfer.Clipboard; -import java.awt.datatransfer.ClipboardOwner; -import java.awt.event.ActionEvent; -import java.awt.event.KeyEvent; -import java.awt.print.PrinterException; -import java.io.File; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Set; - -import javax.swing.AbstractAction; -import javax.swing.JOptionPane; -import javax.swing.KeyStroke; - -import org.apache.log4j.Logger; -import org.diylc.appframework.miscutils.ConfigurationManager; -import org.diylc.common.IComponentTransformer; -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.Project; -import org.diylc.core.Theme; -import org.diylc.core.measures.Nudge; -import org.diylc.core.measures.Size; -import org.diylc.core.measures.SizeUnit; -import org.diylc.images.IconLoader; -import org.diylc.presenter.Presenter; -import org.diylc.swing.gui.DialogFactory; -import org.diylc.swing.gui.editor.PropertyEditorDialog; -import org.diylc.swing.plugins.config.ConfigPlugin; -import org.diylc.swing.plugins.edit.ComponentTransferable; -import org.diylc.swing.plugins.file.BomDialog; -import org.diylc.swing.plugins.file.FileFilterEnum; -import org.diylc.swingframework.ButtonDialog; -import org.diylc.swingframework.IDrawingProvider; -import org.diylc.swingframework.export.DrawingExporter; -import org.diylc.utils.BomEntry; - -public class ActionFactory { - - private static final Logger LOG = Logger.getLogger(ActionFactory.class); - - private static ActionFactory instance; - - public static ActionFactory getInstance() { - if (instance == null) { - instance = new ActionFactory(); - } - return instance; - } - - private ActionFactory() {} - - // File menu actions. - - public NewAction createNewAction(IPlugInPort plugInPort) { - return new NewAction(plugInPort); - } - - public OpenAction createOpenAction(IPlugInPort plugInPort, ISwingUI swingUI) { - return new OpenAction(plugInPort, swingUI); - } - - public ImportAction createImportAction(IPlugInPort plugInPort, ISwingUI swingUI) { - return new ImportAction(plugInPort, swingUI); - } - - public SaveAction createSaveAction(IPlugInPort plugInPort, ISwingUI swingUI) { - return new SaveAction(plugInPort, swingUI); - } - - public SaveAsAction createSaveAsAction(IPlugInPort plugInPort, ISwingUI swingUI) { - return new SaveAsAction(plugInPort, swingUI); - } - - public CreateBomAction createBomAction(IPlugInPort plugInPort) { - return new CreateBomAction(plugInPort); - } - - public ExportPDFAction createExportPDFAction(IPlugInPort plugInPort, IDrawingProvider drawingProvider, ISwingUI swingUI, String defaultSuffix) { - return new ExportPDFAction(plugInPort, drawingProvider, swingUI, defaultSuffix); - } - - public ExportPNGAction createExportPNGAction(IPlugInPort plugInPort, IDrawingProvider drawingProvider, ISwingUI swingUI, String defaultSuffix) { - return new ExportPNGAction(plugInPort, drawingProvider, swingUI, defaultSuffix); - } - - public PrintAction createPrintAction(IDrawingProvider drawingProvider, int keyModifiers) { - return new PrintAction(drawingProvider, keyModifiers); - } - - public ExitAction createExitAction(IPlugInPort plugInPort) { - return new ExitAction(plugInPort); - } - - // Edit menu actions. - - public CutAction createCutAction(IPlugInPort plugInPort, Clipboard clipboard, ClipboardOwner clipboardOwner) { - return new CutAction(plugInPort, clipboard, clipboardOwner); - } - - public CopyAction createCopyAction(IPlugInPort plugInPort, Clipboard clipboard, ClipboardOwner clipboardOwner) { - return new CopyAction(plugInPort, clipboard, clipboardOwner); - } - - public PasteAction createPasteAction(IPlugInPort plugInPort, Clipboard clipboard) { - return new PasteAction(plugInPort, clipboard); - } - - public DuplicateAction createDuplicateAction(IPlugInPort plugInPort) { - return new DuplicateAction(plugInPort); - } - - public SelectAllAction createSelectAllAction(IPlugInPort plugInPort) { - return new SelectAllAction(plugInPort); - } - - public GroupAction createGroupAction(IPlugInPort plugInPort) { - return new GroupAction(plugInPort); - } - - public UngroupAction createUngroupAction(IPlugInPort plugInPort) { - return new UngroupAction(plugInPort); - } - - public EditProjectAction createEditProjectAction(IPlugInPort plugInPort) { - return new EditProjectAction(plugInPort); - } - - public EditSelectionAction createEditSelectionAction(IPlugInPort plugInPort) { - return new EditSelectionAction(plugInPort); - } - - public DeleteSelectionAction createDeleteSelectionAction(IPlugInPort plugInPort) { - return new DeleteSelectionAction(plugInPort); - } - - public SaveAsTemplateAction createSaveAsTemplateAction(IPlugInPort plugInPort) { - return new SaveAsTemplateAction(plugInPort); - } - - public SaveAsBlockAction createSaveAsBlockAction(IPlugInPort plugInPort) { - return new SaveAsBlockAction(plugInPort); - } - - public ExpandSelectionAction createExpandSelectionAction(IPlugInPort plugInPort, ExpansionMode expansionMode) { - return new ExpandSelectionAction(plugInPort, expansionMode); - } - - public RotateSelectionAction createRotateSelectionAction(IPlugInPort plugInPort, int direction) { - return new RotateSelectionAction(plugInPort, direction); - } - - public MirrorSelectionAction createMirrorSelectionAction(IPlugInPort plugInPort, int direction) { - return new MirrorSelectionAction(plugInPort, direction); - } - - public SendToBackAction createSendToBackAction(IPlugInPort plugInPort) { - return new SendToBackAction(plugInPort); - } - - public BringToFrontAction createBringToFrontAction(IPlugInPort plugInPort) { - return new BringToFrontAction(plugInPort); - } - - public NudgeAction createNudgeAction(IPlugInPort plugInPort) { - return new NudgeAction(plugInPort); - } - - // Config actions. - - public ConfigAction createConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue) { - return new ConfigAction(plugInPort, title, configKey, defaultValue); - } - - public ConfigAction createConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue, - String tipKey) { - return new ConfigAction(plugInPort, title, configKey, defaultValue, tipKey); - } - - public ThemeAction createThemeAction(IPlugInPort plugInPort, Theme theme) { - return new ThemeAction(plugInPort, theme); - } - - public ComponentBrowserAction createComponentBrowserAction(String browserType) { - return new ComponentBrowserAction(browserType); - } - - public RenumberAction createRenumberAction(IPlugInPort plugInPort, boolean xAxisFirst) { - return new RenumberAction(plugInPort, xAxisFirst); - } - - // File menu actions. - - public static class NewAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public NewAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "New"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.DocumentPlain.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("NewAction triggered"); - if (!plugInPort.allowFileAction()) { - return; - } - plugInPort.createNewProject(); - List properties = plugInPort.getProperties(plugInPort.getCurrentProject()); - PropertyEditorDialog editor = - DialogFactory.getInstance().createPropertyEditorDialog(properties, "Edit Project", true); - editor.setVisible(true); - if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { - plugInPort.applyProperties(plugInPort.getCurrentProject(), properties); - } - // Save default values. - for (PropertyWrapper property : editor.getDefaultedProperties()) { - if (property.getValue() != null) { - plugInPort.setDefaultPropertyValue(Project.class, property.getName(), property.getValue()); - } - } - } - } - - public static class OpenAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private ISwingUI swingUI; - - public OpenAction(IPlugInPort plugInPort, ISwingUI swingUI) { - super(); - this.plugInPort = plugInPort; - this.swingUI = swingUI; - putValue(AbstractAction.NAME, "Open"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.FolderOut.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("OpenAction triggered"); - if (!plugInPort.allowFileAction()) { - return; - } - final File file = - DialogFactory.getInstance().showOpenDialog(FileFilterEnum.DIY.getFilter(), null, - FileFilterEnum.DIY.getExtensions()[0], null); - if (file != null) { - swingUI.executeBackgroundTask(new ITask() { - - @Override - public Void doInBackground() throws Exception { - LOG.debug("Opening from " + file.getAbsolutePath()); - plugInPort.loadProjectFromFile(file.getAbsolutePath()); - return null; - } - - @Override - public void complete(Void result) {} - - @Override - public void failed(Exception e) { - swingUI.showMessage("Could not open file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); - } - }, true); - } - } - } - - public static class ImportAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private ISwingUI swingUI; - private Presenter presenter; - - public ImportAction(IPlugInPort plugInPort, ISwingUI swingUI) { - super(); - this.plugInPort = plugInPort; - this.swingUI = swingUI; - this.presenter = new Presenter(new IView() { - - @Override - public int showConfirmDialog(String message, String title, int optionType, int messageType) { - return JOptionPane.showConfirmDialog(null, message, title, optionType, messageType); - } - - @Override - public void showMessage(String message, String title, int messageType) { - JOptionPane.showMessageDialog(null, message, title, messageType); - } - - @Override - public File promptFileSave() { - return null; - } - - @Override - public boolean editProperties(List properties, Set defaultedProperties) { - return false; - } - }); - putValue(AbstractAction.NAME, "Import"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_I, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.ElementInto.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("ImportAction triggered"); - - final File file = - DialogFactory.getInstance().showOpenDialog(FileFilterEnum.DIY.getFilter(), null, - FileFilterEnum.DIY.getExtensions()[0], null); - if (file != null) { - swingUI.executeBackgroundTask(new ITask() { - - @Override - public Void doInBackground() throws Exception { - LOG.debug("Opening from " + file.getAbsolutePath()); - // Load project in temp presenter - presenter.loadProjectFromFile(file.getAbsolutePath()); - // Grab all components and paste them into the main - // presenter - plugInPort.pasteComponents(presenter.getCurrentProject().getComponents()); - // Cleanup components in the temp presenter, don't need - // them anymore - presenter.selectAll(0); - presenter.deleteSelectedComponents(); - return null; - } - - @Override - public void complete(Void result) {} - - @Override - public void failed(Exception e) { - swingUI.showMessage("Could not open file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); - } - }, true); - } - } - } - - public static class SaveAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private ISwingUI swingUI; - - public SaveAction(IPlugInPort plugInPort, ISwingUI swingUI) { - super(); - this.plugInPort = plugInPort; - this.swingUI = swingUI; - putValue(AbstractAction.NAME, "Save"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.DiskBlue.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("SaveAction triggered"); - if (plugInPort.getCurrentFileName() == null) { - final File file = - DialogFactory.getInstance().showSaveDialog(swingUI.getOwnerFrame(), FileFilterEnum.DIY.getFilter(), null, - FileFilterEnum.DIY.getExtensions()[0], null); - if (file != null) { - swingUI.executeBackgroundTask(new ITask() { - - @Override - public Void doInBackground() throws Exception { - LOG.debug("Saving to " + file.getAbsolutePath()); - plugInPort.saveProjectToFile(file.getAbsolutePath(), false); - return null; - } - - @Override - public void complete(Void result) {} - - @Override - public void failed(Exception e) { - swingUI.showMessage("Could not save to file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); - } - }, true); - } - } else { - swingUI.executeBackgroundTask(new ITask() { - - @Override - public Void doInBackground() throws Exception { - LOG.debug("Saving to " + plugInPort.getCurrentFileName()); - plugInPort.saveProjectToFile(plugInPort.getCurrentFileName(), false); - return null; - } - - @Override - public void complete(Void result) {} - - @Override - public void failed(Exception e) { - swingUI.showMessage("Could not save to file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); - } - }, true); - } - } - } - - public static class SaveAsAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private ISwingUI swingUI; - - public SaveAsAction(IPlugInPort plugInPort, ISwingUI swingUI) { - super(); - this.plugInPort = plugInPort; - this.swingUI = swingUI; - putValue(AbstractAction.NAME, "Save As"); - putValue( - AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() - | ActionEvent.SHIFT_MASK)); - putValue(AbstractAction.SMALL_ICON, IconLoader.DiskBlue.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("SaveAsAction triggered"); - final File file = - DialogFactory.getInstance().showSaveDialog(swingUI.getOwnerFrame(), FileFilterEnum.DIY.getFilter(), null, - FileFilterEnum.DIY.getExtensions()[0], null); - if (file != null) { - swingUI.executeBackgroundTask(new ITask() { - - @Override - public Void doInBackground() throws Exception { - LOG.debug("Saving to " + file.getAbsolutePath()); - plugInPort.saveProjectToFile(file.getAbsolutePath(), false); - return null; - } - - @Override - public void complete(Void result) {} - - @Override - public void failed(Exception e) { - swingUI.showMessage("Could not save to file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); - } - }, true); - } - } - } - - public static class CreateBomAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public CreateBomAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Create B.O.M."); - putValue(AbstractAction.SMALL_ICON, IconLoader.BOM.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("CreateBomAction triggered"); - List bom = - org.diylc.utils.BomMaker.getInstance().createBom(plugInPort.getCurrentProject().getComponents()); - - String initialFileName = null; - String currentFile = plugInPort.getCurrentFileName(); - if (currentFile != null) { - File cFile = new File(currentFile); - initialFileName = cFile.getName().replaceAll("(?i)\\.diy", "") + " BOM"; - } - - BomDialog dialog = DialogFactory.getInstance().createBomDialog(bom, initialFileName); - dialog.setVisible(true); - } - } - - public static class ExportPDFAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IDrawingProvider drawingProvider; - private ISwingUI swingUI; - private IPlugInPort plugInPort; - private String defaultSuffix; - - public ExportPDFAction(IPlugInPort plugInPort, IDrawingProvider drawingProvider, ISwingUI swingUI, String defaultSuffix) { - super(); - this.plugInPort = plugInPort; - this.drawingProvider = drawingProvider; - this.swingUI = swingUI; - this.defaultSuffix = defaultSuffix; - putValue(AbstractAction.NAME, "Export to PDF"); - putValue(AbstractAction.SMALL_ICON, IconLoader.PDF.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("ExportPDFAction triggered"); - - File initialFile = null; - String currentFile = plugInPort.getCurrentFileName(); - if (currentFile != null) { - File cFile = new File(currentFile); - initialFile = new File(cFile.getName().replaceAll("(?i)\\.diy", "") + defaultSuffix + ".pdf"); - } - - final File file = - DialogFactory.getInstance().showSaveDialog(swingUI.getOwnerFrame(), FileFilterEnum.PDF.getFilter(), initialFile, - FileFilterEnum.PDF.getExtensions()[0], null); - if (file != null) { - swingUI.executeBackgroundTask(new ITask() { - - @Override - public Void doInBackground() throws Exception { - LOG.debug("Exporting to " + file.getAbsolutePath()); - DrawingExporter.getInstance().exportPDF(ExportPDFAction.this.drawingProvider, file); - return null; - } - - @Override - public void complete(Void result) {} - - @Override - public void failed(Exception e) { - swingUI.showMessage("Could not export to PDF. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); - } - }, true); - } - } - } - - public static class ExportPNGAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IDrawingProvider drawingProvider; - private ISwingUI swingUI; - private IPlugInPort plugInPort; - private String defaultSuffix; - - public ExportPNGAction(IPlugInPort plugInPort, IDrawingProvider drawingProvider, ISwingUI swingUI, String defaultSuffix) { - super(); - this.plugInPort = plugInPort; - this.drawingProvider = drawingProvider; - this.drawingProvider = drawingProvider; - this.swingUI = swingUI; - this.defaultSuffix = defaultSuffix; - putValue(AbstractAction.NAME, "Export to PNG"); - putValue(AbstractAction.SMALL_ICON, IconLoader.Image.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("ExportPNGAction triggered"); - - File initialFile = null; - String currentFile = plugInPort.getCurrentFileName(); - if (currentFile != null) { - File cFile = new File(currentFile); - initialFile = new File(cFile.getName().replaceAll("(?i)\\.diy", "") + defaultSuffix + ".png"); - } - - final File file = - DialogFactory.getInstance().showSaveDialog(swingUI.getOwnerFrame(), FileFilterEnum.PNG.getFilter(), initialFile, - FileFilterEnum.PNG.getExtensions()[0], null); - if (file != null) { - swingUI.executeBackgroundTask(new ITask() { - - @Override - public Void doInBackground() throws Exception { - LOG.debug("Exporting to " + file.getAbsolutePath()); - DrawingExporter.getInstance().exportPNG(ExportPNGAction.this.drawingProvider, file); - return null; - } - - @Override - public void complete(Void result) {} - - @Override - public void failed(Exception e) { - swingUI.showMessage("Could not export to PNG. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); - } - }, true); - } - } - } - - public static class PrintAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IDrawingProvider drawingProvider; - - public PrintAction(IDrawingProvider drawingProvider, int keyModifiers) { - super(); - this.drawingProvider = drawingProvider; - putValue(AbstractAction.NAME, "Print..."); - putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_P, keyModifiers)); - putValue(AbstractAction.SMALL_ICON, IconLoader.Print.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("PrintAction triggered"); - try { - DrawingExporter.getInstance().print(this.drawingProvider); - } catch (PrinterException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - } - } - - public static class ExitAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public ExitAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Exit"); - putValue(AbstractAction.SMALL_ICON, IconLoader.Exit.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("ExitAction triggered"); - if (plugInPort.allowFileAction()) { - System.exit(0); - } - } - } - - // Edit menu actions. - - public static class CutAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private Clipboard clipboard; - private ClipboardOwner clipboardOwner; - - public CutAction(IPlugInPort plugInPort, Clipboard clipboard, ClipboardOwner clipboardOwner) { - super(); - this.plugInPort = plugInPort; - this.clipboard = clipboard; - this.clipboardOwner = clipboardOwner; - putValue(AbstractAction.NAME, "Cut"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.Cut.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Cut triggered"); - clipboard.setContents(new ComponentTransferable(cloneComponents(plugInPort.getSelectedComponents())), - clipboardOwner); - plugInPort.deleteSelectedComponents(); - } - } - - public static class PasteAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private Clipboard clipboard; - - public PasteAction(IPlugInPort plugInPort, Clipboard clipboard) { - super(); - this.plugInPort = plugInPort; - this.clipboard = clipboard; - putValue(AbstractAction.NAME, "Paste"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.Paste.getIcon()); - } - - @SuppressWarnings("unchecked") - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Paste triggered"); - try { - List> components = - (List>) clipboard.getData(ComponentTransferable.listFlavor); - plugInPort.pasteComponents(cloneComponents(components)); - } catch (Exception ex) { - LOG.error("Coule not paste.", ex); - } - } - } - - public static class CopyAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private Clipboard clipboard; - private ClipboardOwner clipboardOwner; - - public CopyAction(IPlugInPort plugInPort, Clipboard clipboard, ClipboardOwner clipboardOwner) { - super(); - this.plugInPort = plugInPort; - this.clipboard = clipboard; - this.clipboardOwner = clipboardOwner; - putValue(AbstractAction.NAME, "Copy"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.Copy.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Copy triggered"); - clipboard.setContents(new ComponentTransferable(cloneComponents(plugInPort.getSelectedComponents())), - clipboardOwner); - } - } - - - public static class DuplicateAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public DuplicateAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Duplicate"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.DocumentsGear.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Duplicate triggered"); - try { - plugInPort.duplicateSelection(); - } catch (Exception ex) { - LOG.error("Coule not duplicate.", ex); - } - } - } - - private static List> cloneComponents(Collection> components) { - List> result = new ArrayList>(components.size()); - for (IDIYComponent component : components) { - try { - result.add(component.clone()); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } - } - return result; - } - - public static class SelectAllAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public SelectAllAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Select All"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.Selection.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Select All triggered"); - plugInPort.selectAll(0); - } - } - - public static class GroupAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public GroupAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Group Selection"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_G, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.Group.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Group Selection triggered"); - plugInPort.groupSelectedComponents(); - } - } - - public static class UngroupAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public UngroupAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Ungroup Selection"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_U, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.Ungroup.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Ungroup Selection triggered"); - plugInPort.ungroupSelectedComponents(); - } - } - - public static class EditProjectAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public EditProjectAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Edit Project Settings"); - putValue(AbstractAction.SMALL_ICON, IconLoader.DocumentEdit.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Edit Project triggered"); - List properties = plugInPort.getProperties(plugInPort.getCurrentProject()); - PropertyEditorDialog editor = - DialogFactory.getInstance().createPropertyEditorDialog(properties, "Edit Project", true); - editor.setVisible(true); - if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { - plugInPort.applyProperties(plugInPort.getCurrentProject(), properties); - } - // Save default values. - for (PropertyWrapper property : editor.getDefaultedProperties()) { - if (property.getValue() != null) { - plugInPort.setDefaultPropertyValue(Project.class, property.getName(), property.getValue()); - } - } - } - } - - public static class NudgeAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public NudgeAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Nudge"); - putValue(AbstractAction.SMALL_ICON, IconLoader.FitToSize.getIcon()); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Nudge triggered"); - Nudge n = new Nudge(); - boolean metric = ConfigurationManager.getInstance().readBoolean(Presenter.METRIC_KEY, true); - if (metric) { - n.setxOffset(new Size(0d, SizeUnit.mm)); - n.setyOffset(new Size(0d, SizeUnit.mm)); - } else { - n.setxOffset(new Size(0d, SizeUnit.in)); - n.setyOffset(new Size(0d, SizeUnit.in)); - } - List properties = plugInPort.getProperties(n); - PropertyEditorDialog editor = - DialogFactory.getInstance().createPropertyEditorDialog(properties, "Nudge Selection", false); - editor.setVisible(true); - if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { - plugInPort.applyProperties(n, properties); - plugInPort.nudgeSelection(n.getxOffset(), n.getyOffset(), n.getAffectStuckComponents()); - } - } - } - - public static class EditSelectionAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public EditSelectionAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Edit Selection"); - putValue(AbstractAction.ACCELERATOR_KEY, - KeyStroke.getKeyStroke(KeyEvent.VK_E, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); - putValue(AbstractAction.SMALL_ICON, IconLoader.EditComponent.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Edit Selection triggered"); - List properties = plugInPort.getMutualSelectionProperties(); - if (properties == null || properties.isEmpty()) { - LOG.info("Nothing to edit"); - return; - } - plugInPort.editSelection(); - } - } - - public static class DeleteSelectionAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public DeleteSelectionAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Delete Selection"); - putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)); - putValue(AbstractAction.SMALL_ICON, IconLoader.Delete.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Delete Selection triggered"); - plugInPort.deleteSelectedComponents(); - } - } - - public static class SaveAsTemplateAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public SaveAsTemplateAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Save as Variant"); - putValue(AbstractAction.SMALL_ICON, IconLoader.BriefcaseAdd.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Save as template triggered"); - String templateName = - JOptionPane.showInputDialog(null, "Variant name:", "Save as Variant", JOptionPane.PLAIN_MESSAGE); - if (templateName != null && !templateName.trim().isEmpty()) { - plugInPort.saveSelectedComponentAsTemplate(templateName); - } - } - } - - public static class SaveAsBlockAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public SaveAsBlockAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Save as Building Block"); - putValue(AbstractAction.SMALL_ICON, IconLoader.ComponentAdd.getIcon()); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Save as building block triggered"); - String templateName = - JOptionPane.showInputDialog(null, "Block name:", "Save as Building Block", JOptionPane.PLAIN_MESSAGE); - if (templateName != null && !templateName.trim().isEmpty()) { - plugInPort.saveSelectionAsBlock(templateName); - } - } - } - - 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 RotateSelectionAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private int direction; - - public RotateSelectionAction(IPlugInPort plugInPort, int direction) { - super(); - this.plugInPort = plugInPort; - this.direction = direction; - if (direction > 0) { - putValue(AbstractAction.NAME, "Rotate Clockwise"); - putValue(AbstractAction.SMALL_ICON, IconLoader.RotateCW.getIcon()); - putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ActionEvent.ALT_MASK)); - } else { - putValue(AbstractAction.NAME, "Rotate Counterclockwise"); - putValue(AbstractAction.SMALL_ICON, IconLoader.RotateCCW.getIcon()); - putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, ActionEvent.ALT_MASK)); - } - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Rotate Selection triggered: " + direction); - plugInPort.rotateSelection(direction); - } - } - - public static class MirrorSelectionAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private int direction; - - public MirrorSelectionAction(IPlugInPort plugInPort, int direction) { - super(); - this.plugInPort = plugInPort; - this.direction = direction; - if (direction == IComponentTransformer.HORIZONTAL) { - putValue(AbstractAction.NAME, "Mirror Horizontally"); - putValue(AbstractAction.SMALL_ICON, IconLoader.FlipHorizontal.getIcon()); - putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.ALT_MASK)); - } else { - putValue(AbstractAction.NAME, "Mirror Vertically"); - putValue(AbstractAction.SMALL_ICON, IconLoader.FlipVertical.getIcon()); - putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.ALT_MASK)); - } - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Mirror Selection triggered: " + direction); - plugInPort.mirrorSelection(direction); - } - } - - public static class SendToBackAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public SendToBackAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Send Backward"); - putValue(AbstractAction.SMALL_ICON, IconLoader.Back.getIcon()); - putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, ActionEvent.ALT_MASK)); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Send to Back triggered"); - plugInPort.sendSelectionToBack(); - } - } - - public static class BringToFrontAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - - public BringToFrontAction(IPlugInPort plugInPort) { - super(); - this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Bring Forward"); - putValue(AbstractAction.SMALL_ICON, IconLoader.Front.getIcon()); - putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_UP, ActionEvent.ALT_MASK)); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info("Bring to Front triggered"); - plugInPort.bringSelectionToFront(); - } - } - - public static class ConfigAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private String configKey; - private String tipKey; - - public ConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue, String tipKey) { - super(); - this.plugInPort = plugInPort; - this.configKey = configKey; - this.tipKey = tipKey; - putValue(AbstractAction.NAME, title); - putValue(IView.CHECK_BOX_MENU_ITEM, true); - putValue(AbstractAction.SELECTED_KEY, ConfigurationManager.getInstance().readBoolean(configKey, defaultValue)); - } - - public ConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue) { - this(plugInPort, title, configKey, defaultValue, null); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info(getValue(AbstractAction.NAME) + " triggered"); - ConfigurationManager.getInstance().writeValue(configKey, getValue(AbstractAction.SELECTED_KEY)); - if ((Boolean) getValue(AbstractAction.SELECTED_KEY) && tipKey != null - && !ConfigurationManager.getInstance().readBoolean(tipKey + ".dismissed", false)) { - DialogFactory.getInstance().createInfoDialog(tipKey).setVisible(true); - } - plugInPort.refresh(); - } - } - - public static class ThemeAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private Theme theme; - - public ThemeAction(IPlugInPort plugInPort, Theme theme) { - super(); - this.plugInPort = plugInPort; - this.theme = theme; - putValue(AbstractAction.NAME, theme.getName()); - putValue(IView.RADIO_BUTTON_GROUP_KEY, "theme"); - putValue(AbstractAction.SELECTED_KEY, plugInPort.getSelectedTheme().getName().equals(theme.getName())); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info(getValue(AbstractAction.NAME) + " triggered"); - plugInPort.setSelectedTheme(theme); - } - } - - public static class ComponentBrowserAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private String browserType; - - public ComponentBrowserAction(String browserType) { - super(); - this.browserType = browserType; - putValue(AbstractAction.NAME, browserType); - putValue(IView.RADIO_BUTTON_GROUP_KEY, "componentBrowser"); - - putValue( - AbstractAction.SELECTED_KEY, - browserType.equals(ConfigurationManager.getInstance().readString(ConfigPlugin.COMPONENT_BROWSER, - ConfigPlugin.SEARCHABLE_TREE))); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info(getValue(AbstractAction.NAME) + " triggered"); - ConfigurationManager.getInstance().writeValue(ConfigPlugin.COMPONENT_BROWSER, browserType); - } - } - - - public static class RenumberAction extends AbstractAction { - - private static final long serialVersionUID = 1L; - - private IPlugInPort plugInPort; - private boolean xAxisFirst; - - public RenumberAction(IPlugInPort plugInPort, boolean xAxisFirst) { - super(); - this.plugInPort = plugInPort; - this.xAxisFirst = xAxisFirst; - putValue(AbstractAction.NAME, xAxisFirst ? "Top-to-Bottom" : "Left-to-Right"); - } - - @Override - public void actionPerformed(ActionEvent e) { - LOG.info(getValue(AbstractAction.NAME) + " triggered"); - plugInPort.renumberSelectedComponents(xAxisFirst); - } - } -} +/* + * + * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. + * + * This file is part of DIYLC. + * + * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU + * General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even + * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + * Public License for more details. + * + * You should have received a copy of the GNU General Public License along with DIYLC. If not, see + * . + */ +package org.diylc.swing; + +import java.awt.Toolkit; +import java.awt.datatransfer.Clipboard; +import java.awt.datatransfer.ClipboardOwner; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.awt.print.PrinterException; +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Set; + +import javax.swing.AbstractAction; +import javax.swing.JOptionPane; +import javax.swing.KeyStroke; + +import org.apache.log4j.Logger; +import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.common.IComponentTransformer; +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.Project; +import org.diylc.core.Theme; +import org.diylc.core.measures.Nudge; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.images.IconLoader; +import org.diylc.presenter.Presenter; +import org.diylc.swing.gui.DialogFactory; +import org.diylc.swing.gui.editor.PropertyEditorDialog; +import org.diylc.swing.plugins.config.ConfigPlugin; +import org.diylc.swing.plugins.edit.ComponentTransferable; +import org.diylc.swing.plugins.file.BomDialog; +import org.diylc.swing.plugins.file.FileFilterEnum; +import org.diylc.swingframework.ButtonDialog; +import org.diylc.swingframework.IDrawingProvider; +import org.diylc.swingframework.export.DrawingExporter; +import org.diylc.utils.BomEntry; + +public class ActionFactory { + + private static final Logger LOG = Logger.getLogger(ActionFactory.class); + + private static ActionFactory instance; + + public static ActionFactory getInstance() { + if (instance == null) { + instance = new ActionFactory(); + } + return instance; + } + + private ActionFactory() {} + + // File menu actions. + + public NewAction createNewAction(IPlugInPort plugInPort) { + return new NewAction(plugInPort); + } + + public OpenAction createOpenAction(IPlugInPort plugInPort, ISwingUI swingUI) { + return new OpenAction(plugInPort, swingUI); + } + + public ImportAction createImportAction(IPlugInPort plugInPort, ISwingUI swingUI) { + return new ImportAction(plugInPort, swingUI); + } + + public SaveAction createSaveAction(IPlugInPort plugInPort, ISwingUI swingUI) { + return new SaveAction(plugInPort, swingUI); + } + + public SaveAsAction createSaveAsAction(IPlugInPort plugInPort, ISwingUI swingUI) { + return new SaveAsAction(plugInPort, swingUI); + } + + public CreateBomAction createBomAction(IPlugInPort plugInPort) { + return new CreateBomAction(plugInPort); + } + + public ExportPDFAction createExportPDFAction(IPlugInPort plugInPort, IDrawingProvider drawingProvider, ISwingUI swingUI, String defaultSuffix) { + return new ExportPDFAction(plugInPort, drawingProvider, swingUI, defaultSuffix); + } + + public ExportPNGAction createExportPNGAction(IPlugInPort plugInPort, IDrawingProvider drawingProvider, ISwingUI swingUI, String defaultSuffix) { + return new ExportPNGAction(plugInPort, drawingProvider, swingUI, defaultSuffix); + } + + public PrintAction createPrintAction(IDrawingProvider drawingProvider, int keyModifiers) { + return new PrintAction(drawingProvider, keyModifiers); + } + + public ExitAction createExitAction(IPlugInPort plugInPort) { + return new ExitAction(plugInPort); + } + + // Edit menu actions. + + public CutAction createCutAction(IPlugInPort plugInPort, Clipboard clipboard, ClipboardOwner clipboardOwner) { + return new CutAction(plugInPort, clipboard, clipboardOwner); + } + + public CopyAction createCopyAction(IPlugInPort plugInPort, Clipboard clipboard, ClipboardOwner clipboardOwner) { + return new CopyAction(plugInPort, clipboard, clipboardOwner); + } + + public PasteAction createPasteAction(IPlugInPort plugInPort, Clipboard clipboard) { + return new PasteAction(plugInPort, clipboard); + } + + public DuplicateAction createDuplicateAction(IPlugInPort plugInPort) { + return new DuplicateAction(plugInPort); + } + + public SelectAllAction createSelectAllAction(IPlugInPort plugInPort) { + return new SelectAllAction(plugInPort); + } + + public GroupAction createGroupAction(IPlugInPort plugInPort) { + return new GroupAction(plugInPort); + } + + public UngroupAction createUngroupAction(IPlugInPort plugInPort) { + return new UngroupAction(plugInPort); + } + + public EditProjectAction createEditProjectAction(IPlugInPort plugInPort) { + return new EditProjectAction(plugInPort); + } + + public EditSelectionAction createEditSelectionAction(IPlugInPort plugInPort) { + return new EditSelectionAction(plugInPort); + } + + public DeleteSelectionAction createDeleteSelectionAction(IPlugInPort plugInPort) { + return new DeleteSelectionAction(plugInPort); + } + + public SaveAsTemplateAction createSaveAsTemplateAction(IPlugInPort plugInPort) { + return new SaveAsTemplateAction(plugInPort); + } + + public SaveAsBlockAction createSaveAsBlockAction(IPlugInPort plugInPort) { + return new SaveAsBlockAction(plugInPort); + } + + public ExpandSelectionAction createExpandSelectionAction(IPlugInPort plugInPort, ExpansionMode expansionMode) { + return new ExpandSelectionAction(plugInPort, expansionMode); + } + + public RotateSelectionAction createRotateSelectionAction(IPlugInPort plugInPort, int direction) { + return new RotateSelectionAction(plugInPort, direction); + } + + public MirrorSelectionAction createMirrorSelectionAction(IPlugInPort plugInPort, int direction) { + return new MirrorSelectionAction(plugInPort, direction); + } + + public SendToBackAction createSendToBackAction(IPlugInPort plugInPort) { + return new SendToBackAction(plugInPort); + } + + public BringToFrontAction createBringToFrontAction(IPlugInPort plugInPort) { + return new BringToFrontAction(plugInPort); + } + + public NudgeAction createNudgeAction(IPlugInPort plugInPort) { + return new NudgeAction(plugInPort); + } + + // Config actions. + + public ConfigAction createConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue) { + return new ConfigAction(plugInPort, title, configKey, defaultValue); + } + + public ConfigAction createConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue, + String tipKey) { + return new ConfigAction(plugInPort, title, configKey, defaultValue, tipKey); + } + + public ThemeAction createThemeAction(IPlugInPort plugInPort, Theme theme) { + return new ThemeAction(plugInPort, theme); + } + + public ComponentBrowserAction createComponentBrowserAction(String browserType) { + return new ComponentBrowserAction(browserType); + } + + public RenumberAction createRenumberAction(IPlugInPort plugInPort, boolean xAxisFirst) { + return new RenumberAction(plugInPort, xAxisFirst); + } + + // File menu actions. + + public static class NewAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public NewAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "New"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.DocumentPlain.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("NewAction triggered"); + if (!plugInPort.allowFileAction()) { + return; + } + plugInPort.createNewProject(); + List properties = plugInPort.getProperties(plugInPort.getCurrentProject()); + PropertyEditorDialog editor = + DialogFactory.getInstance().createPropertyEditorDialog(properties, "Edit Project", true); + editor.setVisible(true); + if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { + plugInPort.applyProperties(plugInPort.getCurrentProject(), properties); + } + // Save default values. + for (PropertyWrapper property : editor.getDefaultedProperties()) { + if (property.getValue() != null) { + plugInPort.setDefaultPropertyValue(Project.class, property.getName(), property.getValue()); + } + } + } + } + + public static class OpenAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private ISwingUI swingUI; + + public OpenAction(IPlugInPort plugInPort, ISwingUI swingUI) { + super(); + this.plugInPort = plugInPort; + this.swingUI = swingUI; + putValue(AbstractAction.NAME, "Open"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.FolderOut.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("OpenAction triggered"); + if (!plugInPort.allowFileAction()) { + return; + } + final File file = + DialogFactory.getInstance().showOpenDialog(FileFilterEnum.DIY.getFilter(), null, + FileFilterEnum.DIY.getExtensions()[0], null); + if (file != null) { + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Opening from " + file.getAbsolutePath()); + plugInPort.loadProjectFromFile(file.getAbsolutePath()); + return null; + } + + @Override + public void complete(Void result) {} + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not open file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); + } + }, true); + } + } + } + + public static class ImportAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private ISwingUI swingUI; + private Presenter presenter; + + public ImportAction(IPlugInPort plugInPort, ISwingUI swingUI) { + super(); + this.plugInPort = plugInPort; + this.swingUI = swingUI; + this.presenter = new Presenter(new IView() { + + @Override + public int showConfirmDialog(String message, String title, int optionType, int messageType) { + return JOptionPane.showConfirmDialog(null, message, title, optionType, messageType); + } + + @Override + public void showMessage(String message, String title, int messageType) { + JOptionPane.showMessageDialog(null, message, title, messageType); + } + + @Override + public File promptFileSave() { + return null; + } + + @Override + public boolean editProperties(List properties, Set defaultedProperties) { + return false; + } + }); + putValue(AbstractAction.NAME, "Import"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_I, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.ElementInto.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("ImportAction triggered"); + + final File file = + DialogFactory.getInstance().showOpenDialog(FileFilterEnum.DIY.getFilter(), null, + FileFilterEnum.DIY.getExtensions()[0], null); + if (file != null) { + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Opening from " + file.getAbsolutePath()); + // Load project in temp presenter + presenter.loadProjectFromFile(file.getAbsolutePath()); + // Grab all components and paste them into the main + // presenter + plugInPort.pasteComponents(presenter.getCurrentProject().getComponents(), false); + // Cleanup components in the temp presenter, don't need + // them anymore + presenter.selectAll(0); + presenter.deleteSelectedComponents(); + return null; + } + + @Override + public void complete(Void result) {} + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not open file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); + } + }, true); + } + } + } + + public static class SaveAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private ISwingUI swingUI; + + public SaveAction(IPlugInPort plugInPort, ISwingUI swingUI) { + super(); + this.plugInPort = plugInPort; + this.swingUI = swingUI; + putValue(AbstractAction.NAME, "Save"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.DiskBlue.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("SaveAction triggered"); + if (plugInPort.getCurrentFileName() == null) { + final File file = + DialogFactory.getInstance().showSaveDialog(swingUI.getOwnerFrame(), FileFilterEnum.DIY.getFilter(), null, + FileFilterEnum.DIY.getExtensions()[0], null); + if (file != null) { + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Saving to " + file.getAbsolutePath()); + plugInPort.saveProjectToFile(file.getAbsolutePath(), false); + return null; + } + + @Override + public void complete(Void result) {} + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not save to file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); + } + }, true); + } + } else { + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Saving to " + plugInPort.getCurrentFileName()); + plugInPort.saveProjectToFile(plugInPort.getCurrentFileName(), false); + return null; + } + + @Override + public void complete(Void result) {} + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not save to file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); + } + }, true); + } + } + } + + public static class SaveAsAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private ISwingUI swingUI; + + public SaveAsAction(IPlugInPort plugInPort, ISwingUI swingUI) { + super(); + this.plugInPort = plugInPort; + this.swingUI = swingUI; + putValue(AbstractAction.NAME, "Save As"); + putValue( + AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask() + | ActionEvent.SHIFT_MASK)); + putValue(AbstractAction.SMALL_ICON, IconLoader.DiskBlue.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("SaveAsAction triggered"); + final File file = + DialogFactory.getInstance().showSaveDialog(swingUI.getOwnerFrame(), FileFilterEnum.DIY.getFilter(), null, + FileFilterEnum.DIY.getExtensions()[0], null); + if (file != null) { + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Saving to " + file.getAbsolutePath()); + plugInPort.saveProjectToFile(file.getAbsolutePath(), false); + return null; + } + + @Override + public void complete(Void result) {} + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not save to file. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); + } + }, true); + } + } + } + + public static class CreateBomAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public CreateBomAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Create B.O.M."); + putValue(AbstractAction.SMALL_ICON, IconLoader.BOM.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("CreateBomAction triggered"); + List bom = + org.diylc.utils.BomMaker.getInstance().createBom(plugInPort.getCurrentProject().getComponents()); + + String initialFileName = null; + String currentFile = plugInPort.getCurrentFileName(); + if (currentFile != null) { + File cFile = new File(currentFile); + initialFileName = cFile.getName().replaceAll("(?i)\\.diy", "") + " BOM"; + } + + BomDialog dialog = DialogFactory.getInstance().createBomDialog(bom, initialFileName); + dialog.setVisible(true); + } + } + + public static class ExportPDFAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IDrawingProvider drawingProvider; + private ISwingUI swingUI; + private IPlugInPort plugInPort; + private String defaultSuffix; + + public ExportPDFAction(IPlugInPort plugInPort, IDrawingProvider drawingProvider, ISwingUI swingUI, String defaultSuffix) { + super(); + this.plugInPort = plugInPort; + this.drawingProvider = drawingProvider; + this.swingUI = swingUI; + this.defaultSuffix = defaultSuffix; + putValue(AbstractAction.NAME, "Export to PDF"); + putValue(AbstractAction.SMALL_ICON, IconLoader.PDF.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("ExportPDFAction triggered"); + + File initialFile = null; + String currentFile = plugInPort.getCurrentFileName(); + if (currentFile != null) { + File cFile = new File(currentFile); + initialFile = new File(cFile.getName().replaceAll("(?i)\\.diy", "") + defaultSuffix + ".pdf"); + } + + final File file = + DialogFactory.getInstance().showSaveDialog(swingUI.getOwnerFrame(), FileFilterEnum.PDF.getFilter(), initialFile, + FileFilterEnum.PDF.getExtensions()[0], null); + if (file != null) { + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Exporting to " + file.getAbsolutePath()); + DrawingExporter.getInstance().exportPDF(ExportPDFAction.this.drawingProvider, file); + return null; + } + + @Override + public void complete(Void result) {} + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not export to PDF. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); + } + }, true); + } + } + } + + public static class ExportPNGAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IDrawingProvider drawingProvider; + private ISwingUI swingUI; + private IPlugInPort plugInPort; + private String defaultSuffix; + + public ExportPNGAction(IPlugInPort plugInPort, IDrawingProvider drawingProvider, ISwingUI swingUI, String defaultSuffix) { + super(); + this.plugInPort = plugInPort; + this.drawingProvider = drawingProvider; + this.drawingProvider = drawingProvider; + this.swingUI = swingUI; + this.defaultSuffix = defaultSuffix; + putValue(AbstractAction.NAME, "Export to PNG"); + putValue(AbstractAction.SMALL_ICON, IconLoader.Image.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("ExportPNGAction triggered"); + + File initialFile = null; + String currentFile = plugInPort.getCurrentFileName(); + if (currentFile != null) { + File cFile = new File(currentFile); + initialFile = new File(cFile.getName().replaceAll("(?i)\\.diy", "") + defaultSuffix + ".png"); + } + + final File file = + DialogFactory.getInstance().showSaveDialog(swingUI.getOwnerFrame(), FileFilterEnum.PNG.getFilter(), initialFile, + FileFilterEnum.PNG.getExtensions()[0], null); + if (file != null) { + swingUI.executeBackgroundTask(new ITask() { + + @Override + public Void doInBackground() throws Exception { + LOG.debug("Exporting to " + file.getAbsolutePath()); + DrawingExporter.getInstance().exportPNG(ExportPNGAction.this.drawingProvider, file); + return null; + } + + @Override + public void complete(Void result) {} + + @Override + public void failed(Exception e) { + swingUI.showMessage("Could not export to PNG. " + e.getMessage(), "Error", ISwingUI.ERROR_MESSAGE); + } + }, true); + } + } + } + + public static class PrintAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IDrawingProvider drawingProvider; + + public PrintAction(IDrawingProvider drawingProvider, int keyModifiers) { + super(); + this.drawingProvider = drawingProvider; + putValue(AbstractAction.NAME, "Print..."); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_P, keyModifiers)); + putValue(AbstractAction.SMALL_ICON, IconLoader.Print.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("PrintAction triggered"); + try { + DrawingExporter.getInstance().print(this.drawingProvider); + } catch (PrinterException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } + } + + public static class ExitAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public ExitAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Exit"); + putValue(AbstractAction.SMALL_ICON, IconLoader.Exit.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("ExitAction triggered"); + if (plugInPort.allowFileAction()) { + System.exit(0); + } + } + } + + // Edit menu actions. + + public static class CutAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private Clipboard clipboard; + private ClipboardOwner clipboardOwner; + + public CutAction(IPlugInPort plugInPort, Clipboard clipboard, ClipboardOwner clipboardOwner) { + super(); + this.plugInPort = plugInPort; + this.clipboard = clipboard; + this.clipboardOwner = clipboardOwner; + putValue(AbstractAction.NAME, "Cut"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_X, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.Cut.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Cut triggered"); + clipboard.setContents(new ComponentTransferable(cloneComponents(plugInPort.getSelectedComponents())), + clipboardOwner); + plugInPort.deleteSelectedComponents(); + } + } + + public static class PasteAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private Clipboard clipboard; + + public PasteAction(IPlugInPort plugInPort, Clipboard clipboard) { + super(); + this.plugInPort = plugInPort; + this.clipboard = clipboard; + putValue(AbstractAction.NAME, "Paste"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.Paste.getIcon()); + } + + @SuppressWarnings("unchecked") + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Paste triggered"); + try { + List> components = + (List>) clipboard.getData(ComponentTransferable.listFlavor); + plugInPort.pasteComponents(cloneComponents(components), false); + } catch (Exception ex) { + LOG.error("Coule not paste.", ex); + } + } + } + + public static class CopyAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private Clipboard clipboard; + private ClipboardOwner clipboardOwner; + + public CopyAction(IPlugInPort plugInPort, Clipboard clipboard, ClipboardOwner clipboardOwner) { + super(); + this.plugInPort = plugInPort; + this.clipboard = clipboard; + this.clipboardOwner = clipboardOwner; + putValue(AbstractAction.NAME, "Copy"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_C, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.Copy.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Copy triggered"); + clipboard.setContents(new ComponentTransferable(cloneComponents(plugInPort.getSelectedComponents())), + clipboardOwner); + } + } + + + public static class DuplicateAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public DuplicateAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Duplicate"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.DocumentsGear.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Duplicate triggered"); + try { + plugInPort.duplicateSelection(); + } catch (Exception ex) { + LOG.error("Coule not duplicate.", ex); + } + } + } + + private static List> cloneComponents(Collection> components) { + List> result = new ArrayList>(components.size()); + for (IDIYComponent component : components) { + try { + result.add(component.clone()); + } catch (CloneNotSupportedException e) { + throw new RuntimeException(e); + } + } + return result; + } + + public static class SelectAllAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public SelectAllAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Select All"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_A, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.Selection.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Select All triggered"); + plugInPort.selectAll(0); + } + } + + public static class GroupAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public GroupAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Group Selection"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_G, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.Group.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Group Selection triggered"); + plugInPort.groupSelectedComponents(); + } + } + + public static class UngroupAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public UngroupAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Ungroup Selection"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_U, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.Ungroup.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Ungroup Selection triggered"); + plugInPort.ungroupSelectedComponents(); + } + } + + public static class EditProjectAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public EditProjectAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Edit Project Settings"); + putValue(AbstractAction.SMALL_ICON, IconLoader.DocumentEdit.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Edit Project triggered"); + List properties = plugInPort.getProperties(plugInPort.getCurrentProject()); + PropertyEditorDialog editor = + DialogFactory.getInstance().createPropertyEditorDialog(properties, "Edit Project", true); + editor.setVisible(true); + if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { + plugInPort.applyProperties(plugInPort.getCurrentProject(), properties); + } + // Save default values. + for (PropertyWrapper property : editor.getDefaultedProperties()) { + if (property.getValue() != null) { + plugInPort.setDefaultPropertyValue(Project.class, property.getName(), property.getValue()); + } + } + } + } + + public static class NudgeAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public NudgeAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Nudge"); + putValue(AbstractAction.SMALL_ICON, IconLoader.FitToSize.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_Q, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Nudge triggered"); + Nudge n = new Nudge(); + boolean metric = ConfigurationManager.getInstance().readBoolean(Presenter.METRIC_KEY, true); + if (metric) { + n.setxOffset(new Size(0d, SizeUnit.mm)); + n.setyOffset(new Size(0d, SizeUnit.mm)); + } else { + n.setxOffset(new Size(0d, SizeUnit.in)); + n.setyOffset(new Size(0d, SizeUnit.in)); + } + List properties = plugInPort.getProperties(n); + PropertyEditorDialog editor = + DialogFactory.getInstance().createPropertyEditorDialog(properties, "Nudge Selection", false); + editor.setVisible(true); + if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { + plugInPort.applyProperties(n, properties); + plugInPort.nudgeSelection(n.getxOffset(), n.getyOffset(), n.getAffectStuckComponents()); + } + } + } + + public static class EditSelectionAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public EditSelectionAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Edit Selection"); + putValue(AbstractAction.ACCELERATOR_KEY, + KeyStroke.getKeyStroke(KeyEvent.VK_E, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask())); + putValue(AbstractAction.SMALL_ICON, IconLoader.EditComponent.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Edit Selection triggered"); + List properties = plugInPort.getMutualSelectionProperties(); + if (properties == null || properties.isEmpty()) { + LOG.info("Nothing to edit"); + return; + } + plugInPort.editSelection(); + } + } + + public static class DeleteSelectionAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public DeleteSelectionAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Delete Selection"); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0)); + putValue(AbstractAction.SMALL_ICON, IconLoader.Delete.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Delete Selection triggered"); + plugInPort.deleteSelectedComponents(); + } + } + + public static class SaveAsTemplateAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public SaveAsTemplateAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Save as Variant"); + putValue(AbstractAction.SMALL_ICON, IconLoader.BriefcaseAdd.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Save as template triggered"); + String templateName = + JOptionPane.showInputDialog(null, "Variant name:", "Save as Variant", JOptionPane.PLAIN_MESSAGE); + if (templateName != null && !templateName.trim().isEmpty()) { + plugInPort.saveSelectedComponentAsTemplate(templateName); + } + } + } + + public static class SaveAsBlockAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public SaveAsBlockAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Save as Building Block"); + putValue(AbstractAction.SMALL_ICON, IconLoader.ComponentAdd.getIcon()); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Save as building block triggered"); + String templateName = + JOptionPane.showInputDialog(null, "Block name:", "Save as Building Block", JOptionPane.PLAIN_MESSAGE); + if (templateName != null && !templateName.trim().isEmpty()) { + plugInPort.saveSelectionAsBlock(templateName); + } + } + } + + 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 RotateSelectionAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private int direction; + + public RotateSelectionAction(IPlugInPort plugInPort, int direction) { + super(); + this.plugInPort = plugInPort; + this.direction = direction; + if (direction > 0) { + putValue(AbstractAction.NAME, "Rotate Clockwise"); + putValue(AbstractAction.SMALL_ICON, IconLoader.RotateCW.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, ActionEvent.ALT_MASK)); + } else { + putValue(AbstractAction.NAME, "Rotate Counterclockwise"); + putValue(AbstractAction.SMALL_ICON, IconLoader.RotateCCW.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, ActionEvent.ALT_MASK)); + } + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Rotate Selection triggered: " + direction); + plugInPort.rotateSelection(direction); + } + } + + public static class MirrorSelectionAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private int direction; + + public MirrorSelectionAction(IPlugInPort plugInPort, int direction) { + super(); + this.plugInPort = plugInPort; + this.direction = direction; + if (direction == IComponentTransformer.HORIZONTAL) { + putValue(AbstractAction.NAME, "Mirror Horizontally"); + putValue(AbstractAction.SMALL_ICON, IconLoader.FlipHorizontal.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.ALT_MASK)); + } else { + putValue(AbstractAction.NAME, "Mirror Vertically"); + putValue(AbstractAction.SMALL_ICON, IconLoader.FlipVertical.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.ALT_MASK)); + } + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Mirror Selection triggered: " + direction); + plugInPort.mirrorSelection(direction); + } + } + + public static class SendToBackAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public SendToBackAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Send Backward"); + putValue(AbstractAction.SMALL_ICON, IconLoader.Back.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, ActionEvent.ALT_MASK)); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Send to Back triggered"); + plugInPort.sendSelectionToBack(); + } + } + + public static class BringToFrontAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + + public BringToFrontAction(IPlugInPort plugInPort) { + super(); + this.plugInPort = plugInPort; + putValue(AbstractAction.NAME, "Bring Forward"); + putValue(AbstractAction.SMALL_ICON, IconLoader.Front.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_UP, ActionEvent.ALT_MASK)); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info("Bring to Front triggered"); + plugInPort.bringSelectionToFront(); + } + } + + public static class ConfigAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private String configKey; + private String tipKey; + + public ConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue, String tipKey) { + super(); + this.plugInPort = plugInPort; + this.configKey = configKey; + this.tipKey = tipKey; + putValue(AbstractAction.NAME, title); + putValue(IView.CHECK_BOX_MENU_ITEM, true); + putValue(AbstractAction.SELECTED_KEY, ConfigurationManager.getInstance().readBoolean(configKey, defaultValue)); + } + + public ConfigAction(IPlugInPort plugInPort, String title, String configKey, boolean defaultValue) { + this(plugInPort, title, configKey, defaultValue, null); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info(getValue(AbstractAction.NAME) + " triggered"); + ConfigurationManager.getInstance().writeValue(configKey, getValue(AbstractAction.SELECTED_KEY)); + if ((Boolean) getValue(AbstractAction.SELECTED_KEY) && tipKey != null + && !ConfigurationManager.getInstance().readBoolean(tipKey + ".dismissed", false)) { + DialogFactory.getInstance().createInfoDialog(tipKey).setVisible(true); + } + plugInPort.refresh(); + } + } + + public static class ThemeAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private Theme theme; + + public ThemeAction(IPlugInPort plugInPort, Theme theme) { + super(); + this.plugInPort = plugInPort; + this.theme = theme; + putValue(AbstractAction.NAME, theme.getName()); + putValue(IView.RADIO_BUTTON_GROUP_KEY, "theme"); + putValue(AbstractAction.SELECTED_KEY, plugInPort.getSelectedTheme().getName().equals(theme.getName())); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info(getValue(AbstractAction.NAME) + " triggered"); + plugInPort.setSelectedTheme(theme); + } + } + + public static class ComponentBrowserAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private String browserType; + + public ComponentBrowserAction(String browserType) { + super(); + this.browserType = browserType; + putValue(AbstractAction.NAME, browserType); + putValue(IView.RADIO_BUTTON_GROUP_KEY, "componentBrowser"); + + putValue( + AbstractAction.SELECTED_KEY, + browserType.equals(ConfigurationManager.getInstance().readString(ConfigPlugin.COMPONENT_BROWSER, + ConfigPlugin.SEARCHABLE_TREE))); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info(getValue(AbstractAction.NAME) + " triggered"); + ConfigurationManager.getInstance().writeValue(ConfigPlugin.COMPONENT_BROWSER, browserType); + } + } + + + public static class RenumberAction extends AbstractAction { + + private static final long serialVersionUID = 1L; + + private IPlugInPort plugInPort; + private boolean xAxisFirst; + + public RenumberAction(IPlugInPort plugInPort, boolean xAxisFirst) { + super(); + this.plugInPort = plugInPort; + this.xAxisFirst = xAxisFirst; + putValue(AbstractAction.NAME, xAxisFirst ? "Top-to-Bottom" : "Left-to-Right"); + } + + @Override + public void actionPerformed(ActionEvent e) { + LOG.info(getValue(AbstractAction.NAME) + " triggered"); + plugInPort.renumberSelectedComponents(xAxisFirst); + } + } +} diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java index 990e989e..0eb58165 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/tree/TreePanel.java @@ -1,716 +1,719 @@ -/* - * - * DIY Layout Creator (DIYLC). Copyright (c) 2009-2018 held jointly by the individual authors. - * - * This file is part of DIYLC. - * - * DIYLC is free software: you can redistribute it and/or modify it under the terms of the GNU - * General Public License as published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * DIYLC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even - * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General - * Public License for more details. - * - * You should have received a copy of the GNU General Public License along with DIYLC. If not, see - * . - */ -package org.diylc.swing.plugins.tree; - -import java.awt.AlphaComposite; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.GridBagConstraints; -import java.awt.GridBagLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.FocusAdapter; -import java.awt.event.FocusEvent; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; - -import javax.swing.AbstractAction; -import javax.swing.Icon; -import javax.swing.JMenu; -import javax.swing.JMenuItem; -import javax.swing.JPanel; -import javax.swing.JPopupMenu; -import javax.swing.JScrollPane; -import javax.swing.JSeparator; -import javax.swing.JTextField; -import javax.swing.JTree; -import javax.swing.SwingUtilities; -import javax.swing.ToolTipManager; -import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeCellRenderer; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreePath; -import javax.swing.tree.TreeSelectionModel; - -import org.apache.log4j.Logger; -import org.diylc.appframework.miscutils.ConfigurationManager; -import org.diylc.appframework.miscutils.IConfigListener; -import org.diylc.common.ComponentType; -import org.diylc.common.IBlockProcessor.InvalidBlockException; -import org.diylc.common.IPlugInPort; -import org.diylc.core.IDIYComponent; -import org.diylc.core.Template; -import org.diylc.images.IconLoader; -import org.diylc.presenter.ComponentProcessor; -import org.diylc.swing.plugins.toolbox.ComponentButtonFactory; - -public class TreePanel extends JPanel { - - private static final long serialVersionUID = 1L; - - private static final Logger LOG = Logger.getLogger(TreePanel.class); - - public static final String COMPONENT_SHORTCUT_KEY = "componentShortcuts"; - - private DefaultTreeModel treeModel; - private JTree tree; - private JScrollPane treeScroll; - private JTextField searchField; - private DefaultMutableTreeNode recentNode; - private DefaultMutableTreeNode blocksNode; - private List recentComponents; - private List blocks; - - private IPlugInPort plugInPort; - - private JPopupMenu popup; - - public TreePanel(IPlugInPort plugInPort) { - this.plugInPort = plugInPort; - setLayout(new GridBagLayout()); - - GridBagConstraints gbc = new GridBagConstraints(); - gbc.gridx = 0; - gbc.gridy = 0; - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.weighty = 0; - gbc.gridwidth = 1; - - add(getSearchField(), gbc); - - gbc.gridy++; - - gbc.fill = GridBagConstraints.BOTH; - gbc.weighty = 1; - gbc.weightx = 1; - - add(getTreeScroll(), gbc); - - setPreferredSize(new Dimension(240, 200)); - - ConfigurationManager.getInstance().addConfigListener(IPlugInPort.RECENT_COMPONENTS_KEY, new IConfigListener() { - - @SuppressWarnings("unchecked") - @Override - public void valueChanged(String key, Object value) { - List newComponents = (List) value; - if (newComponents != null - && !new HashSet(newComponents).equals(new HashSet(TreePanel.this.recentComponents))) { - LOG.info("Detected recent component change"); - refreshRecentComponents(newComponents); - } else - LOG.info("Detected no recent component change"); - TreePanel.this.recentComponents = new ArrayList(newComponents); - } - }); - - ConfigurationManager.getInstance().addConfigListener(IPlugInPort.BLOCKS_KEY, new IConfigListener() { - - @SuppressWarnings("unchecked") - @Override - public void valueChanged(String key, Object value) { - Map>> newBlocks = (Map>>) value; - if (newBlocks != null) { - List blockNames = new ArrayList(newBlocks.keySet()); - Collections.sort(blockNames); - if (!blockNames.equals(TreePanel.this.blocks)) { - LOG.info("Detected block change"); - refreshBlocks(blockNames); - } else - LOG.info("Detected no block change"); - } else - LOG.info("Detected no block change"); - } - }); - - getTree().expandRow(0); - } - - public JScrollPane getTreeScroll() { - if (treeScroll == null) { - treeScroll = new JScrollPane(getTree()); - treeScroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - } - return treeScroll; - } - - public DefaultMutableTreeNode getRecentNode() { - if (this.recentNode == null) { - this.recentNode = new DefaultMutableTreeNode(new Payload("(Recently Used)", null), true); - @SuppressWarnings("unchecked") - List recent = - (List) ConfigurationManager.getInstance().readObject(IPlugInPort.RECENT_COMPONENTS_KEY, null); - if (recent != null) { - this.recentComponents = new ArrayList(recent); - refreshRecentComponents(recent); - } else { - this.recentComponents = new ArrayList(); - } - } - return this.recentNode; - } - - public DefaultMutableTreeNode getBlocksNode() { - if (this.blocksNode == null) { - this.blocksNode = new DefaultMutableTreeNode(new Payload("(Building Blocks)", null), true); - @SuppressWarnings("unchecked") - Map>> newBlocks = - (Map>>) ConfigurationManager.getInstance().readObject( - IPlugInPort.BLOCKS_KEY, null); - if (newBlocks != null) { - List blockNames = new ArrayList(newBlocks.keySet()); - Collections.sort(blockNames); - refreshBlocks(blockNames); - this.blocks = blockNames; - } else { - this.blocks = new ArrayList(); - } - } - return this.blocksNode; - } - - @SuppressWarnings("unchecked") - private void refreshRecentComponents(List recentComponentClassList) { - getRecentNode().removeAllChildren(); - for (String componentClassName : recentComponentClassList) { - final ComponentType componentType; - try { - componentType = - ComponentProcessor.getInstance().extractComponentTypeFrom( - (Class>) Class.forName(componentClassName)); - Payload payload = new Payload(componentType, new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (plugInPort.getNewComponentTypeSlot() != componentType) - plugInPort.setNewComponentTypeSlot(componentType, null); - } - }); - final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(payload, false); - String text = getSearchField().getText(); - boolean visible = - text.trim().length() == 0 || componentType.getName().toLowerCase().contains(text.toLowerCase()) - || componentType.getDescription().toLowerCase().contains(text.toLowerCase()) - || componentType.getCategory().toLowerCase().contains(text.toLowerCase()); - payload.setVisible(visible); - getRecentNode().add(componentNode); - } catch (ClassNotFoundException e) { - LOG.error("Could not create recent component button for " + componentClassName, e); - } - } - getTreeModel().nodeStructureChanged(getRecentNode()); - } - - private void refreshBlocks(List blocks) { - getBlocksNode().removeAllChildren(); - for (final String block : blocks) { - Payload payload = new Payload(block, new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (e == null || SwingUtilities.isLeftMouseButton(e)) { - try { - plugInPort.loadBlock(block); - } catch (InvalidBlockException e1) { - // TODO Auto-generated catch block - e1.printStackTrace(); - } - } - } - }); - final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(payload, false); - String text = getSearchField().getText(); - boolean visible = text.trim().length() == 0 || block.toLowerCase().contains(text.toLowerCase()); - payload.setVisible(visible); - getBlocksNode().add(componentNode); - } - getTreeModel().nodeStructureChanged(getBlocksNode()); - } - - public DefaultTreeModel getTreeModel() { - if (treeModel == null) { - final DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Components", true); - rootNode.add(getRecentNode()); - rootNode.add(getBlocksNode()); - Map> componentTypes = plugInPort.getComponentTypes(); - List categories = new ArrayList(componentTypes.keySet()); - Collections.sort(categories); - for (String category : categories) { - final DefaultMutableTreeNode categoryNode = new DefaultMutableTreeNode(new Payload(category, null)); - rootNode.add(categoryNode); - for (final ComponentType type : componentTypes.get(category)) { - final DefaultMutableTreeNode componentNode = new DefaultMutableTreeNode(new Payload(type, new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - plugInPort.setNewComponentTypeSlot(type, null); - } - }), false); - categoryNode.add(componentNode); - } - } - treeModel = new DefaultTreeModel(rootNode); - } - return treeModel; - } - - public JTree getTree() { - if (tree == null) { - tree = new JTree(getTreeModel()); - tree.setRootVisible(false); - tree.setCellRenderer(new ComponentCellRenderer()); - tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); - tree.setRowHeight(0); - ToolTipManager.sharedInstance().registerComponent(tree); - - tree.addTreeSelectionListener(new TreeSelectionListener() { - - @Override - public void valueChanged(TreeSelectionEvent e) { - DefaultMutableTreeNode node = (DefaultMutableTreeNode) e.getPath().getLastPathComponent(); - if (node != null && node.getUserObject() != null) { - Payload payload = (Payload) node.getUserObject(); - if (payload.getClickListener() != null) { - payload.getClickListener().mouseClicked(null); - } - } - } - }); - - tree.addMouseListener(new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() != 1) - return; - - if (SwingUtilities.isRightMouseButton(e)) { - int row = tree.getClosestRowForLocation(e.getX(), e.getY()); - tree.setSelectionRow(row); - getPopup().show(e.getComponent(), e.getX(), e.getY()); - } else { - TreePath path = tree.getClosestPathForLocation(e.getX(), e.getY()); - DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent(); - if (node != null && node.getUserObject() != null) { - Payload payload = (Payload) node.getUserObject(); - if (payload.getClickListener() != null) { - payload.getClickListener().mouseClicked(e); - } - } - } - } - }); - } - return tree; - } - - public JPopupMenu getPopup() { - if (popup == null) { - popup = new JPopupMenu(); - popup.add("Loading..."); - popup.addPopupMenuListener(new PopupMenuListener() { - - @Override - public void popupMenuWillBecomeVisible(PopupMenuEvent e) { - popup.removeAll(); - - DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); - - if (selectedNode == null || selectedNode.getUserObject() == null) - return; - - Payload payload = (Payload) selectedNode.getUserObject(); - - final ComponentType componentType = payload.getComponentType(); - - final String identifier = - componentType == null ? "block:" + payload.toString() : componentType.getInstanceClass() - .getCanonicalName(); - - JMenu shortcutSubmenu = new JMenu("Assign Shortcut"); - final JMenuItem noneItem = new JMenuItem("None"); - noneItem.addActionListener(new ActionListener() { - - @SuppressWarnings("unchecked") - @Override - public void actionPerformed(ActionEvent e) { - HashMap map = - (HashMap) ConfigurationManager.getInstance().readObject(COMPONENT_SHORTCUT_KEY, null); - if (map == null) - map = new HashMap(); - - Iterator> it = map.entrySet().iterator(); - while (it.hasNext()) { - Entry item = it.next(); - if (item.getValue().equals(identifier)) - it.remove(); - } - - ConfigurationManager.getInstance().writeValue(COMPONENT_SHORTCUT_KEY, map); - - TreePanel.this.invalidate(); - TreePanel.this.repaint(); - } - - }); - - shortcutSubmenu.add(noneItem); - - for (int i = 1; i <= 12; i++) { - final JMenuItem item = new JMenuItem("F" + i); - item.addActionListener(new ActionListener() { - - @SuppressWarnings("unchecked") - @Override - public void actionPerformed(ActionEvent e) { - HashMap map = - (HashMap) ConfigurationManager.getInstance().readObject(COMPONENT_SHORTCUT_KEY, - null); - if (map == null) - map = new HashMap(); - - if (map.containsKey(item.getText())) - map.remove(item.getText()); - - Iterator> it = map.entrySet().iterator(); - while (it.hasNext()) { - Entry item = it.next(); - if (item.getValue().equals(identifier)) - it.remove(); - } - - map.put(item.getText(), identifier); - - ConfigurationManager.getInstance().writeValue(COMPONENT_SHORTCUT_KEY, map); - - TreePanel.this.invalidate(); - TreePanel.this.repaint(); - } - }); - shortcutSubmenu.add(item); - } - - if (componentType != null) { - popup.add(new SelectAllAction(plugInPort)); - popup.add(shortcutSubmenu); - popup.add(new JSeparator()); - - List