package jdepend.client.report.ui;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import jdepend.framework.ui.component.JDependFrame;
import jdepend.framework.ui.dialog.CooperDialog;
import jdepend.framework.util.BundleUtil;
import jdepend.metadata.CandidateUtil;
import jdepend.metadata.JavaClass;
import jdepend.metadata.JavaClassRelationItem;
import jdepend.model.Component;
import jdepend.model.JDependUnitMgr;
import jdepend.model.JavaClassUnit;
import jdepend.model.Relation;
import jdepend.client.report.util.ReportConstant;
import jdepend.client.report.way.mapui.GraphJDepend;
public class RelationDetailDialog extends CooperDialog {
private JDependFrame frame;
private Relation relation;
private JRadioButton current;
private JRadioButton depend;
private GraphJDepend display;
public RelationDetailDialog(JDependFrame frame, Component current,
Component depend) {
super(current.getName() + " 依赖于 " + depend.getName());
this.frame = frame;
this.relation = current.getCeTheRelation(depend);
this.setLayout(new BorderLayout());
this.add(BorderLayout.NORTH, this.createOperationPanel());
this.add(BorderLayout.CENTER, new RelationDetailPanel(this.frame,
this.relation.getDetail()));
}
public RelationDetailDialog(GraphJDepend display, String current,
String depend) {
super(current + " 依赖于 " + depend);
this.display = display;
this.frame = display.getGraphPanel().getFrame();
for (Relation r : display.getRelations()) {
if (r.equals(current, depend)) {
this.relation = r;
}
}
this.setLayout(new BorderLayout());
this.add(BorderLayout.NORTH, this.createOperationPanel());
this.add(BorderLayout.CENTER, new RelationDetailPanel(this.frame,
this.relation.getDetail()));
}
@Override
public void dispose() {
if (this.display != null
&& this.display.getGraphPanel().getParentDialog() != null) {
this.display.getGraphPanel().getParentDialog().dispose();
}
super.dispose();
}
private JPanel createOperationPanel() {
JPanel relationPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
relationPanel.add(new JLabel("要移动的类:"));
current = new JRadioButton("源:" + this.relation.getCurrent().getName()) {
@Override
protected void fireItemStateChanged(ItemEvent event) {
if (current.isSelected()) {
depend.setSelected(false);
} else {
depend.setSelected(true);
}
}
};
relationPanel.add(current);
depend = new JRadioButton("目标:" + this.relation.getDepend().getName()) {
@Override
protected void fireItemStateChanged(ItemEvent event) {
if (depend.isSelected()) {
current.setSelected(false);
} else {
current.setSelected(true);
}
}
};
relationPanel.add(depend);
current.setSelected(true);
JButton moveTo = new JButton(
BundleUtil.getString(BundleUtil.Command_Move));
moveTo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MoveToClassListDialog d = new MoveToClassListDialog();
d.setModal(true);
d.setVisible(true);
}
});
relationPanel.add(moveTo);
JButton analyse = new JButton(
BundleUtil.getString(BundleUtil.Command_Analyse));
analyse.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
RelationDetailForMoveDialog d = new RelationDetailForMoveDialog(
frame, RelationDetailDialog.this, relation);
d.setModal(true);
d.setVisible(true);
}
});
relationPanel.add(analyse);
JButton track = new JButton(
BundleUtil.getString(BundleUtil.Command_Track));
track.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Collection<JavaClass> dependClasses = new ArrayList<JavaClass>();
for (JavaClassRelationItem item : relation.getItems()) {
if (!dependClasses.contains(item.getTarget())) {
dependClasses.add(item.getTarget());
}
}
Collection<JavaClass> allClasses = new ArrayList<JavaClass>(
dependClasses);
RelationTrackDialog d = new RelationTrackDialog(frame,
dependClasses, allClasses);
d.setModal(true);
d.setVisible(true);
}
});
relationPanel.add(track);
return relationPanel;
}
private List<String> calSelectedJavaClass() {
List<String> selectedJavaClass = new ArrayList<String>();
for (JavaClassRelationItem item : this.relation.getItems()) {
if (current.isSelected()) {
selectedJavaClass.add(CandidateUtil.getId(item.getSource()
.getPlace(), item.getSource().getName()));
} else {
selectedJavaClass.add(CandidateUtil.getId(item.getTarget()
.getPlace(), item.getTarget().getName()));
}
}
return selectedJavaClass;
}
class MoveToClassListDialog extends JDialog {
private DefaultTableModel classListModel;
private JTable classListTable;
MoveToClassListDialog() {
getContentPane().setLayout(new BorderLayout());
setSize(ResultPopDialogWidth, ResultPopDialogHeight);
this.setLocationRelativeTo(null);// 窗口在屏幕中间显示
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
JPanel content = new JPanel(new BorderLayout());
content.add(initTable());
JPanel buttonBar = new JPanel(new FlowLayout());
buttonBar.add(createNextButton());
buttonBar.add(createCancelButton());
panel.add(BorderLayout.CENTER, content);
panel.add(BorderLayout.SOUTH, buttonBar);
getContentPane().add(BorderLayout.CENTER, panel);
}
private JComponent initTable() {
classListModel = new DefaultTableModel() {
@Override
public Class getColumnClass(int c) {
Object value = getValueAt(0, c);
if (value != null) {
return value.getClass();
} else {
return String.class;
}
}
};
classListTable = new JTable(classListModel);
classListModel.addColumn("是否移动");
classListModel.addColumn(ReportConstant.JavaClass_Place);
classListModel.addColumn(ReportConstant.Name);
final CheckBoxRenderer check = new CheckBoxRenderer("是否移动");
classListTable.getColumn("是否移动").setHeaderRenderer(check);
classListTable.getTableHeader().addMouseListener(
new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (classListTable.getColumnModel()
.getColumnIndexAtX(e.getX()) == 0) {// 如果点击的是第0列,即checkbox这一列
boolean b = !check.isSelected();
check.setSelected(b);
classListTable.getTableHeader().repaint();
for (int i = 0; i < classListTable
.getRowCount(); i++) {
classListTable.getModel().setValueAt(b, i,
0);// 把这一列都设成和表头一样
}
}
}
});
Object[] row;
for (String className : calSelectedJavaClass()) {
row = new Object[3];
row[0] = new Boolean(true);
row[1] = CandidateUtil.getPlace(className);
row[2] = CandidateUtil.getName(className);
classListModel.addRow(row);
}
classListTable.getColumnModel().getColumn(1).setMinWidth(0);
classListTable.getColumnModel().getColumn(1).setMaxWidth(0);
return new JScrollPane(classListTable);
}
private JButton createCancelButton() {
JButton button = new JButton(
BundleUtil.getString(BundleUtil.Command_Cancel));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dispose();
}
});
return button;
}
private JButton createNextButton() {
JButton button = new JButton(
BundleUtil.getString(BundleUtil.Command_NextStep));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
nextStep(e);
}
});
return button;
}
private void nextStep(ActionEvent e) {
Collection<String> moveToClassList = new HashSet<String>();
for (int i = 0; i < classListModel.getRowCount(); i++) {
if ((Boolean) classListModel.getValueAt(i, 0)) {
moveToClassList.add(CandidateUtil.getId(
(String) classListModel.getValueAt(i, 1),
(String) classListModel.getValueAt(i, 2)));
}
}
dispose();
this.openJavaClassMoveToDialog(moveToClassList);
}
private void openJavaClassMoveToDialog(
Collection<String> moveToClassList) {
Collection<JavaClassUnit> javaClasses = new ArrayList<JavaClassUnit>();
for (String javaClassId : moveToClassList) {
javaClasses.add(JDependUnitMgr.getInstance().getResult()
.getTheClass(javaClassId));
}
JavaClassMoveToDialog d = new JavaClassMoveToDialog(frame,
javaClasses);
d.setListener(new JavaClassMoveToDialogListener() {
@Override
public void onFinish() {
RelationDetailDialog.this.dispose();
}
});
d.setModal(true);
d.setVisible(true);
}
class CheckBoxRenderer extends JCheckBox implements TableCellRenderer {
public CheckBoxRenderer(String name) {
this.setText(name);
this.setBorderPainted(true);
this.setSelected(true);
}
@Override
public java.awt.Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
return this;
}
}
}
}