added data sorting option in table based charts
authorVictor Kirhenshtein <victor@netxms.org>
Fri, 28 Apr 2017 09:42:42 +0000 (12:42 +0300)
committerVictor Kirhenshtein <victor@netxms.org>
Fri, 28 Apr 2017 09:42:42 +0000 (12:42 +0300)
16 files changed:
ChangeLog
src/java/client/netxms-client/src/main/java/org/netxms/client/Table.java
src/java/netxms-eclipse/Charts/src/org/netxms/ui/eclipse/charts/api/DataComparisonChart.java
src/java/netxms-eclipse/Charts/src/org/netxms/ui/eclipse/charts/figures/BirtChartFigure.java
src/java/netxms-eclipse/Charts/src/org/netxms/ui/eclipse/charts/widgets/DataComparisonBirtChart.java
src/java/netxms-eclipse/Charts/src/org/netxms/ui/eclipse/charts/widgets/GaugeWidget.java
src/java/netxms-eclipse/Dashboard/src/org/netxms/ui/eclipse/dashboard/propertypages/TableDataSource.java
src/java/netxms-eclipse/Dashboard/src/org/netxms/ui/eclipse/dashboard/widgets/TableComparisonChartElement.java
src/java/netxms-eclipse/Dashboard/src/org/netxms/ui/eclipse/dashboard/widgets/internal/TableComparisonChartConfig.java
webui/webapp/Charts/src/org/netxms/ui/eclipse/charts/api/DataComparisonChart.java
webui/webapp/Charts/src/org/netxms/ui/eclipse/charts/figures/BirtChartFigure.java
webui/webapp/Charts/src/org/netxms/ui/eclipse/charts/widgets/DataComparisonBirtChart.java
webui/webapp/Charts/src/org/netxms/ui/eclipse/charts/widgets/GaugeWidget.java
webui/webapp/Dashboard/src/org/netxms/ui/eclipse/dashboard/propertypages/TableDataSource.java
webui/webapp/Dashboard/src/org/netxms/ui/eclipse/dashboard/widgets/TableComparisonChartElement.java
webui/webapp/Dashboard/src/org/netxms/ui/eclipse/dashboard/widgets/internal/TableComparisonChartConfig.java

index 3952c98..9b10e15 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,6 +8,7 @@
 - Network device database (allows some device specific information to be provided without drivers)
 - Management console:
        - Node's zone name shown in alarm browser and object overview when zoning is enabled
+       - Sorting option in table based charts on dashboards (to implement "Top N" style charts)
 - Fixed issues: NX-1222, NX-1239, NX-1242
 
 
index 2b1b41d..c4cee97 100644 (file)
@@ -19,6 +19,8 @@
 package org.netxms.client;
 
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 import org.netxms.base.NXCPCodes;
@@ -151,6 +153,16 @@ public class Table
                        varId = data.get(i).fillMessage(msg, varId, extendedFormat);
                }
        }
+       
+       /**
+        * Sort table rows using provided comparator
+        * 
+        * @param comparator comparator for table rows
+        */
+       public void sort(Comparator<TableRow> comparator)
+       {
+          Collections.sort(data, comparator);
+       }
 
        /**
         * Get number of columns in table
index e695943..05611d8 100644 (file)
@@ -44,6 +44,11 @@ public interface DataComparisonChart extends DataChart
        public abstract int addParameter(GraphItem parameter, double value);
        
        /**
+        * Remove all parameters from chart
+        */
+       public abstract void removeAllParameters();
+       
+       /**
         * Update value for parameter
         * 
         * @param index parameter's index (0 .. MAX_CHART_ITEMS-1)
index 675c602..3e929ba 100644 (file)
@@ -628,6 +628,15 @@ public class BirtChartFigure extends GenericChartFigure implements DataCompariso
                return parameters.size() - 1;
        }
 
+   /* (non-Javadoc)
+    * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#removeAllParameters()
+    */
+   @Override
+   public void removeAllParameters()
+   {
+      parameters.clear();
+   }
+   
        /* (non-Javadoc)
         * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#updateParameter(int, double, boolean)
         */
index 190c17d..791d4f9 100644 (file)
@@ -344,6 +344,15 @@ public class DataComparisonBirtChart extends GenericBirtChart implements DataCom
                return parameters.size() - 1;
        }
 
+   /* (non-Javadoc)
+    * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#removeAllParameters()
+    */
+   @Override
+   public void removeAllParameters()
+   {
+      parameters.clear();
+   }
+       
        /* (non-Javadoc)
         * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#updateParameter(int, double, boolean)
         */
index c8d5f68..5e9a92d 100644 (file)
@@ -194,6 +194,15 @@ public abstract class GaugeWidget extends GenericChart implements Gauge, PaintLi
       parameters.add(new DataComparisonElement(dci, value, null));
       return parameters.size() - 1;
    }
