package husacct.validate.presentation; import husacct.ServiceProvider; import husacct.common.enums.States; import husacct.common.help.presentation.HelpableJInternalFrame; import husacct.common.locale.ILocaleService; import husacct.control.ILocaleChangeListener; import husacct.control.presentation.util.LoadingDialog; import husacct.control.task.threading.ThreadWithLoader; import husacct.validate.domain.configuration.ConfigurationServiceImpl; import husacct.validate.domain.validation.Severity; import husacct.validate.domain.validation.Violation; import husacct.validate.presentation.browseViolations.FilterPanel; import husacct.validate.presentation.browseViolations.StatisticsPanel; import husacct.validate.presentation.browseViolations.ViolationDetailsPanel; import husacct.validate.presentation.browseViolations.ViolationPerRulePanel; import husacct.validate.presentation.tableModels.FilterViolationsObserver; import husacct.validate.presentation.tableModels.ViolationDataModel; import husacct.validate.presentation.tableModels.ViolationTable; import husacct.validate.presentation.threadTasks.CheckConformanceTask; import husacct.validate.task.TaskServiceImpl; import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Locale; import java.util.Observable; import java.util.Observer; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTabbedPane; import javax.swing.SwingConstants; import javax.swing.UIManager; import javax.swing.ListSelectionModel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import org.apache.log4j.Logger; public class BrowseViolations extends HelpableJInternalFrame implements ILocaleChangeListener, FilterViolationsObserver, Observer { private static final long serialVersionUID = 4912981274532255799L; private final TaskServiceImpl taskServiceImpl; private ILocaleService localeService = ServiceProvider.getInstance().getLocaleService(); private JTabbedPane tabPanel; // Violations per Rule View ViolationPerRulePanel violationsPerRulePanel; // All Violations View private JPanel allViolationsPanel; private JScrollPane statisticsScrollPane, violationsTableScrollPane, informationScrollPane; private ViolationTable violationTable; private ViolationDataModel violationTableModel; private FilterPanel filterPane; private StatisticsPanel statisticsPanel; private ViolationDetailsPanel violationInformationPanel; private List<Violation> shownViolationsInAllViolationsPanel; private Logger logger = Logger.getLogger(BrowseViolations.class); public BrowseViolations(TaskServiceImpl taskServiceImpl, ConfigurationServiceImpl configuration) { this.taskServiceImpl = taskServiceImpl; initComponents(); createBaseLayout(); addListeneners(); loadViolationsTableModel(); loadText(); } private void initComponents() { // Tab All Violations allViolationsPanel = new JPanel(); filterPane = new FilterPanel(this, taskServiceImpl); violationsTableScrollPane = new JScrollPane(); violationInformationPanel = new ViolationDetailsPanel(taskServiceImpl); informationScrollPane = new JScrollPane(violationInformationPanel); statisticsScrollPane = new JScrollPane(); statisticsPanel = new StatisticsPanel(); violationTable = new ViolationTable(); statisticsScrollPane.setBorder(null); statisticsScrollPane.setViewportView(statisticsPanel); violationsTableScrollPane.setViewportView(violationTable); // Tab ViolationsPerRule violationsPerRulePanel = new ViolationPerRulePanel(taskServiceImpl); // TabbedPanel tabPanel = new JTabbedPane(SwingConstants.TOP); tabPanel.setBackground(UIManager.getColor("Panel.background")); getContentPane().add(tabPanel, BorderLayout.CENTER); tabPanel.addTab(localeService.getTranslatedString("ViolationsPerRuleTabTitle"), null, violationsPerRulePanel, null); tabPanel.addTab(localeService.getTranslatedString("AllViolationsTabTitle"), null, allViolationsPanel, null); } private void createBaseLayout() { createAllViolationsPaneLayout(); //createHistoryPaneLayout(); Disabled in version 3.2. See for removed code parts class HistoryPanel. } private void createAllViolationsPaneLayout() { GroupLayout rightSideGroupLayout = new GroupLayout(allViolationsPanel); rightSideGroupLayout.setHorizontalGroup( rightSideGroupLayout.createParallelGroup(Alignment.TRAILING) .addGroup(rightSideGroupLayout.createSequentialGroup() .addContainerGap() .addGroup(rightSideGroupLayout.createParallelGroup(Alignment.TRAILING) .addGroup(rightSideGroupLayout.createSequentialGroup() .addComponent(statisticsScrollPane, 507, 507, Short.MAX_VALUE) .addGap(10) .addComponent(filterPane, 300, 300, Short.MAX_VALUE)) .addComponent(violationsTableScrollPane, GroupLayout.DEFAULT_SIZE, 817, Short.MAX_VALUE) .addComponent(informationScrollPane)) .addContainerGap())); rightSideGroupLayout.setVerticalGroup( rightSideGroupLayout.createParallelGroup(Alignment.LEADING) .addGroup(rightSideGroupLayout.createSequentialGroup() .addContainerGap() .addGroup(rightSideGroupLayout.createParallelGroup(Alignment.LEADING) .addComponent(statisticsScrollPane, 85, 85, 85) .addComponent(filterPane, 85, 85, 85)) .addGap(10) .addComponent(violationsTableScrollPane, GroupLayout.DEFAULT_SIZE, 450, Short.MAX_VALUE) .addGap(10) .addComponent(informationScrollPane, 150, 150, 150) )); allViolationsPanel.setLayout(rightSideGroupLayout); } private void addListeneners() { violationTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent arg0) { violationInformationPanel.update(arg0, violationTable, shownViolationsInAllViolationsPanel); } }); } @Override public void update(Observable o, Object arg) { reloadViolationPanelsAfterChange(); filterPane.loadAfterChange(); } @Override public void update(Locale newLocale) { reloadViolationPanelsAfterChange(); filterPane.loadAfterChange(); } @Override public void updateViolationTables() { violationsPerRulePanel.reload(); reloadViolationPanelsAfterChange(); } public void reloadViolationPanelsAfterChange() { violationsPerRulePanel.reload(); reloadViolations(); fillViolationsTable(shownViolationsInAllViolationsPanel); loadViolationDetailsPanel(); updateFilterValues(); enableAllSubComponents(); } public void reloadViolations() { shownViolationsInAllViolationsPanel = taskServiceImpl.getAllViolations().getValue(); shownViolationsInAllViolationsPanel = filterPane.filterViolationsOnDirectOrIndirect(shownViolationsInAllViolationsPanel); if (filterPane.getApplyFilter().isSelected()) { shownViolationsInAllViolationsPanel = filterViolations(shownViolationsInAllViolationsPanel); } } public void updateFilterValues() { filterPane.loadAfterChange(); } public final void loadText() { violationInformationPanel.loadGuiText(); statisticsPanel.loadAfterChange(); setTitle(localeService.getTranslatedString("BrowseViolations")); tabPanel.setTitleAt(1, localeService.getTranslatedString("AllViolationsTabTitle")); tabPanel.setTitleAt(0, localeService.getTranslatedString("ViolationsPerRuleTabTitle")); } private void loadViolationsTableModel() { violationTableModel = new ViolationDataModel(); violationTable.setFillsViewportHeight(true); violationTable.setModel(violationTableModel); violationTable.setAutoCreateRowSorter(true); violationTable.getTableHeader().setReorderingAllowed(false); violationTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); violationTable.setColumnWidths(); } public void fillViolationsTable(List<Violation> violations) { violationTable.setRowSorter(null); violationTable.setAutoCreateRowSorter(false); violationTable.clearSelection(); shownViolationsInAllViolationsPanel = violations; violationTableModel.setData(violations); violationTable.revalidate(); violationTable.setAutoCreateRowSorter(true); } public void loadViolationDetailsPanel() { int violationsSize; List<Severity> severities; violationsSize = taskServiceImpl.getAllViolations().getValue().size(); severities = taskServiceImpl.getAllSeverities(); statisticsPanel.loadStatistics(taskServiceImpl.getViolationsPerSeverity(shownViolationsInAllViolationsPanel, severities), violationsSize, shownViolationsInAllViolationsPanel.size()); statisticsPanel.repaint(); } public List<Violation> filterViolations(List<Violation> violations) { return taskServiceImpl.applyFilterViolations(violations); } public void applyFilterChanged(ActionEvent e) { final Thread updateThread = new Thread() { @Override public void run() { try { Thread.sleep(1); fillViolationsTable(shownViolationsInAllViolationsPanel); loadViolationDetailsPanel(); } catch (InterruptedException e) { logger.debug(e.getMessage()); } } }; ThreadWithLoader loadingThread = ServiceProvider.getInstance().getControlService().getThreadWithLoader(localeService.getTranslatedString("FilteringLoading"), updateThread); loadingThread.run(); } public void validateNow() { boolean isAnalysing = ServiceProvider.getInstance().getControlService().getStates().contains(States.ANALYSING); boolean isValidating = ServiceProvider.getInstance().getControlService().getStates().contains(States.VALIDATING); if(!isAnalysing && !isValidating){ ThreadWithLoader validateThread = ServiceProvider.getInstance().getControlService().getThreadWithLoader(localeService.getTranslatedString("ValidatingLoading"), new CheckConformanceTask(this)); // Previous to version 3.2: buttonSaveInHistory i.s.o. new JButton(). LoadingDialog loadingDialog = validateThread.getLoadingDialog(); if (loadingDialog != null) { loadingDialog.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { ServiceProvider.getInstance().getControlService().setValidating(false); logger.info("Stopping Thread"); } }); } disableAllSubComponents(); validateThread.run(); } else { //TODO make an error frame that validating or analysing is already running if (isAnalysing) { logger.warn(" Validate not started since state is: " + States.ANALYSING.toString()); } if (isValidating) { logger.warn(" Validate not started since state is: " + States.VALIDATING.toString()); } } } public void enableAllSubComponents() { for(Component component : getComponents(this)) { component.setEnabled(true); } } private void disableAllSubComponents() { for(Component component : getComponents(this)) { component.setEnabled(false); } } private Component[] getComponents(Component container) { ArrayList<Component> list = null; try { list = new ArrayList<Component>(Arrays.asList( ((Container) container).getComponents())); for (int index = 0; index < list.size(); index++) { for (Component currentComponent : getComponents(list.get(index))) { list.add(currentComponent); } } } catch (ClassCastException e) { list = new ArrayList<Component>(); } return list.toArray(new Component[list.size()]); } }