Skip to content

Commit 59a07d2

Browse files
committed
Add Method Component
1 parent d78f443 commit 59a07d2

4 files changed

Lines changed: 220 additions & 0 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package actions;
2+
3+
import java.lang.reflect.Method;
4+
5+
import javax.swing.JOptionPane;
6+
7+
import actions.menu.ActionsMenuBarTitles;
8+
import paintcomponents.java.lazy.ClassConstructorPaintComponent;
9+
import paintcomponents.java.lazy.ClassPaintComponent;
10+
import paintcomponents.java.lazy.MethodPaintComponent;
11+
import ui.PaintPanel;
12+
13+
public class AddLazyJavaMethodComponentAction extends PaintAction {
14+
15+
public AddLazyJavaMethodComponentAction(PaintPanel panel) {
16+
super(panel);
17+
}
18+
19+
//TODO
20+
//NOTE: I am copying from Constructor, consider refinement
21+
@Override
22+
public boolean canPerformAction() {
23+
if (panel.getSelectTool().getSelectedComponents().size() != 1) {
24+
return false;
25+
}
26+
if (panel.getSelectTool().getSelectedComponents()
27+
.get(0) instanceof ClassPaintComponent) {
28+
return true;
29+
}
30+
return false;
31+
}
32+
33+
@Override
34+
public void performAction() {
35+
ClassPaintComponent comp = (ClassPaintComponent) panel.getSelectTool()
36+
.getSelectedComponents().get(0);
37+
Method[] methods = comp.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+
MethodPaintComponent methodComp = new MethodPaintComponent(
44+
methods[desiaredConstructorIndex], panel.getWidth() / 2,
45+
panel.getHeight() / 2);
46+
panel.addPaintComponent(methodComp);
47+
panel.repaint();
48+
}
49+
public String getMethodsSelectionUI(Method[] methods) {
50+
StringBuilder builder = new StringBuilder();
51+
for (int i = 0; i < methods.length; i++) {
52+
Method constructor = methods[i];
53+
builder.append(i + " : " + constructor.toString() + "\n");
54+
}
55+
return builder.toString();
56+
57+
}
58+
@Override
59+
public String locationString() {
60+
return ActionsMenuBarTitles.Lazy().Add().Java_Method().toString();
61+
}
62+
63+
}

src/actions/menu/ActionsMenuBar.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import actions.AddDataInputBoxAction;
1414
import actions.AddLazyJavaClassAction;
1515
import actions.AddLazyJavaConstructorAction;
16+
import actions.AddLazyJavaMethodComponentAction;
1617
import actions.AddTextBoxAction;
1718
import actions.ConstructDataLineSegmentAction;
1819
import actions.ConstructLineSegmentAction;
@@ -40,6 +41,7 @@ public ActionsMenuBar(PaintPanel panel){
4041
//java class
4142
addAction(new AddLazyJavaClassAction(panel));
4243
addAction(new AddLazyJavaConstructorAction(panel));
44+
addAction(new AddLazyJavaMethodComponentAction(panel));
4345

4446
}
4547

src/actions/menu/ActionsMenuBarTitles.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,11 @@ public ActionsMenuBarTitles Java_Constructor() {
7474
append("Java Constructor");
7575
return this;
7676
}
77+
78+
public ActionsMenuBarTitles Java_Method() {
79+
append("Java Method");
80+
return this;
81+
}
7782

7883

