diff --git a/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotDataAccessParmDBImpl.java b/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotDataAccessParmDBImpl.java index e97e5f84b3450c12a1b821a8005d02a494da3b1c..5c2fa1a893d935ca4a688d0519783263d9372fb6 100644 --- a/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotDataAccessParmDBImpl.java +++ b/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotDataAccessParmDBImpl.java @@ -1,4 +1,4 @@ -/* +/* * PlotDataAccessParmDBImpl.java * * Copyright (C) 2002-2007 @@ -21,46 +21,48 @@ * */ -package nl.astron.lofar.java.cep.jparmfacade; +package nl.astron.lofar.sas.otb.util.plotter; import java.util.Calendar; import java.util.Date; import java.util.HashMap; +import java.util.HashSet; import java.util.Iterator; import java.util.LinkedList; import java.util.TimeZone; import java.util.Vector; +import nl.astron.lofar.java.cep.jparmfacade.jParmFacadeInterface; import nl.astron.lofar.java.gui.plotter.IPlotDataAccess; import nl.astron.lofar.java.gui.plotter.PlotConstants; import nl.astron.lofar.java.gui.plotter.exceptions.PlotterDataAccessException; /** -* This class provides an implementation of IPlotDataAccess for use with LOFAR's -* jParmFacade interface. It manages connections to that interface, and allows -* the plotter framework to generate plots of data present in the ParmDB. -* -* @see nl.astron.lofar.java.cep.jparmfacade.jParmFacade -* @created 19-04-2006, 11:00 -* @author pompert -* @version $Id$ -* @updated 19-apr-2006, 11:00 -*/ + * This class provides an implementation of IPlotDataAccess for use with LOFAR's + * jParmFacade interface. It manages connections to that interface, and allows + * the plotter framework to generate plots of data present in the ParmDB. + * + * @see nl.astron.lofar.java.cep.jparmfacade.jParmFacade + * @created 19-04-2006, 11:00 + * @author pompert + * @version $Id$ + * @updated 19-apr-2006, 11:00 + */ public class PlotDataAccessParmDBImpl implements IPlotDataAccess{ - - private static final int requiredDataConstraints = 7; - - //Location of ParmDB table file(s) - - private static jParmFacadeInterface parmDB = null; - + + private static final int requiredDataConstraints = 7; + + //Location of ParmDB table file(s) + + private static jParmFacadeInterface parmDB = null; + /** * *Creates a new instance of PlotDataAccessParmDBImpl * */ - public PlotDataAccessParmDBImpl(){ - } + public PlotDataAccessParmDBImpl(){ + } /** * @@ -69,11 +71,11 @@ public class PlotDataAccessParmDBImpl implements IPlotDataAccess{ */ public void finalize() throws Throwable { - parmDB = null; + parmDB = null; } - + /** - + * * This method, the most important one, makes a Plotter compliant dataset using * the constraints provided by the PlotPanel, and to do that, it uses the * jParmFacade interface to get the data. @@ -91,7 +93,7 @@ public class PlotDataAccessParmDBImpl implements IPlotDataAccess{ * @throws PlotterDataAccessException will be thrown if anything goes wrong * with the ParmDB interface and calls to it. */ - + @SuppressWarnings("unchecked") public HashMap retrieveData(Object constraints) throws PlotterDataAccessException{ if(parmDB == null){ this.initiateConnectionToParmDB(constraints); @@ -195,7 +197,7 @@ public class PlotDataAccessParmDBImpl implements IPlotDataAccess{ * * */ - + @SuppressWarnings("unchecked") public HashMap updateData(HashMap currentData, Object constraints) throws PlotterDataAccessException{ if(parmDB == null){ @@ -204,33 +206,64 @@ public class PlotDataAccessParmDBImpl implements IPlotDataAccess{ } //try{ + + LinkedList<HashMap> currentValuesInPlot = (LinkedList<HashMap>)currentData.get(PlotConstants.DATASET_VALUES); + + HashMap<String,Object> operatorsOnDataset = (HashMap<String,Object>)constraints; + + if(operatorsOnDataset.containsKey(PlotConstants.DATASET_OPERATOR_ADD)){ + HashMap<String,Object> addDataSet = (HashMap<String,Object>)operatorsOnDataset.get(PlotConstants.DATASET_OPERATOR_ADD); + String[] constraintsArray = (String[])addDataSet.get("PARMDBCONSTRAINTS"); + Vector names = getNames(constraintsArray[0]); - LinkedList<HashMap> currentValuesInPlot = (LinkedList<HashMap>)currentData.get(PlotConstants.DATASET_VALUES); + if(names != null && names.size()>=1 && constraintsArray.length == this.requiredDataConstraints){ + HashSet<HashMap> toBeAddedValueObjects = new HashSet<HashMap>(); + LinkedList<HashMap> newParmValues = getParmValues(names,constraintsArray); + Iterator anIterator = newParmValues.iterator(); + while(anIterator.hasNext()){ + boolean addData = true; + HashMap parmValue = (HashMap)anIterator.next(); + Iterator anIterator2 = currentValuesInPlot.iterator(); + while(anIterator2.hasNext()){ + HashMap parmValue2 = (HashMap)anIterator2.next(); + String compareValue = (String)parmValue2.get(PlotConstants.DATASET_VALUELABEL); + if(parmValue.get(PlotConstants.DATASET_VALUELABEL).equals(compareValue)){ + addData = false; + } + } + if(addData){ + toBeAddedValueObjects.add(parmValue); + } + } + currentValuesInPlot.addAll(toBeAddedValueObjects); + } + } + if(operatorsOnDataset.containsKey(PlotConstants.DATASET_OPERATOR_MODIFY)){ - HashMap<String,Object> operatorsOnDataset = (HashMap<String,Object>)constraints; + String[] constraintsArray = (String[])operatorsOnDataset.get(PlotConstants.DATASET_OPERATOR_MODIFY); + //TODO: IMPLEMENT - if(operatorsOnDataset.containsKey(PlotConstants.DATASET_OPERATOR_ADD)){ - HashMap<String,Object> addDataSet = (HashMap<String,Object>)operatorsOnDataset.get(PlotConstants.DATASET_OPERATOR_ADD); - String[] constraintsArray = (String[])addDataSet.get("PARMDBCONSTRAINTS"); - Vector names = getNames(constraintsArray[0]); - - if(names != null && names.size()>=1 && constraintsArray.length == this.requiredDataConstraints){ - //Every parameter - currentValuesInPlot.addAll(getParmValues(names,constraintsArray)); + } + if(operatorsOnDataset.containsKey(PlotConstants.DATASET_OPERATOR_DELETE)){ + HashSet<HashMap> toBeDeletedValueObjects = new HashSet<HashMap>(); + String[] toBeDeletedValues = (String[])operatorsOnDataset.get(PlotConstants.DATASET_OPERATOR_DELETE); + for(int i = 0; i < toBeDeletedValues.length; i++){ + String aValueToBeDeleted = toBeDeletedValues[i]; + Iterator anIterator = currentValuesInPlot.iterator(); + while(anIterator.hasNext()){ + HashMap<String,Object> dataObject = (HashMap<String,Object>)anIterator.next(); + if(dataObject.get(PlotConstants.DATASET_VALUELABEL).equals(aValueToBeDeleted)){ + toBeDeletedValueObjects.add(dataObject); + } } } - if(operatorsOnDataset.containsKey(PlotConstants.DATASET_OPERATOR_MODIFY)){ - - String[] constraintsArray = (String[])operatorsOnDataset.get(PlotConstants.DATASET_OPERATOR_MODIFY); - //TODO: IMPLEMENT - - } - if(operatorsOnDataset.containsKey(PlotConstants.DATASET_OPERATOR_DELETE)){ - - String[] toBeDeletedValues = (String[])operatorsOnDataset.get(PlotConstants.DATASET_OPERATOR_DELETE); - //TODO: IMPLEMENT - + for(HashMap deleteObject : toBeDeletedValueObjects){ + currentValuesInPlot.remove(deleteObject); } + + //TODO: IMPLEMENT + + } //}catch(Exception e){ // PlotterDataAccessException ex = new PlotterDataAccessException("An error occurred while updating dataset "+currentData.hashCode()); // ex.initCause(e); @@ -252,7 +285,7 @@ public class PlotDataAccessParmDBImpl implements IPlotDataAccess{ * not be started, due to missing native libraries or other errors. * */ - + @SuppressWarnings("unchecked") private static void initiateConnectionToParmDB(Object constraints) throws PlotterDataAccessException{ if(parmDB == null){ @@ -301,7 +334,7 @@ public class PlotDataAccessParmDBImpl implements IPlotDataAccess{ private LinkedList<HashMap> getParmValues(Vector names, String[] constraintsArray) throws PlotterDataAccessException{ LinkedList<HashMap> returnList = new LinkedList<HashMap>(); - + for(int n = 0; n < names.size();n++){ Vector paramValues; @@ -372,11 +405,11 @@ public class PlotDataAccessParmDBImpl implements IPlotDataAccess{ while(anIterator.hasNext()){ HashMap<String,Object> aValueMap = new HashMap<String,Object>(); - + String aValue = (String)anIterator.next(); //System.out.println("Parameter Value Found: "+aValue); - + aValueMap.put(PlotConstants.DATASET_VALUELABEL,aValue); diff --git a/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotSlotViewFrame.java b/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotSlotViewFrame.java index 79eef7b4411ae1927c81875ced965c424066d864..b2a23725cea4b6d72572a70f003622ac916aab64 100644 --- a/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotSlotViewFrame.java +++ b/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotSlotViewFrame.java @@ -42,6 +42,7 @@ public class PlotSlotViewFrame extends JDialog{ plotIndex = index; this.getContentPane().setLayout(new BorderLayout()); setTitle(title); + this.setAlwaysOnTop(true); PlotSlot viewSlot = parent.getSlot(index); if(!showLegendOnly){ setTitle(title); diff --git a/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotSlotsPanel.java b/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotSlotsPanel.java index 146b80183ed93e490495fde4a7dfe127c9a80297..56904b4c4d127f7ea35b6fed4a537a27d8c8f7f8 100644 --- a/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotSlotsPanel.java +++ b/SAS/OTB/OTB/src/nl/astron/lofar/sas/otb/util/plotter/PlotSlotsPanel.java @@ -33,11 +33,17 @@ import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; +import java.util.HashMap; +import java.util.LinkedList; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPanel; import javax.swing.JPopupMenu; +import javax.swing.SwingConstants; +import nl.astron.lofar.java.gui.plotter.PlotConstants; +import nl.astron.lofar.java.gui.plotter.exceptions.PlotterException; +import nl.astron.lofar.sas.otb.SharedVars; import org.apache.log4j.Logger; /** @@ -86,6 +92,17 @@ public class PlotSlotsPanel extends javax.swing.JPanel { throw new IllegalArgumentException("A plot was not found in slot "+slotIndex); } } + /** adds a button to the BeanForm */ + public void removeDataInPlot(int slotIndex,String[] dataIdentifiers) throws IllegalArgumentException{ + if(itsSlotManager.isSlotOccupied(slotIndex)){ + HashMap<String,Object> removeData = new HashMap<String,Object>(); + removeData.put(new String("PARMDBINTERFACE"),SharedVars.getJParmFacade()); + removeData.put(PlotConstants.DATASET_OPERATOR_DELETE,dataIdentifiers); + itsSlotManager.modifyPlotInSlot(slotIndex,removeData); + }else{ + throw new IllegalArgumentException("A plot was not found in slot "+slotIndex); + } + } public void clearSlots(){ itsSlotManager.clearSlots(); @@ -155,7 +172,9 @@ public class PlotSlotsPanel extends javax.swing.JPanel { tempPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder()); tempPanel.setMinimumSize(new Dimension(getWidth()/columnsAndRows,getHeight()/columnsAndRows)); tempPanel.setPreferredSize(new Dimension(getWidth()/columnsAndRows,getHeight()/columnsAndRows)); - tempPanel.add(new JLabel("External viewer active"),BorderLayout.CENTER); + JLabel tempLabel = new JLabel("External viewer active"); + tempLabel.setHorizontalAlignment(SwingConstants.CENTER); + tempPanel.add(tempLabel,BorderLayout.CENTER); JPanel northPanel = new JPanel(); northPanel.setLayout(new BorderLayout()); northPanel.setBackground(Color.LIGHT_GRAY); @@ -305,7 +324,7 @@ public class PlotSlotsPanel extends javax.swing.JPanel { aMenuItem.add(subMenuItem2); aPopupMenu.add(aMenuItem); }else if(externalLegendActive){ - JMenuItem subMenuItem=new JMenuItem("Separate Legend Viewer active!"); + JMenuItem subMenuItem=new JMenuItem("Please close the legend viewer first"); subMenuItem.setEnabled(false); aPopupMenu.add(subMenuItem); }else if(externalViewerActive){ @@ -379,6 +398,33 @@ public class PlotSlotsPanel extends javax.swing.JPanel { } }); aPopupMenu.add(aMenuItem2); + try { + LinkedList<HashMap> currentValuesInPlot = (LinkedList<HashMap>)selectedSlot.getPlot().getDataForPlot().get(PlotConstants.DATASET_VALUES); + if(currentValuesInPlot.size()>0){ + aPopupMenu.addSeparator(); + JMenu aMenu=new JMenu("Remove value from plot"); + for(HashMap aValue : currentValuesInPlot){ + String dataValueLabel = (String)aValue.get(PlotConstants.DATASET_VALUELABEL); + JMenuItem clearValueItem=new JMenuItem(dataValueLabel); + clearValueItem.setActionCommand(dataValueLabel); + clearValueItem.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + String[] valueArray = new String[1]; + valueArray[0] = evt.getActionCommand(); + removeDataInPlot(Integer.parseInt(selectedSlot.getLabel()),valueArray); + selectedSlot.repaint(); + } + }); + aMenu.add(clearValueItem); + + } + aPopupMenu.add(aMenu); + } + } catch (NumberFormatException ex) { + logger.error("Could not delete data in slot "+selectedSlot.getLabel()+".",ex); + } catch (PlotterException ex) { + logger.error("Could not retrieve the data for slot "+selectedSlot.getLabel()+" to delete specific value(s).",ex); + } } aPopupMenu.setOpaque(true); aPopupMenu.show(selectedSlot, e.getX(), e.getY());