From 85bc91433ae86c08a6f11e81bd4f8c0e70bb9d78 Mon Sep 17 00:00:00 2001 From: kent0318 Date: Sat, 4 Mar 2017 21:10:13 -0800 Subject: [PATCH 1/3] Add SelectToolInterface --- src/painttools/toolbar/ToolBar.java | 3 +- src/painttools/tools/SelectTool.java | 30 +++++++-------- src/painttools/tools/SelectToolInterface.java | 38 +++++++++++++++++++ src/painttools/tools/SmartTool.java | 37 ++++++++++++++++++ src/ui/PaintPanel.java | 7 ++-- 5 files changed, 95 insertions(+), 20 deletions(-) create mode 100644 src/painttools/tools/SelectToolInterface.java create mode 100644 src/painttools/tools/SmartTool.java diff --git a/src/painttools/toolbar/ToolBar.java b/src/painttools/toolbar/ToolBar.java index 7c853d6..803f794 100644 --- a/src/painttools/toolbar/ToolBar.java +++ b/src/painttools/toolbar/ToolBar.java @@ -16,6 +16,7 @@ import painttools.tools.DotTool; import painttools.tools.PaintTool; import painttools.tools.SelectTool; +import painttools.tools.SelectToolInterface; import ui.PaintPanel; public class ToolBar extends JPanel { @@ -73,7 +74,7 @@ private void select(PaintTool tool) { } } - public SelectTool getSelectTool() { + public SelectToolInterface getSelectTool() { return selectTool; } diff --git a/src/painttools/tools/SelectTool.java b/src/painttools/tools/SelectTool.java index a8b2c32..3660185 100644 --- a/src/painttools/tools/SelectTool.java +++ b/src/painttools/tools/SelectTool.java @@ -12,7 +12,7 @@ import settings.Defaults; import ui.PaintPanel; -public class SelectTool extends PaintTool { +public class SelectTool extends PaintTool implements SelectToolInterface{ private PaintPanel panel; @@ -35,13 +35,15 @@ public MouseEvent getLastMouseEvent() { * @return * @see java.util.ArrayList#add(java.lang.Object) */ + @Override public boolean addSelectionToolListener(SelectionToolListener e) { return listeners.add(e); } - /** - * @return the selectedComponents + /* (non-Javadoc) + * @see painttools.tools.SelectToolInterface#getSelectedComponents() */ + @Override public ArrayList getSelectedComponents() { return selectedComponents; } @@ -57,12 +59,10 @@ public void mouseClicked(MouseEvent e) { } - /** - * Selects a component, changes selection All listeners are informed. Panel - * are repainted - * - * @param comp + /* (non-Javadoc) + * @see painttools.tools.SelectToolInterface#selectComponent(paintcomponents.PaintComponent) */ + @Override public void selectComponent(PaintComponent comp) { comp.select(this); for (SelectionToolListener selectionToolListener : listeners) { @@ -71,12 +71,10 @@ public void selectComponent(PaintComponent comp) { panel.repaint(); } - /** - * Deselect a component, changes selection All listeners are informed. Panel - * are repainted - * - * @param comp + /* (non-Javadoc) + * @see painttools.tools.SelectToolInterface#deselectComponent(paintcomponents.PaintComponent) */ + @Override public void deselectComponent(PaintComponent comp) { comp.deselect(this); for (SelectionToolListener selectionToolListener : listeners) { @@ -86,10 +84,10 @@ public void deselectComponent(PaintComponent comp) { } - /** - * Deselect ALL components, changes selection All listeners are informed. - * Panel are repainted + /* (non-Javadoc) + * @see painttools.tools.SelectToolInterface#clearSelection() */ + @Override public void clearSelection() { // remove all selection while(!selectedComponents.isEmpty()) { diff --git a/src/painttools/tools/SelectToolInterface.java b/src/painttools/tools/SelectToolInterface.java new file mode 100644 index 0000000..b9b54d6 --- /dev/null +++ b/src/painttools/tools/SelectToolInterface.java @@ -0,0 +1,38 @@ +package painttools.tools; + +import java.util.ArrayList; + +import paintcomponents.PaintComponent; + +public interface SelectToolInterface { + + /** + * @return the selectedComponents + */ + public abstract ArrayList getSelectedComponents(); + + /** + * Selects a component, changes selection All listeners are informed. Panel + * are repainted + * + * @param comp + */ + public abstract void selectComponent(PaintComponent comp); + + /** + * Deselect a component, changes selection All listeners are informed. Panel + * are repainted + * + * @param comp + */ + public abstract void deselectComponent(PaintComponent comp); + + /** + * Deselect ALL components, changes selection All listeners are informed. + * Panel are repainted + */ + public abstract void clearSelection(); + + public abstract boolean addSelectionToolListener(SelectionToolListener e); + +} \ No newline at end of file diff --git a/src/painttools/tools/SmartTool.java b/src/painttools/tools/SmartTool.java new file mode 100644 index 0000000..2679acb --- /dev/null +++ b/src/painttools/tools/SmartTool.java @@ -0,0 +1,37 @@ +package painttools.tools; + +import java.util.ArrayList; + +import paintcomponents.PaintComponent; + +public class SmartTool implements SelectToolInterface{ + + @Override + public ArrayList getSelectedComponents() { + // TODO Auto-generated method stub + return null; + } + + @Override + public void selectComponent(PaintComponent comp) { + // TODO Auto-generated method stub + + } + + @Override + public void deselectComponent(PaintComponent comp) { + // TODO Auto-generated method stub + + } + + @Override + public void clearSelection() { + // TODO Auto-generated method stub + + } + + public boolean addSelectionToolListener(SelectionToolListener e) { + return false; + } + +} diff --git a/src/ui/PaintPanel.java b/src/ui/PaintPanel.java index f503cde..15b5a8d 100644 --- a/src/ui/PaintPanel.java +++ b/src/ui/PaintPanel.java @@ -17,6 +17,7 @@ import painttools.toolbar.ToolBarListener; import painttools.tools.PaintTool; import painttools.tools.SelectTool; +import painttools.tools.SelectToolInterface; public class PaintPanel extends JPanel implements ToolBarListener { @@ -30,7 +31,7 @@ enum State { private PaintTool tool; private PaintComponent tempComponent; - private SelectTool selectTool; + private SelectToolInterface selectTool; /** * @return the tempComponent @@ -203,7 +204,7 @@ public PaintComponent componentUnderPoint(int x, int y) { * * @return */ - public SelectTool getSelectTool() { + public SelectToolInterface getSelectTool() { return selectTool; } @@ -212,7 +213,7 @@ public SelectTool getSelectTool() { * * @param selectTool */ - public void setSelectTool(SelectTool selectTool) { + public void setSelectTool(SelectToolInterface selectTool) { this.selectTool = selectTool; } From 1210d9a0c4d390d89f4cc8c3c324b48a50bc93b8 Mon Sep 17 00:00:00 2001 From: kent0318 Date: Sat, 4 Mar 2017 23:23:19 -0800 Subject: [PATCH 2/3] Add Remove to Popup Menu --- src/actions/RemovePaintComponent.java | 6 +- src/actions/menu/PaintActionMenuItem.java | 9 +- src/paintcomponents/PaintComponent.java | 8 +- .../data/DataTextIOPaintComponent.java | 6 +- .../data/DataTextPaintComponent.java | 6 +- src/painttools/toolbar/ToolBar.java | 7 +- .../tools/MenuForPaintComponent.java | 38 ++++++ src/painttools/tools/SelectTool.java | 3 +- src/painttools/tools/SelectToolInterface.java | 3 + src/painttools/tools/SmartTool.java | 115 ++++++++++++++++-- 10 files changed, 173 insertions(+), 28 deletions(-) create mode 100644 src/painttools/tools/MenuForPaintComponent.java diff --git a/src/actions/RemovePaintComponent.java b/src/actions/RemovePaintComponent.java index 779f1af..d6e3055 100644 --- a/src/actions/RemovePaintComponent.java +++ b/src/actions/RemovePaintComponent.java @@ -25,6 +25,7 @@ public void performAction() { for ( PaintComponent comp: panel.getSelectTool().getSelectedComponents()) { comp.remove( panel ); } + panel.repaint(); } @@ -32,5 +33,8 @@ public void performAction() { public String locationString() { // TODO Auto-generated method stub return ActionsMenuBarTitles.Data().Remove().toString(); } - + + public String toString() { + return "Remove"; + } } diff --git a/src/actions/menu/PaintActionMenuItem.java b/src/actions/menu/PaintActionMenuItem.java index 3b7e4b1..5746dc3 100644 --- a/src/actions/menu/PaintActionMenuItem.java +++ b/src/actions/menu/PaintActionMenuItem.java @@ -13,9 +13,10 @@ public class PaintActionMenuItem extends JMenuItem{ public PaintActionMenuItem(PaintAction associatedAction, ActionsMenuBar actionsMenuBar) { this.setAssociatedAction(associatedAction); this.actionsMenuBar = actionsMenuBar; - } - + public PaintActionMenuItem(PaintAction associatedAction) { + this.setAssociatedAction(associatedAction); + } public PaintAction getAssociatedAction() { return associatedAction; } @@ -27,7 +28,7 @@ public void setAssociatedAction(PaintAction associatedAction) { public void performAction() { associatedAction.performAction(); //update menu bar status - actionsMenuBar.updateEnableStatusForAllMenuItems(); - + if(actionsMenuBar != null) + actionsMenuBar.updateEnableStatusForAllMenuItems(); } } diff --git a/src/paintcomponents/PaintComponent.java b/src/paintcomponents/PaintComponent.java index be0a463..0af0b42 100644 --- a/src/paintcomponents/PaintComponent.java +++ b/src/paintcomponents/PaintComponent.java @@ -7,7 +7,7 @@ import org.w3c.dom.Node; import org.w3c.dom.NodeList; -import painttools.tools.SelectTool; +import painttools.tools.SelectToolInterface; import ui.PaintPanel; /** @@ -119,7 +119,7 @@ public void paint(Graphics g) { * @param selectTool * TODO */ - public void select(SelectTool selectTool) { + public void select(SelectToolInterface selectTool) { selected = true; if (selectTool != null) selectTool.getSelectedComponents().add(this); @@ -134,7 +134,7 @@ public void select(SelectTool selectTool) { * @param selectTool * TODO */ - public void deselect(SelectTool selectTool) { + public void deselect(SelectToolInterface selectTool) { selected = false; if (selectTool != null) selectTool.getSelectedComponents().remove(this); @@ -146,7 +146,7 @@ public void deselect(SelectTool selectTool) { * @param selectTool * TODO */ - public void toggleSelect(SelectTool selectTool) { + public void toggleSelect(SelectToolInterface selectTool) { if (isSelected()) { deselect(selectTool); } else { diff --git a/src/paintcomponents/data/DataTextIOPaintComponent.java b/src/paintcomponents/data/DataTextIOPaintComponent.java index 6b5a282..bcb2a43 100644 --- a/src/paintcomponents/data/DataTextIOPaintComponent.java +++ b/src/paintcomponents/data/DataTextIOPaintComponent.java @@ -4,7 +4,7 @@ import java.util.ArrayList; import java.util.stream.Collectors; -import painttools.tools.SelectTool; +import painttools.tools.SelectToolInterface; import ui.PaintPanel; /** @@ -161,7 +161,7 @@ public boolean contains(int x, int y) { } @Override - public void select(SelectTool selectTool) { + public void select(SelectToolInterface selectTool) { int x = selectTool.getLastMouseEvent().getX(); int y = selectTool.getLastMouseEvent().getY(); // try to select every from and toPoints @@ -183,7 +183,7 @@ public void select(SelectTool selectTool) { } @Override - public void deselect(SelectTool selectTool) { + public void deselect(SelectToolInterface selectTool) { int x = selectTool.getLastMouseEvent().getX(); int y = selectTool.getLastMouseEvent().getY(); diff --git a/src/paintcomponents/data/DataTextPaintComponent.java b/src/paintcomponents/data/DataTextPaintComponent.java index 6ad8032..e766c41 100644 --- a/src/paintcomponents/data/DataTextPaintComponent.java +++ b/src/paintcomponents/data/DataTextPaintComponent.java @@ -7,7 +7,7 @@ import paintcomponents.RectanglePaintComponent; import paintcomponents.TextPaintComponent; -import painttools.tools.SelectTool; +import painttools.tools.SelectToolInterface; import settings.Defaults; /** @@ -59,7 +59,7 @@ public void translate(int i, int j) { } @Override - public void select(SelectTool selectTool) { + public void select(SelectToolInterface selectTool) { super.select(selectTool); //pass in null to prevent current selection from being modified //only causes changes in apperance @@ -67,7 +67,7 @@ public void select(SelectTool selectTool) { } @Override - public void deselect(SelectTool selectTool) { + public void deselect(SelectToolInterface selectTool) { // TODO Auto-generated method stub super.deselect(selectTool); rect.deselect(null); diff --git a/src/painttools/toolbar/ToolBar.java b/src/painttools/toolbar/ToolBar.java index 803f794..01c184b 100644 --- a/src/painttools/toolbar/ToolBar.java +++ b/src/painttools/toolbar/ToolBar.java @@ -1,22 +1,18 @@ package painttools.toolbar; -import java.awt.Button; -import java.awt.Component; -import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.ArrayList; import javax.swing.BoxLayout; -import javax.swing.Icon; import javax.swing.JButton; import javax.swing.JPanel; -import javax.tools.Tool; import painttools.tools.DotTool; import painttools.tools.PaintTool; import painttools.tools.SelectTool; import painttools.tools.SelectToolInterface; +import painttools.tools.SmartTool; import ui.PaintPanel; public class ToolBar extends JPanel { @@ -36,6 +32,7 @@ public ToolBar(PaintPanel panel) { selectTool = new SelectTool(panel); addTool(new DotTool()); addTool(selectTool); + addTool(new SmartTool(panel)); } /** diff --git a/src/painttools/tools/MenuForPaintComponent.java b/src/painttools/tools/MenuForPaintComponent.java new file mode 100644 index 0000000..51022a8 --- /dev/null +++ b/src/painttools/tools/MenuForPaintComponent.java @@ -0,0 +1,38 @@ +package painttools.tools; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.JMenu; +import javax.swing.JPopupMenu; + +import actions.PaintAction; +import actions.RemovePaintComponent; +import actions.menu.PaintActionMenuItem; +import paintcomponents.PaintComponent; +import paintcomponents.TextPaintComponent; +import ui.PaintPanel; + +public class MenuForPaintComponent { + public static JPopupMenu getMenuForPaintComponent(PaintComponent comp, PaintPanel panel) { + JPopupMenu menu = new JPopupMenu(); + if( comp instanceof TextPaintComponent ) + addActionToMenu(menu, new RemovePaintComponent(panel)); + return menu; + + } + private static void addActionToMenu(JPopupMenu menu, PaintAction action) { + PaintActionMenuItem item = new PaintActionMenuItem(action); + item.setEnabled(action.canPerformAction()); + item.setText(action.toString()); + item.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + item.performAction(); + + } + }); + menu.add(item); + } +} diff --git a/src/painttools/tools/SelectTool.java b/src/painttools/tools/SelectTool.java index 3660185..32d2c55 100644 --- a/src/painttools/tools/SelectTool.java +++ b/src/painttools/tools/SelectTool.java @@ -24,6 +24,7 @@ public class SelectTool extends PaintTool implements SelectToolInterface{ /** * @return the lastMouseEvent */ + @Override public MouseEvent getLastMouseEvent() { return lastMouseEvent; } @@ -244,7 +245,7 @@ public void mouseMoved(MouseEvent e) { @Override public void start(PaintPanel panel) { this.panel = panel; - + panel.setSelectTool(this); } @Override diff --git a/src/painttools/tools/SelectToolInterface.java b/src/painttools/tools/SelectToolInterface.java index b9b54d6..eed7e0c 100644 --- a/src/painttools/tools/SelectToolInterface.java +++ b/src/painttools/tools/SelectToolInterface.java @@ -1,5 +1,6 @@ package painttools.tools; +import java.awt.event.MouseEvent; import java.util.ArrayList; import paintcomponents.PaintComponent; @@ -35,4 +36,6 @@ public interface SelectToolInterface { public abstract boolean addSelectionToolListener(SelectionToolListener e); + public abstract MouseEvent getLastMouseEvent(); + } \ No newline at end of file diff --git a/src/painttools/tools/SmartTool.java b/src/painttools/tools/SmartTool.java index 2679acb..247b79f 100644 --- a/src/painttools/tools/SmartTool.java +++ b/src/painttools/tools/SmartTool.java @@ -1,37 +1,138 @@ package painttools.tools; +import java.awt.Dimension; +import java.awt.event.MouseEvent; import java.util.ArrayList; +import javax.swing.JPopupMenu; + import paintcomponents.PaintComponent; +import ui.PaintPanel; + +public class SmartTool extends PaintTool implements SelectToolInterface{ + + private PaintPanel panel; + private MouseEvent lastMouseEvent; -public class SmartTool implements SelectToolInterface{ + public SmartTool(PaintPanel panel) { + super(); + this.panel = panel; + selectedComponents = new ArrayList<>(); + listeners = new ArrayList<>(); + + } + private ArrayList selectedComponents; + private ArrayList listeners; @Override public ArrayList getSelectedComponents() { - // TODO Auto-generated method stub - return null; + return selectedComponents; } @Override public void selectComponent(PaintComponent comp) { + comp.select(this); + for (SelectionToolListener selectionToolListener : listeners) { + selectionToolListener.selectionChanged(); + } + panel.repaint(); + } + + @Override + public void deselectComponent(PaintComponent comp) { + comp.deselect(this); + for (SelectionToolListener selectionToolListener : listeners) { + selectionToolListener.selectionChanged(); + } + panel.repaint(); + } + + @Override + public void clearSelection() { + // remove all selection + while(!selectedComponents.isEmpty()) { + selectedComponents.get(0).deselect(this); + } + + for (SelectionToolListener selectionToolListener : listeners) { + selectionToolListener.selectionChanged(); + } + panel.repaint(); + } + + public boolean addSelectionToolListener(SelectionToolListener e) { + return listeners.add(e); + } + + @Override + public void mouseClicked(MouseEvent e) { + lastMouseEvent = e; + if(e.getButton() == MouseEvent.BUTTON3) { + PaintComponent comp = panel.componentUnderPoint(e.getX(), e.getY()); + if( comp != null) { + selectComponent(comp); + JPopupMenu menu = MenuForPaintComponent.getMenuForPaintComponent(comp, panel); + //menu.setLocation(e.getPoint()); + //menu.setPreferredSize(new Dimension(200,200)); + menu.show(panel, e.getX(), e.getY()); + //panel.add(menu); + panel.repaint(); + } + } + + } + + @Override + public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub } @Override - public void deselectComponent(PaintComponent comp) { + public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub } @Override - public void clearSelection() { + public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub } - public boolean addSelectionToolListener(SelectionToolListener e) { - return false; + @Override + public void mouseReleased(MouseEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void mouseDragged(MouseEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void mouseMoved(MouseEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void start(PaintPanel panel) { + // TODO Auto-generated method stub + panel.setSelectTool(this); + + } + + @Override + public void reset() { + // TODO Auto-generated method stub + + } + + public MouseEvent getLastMouseEvent() { + return lastMouseEvent; } } From fe4f9b0cfdaaa99ab51888f233e12fb3b897c174 Mon Sep 17 00:00:00 2001 From: kent0318 Date: Sat, 11 Mar 2017 00:53:50 -0800 Subject: [PATCH 3/3] Add more functionality in right-click popup menu --- src/actions/RemovePaintComponent.java | 10 ++- src/actions/add/AddConstructor.java | 32 ++++++++ src/actions/add/AddFields.java | 30 +++++++ src/actions/add/AddMethod.java | 32 ++++++++ src/actions/add/AddOperation.java | 37 +++++++++ src/actions/menu/ActionsPopupMenuTitles.java | 32 ++++++++ .../tools/MenuForPaintComponent.java | 82 ++++++++++++++++--- 7 files changed, 241 insertions(+), 14 deletions(-) create mode 100644 src/actions/add/AddConstructor.java create mode 100644 src/actions/add/AddFields.java create mode 100644 src/actions/add/AddMethod.java create mode 100644 src/actions/add/AddOperation.java create mode 100644 src/actions/menu/ActionsPopupMenuTitles.java diff --git a/src/actions/RemovePaintComponent.java b/src/actions/RemovePaintComponent.java index 3841db4..d41ed04 100644 --- a/src/actions/RemovePaintComponent.java +++ b/src/actions/RemovePaintComponent.java @@ -3,10 +3,12 @@ import java.util.ArrayList; import paintcomponents.PaintComponent; +import painttools.tools.SmartTool; import ui.PaintPanel; import actions.edit.undoredo.SharedUndoRedoActionManager; import actions.edit.undoredo.UndoRedoableInterface; import actions.menu.ActionsMenuBarTitles; +import actions.menu.ActionsPopupMenuTitles; public class RemovePaintComponent extends PaintAction{ @@ -54,9 +56,9 @@ public void redoAction() { @Override public String locationString() { // TODO Auto-generated method stub - return ActionsMenuBarTitles.Data().Remove().toString(); } - - public String toString() { - return "Remove"; + if(panel.getSelectTool() instanceof SmartTool) + return ActionsPopupMenuTitles.Remove().toString(); + return ActionsMenuBarTitles.Data().Remove().toString(); } + } diff --git a/src/actions/add/AddConstructor.java b/src/actions/add/AddConstructor.java new file mode 100644 index 0000000..602ae5a --- /dev/null +++ b/src/actions/add/AddConstructor.java @@ -0,0 +1,32 @@ +package actions.add; + +import java.lang.reflect.Constructor; + +import actions.menu.ActionsMenuBarTitles; +import actions.menu.ActionsPopupMenuTitles; +import paintcomponents.java.lazy.ClassConstructorPaintComponent; +import ui.PaintPanel; + +public class AddConstructor extends AddOperation { + + private Constructor constructor; + + public AddConstructor(PaintPanel panel, Constructor constructor) { + super(panel); + // TODO Auto-generated constructor stub + this.constructor = constructor; + } + + @Override + protected ClassConstructorPaintComponent getPaintComponentToAdd() { + // TODO Auto-generated method stub + return new ClassConstructorPaintComponent(constructor, 0, 0); + } + + @Override + public String locationString() { + // TODO Auto-generated method stub + return ActionsPopupMenuTitles.Constructor().append(constructor.toString()).toString(); + } + +} diff --git a/src/actions/add/AddFields.java b/src/actions/add/AddFields.java new file mode 100644 index 0000000..577309a --- /dev/null +++ b/src/actions/add/AddFields.java @@ -0,0 +1,30 @@ +package actions.add; + +import actions.menu.ActionsPopupMenuTitles; +import paintcomponents.PaintComponent; +import paintcomponents.java.lazy.FieldsPaintComponent; +import ui.PaintPanel; + +public class AddFields extends AddOperation{ + + private Class displayingClass; + + public AddFields(PaintPanel panel, Class displayingClass) { + super(panel); + // TODO Auto-generated constructor stub + this.displayingClass = displayingClass; + } + + @Override + protected PaintComponent getPaintComponentToAdd() { + // TODO Auto-generated method stub + return new FieldsPaintComponent(displayingClass, 0, 0); + } + + @Override + public String locationString() { + // TODO Auto-generated method stub + return ActionsPopupMenuTitles.Fields().toString(); + } + +} diff --git a/src/actions/add/AddMethod.java b/src/actions/add/AddMethod.java new file mode 100644 index 0000000..7458868 --- /dev/null +++ b/src/actions/add/AddMethod.java @@ -0,0 +1,32 @@ +package actions.add; + +import java.lang.reflect.Method; + +import actions.menu.ActionsPopupMenuTitles; +import paintcomponents.java.lazy.ClassConstructorPaintComponent; +import paintcomponents.java.lazy.MethodPaintComponent; +import ui.PaintPanel; + +public class AddMethod extends AddOperation { + + private Method method; + + public AddMethod(PaintPanel panel, Method method) { + super(panel); + // TODO Auto-generated constructor stub + this.method = method; + } + + @Override + protected MethodPaintComponent getPaintComponentToAdd() { + // TODO Auto-generated method stub + return new MethodPaintComponent(method, 0, 0); + } + + @Override + public String locationString() { + // TODO Auto-generated method stub + return ActionsPopupMenuTitles.Method().append(method.toString()).toString(); + } + +} diff --git a/src/actions/add/AddOperation.java b/src/actions/add/AddOperation.java new file mode 100644 index 0000000..ec93a3f --- /dev/null +++ b/src/actions/add/AddOperation.java @@ -0,0 +1,37 @@ +package actions.add; + +import paintcomponents.PaintComponent; +import paintcomponents.java.lazy.ClassConstructorPaintComponent; +import ui.PaintPanel; +import actions.PaintAction; + +/** + * Subcalss should override getPaintComponentToAdd to provide an adder should the action be performed + * @author cs12waft + * + * @param + */ +public abstract class AddOperation extends PaintAction { + + public AddOperation(PaintPanel panel) { + super(panel); + } + + @Override + public boolean canPerformAction() { + return true; + } + + @Override + public void performAction() { + PaintComponent consComp = getPaintComponentToAdd(); + consComp.translate(panel.getWidth() / 2, panel.getHeight() / 2); + panel.addPaintComponent(consComp); + panel.repaint(); + } + + protected abstract T getPaintComponentToAdd(); + + + +} diff --git a/src/actions/menu/ActionsPopupMenuTitles.java b/src/actions/menu/ActionsPopupMenuTitles.java new file mode 100644 index 0000000..c0dcd6a --- /dev/null +++ b/src/actions/menu/ActionsPopupMenuTitles.java @@ -0,0 +1,32 @@ +package actions.menu; + +public class ActionsPopupMenuTitles { + public String pending; + + public ActionsPopupMenuTitles(String string) { + pending = string; + } + + @Override + public String toString() { + return pending; + } + + public static ActionsPopupMenuTitles Remove(){ + return new ActionsPopupMenuTitles("Remove"); + } + public static ActionsPopupMenuTitles Constructor(){ + return new ActionsPopupMenuTitles("Constructor"); + } + public static ActionsPopupMenuTitles Method(){ + return new ActionsPopupMenuTitles("Method"); + } + public static ActionsPopupMenuTitles Fields(){ + return new ActionsPopupMenuTitles("Fields"); + } + public ActionsPopupMenuTitles append(String str) { + pending += "/" + str; + return this; + } + +} diff --git a/src/painttools/tools/MenuForPaintComponent.java b/src/painttools/tools/MenuForPaintComponent.java index 51022a8..87fb840 100644 --- a/src/painttools/tools/MenuForPaintComponent.java +++ b/src/painttools/tools/MenuForPaintComponent.java @@ -2,15 +2,23 @@ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import javax.swing.JComponent; import javax.swing.JMenu; import javax.swing.JPopupMenu; import actions.PaintAction; import actions.RemovePaintComponent; +import actions.add.AddConstructor; +import actions.add.AddFields; +import actions.add.AddMethod; import actions.menu.PaintActionMenuItem; import paintcomponents.PaintComponent; import paintcomponents.TextPaintComponent; +import paintcomponents.java.lazy.ClassConstructorPaintComponent; +import paintcomponents.java.lazy.ClassPaintComponent; import ui.PaintPanel; public class MenuForPaintComponent { @@ -18,21 +26,75 @@ public static JPopupMenu getMenuForPaintComponent(PaintComponent comp, PaintPane JPopupMenu menu = new JPopupMenu(); if( comp instanceof TextPaintComponent ) addActionToMenu(menu, new RemovePaintComponent(panel)); + if( comp instanceof ClassPaintComponent ) { + Constructor[] ctr = ((ClassPaintComponent) comp).getDisplayingClass().getConstructors(); + for( int i = 0; i < ctr.length; i++) { + addActionToMenu(menu, new AddConstructor(panel, ctr[i])); + } + Method[] method = ((ClassPaintComponent) comp).getDisplayingClass().getMethods(); + for( int i = 0; i < method.length; i++) { + addActionToMenu(menu, new AddMethod(panel, method[i])); + } + addActionToMenu(menu, new AddFields(panel, ((ClassPaintComponent) comp).getDisplayingClass())); + } + return menu; } private static void addActionToMenu(JPopupMenu menu, PaintAction action) { - PaintActionMenuItem item = new PaintActionMenuItem(action); - item.setEnabled(action.canPerformAction()); - item.setText(action.toString()); - item.addActionListener(new ActionListener() { + String[] string = action.locationString().split("/"); + if(string.length == 1) { + PaintActionMenuItem item = new PaintActionMenuItem(action); + item.setEnabled(action.canPerformAction()); + item.setText(action.locationString()); + item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - item.performAction(); - + @Override + public void actionPerformed(ActionEvent e) { + item.performAction(); + } + }); + menu.add(item); + } + + //TODO This code is copied from ActionMenuBar, consider change + else { + JComponent insertionMenu = menu; + for( int k = 0; k < string.length-1; k++) { + boolean menuFound = false; + for (int i = 0; i < insertionMenu.getComponentCount();i++) { + + // only check JMenu, exclude PaintActionMenuItem + if(insertionMenu.getComponent(i) instanceof JMenu ) { + JMenu existingMenu = (JMenu)insertionMenu.getComponent(i); + if(existingMenu.getText().equals(string[k])){ + insertionMenu = existingMenu; + menuFound = true; + break; + } + } + } + // if not found, create a new menu + + if( !menuFound ) { + JMenu newMenu = new JMenu(string[k]); + insertionMenu.add(newMenu); + insertionMenu = newMenu; + } } - }); - menu.add(item); + PaintActionMenuItem item = new PaintActionMenuItem(action); + item.setEnabled(action.canPerformAction()); + item.setText(string[string.length-1]); + item.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + item.performAction(); + + } + }); + insertionMenu.add(item); + + } } }