package husacct.analyse.presentation.decompositionview; import husacct.ServiceProvider; import husacct.analyse.presentation.AnalyseUIController; import husacct.analyse.presentation.SoftwareTreeCellRenderer; import husacct.analyse.task.AnalyseTaskControl; import husacct.common.dto.SoftwareUnitDTO; import husacct.common.help.presentation.HelpableJPanel; import husacct.common.help.presentation.HelpableJScrollPane; import husacct.common.help.presentation.HelpableJTree; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.util.List; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.border.TitledBorder; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; import javax.swing.tree.TreeSelectionModel; public class ApplicationStructurePanel extends HelpableJPanel implements ActionListener, TreeSelectionListener { private static final long serialVersionUID = 1L; private static final Color PANELBACKGROUND = UIManager.getColor("Panel.background"); private HelpableJTree codeTree; private JPopupMenu popupMenu = new JPopupMenu(); private JMenuItem viewCodeItem = new JMenuItem(); private HelpableJScrollPane jScrollPaneTree; private StatisticsPanel statisticsPanel; private AnalyseUIController dataControl; private AnalyseTaskControl analyseTaskControl; public ApplicationStructurePanel(AnalyseTaskControl atc) { analyseTaskControl = atc; dataControl = new AnalyseUIController(analyseTaskControl); createLayout(); createCodeTree(); createPopupMenu(); } private void createLayout() { jScrollPaneTree = new HelpableJScrollPane(); jScrollPaneTree.setBackground(PANELBACKGROUND); jScrollPaneTree.setBorder(new TitledBorder(dataControl.translate("ApplicationComposition"))); statisticsPanel = new StatisticsPanel(dataControl); GroupLayout groupLayout = new GroupLayout(this); groupLayout.setHorizontalGroup( groupLayout.createParallelGroup(Alignment.LEADING) .addGroup(groupLayout.createSequentialGroup() .addContainerGap() .addComponent(jScrollPaneTree, GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE) .addGap(18) .addComponent(statisticsPanel, GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE) .addContainerGap())); groupLayout.setVerticalGroup( groupLayout.createParallelGroup(Alignment.LEADING) .addGroup(groupLayout.createSequentialGroup() .addContainerGap() .addGroup(groupLayout.createParallelGroup(Alignment.LEADING) .addComponent(jScrollPaneTree, GroupLayout.DEFAULT_SIZE, 289, Short.MAX_VALUE) .addComponent(statisticsPanel, GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addContainerGap())); setLayout(groupLayout); } private void createCodeTree() { SoftwareUnitDTO rootModule = new SoftwareUnitDTO("", "", "", ""); DefaultMutableTreeNode root = new DefaultMutableTreeNode(rootModule); codeTree = new HelpableJTree(root); createTreeLayout(codeTree); codeTree.addTreeSelectionListener(this); codeTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION); List<SoftwareUnitDTO> rootModules = dataControl.getRootModules(); for (SoftwareUnitDTO module : rootModules) { DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode(module); root.add(rootNode); fillNode(rootNode); } this.expandLeaf(codeTree, 1); jScrollPaneTree.setViewportView(codeTree); codeTree.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent event) { createPopup(event); } @Override public void mouseEntered(MouseEvent event) { createPopup(event); } @Override public void mousePressed(MouseEvent event) { createPopup(event); } }); } private void expandLeaf(JTree tree, int level) { for (int i = 0; i < level; i++) { tree.expandRow(i); } } private void fillNode(DefaultMutableTreeNode node) { SoftwareUnitDTO module = (SoftwareUnitDTO) node.getUserObject(); List<SoftwareUnitDTO> children = dataControl.getModulesInModules(module.uniqueName); if (!children.isEmpty()) { for (SoftwareUnitDTO child : children) { DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child); fillNode(childNode); node.add(childNode); } } } private void createTreeLayout(JTree theTree) { DefaultTreeCellRenderer moduleNodeRenderer = new SoftwareTreeCellRenderer(dataControl); moduleNodeRenderer.setBackground(PANELBACKGROUND); moduleNodeRenderer.setBackgroundNonSelectionColor(PANELBACKGROUND); moduleNodeRenderer.setBackgroundSelectionColor(UIManager.getColor("Table.sortIconColor")); moduleNodeRenderer.setTextNonSelectionColor(PANELBACKGROUND); moduleNodeRenderer.setTextSelectionColor(UIManager.getColor("Table.sortIconColor")); theTree.setCellRenderer(moduleNodeRenderer); theTree.setBackground(PANELBACKGROUND); } @Override public void valueChanged(TreeSelectionEvent eventTree) { DefaultMutableTreeNode selected = (DefaultMutableTreeNode) codeTree.getLastSelectedPathComponent(); if (selected != null) { SoftwareUnitDTO selectedModule = (SoftwareUnitDTO) selected.getUserObject(); statisticsPanel.reload(selectedModule); jScrollPaneTree.repaint(); repaint(); } } public void reload() { statisticsPanel.reload(null); jScrollPaneTree.repaint(); createPopupMenu(); this.invalidate(); this.revalidate(); this.repaint(); } private void createPopup(MouseEvent event) { if (SwingUtilities.isRightMouseButton(event)) { int row = codeTree.getClosestRowForLocation(event.getX(), event.getY()); codeTree.setSelectionRow(row); DefaultMutableTreeNode selected = (DefaultMutableTreeNode) codeTree.getLastSelectedPathComponent(); if (selected != null) { SoftwareUnitDTO selectedModule = (SoftwareUnitDTO) selected.getUserObject(); String type = selectedModule.type; if (type.toLowerCase().equals("class") || type.toLowerCase().equals("interface")) { popupMenu.show(codeTree, event.getX(), event.getY()); } } } } private void createPopupMenu() { if (viewCodeItem != null) { popupMenu.removeAll(); } viewCodeItem = new JMenuItem(ServiceProvider.getInstance().getLocaleService().getTranslatedString("ShowCode")); viewCodeItem.addActionListener(this); popupMenu.add(viewCodeItem); } @Override public void actionPerformed(ActionEvent action) { if (action.getSource() == viewCodeItem) { // Start the CodeViewer DefaultMutableTreeNode selected = (DefaultMutableTreeNode) codeTree.getLastSelectedPathComponent(); if (selected != null) { SoftwareUnitDTO selectedModule = (SoftwareUnitDTO) selected.getUserObject(); String type = selectedModule.type; if (type.toLowerCase().equals("class") || type.toLowerCase().equals("interface")) { String uniqueName = selectedModule.uniqueName; dataControl.getControlService().displayErrorInFile(uniqueName, 0, null); } } } } }