+   
+   /* (non-Javadoc)
+    * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#removeAllParameters()
+    */
+   @Override
+   public void removeAllParameters()
+   {
+      parameters.clear();
+   }
 
        /* (non-Javadoc)
     * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#updateParameter(int, double, boolean)
index 6aef0ac..579395a 100644 (file)
@@ -41,6 +41,8 @@ public class TableDataSource extends PropertyPage
        private LabeledText instanceColumn;
        private LabeledText dataColumn;
        private Button checkIgnoreZeroValues;
+   private Button checkSortOnDataColumn;
+   private Button checkSortDescending;
        
        /* (non-Javadoc)
         * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
@@ -86,6 +88,14 @@ public class TableDataSource extends PropertyPage
                checkIgnoreZeroValues.setText(Messages.get().TableDataSource_IgnoreZero);
                checkIgnoreZeroValues.setSelection(config.isIgnoreZeroValues());
 
+      checkSortOnDataColumn = new Button(dialogArea, SWT.CHECK);
+      checkSortOnDataColumn.setText("&Sort table on data column");
+      checkSortOnDataColumn.setSelection(config.isSortOnDataColumn());
+
+      checkSortDescending = new Button(dialogArea, SWT.CHECK);
+      checkSortDescending.setText("Sort &descending");
+      checkSortDescending.setSelection(config.isSortDescending());
+
                return dialogArea;
        }
 
@@ -100,6 +110,8 @@ public class TableDataSource extends PropertyPage
                config.setInstanceColumn(instanceColumn.getText().trim());
                config.setDataColumn(dataColumn.getText().trim());
                config.setIgnoreZeroValues(checkIgnoreZeroValues.getSelection());
+               config.setSortOnDataColumn(checkSortOnDataColumn.getSelection());
+               config.setSortDescending(checkSortDescending.getSelection());
                return true;
        }
 }
index b48704c..50592ec 100644 (file)
@@ -18,6 +18,7 @@
  */
 package org.netxms.ui.eclipse.dashboard.widgets;
 
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -30,6 +31,8 @@ import org.eclipse.swt.widgets.Widget;
 import org.eclipse.ui.IViewPart;
 import org.netxms.client.NXCSession;
 import org.netxms.client.Table;
+import org.netxms.client.TableCell;
+import org.netxms.client.TableRow;
 import org.netxms.client.dashboards.DashboardElement;
 import org.netxms.client.datacollection.GraphItem;
 import org.netxms.ui.eclipse.charts.api.DataChart;
@@ -145,16 +148,48 @@ public abstract class TableComparisonChartElement extends ElementWidget
         * 
         * @param data
         */
-       private void updateChart(Table data)
+       private void updateChart(final Table data)
        {
                String instanceColumn = (config.getInstanceColumn() != null) ? config.getInstanceColumn() : ""; // FIXME //$NON-NLS-1$
                if (instanceColumn == null)
                        return;
                
-               int icIndex = data.getColumnIndex(instanceColumn);
-               int dcIndex = data.getColumnIndex(config.getDataColumn());
+               final int icIndex = data.getColumnIndex(instanceColumn);
+               final int dcIndex = data.getColumnIndex(config.getDataColumn());
                if ((icIndex == -1) || (dcIndex == -1))
                        return; // at least one column is missing
+               
+               if (config.isSortOnDataColumn())
+               {
+                  data.sort(new Comparator<TableRow>() {
+            @Override
+            public int compare(TableRow row1, TableRow row2)
+            {
+               TableCell c1 = row1.get(dcIndex);
+               TableCell c2 = row2.get(dcIndex);
+
+               String s1 = (c1 != null) ? c1.getValue() : "";
+               String s2 = (c2 != null) ? c2.getValue() : "";
+               
+               int result = 0;
+               try
+               {
+                  double value1 = Double.parseDouble(s1);
+                  double value2 = Double.parseDouble(s2);
+                  result = Double.compare(value1, value2);
+               }
+               catch(NumberFormatException e)
+               {
+                  result = s1.compareToIgnoreCase(s2);
+               }
+               return config.isSortDescending() ? -result : result;
+            }
+         });
+                  
+                  // Sorting may reorder instances, so clear everything
+                  instanceMap.clear();
+                  chart.removeAllParameters();
+               }
 
                boolean rebuild = false;
                for(int i = 0; i < data.getRowCount(); i++)
index f11c00c..9837ed9 100644 (file)
@@ -66,6 +66,12 @@ public abstract class TableComparisonChartConfig extends DashboardElementConfig
                
        @Element(required = false)
        private boolean ignoreZeroValues = false;
+       
+   @Element(required = false)
+       private boolean sortOnDataColumn = false;
+       
+   @Element(required = false)
+       private boolean sortDescending = false;
 
    @Element(required = false)
    private boolean autoScale = true;
@@ -310,6 +316,38 @@ public abstract class TableComparisonChartConfig extends DashboardElementConfig
       this.autoScale = autoScale;
    }
 
