package husacct.analyse.presentation.usageview; import husacct.ServiceProvider; import husacct.analyse.presentation.AnalyseUIController; import husacct.analyse.presentation.SoftwareTreeCellRenderer; import husacct.analyse.task.AnalyseTaskControl; import husacct.common.dto.DependencyDTO; import husacct.common.dto.SoftwareUnitDTO; import husacct.common.help.presentation.HelpableJPanel; import husacct.common.help.presentation.HelpableJScrollPane; import husacct.common.help.presentation.HelpableJTable; import husacct.common.help.presentation.HelpableJTree; import husacct.validate.domain.validation.Severity; import java.awt.Color; import java.awt.ComponentOrientation; import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.util.ArrayList; import java.util.List; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTree; import javax.swing.LayoutStyle.ComponentPlacement; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.border.TitledBorder; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.table.AbstractTableModel; import javax.swing.table.TableColumn; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeCellRenderer; public class DependencyPanel extends HelpableJPanel implements TreeSelectionListener, ActionListener { private static final long serialVersionUID = 1L; private static final Color PANELBACKGROUND = UIManager.getColor("Panel.background"); private GroupLayout theLayout; private HelpableJScrollPane fromModuleScrollPane, toModuleScrollPane, dependencyScrollPane; private HelpableJTree fromModuleTree, toModuleTree; private HelpableJTable dependencyTable; private JCheckBox indirectFilterBox; private JCheckBox directFilterBox; private JPanel numberOfDependenciesPanel, filterPanel; private JLabel totalDependenciesLabel, totalDependenciesNumber; private AbstractTableModel tableModel; private List<SoftwareUnitDTO> fromSelected = new ArrayList<SoftwareUnitDTO>(); private List<SoftwareUnitDTO> toSelected = new ArrayList<SoftwareUnitDTO>(); protected List<DependencyDTO> filteredList; private AnalyseUIController dataControl; public DependencyPanel(AnalyseTaskControl atc) { dataControl = new AnalyseUIController(atc); createLayout(); dependencyTable = new HelpableJTable(); tableModel = new DependencyTableModel(new ArrayList<DependencyDTO>(), dataControl); dependencyTable.setModel(tableModel); dependencyScrollPane.setViewportView(dependencyTable); dependencyTable.setBackground(PANELBACKGROUND); dependencyTable.setAutoCreateRowSorter(true); dependencyTable.addMouseListener(new MouseListener(){ @Override public void mouseClicked(MouseEvent arg0) { if(arg0.getClickCount() >= 2){ int row = dependencyTable.getSelectedRow(); String cls = dependencyTable.getValueAt(row, 0).toString(); int lineNumber = (int) dependencyTable.getValueAt(row, 3); dataControl.getControlService().displayErrorInFile(cls, lineNumber, new Severity("test", Color.LIGHT_GRAY)); } } @Override public void mouseEntered(MouseEvent arg0) {} @Override public void mouseExited(MouseEvent arg0) {} @Override public void mousePressed(MouseEvent arg0) {} @Override public void mouseReleased(MouseEvent arg0) {} }); initialiseTrees(); setLayout(theLayout); } private void initialiseTrees() { SoftwareUnitDTO rootModule = new SoftwareUnitDTO("", "", "", ""); DefaultMutableTreeNode rootTo = new DefaultMutableTreeNode(rootModule); DefaultMutableTreeNode rootFrom = new DefaultMutableTreeNode(rootModule); this.fromModuleTree = new HelpableJTree(rootTo); createTreeLayout(fromModuleTree); fromModuleTree.addTreeSelectionListener(this); this.toModuleTree = new HelpableJTree(rootFrom); createTreeLayout(toModuleTree); toModuleTree.addTreeSelectionListener(this); List<SoftwareUnitDTO> rootModules = dataControl.getRootModules(); for (SoftwareUnitDTO module : rootModules) { DefaultMutableTreeNode toNode = new DefaultMutableTreeNode(module); DefaultMutableTreeNode fromNode = new DefaultMutableTreeNode(module); rootTo.add(toNode); fillNode(toNode); rootFrom.add(fromNode); fillNode(fromNode); } this.expandLeaf(toModuleTree, 1); this.expandLeaf(fromModuleTree, 1); fromModuleScrollPane.setBackground(PANELBACKGROUND); fromModuleScrollPane.setViewportView(fromModuleTree); toModuleScrollPane.setBackground(PANELBACKGROUND); toModuleScrollPane.setViewportView(toModuleTree); } 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); } 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 expandLeaf(JTree tree, int level) { for (int i = 0; i < level; i++) { tree.expandRow(i); } } private void createLayout() { fromModuleScrollPane = new HelpableJScrollPane(); fromModuleScrollPane.setBorder(new TitledBorder(dataControl.translate("FromModuleTreeTitle"))); fromModuleScrollPane.setBackground(PANELBACKGROUND); toModuleScrollPane = new HelpableJScrollPane(); toModuleScrollPane.setBorder(new TitledBorder(dataControl.translate("ToModuleTreeTitle"))); toModuleScrollPane.setBackground(PANELBACKGROUND); numberOfDependenciesPanel = new JPanel(); FlowLayout flowLayout1 = (FlowLayout) numberOfDependenciesPanel.getLayout(); flowLayout1.setAlignment(FlowLayout.LEFT); numberOfDependenciesPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); numberOfDependenciesPanel.setBorder(new TitledBorder(dataControl.translate("NumberOfDependencies"))); totalDependenciesLabel = new JLabel(); numberOfDependenciesPanel.add(totalDependenciesLabel); totalDependenciesNumber = new JLabel("0"); numberOfDependenciesPanel.add(totalDependenciesNumber); filterPanel = new JPanel(); FlowLayout flowLayout2 = (FlowLayout) filterPanel.getLayout(); flowLayout2.setAlignment(FlowLayout.LEFT); filterPanel.setComponentOrientation(ComponentOrientation.LEFT_TO_RIGHT); filterPanel.setBorder(new TitledBorder(dataControl.translate("AnalyseDependencyFilter"))); directFilterBox = new JCheckBox(dataControl.translate("ShowDirectDependencies")); directFilterBox.addActionListener(this); directFilterBox.setSelected(true); directFilterBox.setHorizontalAlignment(SwingConstants.LEFT); filterPanel.add(directFilterBox); indirectFilterBox = new JCheckBox(dataControl.translate("ShowIndirectDependencies")); indirectFilterBox.addActionListener(this); indirectFilterBox.setSelected(true); indirectFilterBox.setHorizontalAlignment(SwingConstants.LEFT); filterPanel.add(indirectFilterBox); dependencyScrollPane = new HelpableJScrollPane(); dependencyScrollPane.setBorder(new TitledBorder(dataControl.translate("DependencyTableTitle"))); dependencyScrollPane.setBackground(PANELBACKGROUND); theLayout = new GroupLayout(this); theLayout.setHorizontalGroup( theLayout.createParallelGroup(Alignment.TRAILING) .addGroup(theLayout.createSequentialGroup() .addContainerGap() .addGroup(theLayout.createParallelGroup(Alignment.TRAILING) .addComponent(dependencyScrollPane, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 497, Short.MAX_VALUE) .addGroup(theLayout.createSequentialGroup() .addGroup(theLayout.createParallelGroup(Alignment.TRAILING) .addComponent(fromModuleScrollPane, GroupLayout.DEFAULT_SIZE, 234, Short.MAX_VALUE) .addComponent(numberOfDependenciesPanel, GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addGap(18) .addGroup(theLayout.createParallelGroup(Alignment.TRAILING) .addComponent(toModuleScrollPane, GroupLayout.DEFAULT_SIZE, 245, Short.MAX_VALUE) .addComponent(filterPanel, GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)))) .addContainerGap())); theLayout.setVerticalGroup( theLayout.createParallelGroup(Alignment.LEADING) .addGroup(theLayout.createSequentialGroup() .addContainerGap() .addGroup(theLayout.createParallelGroup(Alignment.LEADING) .addComponent(fromModuleScrollPane, GroupLayout.DEFAULT_SIZE, 235, Short.MAX_VALUE) .addComponent(toModuleScrollPane, GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(theLayout.createParallelGroup(Alignment.LEADING) .addComponent(numberOfDependenciesPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE) .addComponent(filterPanel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)) .addPreferredGap(ComponentPlacement.RELATED) .addComponent(dependencyScrollPane, GroupLayout.DEFAULT_SIZE, 207, Short.MAX_VALUE) .addContainerGap())); } @Override public void valueChanged(TreeSelectionEvent e) { if (e.getSource() == fromModuleTree) { DefaultMutableTreeNode selected = (DefaultMutableTreeNode) fromModuleTree.getLastSelectedPathComponent(); if (selected != null) { SoftwareUnitDTO selectedModule = (SoftwareUnitDTO) selected.getUserObject(); fromSelected.clear(); fromSelected.add(selectedModule); } } else if (e.getSource() == toModuleTree) { DefaultMutableTreeNode selected = (DefaultMutableTreeNode) toModuleTree.getLastSelectedPathComponent(); if (selected != null) { SoftwareUnitDTO selectedModule = (SoftwareUnitDTO) selected.getUserObject(); toSelected.clear(); toSelected.add(selectedModule); } } updateDependencyTable(indirectFilterBox.isSelected(), directFilterBox.isSelected()); } @Override public void actionPerformed(ActionEvent event) { if (event.getSource() == indirectFilterBox || event.getSource() == directFilterBox) { updateDependencyTable(indirectFilterBox.isSelected(), directFilterBox.isSelected()); } } private void updateDependencyTable(boolean indirect, boolean direct){ filteredList = new ArrayList<DependencyDTO>(); List<DependencyDTO> allDependencies = dataControl.listDependencies(fromSelected, toSelected); if (indirect && direct) { filteredList.addAll(allDependencies); } else { for (DependencyDTO dependency : allDependencies) { if(indirect){ if(dependency.isIndirect) filteredList.add(dependency); } if(direct){ if(!dependency.isIndirect) filteredList.add(dependency); } } } dependencyTable.setModel(new DependencyTableModel(filteredList, dataControl)); setColumnWidths(); dependencyTable.setAutoCreateRowSorter(true); dependencyTable.repaint(); totalDependenciesNumber.setText(filteredList.size() + ""); numberOfDependenciesPanel.repaint(); } public void reload() { updateDependencyTable(indirectFilterBox.isSelected(), directFilterBox.isSelected()); fromModuleScrollPane.setBorder(new TitledBorder(dataControl.translate("FromModuleTreeTitle"))); toModuleScrollPane.setBorder(new TitledBorder(dataControl.translate("ToModuleTreeTitle"))); totalDependenciesLabel.setText(ServiceProvider.getInstance().getLocaleService().getTranslatedString("NumberOfDependenciesBetweenSelectedModules") + ":"); totalDependenciesNumber.setText(filteredList.size() + ""); filterPanel.setBorder(new TitledBorder(dataControl.translate("AnalyseDependencyFilter"))); indirectFilterBox.setText(dataControl.translate("ShowIndirectDependencies")); directFilterBox.setText(dataControl.translate("ShowDirectDependencies")); dependencyScrollPane.setBorder(new TitledBorder(dataControl.translate("DependencyTableTitle"))); toModuleScrollPane.repaint(); fromModuleScrollPane.repaint(); numberOfDependenciesPanel.repaint(); filterPanel.repaint(); dependencyScrollPane.repaint(); this.repaint(); } protected void setColumnWidths() { TableColumn column = null; for (int i = 0; i < dependencyTable.getColumnCount(); i++) { column = dependencyTable.getColumnModel().getColumn(i); if (i == 0) { column.setPreferredWidth(350); // From } else if (i == 1) { column.setPreferredWidth(350); // To } else if (i == 2) { column.setPreferredWidth(70); // Type } else if (i == 3) { column.setPreferredWidth(50); // Line } else if (i == 4) { column.setPreferredWidth(50); // Direct } } } }