Author: [log in to unmask] Date: Mon Mar 30 11:59:38 2015 New Revision: 2627 Log: Merge in changes from trunk. Modified: java/branches/monitoring-app-dev/ (props changed) java/branches/monitoring-app-dev/pom.xml java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/LogTable.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MenuBar.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplication.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/PlotInfoPanel.java Modified: java/branches/monitoring-app-dev/pom.xml ============================================================================= --- java/branches/monitoring-app-dev/pom.xml (original) +++ java/branches/monitoring-app-dev/pom.xml Mon Mar 30 11:59:38 2015 @@ -140,7 +140,7 @@ <version>3.4.11</version> <exclusions> <exclusion> - <groupId>org.jdom</groupId> + <groupId>jdom</groupId> <artifactId>jdom</artifactId> </exclusion> <exclusion> @@ -150,4 +150,4 @@ </exclusions> </dependency> </dependencies> -</project> +</project> Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java Mon Mar 30 11:59:38 2015 @@ -135,12 +135,10 @@ MonitoringApplication.logger.config("set steering " + steering + " with type " + (steeringType == SteeringType.RESOURCE ? "RESOURCE" : "FILE")); try { - // Create and the job manager. The conditions manager is instantiated from this call but - // not configured. + // Create the job manager. A new conditions manager is instantiated from this call but not configured. sessionState.jobManager = new JobManager(); - // Add conditions listeners after new database conditions manager is initialized from - // job manager. + // Add conditions listeners after new database conditions manager is initialized from the job manager. DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); for (ConditionsListener conditionsListener : sessionState.conditionsListeners) { logger.config("adding conditions listener " + conditionsListener.getClass().getName()); @@ -206,7 +204,7 @@ try { // Create a new instance of the builder class. - sessionState.eventBuilder = (LCSimEventBuilder) Class.forName(eventBuilderClassName).newInstance(); + sessionState.eventBuilder = (LCSimEventBuilder) Class.forName(eventBuilderClassName, true, Thread.currentThread().getContextClassLoader()).newInstance(); } catch (Exception e) { throw new RuntimeException("Failed to create LCSimEventBuilder.", e); } @@ -502,13 +500,13 @@ createEtConnection(); // Add an attachment that listens for DAQ configuration changes via physics SYNC events. - createSyncStation(); + //createSyncStation(); // Add an attachment which listens for EPICs events with scalar data. //createEpicsStation(); // Add an attachment that listens for PRESTART events. - createPreStartStation(); + //createPreStartStation(); } catch (Exception e) { throw new IOException(e); Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/LogTable.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/LogTable.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/LogTable.java Mon Mar 30 11:59:38 2015 @@ -38,8 +38,12 @@ setModel(model); sorter = new TableRowSorter<LogRecordModel>(model); sorter.setRowFilter(new LevelFilter()); - this.getColumnModel().getColumn(0).setCellRenderer(new DateRenderer()); + getColumnModel().getColumn(0).setCellRenderer(new DateRenderer()); setRowSorter(sorter); + getColumnModel().getColumn(0).setPreferredWidth(142); + getColumnModel().getColumn(0).setMaxWidth(142); + getColumnModel().getColumn(1).setPreferredWidth(60); + getColumnModel().getColumn(1).setMaxWidth(60); setEnabled(false); } @@ -105,7 +109,7 @@ case 0: return Date.class; case 1: - return String.class; + return Level.class; case 2: return String.class; default: Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MenuBar.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MenuBar.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MenuBar.java Mon Mar 30 11:59:38 2015 @@ -98,12 +98,12 @@ plotsMenu.setMnemonic(KeyEvent.VK_P); add(plotsMenu); - JMenuItem savePlotsItem = new JMenuItem("Save Plots ..."); + JMenuItem savePlotsItem = new JMenuItem("Save plots ..."); savePlotsItem.setMnemonic(KeyEvent.VK_S); savePlotsItem.setActionCommand(Commands.SAVE_PLOTS); savePlotsItem.addActionListener(listener); savePlotsItem.setEnabled(true); - savePlotsItem.setToolTipText("Save plots to AIDA file"); + savePlotsItem.setToolTipText("Save all plots to a file"); plotsMenu.add(savePlotsItem); JMenuItem clearPlotsItem = new JMenuItem("Clear plots"); Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplication.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplication.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplication.java Mon Mar 30 11:59:38 2015 @@ -48,6 +48,7 @@ import org.hps.monitoring.application.util.TableExporter; import org.hps.monitoring.plotting.MonitoringAnalysisFactory; import org.hps.monitoring.plotting.MonitoringPlotFactory; +import org.hps.monitoring.plotting.ExportPdf; import org.hps.monitoring.subsys.SystemStatus; import org.hps.monitoring.subsys.SystemStatusRegistry; import org.hps.record.composite.CompositeRecordProcessor; @@ -55,6 +56,7 @@ import org.lcsim.conditions.ConditionsListener; import org.lcsim.util.Driver; import org.lcsim.util.aida.AIDA; +import org.lcsim.util.aida.PDFWriter; import org.lcsim.util.log.DefaultLogFormatter; /** @@ -151,9 +153,9 @@ /** * Instantiate and show the monitoring application with the given configuration. - * @param configuration The Configuration object containing application settings. - */ - MonitoringApplication(Configuration configuration) { + * @param userConfiguration The Configuration object containing application settings. + */ + MonitoringApplication(Configuration userConfiguration) { try { @@ -205,14 +207,15 @@ // Setup AIDA plotting and connect it to the GUI. setupAida(); + // TODO: Make sure the configuration loading here is working properly!!! + // Always load the default configuration first. this.configuration = new Configuration(DEFAULT_CONFIGURATION); loadConfiguration(this.configuration); // Overlay the user configuration if one was specified. - if (configuration != null) { - this.configuration = configuration; - loadConfiguration(this.configuration); + if (userConfiguration != null) { + loadConfiguration(userConfiguration); } // Enable the GUI now that initialization is complete. @@ -271,7 +274,7 @@ */ public void actionPerformed(ActionEvent e) { - logger.finest("actionPerformed - " + e.getActionCommand()); + //logger.finest("actionPerformed - " + e.getActionCommand()); String command = e.getActionCommand(); if (Commands.CONNECT.equals(command)) { @@ -356,15 +359,17 @@ */ void loadConfiguration(Configuration configuration) { + this.configuration = configuration; + // HACK: Clear data source combo box for new config. frame.dataSourceComboBox.removeAllItems(); // Set the Configuration on the ConfigurationModel which will trigger all the PropertyChangelListeners. - configurationModel.setConfiguration(configuration); - if (configuration.getFile() != null) - logger.config("loaded config from file " + configuration.getFile().getPath()); + configurationModel.setConfiguration(this.configuration); + if (this.configuration.getFile() != null) + logger.config("loaded config from file " + this.configuration.getFile().getPath()); else - logger.config("loaded config from resource " + configuration.getResourcePath()); + logger.config("loaded config from resource " + this.configuration.getResourcePath()); } /** @@ -479,19 +484,41 @@ } /** - * Save AIDA plots to a file using a file chooser. + * Save plots to an AIDA, ROOT or PDF file using a file chooser. */ void savePlots() { JFileChooser fc = new JFileChooser(); + fc.addChoosableFileFilter(new FileNameExtensionFilter("ROOT file", "root")); + FileFilter filter = new FileNameExtensionFilter("AIDA file", "aida"); + fc.addChoosableFileFilter(filter); + fc.addChoosableFileFilter(new FileNameExtensionFilter("PDF file", "pdf")); + fc.setAcceptAllFileFilterUsed(false); + fc.setFileSelectionMode(JFileChooser.FILES_ONLY); + fc.setFileFilter(filter); int r = fc.showSaveDialog(frame); if (r == JFileChooser.APPROVE_OPTION) { - File fileName = fc.getSelectedFile(); - try { - AIDA.defaultInstance().saveAs(fileName); - logger.info("saved plots to " + fileName); - DialogUtil.showInfoDialog(frame, "Plots Saved", "Plots were successfully saved to AIDA file."); - } catch (IOException e) { - errorHandler.setError(e).setMessage("Error Saving Plots").printStackTrace().log().showErrorDialog(); + File selectedFile = fc.getSelectedFile(); + if (!selectedFile.exists()) { + String fileName = fc.getSelectedFile().getAbsolutePath(); + String extension = ((FileNameExtensionFilter) fc.getFileFilter()).getExtensions()[0]; + if (!fileName.endsWith(".aida") && !fileName.endsWith(".root") && !fileName.endsWith(".pdf")) { + fileName += "." + extension; + } + try { + if (extension.equals("pdf")) { + // Write to a single PDF file. + ExportPdf.write(MonitoringPlotFactory.getPlotterRegistry().getPlotters(), fileName); + } else { + // Save plot object data to AIDA or ROOT file. + AIDA.defaultInstance().saveAs(fileName); + } + logger.info("saved plots to " + fileName); + DialogUtil.showInfoDialog(frame, "Plots Saved", "Plots were successfully saved to " + '\n' + fileName); + } catch (IOException e) { + errorHandler.setError(e).setMessage("Error Saving Plots").printStackTrace().log().showErrorDialog(); + } + } else { + DialogUtil.showErrorDialog(frame, "File Exists", "Selected file already exists."); } } } @@ -586,8 +613,7 @@ int r = fc.showDialog(frame, "Load ..."); if (r == JFileChooser.APPROVE_OPTION) { File f = fc.getSelectedFile(); - configuration = new Configuration(f); - loadConfiguration(configuration); + loadConfiguration(new Configuration(f)); logger.info("loaded configuration from file: " + f.getPath()); DialogUtil.showInfoDialog(frame, "Settings Loaded", "Settings were loaded successfully."); } @@ -630,7 +656,6 @@ /** * Save a screenshot to a file using a file chooser. */ - // FIXME: This might need to be on a new thread to allow the GUI to redraw w/o chooser visible. void saveScreenshot() { JFileChooser fc = new JFileChooser(); fc.setAcceptAllFileFilterUsed(false); Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java Mon Mar 30 11:59:38 2015 @@ -135,12 +135,12 @@ // Create the right panel vertical split pane for displaying plots and their information and statistics. rightSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, plotPanel, plotInfoPanel); - rightSplitPane.setResizeWeight(0.7); + rightSplitPane.setDividerLocation(680); rightPanel.add(rightSplitPane, BorderLayout.CENTER); // Create the main horizontal split pane for dividing the left and right panels. mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel); - mainSplitPane.setDividerLocation((int) (PIXEL_WIDTH_MAX * 0.4)); + mainSplitPane.setDividerLocation(600); bottomPanel.add(mainSplitPane, BorderLayout.CENTER); // Create the menu bar. Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/PlotInfoPanel.java ============================================================================= --- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/PlotInfoPanel.java (original) +++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/PlotInfoPanel.java Mon Mar 30 11:59:38 2015 @@ -15,7 +15,6 @@ import hep.aida.ref.function.FunctionDispatcher; import hep.aida.ref.function.FunctionListener; -import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.FlowLayout; @@ -26,7 +25,7 @@ import java.util.Timer; import java.util.TimerTask; -import javax.swing.BorderFactory; +import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; import javax.swing.JComboBox; @@ -53,11 +52,11 @@ PlotterRegion currentRegion; Object currentObject; - static final int INSET_SIZE = 5; - static final int BORDER_SIZE = 10; - + + static final int MAX_ROWS = 13; + static final int MIN_WIDTH = 400; + static final int MIN_HEIGHT = 300; static final String[] COLUMN_NAMES = { "Field", "Value" }; - static final String PLOT_SELECTED = "PlotSelected"; Timer timer = new Timer(); @@ -68,20 +67,32 @@ @SuppressWarnings("unchecked") PlotInfoPanel() { - setLayout(new FlowLayout(FlowLayout.LEFT)); + setLayout(new FlowLayout(FlowLayout.CENTER)); JPanel leftPanel = new JPanel(); leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.PAGE_AXIS)); - - JPanel buttonPanel = new JPanel(); + leftPanel.setPreferredSize(new Dimension(MIN_WIDTH, MIN_HEIGHT)); + + Dimension filler = new Dimension(0, 10); + + // Save button. saveButton = new JButton("Save Plots ..."); saveButton.setActionCommand(Commands.SAVE_SELECTED_PLOTS); - buttonPanel.add(saveButton); - //c.anchor = GridBagConstraints.NORTHWEST; - leftPanel.add(buttonPanel); - - plotComboBox = new JComboBox<Object>(); + saveButton.setAlignmentX(CENTER_ALIGNMENT); + leftPanel.add(saveButton); + + leftPanel.add(new Box.Filler(filler, filler, filler)); + + // Combo box for selecting plotted object. + plotComboBox = new JComboBox<Object>() { + public Dimension getMaximumSize() { + Dimension max = super.getMaximumSize(); + max.height = getPreferredSize().height; + return max; + } + }; plotComboBox.setActionCommand(PLOT_SELECTED); + plotComboBox.setAlignmentX(CENTER_ALIGNMENT); plotComboBox.setRenderer(new BasicComboBoxRenderer() { @SuppressWarnings("rawtypes") public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) { @@ -98,12 +109,15 @@ plotComboBox.addActionListener(this); leftPanel.add(plotComboBox); + leftPanel.add(new Box.Filler(filler, filler, filler)); + + // Table with plot info. String data[][] = new String[0][0]; model = new DefaultTableModel(data, COLUMN_NAMES); + model.setColumnIdentifiers(COLUMN_NAMES); infoTable.setModel(model); - infoTable.getColumn("Field").setMinWidth(25); - infoTable.getColumn("Value").setMinWidth(20); - infoTable.setMinimumSize(new Dimension(100, 200)); + ((DefaultTableModel)infoTable.getModel()).setRowCount(MAX_ROWS); + infoTable.setAlignmentX(CENTER_ALIGNMENT); leftPanel.add(infoTable); add(leftPanel); @@ -185,8 +199,6 @@ synchronized void setCurrentRegion(PlotterRegion region) { if (region != currentRegion) { currentRegion = region; - //if (currentRegion.title() != null) - // setTitle(currentRegion.title()); updateComboBox(); setCurrentObject(plotComboBox.getSelectedItem()); setupContentPane(); @@ -206,8 +218,7 @@ * Update the info table from the state of the current AIDA object. */ void updateTable() { - model.setRowCount(0); - model.setColumnIdentifiers(COLUMN_NAMES); + model.setRowCount(0); if (currentObject instanceof IHistogram1D) { addRows((IHistogram1D) currentObject); } else if (currentObject instanceof IHistogram2D) {