Skip to content

Commit 66881ad

Browse files
authored
Merge pull request #36 from UCSDOalads/addTESTbylhwlyd1
Add interactive paint component
2 parents 40c820a + f83bd54 commit 66881ad

8 files changed

Lines changed: 556 additions & 1 deletion
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package actions;
2+
3+
import ui.PaintPanel;
4+
5+
import java.lang.reflect.Method;
6+
7+
import javax.swing.JOptionPane;
8+
9+
import actions.menu.ActionsMenuBarTitles;
10+
import paintcomponents.java.lazy.ClassPaintComponent;
11+
import paintcomponents.java.lazy.InstanceOperationComponent;
12+
import paintcomponents.java.lazy.MethodPaintComponent;
13+
14+
public class AddInstanceMethodAction extends PaintAction {
15+
16+
public AddInstanceMethodAction(PaintPanel panel) {
17+
super(panel);
18+
}
19+
20+
@Override
21+
public boolean canPerformAction() {
22+
if (panel.getSelectTool().getSelectedComponents().size() != 1) {
23+
return false;
24+
}
25+
if (panel.getSelectTool().getSelectedComponents()
26+
.get(0) instanceof InstanceOperationComponent) {
27+
return true;
28+
}
29+
return false;
30+
}
31+
32+
@Override
33+
public void performAction() {
34+
InstanceOperationComponent insComp =
35+
(InstanceOperationComponent)panel.getSelectTool().
36+
getSelectedComponents().get(0);
37+
Method[] methods = insComp.getDisplayingClass().getMethods();
38+
39+
int desiaredConstructorIndex = Integer
40+
.parseInt(JOptionPane.showInputDialog(
41+
"Please enter the index of the constructor you would like to use: \n\n\n"
42+
+ getMethodsSelectionUI(methods)));
43+
insComp.addMethodPaintComponent(methods[desiaredConstructorIndex], panel);
44+
panel.repaint();
45+
}
46+
47+
@Override
48+
public String locationString() {
49+
// TODO Auto-generated method stub
50+
return ActionsMenuBarTitles.Lazy().Add().Add_Instance_Method().toString();
51+
}
52+
53+
public String getMethodsSelectionUI(Method[] methods) {
54+
StringBuilder builder = new StringBuilder();
55+
for (int i = 0; i < methods.length; i++) {
56+
Method constructor = methods[i];
57+
builder.append(i + " : " + constructor.toString() + "\n");
58+
}
59+
return builder.toString();
60+
61+
}
62+
63+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package actions;
2+
3+
import java.lang.reflect.Constructor;
4+
import java.lang.reflect.Method;
5+
6+
import actions.edit.undoredo.SharedUndoRedoActionManager;
7+
import actions.edit.undoredo.UndoRedoableInterface;
8+
import actions.menu.ActionsMenuBarTitles;
9+
import paintcomponents.java.lazy.InstanceOperationComponent;
10+
import paintcomponents.java.lazy.ClassPaintComponent;
11+
import ui.PaintPanel;
12+
13+
import javax.swing.JOptionPane;
14+
15+
16+
public class AddInstanceOperationAction extends PaintAction {
17+
18+
19+
public AddInstanceOperationAction(PaintPanel panel) {
20+
super(panel);
21+
}
22+
23+
@Override
24+
public boolean canPerformAction() {
25+
if (panel.getSelectTool().getSelectedComponents().size() != 1) {
26+
return false;
27+
}
28+
if (panel.getSelectTool().getSelectedComponents()
29+
.get(0) instanceof ClassPaintComponent) {
30+
return true;
31+
}
32+
return false;
33+
}
34+
35+
@Override
36+
public void performAction() {
37+
ClassPaintComponent comp = (ClassPaintComponent) panel.getSelectTool()
38+
.getSelectedComponents().get(0);
39+
Constructor[] cons = comp.getDisplayingClass().getConstructors();
40+
41+
int desiaredConstructorIndex = Integer
42+
.parseInt(JOptionPane.showInputDialog(
43+
"Please enter the index of the constructor you would like to use: \n\n\n"
44+
+ getConstructorsSelectionUI(cons)));
45+
InstanceOperationComponent consComp = new InstanceOperationComponent(
46+
cons[desiaredConstructorIndex], panel.getWidth() / 2,
47+
panel.getHeight() / 2);
48+
panel.addPaintComponent(consComp);
49+
// add action to undo redo manager
50+
SharedUndoRedoActionManager.getSharedInstance().pushUndoableAction(new UndoRedoableInterface() {
51+
52+
@Override
53+
public void undoAction() {
54+
consComp.remove(panel);
55+
panel.repaint();
56+
}
57+
58+
@Override
59+
public void redoAction() {
60+
panel.addPaintComponent(consComp);
61+
panel.repaint();
62+
}
63+
});
64+
panel.repaint();
65+
}
66+
67+
public String getConstructorsSelectionUI(Constructor[] cons) {
68+
StringBuilder builder = new StringBuilder();
69+
for (int i = 0; i < cons.length; i++) {
70+
Constructor constructor = cons[i];
71+
builder.append(i + " : " + constructor.toString() + "\n");
72+
}
73+
return builder.toString();
74+
75+
}
76+
77+
@Override
78+
public String locationString() {
79+
return ActionsMenuBarTitles.Lazy().Add().Instance_Operation().toString();
80+
}
81+
82+
83+
}

src/actions/menu/ActionsMenuBar.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import actions.AddDataInputBoxAction;
1515
import actions.AddHaskellComponent;
1616
import actions.AddHaskellEvaluatorComponentAction;
17+
import actions.AddInstanceMethodAction;
1718
import actions.AddLazyJavaClassAction;
1819
import actions.AddLazyJavaConstructorAction;
1920
import actions.AddLazyJavaFieldsComponentAction;
@@ -37,6 +38,7 @@
3738
import actions.ZoomOutAction;
3839
import actions.ZoomInAction;
3940
import actions.ZoomOutAction;
41+
import actions.AddInstanceOperationAction;
4042

4143
public class ActionsMenuBar extends JMenuBar implements SelectionToolListener{
4244

@@ -59,6 +61,8 @@ public ActionsMenuBar(PaintPanel panel){
5961
addAction(new AddLazyJavaConstructorAction(panel));
6062
addAction(new AddLazyJavaMethodComponentAction(panel));
6163
addAction(new AddLazyJavaFieldsComponentAction(panel));
64+
addAction(new AddInstanceOperationAction(panel));
65+
addAction(new AddInstanceMethodAction(panel));
6266

6367
//edit
6468
addAction(new EditRedoAction(panel));

src/actions/menu/ActionsMenuBarTitles.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public ActionsMenuBarTitles Java_Constructor() {
8787
append("Java Constructor");
8888
return this;
8989
}
90-
90+
9191
public ActionsMenuBarTitles Java_Method() {
9292
append("Java Method");
9393
return this;
@@ -143,4 +143,14 @@ public ActionsMenuBarTitles Annotations() {
143143
return this;
144144
}
145145

146+
147+
public ActionsMenuBarTitles Instance_Operation() {
148+
append("Instance Operation Component");
149+
return this;
150+
}
151+
152+
public ActionsMenuBarTitles Add_Instance_Method() {
153+
append("Add Instance Method");
154+
return this;
155+
}
146156
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
package paintcomponents.java.interactive;
2+
3+
import java.lang.reflect.Constructor;
4+
import java.lang.reflect.InvocationTargetException;
5+
import java.util.ArrayList;
6+
import java.util.Arrays;
7+
import java.util.NoSuchElementException;
8+
9+
import javax.swing.JOptionPane;
10+
11+
import org.w3c.dom.DOMException;
12+
import org.w3c.dom.Document;
13+
import org.w3c.dom.Element;
14+
15+
import paintcomponents.NoConnectingLineSegmentException;
16+
import paintcomponents.data.DataFromPoint;
17+
import paintcomponents.data.DataFromPointDataProvider;
18+
import paintcomponents.data.DataFromPointNoDataProviderException;
19+
import paintcomponents.data.DataFromPointProviderCannotProvideDataException;
20+
import paintcomponents.data.DataTextIOPaintComponent;
21+
import paintcomponents.data.DataToPoint;
22+
import typesystem.JavaType;
23+
import ui.PaintPanel;
24+
25+
/*
26+
* This is the interactive constructor paint component, must call evaluate
27+
* to update the instance this component manipulates before use the output.
28+
*/
29+
public class ClassConstructorPaintComponent extends DataTextIOPaintComponent
30+
implements DataFromPointDataProvider {
31+
32+
private Constructor displayingConstructor;
33+
//Store a reference to the object this component operates.
34+
private Object instance;
35+
36+
37+
public ClassConstructorPaintComponent(Constructor displayingContructor,
38+
int x, int y) {
39+
super(displayingContructor.toString(), x, y);
40+
this.displayingConstructor = displayingContructor;
41+
init();
42+
}
43+
44+
private void init() {
45+
46+
// parameters take place from line 1 to length
47+
Class[] paramTypes = displayingConstructor.getParameterTypes();
48+
for (int i = 0; i < paramTypes.length; i++) {
49+
addToPoint(i + 1, new JavaType(paramTypes[i]));
50+
}
51+
52+
// constructed instance take line length+1
53+
addFromPoint(this, paramTypes.length + 1,
54+
new JavaType(this.displayingConstructor.getDeclaringClass()));
55+
56+
// prepare String
57+
StringBuilder s = new StringBuilder();
58+
s.append(this.displayingConstructor.toString() + "\n");
59+
for (int i = 0; i < paramTypes.length; i++) {
60+
s.append("arg" + i + " :: " + paramTypes[i].getName() + "\n");
61+
}
62+
63+
s.append("Constructed Instance >>>> " + "\n");
64+
setDisplayingText(s.toString());
65+
66+
}
67+
68+
/**
69+
* Calculate the input data and store it.
70+
*/
71+
public void evaluate(DataFromPoint dataFromPoint){
72+
// prepare argument list
73+
ArrayList<DataToPoint> toPoints = getToPoints();
74+
Object[] args = new Object[toPoints.size()];
75+
for (int i = 0; i < toPoints.size(); i++) {
76+
DataToPoint toPoint = toPoints.get(i);
77+
try {
78+
args[i] = toPoint.fetchData();
79+
} catch (NoSuchElementException | NoConnectingLineSegmentException
80+
| DataFromPointNoDataProviderException
81+
| DataFromPointProviderCannotProvideDataException e) {
82+
e.printStackTrace();
83+
// TODO Handle Exception
84+
throw new IllegalStateException();
85+
}
86+
}
87+
try {
88+
instance = displayingConstructor.newInstance(args);
89+
} catch (InstantiationException | IllegalAccessException
90+
| IllegalArgumentException | InvocationTargetException e) {
91+
e.printStackTrace();
92+
// TODO Handle Exception
93+
throw new IllegalStateException();
94+
}
95+
}
96+
97+
/**
98+
* Retrieve the data stored in this component
99+
* @return the data stored
100+
*/
101+
@Override
102+
public Object provideInformationToDataFromPoint(
103+
DataFromPoint dataFromPoint) {
104+
105+
return instance;
106+
}
107+
108+
/**
109+
* Check whether the data is good to return from this component
110+
* @param dataFromPoint
111+
* @return the return value
112+
*/
113+
@Override
114+
public boolean canProvideInformationToDataFromPoint(
115+
DataFromPoint dataFromPoint) {
116+
117+
return instance != null;
118+
}
119+
120+
}

0 commit comments

Comments
 (0)