From 51c916cbb520f1b1465c58f8828c609b6eca76ac Mon Sep 17 00:00:00 2001 From: bancika Date: Wed, 26 Jan 2011 20:09:15 +0000 Subject: [PATCH] added image component --- .../DIYLC/config.xml | 8 +- .../DIYLC/library/main.jar | Bin 55209 -> 58789 bytes .../src/org/diylc/presenter/G2DWrapper.java | 5 +- .../src/org/diylc/presenter/Presenter.java | 2 +- .../swing/gui/editor/FieldEditorFactory.java | 5 + .../diylc/swing/gui/editor/ImageEditor.java | 44 +++++++ .../swing/plugins/file/FileFilterEnum.java | 5 +- .../DIYLC/update.xml | 124 ++++++++++-------- .../src/org/diylc/components/misc/Image.java | 112 ++++++++++++++++ .../src/org/diylc/components/misc/image.png | Bin 0 -> 1659 bytes 10 files changed, 242 insertions(+), 63 deletions(-) create mode 100644 diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ImageEditor.java create mode 100644 diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/Image.java create mode 100644 diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/image.png 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 992af535..59d99305 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/config.xml @@ -1,15 +1,15 @@ - lastPath - C:\Documents and Settings\Branislav Stojkovic\Desktop + metric + true zoom 1.0 - metric - true + lastPath + C:\Documents and Settings\Branislav Stojkovic\Desktop default.org.diylc.components.misc.Label:Color 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 75535d0006bde5463c4a489c60b639275bbd0624..8c87bfa8820063a5b0db79bf914565c19df2d30a 100644 GIT binary patch delta 4713 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 delta 1159 zcmZ9MZAep57{|}OcWzU+TxiYR3oW6cG0k3>E}1VRHOWj1n)ylzp+u&=2$>>E;1GHt zPMQ!Tn2Sz?RIub28A`k!b0Iyj7XvAik_5i6o(iz`!_Q(gse)0^mvTb+Piq3 zrbgnPabT{~ouVnXel`r0pB{8v#?5I;F_2U7U=j8S|;IL!ekh#MWrq5(g4&=X#9WWjp- ztQmM=HV^n__9!scxgU7KnFH)|<^$KA#lYgZLg3)sabVO33$QB4u^{>Ra?l%sbj_E+ z+Tj}f- zo^2p!c?EW+4j)<4;zn=$R`L6Y>8)>ehaof_iICx+FSe(}av6-P)>!<*3-1GmFA8jH zGsv3jvAArJ%4dkY(n{n+{B%(Rou-H+Zv%;6QbVVY2fjKw7=%i>|2uteC&p|rCB&J+ z9b}vdGEREPI7_#oZ-!5b8*IEd5(JEaZZ1FqDg{C*A%W<-!GI2oygX;Rj~Ls?&iW8z zMGqLeeLRdl>JwN?FGv9&9o?qA-}au2KFK1qJ0x5C2o720--K1e^2CB%hK=FGAA%f- zr)w-!K9G^;t&k$LHzatq|8MZ+vH*=;%L4o9Nl=alDa|jiKgWWS3OD&R8}wxQzy^dm I$Ho2r0C2#c`Tzg` diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/G2DWrapper.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/G2DWrapper.java index 5c09ffc2..e8c78941 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/G2DWrapper.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/presenter/G2DWrapper.java @@ -492,8 +492,9 @@ class G2DWrapper extends Graphics2D implements IDrawingObserver { @Override public boolean drawImage(Image img, int x, int y, ImageObserver observer) { - // FIXME: map - return canvasGraphics.drawImage(img, x, y, observer); + boolean result = canvasGraphics.drawImage(img, x, y, observer); + appendShape(new Rectangle2D.Double(x, y, img.getWidth(observer), img.getHeight(observer))); + return result; } @Override 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 a6812948..badd43ce 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 @@ -709,7 +709,7 @@ public class Presenter implements IPlugInPort { controlPoints[index] = null; } } - System.out.println(Arrays.deepToString(controlPoints)); + for (int i = 0; i < controlPoints.length - 1; i++) { for (int j = i + 1; j < controlPoints.length; j++) { if (controlPoints[i] != null && controlPoints[j] != null diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/FieldEditorFactory.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/FieldEditorFactory.java index 3743aed6..0e6ac86a 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/FieldEditorFactory.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/FieldEditorFactory.java @@ -3,6 +3,7 @@ package org.diylc.swing.gui.editor; import java.awt.Color; import java.awt.Component; +import javax.swing.ImageIcon; import javax.swing.JLabel; import org.apache.log4j.Logger; @@ -26,6 +27,10 @@ public class FieldEditorFactory { MeasureEditor editor = new MeasureEditor(property); return editor; } + if (ImageIcon.class.isAssignableFrom(property.getType())) { + ImageEditor editor = new ImageEditor(property); + return editor; + } if (property.getType().isEnum()) { EnumEditor editor = new EnumEditor(property); return editor; diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ImageEditor.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ImageEditor.java new file mode 100644 index 00000000..552e519f --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/gui/editor/ImageEditor.java @@ -0,0 +1,44 @@ +package org.diylc.swing.gui.editor; + +import java.awt.Color; +import java.awt.event.ActionListener; +import java.io.File; + +import javax.swing.ImageIcon; +import javax.swing.JButton; + +import org.diylc.common.PropertyWrapper; +import org.diylc.swing.gui.DialogFactory; +import org.diylc.swing.plugins.file.FileFilterEnum; + +public class ImageEditor extends JButton { + + private static final long serialVersionUID = 1L; + + public ImageEditor(final PropertyWrapper property) { + super("Click to load file"); + addActionListener(new ActionListener() { + + @Override + public void actionPerformed(java.awt.event.ActionEvent e) { + File file = DialogFactory.getInstance().showOpenDialog( + FileFilterEnum.IMAGES.getFilter(), null, + FileFilterEnum.IMAGES.getExtensions()[0], null); + if (file != null) { + ImageIcon image = new ImageIcon(file.getAbsolutePath()); + property.setValue(image); + } + } + }); + } + + @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/swing/plugins/file/FileFilterEnum.java b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/file/FileFilterEnum.java index eb306edc..508ad906 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/file/FileFilterEnum.java +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/src/org/diylc/swing/plugins/file/FileFilterEnum.java @@ -4,11 +4,12 @@ import java.io.File; import javax.swing.filechooser.FileFilter; -enum FileFilterEnum { +public enum FileFilterEnum { PNG("PNG Images (*.png)", "png"), PDF("PDF Files (*.pdf)", "pdf"), DIY( "DIY Project Files (*.diy)", "diy"), EXCEL("Excel Workbooks (*.xls)", "xls"), CSV( - "Comma Separated Files (*.csv)", "csv"), HTML("HTML Files (*.html)", "html"); + "Comma Separated Files (*.csv)", "csv"), HTML("HTML Files (*.html)", "html"), IMAGES( + "Image Files (*.png, *.jpg, *.gif)", "png", "jpg", "gif"); FileFilter filter; String[] extensions; diff --git a/ diy-layout-creator --username bancika@gmail.com/DIYLC/update.xml b/ diy-layout-creator --username bancika@gmail.com/DIYLC/update.xml index 72d0fc74..b716b555 100644 --- a/ diy-layout-creator --username bancika@gmail.com/DIYLC/update.xml +++ b/ diy-layout-creator --username bancika@gmail.com/DIYLC/update.xml @@ -1,56 +1,72 @@ - - - - 3 - 0 - 4 - - 2011-01-26 19:48:13.687 CET - - - - BUG_FIX - Copy/paste between two instances of the application - - - BUG_FIX - Parsing numerical values in countries that use comma as decimal separator - - - BUG_FIX - Dragging sticky points affects selectability of objects - - - BUG_FIX - Click is sometimes not registered while adding a new component - - - BUG_FIX - Fixed NPE when using default values - - - IMPROVEMENT - Allow shape control points of curves to overlap - - - IMPROVEMENT - Added DIL IC first pin indentation - - - IMPROVEMENT - Added transparency to the potentiometer - - - IMPROVEMENT - Reduced number of layers - - - NEW_FEATURE - Added Label component - - - http://code.google.com/p/diy-layout-creator/downloads/list - - + + + + 3 + 0 + 4 + + 2011-01-26 19:48:13.687 CET + + + + BUG_FIX + Copy/paste between two instances of the + application + + + BUG_FIX + Parsing numerical values in countries that use + comma as decimal separator + + + BUG_FIX + Dragging sticky points affects selectability + of objects + + + BUG_FIX + Click is sometimes not registered while adding a + new component + + + BUG_FIX + Fixed NPE when using default values + + + IMPROVEMENT + Allow shape control points of curves to overlap + + + + IMPROVEMENT + Added DIL IC first pin indentation + + + IMPROVEMENT + Added transparency to the potentiometer + + + + IMPROVEMENT + Reduced number of layers + + + IMPROVEMENT + Import from v1 files can now read label and + electrolytic capacitor components and trace/pad colors + + + NEW_FEATURE + Added label component + + + NEW_FEATURE + Added image component + + + http://code.google.com/p/diy-layout-creator/downloads/list + + + \ No newline at end of file diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/Image.java b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/Image.java new file mode 100644 index 00000000..93c503ac --- /dev/null +++ b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/Image.java @@ -0,0 +1,112 @@ +package org.diylc.components.misc; + +import java.awt.Graphics2D; +import java.awt.Point; + +import javax.swing.ImageIcon; + +import org.diylc.components.AbstractComponent; +import org.diylc.core.ComponentState; +import org.diylc.core.IDIYComponent; +import org.diylc.core.IDrawingObserver; +import org.diylc.core.Project; +import org.diylc.core.VisibilityPolicy; +import org.diylc.core.annotations.ComponentDescriptor; +import org.diylc.core.annotations.EditableProperty; + +@ComponentDescriptor(name = "Image", author = "Branislav Stojkovic", category = "Misc", description = "User defined image", instanceNamePrefix = "Img", zOrder = IDIYComponent.TEXT, stretchable = false) +public class Image extends AbstractComponent { + + private static final long serialVersionUID = 1L; + public static String DEFAULT_TEXT = "Double click to edit text"; + private static ImageIcon ICON; + private static byte DEFAULT_SCALE = 50; + + static { + String name = "image.png"; + java.net.URL imgURL = Image.class.getResource(name); + if (imgURL != null) { + ICON = new ImageIcon(imgURL, name); + } + } + + private Point point = new Point(0, 0); + private ImageIcon image = ICON; + private byte scale = 50; + + @Override + public void draw(Graphics2D g2d, ComponentState componentState, Project project, + IDrawingObserver drawingObserver) { + double s = 1d * scale / DEFAULT_SCALE; + g2d.scale(s, s); + g2d.drawImage(image.getImage(), (int) (point.x / s), (int) (point.y / s), null); + if (componentState == ComponentState.SELECTED) { + g2d.setColor(SELECTION_COLOR); + g2d.drawRect((int) (point.x / s), (int) (point.y / s), image.getIconWidth(), image + .getIconHeight()); + } + } + + @Override + public void drawIcon(Graphics2D g2d, int width, int height) { + g2d.drawImage(ICON.getImage(), point.x, point.y, null); + } + + @Override + public int getControlPointCount() { + return 1; + } + + @Override + public Point getControlPoint(int index) { + return point; + } + + @Override + public boolean isControlPointSticky(int index) { + return false; + } + + @Override + public VisibilityPolicy getControlPointVisibilityPolicy(int index) { + return VisibilityPolicy.NEVER; + } + + @Override + public void setControlPoint(Point point, int index) { + this.point.setLocation(point); + } + + @EditableProperty(defaultable = false) + public ImageIcon getImage() { + return image; + } + + public void setImage(ImageIcon image) { + this.image = image; + } + + @EditableProperty(defaultable = false) + public byte getScale() { + return scale; + } + + public void setScale(byte scale) { + this.scale = scale; + } + + @Override + public String getName() { + return super.getName(); + } + + @Deprecated + @Override + public Void getValue() { + return null; + } + + @Override + public void setValue(Void value) { + } +} diff --git a/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/image.png b/ diy-layout-creator --username bancika@gmail.com/Library/src/org/diylc/components/misc/image.png new file mode 100644 index 0000000000000000000000000000000000000000..b663869f11acedf378092e6edef126bb6a3422b8 GIT binary patch literal 1659 zcmV->288*EP)WdKcYATl{1Q)O@?`?Za+uN3wzQ6{eQY)zfB1$ldjX{lql4vwhOpHd?#SY0g0-~tNy|Ow%#8m(Gw0rO1GvzoOgnd8XXgLr z`(FcGFaP%<_~(P~MrO1|o+_XfloF=pRiQMLnb&p$wTdU`U(mYkYnnHUW}Eqz{{;=` zEX|Wz&@!D(n><>iSv@L;`@NC&Kr9z89y94YZ&Q#X@)x9#hOM zkA-PHE!>#;L}=+-!Ss6YJUjMyOas2){9F-B`)&grMIdw;fRMb!mTXNO>f4voSiuhh zbC8NjcQUfNhO>ohw#xh_Em@4wxaDXVrEVI4V&kA$zKJg+GU_rJUxfW1?Zn8rlUVc6 zQ&_TW1ymFvrmAHO?T-CtFy+?p;_0&WYms7r(Ilr)Hzz_|7(Rh@4?l@0oW=GnFB`xu z?F+GH{U$8#=_3%*d@S6i%Jym?SZ%uGdrGS`11V&*A)`Zdw09U9t8>+O<&Aeq4KbQp z+Aw%^SjWbinBuF0xUyxn8a!+-X#j9qSm}+7MZy*v>w}o>gltHGPRiKT8qiHl?dWX zBs(rMz@FsrB5eaoX(UPrJRenohq{J&xWB(2qa(wZoxX^ghFZkM39Pw$wb5Tw{X!_; zL-*iTbPm2v*YoLQ-w0at(>7dcTY;nNwm}6|MwLD*OJquf31wB_C6<=}I5mD8&ksC? zPma8AVsl4xBf7iV;ge@%bp%h&k(U$=TZ?~u3!T5e2NV_n_49$cMygFfV;l09Por<& zX4C~fswozXTsljd^h#cssKB!-u(LcBiz0@rhp_$F7TmjI6%L&`fTkdWc_gull$R4R zGSt>hoj~ikT|fibK|X(Ft!*GuV(j>KGj7?v0uOw)5nr6&XMkHHOsPN;rHp|ItZ&HS z(Fc17O%}yC#MUFPV%tC`o>}???&?~O=9&Vkv$beEv)|sBXuWEofdAb1N$k9E0?Ab~ zB7nfqX*w*V8j*C#ErnsBeXPB233?wPJ+B1D7mnh^ z(ZlFC{5^J!PZHgAq>2L5XZo8)e#JWz!&aIsSI!?v(i3SnWKK9anfy*a5d|Gj2L=FV z%9y~!)V4O|QI!uc^v4LIMv3!ejE|2F0cVDAYi&L9IUhe1$00*q7OtGtMJWcfWjY1G zt+;-X1O^mHGz(Y!KvAZRsAecQ_1(~dlYdTNY;2B#lnER-B8iF1PGCZNx=PEkb}70d z5*k5f(taCC7H$EsQ0V}e*07<_*)k6e^*Q`CGK-nXuzXW}4dK!%KVd*usz8)ND*NZG zWS_TvrL1JN4!yAIl5D=dwhoY`wHlgi=a@%-M5ioLf-edL(kGAdOyuh>EHSpG zlW0_8z)26uP}beE0qeyE>mR!0!X>pPo~BglZ6V4}vC@;w=~}usA(K#~^Fv}L@XO&M zumb2I60n5{xFub1nE%il|@MavB}Q@j8G002ovPDHLk FV1nT&{S*KI literal 0 HcmV?d00001