package jdepend.client.ui.property; import java.awt.BorderLayout; import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import jdepend.client.core.config.CommandConfException; import jdepend.client.core.config.CommandConfMgr; import jdepend.client.core.config.GroupConfChangeListener; import jdepend.client.report.util.ReportConstant; import jdepend.client.ui.JDependCooper; import jdepend.client.ui.util.AnalysisResultExportUtil; import jdepend.framework.exception.JDependException; import jdepend.framework.ui.component.TableSorter; import jdepend.framework.ui.util.JTableUtil; import jdepend.framework.util.BundleUtil; import jdepend.framework.util.MetricsFormat; import jdepend.knowledge.database.AnalysisResultRepository; import jdepend.knowledge.database.ExecuteResultSummry; import jdepend.model.JDependUnitMgr; import jdepend.model.result.AnalysisResult; import jdepend.model.result.AnalysisResultListener; import jdepend.service.config.ServiceConfigurator; import jdepend.util.refactor.AdjustHistory; public class ExecuteHistoryPanel extends JPanel implements GroupConfChangeListener, AnalysisResultListener { private JDependCooper frame; private DefaultTableModel histroyModel; private JTable histroyTable; private String currentId; private int currentRow; private String group; private String command; private List<String> selectedIDs; public ExecuteHistoryPanel(JDependCooper frame) { super(); setLayout(new BorderLayout()); this.frame = frame; this.add(this.initHistory()); // 向命令组配置组件增加监听器 try { CommandConfMgr.getInstance().addGroupListener(this); } catch (JDependException e) { e.printStackTrace(); frame.showStatusError(e.getMessage()); } // 向分析结果管理器注册监听器 JDependUnitMgr.getInstance().addAnalysisResultListener(this); } public void showHistory(String group, String command) throws JDependException { histroyModel.setRowCount(0); loadHistory(group, command); } public void clearHistory() { histroyModel.setRowCount(0); } private JComponent initHistory() { histroyModel = new DefaultTableModel() { @Override public boolean isCellEditable(int row, int column) { return false; } }; TableSorter sorter = new TableSorter(histroyModel); histroyTable = new JTable(sorter); final JPopupMenu popupMenu = new JPopupMenu(); JMenuItem viewItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_View)); viewItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { view(); } }); popupMenu.add(viewItem); JMenuItem deleteItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Delete)); deleteItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (selectedIDs.size() > 0) { if (JOptionPane.showConfirmDialog(frame, "您是否确认删除?", "提示", JOptionPane.YES_NO_OPTION) == 0) { try { for (String id : selectedIDs) { AnalysisResultRepository.getInstance().delete(id); } showHistory(group, command); } catch (Exception ex) { JOptionPane.showMessageDialog(frame, ex.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } } } else { JOptionPane.showMessageDialog(frame, "请选择要删除的记录", "alert", JOptionPane.INFORMATION_MESSAGE); } } }); popupMenu.add(deleteItem); JMenuItem compareItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Compare)); compareItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if (selectedIDs == null || selectedIDs.size() != 2) { JOptionPane.showMessageDialog(frame, "请选择2条需要比较的记录", "alert", JOptionPane.INFORMATION_MESSAGE); } else { compare(selectedIDs.get(0), selectedIDs.get(1)); } } }); popupMenu.add(compareItem); popupMenu.addSeparator(); JMenuItem refreshItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Refresh)); refreshItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { showHistory(group, command); } catch (Exception ex) { JOptionPane.showMessageDialog(frame, ex.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } } }); popupMenu.add(refreshItem); JMenuItem displayLineItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_ShowLineChart)); displayLineItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { displayLine(); } catch (Exception ex) { JOptionPane.showMessageDialog(frame, ex.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } } }); popupMenu.add(displayLineItem); popupMenu.addSeparator(); JMenuItem saveAsItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_SaveAs)); saveAsItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { JTableUtil.exportTableToExcel(histroyTable); } }); popupMenu.add(saveAsItem); JMenuItem exportItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Export)); exportItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { export(); } }); popupMenu.add(exportItem); histroyTable.addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { JTable table = (JTable) e.getSource(); selectedIDs = new ArrayList<String>(); for (int row : table.getSelectedRows()) { selectedIDs.add((String) table.getValueAt(row, 0)); } } @Override public void mouseClicked(MouseEvent e) { JTable table = (JTable) e.getSource(); currentRow = table.rowAtPoint(e.getPoint()); currentId = (String) table.getValueAt(currentRow, 0); if (e.getButton() == 3) { popupMenu.show(table, e.getX(), e.getY()); } if (e.getClickCount() == 2) view(); } }); sorter.setTableHeader(histroyTable.getTableHeader()); histroyModel.addColumn("ID"); histroyModel.addColumn(BundleUtil.getString(BundleUtil.TableHead_ExecuteDate)); histroyModel.addColumn(ReportConstant.LC); histroyModel.addColumn(ReportConstant.CN); histroyModel.addColumn(ReportConstant.Result_ComponentCount); histroyModel.addColumn(ReportConstant.Result_RelationCount); histroyModel.addColumn(ReportConstant.Coupling); histroyModel.addColumn(ReportConstant.Cohesion); histroyModel.addColumn(ReportConstant.D); histroyModel.addColumn(ReportConstant.Balance); histroyModel.addColumn(ReportConstant.Encapsulation); histroyModel.addColumn(ReportConstant.Result_Metrics_RelationRationality); histroyTable.getColumn("ID").setMaxWidth(0); histroyTable.getColumn("ID").setMinWidth(0); sorter.setSortingStatus(1, TableSorter.ASCENDING); JScrollPane pane = new JScrollPane(histroyTable); pane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); final JPopupMenu popupMenu1 = new JPopupMenu(); JMenuItem refreshItem1 = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Refresh)); refreshItem1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { showHistory(group, command); } catch (Exception ex) { JOptionPane.showMessageDialog(frame, ex.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } } }); popupMenu1.add(refreshItem1); JMenuItem displayLineItem1 = new JMenuItem("显示折线图"); displayLineItem1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { displayLine(); } catch (Exception ex) { JOptionPane.showMessageDialog(frame, ex.getMessage(), "alert", JOptionPane.ERROR_MESSAGE); } } }); popupMenu1.add(displayLineItem1); pane.addMouseListener(new MouseAdapter() { @Override public void mousePressed(java.awt.event.MouseEvent e) { if (e.getButton() == 3 && histroyModel.getRowCount() > 0) { popupMenu1.show((Component) e.getSource(), e.getX(), e.getY()); } } }); return pane; } private void loadHistory(String group, String command) throws JDependException { Object[] row; this.group = group; this.command = command; List<ExecuteResultSummry> summrys = AnalysisResultRepository.getInstance().getResultSummrys(group, command); for (ExecuteResultSummry summry : summrys) { row = new Object[12]; row[0] = summry.getId(); row[1] = summry.getCreateDate(); row[2] = summry.getSummry().getLineCount(); row[3] = summry.getSummry().getClassCount(); row[4] = summry.getSummry().getComponentCount(); row[5] = summry.getSummry().getRelationCount(); row[6] = MetricsFormat.toFormattedMetrics(summry.getSummry().getCoupling()); row[7] = MetricsFormat.toFormattedMetrics(summry.getSummry().getCohesion()); row[8] = MetricsFormat.toFormattedMetrics(summry.getSummry().getDistance()); row[9] = MetricsFormat.toFormattedMetrics(summry.getSummry().getBalance()); row[10] = MetricsFormat.toFormattedMetrics(summry.getSummry().getEncapsulation()); row[11] = MetricsFormat.toFormattedMetrics(summry.getSummry().getNormalRelation()); histroyModel.addRow(row); } } private void view() { try { AdjustHistory.getInstance().clear(); AnalysisResult result = AnalysisResultRepository.getInstance().getResult(currentId); JDependUnitMgr.getInstance().setResult(result); frame.getResultPanelWrapper().showResults(true); } catch (JDependException e) { e.printStackTrace(); JOptionPane.showMessageDialog(frame, "读取执行历史失败!", "alert", JOptionPane.ERROR_MESSAGE); } } private void compare(String id1, String id2) { try { AdjustHistory.getInstance().clear(); AnalysisResult result1 = AnalysisResultRepository.getInstance().getResult(id1); JDependUnitMgr.getInstance().setResult(result1); AdjustHistory.getInstance().addMemento(); AnalysisResult result2 = AnalysisResultRepository.getInstance().getResult(id2); JDependUnitMgr.getInstance().setResult(result2); frame.getResultPanelWrapper().showResults(false); } catch (JDependException e) { e.printStackTrace(); JOptionPane.showMessageDialog(frame, "读取执行历史失败!", "alert", JOptionPane.ERROR_MESSAGE); } } private void displayLine() { try { List<ExecuteResultSummry> summrys = AnalysisResultRepository.getInstance().getResultSummrys(group, command); frame.getResultPanel().addResult(group + "." + command + "执行历史折线图", new ExecuteHistoryChartPanel(frame, summrys)); } catch (Throwable e) { e.printStackTrace(); JOptionPane.showMessageDialog(frame, "读取执行历史失败!", "alert", JOptionPane.ERROR_MESSAGE); } } private void export() { try { AnalysisResult result = AnalysisResultRepository.getInstance().getResult(currentId); AnalysisResultExportUtil.exportResult(frame, result); } catch (Exception e) { e.printStackTrace(); JOptionPane.showMessageDialog(frame, "导出失败!", "alert", JOptionPane.ERROR_MESSAGE); } } @Override public void onCreate(String group) throws CommandConfException { } @Override public void onDelete(String group) throws CommandConfException { try { // 删除执行历史 AnalysisResultRepository.getInstance().deleteAll(group); // 清空显示数据 if (this.group != null && this.group.equals(group)) { this.clearHistory(); } } catch (JDependException e) { throw new CommandConfException(e); } } @Override public void onUpdate(String group) throws CommandConfException { } @Override public void onRefresh() throws CommandConfException { } @Override public void onExecuted(AnalysisResult result) throws JDependException { ServiceConfigurator serviceConf = new ServiceConfigurator(); // 保存执行结果 if (serviceConf.isSaveResult()) { AnalysisResultRepository.getInstance().save(result); } } }