package jdepend.client.ui.analyzer;
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JEditorPane;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
import jdepend.client.core.analyzer.AnalyzerMgr;
import jdepend.client.report.util.TreeGraphUtil;
import jdepend.client.ui.JDependCooper;
import jdepend.client.ui.framework.UIPropertyConfigurator;
import jdepend.client.ui.result.framework.ResultPanel;
import jdepend.client.ui.util.ClassPathURLStreamHandler;
import jdepend.framework.domain.PersistentBean;
import jdepend.framework.exception.JDependException;
import jdepend.framework.log.BusiLogUtil;
import jdepend.framework.log.Operation;
import jdepend.framework.ui.dialog.PersistentBeanSettingDialog;
import jdepend.framework.ui.graph.CooperTable;
import jdepend.framework.ui.graph.GraphUtil;
import jdepend.framework.ui.graph.model.GraphData;
import jdepend.framework.ui.graph.model.GraphDataItem;
import jdepend.framework.ui.graph.model.TableData;
import jdepend.framework.ui.util.ExceptionPrinter;
import jdepend.framework.util.BundleUtil;
import jdepend.metadata.tree.Node;
import jdepend.model.JDependUnitMgr;
import jdepend.model.result.AnalysisResult;
import jdepend.util.analyzer.framework.Analyzer;
import jdepend.util.analyzer.framework.AnalyzerExecutor;
import jdepend.util.analyzer.framework.AnalyzerResult;
import jdepend.util.analyzer.framework.GraphItemData;
public class AnalyzerPanel extends JPanel {
protected JDependCooper frame;
protected Map<String, List<AnalyzerUIWrapper>> analyzers;
private Map<String, DefaultTableModel> models;
protected int currentRow;
protected String currentGroup;
private Map<String, String> tips = new HashMap<String, String>();
public AnalyzerPanel(final JDependCooper frame) {
super();
this.frame = frame;
this.models = new LinkedHashMap<String, DefaultTableModel>();
this.setLayout(new BorderLayout());
JTabbedPane tab = this.initAnalyzerTab();
this.setDefaultTab(tab);
this.add(tab);
}
private JTabbedPane initAnalyzerTab() {
JTabbedPane tab = new JTabbedPane(JTabbedPane.BOTTOM);
tab.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JTabbedPane tabbedPane = (JTabbedPane) e.getSource();
currentGroup = tabbedPane.getTitleAt(tabbedPane.getSelectedIndex());
}
});
for (final String group : AnalyzerMgr.getInstance().getTypes()) {
DefaultTableModel model = new DefaultTableModel() {
@Override
public boolean isCellEditable(int row, int column) {
return false;
}
};
this.models.put(group, model);
JTable table = new JTable(model) {
@Override
public String getToolTipText(MouseEvent event) {
Point p = event.getPoint();
int row = rowAtPoint(p);
int col = columnAtPoint(p);
if (row == -1 || col == -1) {
return null;
}
String key = (String) this.getValueAt(row, col);
return tips.get(key);
}
};
final JPopupMenu popupMenu = this.getPopupMenu();
table.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
JTable table = (JTable) e.getSource();
currentRow = table.rowAtPoint(e.getPoint());
if (currentRow >= 0) {
table.setRowSelectionInterval(currentRow, currentRow);
}
}
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
try {
run();
} catch (JDependException e1) {
e1.printStackTrace();
JOptionPane.showConfirmDialog(frame, e1.getMessage(), "提示", JOptionPane.CLOSED_OPTION);
}
} else if (e.getButton() == 3) {
JTable table = (JTable) e.getSource();
popupMenu.show(table, e.getX(), e.getY());
}
}
});
model.addColumn(BundleUtil.getString(BundleUtil.TableHead_Name));
this.refresh(group);
final JPopupMenu popupMenu1 = this.getPopupMenu1();
final JScrollPane pane = new JScrollPane(table);
pane.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
pane.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getButton() == 3) {
popupMenu1.show(pane, e.getX(), e.getY());
}
}
});
tab.add(group, pane);
}
if (tab.getSelectedIndex() != -1) {
currentGroup = tab.getTitleAt(tab.getSelectedIndex());
}
return tab;
}
protected JPopupMenu getPopupMenu() {
JPopupMenu popupMenu = new JPopupMenu();
JMenuItem runItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Run));
runItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
run();
} catch (JDependException e1) {
e1.printStackTrace();
JOptionPane.showConfirmDialog(frame, e1.getMessage(), "提示", JOptionPane.CLOSED_OPTION);
}
}
});
popupMenu.add(runItem);
popupMenu.addSeparator();
JMenuItem settingItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Setting));
settingItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setting();
}
});
popupMenu.add(settingItem);
JMenuItem explainItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Explain));
explainItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
explain();
}
});
popupMenu.add(explainItem);
JMenuItem refreshItem = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Refresh));
refreshItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
refresh();
} catch (Exception e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(frame, e1.getMessage(), "alert", JOptionPane.ERROR_MESSAGE);
}
}
});
popupMenu.add(refreshItem);
return popupMenu;
}
protected JPopupMenu getPopupMenu1() {
final JPopupMenu popupMenu1 = new JPopupMenu();
JMenuItem refreshItem1 = new JMenuItem(BundleUtil.getString(BundleUtil.Command_Refresh));
refreshItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
try {
refresh();
} catch (Exception e1) {
e1.printStackTrace();
JOptionPane.showMessageDialog(frame, e1.getMessage(), "alert", JOptionPane.ERROR_MESSAGE);
}
}
});
popupMenu1.add(refreshItem1);
return popupMenu1;
}
private void setDefaultTab(JTabbedPane tab) {
String defaultTab = UIPropertyConfigurator.getInstance().getDefaultAnalyzerType();
for (int i = 0; i < tab.getTabCount(); i++) {
if (tab.getTitleAt(i).equals(defaultTab)) {
tab.setSelectedIndex(i);
currentGroup = defaultTab;
break;
}
}
}
private void run() throws JDependException {
final AnalysisResult result = JDependUnitMgr.getInstance().getResult();
if (result != null && !result.isEmpty()) {
final Analyzer analyzer = this.analyzers.get(this.currentGroup).get(currentRow);
final AnalyzerExecutor executor = new AnalyzerExecutor(analyzer);
executor.setListener(frame);
new Thread() {
@Override
public void run() {
try {
frame.startProgressMonitor(analyzer.getMaxProgress(result));
AnalyzerResult analyzerResult = executor.execute(result);
if (analyzerResult.existResult()) {
frame.getResultPanel().addResult(analyzer.getName(), formatResult(analyzerResult));
} else {
StringBuilder info = new StringBuilder();
info.append(analyzer.getName());
info.append(":\n");
info.append(" 没有信息");
frame.getResultPanel().addResult(analyzer.getName(), info);
}
// 记录日志
BusiLogUtil.getInstance().businessLog(Operation.executeAnalyzer);
frame.stopProgressMonitor();
} catch (JDependException ex) {
frame.getResultPanel().showError(ex);
frame.stopProgressMonitor();
}
}
}.start();
} else {
throw new JDependException("您还没有执行命令,请执行完命令后在执行该操作");
}
}
public void refreshAll() {
for (String group : AnalyzerMgr.getInstance().getTypes()) {
this.refresh(group);
}
}
public void refresh() {
this.refresh(this.currentGroup);
}
private void refresh(String group) {
Object[] row;
this.analyzers = new LinkedHashMap<String, List<AnalyzerUIWrapper>>();
for (String type : AnalyzerMgr.getInstance().getAnalyzers().keySet()) {
this.analyzers.put(type, new ArrayList<AnalyzerUIWrapper>());
for (Analyzer analyzer : AnalyzerMgr.getInstance().getAnalyzers(type)) {
this.analyzers.get(type).add(new AnalyzerUIWrapper(analyzer));
}
}
this.models.get(group).setRowCount(0);
for (Analyzer analyzer : this.analyzers.get(group)) {
row = new Object[1];
row[0] = analyzer.getName();
tips.put(analyzer.getName(), analyzer.getTip());
this.models.get(group).addRow(row);
}
}
private JComponent formatResult(AnalyzerResult result) {
JTabbedPane tabPane = new JTabbedPane();
tabPane.setTabPlacement(JTabbedPane.BOTTOM);
if (result.existTwoDimensionData()) {
tabPane.addTab("Table", new JScrollPane(new CooperTable(new TableData(result.getTwoDimensionData()
.getDatas()))));
}
if (result.getTree() != null) {
tabPane.addTab("Tree", createTree(result.getTree()));
}
try {
if (result.getGraphData() != null) {
tabPane.addTab("Graph", createGraph(result.getGraphData()));
}
} catch (JDependException e) {
e.printStackTrace();
tabPane.addTab("Graph", ExceptionPrinter.createComponent(e));
}
if (result.getInfo() != null) {
tabPane.addTab("Text", ResultPanel.createTextViewer(new StringBuilder(result.getInfo())));
}
return tabPane;
}
private JComponent createGraph(List<GraphItemData> itemDatas) throws JDependException {
GraphData graphData = new GraphData();
GraphDataItem item;
for (GraphItemData itemData : itemDatas) {
item = new GraphDataItem();
item.setTitle(itemData.getTitle());
item.setType(itemData.getType());
item.setGroup(itemData.getGroup());
item.setDatas(itemData.getDatas());
graphData.addItem(item);
}
return GraphUtil.createGraph(graphData);
}
private JComponent createTree(Node root) {
return (new TreeGraphUtil()).createTree(root);
}
private void setting() {
AnalyzerUIWrapper analyzer = this.analyzers.get(this.currentGroup).get(this.currentRow);
PersistentBeanSettingDialog d = new PersistentBeanSettingDialog(frame, (PersistentBean) analyzer.getAnalyzer());
d.setModal(true);
d.setVisible(true);
}
protected void explain() {
Analyzer antiPattern = this.analyzers.get(this.currentGroup).get(this.currentRow);
String explainTxt = antiPattern.getExplain();
if (explainTxt == null) {
explainTxt = "没有提供说明";
}
JEditorPane explain = new JEditorPane();
explain.setContentType("text/html;charset=utf-8");
explain.setEditable(false);
StyleSheet ss = new StyleSheet();
HTMLEditorKit kit = new HTMLEditorKit();
ss.addStyleSheet(kit.getStyleSheet());
kit.setStyleSheet(ss);
explain.setEditorKit(kit);
if (explainTxt.endsWith("htm") || explainTxt.endsWith("html")) {
try {
explain.setPage(new URL(null, "classpath:" + explainTxt, new ClassPathURLStreamHandler()));
} catch (Exception e) {
e.printStackTrace();
}
} else {
explain.setText(explainTxt);
}
explain.setCaretPosition(0);
JScrollPane pane = new JScrollPane(explain);
frame.getResultPanel().addResult(antiPattern.getName() + "说明", pane);
frame.getResultPanel().setLastedTab();
}
}