2 * NetXMS - open source network management system
3 * Copyright (C) 2003-2010 Victor Kirhenshtein
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 package org
.netxms
.ui
.eclipse
.charts
.widgets
;
22 import java
.io
.FileInputStream
;
23 import java
.io
.InputStream
;
24 import java
.util
.HashSet
;
25 import java
.util
.Iterator
;
27 import org
.eclipse
.birt
.chart
.api
.ChartEngine
;
28 import org
.eclipse
.birt
.chart
.device
.IDeviceRenderer
;
29 import org
.eclipse
.birt
.chart
.exception
.ChartException
;
30 import org
.eclipse
.birt
.chart
.factory
.GeneratedChartState
;
31 import org
.eclipse
.birt
.chart
.factory
.IGenerator
;
32 import org
.eclipse
.birt
.chart
.model
.Chart
;
33 import org
.eclipse
.birt
.chart
.model
.attribute
.Bounds
;
34 import org
.eclipse
.birt
.chart
.model
.attribute
.ColorDefinition
;
35 import org
.eclipse
.birt
.chart
.model
.attribute
.Palette
;
36 import org
.eclipse
.birt
.chart
.model
.attribute
.Position
;
37 import org
.eclipse
.birt
.chart
.model
.attribute
.impl
.BoundsImpl
;
38 import org
.eclipse
.birt
.chart
.model
.attribute
.impl
.ColorDefinitionImpl
;
39 import org
.eclipse
.birt
.chart
.model
.attribute
.impl
.PaletteImpl
;
40 import org
.eclipse
.birt
.core
.framework
.PlatformConfig
;
41 import org
.eclipse
.jface
.preference
.PreferenceConverter
;
42 import org
.eclipse
.swt
.SWT
;
43 import org
.eclipse
.swt
.events
.ControlEvent
;
44 import org
.eclipse
.swt
.events
.ControlListener
;
45 import org
.eclipse
.swt
.events
.PaintEvent
;
46 import org
.eclipse
.swt
.events
.PaintListener
;
47 import org
.eclipse
.swt
.graphics
.GC
;
48 import org
.eclipse
.swt
.graphics
.Image
;
49 import org
.eclipse
.swt
.graphics
.RGB
;
50 import org
.eclipse
.swt
.graphics
.Rectangle
;
51 import org
.eclipse
.swt
.widgets
.Composite
;
52 import org
.netxms
.client
.datacollection
.GraphSettings
;
53 import org
.netxms
.ui
.eclipse
.charts
.Activator
;
54 import org
.netxms
.ui
.eclipse
.charts
.api
.ChartColor
;
55 import org
.netxms
.ui
.eclipse
.tools
.ColorCache
;
58 * Abstract base class for all BIRT-based charts
61 public abstract class GenericBirtChart
extends GenericChart
implements PaintListener
, ControlListener
63 private Chart chart
= null;
64 private boolean fullRepaint
= true;
65 private IDeviceRenderer deviceRenderer
= null;
66 private GeneratedChartState generatedChartState
= null;
67 private IGenerator generator
= null;
68 private Image imgChart
= null;
69 private ColorCache colors
;
70 private Set
<String
> errors
= new HashSet
<String
>(0);
71 private Image errorImage
= null;
72 protected boolean autoscale
= true;
79 * @param parent parent widget
80 * @param style widget style
82 public GenericBirtChart(Composite parent
, int style
)
84 super(parent
, style
| SWT
.NO_BACKGROUND
);
86 colors
= new ColorCache(this);
90 PlatformConfig config
= new PlatformConfig();
91 config
.setBIRTHome(""); //$NON-NLS-1$
92 final ChartEngine chartEngine
= ChartEngine
.instance(config
);
93 deviceRenderer
= chartEngine
.getRenderer("dv.PNG");
94 generator
= chartEngine
.getGenerator();
96 catch(ChartException e
)
98 /* TODO: implement logging or error reporting */
102 addPaintListener(this);
103 addControlListener(this);
107 * @see org.netxms.ui.eclipse.charts.api.DataChart#initializationComplete()
110 public void initializationComplete()
112 chart
= createChart();
118 * Force chart recreation (for example, after chart type change).
120 protected void recreateChart()
122 chart
= createChart();
128 * Create underlying chart object. Must be implemented by subclasses.
130 * @return BIRT chart object
132 protected abstract Chart
createChart();
135 * Get underlying BIRT chart object.
137 * @return underlying BIRT chart object
139 public Chart
getChart()
145 * @see org.eclipse.swt.events.ControlListener#controlMoved(org.eclipse.swt.events.ControlEvent)
148 public void controlMoved(ControlEvent arg0
)
154 * @see org.eclipse.swt.events.ControlListener#controlResized(org.eclipse.swt.events.ControlEvent)
157 public void controlResized(ControlEvent arg0
)
163 * @see org.eclipse.swt.events.PaintListener#paintControl(org.eclipse.swt.events.PaintEvent)
166 public final void paintControl(PaintEvent event
)
171 Rectangle clientArea
= this.getClientArea();
172 if ((clientArea
.width
== 0) || (clientArea
.height
== 0))
178 // imgChart is factory created and should not be disposed
183 File tmpFile
= File
.createTempFile("birt_" + hashCode(), "_" + clientArea
.width
+ "_" + clientArea
.height
);
184 tmpFile
.deleteOnExit();
186 deviceRenderer
.setProperty(IDeviceRenderer
.FILE_IDENTIFIER
, tmpFile
);
187 final Bounds bounds
= BoundsImpl
.create(0, 0, clientArea
.width
, clientArea
.height
);
188 bounds
.scale(72.0 / deviceRenderer
.getDisplayServer().getDpiResolution());
190 generatedChartState
= generator
.build(deviceRenderer
.getDisplayServer(), chart
, bounds
, null, null, null);
191 generator
.render(deviceRenderer
, generatedChartState
);
193 InputStream inputStream
= null;
196 inputStream
= new FileInputStream(tmpFile
);
197 imgChart
= new Image(getDisplay(), inputStream
);
202 if (inputStream
!= null)
210 /* TODO: add logging and/or user notification */
217 event
.gc
.drawImage(imgChart
, clientArea
.x
, clientArea
.y
);
218 paintErrorIndicator(event
.gc
);
222 * @see org.netxms.ui.eclipse.charts.api.DataChart#refresh()
225 public void refresh()
232 * @see org.netxms.ui.eclipse.charts.api.DataChart#rebuild()
235 public void rebuild()
241 * @see org.netxms.ui.eclipse.charts.api.DataChart#setTitle(java.lang.String)
244 public void setChartTitle(String title
)
249 chart
.getTitle().getLabel().getCaption().setValue(title
);
255 * @see org.netxms.ui.eclipse.charts.api.DataChart#setLegendVisible(boolean)
258 public void setLegendVisible(boolean visible
)
260 legendVisible
= visible
;
263 chart
.getLegend().setVisible(visible
);
269 * @see org.netxms.ui.eclipse.charts.api.DataChart#setTitleVisible(boolean)
272 public void setTitleVisible(boolean visible
)
274 titleVisible
= visible
;
276 chart
.getTitle().setVisible(visible
);
280 * @see org.netxms.ui.eclipse.charts.api.DataChart#set3DModeEnabled(boolean)
283 public void set3DModeEnabled(boolean enabled
)
285 displayIn3D
= enabled
;
291 * Get palette usable by BIRT
292 * @return BIRT palette object
294 protected Palette
getBirtPalette()
296 Palette birtPalette
= PaletteImpl
.create(0, true);
297 for(ChartColor c
: palette
)
298 birtPalette
.getEntries().add(ColorDefinitionImpl
.create(c
.red
, c
.green
, c
.blue
, c
.alpha
));
303 * @see org.netxms.ui.eclipse.charts.api.DataChart#setLogScaleEnabled(boolean)
306 public void setLogScaleEnabled(boolean enabled
)
308 if (useLogScale
!= enabled
)
310 useLogScale
= enabled
;
317 * Create BIRT color definition object from preference string
319 * @param name Preference name
320 * @return color definition object
322 protected ColorDefinition
getColorFromPreferences(final String name
)
324 RGB rgb
= PreferenceConverter
.getColor(preferenceStore
, name
);
325 return ColorDefinitionImpl
.create(rgb
.red
, rgb
.green
, rgb
.blue
);
329 * Get Position object from int constant
334 protected Position
positionFromInt(int value
)
338 case GraphSettings
.POSITION_LEFT
:
339 return Position
.LEFT_LITERAL
;
340 case GraphSettings
.POSITION_RIGHT
:
341 return Position
.RIGHT_LITERAL
;
342 case GraphSettings
.POSITION_TOP
:
343 return Position
.ABOVE_LITERAL
;
344 case GraphSettings
.POSITION_BOTTOM
:
345 return Position
.BELOW_LITERAL
;
347 return Position
.RIGHT_LITERAL
;
351 * @see org.netxms.ui.eclipse.charts.widgets.GenericChart#setLegendPosition(int)
354 public void setLegendPosition(int position
)
356 super.setLegendPosition(position
);
362 * @see org.netxms.ui.eclipse.charts.widgets.GenericChart#setTranslucent(boolean)
365 public void setTranslucent(boolean translucent
)
367 super.setTranslucent(translucent
);
373 * @see org.netxms.ui.eclipse.charts.api.DataChart#addError(java.lang.String)
376 public void addError(String message
)
378 if (errors
.add(message
))
383 * @see org.netxms.ui.eclipse.charts.api.DataChart#clearErrors()
386 public void clearErrors()
388 if (errors
.size() > 0)
396 * Draw error indicator if needed
400 private void paintErrorIndicator(GC gc
)
402 if (errors
.size() == 0)
405 if (errorImage
== null)
406 errorImage
= Activator
.getImageDescriptor("icons/chart_error.png").createImage(); //$NON-NLS-1$
409 gc
.setBackground(colors
.create(127, 127, 127));
410 gc
.fillRectangle(getClientArea());
412 gc
.drawImage(errorImage
, 10, 10);
414 gc
.setForeground(colors
.create(192, 0, 0));
415 Iterator
<String
> it
= errors
.iterator();
417 int h
= gc
.textExtent("X").y
; //$NON-NLS-1$
420 gc
.drawText(it
.next(), 40, y
, true);
426 public void setYAxisRange(int from
, int to
)