23 * questions.
24 */
25
26 package sun.tools.jconsole;
27
28 import java.awt.*;
29 import java.awt.event.*;
30 import java.beans.*;
31 import java.io.*;
32 import java.lang.reflect.Array;
33 import java.text.*;
34 import java.util.*;
35
36 import javax.accessibility.*;
37 import javax.swing.*;
38 import javax.swing.border.*;
39 import javax.swing.event.*;
40 import javax.swing.filechooser.*;
41 import javax.swing.filechooser.FileFilter;
42
43 import com.sun.tools.jconsole.JConsoleContext;
44 import com.sun.tools.jconsole.JConsoleContext.ConnectionState;
45
46 import static com.sun.tools.jconsole.JConsoleContext.ConnectionState.*;
47
48 import static sun.tools.jconsole.Formatter.*;
49 import static sun.tools.jconsole.ProxyClient.*;
50 import static sun.tools.jconsole.Resources.*;
51 import static sun.tools.jconsole.Utilities.*;
52
53 @SuppressWarnings("serial")
54 public class Plotter extends JComponent
55 implements Accessible, ActionListener, PropertyChangeListener {
56
57 public static enum Unit {
58 NONE, BYTES, PERCENT
59 }
60
61 static final String[] rangeNames = {
62 Resources.getText(" 1 min"),
63 Resources.getText(" 5 min"),
64 Resources.getText("10 min"),
65 Resources.getText("30 min"),
66 Resources.getText(" 1 hour"),
67 Resources.getText(" 2 hours"),
68 Resources.getText(" 3 hours"),
69 Resources.getText(" 6 hours"),
70 Resources.getText("12 hours"),
71 Resources.getText(" 1 day"),
72 Resources.getText(" 7 days"),
73 Resources.getText(" 1 month"),
74 Resources.getText(" 3 months"),
75 Resources.getText(" 6 months"),
76 Resources.getText(" 1 year"),
77 Resources.getText("All")
78 };
79
80 static final int[] rangeValues = {
81 1,
82 5,
83 10,
84 30,
85 1 * 60,
86 2 * 60,
87 3 * 60,
88 6 * 60,
89 12 * 60,
90 1 * 24 * 60,
91 7 * 24 * 60,
92 1 * 31 * 24 * 60,
93 3 * 31 * 24 * 60,
94 6 * 31 * 24 * 60,
95 366 * 24 * 60,
96 -1
97 };
225 public void setViewRange(int minutes) {
226 if (minutes != viewRange) {
227 int oldValue = viewRange;
228 viewRange = minutes;
229 /* Do not i18n this string */
230 firePropertyChange("viewRange", oldValue, viewRange);
231 if (popupMenu != null) {
232 for (int i = 0; i < menuRBs.length; i++) {
233 if (rangeValues[i] == viewRange) {
234 menuRBs[i].setSelected(true);
235 break;
236 }
237 }
238 }
239 repaint();
240 }
241 }
242
243 public JPopupMenu getComponentPopupMenu() {
244 if (popupMenu == null) {
245 popupMenu = new JPopupMenu(Resources.getText("Chart:"));
246 timeRangeMenu = new JMenu(Resources.getText("Plotter.timeRangeMenu"));
247 timeRangeMenu.setMnemonic(getMnemonicInt("Plotter.timeRangeMenu"));
248 popupMenu.add(timeRangeMenu);
249 menuRBs = new JRadioButtonMenuItem[rangeNames.length];
250 ButtonGroup rbGroup = new ButtonGroup();
251 for (int i = 0; i < rangeNames.length; i++) {
252 menuRBs[i] = new JRadioButtonMenuItem(rangeNames[i]);
253 rbGroup.add(menuRBs[i]);
254 menuRBs[i].addActionListener(this);
255 if (viewRange == rangeValues[i]) {
256 menuRBs[i].setSelected(true);
257 }
258 timeRangeMenu.add(menuRBs[i]);
259 }
260
261 popupMenu.addSeparator();
262
263 saveAsMI = new JMenuItem(getText("Plotter.saveAsMenuItem"));
264 saveAsMI.setMnemonic(getMnemonicInt("Plotter.saveAsMenuItem"));
265 saveAsMI.addActionListener(this);
266 popupMenu.add(saveAsMI);
267 }
268 return popupMenu;
269 }
270
271 public void actionPerformed(ActionEvent ev) {
272 JComponent src = (JComponent)ev.getSource();
273 if (src == saveAsMI) {
274 saveAs();
275 } else {
276 int index = timeRangeMenu.getPopupMenu().getComponentIndex(src);
277 setViewRange(rangeValues[index]);
278 }
279 }
280
281 private void saveAs() {
282 if (saveFC == null) {
283 saveFC = new SaveDataFileChooser();
284 }
296 out.print("Time");
297 for (Sequence seq : seqs) {
298 out.print(","+seq.name);
299 }
300 out.println();
301
302 // Print data lines
303 if (seqs.size() > 0 && seqs.get(0).size > 0) {
304 for (int i = 0; i < seqs.get(0).size; i++) {
305 double excelTime = toExcelTime(times.time(i));
306 out.print(String.format(Locale.ENGLISH, "%.6f", excelTime));
307 for (Sequence seq : seqs) {
308 out.print("," + getFormattedValue(seq.value(i), false));
309 }
310 out.println();
311 }
312 }
313
314 out.close();
315 JOptionPane.showMessageDialog(this,
316 getText("FileChooser.savedFile",
317 file.getAbsolutePath(),
318 file.length()));
319 } catch (IOException ex) {
320 String msg = ex.getLocalizedMessage();
321 String path = file.getAbsolutePath();
322 if (msg.startsWith(path)) {
323 msg = msg.substring(path.length()).trim();
324 }
325 JOptionPane.showMessageDialog(this,
326 getText("FileChooser.saveFailed.message",
327 path, msg),
328 getText("FileChooser.saveFailed.title"),
329 JOptionPane.ERROR_MESSAGE);
330 }
331 }
332
333 public void paintComponent(Graphics g) {
334 super.paintComponent(g);
335
336 Color oldColor = g.getColor();
337 Font oldFont = g.getFont();
338 Color fg = getForeground();
339 Color bg = getBackground();
340 boolean bgIsLight = (bg.getRed() > 200 &&
341 bg.getGreen() > 200 &&
342 bg.getBlue() > 200);
343
344
345 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
346 RenderingHints.VALUE_ANTIALIAS_ON);
347
348 if (smallFont == null) {
995 if (file != null) {
996 FileFilter filter = getFileFilter();
997 if (filter != null && filter instanceof FileNameExtensionFilter) {
998 String[] extensions =
999 ((FileNameExtensionFilter)filter).getExtensions();
1000
1001 boolean goodExt = false;
1002 for (String ext : extensions) {
1003 if (file.getName().toLowerCase().endsWith("." + ext.toLowerCase())) {
1004 goodExt = true;
1005 break;
1006 }
1007 }
1008 if (!goodExt) {
1009 file = new File(file.getParent(),
1010 file.getName() + "." + extensions[0]);
1011 }
1012 }
1013
1014 if (file.exists()) {
1015 String okStr = getText("FileChooser.fileExists.okOption");
1016 String cancelStr = getText("FileChooser.fileExists.cancelOption");
1017 int ret =
1018 JOptionPane.showOptionDialog(this,
1019 getText("FileChooser.fileExists.message",
1020 file.getName()),
1021 getText("FileChooser.fileExists.title"),
1022 JOptionPane.OK_CANCEL_OPTION,
1023 JOptionPane.WARNING_MESSAGE,
1024 null,
1025 new Object[] { okStr, cancelStr },
1026 okStr);
1027 if (ret != JOptionPane.OK_OPTION) {
1028 return;
1029 }
1030 }
1031 setSelectedFile(file);
1032 }
1033 super.approveSelection();
1034 }
1035 }
1036
1037 public AccessibleContext getAccessibleContext() {
1038 if (accessibleContext == null) {
1039 accessibleContext = new AccessiblePlotter();
1040 }
1041 return accessibleContext;
1042 }
1043
1044 protected class AccessiblePlotter extends AccessibleJComponent {
1045 protected AccessiblePlotter() {
1046 setAccessibleName(getText("Plotter.accessibleName"));
1047 }
1048
1049 public String getAccessibleName() {
1050 String name = super.getAccessibleName();
1051
1052 if (seqs.size() > 0 && seqs.get(0).size > 0) {
1053 String keyValueList = "";
1054 for (Sequence seq : seqs) {
1055 if (seq.isPlotted) {
1056 String value = "null";
1057 if (seq.size > 0) {
1058 if (unit == Unit.BYTES) {
1059 value = getText("Size Bytes", seq.value(seq.size - 1));
1060 } else {
1061 value =
1062 getFormattedValue(seq.value(seq.size - 1), false) +
1063 ((unit == Unit.PERCENT) ? "%" : "");
1064 }
1065 }
1066 // Assume format string ends with newline
1067 keyValueList +=
1068 getText("Plotter.accessibleName.keyAndValue",
1069 seq.key, value);
1070 }
1071 }
1072 name += "\n" + keyValueList + ".";
1073 } else {
1074 name += "\n" + getText("Plotter.accessibleName.noData");
1075 }
1076 return name;
1077 }
1078
1079 public AccessibleRole getAccessibleRole() {
1080 return AccessibleRole.CANVAS;
1081 }
1082 }
1083 }
|
23 * questions.
24 */
25
26 package sun.tools.jconsole;
27
28 import java.awt.*;
29 import java.awt.event.*;
30 import java.beans.*;
31 import java.io.*;
32 import java.lang.reflect.Array;
33 import java.text.*;
34 import java.util.*;
35
36 import javax.accessibility.*;
37 import javax.swing.*;
38 import javax.swing.border.*;
39 import javax.swing.event.*;
40 import javax.swing.filechooser.*;
41 import javax.swing.filechooser.FileFilter;
42
43
44 import com.sun.tools.jconsole.JConsoleContext;
45 import com.sun.tools.jconsole.JConsoleContext.ConnectionState;
46
47 import static sun.tools.jconsole.Formatter.*;
48 import static sun.tools.jconsole.ProxyClient.*;
49
50 @SuppressWarnings("serial")
51 public class Plotter extends JComponent
52 implements Accessible, ActionListener, PropertyChangeListener {
53
54 public static enum Unit {
55 NONE, BYTES, PERCENT
56 }
57
58 static final String[] rangeNames = {
59 Messages.ONE_MIN,
60 Messages.FIVE_MIN,
61 Messages.TEN_MIN,
62 Messages.THIRTY_MIN,
63 Messages.ONE_HOUR,
64 Messages.TWO_HOURS,
65 Messages.THREE_HOURS,
66 Messages.SIX_HOURS,
67 Messages.TWELVE_HOURS,
68 Messages.ONE_DAY,
69 Messages.SEVEN_DAYS,
70 Messages.ONE_MONTH,
71 Messages.THREE_MONTHS,
72 Messages.SIX_MONTHS,
73 Messages.ONE_YEAR,
74 Messages.ALL
75 };
76
77 static final int[] rangeValues = {
78 1,
79 5,
80 10,
81 30,
82 1 * 60,
83 2 * 60,
84 3 * 60,
85 6 * 60,
86 12 * 60,
87 1 * 24 * 60,
88 7 * 24 * 60,
89 1 * 31 * 24 * 60,
90 3 * 31 * 24 * 60,
91 6 * 31 * 24 * 60,
92 366 * 24 * 60,
93 -1
94 };
222 public void setViewRange(int minutes) {
223 if (minutes != viewRange) {
224 int oldValue = viewRange;
225 viewRange = minutes;
226 /* Do not i18n this string */
227 firePropertyChange("viewRange", oldValue, viewRange);
228 if (popupMenu != null) {
229 for (int i = 0; i < menuRBs.length; i++) {
230 if (rangeValues[i] == viewRange) {
231 menuRBs[i].setSelected(true);
232 break;
233 }
234 }
235 }
236 repaint();
237 }
238 }
239
240 public JPopupMenu getComponentPopupMenu() {
241 if (popupMenu == null) {
242 popupMenu = new JPopupMenu(Messages.CHART_COLON);
243 timeRangeMenu = new JMenu(Messages.PLOTTER_TIME_RANGE_MENU);
244 timeRangeMenu.setMnemonic(Resources.getMnemonicInt(Messages.PLOTTER_TIME_RANGE_MENU));
245 popupMenu.add(timeRangeMenu);
246 menuRBs = new JRadioButtonMenuItem[rangeNames.length];
247 ButtonGroup rbGroup = new ButtonGroup();
248 for (int i = 0; i < rangeNames.length; i++) {
249 menuRBs[i] = new JRadioButtonMenuItem(rangeNames[i]);
250 rbGroup.add(menuRBs[i]);
251 menuRBs[i].addActionListener(this);
252 if (viewRange == rangeValues[i]) {
253 menuRBs[i].setSelected(true);
254 }
255 timeRangeMenu.add(menuRBs[i]);
256 }
257
258 popupMenu.addSeparator();
259
260 saveAsMI = new JMenuItem(Messages.PLOTTER_SAVE_AS_MENU_ITEM);
261 saveAsMI.setMnemonic(Resources.getMnemonicInt(Messages.PLOTTER_SAVE_AS_MENU_ITEM));
262 saveAsMI.addActionListener(this);
263 popupMenu.add(saveAsMI);
264 }
265 return popupMenu;
266 }
267
268 public void actionPerformed(ActionEvent ev) {
269 JComponent src = (JComponent)ev.getSource();
270 if (src == saveAsMI) {
271 saveAs();
272 } else {
273 int index = timeRangeMenu.getPopupMenu().getComponentIndex(src);
274 setViewRange(rangeValues[index]);
275 }
276 }
277
278 private void saveAs() {
279 if (saveFC == null) {
280 saveFC = new SaveDataFileChooser();
281 }
293 out.print("Time");
294 for (Sequence seq : seqs) {
295 out.print(","+seq.name);
296 }
297 out.println();
298
299 // Print data lines
300 if (seqs.size() > 0 && seqs.get(0).size > 0) {
301 for (int i = 0; i < seqs.get(0).size; i++) {
302 double excelTime = toExcelTime(times.time(i));
303 out.print(String.format(Locale.ENGLISH, "%.6f", excelTime));
304 for (Sequence seq : seqs) {
305 out.print("," + getFormattedValue(seq.value(i), false));
306 }
307 out.println();
308 }
309 }
310
311 out.close();
312 JOptionPane.showMessageDialog(this,
313 Resources.format(Messages.FILE_CHOOSER_SAVED_FILE,
314 file.getAbsolutePath(),
315 file.length()));
316 } catch (IOException ex) {
317 String msg = ex.getLocalizedMessage();
318 String path = file.getAbsolutePath();
319 if (msg.startsWith(path)) {
320 msg = msg.substring(path.length()).trim();
321 }
322 JOptionPane.showMessageDialog(this,
323 Resources.format(Messages.FILE_CHOOSER_SAVE_FAILED_MESSAGE,
324 path,
325 msg),
326 Messages.FILE_CHOOSER_SAVE_FAILED_TITLE,
327 JOptionPane.ERROR_MESSAGE);
328 }
329 }
330
331 public void paintComponent(Graphics g) {
332 super.paintComponent(g);
333
334 Color oldColor = g.getColor();
335 Font oldFont = g.getFont();
336 Color fg = getForeground();
337 Color bg = getBackground();
338 boolean bgIsLight = (bg.getRed() > 200 &&
339 bg.getGreen() > 200 &&
340 bg.getBlue() > 200);
341
342
343 ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_ANTIALIASING,
344 RenderingHints.VALUE_ANTIALIAS_ON);
345
346 if (smallFont == null) {
993 if (file != null) {
994 FileFilter filter = getFileFilter();
995 if (filter != null && filter instanceof FileNameExtensionFilter) {
996 String[] extensions =
997 ((FileNameExtensionFilter)filter).getExtensions();
998
999 boolean goodExt = false;
1000 for (String ext : extensions) {
1001 if (file.getName().toLowerCase().endsWith("." + ext.toLowerCase())) {
1002 goodExt = true;
1003 break;
1004 }
1005 }
1006 if (!goodExt) {
1007 file = new File(file.getParent(),
1008 file.getName() + "." + extensions[0]);
1009 }
1010 }
1011
1012 if (file.exists()) {
1013 String okStr = Messages.FILE_CHOOSER_FILE_EXISTS_OK_OPTION;
1014 String cancelStr = Messages.FILE_CHOOSER_FILE_EXISTS_CANCEL_OPTION;
1015 int ret =
1016 JOptionPane.showOptionDialog(this,
1017 Resources.format(Messages.FILE_CHOOSER_FILE_EXISTS_MESSAGE,
1018 file.getName()),
1019 Messages.FILE_CHOOSER_FILE_EXISTS_TITLE,
1020 JOptionPane.OK_CANCEL_OPTION,
1021 JOptionPane.WARNING_MESSAGE,
1022 null,
1023 new Object[] { okStr, cancelStr },
1024 okStr);
1025 if (ret != JOptionPane.OK_OPTION) {
1026 return;
1027 }
1028 }
1029 setSelectedFile(file);
1030 }
1031 super.approveSelection();
1032 }
1033 }
1034
1035 public AccessibleContext getAccessibleContext() {
1036 if (accessibleContext == null) {
1037 accessibleContext = new AccessiblePlotter();
1038 }
1039 return accessibleContext;
1040 }
1041
1042 protected class AccessiblePlotter extends AccessibleJComponent {
1043 protected AccessiblePlotter() {
1044 setAccessibleName(Messages.PLOTTER_ACCESSIBLE_NAME);
1045 }
1046
1047 public String getAccessibleName() {
1048 String name = super.getAccessibleName();
1049
1050 if (seqs.size() > 0 && seqs.get(0).size > 0) {
1051 String keyValueList = "";
1052 for (Sequence seq : seqs) {
1053 if (seq.isPlotted) {
1054 String value = "null";
1055 if (seq.size > 0) {
1056 if (unit == Unit.BYTES) {
1057 value = Resources.format(Messages.SIZE_BYTES, seq.value(seq.size - 1));
1058 } else {
1059 value =
1060 getFormattedValue(seq.value(seq.size - 1), false) +
1061 ((unit == Unit.PERCENT) ? "%" : "");
1062 }
1063 }
1064 // Assume format string ends with newline
1065 keyValueList +=
1066 Resources.format(Messages.PLOTTER_ACCESSIBLE_NAME_KEY_AND_VALUE,
1067 seq.key, value);
1068 }
1069 }
1070 name += "\n" + keyValueList + ".";
1071 } else {
1072 name += "\n" + Messages.PLOTTER_ACCESSIBLE_NAME_NO_DATA;
1073 }
1074 return name;
1075 }
1076
1077 public AccessibleRole getAccessibleRole() {
1078 return AccessibleRole.CANVAS;
1079 }
1080 }
1081 }
|