From cd5d5011c6a8e1dcfe3d93f9f2f140a93b5cae8c Mon Sep 17 00:00:00 2001 From: bancika Date: Mon, 24 Apr 2017 12:59:56 +0200 Subject: [PATCH] added nudge fixed ctrl/meta handling --- .../src/org/diylc/common/IPlugInPort.java | 23 ++++--- .../org/diylc/common/ISelectionProcessor.java | 10 +++ .../src/org/diylc/core/measures/Nudge.java | 37 ++++++++++ .../src/org/diylc/presenter/Presenter.java | 61 +++++++++++++---- diylc/diylc-library/lib/diylc-core.jar | Bin 238549 -> 238549 bytes diylc/diylc-swing/lib/diylc-core.jar | Bin 238549 -> 238549 bytes .../src/org/diylc/images/IconLoader.java | 2 +- .../src/org/diylc/images/fit_to_size.png | Bin 0 -> 550 bytes .../src/org/diylc/swing/ActionFactory.java | 64 +++++++++++++++--- .../org/diylc/swing/gui/DialogFactory.java | 8 +-- .../src/org/diylc/swing/gui/MainFrame.java | 2 +- .../gui/editor/PropertyEditorDialog.java | 7 +- .../swing/plugins/canvas/CanvasPlugin.java | 20 ++++-- .../plugins/cloud/view/UploadDialog.java | 18 +++-- .../view/browser/ResultsScrollPanel.java | 2 +- .../swing/plugins/edit/EditMenuPlugin.java | 11 +++ .../toolbox/ComponentButtonFactory.java | 6 +- 17 files changed, 220 insertions(+), 51 deletions(-) create mode 100644 diylc/diylc-core/src/org/diylc/core/measures/Nudge.java create mode 100644 diylc/diylc-swing/src/org/diylc/images/fit_to_size.png diff --git a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java index 530047ad..35fdfeb1 100644 --- a/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java +++ b/diylc/diylc-core/src/org/diylc/common/IPlugInPort.java @@ -30,14 +30,15 @@ import org.diylc.core.Theme; * @see IMessageListener * @see EventType */ -public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyProcessor, ITemplateProcessor, IBlockProcessor { +public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyProcessor, ITemplateProcessor, + IBlockProcessor { public static final String ANTI_ALIASING_KEY = "antiAliasing"; public static final String HI_QUALITY_RENDER_KEY = "hiQualityRender"; public static final String EXPORT_GRID_KEY = "exportGrid"; public static final String STICKY_POINTS_KEY = "stickyPoints"; public static final String METRIC_KEY = "metric"; - public static final String SNAP_TO_GRID_KEY = "snapToGrid"; + public static final String SNAP_TO_GRID_KEY = "snapToGrid"; public static final String CONTINUOUS_CREATION_KEY = "continuousCreation"; public static final String AUTO_EDIT_KEY = "autoEdit"; public static final String ABNORMAL_EXIT_KEY = "abnormalExit"; @@ -58,7 +59,7 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP public static final int NOBUTTON = 0; public static final int BUTTON1 = 1; public static final int BUTTON2 = 2; - public static final int BUTTON3 = 3; + public static final int BUTTON3 = 3; /** * Returns size of the canvas that takes project dimensions into account as well as zoom level. @@ -198,10 +199,11 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP /** * Sets default value for the specified property name for projects. * + * @param clazz class to set defaults to * @param propertyName display name for property * @param value new default value, must not be null */ - void setProjectDefaultPropertyValue(String propertyName, Object value); + void setDefaultPropertyValue(Class clazz, String propertyName, Object value); /** * @return a list of properties that are mutual for all the selected components. Resulting list @@ -214,15 +216,18 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP /** * @return a list of editable properties of the current project. + * + * @param obj */ - List getProjectProperties(); + List getProperties(Object obj); /** * Applies specified properties to the current project. * + * @param obj * @param properties */ - void applyPropertiesToProject(List properties); + void applyProperties(Object obj, List properties); /** * Gets the current new component slot. @@ -253,10 +258,10 @@ public interface IPlugInPort extends ISelectionProcessor, IMouseProcessor, IKeyP * @param locked */ void setLayerLocked(int layerZOrder, boolean locked); - + /** - * Shows or hides the specified layer. All components within +- 0.5 range will be affected by - * the change as well. + * Shows or hides the specified layer. All components within +- 0.5 range will be affected by the + * change as well. * * @param layerZOrder * @param visible diff --git a/diylc/diylc-core/src/org/diylc/common/ISelectionProcessor.java b/diylc/diylc-core/src/org/diylc/common/ISelectionProcessor.java index edba8cc0..4c6bde25 100644 --- a/diylc/diylc-core/src/org/diylc/common/ISelectionProcessor.java +++ b/diylc/diylc-core/src/org/diylc/common/ISelectionProcessor.java @@ -7,6 +7,7 @@ import java.util.List; import org.diylc.core.ExpansionMode; import org.diylc.core.IDIYComponent; +import org.diylc.core.measures.Size; public interface ISelectionProcessor { @@ -81,4 +82,13 @@ public interface ISelectionProcessor { * @return */ Rectangle2D getSelectionBounds(); + + /** + * Moves selection for the specified offset. + * + * @param xOffset + * @param yOffset + * @param affectStuckComponents + */ + void nudgeSelection(Size xOffset, Size yOffset, boolean affectStuckComponents); } diff --git a/diylc/diylc-core/src/org/diylc/core/measures/Nudge.java b/diylc/diylc-core/src/org/diylc/core/measures/Nudge.java new file mode 100644 index 00000000..b93ddaa9 --- /dev/null +++ b/diylc/diylc-core/src/org/diylc/core/measures/Nudge.java @@ -0,0 +1,37 @@ +package org.diylc.core.measures; + +import org.diylc.core.annotations.EditableProperty; + +public class Nudge { + + private Size xOffset; + private Size yOffset; + private boolean affectStuckComponents; + + @EditableProperty(name = "X-axis", sortOrder = 1) + public Size getxOffset() { + return xOffset; + } + + public void setxOffset(Size xOffset) { + this.xOffset = xOffset; + } + + @EditableProperty(name = "Y-axis", sortOrder = 2) + public Size getyOffset() { + return yOffset; + } + + public void setyOffset(Size yOffset) { + this.yOffset = yOffset; + } + + @EditableProperty(name = "Include stuck", sortOrder = 10) + public boolean getAffectStuckComponents() { + return affectStuckComponents; + } + + public void setAffectStuckComponents(boolean affectStuckComponents) { + this.affectStuckComponents = affectStuckComponents; + } +} diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index 5896599c..5c726f1d 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -51,6 +51,7 @@ import org.diylc.core.Project; import org.diylc.core.Template; import org.diylc.core.Theme; import org.diylc.core.annotations.IAutoCreator; +import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.utils.Constants; @@ -854,6 +855,42 @@ public class Presenter implements IPlugInPort { return totalArea.getBounds2D(); } + @Override + public void nudgeSelection(Size xOffset, Size yOffset, boolean affectStuckComponents) { + if (selectedComponents == null || selectedComponents.isEmpty()) + return; + + LOG.debug(String.format("nudgeSelection(%s, %s)", xOffset, yOffset)); + Map, Set> controlPointMap = new HashMap, Set>(); + // If there aren't any control points, try to add all the selected + // components with all their control points. That will allow the + // user to drag the whole components. + for (IDIYComponent c : selectedComponents) { + Set pointIndices = new HashSet(); + if (c.getControlPointCount() > 0) { + for (int i = 0; i < c.getControlPointCount(); i++) { + pointIndices.add(i); + } + controlPointMap.put(c, pointIndices); + } + } + if (controlPointMap.isEmpty()) { + return; + } + + if (affectStuckComponents) { + includeStuckComponents(controlPointMap); + } + + int dx = (int) xOffset.convertToPixels(); + int dy = (int) yOffset.convertToPixels(); + + Project oldProject = currentProject.clone(); + moveComponents(controlPointMap, dx, dy, false); + messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, currentProject.clone(), "Move Selection"); + messageDispatcher.dispatchMessage(EventType.REPAINT); + } + @Override public VersionNumber getCurrentVersionNumber() { return CURRENT_VERSION; @@ -1403,10 +1440,10 @@ public class Presenter implements IPlugInPort { } @Override - public void setProjectDefaultPropertyValue(String propertyName, Object value) { - LOG.info(String.format("setProjectDefaultPropertyValue(%s, %s)", propertyName, value)); + public void setDefaultPropertyValue(Class clazz, String propertyName, Object value) { + LOG.info(String.format("setProjectDefaultPropertyValue(%s, %s, %s)", clazz.getName(), propertyName, value)); LOG.debug("Default property value set for " + Project.class.getName() + ":" + propertyName); - ConfigurationManager.getInstance().writeValue(DEFAULTS_KEY_PREFIX + Project.class.getName() + ":" + propertyName, + ConfigurationManager.getInstance().writeValue(DEFAULTS_KEY_PREFIX + clazz.getName() + ":" + propertyName, value); } @@ -1849,14 +1886,14 @@ public class Presenter implements IPlugInPort { } @Override - public List getProjectProperties() { - List properties = ComponentProcessor.getInstance().extractProperties(Project.class); + public List getProperties(Object object) { + List properties = ComponentProcessor.getInstance().extractProperties(object.getClass()); try { for (PropertyWrapper property : properties) { - property.readFrom(currentProject); + property.readFrom(object); } } catch (Exception e) { - LOG.error("Could not get project properties", e); + LOG.error("Could not get object properties", e); return null; } Collections.sort(properties, ComparatorFactory.getInstance().getDefaultPropertyComparator()); @@ -1864,16 +1901,16 @@ public class Presenter implements IPlugInPort { } @Override - public void applyPropertiesToProject(List properties) { - LOG.debug(String.format("applyPropertiesToProject(%s)", properties)); + public void applyProperties(Object obj, List properties) { + LOG.debug(String.format("applyProperties(%s, %s)", obj, properties)); Project oldProject = currentProject.clone(); try { for (PropertyWrapper property : properties) { - property.writeTo(currentProject); + property.writeTo(obj); } } catch (Exception e) { - LOG.error("Could not apply project properties", e); - view.showMessage("Could not apply changes to the project. Check the log for details.", "Error", + LOG.error("Could not apply properties", e); + view.showMessage("Could not apply changes. Check the log for details.", "Error", IView.ERROR_MESSAGE); } finally { // Notify the listeners. diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 34d186afcaf6f87ba869126ca6e9ae45f7b8439b..5bdeccba6d46630f71ba0478e2cf7158f6945c9e 100644 GIT binary patch delta 4194 zcmXw5d0da#8t2a%MGtF zOq0=AuCX(pE*f0AXvDZxVX z>gc@kt12}b#g+emd9VD}j$<|eK5Up!mb9sC5{Spx7=Si50iZ8;0$9Ku05S&+glidY%azExD%ub3Mm{x*&&<(9CXJ61nN3K+QvfN5{|^O$74Mp zWk&zPdfJV;`Y7VOhbMfr1x!b$L1=@gY8v&8_cO)6@wf@o1#Ik}hqBYa;~eDIW(kPF z7IOs14OTWNU$JRK%oys1_LuFP5ql1g1=J>uxC`dnL-?-|Ve%dBEsTu-tcy zr#@it#FMx@aIyw*+?T$HIa6*T`b{mxY%iQV5vMr6Lv(PdLTs58hG_5lS`Xrxdkn{F zUA$}%!+dEs1N_p_PP-({2<(g_j8V3U`hYkn_JIND|GV~NU%(@|zoWi>>p<+z`Jxdh zw-@hVCQ38e^POd_Tt_EaPe*6Ewr+`;v^rkcH{Ra<49(7HH4G2qcDVy8{-_j)y46P9 z2u>rv|AhLAQ+kxM=CnB~&YYp#&(CI}9C^MC9bB7ju(#0{4g+cjUc3*`dGP~; zebItxv>uncL7abu4krAn2?j~N=8g?%zS%5{lzqJNjz70w*+;mZcGESh#v^wxquKhO z9$}8ftu!r$4=-Tu8$WmAdehTyP)=`eKzZ29Hni94u`e(nL$8>u?wt%dS z{k#vBO}d*!ZzX%fu7#1Slb1f{SnHQ1|I`^cE$v% z*mJ$FCS2&~tdMMrnVJ0DktJh@KxbBn}bi zX%=$nx+Bxb&%9VH`gr>?S2V5iW7m;HFJp($=k%D;@BNj;enNVZqxeh-WbtUx5X{QZ z*(r?8K+VQT)`gn17`7Y9;8n~6?w}l-$nvq9rrCpB>XmT2rN@rkOx7f`Gw6FOm35=b z&2%;&HI`XSMsh!g*`u$mQ^u9KitkMFwcEn{(IBgURUpw6GYuT2Jid$-q2}8Pbw9<` z>>z3!YuI~CG+{S$L(PW0%ojB`>e(oC|8#&^A~8S8E}KB-989aqDwNJ`=h9<+u94Oh zh+eXB6WfQ5r<&O-By|_nlRbWkIb-m*S6Ld8Ro9ub3DkDDjm?60K>qdL39 z#_bJjLSpbAW{Sk>ceWHs%15>k$&a7eMj)p=c({OP;_%=hsZW*C9w~oArCW}ye?>gk zmx78#Z@FFY*I3v+eLf0?|8!424#P|^J`4S#eYu2$E#}*hY+uHwVBRbKybqGr!pJJ=18 z&oATBj|JQtHP+jBA0*>S_y8oXrF_3!%Wlea69<+$YIa;9P~Qa&See{Oo;V@%!kU6td&YT z`7pWcCGTXAxM6zm;tNV*2R$kNCAX7Lbnv_AxuugwAnAO|i)KO4^hshSzJ}k;5c=4l z%d-Sc|LnP<1wNj#p{KZsUXQ#)GTt%2MZz0N!&0#Vs+4;Ai>ZLK{KX8wTz>&SLnPT> zOolI>^u}Mz2F1+)VIg@h7ehcuS}t7BYPpyXs2d>Q_mJcgAm#!pP8L#qfPi0B;5iM@ zI1qp6NM0(I1XARCfnpx4+XjgRfC)iVN@I|4!V-QB5`IYBSBO9)2mT}m!D2CLLW6}j zIGcskL?B?lSdyb-g+Is_W2r8yl_D7Atd$}Luw$hN0-V2!@Q{jzaUvY_32`C} z@V<&p@nR*&`{RWVHuQ76@B)SBYQoyp!V?!d|0K?9gb!Ght`Q3X+t&zJz_AHp8DM?_ zwct*Ia0l5ck=7#<#X^j9E|CHluce+vt))F&SxddLNus@_CDGnnlPK_{b%Z7Bs0SS? z&P^tHZ?cGhguT|2UBr5dcTSZxDU>%hh4jrS)Kg6=kSqPP5m0BQ;>rMjHGb8|ln{QPDX=ZDx6Oqz|endo1cMPXdCC~UEc_p@juhioFZm`!ANOvU$`=#n~TlU+eJ`QOf_bF$2# z^l>Vl&!O!P*i3#wDmHAU_??@nUDI=^UFEqH@1crzd1Uv8R(TZi^2BJ^%gH<{>Qf%| z#(fLzt#S($^;E^NTdA0gtrYZ!tu$07`4n_XKIwPmlm9RIbQUuT=&ULWXuYj~?1vSS zU1A}<1K+8#Q4z&mQbhXtBJz7(MER#}qdJSWQ4{WMqq7=WOq)+Frno<-vZjRmqDsi` zbP2`#UkUAd_I9eLa68#O*iLcnO37|jDXlk_QeE9D&Ml+Xj delta 4194 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 delta 4194 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 literal 0 HcmV?d00001 diff --git a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java index 55834545..34afbe5f 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -25,7 +25,11 @@ 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; @@ -162,6 +166,10 @@ public class ActionFactory { 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) { @@ -204,16 +212,17 @@ public class ActionFactory { return; } plugInPort.createNewProject(); - List properties = plugInPort.getProjectProperties(); - PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog(properties, "Edit Project"); + 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.applyPropertiesToProject(properties); + plugInPort.applyProperties(plugInPort.getCurrentProject(), properties); } // Save default values. for (PropertyWrapper property : editor.getDefaultedProperties()) { if (property.getValue() != null) { - plugInPort.setProjectDefaultPropertyValue(property.getName(), property.getValue()); + plugInPort.setDefaultPropertyValue(Project.class, property.getName(), property.getValue()); } } } @@ -795,21 +804,60 @@ public class ActionFactory { @Override public void actionPerformed(ActionEvent e) { LOG.info("Edit Project triggered"); - List properties = plugInPort.getProjectProperties(); - PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog(properties, "Edit Project"); + 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.applyPropertiesToProject(properties); + plugInPort.applyProperties(plugInPort.getCurrentProject(), properties); } // Save default values. for (PropertyWrapper property : editor.getDefaultedProperties()) { if (property.getValue() != null) { - plugInPort.setProjectDefaultPropertyValue(property.getName(), property.getValue()); + 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; diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/DialogFactory.java b/diylc/diylc-swing/src/org/diylc/swing/gui/DialogFactory.java index 574ba2e1..117985f6 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/DialogFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/DialogFactory.java @@ -57,12 +57,12 @@ public class DialogFactory { } } - public PropertyEditorDialog createPropertyEditorDialog(List properties, String title) { - return createPropertyEditorDialog(mainFrame, properties, title); + public PropertyEditorDialog createPropertyEditorDialog(List properties, String title, boolean saveDefaults) { + return createPropertyEditorDialog(mainFrame, properties, title, saveDefaults); } - public PropertyEditorDialog createPropertyEditorDialog(JFrame owner, List properties, String title) { - PropertyEditorDialog editor = new PropertyEditorDialog(owner, properties, title); + public PropertyEditorDialog createPropertyEditorDialog(JFrame owner, List properties, String title, boolean saveDefaults) { + PropertyEditorDialog editor = new PropertyEditorDialog(owner, properties, title, saveDefaults); return editor; } diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/MainFrame.java b/diylc/diylc-swing/src/org/diylc/swing/gui/MainFrame.java index bb46e83e..cd4fa68c 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/MainFrame.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/MainFrame.java @@ -221,7 +221,7 @@ public class MainFrame extends JFrame implements ISwingUI { @Override public boolean editProperties(List properties, Set defaultedProperties) { - PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog(properties, "Edit Selection"); + PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog(properties, "Edit Selection", true); editor.setVisible(true); defaultedProperties.addAll(editor.getDefaultedProperties()); return ButtonDialog.OK.equals(editor.getSelectedButtonCaption()); diff --git a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/PropertyEditorDialog.java b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/PropertyEditorDialog.java index f2c672d2..409b232f 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/gui/editor/PropertyEditorDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/gui/editor/PropertyEditorDialog.java @@ -32,16 +32,17 @@ public class PropertyEditorDialog extends ButtonDialog { private static final long serialVersionUID = 1L; - public static boolean SHOW_DEFAULT_BOXES = true; private static final String DEFAULT_BOX_TOOLTIP = "If this box is checked application will use the current value as a
default when creating new components of the same type"; private List properties; private Set defaultedProperties; private Component componentToFocus = null; + private boolean saveDefaults; - public PropertyEditorDialog(JFrame owner, List properties, String title) { + public PropertyEditorDialog(JFrame owner, List properties, String title, boolean saveDefaults) { super(owner, title, new String[] {ButtonDialog.OK, ButtonDialog.CANCEL}); + this.saveDefaults = saveDefaults; LOG.debug("Creating property editor for: " + properties); @@ -112,7 +113,7 @@ public class PropertyEditorDialog extends ButtonDialog { gbc.fill = GridBagConstraints.NONE; gbc.weightx = 0; - if (SHOW_DEFAULT_BOXES) { + if (saveDefaults) { editorPanel.add(createDefaultCheckBox(property), gbc); } } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java index 0a9ca29d..cba3dcf1 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java @@ -29,6 +29,7 @@ import javax.swing.SwingUtilities; import org.apache.log4j.Logger; import org.diylc.appframework.miscutils.ConfigurationManager; import org.diylc.appframework.miscutils.IConfigListener; +import org.diylc.appframework.miscutils.Utils; import org.diylc.common.BadPositionException; import org.diylc.common.EventType; import org.diylc.common.IComponentTransformer; @@ -71,6 +72,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { private ActionFactory.UngroupAction ungroupAction; private ActionFactory.SendToBackAction sendToBackAction; private ActionFactory.BringToFrontAction bringToFrontAction; + private ActionFactory.NudgeAction nudgeAction; private ActionFactory.ExpandSelectionAction expandSelectionAllAction; private ActionFactory.ExpandSelectionAction expandSelectionImmediateAction; private ActionFactory.ExpandSelectionAction expandSelectionSameTypeAction; @@ -148,6 +150,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { getExpandSelectionSameTypeAction().setEnabled(enabled); getGroupAction().setEnabled(enabled); getUngroupAction().setEnabled(enabled); + getNudgeAction().setEnabled(enabled); getSendToBackAction().setEnabled(enabled); getBringToFrontAction().setEnabled(enabled); getRotateClockwiseAction().setEnabled(enabled); @@ -169,7 +172,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { @Override public void keyPressed(KeyEvent e) { - if (plugInPort.keyPressed(e.getKeyCode(), e.isControlDown() || e.isMetaDown(), e.isShiftDown(), e.isAltDown())) { + if (plugInPort.keyPressed(e.getKeyCode(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), e.isAltDown())) { e.consume(); } } @@ -180,7 +183,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { @Override public void mouseMoved(MouseEvent e) { canvasPanel.setCursor(plugInPort.getCursorAt(e.getPoint())); - plugInPort.mouseMoved(e.getPoint(), e.isControlDown() || e.isMetaDown(), e.isShiftDown(), e.isAltDown()); + plugInPort.mouseMoved(e.getPoint(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), e.isAltDown()); } }); @@ -188,7 +191,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { @Override public void mouseClicked(MouseEvent e) { - plugInPort.mouseClicked(e.getPoint(), e.getButton(), e.isControlDown() || e.isMetaDown(), e.isShiftDown(), + plugInPort.mouseClicked(e.getPoint(), e.getButton(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), e.isAltDown(), e.getClickCount()); } }); @@ -218,7 +221,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { public void mouseWheelMoved(MouseWheelEvent e) { boolean wheelZoom = ConfigurationManager.getInstance().readBoolean(IPlugInPort.WHEEL_ZOOM_KEY, false); - if (wheelZoom || e.isControlDown() || e.isMetaDown()) { + if (wheelZoom || (Utils.isMac() ? e.isMetaDown() : e.isControlDown())) { // disable scrolling scrollPane.setWheelScrollingEnabled(false); @@ -319,6 +322,8 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { transformMenu.add(getMirrorHorizontallyAction()); transformMenu.add(getMirrorVerticallyAction()); transformMenu.addSeparator(); + transformMenu.add(getNudgeAction()); + transformMenu.addSeparator(); transformMenu.add(getSendToBackAction()); transformMenu.add(getBringToFrontAction()); transformMenu.addSeparator(); @@ -492,6 +497,13 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { return bringToFrontAction; } + public ActionFactory.NudgeAction getNudgeAction() { + if (nudgeAction == null) { + nudgeAction = ActionFactory.getInstance().createNudgeAction(plugInPort); + } + return nudgeAction; + } + public ActionFactory.ExpandSelectionAction getExpandSelectionAllAction() { if (expandSelectionAllAction == null) { expandSelectionAllAction = ActionFactory.getInstance().createExpandSelectionAction(plugInPort, ExpansionMode.ALL); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java index 30c883bc..af4e1e99 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/cloud/view/UploadDialog.java @@ -10,6 +10,7 @@ import java.awt.Insets; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.util.EnumSet; +import java.util.List; import javax.swing.BorderFactory; import javax.swing.JCheckBox; @@ -27,6 +28,7 @@ import javax.swing.event.ChangeListener; import org.diylc.common.DrawOption; import org.diylc.common.IPlugInPort; +import org.diylc.common.PropertyWrapper; import org.diylc.swing.gui.components.HTMLTextArea; import org.diylc.swingframework.ButtonDialog; import org.diylc.utils.KeywordExtractor; @@ -204,10 +206,12 @@ public class UploadDialog extends ButtonDialog { if (nameField == null) { nameField = new JTextField(); + List props = plugInPort.getProperties(plugInPort.getCurrentProject()); + // set default from the project - for (int i = 0; i < plugInPort.getProjectProperties().size(); i++) - if (plugInPort.getProjectProperties().get(i).getName().equals("Title")) - nameField.setText(plugInPort.getProjectProperties().get(i).getValue().toString()); + for (int i = 0; i < props.size(); i++) + if (props.get(i).getName().equals("Title")) + nameField.setText(props.get(i).getValue().toString()); } return nameField; } @@ -232,11 +236,13 @@ public class UploadDialog extends ButtonDialog { if (descriptionArea == null) { descriptionArea = new HTMLTextArea(); + List props = plugInPort.getProperties(plugInPort.getCurrentProject()); + // set default from the project - for (int i = 0; i < plugInPort.getProjectProperties().size(); i++) - if (plugInPort.getProjectProperties().get(i).getName().equals("Description")) + for (int i = 0; i < props.size(); i++) + if (props.get(i).getName().equals("Description")) try { - descriptionArea.setText(plugInPort.getProjectProperties().get(i).getValue().toString()); + descriptionArea.setText(props.get(i).getValue().toString()); } catch (Exception e) { } descriptionArea.setBorder(null); 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 379a1123..c232460a 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 @@ -327,7 +327,7 @@ public class ResultsScrollPanel extends JScrollPane { List projectProperties = CloudPresenter.Instance.getProjectProperties(project); PropertyEditorDialog editor = DialogFactory.getInstance().createPropertyEditorDialog(cloudUI.getOwnerFrame(), projectProperties, - "Edit Published Project"); + "Edit Published Project", true); editor.setVisible(true); if (ButtonDialog.OK.equals(editor.getSelectedButtonCaption())) { // Update the project diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java index 3046bcff..b4195b49 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/edit/EditMenuPlugin.java @@ -41,6 +41,7 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { private ActionFactory.UngroupAction ungroupAction; private ActionFactory.SendToBackAction sendToBackAction; private ActionFactory.BringToFrontAction bringToFrontAction; + private ActionFactory.NudgeAction nudgeAction; private ActionFactory.RenumberAction renumberXAxisAction; private ActionFactory.RenumberAction renumberYAxisAction; private ActionFactory.ExpandSelectionAction expandSelectionAllAction; @@ -144,6 +145,13 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { } return bringToFrontAction; } + + public ActionFactory.NudgeAction getNudgeAction() { + if (nudgeAction == null) { + nudgeAction = ActionFactory.getInstance().createNudgeAction(plugInPort); + } + return nudgeAction; + } public ActionFactory.RenumberAction getRenumberXAxisAction() { if (renumberXAxisAction == null) { @@ -249,6 +257,8 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { swingUI.injectMenuAction(getMirrorHorizontallyAction(), TRANSFORM_TITLE); swingUI.injectMenuAction(getMirrorVerticallyAction(), TRANSFORM_TITLE); swingUI.injectMenuAction(null, TRANSFORM_TITLE); + swingUI.injectMenuAction(getNudgeAction(), TRANSFORM_TITLE); + swingUI.injectMenuAction(null, TRANSFORM_TITLE); swingUI.injectMenuAction(getSendToBackAction(), TRANSFORM_TITLE); swingUI.injectMenuAction(getBringToFrontAction(), TRANSFORM_TITLE); swingUI.injectMenuAction(null, TRANSFORM_TITLE); @@ -306,6 +316,7 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { getExpandSelectionAllAction().setEnabled(enabled); getExpandSelectionImmediateAction().setEnabled(enabled); getExpandSelectionSameTypeAction().setEnabled(enabled); + getNudgeAction().setEnabled(enabled); getUngroupAction().setEnabled(enabled); getSendToBackAction().setEnabled(enabled); getBringToFrontAction().setEnabled(enabled); diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/toolbox/ComponentButtonFactory.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/toolbox/ComponentButtonFactory.java index ddb517be..24445bb5 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/toolbox/ComponentButtonFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/toolbox/ComponentButtonFactory.java @@ -22,6 +22,7 @@ import javax.swing.SwingUtilities; import javax.swing.border.Border; import javax.swing.border.EmptyBorder; +import org.diylc.appframework.miscutils.Utils; import org.diylc.common.ComponentType; import org.diylc.common.IPlugInPort; import org.diylc.core.IDIYComponent; @@ -68,7 +69,7 @@ public class ComponentButtonFactory { } } // Ctrl appends selection - if (e.isControlDown() || e.isMetaDown()) { + if (Utils.isMac() ? e.isMetaDown() : e.isControlDown()) { newSelection.addAll(plugInPort.getSelectedComponents()); } plugInPort.updateSelection(newSelection); @@ -82,7 +83,8 @@ public class ComponentButtonFactory { @Override public void keyPressed(KeyEvent e) { - plugInPort.keyPressed(e.getKeyCode(), e.isControlDown() || e.isMetaDown(), e.isShiftDown(), e.isAltDown()); + plugInPort.keyPressed(e.getKeyCode(), Utils.isMac() ? e.isMetaDown() : e.isControlDown(), e.isShiftDown(), + e.isAltDown()); } }); return button;