From 664bf9185251efebe9e782522f271b8ba15aad3e Mon Sep 17 00:00:00 2001 From: bancika Date: Sat, 22 Jan 2011 13:17:43 +0000 Subject: [PATCH] added layer locking added eyelet board --- .../DIYLC/config.xml | 8 +- .../DIYLC/library/main.jar | Bin 44229 -> 46065 bytes .../DIYLC/src/org/diylc/common/EventType.java | 4 +- .../src/org/diylc/common/IPlugInPort.java | 4 + .../src/org/diylc/common/ObjectCache.java | 15 ++- .../DIYLC/src/org/diylc/core/Project.java | 24 ++--- .../DIYLC/src/org/diylc/gui/MainFrame.java | 10 +- .../src/org/diylc/gui/editor/FontEditor.java | 51 +++++++++ .../plugins/layers/LayersMenuPlugin.java | 89 ++++++++++++++++ .../org/diylc/presenter/DrawingManager.java | 21 ++-- .../src/org/diylc/presenter/Presenter.java | 83 ++++++++++++--- .../components/boards/AbstractBoard.java | 2 +- .../diylc/components/boards/EyeletBoard.java | 100 ++++++++++++++++++ .../diylc/components/boards/PerfBoard.java | 2 +- .../diylc/components/boards/VeroBoard.java | 26 ++--- 15 files changed, 372 insertions(+), 67 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/editor/FontEditor.java create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/layers/LayersMenuPlugin.java create mode 100644 diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/EyeletBoard.java diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml index 7db6c71a..6e6f225b 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -1,14 +1,14 @@ - metric - false + lastPath + C:\Documents and Settings\Branislav Stojkovic\Desktop zoom 1.0 - lastPath - C:\Documents and Settings\Branislav Stojkovic\Desktop + metric + true \ No newline at end of file diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar b/ diy-layout-creator --username bancika@gmail.com/DIYLC/library/main.jar index 8d0dbb07dfaeb915d5f6eb933445e8e2aab4d01f..c479bf4b9a375b7ea9ac227fbf44e00725dd6203 100644 GIT binary patch delta 8651 zcmZWuWmuG3*G9U#2aynoAtj}e?k?$03F&<34rK@drMsH}q#L9`x=W-b1>}4jnShCJ|mFm#3&!Fu2e6DxVZ zhoiv3eT1~a^8q%lAZ?=izE@HS{qhv_)Ui{~UNh7zQGKJF9Je1xFfC&?ReQ^ z)}xVE`EGYz9uE2R3ioo&9Ii0PlQmg#i71GK&1`F%`T*zydtS*QSDJRot}KtN&0rdK zuhnB3_OD$~f9Mm!Ji=PX@-)MB>`M2#A}(l4>Rf#3DX`LMb!>i8LB;6D8+^rnW0>su z_*w<`NuTuGwY2y(sqkov^2w1fUM42qej(`xw6%L&%8o)ZU#T9epW*jt zwB} z4oi);VZF0-qb($5-C3=)Epbx`pkET9>j2HVY^Cs84bUSIc59Awhw1C9)b1FY8g065 zdS?Sgc2Sm!IyL!R@A@%+LKEuKM%B@tztkT6tk$N)&?oGk73^wG5%~(U!4S#k zxSOqS16vU+OPSbg(? zVSCp?-leY!QO8fHqScj(ue9(rj1C^Td^A&srUoWWf3&hZe6?}r9m^WXbu_lKoQACg z6rH8ntAf!|TX^sDFl~%Nbph?X+d^?cNf=K7yRU=OKx9;cg`M-`H`w zDRxl{8g+@QJnivJ5moCl!IUR8sd|F)G>??R+zE^w;i=Ol=_}hs3zev6T_5&LL^tfx zKG8%o>Yk0D=pxW4KndUgEJOWr>kc8G3j+zOjz5JSYiS z-SEKo$6+dN8&(v?1KyrU-^uo5(%m5e+iQ1-=(sdm~DmM!#z}p+w zV3GT)k2qMN<8oN(`J;5b_~*9y;LkM+T~44S5~X>e3CZA8zA{-q1)=<{kuWM^^yVF6 z7yVJzw*-gN5{$RoL--A}`m5QochirSU80f_?$e#KdjePj=6YMO?DWATKF}ypi~sX#$LE{w(0I5DVGQ->5zE- zF-G}Wv0C$o*G!zRexReCfc9i$3i3&cNo%7u;758V1g!+(VxLM|l`MGN15dBNVn8T#7#@4=rnPHa|Lz}2YFxDHN$Ii2fEW6t; zlQtx*)DwWuY$7qr$QuPFmP7F^y1S`oEH+OQqVpQKPH<5CS2f>EWe zeTlM(>a-ix@Tqh^%gN|HArJ1GPIV+%xUGL#|`Wj<_K3SY6Rs*MD_}*ipWDI6g zENufw_N*quesj;)Qb=F;eHfowAkR?k`|^l?k9m{HaFNY8z4m;9rrd1t4fet=zKezZ zleuqZHZ`snWFd2FKT(sNMi6i#OK* zzuHea=uKbt=*ODRsdJ*FRza1kUSHxC9=nU7dgA?TpX-sg zPVM~Yu;VRL5vv852jm!_)h?+SdC2?K)|u<=>nZESG3CAVIR7DQbTS#t>W6*C>X!>1 zo4|Ac3GP2<7Ih=zx3LK0QI@>sBQ|)|D1Vmh^jh+He2~0BSbPqEN~q(uN~JmI_5rz1 zFjy%n$Z)01M0>lc^39xdxP>5OYF2LTMhkuxB1#8;?lwV_lVL0I(_JDpsZHt?(v(^0 zw>Z3Ir@eH2Z}#UW3>lhI(5{?LSKX2?Ltj10kc`WD9fHWy03RP3J5s)Q>~GD_9r)ra zqUVH`qpd2}U(hX4L!&y+P6VWRXDE=EX7y_NKS%!c=pVU9{q=cJ>xZrlkM~Qs2O_R} ze30SbDly^USRkG7PXI|T3wsOKmyRZH%vsIsOKLvEHecAcK&~C;zjvQ(lpKk&Vy8 zJVGLLnOm)1oU5t4jyoe;KYy;WwIe`@fxarNe17}T(cn&T5gY)4nY1i8lG>1Rr!&fg z)EyIh2>r+^4itZnCcEBew$9oY)mx#No89*Zv&B~Qj( z7sr^ra3~E>JCL*b{_zk##g*?!RF1d5Os!-KDrGx2{t0jPL{0MSz1a9ohYkmzt(4_p zlub)A9;N+7u0TkX)a-K=rqL^shy$M2Q|-E0JoD4ExI+M6vl!&aRvK|=P}gz6pj^;8 z`IB93IY#RMU$;d+kA3@ByS8eXrEPw3sX?QjF)JH_H^t-9)FAF9Eq7z2d4|U;l}R|( ze#z9qHzh%{gr6$bu;f}hh8}f~jR?IIud#6+$6uyxaKr`)6<8%?*S!|lqOj;8m}?j( zc&(K-v{wL(=|N^Kx-a?%vdm8QIg1Uf}?J*J>Bs5|6B&EHU^s z@7ldds@+S2isC?}5@j*nwSd*L=%Z{FW?JddV_NAGU|Q)FKwnWm6&B8F$=?w7l^87RD<9@~ZPeR;9a8RJVoDDZ z3>*VAeB;FF-+Tff@q8@&z9($aGIe-ZGx(Zc*(V#Eqq{8@ zdt(c_fd1SQz{wYAzRXAZqS>m%Df-RpnU9vT}y9mtYc-KT$BMBh6)_$=oz&vI7UK-65@bW{>juKg76C6eudPgV%>rS58{YjS|N2>zba?stF)I8)J*hdMz>~k9l=m`AT<

