001 package controller;
002
003 import model.ILambda;
004 import sysModel.ICmdFactory;
005 import sysModel.ISecurityAdapter;
006 import sysModel.SimDriver;
007 import sysModel.env.AEnvFactory;
008 import view.MBSView;
009
010 import java.io.*;
011 import java.awt.*;
012
013 /**
014 * Controller class. Main program entry point.
015 *
016 * @author Mathias Ricken
017 */
018 public class MBSController {
019 /**
020 * Simulation control.
021 */
022 private SimDriver _simDriver;
023
024 /**
025 * View.
026 */
027 private MBSView _view;
028
029 /**
030 * Main program entry point.
031 */
032 public void run() {
033 detectDrJava();
034
035 // initialize list of environment and fish names
036 final String[] envClassNames = new String[]{
037 "sysModel.env.BoundedEnv",
038 "sysModel.env.UnboundedEnv",
039 "sysModel.env.NoGridEnv"
040 };
041 final String[] fishClassNames = new String[]{
042 "model.fish.GenericFish",
043 "model.fish.SlowFish",
044 "model.fish.DarterFish",
045 "model.fish.CircleFish",
046 "model.fish.SimpleFish",
047 "model.fish.RockFish"
048 };
049
050 // initialize model
051 _simDriver = new SimDriver();
052
053 // initialize view and pass adapters to model
054 _view = new MBSView(new IDisplayAdapter() {
055 public void draw(Graphics2D g, Component comp, Point.Double p1, Point.Double p2) {
056 _simDriver.draw(g, comp, p1, p2);
057 }
058
059 public Dimension getDisplaySize() {
060 return _simDriver.getDisplaySize();
061 }
062
063 public void returnHome(IScrollAdapter sa) {
064 }
065
066 public Point.Double getViewPosition(Point.Double pos) {
067 return _simDriver.getViewPosition(pos);
068 }
069
070 public Point.Double getPanDelta(Point.Double delta) {
071 return _simDriver.getPanDelta(delta);
072 }
073 }, new ISimAdapter() {
074 public void step() {
075 _simDriver.step();
076 }
077
078 public void start() {
079 _simDriver.start();
080 }
081
082 public void stop() {
083 _simDriver.stop();
084 }
085
086 public void setSpeed(int speed) {
087 _simDriver.setSpeed(speed);
088 }
089
090 public void setStartLambda(ILambda startLambda) {
091 _simDriver.setStartLambda(startLambda);
092 }
093
094 public void setIterationLambda(ILambda itLambda) {
095 _simDriver.setIterationLambda(itLambda);
096 }
097 }, new IEnvAdapter() {
098 public boolean loadEnvironment(String filename) {
099 return _simDriver.loadEnvironment(filename);
100 }
101
102 public boolean saveEnvironment(String filename) {
103 return _simDriver.saveEnvironment(filename);
104 }
105
106 public boolean createEnvironment(AEnvFactory factory) {
107 return _simDriver.createEnvironment(factory);
108 }
109
110 public void setSeedLambda(ILambda seedLambda) {
111 _simDriver.setSeedLambda(seedLambda);
112 }
113
114 public void edit(Point.Double p, int button) {
115 _simDriver.edit(p, button);
116 }
117
118 public String getToolTipText(Point.Double p) {
119 return _simDriver.getToolTipText(p);
120 }
121
122 public String[] getEnvironmentClassNames() {
123 return envClassNames;
124 }
125
126 public String[] getFishClassNames() {
127 return fishClassNames;
128 }
129
130 public ICmdFactory getCmdFactory() {
131 return _simDriver.getCmdFactory();
132 }
133
134 public ISecurityAdapter getSecurityAdapter() {
135 return _simDriver.getSecurityAdapter();
136 }
137 });
138
139 // set adapters connecting model to view
140 _simDriver.setAdapters(new IEditAdapter() {
141 public String getCurrentFish() {
142 return _view.getCurrentFish();
143 }
144
145 public Color getCurrentColor() {
146 return _view.getCurrentColor();
147 }
148 }, new ISimulationExceptionAdapter() {
149 public void handleException(Throwable t) {
150 _view.handleException(t);
151 }
152 });
153
154 _view.setSize(500, 400);
155 _view.setVisible(true);
156 }
157
158
159 /**
160 * Java Virtual Machine entry point.
161 *
162 * @param args command line arguments
163 */
164 public static void main(String[] args) {
165 (new MBSController()).run();
166 }
167
168 /**
169 * Detect presence of DrJava n the classpath.
170 * Set "edu.rice.cs.cunit.drjava" property to "true" if found, to "false" otherwise.
171 * This is necessary since DrJava is incompatible with some of the security measures the simulator uses.
172 */
173 private void detectDrJava() {
174 // Try to load it from our repository
175 String[] classPath = System.getProperty("java.class.path").split(File.pathSeparator);
176 System.setProperty("edu.rice.cs.cunit.drjava","false");
177 for(String classPathEntry: classPath) {
178 String name = (File.separatorChar+classPathEntry).substring(classPathEntry.lastIndexOf(File.separatorChar)+2);
179 if (0 <= name.toLowerCase().indexOf("drjava")) {
180 System.setProperty("edu.rice.cs.cunit.drjava","true");
181 break;
182 }
183 }
184 }
185 }