diff --git a/src/actions/RemovePaintComponent.java b/src/actions/RemovePaintComponent.java index 8ca868d..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{ @@ -29,6 +31,8 @@ public void performAction() { for ( PaintComponent comp: panel.getSelectTool().getSelectedComponents()) { comps.add(comp); } + + for( PaintComponent comp: comps ) comp.remove(panel); //push action to the manager @@ -45,12 +49,16 @@ public void redoAction() { comp.remove(panel); } }); + panel.repaint(); } @Override public String locationString() { // TODO Auto-generated method stub - return ActionsMenuBarTitles.Data().Remove().toString(); } - + 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/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 7756ada..79caa3b 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 5f2f971..ed11540 100644 --- a/src/paintcomponents/data/DataTextIOPaintComponent.java +++ b/src/paintcomponents/data/DataTextIOPaintComponent.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.stream.Collectors; +import painttools.tools.SelectToolInterface; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; @@ -166,7 +167,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 @@ -188,7 +189,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 a5b4bcb..e3bf41b 100644 --- a/src/paintcomponents/data/DataTextPaintComponent.java +++ b/src/paintcomponents/data/DataTextPaintComponent.java @@ -9,6 +9,8 @@ import paintcomponents.RectanglePaintComponent; import paintcomponents.TextPaintComponent; +import painttools.tools.SelectToolInterface; +import settings.Defaults; import painttools.tools.SelectTool; import ui.PaintPanel; @@ -61,7 +63,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 @@ -69,7 +71,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 7c853d6..01c184b 100644 --- a/src/painttools/toolbar/ToolBar.java +++ b/src/painttools/toolbar/ToolBar.java @@ -1,21 +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 { @@ -35,6 +32,7 @@ public ToolBar(PaintPanel panel) { selectTool = new SelectTool(panel); addTool(new DotTool()); addTool(selectTool); + addTool(new SmartTool(panel)); } /** @@ -73,7 +71,7 @@ private void select(PaintTool tool) { } } - public SelectTool getSelectTool() { + public SelectToolInterface getSelectTool() { return selectTool; } diff --git a/src/painttools/tools/MenuForPaintComponent.java b/src/painttools/tools/MenuForPaintComponent.java new file mode 100644 index 0000000..87fb840 --- /dev/null +++ b/src/painttools/tools/MenuForPaintComponent.java @@ -0,0 +1,100 @@ +package painttools.tools; + +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 { + public static JPopupMenu getMenuForPaintComponent(PaintComponent comp, PaintPanel panel) { + 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) { + 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(); + } + }); + 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; + } + } + 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); + + } + } +} diff --git a/src/painttools/tools/SelectTool.java b/src/painttools/tools/SelectTool.java index a8b2c32..32d2c55 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; @@ -24,6 +24,7 @@ public class SelectTool extends PaintTool { /** * @return the lastMouseEvent */ + @Override public MouseEvent getLastMouseEvent() { return lastMouseEvent; } @@ -35,13 +36,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 +60,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 +72,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 +85,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()) { @@ -246,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 new file mode 100644 index 0000000..eed7e0c --- /dev/null +++ b/src/painttools/tools/SelectToolInterface.java @@ -0,0 +1,41 @@ +package painttools.tools; + +import java.awt.event.MouseEvent; +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); + + public abstract MouseEvent getLastMouseEvent(); + +} \ 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..247b79f --- /dev/null +++ b/src/painttools/tools/SmartTool.java @@ -0,0 +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 SmartTool(PaintPanel panel) { + super(); + this.panel = panel; + selectedComponents = new ArrayList<>(); + listeners = new ArrayList<>(); + + } + + private ArrayList selectedComponents; + private ArrayList listeners; + @Override + public ArrayList getSelectedComponents() { + 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 mouseExited(MouseEvent e) { + // TODO Auto-generated method stub + + } + + @Override + public void mousePressed(MouseEvent e) { + // TODO Auto-generated method stub + + } + + @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; + } + +} diff --git a/src/ui/PaintPanel.java b/src/ui/PaintPanel.java index 62e5b0b..cb9f925 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 { @@ -31,7 +32,7 @@ enum State { private PaintTool tool; private PaintComponent tempComponent; - private SelectTool selectTool; + private SelectToolInterface selectTool; /** * @return the tempComponent @@ -204,7 +205,7 @@ public PaintComponent componentUnderPoint(int x, int y) { * * @return */ - public SelectTool getSelectTool() { + public SelectToolInterface getSelectTool() { return selectTool; } @@ -213,7 +214,7 @@ public SelectTool getSelectTool() { * * @param selectTool */ - public void setSelectTool(SelectTool selectTool) { + public void setSelectTool(SelectToolInterface selectTool) { this.selectTool = selectTool; }