package de.fau.osr.gui.View; import java.awt.BorderLayout; import java.awt.Font; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import javax.swing.AbstractListModel; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.LayoutStyle.ComponentPlacement; import javax.swing.ListModel; import javax.swing.ScrollPaneConstants; import javax.swing.border.EmptyBorder; import de.fau.osr.bl.RequirementsTraceabilityMatrixByImpact; import de.fau.osr.gui.View.Renderer.RowHeaderRenderer; import de.fau.osr.gui.util.RequirementsTraceabilityByImpactTableModel; import de.fau.osr.gui.util.UiTools; import de.fau.osr.util.matrix.MatrixTools; /** * This class is the Panel for showing the requirement traceability by impact value * This panel can be reused with different frames and panels * @author Gayathery * */ public class TraceabilityMatrixByImpactViewHandlerPanel extends JPanel { private JTable table; private JScrollPane scrollPane; private RequirementsTraceabilityMatrixByImpact requirementsTraceabilityMatrixByImpact; private JButton matrixButton; JButton btnToCsv; JButton btnToPdf; /** * Launch the application. */ /* public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { TraceabilityMatrixByImpactViewHandler frame = new TraceabilityMatrixByImpactViewHandler(); frame.initTable(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } */ /** * Create the panel. */ public TraceabilityMatrixByImpactViewHandlerPanel() { final String title = "ReqTracker - Traceability Matrix by Impact"; setBounds(100, 100, 999, 686); setBorder(new EmptyBorder(5, 5, 5, 5)); scrollPane = new JScrollPane(); scrollPane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS); JLabel lblRequirements = new JLabel("Requirements"); lblRequirements.setFont(new Font("Tahoma", Font.BOLD, 11)); JLabel lblFiles = new JLabel("Files"); lblFiles.setFont(new Font("Tahoma", Font.BOLD, 11)); btnToCsv = new JButton("To CSV"); btnToCsv.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String filename = getFileName(MatrixTools.ExportType.CSV); boolean result = MatrixTools.SaveMatrixToCsv(requirementsTraceabilityMatrixByImpact, UiTools.chooseFile(filename)); UiTools.dialogStatusMessage(result, filename); } }); btnToPdf = new JButton("To PDF"); btnToPdf.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String filename = getFileName(MatrixTools.ExportType.PDF); boolean result = MatrixTools.SaveMatrixToPdf(requirementsTraceabilityMatrixByImpact, UiTools.chooseFile(filename),title); UiTools.dialogStatusMessage(result, filename); } }); matrixButton = new JButton("Generate Traceability Matrix"); GroupLayout gl_contentPane = new GroupLayout(this); gl_contentPane.setHorizontalGroup( gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(gl_contentPane.createSequentialGroup() .addContainerGap() .addComponent(lblFiles) .addPreferredGap(ComponentPlacement.RELATED) .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(gl_contentPane.createSequentialGroup() .addComponent(matrixButton) .addGap(18) .addComponent(btnToCsv) .addGap(18) .addComponent(btnToPdf) .addGap(158) .addComponent(lblRequirements) .addContainerGap()) .addGroup(gl_contentPane.createSequentialGroup() .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 901, Short.MAX_VALUE) .addGap(33)))) ); gl_contentPane.setVerticalGroup( gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(gl_contentPane.createSequentialGroup() .addGap(20) .addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING) .addGroup(gl_contentPane.createSequentialGroup() .addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE) .addComponent(matrixButton, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btnToCsv, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(btnToPdf, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(lblRequirements)) .addGap(18) .addComponent(scrollPane, GroupLayout.DEFAULT_SIZE, 572, Short.MAX_VALUE)) .addGroup(gl_contentPane.createSequentialGroup() .addGap(183) .addComponent(lblFiles))) .addGap(5)) ); setLayout(gl_contentPane); } public void setInternalGenerationVisibility(Boolean value){ matrixButton.setVisible(value); } public void eraseTable(){ if(table != null) { table.setVisible(false); table.getTableHeader().setVisible(false); scrollPane.getRowHeader().setVisible(false); } } public void setInternalGenerationEnable(Boolean value){ matrixButton.setEnabled(value); } public void setExportEnable(Boolean value){ btnToCsv.setEnabled(value); btnToPdf.setEnabled(value); } public void setRequirementsTraceabilityMatrix(RequirementsTraceabilityMatrixByImpact requirementsTraceabilityMatrixByImpact){ this.requirementsTraceabilityMatrixByImpact = requirementsTraceabilityMatrixByImpact; } /** * Method which initialises the table with data */ public void initTable() { final RequirementsTraceabilityMatrixByImpact traceabilityMatrixByImpact = this.requirementsTraceabilityMatrixByImpact; table = new JTable(new RequirementsTraceabilityByImpactTableModel(traceabilityMatrixByImpact)){ @Override public String getToolTipText(java.awt.event.MouseEvent event){ String toolTipText = null; java.awt.Point p = event.getPoint(); int rowIndex = rowAtPoint(p); int columIndex = columnAtPoint(p); try { String requirement = traceabilityMatrixByImpact.getRequirements().get(columIndex); String file = traceabilityMatrixByImpact.getFiles().get(rowIndex); StringBuilder toolTipTextBuilder = new StringBuilder(); toolTipTextBuilder.append("<html>"); toolTipTextBuilder.append("<font size=\"3\" color=\"green\">"); toolTipTextBuilder.append("<b>"); toolTipTextBuilder.append("Requirement : "+requirement ); toolTipTextBuilder.append("<br>"); toolTipTextBuilder.append("File : "+file); toolTipTextBuilder.append("</b>"); toolTipTextBuilder.append("</font>"); toolTipTextBuilder.append("</html>"); toolTipText = toolTipTextBuilder.toString(); } catch (RuntimeException e1) { //catch null pointer exception if mouse is over an empty line } return toolTipText; } }; table.setCellSelectionEnabled(true); Font columnHeaderFont = new Font("Arial",Font.BOLD,10); table.getTableHeader().setFont(columnHeaderFont); table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); scrollPane.setViewportView(table); ListModel<String> listModel = new AbstractListModel<String>() { public int getSize() { return traceabilityMatrixByImpact.getFiles().size(); } public String getElementAt(int index) { File filePath = new File(traceabilityMatrixByImpact.getFiles().get(index)); return filePath.getName(); } }; JList<String> rowHeader = new JList<>(listModel); rowHeader.setFixedCellWidth(-1); rowHeader.setFixedCellHeight(table.getRowHeight()); rowHeader.setCellRenderer(new RowHeaderRenderer<String>(table)); scrollPane.setRowHeaderView(rowHeader); } public String getFileName(MatrixTools.ExportType exportType){ String prefix = "TraceabilityMatrix"; return MatrixTools.generateFileName(exportType,prefix, requirementsTraceabilityMatrixByImpact.getRepositoryName(),'_'); } public void setImpactAction(Runnable action) { if(matrixButton.getActionListeners().length == 0){ matrixButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { Thread tr = new Thread(action); tr.start(); } }); } } }