package jdepend.client.ui.property;
import java.awt.BorderLayout;
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.Date;
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.framework.ui.component.MultiLineTableCellRender;
import jdepend.framework.ui.util.JTableUtil;
import jdepend.framework.util.BundleUtil;
import jdepend.framework.util.MetricsFormat;
import jdepend.model.JDependUnitMgr;
import jdepend.model.result.AnalysisResult;
import jdepend.client.ui.JDependCooper;
import jdepend.util.refactor.AdjustHistory;
import jdepend.util.refactor.Memento;
public class MementoPanel extends JPanel {
private JDependCooper frame;
private JTable mementoListTable;
private DefaultTableModel mementoModel;
private List<Date> selectedMementos;
public MementoPanel(JDependCooper frame) {
this.frame = frame;
setLayout(new BorderLayout());
this.add(this.initMementoList());
}
public void clear() {
mementoModel.setRowCount(0);
}
public void refresh() {
mementoModel.setRowCount(0);
Object[] row;
for (Memento memento : AdjustHistory.getInstance().getMementos()) {
row = new Object[7];
row[0] = memento.getCreateDate();
row[1] = getAction(memento.getActions());
row[2] = MetricsFormat.toFormattedMetrics(memento.getResult().getDistance());
row[3] = MetricsFormat.toFormattedMetrics(memento.getResult().getBalance());
row[4] = MetricsFormat.toFormattedMetrics(memento.getResult().getEncapsulation());
row[5] = MetricsFormat.toFormattedMetrics(memento.getResult().getRelationRationality());
row[6] = MetricsFormat.toFormattedMetrics(memento.getResult().getScore());
mementoModel.addRow(row);
}
if (AdjustHistory.getInstance().getMementos().size() > 0) {
row = new Object[7];
row[1] = getAction(AdjustHistory.getInstance().getActions());
row[2] = MetricsFormat.toFormattedMetrics(AdjustHistory.getInstance().getCurrent().getDistance());
row[3] = MetricsFormat.toFormattedMetrics(AdjustHistory.getInstance().getCurrent().getBalance());
row[4] = MetricsFormat.toFormattedMetrics(AdjustHistory.getInstance().getCurrent().getEncapsulation());
row[5] = MetricsFormat
.toFormattedMetrics(AdjustHistory.getInstance().getCurrent().getRelationRationality());
row[6] = MetricsFormat.toFormattedMetrics(AdjustHistory.getInstance().getCurrent().getScore());
mementoModel.addRow(row);
}
}
private String getAction(List<String> actions) {
if (actions == null || actions.size() == 0) {
return null;
}
StringBuilder str = new StringBuilder(1000);
for (String action : actions) {
str.append(action);
str.append("\n");
}
return str.toString();
}
private JComponent initMementoList() {
final JPopupMenu popupMenu = new JPopupMenu();
JMenuItem viewMementoItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_ViewResult));
viewMementoItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
viewMemento();
}
});
popupMenu.add(viewMementoItem);
JMenuItem compareItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Compare));
compareItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (selectedMementos.size() == 2) {
compare(selectedMementos.get(0), selectedMementos.get(1));
} else {
JOptionPane.showMessageDialog(frame, "请选择2条需要比较的记录", "alert", JOptionPane.INFORMATION_MESSAGE);
}
}
});
popupMenu.add(compareItem);
JMenuItem saveAsItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_SaveAs));
saveAsItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JTableUtil.exportTableToExcel(mementoListTable);
}
});
popupMenu.add(saveAsItem);
mementoModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
mementoModel.addColumn(BundleUtil.getString(BundleUtil.TableHead_CreateTime));
mementoModel.addColumn(BundleUtil.getString(BundleUtil.TableHead_ActionList));
mementoModel.addColumn(BundleUtil.getString(BundleUtil.Metrics_D));
mementoModel.addColumn(BundleUtil.getString(BundleUtil.Metrics_Balance));
mementoModel.addColumn(BundleUtil.getString(BundleUtil.Metrics_Encapsulation));
mementoModel.addColumn(BundleUtil.getString(BundleUtil.Metrics_RelationRationality));
mementoModel.addColumn(BundleUtil.getString(BundleUtil.Metrics_TotalScore));
this.mementoListTable = new JTable(mementoModel);
mementoListTable.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JTable table = (JTable) e.getSource();
selectedMementos = new ArrayList<Date>();
for (int row : table.getSelectedRows()) {
selectedMementos.add((Date) table.getValueAt(row, 0));
}
if (e.getClickCount() == 2) {
viewMemento();
} else if (e.getButton() == 3) {
popupMenu.show(table, e.getX(), e.getY());
}
}
});
this.mementoListTable.getColumnModel().getColumn(0).setMaxWidth(130);
this.mementoListTable.getColumnModel().getColumn(0).setMinWidth(130);
this.mementoListTable.getColumn(BundleUtil.getString(BundleUtil.TableHead_ActionList)).setCellRenderer(
new MultiLineTableCellRender());
refresh();
JScrollPane pane = new JScrollPane(this.mementoListTable);
pane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
return pane;
}
private void viewMemento() {
if (this.selectedMementos != null && this.selectedMementos.size() == 1) {
if (this.selectedMementos.get(0) != null) {
Memento memento = AdjustHistory.getInstance().getTheMemento(this.selectedMementos.get(0));
if (memento != null) {
JDependUnitMgr.getInstance().setResult(memento.getResult());
}
} else {
JDependUnitMgr.getInstance().setResult(AdjustHistory.getInstance().getCurrent());
}
AdjustHistory.getInstance().setCompared(null);
frame.getResultPanelWrapper().refreshResults();
} else {
JOptionPane.showMessageDialog(frame, "请选择一条历史进行查看.", "alert", JOptionPane.WARNING_MESSAGE);
return;
}
}
private void compare(Date id1, Date id2) {
Memento memento1 = AdjustHistory.getInstance().getTheMemento(id1);
AdjustHistory.getInstance().setCompared(memento1);
AnalysisResult result;
if (id2 != null) {
result = AdjustHistory.getInstance().getTheMemento(id2).getResult();
} else {
result = AdjustHistory.getInstance().getCurrent();
}
JDependUnitMgr.getInstance().setResult(result);
frame.getResultPanelWrapper().showResults(false);
}
}