7984
}
Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
package paintcomponents.java.lazy;
2+
3+
import java.lang.reflect.InvocationTargetException;
4+
import java.lang.reflect.Method;
5+
import java.util.ArrayList;
6+
import java.util.NoSuchElementException;
7+
8+
import paintcomponents.NoConnectingLineSegmentException;
9+
import paintcomponents.data.DataFromPoint;
10+
import paintcomponents.data.DataFromPointDataProvider;
11+
import paintcomponents.data.DataFromPointNoDataProviderException;
12+
import paintcomponents.data.DataFromPointProviderCannotProvideDataException;
13+
import paintcomponents.data.DataTextIOPaintComponent;
14+
import paintcomponents.data.DataToPoint;
15+
16+
public class MethodPaintComponent extends DataTextIOPaintComponent
17+
implements DataFromPointDataProvider {
18+
19+
private Method displayingMethod;
20+
21+
public MethodPaintComponent(Method displayingMethod, int x, int y) {
22+
super(displayingMethod.toString(), x, y);
23+
this.displayingMethod = displayingMethod;
24+
init();
25+
}
26+
/*
27+
*
28+
*
29+
* line 0 is signature
30+
*
31+
*
32+
*
33+
* line 1 is the operating instance
34+
*
35+
*
36+
*
37+
* parameters take place from line 2 to length+1
38+
*
39+
*
40+
*
41+
* method's return value take line length+2
42+
*
43+
*
44+
*
45+
*
46+
*/
47+
48+
private void init() {
49+
50+
// line 0 is signature
51+
// line 1 is the operating instance
52+
addToPoint(1);
53+
// parameters take place from line 2 to length+1
54+
Class[] paramTypes = displayingMethod.getParameterTypes();
55+
for (int i = 2; i < paramTypes.length + 2; i++) {
56+
addToPoint(i);
57+
}
58+
59+
// method's return value take line length+2
60+
addFromPoint(this, paramTypes.length + 2);
61+
62+
// prepare String
63+
StringBuilder s = new StringBuilder();
64+
s.append(this.displayingMethod.toString() + "\n");
65+
s.append("<< Operating Instance :: " + this.displayingMethod.toString()
66+
+ "\n");
67+
for (int i = 0; i < paramTypes.length; i++) {
68+
s.append("arg" + i + " :: " + paramTypes[i].getName() + "\n");
69+
}
70+
71+
s.append("Return value"
72+
+ this.displayingMethod.getReturnType().toString() + " >>>> "
73+
+ "\n");
74+
setDisplayingText(s.toString());
75+
76+
}
77+
78+
@Override
79+
public Object provideInformationToDataFromPoint(
80+
DataFromPoint dataFromPoint) {
81+
// TODO Auto-generated method stub
82+
83+
// prepare argument list
84+
ArrayList<DataToPoint> toPoints = getToPoints();
85+
86+
Object operatingInstance = null;
87+
try {
88+
operatingInstance = toPoints.get(0).fetchData();
89+
} catch (NoSuchElementException | NoConnectingLineSegmentException
90+
| DataFromPointNoDataProviderException
91+
| DataFromPointProviderCannotProvideDataException e1) {
92+
e1.printStackTrace();
93+
// TODO Handle Exception
94+
// Note: a static method may not contain an valid instance
95+
// throw new IllegalStateException();
96+
}
97+
98+
// args takes toPoint 1 to size
99+
Object[] args = new Object[toPoints.size() - 1];
100+
101+
for (int i = 1; i < toPoints.size(); i++) {
102+
DataToPoint toPoint = toPoints.get(i);
103+
try {
104+
args[i] = toPoint.fetchData();
105+
} catch (NoSuchElementException | NoConnectingLineSegmentException
106+
| DataFromPointNoDataProviderException
107+
| DataFromPointProviderCannotProvideDataException e) {
108+
e.printStackTrace();
109+
// TODO Handle Exception
110+
// arguments must be valid
111+
throw new IllegalStateException();
112+
}
113+
}
114+
115+
try {
116+
return this.displayingMethod.invoke(operatingInstance, args);
117+
} catch (IllegalAccessException | IllegalArgumentException
118+
| InvocationTargetException e) {
119+
// TODO Auto-generated catch block
120+
e.printStackTrace();
121+
throw new IllegalStateException();
122+
}
123+
124+
}
125+
126+
@Override
127+
public boolean canProvideInformationToDataFromPoint(
128+
DataFromPoint dataFromPoint) {
129+
boolean isFirst = true;
130+
131+
// this class is LAZY, don't care about states
132+
// skip the first toPoint if this method is static
133+
// TODO check if the method is static
134+
for (DataToPoint toPoint : getToPoints()) {
135+
if (isFirst) {
136+
isFirst = false;
137+
continue;
138+
}
139+
try {
140+
toPoint.fetchData();
141+
} catch (Exception e) {
142+
return false;
143+
}
144+
isFirst = false;
145+
146+
}
147+
return true;
148+
}
149+
150+
}

0 commit comments

Comments
 (0)