diff --git a/diylc/diylc-core/src/org/diylc/common/ComponentType.java b/diylc/diylc-core/src/org/diylc/common/ComponentType.java index 0fc555fc..211406d0 100644 --- a/diylc/diylc-core/src/org/diylc/common/ComponentType.java +++ b/diylc/diylc-core/src/org/diylc/common/ComponentType.java @@ -31,14 +31,13 @@ public class ComponentType { private BomPolicy bomPolicy; private boolean autoEdit; private boolean rotatable; - private IAutoCreator autoCreator; private KeywordPolicy keywordPolicy; private String keywordTag; public ComponentType(String name, String description, CreationMethod creationMethod, String category, String namePrefix, String author, Icon icon, Class> instanceClass, double zOrder, boolean flexibleZOrder, boolean stretchable, BomPolicy bomPolicy, boolean autoEdit, boolean rotatable, - IAutoCreator autoCreator, KeywordPolicy keywordPolicy, String keywordTag) { + KeywordPolicy keywordPolicy, String keywordTag) { super(); this.name = name; this.description = description; @@ -54,7 +53,6 @@ public class ComponentType { this.bomPolicy = bomPolicy; this.autoEdit = autoEdit; this.rotatable = rotatable; - this.autoCreator = autoCreator; this.keywordPolicy = keywordPolicy; this.keywordTag = keywordTag; } @@ -115,14 +113,10 @@ public class ComponentType { return rotatable; } - public IAutoCreator getAutoCreateor() { - return autoCreator; - } - public KeywordPolicy getKeywordPolicy() { return keywordPolicy; } - + public String getKeywordTag() { return keywordTag; } diff --git a/diylc/diylc-core/src/org/diylc/core/annotations/AutoCreator.java b/diylc/diylc-core/src/org/diylc/core/annotations/AutoCreator.java deleted file mode 100644 index 27da163b..00000000 --- a/diylc/diylc-core/src/org/diylc/core/annotations/AutoCreator.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.diylc.core.annotations; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Retention(RetentionPolicy.RUNTIME) -public @interface AutoCreator { - public Class creatorClass(); -} diff --git a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java index 50d84676..68529469 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java +++ b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java @@ -20,11 +20,9 @@ import org.diylc.common.PropertyWrapper; import org.diylc.core.CreationMethod; import org.diylc.core.IDIYComponent; import org.diylc.core.IPropertyValidator; -import org.diylc.core.annotations.AutoCreator; import org.diylc.core.annotations.BomPolicy; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; -import org.diylc.core.annotations.IAutoCreator; import org.diylc.core.annotations.KeywordPolicy; /** @@ -73,7 +71,6 @@ public class ComponentProcessor { BomPolicy bomPolicy; boolean autoEdit; boolean rotatable; - IAutoCreator autoCreator = null; KeywordPolicy keywordPolicy; String keywordTag; if (clazz.isAnnotationPresent(ComponentDescriptor.class)) { @@ -108,14 +105,6 @@ public class ComponentProcessor { keywordPolicy = KeywordPolicy.NEVER_SHOW; keywordTag = null; } - if (clazz.isAnnotationPresent(AutoCreator.class)) { - AutoCreator annotation = clazz.getAnnotation(AutoCreator.class); - try { - autoCreator = annotation.creatorClass().newInstance(); - } catch (Exception e) { - LOG.error("Could not instantiate auto-creator for " + name, e); - } - } icon = null; // Draw component icon. try { @@ -134,7 +123,7 @@ public class ComponentProcessor { } ComponentType componentType = new ComponentType(name, description, creationMethod, category, namePrefix, author, icon, clazz, zOrder, - flexibleZOrder, stretchable, bomPolicy, autoEdit, rotatable, autoCreator, keywordPolicy, keywordTag); + flexibleZOrder, stretchable, bomPolicy, autoEdit, rotatable, keywordPolicy, keywordTag); componentTypeMap.put(clazz.getName(), componentType); return componentType; } diff --git a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java index 64f0b5a5..e12763ac 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java +++ b/diylc/diylc-core/src/org/diylc/presenter/InstantiationManager.java @@ -41,7 +41,7 @@ public class InstantiationManager { private static final ComponentType clipboardType = new ComponentType("Clipboard contents", "Components from the clipboard", CreationMethod.SINGLE_CLICK, "Multi", "", "", null, null, 0, false, false, null, - false, true, null, KeywordPolicy.NEVER_SHOW, null); + false, true, KeywordPolicy.NEVER_SHOW, null); public InstantiationManager() {} diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 867307e8..303b4ce8 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -312,42 +312,27 @@ public class Presenter implements IPlugInPort { Set> componentTypeClasses = null; try { componentTypeClasses = Utils.getClasses("org.diylc.components"); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - // for (String path : classPath) { - // path = path.replace('\\', '/'); - // File f = new File(path); - // try { - // if (f.isDirectory()) { - // LOG.info("Scanning folder for components: " - // + f.getAbsolutePath()); - // componentTypeClasses.addAll(JarScanner.getInstance() - // .scanFolder(path, IDIYComponent.class)); - // } else { - // LOG.info("Scanning JAR for components: " - // + f.getAbsolutePath()); - // componentTypeClasses.addAll(JarScanner.getInstance() - // .scanJar(f, IDIYComponent.class)); - // } - // } catch (Exception e) { - // LOG.warn("Could not scan path " + path, e); - // } - // } - for (Class clazz : componentTypeClasses) { - if (!Modifier.isAbstract(clazz.getModifiers()) && IDIYComponent.class.isAssignableFrom(clazz)) { - ComponentType componentType = - ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) clazz); - List nestedList; - if (componentTypes.containsKey(componentType.getCategory())) { - nestedList = componentTypes.get(componentType.getCategory()); - } else { - nestedList = new ArrayList(); - componentTypes.put(componentType.getCategory(), nestedList); + + for (Class clazz : componentTypeClasses) { + if (!Modifier.isAbstract(clazz.getModifiers()) && IDIYComponent.class.isAssignableFrom(clazz)) { + ComponentType componentType = + ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) clazz); + List nestedList; + if (componentTypes.containsKey(componentType.getCategory())) { + nestedList = componentTypes.get(componentType.getCategory()); + } else { + nestedList = new ArrayList(); + componentTypes.put(componentType.getCategory(), nestedList); + } + nestedList.add(componentType); } - nestedList.add(componentType); } + + for (Map.Entry> e : componentTypes.entrySet()) { + LOG.debug(e.getKey() + ": " + e.getValue()); + } + } catch (Exception e) { + LOG.error("Error loading component types", e); } } return componentTypes; @@ -356,11 +341,17 @@ public class Presenter implements IPlugInPort { public List getAutoCreators() { if (autoCreators == null) { autoCreators = new ArrayList(); - for (Map.Entry> entry : getComponentTypes().entrySet()) { - for (ComponentType t : entry.getValue()) { - if (t.getAutoCreateor() != null) - autoCreators.add(t.getAutoCreateor()); + Set> classes = null; + try { + classes = Utils.getClasses("org.diylc.components.autocreate"); + for (Class clazz : classes) { + if (IAutoCreator.class.isAssignableFrom(clazz)) { + autoCreators.add((IAutoCreator) clazz.newInstance()); + LOG.debug("Loaded auto-cretor: " + clazz.getName()); + } } + } catch (Exception e) { + LOG.error("Error loading auto-creator types", e); } } return autoCreators; diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPadAutoCreator.java b/diylc/diylc-library/src/org/diylc/components/autocreate/SolderPadAutoCreator.java similarity index 90% rename from diylc/diylc-library/src/org/diylc/components/connectivity/SolderPadAutoCreator.java rename to diylc/diylc-library/src/org/diylc/components/autocreate/SolderPadAutoCreator.java index 7645293f..ec303c45 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPadAutoCreator.java +++ b/diylc/diylc-library/src/org/diylc/components/autocreate/SolderPadAutoCreator.java @@ -1,10 +1,11 @@ -package org.diylc.components.connectivity; +package org.diylc.components.autocreate; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.ConfigurationManager; +import org.diylc.components.connectivity.SolderPad; import org.diylc.core.IDIYComponent; import org.diylc.core.annotations.IAutoCreator; diff --git a/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPad.java b/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPad.java index 5617d594..2881e437 100644 --- a/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPad.java +++ b/diylc/diylc-library/src/org/diylc/components/connectivity/SolderPad.java @@ -11,7 +11,6 @@ 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.AutoCreator; import org.diylc.core.annotations.BomPolicy; import org.diylc.core.annotations.ComponentDescriptor; import org.diylc.core.annotations.EditableProperty; @@ -21,7 +20,6 @@ import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; -@AutoCreator(creatorClass = SolderPadAutoCreator.class) @ComponentDescriptor(name = "Solder Pad", category = "Connectivity", author = "Branislav Stojkovic", description = "Copper solder pad, round or square", instanceNamePrefix = "Pad", stretchable = false, zOrder = IDIYComponent.TRACE + 0.1, bomPolicy = BomPolicy.NEVER_SHOW, autoEdit = false, diff --git a/diylc/diylc-swing/src/org/diylc/images/IconLoader.java b/diylc/diylc-swing/src/org/diylc/images/IconLoader.java index c48e2ccf..172f5d6a 100644 --- a/diylc/diylc-swing/src/org/diylc/images/IconLoader.java +++ b/diylc/diylc-swing/src/org/diylc/images/IconLoader.java @@ -32,10 +32,10 @@ public enum IconLoader { "briefcase_into.png"), RotateCW("rotate_cw.png"), RotateCCW("rotate_ccw.png"), ElementInto("element_into.png"), Arrow( "arrow.png"), Cloud("cloud.png"), CloudUp("cloud_up.png"), CloudGear("cloud_gear.png"), IdCardEdit( "id_card_edit.png"), KeyEdit("key_edit.png"), Find("find.png"), Dashboard("dashboard.png"), DataFind( - "data_find.png"), CloudDownload("cloud_download.png"), CloudUpload("cloud_upload.png"), NavLeftBlue( - "nav_left_blue.png"), NavRightBlue("nav_right_blue.png"), MissingImage("missing_image.png"), CloudBg( - "cloud_bg.png"), CloudBig("cloud_big.png"), CloudWait("cloud_wait.png"), Spinning("spinning.gif"), Megaphone( - "megaphone.png"), Download("download.png"), Eye("eye.png"), Messages("messages.png"); + "data_find.png"), CloudDownload("cloud_download.png"), CloudDelete("cloud_delete.png"), CloudUpload( + "cloud_upload.png"), NavLeftBlue("nav_left_blue.png"), NavRightBlue("nav_right_blue.png"), MissingImage( + "missing_image.png"), CloudBg("cloud_bg.png"), CloudBig("cloud_big.png"), CloudWait("cloud_wait.png"), Spinning( + "spinning.gif"), Megaphone("megaphone.png"), Download("download.png"), Eye("eye.png"), Messages("messages.png"); protected String name; diff --git a/diylc/diylc-swing/src/org/diylc/images/cloud_delete.png b/diylc/diylc-swing/src/org/diylc/images/cloud_delete.png new file mode 100644 index 00000000..04d08590 Binary files /dev/null and b/diylc/diylc-swing/src/org/diylc/images/cloud_delete.png differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/CloudBrowserFrame.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/CloudBrowserFrame.java index 4e6c07a9..88124e2f 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/CloudBrowserFrame.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/CloudBrowserFrame.java @@ -176,7 +176,7 @@ public class CloudBrowserFrame extends JFrame implements ISimpleView { private ResultsScrollPanel getResultsScrollPane() { if (resultsScrollPane == null) { - resultsScrollPane = new ResultsScrollPanel(swingUI, this, plugInPort, pagingProvider, cloudPresenter); + resultsScrollPane = new ResultsScrollPanel(swingUI, this, plugInPort, pagingProvider, cloudPresenter, false); } return resultsScrollPane; } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/ResultsScrollPanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/ResultsScrollPanel.java index 99f157af..0fb48a00 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/ResultsScrollPanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/ResultsScrollPanel.java @@ -2,6 +2,7 @@ package org.diylc.swing.plugins.cloud.view.browser; import java.awt.Color; import java.awt.Cursor; +import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; @@ -81,14 +82,17 @@ public class ResultsScrollPanel extends JScrollPane { private Icon spinnerIcon = IconLoader.Spinning.getIcon(); + private boolean showEditControls; + public ResultsScrollPanel(ISwingUI mainUI, ISimpleView cloudUI, IPlugInPort plugInPort, PagingProvider provider, - CloudPresenter cloudPresenter) { + CloudPresenter cloudPresenter, boolean showEditControls) { super(); this.mainUI = mainUI; this.cloudUI = cloudUI; this.plugInPort = plugInPort; this.provider = provider; this.cloudPresenter = cloudPresenter; + this.showEditControls = showEditControls; this.getVerticalScrollBar().setUnitIncrement(16); this.setBorder(null); @@ -230,6 +234,7 @@ public class ResultsScrollPanel extends JScrollPane { downloadButton.setBorderPainted(false); downloadButton.setContentAreaFilled(false); downloadButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + downloadButton.setToolTipText("Download to local drive"); downloadButton.addActionListener(new ActionListener() { @Override @@ -292,6 +297,25 @@ public class ResultsScrollPanel extends JScrollPane { } }); + JButton reuploadButton = new JButton(IconLoader.CloudUpload.getIcon()); + reuploadButton.setContentAreaFilled(false); + reuploadButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + reuploadButton.setToolTipText("Re-upload to the cloud"); + + JButton deleteButton = new JButton(IconLoader.CloudDelete.getIcon()); + deleteButton.setContentAreaFilled(false); + deleteButton.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + deleteButton.setToolTipText("Delete from the cloud"); + + JPanel buttonPanel = new JPanel(new FlowLayout()); + buttonPanel.setBackground(Color.white); + // buttonPanel.setLayout(new BoxLayout(buttonPanel, BoxLayout.X_AXIS)); + buttonPanel.add(downloadButton); + if (showEditControls) { + buttonPanel.add(reuploadButton); + buttonPanel.add(deleteButton); + } + GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.NORTHWEST; gbc.insets = new Insets(2, 2, 2, 2); @@ -308,6 +332,10 @@ public class ResultsScrollPanel extends JScrollPane { gbc.insets = new Insets(2, 6, 2, 2); getResultsPanel().add(nameLabel, gbc); + gbc.gridx++; + gbc.weightx = 0.1; + getResultsPanel().add(new JLabel(), gbc); + gbc.gridx++; gbc.weightx = 0; getResultsPanel().add(commentLabel, gbc); @@ -322,7 +350,7 @@ public class ResultsScrollPanel extends JScrollPane { gbc.gridx = 1; gbc.weighty = 1; gbc.weightx = 1; - gbc.gridwidth = 5; + gbc.gridwidth = 6; gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.BOTH; gbc.insets = new Insets(2, 6, 2, 2); @@ -330,19 +358,22 @@ public class ResultsScrollPanel extends JScrollPane { gbc.gridy++; gbc.gridwidth = 1; + gbc.weightx = 1; gbc.fill = GridBagConstraints.NONE; gbc.weighty = 0; getResultsPanel().add(categoryLabel, gbc); gbc.gridx++; gbc.gridheight = 3; - gbc.gridwidth = 3; + gbc.gridwidth = 4; + gbc.weightx = 0; gbc.insets = new Insets(2, 2, 2, 2); gbc.anchor = GridBagConstraints.SOUTHEAST; - getResultsPanel().add(downloadButton, gbc); + getResultsPanel().add(buttonPanel, gbc); gbc.gridy++; gbc.gridx = 1; + gbc.weightx = 1; gbc.gridheight = 1; gbc.insets = new Insets(2, 6, 2, 2); gbc.anchor = GridBagConstraints.NORTHWEST; diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/UploadManagerFrame.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/UploadManagerFrame.java index 6568553e..18b2fde6 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/UploadManagerFrame.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/browser/UploadManagerFrame.java @@ -51,7 +51,7 @@ public class UploadManagerFrame extends JFrame implements ISimpleView { private ResultsScrollPanel getResultsScrollPane() { if (resultsScrollPane == null) { - resultsScrollPane = new ResultsScrollPanel(swingUI, this, plugInPort, null, cloudPresenter); + resultsScrollPane = new ResultsScrollPanel(swingUI, this, plugInPort, null, cloudPresenter, true); } return resultsScrollPane; } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java index 93769cff..d12b4952 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/config/ConfigPlugin.java @@ -9,8 +9,7 @@ import org.apache.log4j.Logger; import org.diylc.common.EventType; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; -import org.diylc.components.connectivity.SolderPad; -import org.diylc.components.connectivity.SolderPadAutoCreator; +import org.diylc.components.autocreate.SolderPadAutoCreator; import org.diylc.core.Theme; import org.diylc.images.IconLoader; import org.diylc.swing.ActionFactory;