package jdepend.client.ui.componentconf;
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.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JDialog;
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.ui.JDependCooper;
import jdepend.framework.ui.util.JTableUtil;
import jdepend.framework.util.BundleUtil;
import jdepend.metadata.CandidateUtil;
import jdepend.metadata.JavaPackage;
import jdepend.model.JDependUnitMgr;
import jdepend.model.component.CustomComponent;
import jdepend.model.component.modelconf.ComponentConf;
import jdepend.model.component.modelconf.ComponentConfException;
import jdepend.model.component.modelconf.ComponentModelConf;
import jdepend.model.component.modelconf.ComponentModelConfMgr;
import jdepend.model.component.modelconf.GroupComponentModelConf;
import jdepend.model.result.AnalysisResult;
public final class ChangedElementListDialog extends JDialog {
private String group;
private String componentModelConfName;
private JTable listTable;
private DefaultTableModel listModel;
private Map<String, ArrayList<String>> selectedElements;
private AnalysisResult result;
private static final String NEW = "新增";
private static final String DELETED = "已删除";
public ChangedElementListDialog(JDependCooper frame) {
this.result = JDependUnitMgr.getInstance().getResult();
this.setTitle("元素变动列表");
this.setLayout(new BorderLayout());
setSize(ComponentModelPanel.Width, ComponentModelPanel.Height);
this.setLocationRelativeTo(null);// 窗口在屏幕中间显示
this.group = result.getRunningContext().getGroup();
this.componentModelConfName = ((CustomComponent) result.getRunningContext()
.getComponent()).getComponentModelConf().getName();
listModel = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
listTable = new JTable(listModel);
listModel.addColumn("位置");
listModel.addColumn("元素名");
listModel.addColumn("变动");
final JPopupMenu addPopupMenu = new JPopupMenu();
JMenuItem viewClassItem = new JMenuItem("查看类列表");
viewClassItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (selectedElements.size() != 1 && selectedElements.get(NEW).size() != 1) {
JOptionPane.showMessageDialog(null, "请选择一个包", "alert", JOptionPane.ERROR_MESSAGE);
return;
} else {
String javaPackageName = selectedElements.get(NEW).get(0);
JavaPackage javaPackage = result.getRunningContext()
.getThePackage(javaPackageName);
ClassListInThePackageDialog d = new ClassListInThePackageDialog(javaPackage);
d.setModal(true);
d.setVisible(true);
}
}
});
addPopupMenu.add(viewClassItem);
JMenuItem addItem = new JMenuItem("选择加入的组件");
addItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
final GroupComponentModelConf groupComponentModelConf = ComponentModelConfMgr.getInstance()
.getTheGroupComponentModelConf(group);
ComponentModelConf componentModelConf = groupComponentModelConf.getComponentModelConfs().get(
componentModelConfName);
JoinCustomComponentConfDialog d = new JoinCustomComponentConfDialog(selectedElements.get(NEW),
componentModelConf) {
@Override
protected void doService() throws ComponentConfException {
groupComponentModelConf.save();
deleteSelectedElements();
}
};
d.setModal(true);
d.setVisible(true);
}
});
addPopupMenu.add(addItem);
JMenuItem createItem = new JMenuItem("创建新组件");
createItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CreateComponentConfDialog d = new CreateComponentConfDialog(selectedElements.get(NEW), false) {
@Override
protected void doService(ActionEvent e) throws ComponentConfException {
GroupComponentModelConf groupComponentModelConf = ComponentModelConfMgr.getInstance()
.getTheGroupComponentModelConf(group);
ComponentModelConf componentModelConf = groupComponentModelConf.getComponentModelConfs().get(
componentModelConfName);
componentModelConf.addComponentConf(componentname.getText(), getComponentLayer(), units);
groupComponentModelConf.save();
deleteSelectedElements();
}
};
d.setModal(true);
d.setVisible(true);
}
});
addPopupMenu.add(createItem);
JMenuItem ignoreItem = new JMenuItem("加入忽略列表");
ignoreItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (JOptionPane.showConfirmDialog(listTable, "您是否确认?") == JOptionPane.OK_OPTION) {
final GroupComponentModelConf groupComponentModelConf = ComponentModelConfMgr.getInstance()
.getTheGroupComponentModelConf(group);
ComponentModelConf componentModelConf = groupComponentModelConf.getComponentModelConfs().get(
componentModelConfName);
for (String ignoreItem : selectedElements.get(NEW)) {
componentModelConf.addIgnoreItem(ignoreItem);
}
try {
groupComponentModelConf.save();
deleteSelectedElements();
} catch (ComponentConfException e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(null, e1.getMessage(), "alert", JOptionPane.ERROR_MESSAGE);
}
}
}
});
addPopupMenu.add(ignoreItem);
final JPopupMenu deletePopupMenu = new JPopupMenu();
JMenuItem deleteItem = new JMenuItem("从组件模型中清除这些包");
deleteItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (JOptionPane.showConfirmDialog(listTable, "您是否确认?") == JOptionPane.OK_OPTION) {
try {
deleteElementsFromConf();
} catch (ComponentConfException e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(null, e1.getMessage(), "alert", JOptionPane.ERROR_MESSAGE);
}
}
}
});
deletePopupMenu.add(deleteItem);
listTable.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
JTable table = (JTable) e.getSource();
if (e.getButton() == 3) {
try {
selectedElements = collect();
if (selectedElements.size() > 0) {
if (selectedElements.containsKey(NEW)) {
addPopupMenu.show(table, e.getX(), e.getY());
} else {
deletePopupMenu.show(table, e.getX(), e.getY());
}
}
} catch (ComponentConfException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(null, ex.getMessage(), "alert", JOptionPane.ERROR_MESSAGE);
}
}
}
});
Object[] row;
Map<String, String> diffElements = result.getDiffElements();
for (String elementName : diffElements.keySet()) {
row = new Object[3];
row[0] = CandidateUtil.getPlace(elementName);
row[1] = CandidateUtil.getName(elementName);
row[2] = diffElements.get(elementName).equals(ComponentModelConf.ADD) ? NEW : DELETED;
listModel.addRow(row);
}
List<String> fitColNames = new ArrayList<String>();
fitColNames.add("元素名");
JTableUtil.fitTableColumns(listTable, fitColNames);
this.add(BorderLayout.CENTER, new JScrollPane(listTable));
JPanel buttonPanel = new JPanel();
buttonPanel.add(this.createCloseButton());
this.add(BorderLayout.SOUTH, buttonPanel);
}
private Map<String, ArrayList<String>> collect() throws ComponentConfException {
Map<String, ArrayList<String>> selectedElements = new HashMap<String, ArrayList<String>>();
int[] rows = listTable.getSelectedRows();
if (rows == null || rows.length == 0)
return selectedElements;
String operation = null;
String elementName = null;
for (int i = 0; i < rows.length; i++) {
elementName = CandidateUtil.getId((String) listTable.getValueAt(rows[i], 0),
(String) listTable.getValueAt(rows[i], 1));
operation = (String) listTable.getValueAt(rows[i], 2);
if (!selectedElements.containsKey(operation)) {
selectedElements.put(operation, new ArrayList<String>());
}
selectedElements.get(operation).add(elementName);
}
if (selectedElements.size() > 1) {
throw new ComponentConfException("不能够包含新增和已删除两类元素!");
}
return selectedElements;
}
private void deleteElementsFromConf() throws ComponentConfException {
GroupComponentModelConf groupComponentModelConf = ComponentModelConfMgr.getInstance()
.getTheGroupComponentModelConf(group);
ComponentModelConf componentModelConf = groupComponentModelConf.getComponentModelConfs().get(
componentModelConfName);
ArrayList<String> deletePackages = this.selectedElements.get(DELETED);
for (ComponentConf componentConf : componentModelConf.getComponentConfs()) {
Iterator<String> it = componentConf.getItemIds().iterator();
while (it.hasNext()) {
if (deletePackages.contains(it.next())) {
it.remove();
}
}
}
groupComponentModelConf.save();
deleteSelectedElements();
}
private void deleteSelectedElements() {
int[] rows = listTable.getSelectedRows();
if (rows == null || rows.length == 0) {
return;
} else {
for (int index = rows.length - 1; index >= 0; index--) {
listModel.removeRow(rows[index]);
}
}
this.selectedElements = new HashMap<String, ArrayList<String>>();
}
private Component createCloseButton() {
JButton button = new JButton(BundleUtil.getString(BundleUtil.Command_Close));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ChangedElementListDialog.this.dispose();
}
});
return button;
}
}