+   /**
+    * @return the sortOnDataColumn
+    */
+   public boolean isSortOnDataColumn()
+   {
+      return sortOnDataColumn;
+   }
+
+   /**
+    * @param sortOnDataColumn the sortOnDataColumn to set
+    */
+   public void setSortOnDataColumn(boolean sortOnDataColumn)
+   {
+      this.sortOnDataColumn = sortOnDataColumn;
+   }
+
+   /**
+    * @return the sortDescending
+    */
+   public boolean isSortDescending()
+   {
+      return sortDescending;
+   }
+
+   /**
+    * @param sortDescending the sortDescending to set
+    */
+   public void setSortDescending(boolean sortDescending)
+   {
+      this.sortDescending = sortDescending;
+   }
+
    /* (non-Javadoc)
     * @see org.netxms.ui.eclipse.dashboard.widgets.internal.DashboardElementConfig#getObjects()
     */
index e695943..05611d8 100644 (file)
@@ -44,6 +44,11 @@ public interface DataComparisonChart extends DataChart
        public abstract int addParameter(GraphItem parameter, double value);
        
        /**
+        * Remove all parameters from chart
+        */
+       public abstract void removeAllParameters();
+       
+       /**
         * Update value for parameter
         * 
         * @param index parameter's index (0 .. MAX_CHART_ITEMS-1)
index 56ee35b..c3b4763 100644 (file)
@@ -447,7 +447,7 @@ public class BirtChartFigure extends GenericChartFigure implements DataCompariso
                                /* TODO: add logging and/or user notification */
                                e.printStackTrace();
                        }
-
+                       
                        fullRepaint = false;
                }
 
@@ -639,6 +639,15 @@ public class BirtChartFigure extends GenericChartFigure implements DataCompariso
                return parameters.size() - 1;
        }
 
+   /* (non-Javadoc)
+    * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#removeAllParameters()
+    */
+   @Override
+   public void removeAllParameters()
+   {
+      parameters.clear();
+   }
+   
        /* (non-Javadoc)
         * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#updateParameter(int, double, boolean)
         */
index acf0fc2..e737c41 100644 (file)
@@ -73,7 +73,7 @@ public class DataComparisonBirtChart extends GenericBirtChart implements DataCom
        private Series valueSeries = null;
        private boolean transposed = false;
        private boolean labelsVisible = false;
-       private double rotation = 0.0;
+       private double rotation = 0.0;  
        
        /**
         * @param parent
@@ -341,6 +341,15 @@ public class DataComparisonBirtChart extends GenericBirtChart implements DataCom
                return parameters.size() - 1;
        }
 
+   /* (non-Javadoc)
+    * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#removeAllParameters()
+    */
+   @Override
+   public void removeAllParameters()
+   {
+      parameters.clear();
+   }
+       
        /* (non-Javadoc)
         * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#updateParameter(int, double, boolean)
         */
index 43c22d9..d7b4536 100644 (file)
@@ -194,6 +194,15 @@ public abstract class GaugeWidget extends GenericChart implements Gauge, PaintLi
       parameters.add(new DataComparisonElement(dci, value, null));
       return parameters.size() - 1;
    }
+   
+   /* (non-Javadoc)
+    * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#removeAllParameters()
+    */
+   @Override
+   public void removeAllParameters()
+   {
+      parameters.clear();
+   }
 
        /* (non-Javadoc)
     * @see org.netxms.ui.eclipse.charts.api.DataComparisonChart#updateParameter(int, double, boolean)
index 6aef0ac..579395a 100644 (file)
@@ -41,6 +41,8 @@ public class TableDataSource extends PropertyPage
        private LabeledText instanceColumn;
        private LabeledText dataColumn;
        private Button checkIgnoreZeroValues;
+   private Button checkSortOnDataColumn;
+   private Button checkSortDescending;
        
        /* (non-Javadoc)
         * @see org.eclipse.jface.preference.PreferencePage#createContents(org.eclipse.swt.widgets.Composite)
@@ -86,6 +88,14 @@ public class TableDataSource extends PropertyPage
                checkIgnoreZeroValues.setText(Messages.get().TableDataSource_IgnoreZero);
                checkIgnoreZeroValues.setSelection(config.isIgnoreZeroValues());
 
+      checkSortOnDataColumn = new Button(dialogArea, SWT.CHECK);
+      checkSortOnDataColumn.setText("&Sort table on data column");
+      checkSortOnDataColumn.setSelection(config.isSortOnDataColumn());
+
+      checkSortDescending = new Button(dialogArea, SWT.CHECK);
+      checkSortDescending.setText("Sort &descending");
+      checkSortDescending.setSelection(config.isSortDescending());
+
                return dialogArea;
        }
 
@@ -100,6 +110,8 @@ public class TableDataSource extends PropertyPage
                config.setInstanceColumn(instanceColumn.getText().trim());
                config.setDataColumn(dataColumn.getText().trim());
                config.setIgnoreZeroValues(checkIgnoreZeroValues.getSelection());
+               config.setSortOnDataColumn(checkSortOnDataColumn.getSelection());
+               config.setSortDescending(checkSortDescending.getSelection());
                return true;
        }
 }
index b48704c..50592ec 100644 (file)
@@ -18,6 +18,7 @@
  */
 package org.netxms.ui.eclipse.dashboard.widgets;
 
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -30,6 +31,8 @@ import org.eclipse.swt.widgets.Widget;
 import org.eclipse.ui.IViewPart;
 import org.netxms.client.NXCSession;
 import org.netxms.client.Table;
