Author: [log in to unmask]
Date: Mon Feb 2 19:06:00 2015
New Revision: 2029
Log:
Add IFunction support to plot info window. HPSJAVA-334
Modified:
java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/PlotInfoWindow.java
Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/PlotInfoWindow.java
=============================================================================
--- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/PlotInfoWindow.java (original)
+++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/PlotInfoWindow.java Mon Feb 2 19:06:00 2015
@@ -8,10 +8,12 @@
import hep.aida.IFunction;
import hep.aida.IHistogram1D;
import hep.aida.IHistogram2D;
-import hep.aida.jfree.plotter.ObjectStyle;
import hep.aida.jfree.plotter.PlotterRegion;
import hep.aida.ref.event.AIDAListener;
import hep.aida.ref.event.AIDAObservable;
+import hep.aida.ref.function.FunctionChangedEvent;
+import hep.aida.ref.function.FunctionDispatcher;
+import hep.aida.ref.function.FunctionListener;
import java.awt.Component;
import java.awt.Dimension;
@@ -37,16 +39,12 @@
/**
* <p>
- * This is a GUI component for showing the statistics and other information about an AIDA plot.
+ * This is a GUI component for showing the statistics and other information about an AIDA plot
+ * when it is clicked on in the monitoring app.
* <p>
- * This information is updated dynamically via the <code>AIDAObserver</code> API on the AIDA object.
+ * The information is updated dynamically via the <code>AIDAObserver</code> API on the AIDA object.
*/
-// FIXME: Add addRows for all types of AIDA objects (only Histogram1D implemented so far).
-// FIXME: Columns disappear when rebuilding table.
-// TODO: Add sorting of info table.
-// TODO: Probably this should be moved out of monitoring application as it is generically applicable
-// to AIDA objects.
-public class PlotInfoWindow extends JFrame implements AIDAListener, ActionListener {
+public class PlotInfoWindow extends JFrame implements AIDAListener, ActionListener, FunctionListener {
JComboBox<Object> plotComboBox;
JTable infoTable = new JTable();
@@ -59,7 +57,7 @@
static final String[] COLUMN_NAMES = { "Field", "Value" };
- static final String PLOT_SELECTED = "PLOT_SELECTED";
+ static final String PLOT_SELECTED = "PlotSelected";
Timer timer = new Timer();
@@ -125,12 +123,13 @@
*/
@Override
public void stateChanged(final EventObject evt) {
-
+
// Make a timer task for running the update.
TimerTask task = new TimerTask() {
public void run() {
+
// Is the state change from the current AIDAObservable?
- if (evt.getSource() != PlotInfoWindow.this.currentObject) {
+ if (evt.getSource() != currentObject) {
// Assume this means that a different AIDAObservable was selected in the GUI.
return;
}
@@ -157,17 +156,18 @@
*/
@Override
public void actionPerformed(ActionEvent e) {
- // Was a new item selected in the combo box?
+ // Is there a new item selected in the combo box?
if (PLOT_SELECTED.equals(e.getActionCommand())) {
if (plotComboBox.getSelectedItem() != null) {
- // Set the current object from the combo box to update the GUI state.
+ // Set the current object from the combo box value, to update the GUI state.
setCurrentObject(plotComboBox.getSelectedItem());
}
}
}
/**
- * Get the title of an AIDA object. Unfortunately there is not base type with this information.
+ * Get the title of an AIDA object. Unfortunately there is no base type with this information,
+ * so it is gotten manually from each possible type.
* @param object The AIDA object.
* @return The title of the object from its title method or value of its toString method, if
* none exists.
@@ -230,6 +230,8 @@
if (((ICloud1D) currentObject).isConverted()) {
addRows(((ICloud1D) currentObject).histogram());
}
+ } else if (currentObject instanceof IFunction) {
+ addRows((IFunction) currentObject);
}
}
@@ -252,7 +254,7 @@
List<Object> objects = currentRegion.getPlottedObjects();
for (Object object : objects) {
if (isValidObject(object)) {
- this.plotComboBox.addItem(object);
+ plotComboBox.addItem(object);
}
}
}
@@ -262,9 +264,8 @@
return false;
if (object instanceof IBaseHistogram || object instanceof IFunction || object instanceof IDataPointSet) {
return true;
- } else {
- return false;
- }
+ }
+ return false;
}
/**
@@ -321,7 +322,20 @@
addRow("x rms", String.format("%.10f%n", cloud.rmsX()));
addRow("y rms", String.format("%.10f%n", cloud.rmsY()));
}
-
+
+ /**
+ * Add rows to the info table from the state of a 2D cloud.
+ * @param cloud The AIDA object.
+ */
+ void addRows(IFunction function) {
+ addRow("title", function.title());
+
+ // Add generically the values of all function parameters.
+ for (String parameter : function.parameterNames()) {
+ addRow(parameter, function.parameter(parameter));
+ }
+ }
+
/**
* Add a row to the info table.
* @param field The field name.
@@ -336,10 +350,10 @@
* @param object The backing AIDA object.
*/
synchronized void setCurrentObject(Object object) {
-
+
if (object == null)
throw new IllegalArgumentException("The object arg is null!");
-
+
if (object == currentObject)
return;
@@ -359,13 +373,17 @@
}
/**
- * Remove this object as an <code>AIDAListener</code> on the current <code>AIDAObservable</code>
- * .
+ * Remove this as a listener on the current AIDA object.
*/
void removeListener() {
if (currentObject != null) {
- // Remove this object as a listener on the current observable.
- ((AIDAObservable) currentObject).removeListener(this);
+ if (currentObject instanceof AIDAObservable && !(currentObject instanceof IFunction)) {
+ // Remove this object as an listener on the AIDA observable.
+ ((AIDAObservable) currentObject).removeListener(this);
+ } else if (currentObject instanceof FunctionDispatcher) {
+ // Remove this object as function listener.
+ ((FunctionDispatcher)currentObject).removeFunctionListener(this);
+ }
}
}
@@ -373,12 +391,29 @@
* Add this object as an <code>AIDAListener</code> on the current <code>AIDAObservable</code>.
*/
void addListener() {
- if (currentObject instanceof AIDAObservable) {
+ if (currentObject instanceof AIDAObservable && !(currentObject instanceof FunctionDispatcher)) {
// Setup a listener on the current AIDA object.
AIDAObservable observable = (AIDAObservable) currentObject;
observable.addListener(this);
observable.setValid(this);
observable.setConnected(true);
+ } else if (currentObject instanceof IFunction) {
+ if (currentObject instanceof FunctionDispatcher) {
+ ((FunctionDispatcher)currentObject).addFunctionListener(this);
+ }
+ }
+ }
+
+ /**
+ * Callback for updating from changed to <code>IFunction</code> object.
+ * @param event The change event (unused in this method).
+ */
+ @Override
+ public void functionChanged(FunctionChangedEvent event) {
+ try {
+ runUpdateTable();
+ } catch (Exception e) {
+ e.printStackTrace();
}
}
}
|