Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 package com.generalrobotix.ui.view.graph;
00011
00012 import java.util.*;
00013 import org.eclipse.swt.graphics.RGB;
00014 import com.generalrobotix.ui.grxui.Activator;
00015
00016
00022 public class TrendGraph {
00023
00024
00025 private static final double MAX_DIV = 5;
00026 private static final double LOG10 = Math.log(10);
00027
00028 public static final int SUCCEEDED = 0;
00029 public static final int NOT_MATCHED = 1;
00030 public static final int NOT_SUPPORTED = 2;
00031
00032 private static final String[] colorTable_ = {"green", "yellow", "cyan", "magenta", "red", "blue" };
00033
00034 private static final int numColors_;
00035 static {
00036 numColors_ = colorTable_.length;
00037 }
00038 public RGB getGraphColor(int index) {
00039 int tmpcolorCounter_ = colorCounter_;
00040 tmpcolorCounter_ = tmpcolorCounter_ + index;
00041 if (tmpcolorCounter_ >= numColors_) {
00042 tmpcolorCounter_ = 0;
00043 }
00044 return Activator.getDefault().getColor(colorTable_[tmpcolorCounter_]).getRGB();
00045 }
00046
00047
00048 private int colorCounter_;
00049
00050 private DataKind dataKind_;
00051 private XYLineGraph graph_;
00052 private TrendGraphModel model_;
00053 private AxisInfo yAxisInfo_;
00054 private AxisInfo xAxisInfo_;
00055
00056 private HashMap<String, DataItemInfo> dataItemInfoMap_;
00057
00058 private String nodeName_;
00059
00060
00061
00062
00063
00064
00071 public TrendGraph(TrendGraphModel model, String node) {
00072 model_ = model;
00073 nodeName_ = node;
00074
00075 xAxisInfo_ = model_.getTimeAxisInfo();
00076 yAxisInfo_ = new AxisInfo(0, 1);
00077 yAxisInfo_.unitFont = Activator.getDefault().getFont( "dialog12" );
00078 yAxisInfo_.unitXOfs = 5;
00079 yAxisInfo_.unitYOfs = 15;
00080
00081 dataKind_ = null;
00082
00083 colorCounter_ = 0;
00084
00085 dataItemInfoMap_ = new HashMap<String, DataItemInfo>();
00086 }
00087
00088
00089
00090 public void setGraph(XYLineGraph graph, LegendPanel legend) {
00091 graph_ = graph;
00092 graph_.setAxisInfo(
00093 XYLineGraph.AXIS_BOTTOM,
00094 xAxisInfo_
00095 );
00096
00097 graph_.setLegend(legend);
00098
00099
00100
00101
00102
00103
00104 }
00105
00106 public XYLineGraph getGraph() {
00107 return graph_;
00108 }
00109
00110 public void repaint() {
00111 graph_.redraw();
00112 }
00113
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00143 public int addDataItem(
00144 DataItemInfo di
00145 ) {
00146
00147
00148 DataKind dataKind = GraphProperties.getDataKindFromAttr(di.dataItem.getFullAttributeName());
00149 if (dataKind == null) {
00150 return NOT_SUPPORTED;
00151 }
00152 if (dataKind_ != null) {
00153 if (!dataKind.equals(dataKind_)) {
00154 return NOT_MATCHED;
00155 }
00156 } else {
00157 dataKind_ = dataKind;
00158
00159
00160
00161
00162 yAxisInfo_.base = dataKind_.base;
00163 yAxisInfo_.extent = dataKind_.extent;
00164 yAxisInfo_.unitLabel = dataKind_.unitLabel;
00165 yAxisInfo_.factor = dataKind_.factor;
00166 _updateDiv();
00167 graph_.setAxisInfo(
00168 XYLineGraph.AXIS_LEFT,
00169 yAxisInfo_
00170 );
00171
00172
00173
00174
00175
00176 }
00177 if(di.color==null)
00178 di.color = Activator.getDefault().getColor(colorTable_[colorCounter_]).getRGB();
00179 if(di.legend==null)
00180 di.legend = di.dataItem.toString();
00181 if(_addDataItem(di))
00182 if (++colorCounter_ >= numColors_)
00183 colorCounter_ = 0;
00184
00185 return SUCCEEDED;
00186 }
00187
00192 public void removeDataItem(
00193 DataItemInfo dataItemInfo
00194 ) {
00195 model_.removeDataItem(dataItemInfo.dataItem);
00196 String key = dataItemInfo.dataItem.toString();
00197
00198 graph_.removeDataSeries(dataItemInfo.dataSeries);
00199
00200 dataItemInfoMap_.remove(key);
00201 if (dataItemInfoMap_.isEmpty()) {
00202 dataKind_ = null;
00203
00204 graph_.setAxisInfo(
00205 XYLineGraph.AXIS_LEFT,
00206 null
00207 );
00208
00209
00210
00211
00212 }
00213
00214
00215
00216
00217 }
00218
00223 public int getNumDataItems() {
00224 return dataItemInfoMap_.size();
00225 }
00226
00231 public DataItemInfo[] getDataItemInfoList() {
00232 return dataItemInfoMap_.values().toArray(new DataItemInfo[0]);
00233 }
00234
00239 public void setDataItemInfo(
00240 DataItemInfo dii
00241 ) {
00242
00243
00244
00245
00246 _setDataItemInfo(dii);
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 }
00258
00259 private void _setDataItemInfo(
00260 DataItemInfo dii
00261 ) {
00262 graph_.setStyle(dii.dataSeries, dii.color);
00263 graph_.setLegendLabel(dii.dataSeries, dii.legend);
00264 }
00265
00271 public void setRange(
00272 double base,
00273 double extent
00274 ) {
00275 _setRange(base, extent);
00276
00277
00278 }
00279
00284 public String getUnitLabel() {
00285 return yAxisInfo_.unitLabel;
00286 }
00287
00292 public double getBase() {
00293 return yAxisInfo_.base;
00294 }
00295
00300 public double getExtent() {
00301 return yAxisInfo_.extent;
00302 }
00303
00309 public void setTimeRangeAndPos(
00310 double timeRange,
00311 double markerPos
00312 ) {
00313 _setTimeRangeAndPos(timeRange, markerPos);
00314
00315
00316
00317
00318 }
00319
00324
00325
00326
00327
00332
00333
00334
00335
00336
00337
00342
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362
00363
00364
00371
00372
00373
00374
00375
00376
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388
00389
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00451 private boolean _addDataItem(
00452 DataItemInfo dataItemInfo
00453 ) {
00454 DataItem dataItem = dataItemInfo.dataItem;
00455 String key = dataItem.toString();
00456
00457 DataSeries ds = model_.addDataItem(dataItem);
00458 if (ds == null) {
00459 return false;
00460 }
00461 dataItemInfo.dataSeries = ds;
00462
00463 if (dataItemInfoMap_.containsKey(key)) {
00464 return false;
00465 }
00466
00467 dataItemInfoMap_.put(key, dataItemInfo);
00468
00469
00470 graph_.addDataSeries(
00471 ds, xAxisInfo_, yAxisInfo_,
00472 dataItemInfo.color,
00473 dataItemInfo.legend
00474 );
00475
00476 return true;
00477 }
00478
00483
00484
00485
00486
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
00503
00509 private void _setRange(
00510 double base,
00511 double extent
00512 ) {
00513 yAxisInfo_.base = base;
00514 yAxisInfo_.extent = extent;
00515 _updateDiv();
00516 }
00517
00522 String _getDataItemNodeName(DataItem di) {
00523 StringBuffer sb = new StringBuffer(nodeName_);
00524 sb.append('.');
00525 sb.append(nodeName_);
00526 if (di.object != null) {
00527 sb.append('_');
00528 sb.append(di.object);
00529 }
00530 sb.append('_');
00531 sb.append(di.node);
00532 sb.append('_');
00533 sb.append(di.attribute);
00534 if (di.index >= 0) {
00535 sb.append('_');
00536 sb.append(di.index);
00537 }
00538
00539 return sb.toString();
00540 }
00541
00542 String getNodeName() {
00543 return nodeName_;
00544 }
00545
00551 private void _setTimeRangeAndPos(
00552 double timeRange,
00553 double markerPos
00554 ) {
00555 model_.setRangeAndPos(timeRange, markerPos);
00556 }
00557
00561 private void _updateDiv() {
00562 double sMin = yAxisInfo_.extent / MAX_DIV;
00563 int eMin = (int)Math.floor(Math.log(sMin) / LOG10);
00564 double step = 0;
00565 String format = "0";
00566 int e = eMin;
00567 boolean found = false;
00568 while (!found) {
00569 int m = 1;
00570 for (int i = 1; i <= 3; i++) {
00571 step = m * Math.pow(10.0, e);
00572 if (sMin <= step) {
00573 if (e < 0) {
00574 char[] c = new char[-e + 2];
00575 c[0] = '0';
00576 c[1] = '.';
00577 for (int j = 0; j < -e; j++) {
00578 c[j + 2] = '0';
00579 }
00580 format = new String(c);
00581 }
00582 found = true;
00583 break;
00584 }
00585 m += (2 * i - 1);
00586 }
00587 e++;
00588 }
00589 yAxisInfo_.tickEvery = step;
00590 yAxisInfo_.labelEvery = step;
00591 yAxisInfo_.gridEvery = step;
00592 yAxisInfo_.labelFormat = format;
00593 }
00594
00595 public void clearDataItem() {
00596 DataItemInfo[] info = getDataItemInfoList();
00597 for (int j = 0; j < info.length; j++)
00598 removeDataItem(info[j]);
00599 }
00600 }