1b1AhM%4HH`&&ct`9A96M0bY|#+{AZ#mohGnCpSGgO z1tIGk9(6Ny77_e3ek*Mns`6W20v&mE!II1lkw|tsWh&uFPnsq0k1It}EZR*X^AGQK z?-M4WiG6x9_!(WHEcnFnAuI-IK(dA)e!RlFMxxJ>!`=8Sn>r#GswKDu8*=)(lap#y zJ=(jMnF(Us^efmQ75vh=#tW!&sYM zpM*2qK|bqb_+RvVO7d^?`kG}U!XNC*`_>Svog-auCl4A>L3c1Sx)3en17Nm3UY1WS z`N*N!6DWHB%qG;@Ke@|;qo0mqCF?7Q$PXP9QSU6gk8c|KzFw^Q8nnZPqE*B8in-V_ zRLjHwd*Um6s8@nSZ!ZJ3mLpK;ife5*=ZYL#h{qp2(rV|tM`lmfzdZ%r;Id^Z1MgO8 zY3e8@%+Tm!arW;Tzs_z7XUA6VY)A0${@QCmdDJJQyA&->c@(^peGL4eV8RGbU2kF@ zgsTX$jwuZ6Rq3FTBBK4$C4CGv!l}GuYa3GpO?_-7&MEgH*Jq;&!y9euZH{ZKQP8!Q zdqFhcc*joDfgqzh&K@75$=1TpvMVjeE32)?Z9c25oWRekVMjQJjwh=2Qj9^0<6i8Z zU$?X4k$&R6Ctch2rz~SYHj!S>DqAzzfvOgrya&GL&IM#MsCIu6#HH>OE5PP(d!IzP zzCOV~*}bVCgx3l2jG|UP`%YGnVezerJ&ygG7ZO{D`<-u0CQgng9-HLJbHnvmL##tm zp*!VU9Pksg!|O(EVP+r2&VBS1T%9Abiela6u>I7yR{9hoTn}{SLB57vyN1e57} z7ZvZwxwsq$xIbx32-@Rv>C0GM5xHE|qe-~$2rQJ;Z6wtv*j(XdmF-Pdh+4PUq~E`W zuOAF^2o&v`z)Ew~7NAm5Qo5ZuvfcKt-C73TzD{ic`pB3C8cc2_jm~1dHiGssN$CJe zk(7MJflOZ@)Vmcvuwc_X@^t6NVr33FlpTKslD01Wlbqjs`Ga zJDR@N8MUR4a!sN7y@rqM81aSIyAP7BWY<`Oz3ZRE-m52qUo>>2g-#_7%Pw6eXeyq% zML+gqiu_xk-j%VDIymOcOy~vbi2Ju=N|%<-7g*VJ zN9G)39(aU};78)@8Z0}BH&y~=hF;U@HTZH;^u3L1Z(yvO?@1)U* z!X(@y?b@W_8>5VvtRz{r_P(KVL*2JeOGLXm6pON-gsH6ujY!Yy2N9rDa-BxK%6`GZ zujw1Ej^3tyir`*y{f+f@F`?RhFxCsZv$^b$-oKQk#cSb8ZzUOO^M~J{Lk> zhEAbg+&$bTUv`zSh|li5@lxG36)LpCXa2Lv=y4i<*Ky) z5MWIqHbQD^gC0Ze*}R}!Jf_*P@d9y>xu-lA8s98!kY>T+gk%YFiq23MBV-ic_&|G^5{+J@Y^-=L0Bm)|8){y||ghJ5#z@-Odg!F!)-w(~@y+ zYmLp#Ga}x0<}GQfC{DK5>PqY~iGU=n@&jwbZ@d7L~uRBK|E@rLgU zzTL9@m+c;OcDr)ZQ?>yS>@ssBexv6}M6ZzCUW9bJ5L(J^5Rr7xak||K^pF}2$4UT!Afp7d00lgHb5dtq0!6=4 z3`kmr6x^50Y;Rf^Eo6;MD)^a!6JhQsnbrAMx=@4{i<|ASPP#Pi1p!)xE@e8<}J$HM0Zl$6oy zKG(wXA`u(mo*(j~1@9s{MRwNd@$M2;MbuBuP6Dqo*4wSj9@0o;y_F|+?&s+zf#6J` zHn;V;_HGp6$Hc&=D?KD-22Zt@!N0CpSmeL1SdoCfR?zv|kee7YpEk?e;52TNfucKE z{BOu{Brc&-slGs)OyO;Roh(bf;t$vrs}ZrD-stlsF$vy~DD}s|$A^%r`c-FXwPvps zrhK_LySzTEk#r|4Hg01>_OIq;rruOnGL<1;vwZD*-p-BG(>Waf!XhL zsw> zpAtcS)U0&HG9C2y0ow>B>)#*ykA~rJ$@9~)AY;@93q$SC{^+$LBA^CI# z%AXf7kA^dO&H6AQGj%1bGT!n0@!VfWc;X`?Z;J5FBd zqNj7?s0TL~U%fy?uAV{t9ez%}(5rc#dh%`7Y+WtW>1s?ilLa)Eb$)fGwjdOZgI+(T zX0N$eAI*c^b+NqSZVkccRrOk+*b{rK)bkNri63Vg~)O9G10B(kB6jVZzkDyR(WkFgJ9%{v)H7ABS@9h<|NsV9ojx&_~D@}ScSH(!mt0pn9M`VU+5++cPU zynXNQd#3Jq1Ya2C?p2nFmzF0F-Vs8og(h1^8?#Kv65XCfEbhTW?o>x{yy|H7?{&s!+)v^ACOR{BTVqi6B^xT=ltC{h! z5{6pRLDd~}4ubYb;K#l33jGeQddB-J4E+#$+{cri0a}mE<#U>fT`1Ldxoj;}<<+f; zzb6G$MACqb_sj+&CInaJ>s_=3x#CYoZ5S%$3R`w?=jlBRC0)s@hvz1Vw7i_1W0FY@ zk)}t)TElMC^Om^c(=S5@CA%pcGQ>A2L$?Y<<8ZT*w}d7LR^+q zK;Sa^^VwoXQvkgN-J6I)W4v$;x0q<_=}m0pnDd@Xj6tF4V5w-=v^bxF}; zTghKLu_g0T8i!eF9St6OgZ1y+BUmoo=rgkWDqE2`Z1a zu*J}OUTQ8xBS+g9TQSM3SJc-~+1a4Yiq|=q-+xgBg?EB-R0q7~M2&3eu^M;AT2y}B zSB?SoBlq~cIm}s9T$BLTz#`HtR5>IpDd<&jHgwGWLAV|H?Hsl3+q&I#bGYN0E3p;( zRyN{tFwUvS9|~D}LEeDy>ou{qf|3{+R_K2kiv%lZGbQ~l9J6gA!YngfcgWbkGMDZ7 zD@|6vo*Z!?PSK!*9IRRtK>!8Di4>QHhjIFd3&g!J;NS|#AyqCQh)NEAErwJo28>jw zIu8#k1Zym!!wM!wBftGQtnhyKL-Mu3??S%IlfQfB#qzsw1)Tow*?uV5?>HzCdcTKZ z5v`653)qsH1|vgsviM-ntB@=a7|vv|!4M^z8-^m;qQ4v^hSqJ=aM{pfS^E*aw%Zs zKa#(Hkf$;KAq)LaK3GNm5j-Knucu~MF8SY^_(KXA{6~~Df`6hwWb#0;Cjb2!`fsu$ z`QKz>NL3ytY?$qNAowQgU*?D9O~@yLMSv@M<2rx@2Y39?9Ooa+y`lS?3enAf3=80u z4}y;d|6^_b+q&>z1#$di1r<=hxcmhm_*$NStUd*#PkznkNm#mF)kB(L1Pcz11I&cvP-cIK~RjaDR|I?hX5QgT*hh@wogoC5~ zqd93knB!0pIc&zMF~op?hm$sj4F~u94G z;+CR9jI2l@BPG9kSyBvwM|1s8)lTtK*toDtK=3x+f1A-DawT9`cyaaFtEGqVs}JFM z{s$8S_AV2B8Z3--Y4R#wtR2 zSQOKTjqu`+hKJ++c0z%ymXgCde^&~EXH59pj10+&Muy0j{T}YCG7vnF1*g)(ZO{->}2x7Uvd8rT&#Cf delta 6949 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 basicStrokeMap = new HashMap(); - + public Stroke fetchBasicStroke(int width) { if (basicStrokeMap.containsKey(width)) { return basicStrokeMap.get(width); diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java index 3f0f926d..2b54b590 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/core/Project.java @@ -34,10 +34,12 @@ public class Project implements Serializable { private Size gridSpacing; private List> components; private Set>> groups; + private Set lockedLayers; public Project() { components = new ArrayList>(); groups = new HashSet>>(); + lockedLayers = new HashSet(); title = DEFAULT_TITLE; author = System.getProperty("user.name"); width = DEFAULT_WIDTH; @@ -45,19 +47,6 @@ public class Project implements Serializable { gridSpacing = DEFAULT_GRID_SPACING; } - public Project(String title, String author, String description, Size width, Size height, - Size gridSpacing, List> components, Set>> groups) { - super(); - this.title = title; - this.author = author; - this.description = description; - this.width = width; - this.height = height; - this.gridSpacing = gridSpacing; - this.components = components; - this.groups = groups; - } - @EditableProperty(defaultable = false) public String getTitle() { return title; @@ -129,6 +118,10 @@ public class Project implements Serializable { public Set>> getGroups() { return groups; } + + public Set getLockedLayers() { + return lockedLayers; + } @Override public int hashCode() { @@ -184,6 +177,11 @@ public class Project implements Serializable { return false; return true; } + + @Override + public String toString() { + return title; + } // @Override // public Project clone() throws CloneNotSupportedException { diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java index 3ca6cad5..e5378dde 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/MainFrame.java @@ -15,6 +15,7 @@ import java.util.Map; import javax.swing.Action; import javax.swing.BoxLayout; import javax.swing.Icon; +import javax.swing.JCheckBoxMenuItem; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JMenu; @@ -33,6 +34,7 @@ import org.diylc.plugins.canvas.CanvasPlugin; import org.diylc.plugins.clipboard.EditMenuPlugin; import org.diylc.plugins.file.FileMenuPlugin; import org.diylc.plugins.help.HelpMenuPlugin; +import org.diylc.plugins.layers.LayersMenuPlugin; import org.diylc.plugins.statusbar.StatusBar; import org.diylc.plugins.toolbox.ToolBox; import org.diylc.presenter.Presenter; @@ -69,6 +71,7 @@ public class MainFrame extends JFrame implements IView { presenter.installPlugin(new ToolBox()); presenter.installPlugin(new FileMenuPlugin()); presenter.installPlugin(new EditMenuPlugin()); + presenter.installPlugin(new LayersMenuPlugin()); // presenter.installPlugin(new OnlineManager()); presenter.installPlugin(new HelpMenuPlugin()); @@ -195,7 +198,12 @@ public class MainFrame extends JFrame implements IView { if (action == null) { menu.addSeparator(); } else { - menu.add(action); + Boolean isCheckBox = (Boolean) action.getValue(IPlugInPort.CHECK_BOX_MENU_ITEM); + if (isCheckBox != null && isCheckBox) { + menu.add(new JCheckBoxMenuItem(action)); + } else { + menu.add(action); + } } } diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/editor/FontEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/editor/FontEditor.java new file mode 100644 index 00000000..60842d10 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/gui/editor/FontEditor.java @@ -0,0 +1,51 @@ +package org.diylc.gui.editor; + +import java.awt.Color; +import java.awt.Cursor; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.BorderFactory; +import javax.swing.JColorChooser; +import javax.swing.JLabel; +import javax.swing.SwingConstants; + +import org.diylc.common.PropertyWrapper; + + +public class FontEditor extends JLabel { + + private static final long serialVersionUID = 1L; + + public FontEditor(final PropertyWrapper property) { + super("Click to edit"); + setOpaque(true); + setHorizontalAlignment(SwingConstants.CENTER); + setBorder(BorderFactory.createEtchedBorder()); + setBackground((Color) property.getValue()); + setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { +// JFo + Color newColor = JColorChooser.showDialog(FontEditor.this, "Choose Color", + getBackground()); + if (newColor != null) { + property.setValue(newColor); + setBackground(newColor); + } + } + }); + } + + @Override + public void setBackground(Color bg) { + if (bg.getRed() < 127 || bg.getBlue() < 127 || bg.getGreen() < 127) { + setForeground(Color.white); + } else { + setForeground(Color.black); + } + super.setBackground(bg); + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/layers/LayersMenuPlugin.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/layers/LayersMenuPlugin.java new file mode 100644 index 00000000..3b564185 --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/plugins/layers/LayersMenuPlugin.java @@ -0,0 +1,89 @@ +package org.diylc.plugins.layers; + +import java.awt.event.ActionEvent; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import javax.swing.AbstractAction; +import javax.swing.Action; + +import org.diylc.common.EventType; +import org.diylc.common.IPlugIn; +import org.diylc.common.IPlugInPort; +import org.diylc.core.IDIYComponent; + +public class LayersMenuPlugin implements IPlugIn { + + private static final String LOCK_LAYERS_TITLE = "Lock Layers"; + + private IPlugInPort plugInPort; + private Map lockActionMap; + + public LayersMenuPlugin() { + } + + @Override + public void connect(IPlugInPort plugInPort) { + this.plugInPort = plugInPort; + + lockActionMap = new HashMap(); + for (Layer layer : Layer.values()) { + final int zOrder = layer.getZOrder(); + AbstractAction action = new AbstractAction(layer.getTitle()) { + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + LayersMenuPlugin.this.plugInPort.setLayerLocked(zOrder, true); + } + }; + action.putValue(IPlugInPort.CHECK_BOX_MENU_ITEM, true); + lockActionMap.put(layer, action); + plugInPort.injectMenuAction(action, LOCK_LAYERS_TITLE); + } + } + + @Override + public EnumSet getSubscribedEventTypes() { + return EnumSet.of(EventType.LAYER_STATE_CHANGED); + } + + @Override + public void processMessage(EventType eventType, Object... params) { + if (eventType == EventType.LAYER_STATE_CHANGED) { + Set lockedLayers = (Set) params[0]; + for (Layer layer : Layer.values()) { + lockActionMap.get(layer).putValue(Action.SELECTED_KEY, + lockedLayers.contains(layer.getZOrder())); + } + } + } + + static enum Layer { + BELOW_CHASSIS("Below Chassis", IDIYComponent.BELOW_CHASSIS), CHASSIS("Chassis", + IDIYComponent.CHASSIS), ABOVE_CHASSIS("Above Chassis", IDIYComponent.ABOVE_CHASSIS), BELOW_BOARD( + "Below Board", IDIYComponent.BELOW_BOARD), BOARD("Board", IDIYComponent.BOARD), ABOVE_BOARD( + "Above Board", IDIYComponent.ABOVE_BOARD), COMPONENT("Component", + IDIYComponent.COMPONENT), ABOVE_COMPONENT("Above Component", + IDIYComponent.ABOVE_COMPONENT); + + String title; + int zOrder; + + private Layer(String title, int order) { + this.title = title; + zOrder = order; + } + + public String getTitle() { + return title; + } + + public int getZOrder() { + return zOrder; + } + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java index 16dd53d3..c2a1af3a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/DrawingManager.java @@ -10,7 +10,6 @@ import java.awt.Point; import java.awt.Rectangle; import java.awt.RenderingHints; import java.awt.geom.Area; -import java.awt.geom.Point2D; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -58,9 +57,10 @@ public class DrawingManager { private Map, ComponentState> lastDrawnStateMap; private Composite slotComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); + private Composite lockedComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.3f); private double zoomLevel = 1d;// ConfigurationManager.getInstance().readDouble(ZOOM_KEY, - // 1d); + // 1d); private MessageDispatcher messageDispatcher; @@ -73,8 +73,8 @@ public class DrawingManager { public void drawProject(Graphics2D g2d, Project project, Set drawOptions, IComponentFiler filter, Rectangle selectionRect, ComponentSelection selectedComponents, - Set> groupedComponents, List controlPointSlot, - IDIYComponent componentSlot, boolean dragInProgress) { + Set> lockedComponents, Set> groupedComponents, + List controlPointSlot, IDIYComponent componentSlot, boolean dragInProgress) { if (project == null) { return; } @@ -155,6 +155,10 @@ public class DrawingManager { if (!trackArea) { g2dWrapper.stopTracking(); } + // Draw locked components in a new composite. + if (lockedComponents.contains(component)) { + g2d.setComposite(lockedComposite); + } // Draw the component through the g2dWrapper. component.draw(g2dWrapper, state, project, g2dWrapper); Area area = g2dWrapper.finishedDrawingComponent(); @@ -277,15 +281,6 @@ public class DrawingManager { return componentAreaMap.get(component); } - public boolean isCursorOverArea(Point2D cursorPosition) { - for (Map.Entry, Area> entry : componentAreaMap.entrySet()) { - if (entry.getValue().contains(cursorPosition)) { - return true; - } - } - return false; - } - public List> findComponentsAt(Point point, Project project) { List> components = new ArrayList>(); for (Map.Entry, Area> entry : componentAreaMap.entrySet()) { diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java index 970833d2..ba405b64 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/Presenter.java @@ -56,7 +56,7 @@ public class Presenter implements IPlugInPort { private static final Logger LOG = Logger.getLogger(Presenter.class); - public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 0, 1); + public static final VersionNumber CURRENT_VERSION = new VersionNumber(3, 0, 3); public static final String DEFAULTS_KEY_PREFIX = "default."; public static final String METRIC_KEY = "metric"; @@ -72,6 +72,7 @@ public class Presenter implements IPlugInPort { // Maps components that have at least one dragged point to set of indices // that designate which of their control points are being dragged. private Map, Set> controlPointMap; + private Set> lockedComponents; // Utilities private Cloner cloner; @@ -103,6 +104,7 @@ public class Presenter implements IPlugInPort { plugIns = new ArrayList(); messageDispatcher = new MessageDispatcher(); selectedComponents = new ComponentSelection(); + lockedComponents = new HashSet>(); currentProject = new Project(); cloner = new Cloner(); drawingManager = new DrawingManager(messageDispatcher); @@ -153,12 +155,17 @@ public class Presenter implements IPlugInPort { if (instantiationManager.getComponentTypeSlot() == null) { // Scale point to remove zoom factor. Point2D scaledPoint = scalePoint(point); - if (drawingManager.isCursorOverArea(scaledPoint)) { - return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); - } if (controlPointMap != null && !controlPointMap.isEmpty()) { return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); } + for (IDIYComponent component : currentProject.getComponents()) { + if (!isComponentLocked(component)) { + Area area = drawingManager.getComponentArea(component); + if (area != null && area.contains(scaledPoint)) { + return Cursor.getPredefinedCursor(Cursor.HAND_CURSOR); + } + } + } } return Cursor.getDefaultCursor(); } @@ -181,6 +188,8 @@ public class Presenter implements IPlugInPort { updateSelection(ComponentSelection.EMPTY_SELECTION); messageDispatcher.dispatchMessage(EventType.PROJECT_LOADED, project, freshStart); messageDispatcher.dispatchMessage(EventType.REPAINT); + messageDispatcher.dispatchMessage(EventType.LAYER_STATE_CHANGED, currentProject + .getLockedLayers()); } @Override @@ -296,9 +305,9 @@ public class Presenter implements IPlugInPort { componentSlotToDraw = instantiationManager.getComponentSlot(); } drawingManager.drawProject(g2d, currentProject, drawOptions, filter, selectionRect, - selectedComponents, groupedComponents, Arrays.asList(instantiationManager - .getFirstControlPoint(), instantiationManager.getPotentialControlPoint()), - componentSlotToDraw, dragInProgress); + selectedComponents, getLockedComponents(), groupedComponents, Arrays.asList( + instantiationManager.getFirstControlPoint(), instantiationManager + .getPotentialControlPoint()), componentSlotToDraw, dragInProgress); } @Override @@ -323,12 +332,20 @@ public class Presenter implements IPlugInPort { /** * Finds all components whose areas include the specified {@link Point}. - * Point is not scaled by the zoom factor. + * Point is not scaled by the zoom factor. Components that belong to + * locked layers are ignored. * * @return */ private List> findComponentsAt(Point point) { - return drawingManager.findComponentsAt(point, currentProject); + List> components = drawingManager.findComponentsAt(point, currentProject); + Iterator> iterator = components.iterator(); + while (iterator.hasNext()) { + if (isComponentLocked(iterator.next())) { + iterator.remove(); + } + } + return components; } @Override @@ -350,12 +367,12 @@ public class Presenter implements IPlugInPort { componentTypeSlot, scaledPoint, currentProject); addComponent(component, componentTypeSlot); // Select the new component - updateSelection(ComponentSelection.of(component)); // messageDispatcher.dispatchMessage(EventType.SELECTION_CHANGED, // selectedComponents); // messageDispatcher.dispatchMessage(EventType.SELECTION_SIZE_CHANGED, // calculateSelectionDimension()); messageDispatcher.dispatchMessage(EventType.REPAINT); + updateSelection(ComponentSelection.of(component)); } catch (Exception e) { LOG.error("Error instatiating component of type: " + componentTypeSlot.getInstanceClass().getName(), e); @@ -384,8 +401,9 @@ public class Presenter implements IPlugInPort { IDIYComponent componentSlot = instantiationManager.getComponentSlot(); componentSlot.setControlPoint(scaledPoint, 1); addComponent(componentSlot, componentTypeSlot); - // Select the new component - updateSelection(ComponentSelection.of(componentSlot)); + // Select the new component if it's not locked. + updateSelection(isComponentLocked(componentSlot) ? ComponentSelection.EMPTY_SELECTION + : ComponentSelection.of(componentSlot)); messageDispatcher.dispatchMessage(EventType.REPAINT); setNewComponentTypeSlot(null); } @@ -685,7 +703,7 @@ public class Presenter implements IPlugInPort { // Update all points. for (Map.Entry, Set> entry : controlPointMap.entrySet()) { IDIYComponent c = entry.getKey(); - drawingManager.invalidateComponent(c); + // drawingManager.invalidateComponent(c); for (Integer index : entry.getValue()) { Point p = new Point(c.getControlPoint(index)); p.translate(dx, dy); @@ -739,9 +757,11 @@ public class Presenter implements IPlugInPort { } ComponentSelection newSelection = new ComponentSelection(); for (IDIYComponent component : currentProject.getComponents()) { - Area area = drawingManager.getComponentArea(component); - if ((area != null) && (selectionRect != null) && area.intersects(selectionRect)) { - newSelection.addAll(findAllGroupedComponents(component)); + if (!isComponentLocked(component)) { + Area area = drawingManager.getComponentArea(component); + if ((area != null) && (selectionRect != null) && area.intersects(selectionRect)) { + newSelection.addAll(findAllGroupedComponents(component)); + } } } selectionRect = null; @@ -864,6 +884,19 @@ public class Presenter implements IPlugInPort { } } + @Override + public void setLayerLocked(int layerZOrder, boolean locked) { + if (locked) { + currentProject.getLockedLayers().add(layerZOrder); + } else { + currentProject.getLockedLayers().remove(layerZOrder); + } + updateSelection(ComponentSelection.EMPTY_SELECTION); + messageDispatcher.dispatchMessage(EventType.REPAINT); + messageDispatcher.dispatchMessage(EventType.LAYER_STATE_CHANGED, currentProject + .getLockedLayers()); + } + /** * Updates the selection with the specified {@link ComponentSelection}. * Also, updates control point map with all components that are stuck to the @@ -945,6 +978,8 @@ public class Presenter implements IPlugInPort { Area componentArea = drawingManager.getComponentArea(component); if (componentArea != null) { area.add(componentArea); + } else { + LOG.warn("No area found for: " + component.getName()); } } double width = area.getBounds2D().getWidth(); @@ -1081,6 +1116,22 @@ public class Presenter implements IPlugInPort { } } + private Set> getLockedComponents() { + lockedComponents.clear(); + for (IDIYComponent component : currentProject.getComponents()) { + if (isComponentLocked(component)) { + lockedComponents.add(component); + } + } + return lockedComponents; + } + + private boolean isComponentLocked(IDIYComponent component) { + ComponentType componentType = componentTypeMap.get(component.getClass().getName()); + return currentProject.getLockedLayers().contains( + (int) Math.round(componentType.getZOrder())); + } + /** * Scales point from display base to actual base. * diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java index 777aa1a7..5f3664c4 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/AbstractBoard.java @@ -23,7 +23,7 @@ public abstract class AbstractBoard extends AbstractTransparentComponent public static Color BOARD_COLOR = Color.decode("#F8EBB3"); public static Color BORDER_COLOR = BOARD_COLOR.darker(); public static Size DEFAULT_WIDTH = new Size(1.5d, SizeUnit.in); - public static Size DEFAULT_HEIGHT = new Size(1d, SizeUnit.in); + public static Size DEFAULT_HEIGHT = new Size(1.2d, SizeUnit.in); protected String value = ""; protected Point[] controlPoints = new Point[] { new Point(0, 0), diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/EyeletBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/EyeletBoard.java new file mode 100644 index 00000000..59ded63b --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/EyeletBoard.java @@ -0,0 +1,100 @@ +package org.diylc.components.boards; + +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.Point; + +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.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; +import org.diylc.core.measures.Size; +import org.diylc.core.measures.SizeUnit; +import org.diylc.utils.Constants; + +@ComponentDescriptor(name = "Eyelet Board", category = "Boards", author = "Branislav Stojkovic", zOrder = IDIYComponent.BOARD, instanceNamePrefix = "Board", description = "Perforated board with eyelets") +public class EyeletBoard extends AbstractBoard { + + private static final long serialVersionUID = 1L; + + public static Color EYELET_COLOR = Color.decode("#C3E4ED"); + + public static Size SPACING = new Size(0.3d, SizeUnit.in); + public static Size EYELET_SIZE = new Size(1/8d, SizeUnit.in); + public static Size HOLE_SIZE = new Size(2d, SizeUnit.mm); + + // private Area copperArea; + protected Size spacing = SPACING; + protected Color eyeletColor = EYELET_COLOR; + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, Project project, + IDrawingObserver drawingObserver) { + super.draw(g2d, componentState, project, drawingObserver); + if (componentState != ComponentState.DRAGGING) { + if (alpha < MAX_ALPHA) { + g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1f * alpha + / MAX_ALPHA)); + } + Point p = new Point(firstPoint); + int diameter = getClosestOdd(EYELET_SIZE.convertToPixels()); + int holeDiameter = getClosestOdd(HOLE_SIZE.convertToPixels()); + int spacing = this.spacing.convertToPixels(); + + while (p.y < secondPoint.y - spacing) { + p.x = firstPoint.x; + p.y += spacing; + while (p.x < secondPoint.x - spacing) { + p.x += spacing; + g2d.setColor(eyeletColor); + g2d.fillOval(p.x - diameter / 2, p.y - diameter / 2, diameter, diameter); + g2d.setColor(eyeletColor.darker()); + g2d.drawOval(p.x - diameter / 2, p.y - diameter / 2, diameter, diameter); + g2d.setColor(Constants.CANVAS_COLOR); + g2d.fillOval(p.x - holeDiameter / 2, p.y - holeDiameter / 2, holeDiameter, + holeDiameter); + g2d.setColor(eyeletColor.darker()); + g2d.drawOval(p.x - holeDiameter / 2, p.y - holeDiameter / 2, holeDiameter, + holeDiameter); + } + } + } + } + + @EditableProperty(name = "Eyelet color") + public Color getEyeletColor() { + return eyeletColor; + } + + public void setEyeletColor(Color padColor) { + this.eyeletColor = padColor; + } + + @EditableProperty + public Size getSpacing() { + return spacing; + } + + public void setSpacing(Size spacing) { + this.spacing = spacing; + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.setColor(BOARD_COLOR); + g2d.fillRect(2, 2, width - 4, height - 4); + g2d.setColor(BORDER_COLOR); + g2d.drawRect(2, 2, width - 4, height - 4); + g2d.setColor(EYELET_COLOR); + g2d.fillOval(width / 4, width / 4, width / 2, width / 2); + g2d.setColor(EYELET_COLOR.darker()); + g2d.drawOval(width / 4, width / 4, width / 2, width / 2); + g2d.setColor(Constants.CANVAS_COLOR); + g2d.fillOval(width / 2 - 2, width / 2 - 2, 5, 5); + g2d.setColor(EYELET_COLOR.darker()); + g2d.drawOval(width / 2 - 2, width / 2 - 2, 5, 5); + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java index c019534b..a0005d70 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/PerfBoard.java @@ -64,7 +64,7 @@ public class PerfBoard extends AbstractBoard { } } - @EditableProperty(name = "Pad") + @EditableProperty(name = "Pad color") public Color getPadColor() { return padColor; } diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java index c5a5e11a..7765da5b 100644 --- a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/boards/VeroBoard.java @@ -21,7 +21,7 @@ public class VeroBoard extends AbstractBoard { private static final long serialVersionUID = 1L; - public static Color COPPER_COLOR = Color.decode("#DA8A67"); + public static Color STRIP_COLOR = Color.decode("#DA8A67"); public static Color BORDER_COLOR = BOARD_COLOR.darker(); public static Size SPACING = new Size(0.1d, SizeUnit.in); @@ -29,7 +29,7 @@ public class VeroBoard extends AbstractBoard { public static Size HOLE_SIZE = new Size(0.7d, SizeUnit.mm); protected Size spacing = SPACING; - protected Color padColor = COPPER_COLOR; + protected Color stripColor = STRIP_COLOR; @Override public void draw(Graphics2D g2d, ComponentState componentState, Project project, @@ -50,17 +50,17 @@ public class VeroBoard extends AbstractBoard { while (p.y < secondPoint.y - spacing) { p.x = firstPoint.x; p.y += spacing; - g2d.setColor(padColor); + g2d.setColor(stripColor); g2d.fillRect(p.x + SPACING.convertToPixels() / 2, p.y - stripSize / 2, secondPoint.x - spacing - p.x, stripSize); - g2d.setColor(padColor.darker()); + g2d.setColor(stripColor.darker()); g2d.drawRect(p.x + SPACING.convertToPixels() / 2, p.y - stripSize / 2, secondPoint.x - spacing - p.x, stripSize); while (p.x < secondPoint.x - spacing) { p.x += spacing; g2d.setColor(Constants.CANVAS_COLOR); g2d.fillOval(p.x - holeSize / 2, p.y - holeSize / 2, holeSize, holeSize); - g2d.setColor(padColor.darker()); + g2d.setColor(stripColor.darker()); g2d.drawOval(p.x - holeSize / 2, p.y - holeSize / 2, holeSize, holeSize); } } @@ -68,13 +68,13 @@ public class VeroBoard extends AbstractBoard { } } - @EditableProperty(name = "Pad") - public Color getPadColor() { - return padColor; + @EditableProperty(name = "Strip color") + public Color getStripColor() { + return stripColor; } - public void setPadColor(Color padColor) { - this.padColor = padColor; + public void setStripColor(Color padColor) { + this.stripColor = padColor; } @EditableProperty @@ -92,14 +92,14 @@ public class VeroBoard extends AbstractBoard { g2d.fillRect(2, 2, width - 4, height - 4); g2d.setColor(BORDER_COLOR); g2d.drawRect(2, 2, width - 4, height - 4); - g2d.setColor(COPPER_COLOR); + g2d.setColor(STRIP_COLOR); g2d.fillRect(4, width / 4, width - 8, width / 2); - g2d.setColor(COPPER_COLOR.darker()); + g2d.setColor(STRIP_COLOR.darker()); g2d.drawRect(4, width / 4, width - 8, width / 2); g2d.setColor(Constants.CANVAS_COLOR); g2d.fillOval(width / 3 - 2, width / 2 - 2, 5, 5); g2d.fillOval(2 * width / 3 - 2, width / 2 - 2, 5, 5); - g2d.setColor(COPPER_COLOR.darker()); + g2d.setColor(STRIP_COLOR.darker()); g2d.drawOval(width / 3 - 2, width / 2 - 2, 5, 5); g2d.drawOval(2 * width / 3 - 2, width / 2 - 2, 5, 5); }