001 /**
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: Nov 27, 2002
005 * Time: 3:50:38 PM
006 */
007
008 package EVolve.visualization.XYViz;
009
010 import EVolve.visualization.*;
011 import EVolve.util.Painters.*;
012 import EVolve.util.Magnifier;
013 import EVolve.util.SourceBrowser.SourceBrowser;
014 import EVolve.Scene;
015 import javax.swing.*;
016 import java.util.HashMap;
017 import java.awt.event.*;
018 import java.awt.*;
019
020 public abstract class XYVisualization extends Visualization{
021 protected int autoInterval;
022 protected String autoPredictorname;
023 protected int interval;
024 protected boolean shift_pressed;
025 protected AutoImage image; // the image
026 protected Painter painter;
027 protected int xMax; // maximum value on X-axis
028 protected Magnifier magnifier;
029 private JMenuItem itemChangeOrientation;
030 protected boolean normalOrientation;
031 protected ReferenceDimension threadFilter;
032 protected int currentThread;
033 protected HashMap imageMap;
034 protected HashMap threadDataSet;
035 protected int xOffset;
036 protected SourceBrowser sourceBrowser;
037 private JMenuItem itemBrowseSource;
038
039 protected abstract void mouseMove(int x, int y);
040
041 public XYVisualization() {
042 super();
043 shift_pressed = false;
044 autoInterval = -1;
045 autoPredictorname = null;
046 interval = -1;
047 itemChangeOrientation = null;
048 normalOrientation = true;
049 threadFilter = new ReferenceDimension();
050 currentThread = -1;
051 imageMap = new HashMap();
052 threadDataSet = new HashMap();
053 sourceBrowser = new SourceBrowser();
054 }
055
056 protected JPanel createPanel() {
057 AxesPanel returnVal = new AxesPanel();
058
059 magnifier = new Magnifier();
060 returnVal.addMouseMotionListener(new MouseMotionAdapter() {
061 public void mouseMoved(MouseEvent e) {
062 if (e.isShiftDown()) shift_pressed = true;
063 else shift_pressed = false;
064
065 if (e.isControlDown()) {
066 magnifier.showWindow(image,null,((AxesPanel)panel).getImageX(e.getX()),
067 ((AxesPanel)panel).getImageY(e.getY()));
068 ((AxesPanel)panel).drawZoomingArea(e.getX(),e.getY());
069 }
070 mouseMove(e.getX(), e.getY());
071 }
072 });
073
074 returnVal.addMouseMotionListener(new MouseMotionAdapter() {
075 public void mouseDragged(MouseEvent e) {
076 if (e.isShiftDown()) shift_pressed = true;
077 else shift_pressed = false;
078 mouseMove(e.getX(), e.getY());
079 }
080 });
081
082 return returnVal;
083 }
084
085 protected void updateConfiguration() {
086 initialThreadFilter();
087 ((AxesPanel)panel).setImage(null);
088 panel.repaint();
089 normalOrientation = true;
090 }
091
092 protected void createMenu() {
093 super.createMenu();
094
095 itemBrowseSource = new JMenuItem("Browse source code...");
096 itemBrowseSource.setMnemonic(KeyEvent.VK_B);
097 itemBrowseSource.addActionListener(new ActionListener() {
098 public void actionPerformed(ActionEvent e) {
099 sourceBrowser.showSourceFile(getEntityUnderMouse());
100 }
101 });
102 popup.add(itemBrowseSource);
103 itemBrowseSource.setEnabled(false);
104 }
105
106 public VisualizationDefinition getDefinition() {
107 return definition;
108 }
109
110 public void autoUpdateConfiguration(HashMap config) {
111 autoInterval = ((Integer)config.get("Interval")).intValue();
112 PredictorFactory predictor = (PredictorFactory)config.get("Predictor");
113 autoPredictorname = (predictor == null) ? null : predictor.getName();
114 interval = autoInterval;
115 super.autoUpdateConfiguration(config);
116 }
117
118 public HashMap getCurrentConfigure() {
119 HashMap configure = super.getCurrentConfigure();
120
121 configure.put("Interval", new Integer(interval));
122
123 return configure;
124 }
125
126 public int getxMax() {
127 return xMax;
128 }
129
130 public AutoImage getImage() {
131 return image;
132 }
133
134 public void setImage(AutoImage image) {
135 this.image = image;
136 }
137
138 public void updateMenu() {
139 super.updateMenu();
140 if (itemChangeOrientation == null) {
141 itemChangeOrientation = new JMenuItem("Change Orientation");
142 itemChangeOrientation.setMnemonic(KeyEvent.VK_C);
143 itemChangeOrientation.addActionListener(new ActionListener() {
144 public void actionPerformed(ActionEvent e) {
145 changeOrientation();
146 }
147 });
148 popup.add(itemChangeOrientation);
149 }
150 }
151
152 public void disablePopupMenu() {
153 MenuElement[] menus = popup.getSubElements();
154 for (int i=0; i<menus.length; i++) {
155 if (((JMenuItem)menus[i]).getText().equals("Sort") || ((JMenuItem)menus[i]).getText().equals("Save..."))
156 continue;
157 ((JMenuItem)menus[i]).setEnabled(false);
158 }
159 Scene.getUIManager().disableVisualizationMenu();
160 }
161
162 protected void changeOrientation() {
163 AutoImage newImage = new AutoImage();
164 int wMax = image.getW();
165 int hMax = image.getH();
166 Color color;
167
168 for (int i=0; i<wMax; i++) {
169 for (int j=0; j<hMax; j++) {
170 color = image.getColor(i,j);
171 if (color != null) {
172 newImage.setColor(j,i,color);
173 }
174 }
175 }
176 image = newImage;
177
178 normalOrientation = ! normalOrientation;
179 }
180
181 protected void initialThreadFilter() {
182 int subjectIndex = 0;
183 for (int i=0; i<elementDefinition.length; i++)
184 if (elementDefinition[i].getName().equals(subjectDefinition.getName())) {subjectIndex = i;}
185
186 for (int i=0; i<dataFilter[subjectIndex][1].length; i++) {
187 if (dataFilter[subjectIndex][1][i].getName().equals("Thread"))
188 threadFilter.setDataFilter(dataFilter[subjectIndex][1][i]);
189 }
190 }
191
192 protected void switchThread(int threadId) {
193 if (currentThread != threadId) {
194 currentThread = threadId;
195 image = (AutoImage)imageMap.get(new Integer(threadId));
196 if (image == null) {
197 image = new AutoImage();
198 imageMap.put(new Integer(threadId),image);
199 }
200 }
201 }
202
203 protected void installPainter() {
204 painter = new DefaultPainter();
205 }
206
207 protected void enableBrowseSourceMenu() {
208 itemBrowseSource.setEnabled(true);
209 }
210
211 public void cleanup() {
212 super.cleanup();
213 magnifier.cleanup();
214 }
215
216 protected abstract String getEntityUnderMouse();
217 }