+import org.netxms.client.TableCell;
+import org.netxms.client.TableRow;
 import org.netxms.client.dashboards.DashboardElement;
 import org.netxms.client.datacollection.GraphItem;
 import org.netxms.ui.eclipse.charts.api.DataChart;
@@ -145,16 +148,48 @@ public abstract class TableComparisonChartElement extends ElementWidget
         * 
         * @param data
         */
-       private void updateChart(Table data)
+       private void updateChart(final Table data)
        {
                String instanceColumn = (config.getInstanceColumn() != null) ? config.getInstanceColumn() : ""; // FIXME //$NON-NLS-1$
                if (instanceColumn == null)
                        return;
                
-               int icIndex = data.getColumnIndex(instanceColumn);
-               int dcIndex = data.getColumnIndex(config.getDataColumn());
+               final int icIndex = data.getColumnIndex(instanceColumn);
+               final int dcIndex = data.getColumnIndex(config.getDataColumn());
                if ((icIndex == -1) || (dcIndex == -1))
                        return; // at least one column is missing
+               
+               if (config.isSortOnDataColumn())
+               {
+                  data.sort(new Comparator<TableRow>() {
+            @Override
+            public int compare(TableRow row1, TableRow row2)
+            {
+               TableCell c1 = row1.get(dcIndex);
+               TableCell c2 = row2.get(dcIndex);
+
+               String s1 = (c1 != null) ? c1.getValue() : "";
+               String s2 = (c2 != null) ? c2.getValue() : "";
+               
+               int result = 0;
+               try
+               {
+                  double value1 = Double.parseDouble(s1);
+                  double value2 = Double.parseDouble(s2);
+                  result = Double.compare(value1, value2);
+               }
+               catch(NumberFormatException e)
+               {
+                  result = s1.compareToIgnoreCase(s2);
+               }
+               return config.isSortDescending() ? -result : result;
+            }
+         });
+                  
+                  // Sorting may reorder instances, so clear everything
+                  instanceMap.clear();
+                  chart.removeAllParameters();
+               }
 
                boolean rebuild = false;
                for(int i = 0; i < data.getRowCount(); i++)
index f11c00c..9837ed9 100644 (file)
@@ -66,6 +66,12 @@ public abstract class TableComparisonChartConfig extends DashboardElementConfig
                
        @Element(required = false)
        private boolean ignoreZeroValues = false;
+       
+   @Element(required = false)
+       private boolean sortOnDataColumn = false;
+       
+   @Element(required = false)
+       private boolean sortDescending = false;
 
    @Element(required = false)
    private boolean autoScale = true;
@@ -310,6 +316,38 @@ public abstract class TableComparisonChartConfig extends DashboardElementConfig
       this.autoScale = autoScale;
    }
 
+   /**
+    * @return the sortOnDataColumn
+    */
+   public boolean isSortOnDataColumn()
+   {
+      return sortOnDataColumn;
+   }
+
+   /**
+    * @param sortOnDataColumn the sortOnDataColumn to set
+    */
+   public void setSortOnDataColumn(boolean sortOnDataColumn)
+   {
+      this.sortOnDataColumn = sortOnDataColumn;
+   }
+
+   /**
+    * @return the sortDescending
+    */
+   public boolean isSortDescending()
+   {
+      return sortDescending;
+   }
+
+   /**
+    * @param sortDescending the sortDescending to set
+    */
+   public void setSortDescending(boolean sortDescending)
+   {
+      this.sortDescending = sortDescending;
+   }
+
    /* (non-Javadoc)
     * @see org.netxms.ui.eclipse.dashboard.widgets.internal.DashboardElementConfig#getObjects()
     */