001: package org.objectweb.salome_tmf.ihm.main;
002:
003: import java.awt.BorderLayout;
004: import java.awt.Color;
005: import java.awt.Dimension;
006: import java.awt.Frame;
007: import java.awt.event.ActionEvent;
008: import java.awt.event.ActionListener;
009: import java.text.DateFormat;
010: import java.text.SimpleDateFormat;
011: import java.util.ArrayList;
012: import java.util.Date;
013: import java.util.Enumeration;
014: import java.util.Hashtable;
015: import java.util.Locale;
016: import java.util.Map;
017: import java.util.Vector;
018:
019: import javax.swing.BorderFactory;
020: import javax.swing.JButton;
021: import javax.swing.JDialog;
022: import javax.swing.JLabel;
023: import javax.swing.JOptionPane;
024: import javax.swing.JPanel;
025: import javax.swing.JScrollPane;
026: import javax.swing.JTable;
027: import javax.swing.ListSelectionModel;
028: import javax.swing.event.ListSelectionEvent;
029: import javax.swing.event.ListSelectionListener;
030:
031: import org.jfree.chart.ChartFactory;
032: import org.jfree.chart.ChartPanel;
033: import org.jfree.chart.JFreeChart;
034: import org.jfree.chart.axis.DateAxis;
035: import org.jfree.chart.axis.ValueAxis;
036: import org.jfree.chart.plot.XYPlot;
037: import org.jfree.chart.renderer.xy.XYItemRenderer;
038: import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
039: import org.jfree.data.time.Second;
040: import org.jfree.data.time.TimeSeries;
041: import org.jfree.data.time.TimeSeriesCollection;
042: import org.jfree.data.time.TimeSeriesDataItem;
043: import org.objectweb.salome_tmf.api.Api;
044: import org.objectweb.salome_tmf.api.Util;
045: import org.objectweb.salome_tmf.api.sql.ISQLConfig;
046: import org.objectweb.salome_tmf.data.Environment;
047: import org.objectweb.salome_tmf.ihm.languages.Language;
048: import org.objectweb.salome_tmf.ihm.main.datawrapper.DataModel;
049: import org.objectweb.salome_tmf.ihm.models.MyTableModel;
050: import org.objectweb.salome_tmf.ihm.models.RowTransferHandler;
051: import org.objectweb.salome_tmf.ihm.models.TableSorter;
052: import org.objectweb.salome_tmf.ihm.tools.Tools;
053: import org.objectweb.salome_tmf.plugins.core.BugTracker;
054:
055: public class IcalPanel extends JPanel implements ActionListener,
056: ListSelectionListener {
057:
058: JButton deleteICALValueButton;
059: JButton calculateICALValueButton;
060: JButton visualizeICALValueButton;
061: JButton refreshICALValueButton;
062:
063: JTable icalTable;
064:
065: TableSorter sorter;
066:
067: ListSelectionModel rowSM;
068:
069: RowTransferHandler transferHandler;
070:
071: MyTableModel icalTableModel;
072:
073: BugTracker mantis;
074:
075: public IcalPanel(BugTracker mantis) {
076:
077: super ();
078: this .mantis = mantis;
079:
080: deleteICALValueButton = new JButton(Language.getInstance()
081: .getText("Supprimer"));
082: calculateICALValueButton = new JButton(Language.getInstance()
083: .getText("ICAL_calculation"));
084: visualizeICALValueButton = new JButton(Language.getInstance()
085: .getText("ICAL_graph"));
086: refreshICALValueButton = new JButton(Language.getInstance()
087: .getText("Rafraichir"));
088:
089: icalTable = new JTable();
090: transferHandler = new RowTransferHandler();
091:
092: deleteICALValueButton.setEnabled(false);
093: deleteICALValueButton.setToolTipText(Language.getInstance()
094: .getText("Delete_ICAL_Value"));
095: deleteICALValueButton.addActionListener(this );
096: calculateICALValueButton.setToolTipText(Language.getInstance()
097: .getText("ICAL_calculation"));
098: calculateICALValueButton.addActionListener(this );
099: visualizeICALValueButton.setToolTipText(Language.getInstance()
100: .getText("ICAL_graph"));
101: visualizeICALValueButton.addActionListener(this );
102: refreshICALValueButton.setToolTipText(Language.getInstance()
103: .getText("Rafraichir"));
104: refreshICALValueButton.addActionListener(this );
105:
106: createICALTableModel();
107: sorter = new TableSorter(icalTableModel);
108: icalTable = new JTable(sorter);
109: sorter.setTableHeader(icalTable.getTableHeader());
110: icalTable.setPreferredScrollableViewportSize(new Dimension(700,
111: 350));
112: icalTable.setTransferHandler(transferHandler);
113: icalTable
114: .setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
115:
116: JScrollPane pluginsTableScrollPane = new JScrollPane(icalTable);
117: // Gestion des sélection dans la table
118: rowSM = icalTable.getSelectionModel();
119: rowSM.addListSelectionListener(this );
120:
121: JPanel buttonsPanel = new JPanel();
122:
123: buttonsPanel.add(calculateICALValueButton);
124: buttonsPanel.add(visualizeICALValueButton);
125: buttonsPanel.add(refreshICALValueButton);
126: buttonsPanel.add(deleteICALValueButton);
127:
128: buttonsPanel.setBorder(BorderFactory.createRaisedBevelBorder());
129:
130: setLayout(new BorderLayout());
131: add(BorderLayout.NORTH, buttonsPanel);
132: add(BorderLayout.CENTER, pluginsTableScrollPane);
133: }
134:
135: public void actionPerformed(ActionEvent arg0) {
136: Object source = arg0.getSource();
137: if (source.equals(deleteICALValueButton)) {
138: deleteICALValuePerformed();
139: } else if (source.equals(calculateICALValueButton)) {
140: calculateICALValuePerformed();
141: } else if (source.equals(visualizeICALValueButton)) {
142: visualizeICALValuePerformed();
143: } else if (source.equals(refreshICALValueButton)) {
144: refreshICALValuePerformed();
145: }
146:
147: }
148:
149: public void valueChanged(ListSelectionEvent arg0) {
150: if (arg0.getSource().equals(icalTable.getSelectionModel())) {
151: if (arg0.getValueIsAdjusting())
152: return;
153: int nbOfSelectedRows = icalTable.getSelectedRowCount();
154: int selectedRow = icalTable.getSelectedRow();
155: if ((selectedRow != -1) && (nbOfSelectedRows != 0)) {
156: deleteICALValueButton.setEnabled(true);
157: } else {
158: deleteICALValueButton.setEnabled(false);
159: }
160: }
161: }
162:
163: void createICALTableModel() {
164: icalTableModel = new MyTableModel();
165:
166: icalTableModel.addColumnNameAndColumn(Language.getInstance()
167: .getText("Environnement"));
168: icalTableModel.addColumnNameAndColumn(Language.getInstance()
169: .getText("Date"));
170: icalTableModel.addColumnNameAndColumn(Language.getInstance()
171: .getText("valeur")
172: + " ICAL" + " (%)");
173:
174: try {
175: Vector icalKeys = new Vector();
176: ISQLConfig pISQLConfig = Api.getISQLObjectFactory()
177: .getISQLConfig();
178: if (pISQLConfig != null) {
179: Hashtable projectConfs = pISQLConfig
180: .getAllProjectConf(DataModel
181: .getCurrentProject().getIdBdd());
182: for (Enumeration e = projectConfs.keys(); e
183: .hasMoreElements();) {
184: String key = (String) e.nextElement();
185: if (key.startsWith(mantis.getBugTrackerName()
186: + "_ICAL")) {
187: icalKeys.add(key);
188: }
189: }
190:
191: if ((icalKeys != null) && (icalKeys.size() != 0)) {
192:
193: for (int i = 0; i < icalKeys.size(); i++) {
194: int idEnv = -1;
195: Object key = icalKeys.elementAt(i);
196: String[] tmp = ((String) key).split("[_]");
197: if (tmp.length == 3) {
198: idEnv = Integer.parseInt(tmp[2]);
199: }
200: Environment env = DataModel.getCurrentProject()
201: .getEnvironmentFromModel(idEnv);
202: String value = (String) projectConfs.get(key);
203: String[] res = value.split("[,]");
204: for (int j = 0; j < res.length; j++) {
205: String icalValues = res[j];
206: String[] icals = icalValues.split("[_]");
207: if (icals.length == 2) {
208:
209: Float ical = new Float(Float
210: .parseFloat(icals[1]));
211:
212: ArrayList row = new ArrayList(2);
213: row.add(0, env.getNameFromModel());
214: row.add(1, icals[0]);
215: row.add(2, ical);
216:
217: icalTableModel.addRow(row);
218: }
219: }
220: }
221: }
222: }
223: } catch (Exception e) {
224: e.printStackTrace();
225: Tools.ihmExceptionView(e);
226: }
227: }
228:
229: void refreshICALValuePerformed() {
230: icalTableModel.clearTable();
231:
232: try {
233: Vector icalKeys = new Vector();
234: ISQLConfig pISQLConfig = Api.getISQLObjectFactory()
235: .getISQLConfig();
236: if (pISQLConfig != null) {
237: Hashtable projectConfs = pISQLConfig
238: .getAllProjectConf(DataModel
239: .getCurrentProject().getIdBdd());
240: for (Enumeration e = projectConfs.keys(); e
241: .hasMoreElements();) {
242: String key = (String) e.nextElement();
243: if (key.startsWith(mantis.getBugTrackerName()
244: + "_ICAL")) {
245: icalKeys.add(key);
246: }
247: }
248:
249: if ((icalKeys != null) && (icalKeys.size() != 0)) {
250:
251: for (int i = 0; i < icalKeys.size(); i++) {
252: int idEnv = -1;
253: Object key = icalKeys.elementAt(i);
254: String[] tmp = ((String) key).split("[_]");
255: if (tmp.length == 3) {
256: idEnv = Integer.parseInt(tmp[2]);
257: }
258: Environment env = DataModel.getCurrentProject()
259: .getEnvironmentFromModel(idEnv);
260: String value = (String) projectConfs.get(key);
261: String[] res = value.split("[,]");
262: for (int j = 0; j < res.length; j++) {
263: String icalValues = res[j];
264: String[] icals = icalValues.split("[_]");
265: if (icals.length == 2) {
266:
267: Float ical = new Float(Float
268: .parseFloat(icals[1]));
269:
270: ArrayList row = new ArrayList(2);
271: row.add(0, env.getNameFromModel());
272: row.add(1, icals[0]);
273: row.add(2, ical);
274:
275: icalTableModel.addRow(row);
276: }
277: }
278: }
279: }
280: }
281: } catch (Exception e) {
282: e.printStackTrace();
283: Tools.ihmExceptionView(e);
284: }
285: }
286:
287: public void deleteICALValuePerformed() {
288: Object[] options = { Language.getInstance().getText("Oui"),
289: Language.getInstance().getText("Non") };
290: int choice = -1;
291: int[] selectedRows = icalTable.getSelectedRows();
292:
293: choice = JOptionPane
294: .showOptionDialog(
295: IcalPanel.this ,
296: Language
297: .getInstance()
298: .getText(
299: "Etes_vous_sûr_de_vouloir_supprimer_les_valeurs_ICAL_sélectionnées"),
300: Language.getInstance().getText("Attention_!"),
301: JOptionPane.YES_NO_OPTION,
302: JOptionPane.QUESTION_MESSAGE, null, options,
303: options[1]);
304: if (choice == JOptionPane.YES_OPTION) {
305: for (int i = selectedRows.length - 1; i >= 0; i--) {
306:
307: try {
308: // DB
309: ISQLConfig pISQLConfig = Api.getISQLObjectFactory()
310: .getISQLConfig();
311: if (pISQLConfig != null) {
312: Environment env = DataModel.getCurrentProject()
313: .getEnvironmentFromModel(
314: (String) sorter.getValueAt(
315: selectedRows[i], 0));
316: String key = mantis.getBugTrackerName()
317: + "_"
318: + Language.getInstance()
319: .getText("ICAL") + "_"
320: + env.getIdBdd();
321: String icalValuesForEnv = pISQLConfig
322: .getProjectConf(key, DataModel
323: .getCurrentProject().getIdBdd());
324: icalValuesForEnv = icalValuesForEnv
325: .replaceFirst((String) sorter
326: .getValueAt(selectedRows[i], 1)
327: + "_"
328: + (Float) sorter.getValueAt(
329: selectedRows[i], 2), "");
330: icalValuesForEnv = icalValuesForEnv
331: .replaceFirst(",,", ",");
332:
333: if ((icalValuesForEnv.equals(""))
334: || (icalValuesForEnv.equals(","))) {
335: pISQLConfig.deleteProjectConf(key,
336: DataModel.getCurrentProject()
337: .getIdBdd());
338: } else {
339: pISQLConfig.updateProjectConf(key,
340: icalValuesForEnv, DataModel
341: .getCurrentProject()
342: .getIdBdd());
343: }
344:
345: }
346: // IHM
347: /*if (DataModel.getActionTableModel().getRowCount() == 0) {
348: deleteICALValueButton.setEnabled(false);
349: }
350: icalTableModel.removeData(selectedRows[i]);*/
351: } catch (Exception exception) {
352: exception.printStackTrace();
353: Tools.ihmExceptionView(exception);
354: }
355: }
356:
357: // IHM
358: refreshICALValuePerformed();
359: }
360: }
361:
362: private void visualizeICALValuePerformed() {
363: JDialog dialog = new JDialog(
364: SalomeTMFContext.getInstance().ptrFrame, true);
365: dialog.setTitle(Language.getInstance().getText("ICAL_graph"));
366: JPanel pnl = new JPanel(new BorderLayout());
367: dialog.setContentPane(pnl);
368: dialog.setSize(600, 400);
369:
370: try {
371: Vector icalKeys = new Vector();
372: ISQLConfig pISQLConfig = Api.getISQLObjectFactory()
373: .getISQLConfig();
374: if (pISQLConfig != null) {
375: Hashtable projectConfs = pISQLConfig
376: .getAllProjectConf(DataModel
377: .getCurrentProject().getIdBdd());
378: for (Enumeration e = projectConfs.keys(); e
379: .hasMoreElements();) {
380: String key = (String) e.nextElement();
381: if (key.startsWith(mantis.getBugTrackerName()
382: + "_ICAL")) {
383: icalKeys.add(key);
384: }
385: }
386:
387: if ((icalKeys != null) && (icalKeys.size() != 0)) {
388:
389: TimeSeriesCollection dataset = new TimeSeriesCollection();
390:
391: for (int i = 0; i < icalKeys.size(); i++) {
392: int idEnv = -1;
393: Object key = icalKeys.elementAt(i);
394: String[] tmp = ((String) key).split("[_]");
395: if (tmp.length == 3) {
396: idEnv = Integer.parseInt(tmp[2]);
397: }
398: Environment env = DataModel.getCurrentProject()
399: .getEnvironmentFromModel(idEnv);
400: TimeSeries ts = new TimeSeries(env
401: .getNameFromModel(), Second.class);
402: String value = (String) projectConfs.get(key);
403: String[] res = value.split("[,]");
404: for (int j = 0; j < res.length; j++) {
405: String icalValues = res[j];
406: String[] icals = icalValues.split("[_]");
407: if (icals.length == 2) {
408: Locale locale = Locale.getDefault();
409: DateFormat dateFormat = DateFormat
410: .getDateTimeInstance(
411: DateFormat.LONG,
412: DateFormat.LONG, locale);
413: Date date = dateFormat.parse(icals[0]);
414:
415: float ical = Float.parseFloat(icals[1]);
416: ts
417: .add(new TimeSeriesDataItem(
418: new Second(date),
419: (double) ical));
420: }
421: }
422: dataset.addSeries(ts);
423: }
424:
425: JFreeChart chart = ChartFactory
426: .createTimeSeriesChart(Language
427: .getInstance().getText(
428: "ICALgraphTitle"), "Date",
429: "ICAL (%)", dataset, true, true,
430: false);
431: chart.setBackgroundPaint(Color.white);
432: XYPlot plot = (XYPlot) chart.getPlot();
433: plot.setBackgroundPaint(Color.lightGray);
434: plot.setDomainGridlinePaint(Color.white);
435: plot.setRangeGridlinePaint(Color.white);
436: XYItemRenderer r = plot.getRenderer();
437: if (r instanceof XYLineAndShapeRenderer) {
438: XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
439: renderer.setShapesVisible(true);
440: renderer.setShapesFilled(true);
441: }
442: DateAxis axis = (DateAxis) plot.getDomainAxis();
443: axis.setDateFormatOverride(new SimpleDateFormat(
444: "dd/MM/yy"));
445: ValueAxis vAxis = (ValueAxis) plot.getRangeAxis();
446: vAxis.setRange(0, 100);
447: ChartPanel cPanel = new ChartPanel(chart);
448: pnl.add(cPanel);
449:
450: } else {
451: JLabel label = new JLabel(Language.getInstance()
452: .getText("No_ICAL_values_in_DB"));
453: pnl.add(label);
454: }
455:
456: } else {
457: Util.log("[LookAndFeel] WARNING pISQLConfig = "
458: + pISQLConfig);
459: }
460: } catch (Exception e) {
461: e.printStackTrace();
462: Tools.ihmExceptionView(e);
463: }
464:
465: dialog.setVisible(true);
466: }
467:
468: private void calculateICALValuePerformed() {
469: ArrayList environments = DataModel.getCurrentProject()
470: .getEnvironmentListFromModel();
471: String message = "";
472: String mess_env = "";
473: Map envsICAL = new Hashtable();
474: int choice = -1;
475: Object[] options = { Language.getInstance().getText("Oui"),
476: Language.getInstance().getText("Non") };
477:
478: for (int l = 0; l < environments.size(); l++) {
479: Environment env = (Environment) environments.get(l);
480:
481: /*int n0 = bugTracker.getEnvironmentNbBugs(env,BugTracker.CRITICAL,false);
482: Util.log("Nb Critical Bugs = " + n0);
483:
484: int n1 = bugTracker.getEnvironmentNbBugs(env,BugTracker.MAJOR,false);
485: Util.log("Nb Major Bugs = " + n1);
486:
487: int nc0 = bugTracker.getEnvironmentNbBugs(env,BugTracker.CRITICAL,true);
488: Util.log("Nb Corrected Critical Bugs = " + nc0);
489:
490: int nc1 = bugTracker.getEnvironmentNbBugs(env,BugTracker.MAJOR,true);
491: Util.log("Nb Corrected Major Bugs = " + nc1);*/
492:
493: int nbMajorBugs = mantis.getEnvNbBugs(env, false);
494: Util.log("Nb Major Bugs = " + nbMajorBugs);
495:
496: int nbCorMajorBugs = mantis.getEnvNbBugs(env, true);
497: Util.log("Nb Corrected Major Bugs = " + nbCorMajorBugs);
498:
499: if (nbMajorBugs == 0) {
500: mess_env += "\n -" + env.getNameFromModel();
501:
502: } else {
503: float ical_temp = Math
504: .round(((float) nbCorMajorBugs / (float) nbMajorBugs) * 10000);
505: float ical = ical_temp / 100;
506: message += "\n -ICAL = " + ical + " (env. '"
507: + env.getNameFromModel() + "')";
508: envsICAL.put(env, new Float(ical));
509: }
510: }
511:
512: if (mess_env != "") {
513: JOptionPane.showMessageDialog(new Frame(), Language
514: .getInstance().getText("ICAL_problem")
515: + mess_env
516: + Language.getInstance().getText("ICAL_problem2"),
517: Language.getInstance().getText("Information_!"),
518: JOptionPane.INFORMATION_MESSAGE);
519: }
520:
521: if (message != "") {
522: choice = JOptionPane.showOptionDialog(new Frame(), message
523: + Language.getInstance()
524: .getText("ICAL_saved_in_DB"), Language
525: .getInstance().getText("Information_!"),
526: JOptionPane.YES_NO_OPTION,
527: JOptionPane.QUESTION_MESSAGE, null, options,
528: options[1]);
529:
530: if (choice == JOptionPane.YES_OPTION) {
531:
532: for (Enumeration e = ((Hashtable) envsICAL).keys(); e
533: .hasMoreElements();) {
534: try {
535: Environment env = (Environment) e.nextElement();
536: float ical = ((Float) envsICAL.get(env))
537: .floatValue();
538: ISQLConfig pISQLConfig = Api
539: .getISQLObjectFactory().getISQLConfig();
540: if (pISQLConfig != null) {
541: Hashtable projectConfs = pISQLConfig
542: .getAllProjectConf(DataModel
543: .getCurrentProject()
544: .getIdBdd());
545: Locale locale = Locale.getDefault();
546: DateFormat dateFormat = DateFormat
547: .getDateTimeInstance(
548: DateFormat.LONG,
549: DateFormat.LONG, locale);
550: Date date = new Date();
551: String myDate = dateFormat.format(date);
552: String key = mantis.getBugTrackerName()
553: + "_ICAL_" + env.getIdBdd();
554:
555: if (projectConfs.containsKey(key)) {
556: pISQLConfig.updateProjectConf(key,
557: (String) projectConfs.get(key)
558: + "," + myDate + "_"
559: + Float.toString(ical),
560: DataModel.getCurrentProject()
561: .getIdBdd());
562: } else {
563: pISQLConfig.insertProjectConf(mantis
564: .getBugTrackerName()
565: + "_ICAL_" + env.getIdBdd(),
566: myDate + "_"
567: + Float.toString(ical),
568: DataModel.getCurrentProject()
569: .getIdBdd());
570: }
571:
572: // IHM
573: ArrayList row = new ArrayList(2);
574: row.add(0, env.getNameFromModel());
575: row.add(1, myDate);
576: row.add(2, new Float(ical));
577:
578: icalTableModel.addRow(row);
579:
580: } else {
581: Util
582: .log("[LookAndFeel] WARNING pISQLConfig = "
583: + pISQLConfig);
584: }
585: } catch (Exception E) {
586: E.printStackTrace();
587: Tools.ihmExceptionView(E);
588: }
589: }
590:
591: JOptionPane.showMessageDialog(new Frame(), Language
592: .getInstance().getText(
593: "ICAL_saved_confirmation"), Language
594: .getInstance().getText("Information_!"),
595: JOptionPane.INFORMATION_MESSAGE);
596:
597: }
598: }
599: }
600:
601: }
|