diff --git a/diylc/diylc-core/src/org/diylc/common/IKeyProcessor.java b/diylc/diylc-core/src/org/diylc/common/IKeyProcessor.java index 41a8686d..b9e87798 100644 --- a/diylc/diylc-core/src/org/diylc/common/IKeyProcessor.java +++ b/diylc/diylc-core/src/org/diylc/common/IKeyProcessor.java @@ -6,6 +6,8 @@ public interface IKeyProcessor { public static final int VK_UP = 0x26; public static final int VK_RIGHT = 0x27; public static final int VK_DOWN = 0x28; + public static final int VK_H = 0x48; + public static final int VK_V = 0x56; /** * Notifies the presenter that a key hes been pressed on the canvas. diff --git a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java index 4a6671ce..3a27f16e 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java +++ b/diylc/diylc-core/src/org/diylc/presenter/ComponentProcessor.java @@ -9,7 +9,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; diff --git a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java index c52634bf..87293aa8 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/Presenter.java +++ b/diylc/diylc-core/src/org/diylc/presenter/Presenter.java @@ -559,7 +559,7 @@ public class Presenter implements IPlugInPort { || !newSelection.contains(topComponent)) { newSelection.clear(); } - + newSelection.addAll(findAllGroupedComponents(topComponent)); } } @@ -575,7 +575,8 @@ public class Presenter implements IPlugInPort { @Override public boolean keyPressed(int key, boolean ctrlDown, boolean shiftDown, boolean altDown) { - if (key != VK_DOWN && key != VK_LEFT && key != VK_UP && key != VK_RIGHT) { + if (key != VK_DOWN && key != VK_LEFT && key != VK_UP && key != VK_RIGHT && key != IKeyProcessor.VK_H + && key != IKeyProcessor.VK_V) { return false; } LOG.debug(String.format("keyPressed(%s, %s, %s, %s)", key, ctrlDown, shiftDown, altDown)); @@ -609,6 +610,12 @@ public class Presenter implements IPlugInPort { } else if (key == IKeyProcessor.VK_LEFT) { oldProject = currentProject.clone(); rotateComponents(this.selectedComponents, -1, snapToGrid); + } else if (key == IKeyProcessor.VK_H) { + oldProject = currentProject.clone(); + mirrorSelection(ISelectionProcessor.HORIZONTAL); + } else if (key == IKeyProcessor.VK_V) { + oldProject = currentProject.clone(); + mirrorSelection(ISelectionProcessor.VERTICAL); } else return false; messageDispatcher.dispatchMessage(EventType.PROJECT_MODIFIED, oldProject, currentProject.clone(), @@ -1898,12 +1905,14 @@ public class Presenter implements IPlugInPort { ComponentType selectedType = null; Iterator> iterator = this.selectedComponents.iterator(); while (iterator.hasNext()) { - ComponentType type = ComponentProcessor.getInstance().extractComponentTypeFrom((Class>) iterator.next().getClass()); + ComponentType type = + ComponentProcessor.getInstance().extractComponentTypeFrom( + (Class>) iterator.next().getClass()); if (selectedType == null) selectedType = type; else if (selectedType.getInstanceClass() != type.getInstanceClass()) throw new RuntimeException("Template can be applied on multiple components of the same type only"); - } + } return getTemplatesFor(selectedType.getCategory(), selectedType.getName()); } diff --git a/diylc/diylc-library/lib/diylc-core.jar b/diylc/diylc-library/lib/diylc-core.jar index 16a668b3..4fb5ad31 100644 Binary files a/diylc/diylc-library/lib/diylc-core.jar and b/diylc/diylc-library/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index 16a668b3..4fb5ad31 100644 Binary files a/diylc/diylc-swing/lib/diylc-core.jar and b/diylc/diylc-swing/lib/diylc-core.jar differ diff --git a/diylc/diylc-swing/src/org/diylc/images/IconLoader.java b/diylc/diylc-swing/src/org/diylc/images/IconLoader.java index be34240f..287f5e3e 100644 --- a/diylc/diylc-swing/src/org/diylc/images/IconLoader.java +++ b/diylc/diylc-swing/src/org/diylc/images/IconLoader.java @@ -37,7 +37,7 @@ public enum IconLoader { "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"), SearchBox("search-box.png"), Screwdriver("screwdriver.png"), Hammer("hammer.png"), FlipHorizontal("flip_horizontal.png"), - FlipVertical("flip_vertical.png"); + FlipVertical("flip_vertical.png"), MagicWand("magic_wand.png"); protected String name; diff --git a/diylc/diylc-swing/src/org/diylc/images/magic_wand.png b/diylc/diylc-swing/src/org/diylc/images/magic_wand.png new file mode 100644 index 00000000..b2fe84c0 Binary files /dev/null and b/diylc/diylc-swing/src/org/diylc/images/magic_wand.png differ diff --git a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java index 29f607eb..c42f316c 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java +++ b/diylc/diylc-swing/src/org/diylc/swing/ActionFactory.java @@ -144,7 +144,7 @@ public class ActionFactory { public RotateSelectionAction createRotateSelectionAction(IPlugInPort plugInPort, int direction) { return new RotateSelectionAction(plugInPort, direction); } - + public MirrorSelectionAction createMirrorSelectionAction(IPlugInPort plugInPort, int direction) { return new MirrorSelectionAction(plugInPort, direction); } @@ -771,7 +771,7 @@ public class ActionFactory { public EditProjectAction(IPlugInPort plugInPort) { super(); this.plugInPort = plugInPort; - putValue(AbstractAction.NAME, "Edit Project"); + putValue(AbstractAction.NAME, "Edit Project Settings"); putValue(AbstractAction.SMALL_ICON, IconLoader.DocumentEdit.getIcon()); } @@ -926,7 +926,7 @@ public class ActionFactory { plugInPort.rotateSelection(direction); } } - + public static class MirrorSelectionAction extends AbstractAction { private static final long serialVersionUID = 1L; @@ -940,10 +940,12 @@ public class ActionFactory { this.direction = direction; if (direction == ISelectionProcessor.HORIZONTAL) { putValue(AbstractAction.NAME, "Mirror Horizontally"); - putValue(AbstractAction.SMALL_ICON, IconLoader.FlipHorizontal.getIcon()); + putValue(AbstractAction.SMALL_ICON, IconLoader.FlipHorizontal.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_H, ActionEvent.ALT_MASK)); } else { putValue(AbstractAction.NAME, "Mirror Vertically"); - putValue(AbstractAction.SMALL_ICON, IconLoader.FlipVertical.getIcon()); + putValue(AbstractAction.SMALL_ICON, IconLoader.FlipVertical.getIcon()); + putValue(AbstractAction.ACCELERATOR_KEY, KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.ALT_MASK)); } } @@ -1043,7 +1045,7 @@ public class ActionFactory { } } - public static class ComponentBrowserAction extends AbstractAction { + public static class ComponentBrowserAction extends AbstractAction { private static final long serialVersionUID = 1L; @@ -1055,8 +1057,10 @@ public class ActionFactory { putValue(AbstractAction.NAME, browserType); putValue(IView.RADIO_BUTTON_GROUP_KEY, "componentBrowser"); - putValue(AbstractAction.SELECTED_KEY, - browserType.equals(ConfigurationManager.getInstance().readString(ConfigPlugin.COMPONENT_BROWSER, ConfigPlugin.SEARCHABLE_TREE))); + putValue( + AbstractAction.SELECTED_KEY, + browserType.equals(ConfigurationManager.getInstance().readString(ConfigPlugin.COMPONENT_BROWSER, + ConfigPlugin.SEARCHABLE_TREE))); } @Override 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 d34741f3..9c04f87a 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 @@ -138,6 +138,10 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { getUngroupAction().setEnabled(enabled); getSendToBackAction().setEnabled(enabled); getBringToFrontAction().setEnabled(enabled); + getRotateClockwiseAction().setEnabled(enabled); + getRotateCounterclockwiseAction().setEnabled(enabled); + getMirrorHorizontallyAction().setEnabled(enabled); + getMirrorVerticallyAction().setEnabled(enabled); getSaveAsTemplateAction().setEnabled(plugInPort.getSelectedComponents().size() == 1); @@ -280,14 +284,18 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { public JMenu getTransformMenu() { if (transformMenu == null) { transformMenu = new JMenu("Transform Selection"); + transformMenu.setIcon(IconLoader.MagicWand.getIcon()); transformMenu.add(getRotateClockwiseAction()); transformMenu.add(getRotateCounterclockwiseAction()); + transformMenu.addSeparator(); transformMenu.add(getMirrorHorizontallyAction()); transformMenu.add(getMirrorVerticallyAction()); - transformMenu.add(getGroupAction()); - transformMenu.add(getUngroupAction()); + transformMenu.addSeparator(); transformMenu.add(getSendToBackAction()); transformMenu.add(getBringToFrontAction()); + transformMenu.addSeparator(); + transformMenu.add(getGroupAction()); + transformMenu.add(getUngroupAction()); } return transformMenu; } 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 9a77d202..5a2ca4c8 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 @@ -13,6 +13,7 @@ import org.diylc.appframework.undo.UndoHandler; import org.diylc.common.EventType; import org.diylc.common.IPlugIn; import org.diylc.common.IPlugInPort; +import org.diylc.common.ISelectionProcessor; import org.diylc.core.ExpansionMode; import org.diylc.core.Project; import org.diylc.images.IconLoader; @@ -22,6 +23,7 @@ import org.diylc.swing.ISwingUI; public class EditMenuPlugin implements IPlugIn, ClipboardOwner { private static final String EDIT_TITLE = "Edit"; + private static final String TRANSFORM_TITLE = "Transform Selection"; private static final String RENUMBER_TITLE = "Renumber Selection"; private static final String EXPAND_TITLE = "Expand Selection"; @@ -47,6 +49,8 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { private ActionFactory.SaveAsTemplateAction saveAsTemplateAction; private ActionFactory.RotateSelectionAction rotateClockwiseAction; private ActionFactory.RotateSelectionAction rotateCounterClockwiseAction; + private ActionFactory.MirrorSelectionAction mirrorHorizontallyAction; + private ActionFactory.MirrorSelectionAction mirrorVerticallyAction; private UndoHandler undoHandler; @@ -197,6 +201,22 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { } return rotateCounterClockwiseAction; } + + public ActionFactory.MirrorSelectionAction getMirrorHorizontallyAction() { + if (mirrorHorizontallyAction == null) { + mirrorHorizontallyAction = + ActionFactory.getInstance().createMirrorSelectionAction(plugInPort, ISelectionProcessor.HORIZONTAL); + } + return mirrorHorizontallyAction; + } + + public ActionFactory.MirrorSelectionAction getMirrorVerticallyAction() { + if (mirrorVerticallyAction == null) { + mirrorVerticallyAction = + ActionFactory.getInstance().createMirrorSelectionAction(plugInPort, ISelectionProcessor.VERTICAL); + } + return mirrorVerticallyAction; + } @Override public void connect(IPlugInPort plugInPort) { @@ -214,14 +234,20 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { swingUI.injectMenuAction(actionFactory.createSelectAllAction(plugInPort), EDIT_TITLE); swingUI.injectMenuAction(getEditSelectionAction(), EDIT_TITLE); swingUI.injectMenuAction(getDeleteSelectionAction(), EDIT_TITLE); - swingUI.injectMenuAction(getRotateClockwiseAction(), EDIT_TITLE); - swingUI.injectMenuAction(getRotateCounterclockwiseAction(), EDIT_TITLE); - swingUI.injectMenuAction(getSendToBackAction(), EDIT_TITLE); - swingUI.injectMenuAction(getBringToFrontAction(), EDIT_TITLE); - swingUI.injectMenuAction(getGroupAction(), EDIT_TITLE); - swingUI.injectMenuAction(getUngroupAction(), EDIT_TITLE); + swingUI.injectSubmenu(TRANSFORM_TITLE, IconLoader.MagicWand.getIcon(), EDIT_TITLE); + swingUI.injectMenuAction(getRotateClockwiseAction(), TRANSFORM_TITLE); + swingUI.injectMenuAction(getRotateCounterclockwiseAction(), TRANSFORM_TITLE); + swingUI.injectMenuAction(null, TRANSFORM_TITLE); + swingUI.injectMenuAction(getMirrorHorizontallyAction(), TRANSFORM_TITLE); + swingUI.injectMenuAction(getMirrorVerticallyAction(), TRANSFORM_TITLE); + swingUI.injectMenuAction(null, TRANSFORM_TITLE); + swingUI.injectMenuAction(getSendToBackAction(), TRANSFORM_TITLE); + swingUI.injectMenuAction(getBringToFrontAction(), TRANSFORM_TITLE); + swingUI.injectMenuAction(null, TRANSFORM_TITLE); + swingUI.injectMenuAction(getGroupAction(), TRANSFORM_TITLE); + swingUI.injectMenuAction(getUngroupAction(), TRANSFORM_TITLE); swingUI.injectMenuAction(null, EDIT_TITLE); - swingUI.injectMenuAction(getSaveAsTemplateAction(), EDIT_TITLE); +// swingUI.injectMenuAction(getSaveAsTemplateAction(), EDIT_TITLE); swingUI.injectSubmenu(RENUMBER_TITLE, IconLoader.Sort.getIcon(), EDIT_TITLE); swingUI.injectMenuAction(getRenumberXAxisAction(), RENUMBER_TITLE); swingUI.injectMenuAction(getRenumberYAxisAction(), RENUMBER_TITLE); @@ -277,6 +303,8 @@ public class EditMenuPlugin implements IPlugIn, ClipboardOwner { getBringToFrontAction().setEnabled(enabled); getRotateClockwiseAction().setEnabled(enabled); getRotateCounterclockwiseAction().setEnabled(enabled); + getMirrorHorizontallyAction().setEnabled(enabled); + getMirrorVerticallyAction().setEnabled(enabled); getSaveAsTemplateAction().setEnabled(enabled); } diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index 2b8b3800..98559d67 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -1508,6 +1508,26 @@ https://github.com/bancika/diy-layout-creator/releases + + + + 3 + 35 + 0 + + 2016-12-30 20:00:00.000 CET + + + + NEW_FEATURE + Mirror selection horizontally and vertically + + + IMPROVEMENT + Consolidated context menu items + + + https://github.com/bancika/diy-layout-creator/releases \ No newline at end of file