36 import javax.swing.*; |
36 import javax.swing.*; |
37 import javax.swing.border.*; |
37 import javax.swing.border.*; |
38 import javax.swing.filechooser.*; |
38 import javax.swing.filechooser.*; |
39 import javax.swing.filechooser.FileFilter; |
39 import javax.swing.filechooser.FileFilter; |
40 |
40 |
|
41 |
41 import com.sun.tools.jconsole.JConsoleContext; |
42 import com.sun.tools.jconsole.JConsoleContext; |
42 |
|
43 import static com.sun.tools.jconsole.JConsoleContext.ConnectionState.*; |
|
44 |
43 |
45 import static sun.tools.jconsole.Formatter.*; |
44 import static sun.tools.jconsole.Formatter.*; |
46 import static sun.tools.jconsole.ProxyClient.*; |
45 import static sun.tools.jconsole.ProxyClient.*; |
47 import static sun.tools.jconsole.Resources.*; |
|
48 import static sun.tools.jconsole.Utilities.*; |
|
49 |
46 |
50 @SuppressWarnings("serial") |
47 @SuppressWarnings("serial") |
51 public class Plotter extends JComponent |
48 public class Plotter extends JComponent |
52 implements Accessible, ActionListener, PropertyChangeListener { |
49 implements Accessible, ActionListener, PropertyChangeListener { |
53 |
50 |
54 public static enum Unit { |
51 public static enum Unit { |
55 NONE, BYTES, PERCENT |
52 NONE, BYTES, PERCENT |
56 } |
53 } |
57 |
54 |
58 static final String[] rangeNames = { |
55 static final String[] rangeNames = { |
59 Resources.getText(" 1 min"), |
56 Messages.ONE_MIN, |
60 Resources.getText(" 5 min"), |
57 Messages.FIVE_MIN, |
61 Resources.getText("10 min"), |
58 Messages.TEN_MIN, |
62 Resources.getText("30 min"), |
59 Messages.THIRTY_MIN, |
63 Resources.getText(" 1 hour"), |
60 Messages.ONE_HOUR, |
64 Resources.getText(" 2 hours"), |
61 Messages.TWO_HOURS, |
65 Resources.getText(" 3 hours"), |
62 Messages.THREE_HOURS, |
66 Resources.getText(" 6 hours"), |
63 Messages.SIX_HOURS, |
67 Resources.getText("12 hours"), |
64 Messages.TWELVE_HOURS, |
68 Resources.getText(" 1 day"), |
65 Messages.ONE_DAY, |
69 Resources.getText(" 7 days"), |
66 Messages.SEVEN_DAYS, |
70 Resources.getText(" 1 month"), |
67 Messages.ONE_MONTH, |
71 Resources.getText(" 3 months"), |
68 Messages.THREE_MONTHS, |
72 Resources.getText(" 6 months"), |
69 Messages.SIX_MONTHS, |
73 Resources.getText(" 1 year"), |
70 Messages.ONE_YEAR, |
74 Resources.getText("All") |
71 Messages.ALL |
75 }; |
72 }; |
76 |
73 |
77 static final int[] rangeValues = { |
74 static final int[] rangeValues = { |
78 1, |
75 1, |
79 5, |
76 5, |
245 } |
242 } |
246 |
243 |
247 @Override |
244 @Override |
248 public JPopupMenu getComponentPopupMenu() { |
245 public JPopupMenu getComponentPopupMenu() { |
249 if (popupMenu == null) { |
246 if (popupMenu == null) { |
250 popupMenu = new JPopupMenu(Resources.getText("Chart:")); |
247 popupMenu = new JPopupMenu(Messages.CHART_COLON); |
251 timeRangeMenu = new JMenu(Resources.getText("Plotter.timeRangeMenu")); |
248 timeRangeMenu = new JMenu(Messages.PLOTTER_TIME_RANGE_MENU); |
252 timeRangeMenu.setMnemonic(getMnemonicInt("Plotter.timeRangeMenu")); |
249 timeRangeMenu.setMnemonic(Resources.getMnemonicInt(Messages.PLOTTER_TIME_RANGE_MENU)); |
253 popupMenu.add(timeRangeMenu); |
250 popupMenu.add(timeRangeMenu); |
254 menuRBs = new JRadioButtonMenuItem[rangeNames.length]; |
251 menuRBs = new JRadioButtonMenuItem[rangeNames.length]; |
255 ButtonGroup rbGroup = new ButtonGroup(); |
252 ButtonGroup rbGroup = new ButtonGroup(); |
256 for (int i = 0; i < rangeNames.length; i++) { |
253 for (int i = 0; i < rangeNames.length; i++) { |
257 menuRBs[i] = new JRadioButtonMenuItem(rangeNames[i]); |
254 menuRBs[i] = new JRadioButtonMenuItem(rangeNames[i]); |
263 timeRangeMenu.add(menuRBs[i]); |
260 timeRangeMenu.add(menuRBs[i]); |
264 } |
261 } |
265 |
262 |
266 popupMenu.addSeparator(); |
263 popupMenu.addSeparator(); |
267 |
264 |
268 saveAsMI = new JMenuItem(getText("Plotter.saveAsMenuItem")); |
265 saveAsMI = new JMenuItem(Messages.PLOTTER_SAVE_AS_MENU_ITEM); |
269 saveAsMI.setMnemonic(getMnemonicInt("Plotter.saveAsMenuItem")); |
266 saveAsMI.setMnemonic(Resources.getMnemonicInt(Messages.PLOTTER_SAVE_AS_MENU_ITEM)); |
270 saveAsMI.addActionListener(this); |
267 saveAsMI.addActionListener(this); |
271 popupMenu.add(saveAsMI); |
268 popupMenu.add(saveAsMI); |
272 } |
269 } |
273 return popupMenu; |
270 return popupMenu; |
274 } |
271 } |
316 } |
313 } |
317 } |
314 } |
318 |
315 |
319 out.close(); |
316 out.close(); |
320 JOptionPane.showMessageDialog(this, |
317 JOptionPane.showMessageDialog(this, |
321 getText("FileChooser.savedFile", |
318 Resources.format(Messages.FILE_CHOOSER_SAVED_FILE, |
322 file.getAbsolutePath(), |
319 file.getAbsolutePath(), |
323 file.length())); |
320 file.length())); |
324 } catch (IOException ex) { |
321 } catch (IOException ex) { |
325 String msg = ex.getLocalizedMessage(); |
322 String msg = ex.getLocalizedMessage(); |
326 String path = file.getAbsolutePath(); |
323 String path = file.getAbsolutePath(); |
327 if (msg.startsWith(path)) { |
324 if (msg.startsWith(path)) { |
328 msg = msg.substring(path.length()).trim(); |
325 msg = msg.substring(path.length()).trim(); |
329 } |
326 } |
330 JOptionPane.showMessageDialog(this, |
327 JOptionPane.showMessageDialog(this, |
331 getText("FileChooser.saveFailed.message", |
328 Resources.format(Messages.FILE_CHOOSER_SAVE_FAILED_MESSAGE, |
332 path, msg), |
329 path, |
333 getText("FileChooser.saveFailed.title"), |
330 msg), |
|
331 Messages.FILE_CHOOSER_SAVE_FAILED_TITLE, |
334 JOptionPane.ERROR_MESSAGE); |
332 JOptionPane.ERROR_MESSAGE); |
335 } |
333 } |
336 } |
334 } |
337 |
335 |
338 @Override |
336 @Override |
1018 file.getName() + "." + extensions[0]); |
1016 file.getName() + "." + extensions[0]); |
1019 } |
1017 } |
1020 } |
1018 } |
1021 |
1019 |
1022 if (file.exists()) { |
1020 if (file.exists()) { |
1023 String okStr = getText("FileChooser.fileExists.okOption"); |
1021 String okStr = Messages.FILE_CHOOSER_FILE_EXISTS_OK_OPTION; |
1024 String cancelStr = getText("FileChooser.fileExists.cancelOption"); |
1022 String cancelStr = Messages.FILE_CHOOSER_FILE_EXISTS_CANCEL_OPTION; |
1025 int ret = |
1023 int ret = |
1026 JOptionPane.showOptionDialog(this, |
1024 JOptionPane.showOptionDialog(this, |
1027 getText("FileChooser.fileExists.message", |
1025 Resources.format(Messages.FILE_CHOOSER_FILE_EXISTS_MESSAGE, |
1028 file.getName()), |
1026 file.getName()), |
1029 getText("FileChooser.fileExists.title"), |
1027 Messages.FILE_CHOOSER_FILE_EXISTS_TITLE, |
1030 JOptionPane.OK_CANCEL_OPTION, |
1028 JOptionPane.OK_CANCEL_OPTION, |
1031 JOptionPane.WARNING_MESSAGE, |
1029 JOptionPane.WARNING_MESSAGE, |
1032 null, |
1030 null, |
1033 new Object[] { okStr, cancelStr }, |
1031 new Object[] { okStr, cancelStr }, |
1034 okStr); |
1032 okStr); |
1051 } |
1049 } |
1052 |
1050 |
1053 protected class AccessiblePlotter extends AccessibleJComponent { |
1051 protected class AccessiblePlotter extends AccessibleJComponent { |
1054 private static final long serialVersionUID = -3847205410473510922L; |
1052 private static final long serialVersionUID = -3847205410473510922L; |
1055 protected AccessiblePlotter() { |
1053 protected AccessiblePlotter() { |
1056 setAccessibleName(getText("Plotter.accessibleName")); |
1054 setAccessibleName(Messages.PLOTTER_ACCESSIBLE_NAME); |
1057 } |
1055 } |
1058 |
1056 |
1059 @Override |
1057 @Override |
1060 public String getAccessibleName() { |
1058 public String getAccessibleName() { |
1061 String name = super.getAccessibleName(); |
1059 String name = super.getAccessibleName(); |
1065 for (Sequence seq : seqs) { |
1063 for (Sequence seq : seqs) { |
1066 if (seq.isPlotted) { |
1064 if (seq.isPlotted) { |
1067 String value = "null"; |
1065 String value = "null"; |
1068 if (seq.size > 0) { |
1066 if (seq.size > 0) { |
1069 if (unit == Unit.BYTES) { |
1067 if (unit == Unit.BYTES) { |
1070 value = getText("Size Bytes", seq.value(seq.size - 1)); |
1068 value = Resources.format(Messages.SIZE_BYTES, seq.value(seq.size - 1)); |
1071 } else { |
1069 } else { |
1072 value = |
1070 value = |
1073 getFormattedValue(seq.value(seq.size - 1), false) + |
1071 getFormattedValue(seq.value(seq.size - 1), false) + |
1074 ((unit == Unit.PERCENT) ? "%" : ""); |
1072 ((unit == Unit.PERCENT) ? "%" : ""); |
1075 } |
1073 } |
1076 } |
1074 } |
1077 // Assume format string ends with newline |
1075 // Assume format string ends with newline |
1078 keyValueList += |
1076 keyValueList += |
1079 getText("Plotter.accessibleName.keyAndValue", |
1077 Resources.format(Messages.PLOTTER_ACCESSIBLE_NAME_KEY_AND_VALUE, |
1080 seq.key, value); |
1078 seq.key, value); |
1081 } |
1079 } |
1082 } |
1080 } |
1083 name += "\n" + keyValueList + "."; |
1081 name += "\n" + keyValueList + "."; |
1084 } else { |
1082 } else { |
1085 name += "\n" + getText("Plotter.accessibleName.noData"); |
1083 name += "\n" + Messages.PLOTTER_ACCESSIBLE_NAME_NO_DATA; |
1086 } |
1084 } |
1087 return name; |
1085 return name; |
1088 } |
1086 } |
1089 |
1087 |
1090 @Override |
1088 @Override |