00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 package com.generalrobotix.ui.view.graph;
00011
00012
00013 import java.net.URL;
00014 import java.util.*;
00015
00016
00017 import org.eclipse.jface.dialogs.Dialog;
00018 import org.eclipse.jface.dialogs.IDialogConstants;
00019 import org.eclipse.jface.viewers.ArrayContentProvider;
00020 import org.eclipse.jface.viewers.CellEditor;
00021 import org.eclipse.jface.viewers.ColorCellEditor;
00022 import org.eclipse.jface.viewers.ICellModifier;
00023 import org.eclipse.jface.viewers.ITableColorProvider;
00024 import org.eclipse.jface.viewers.ITableLabelProvider;
00025 import org.eclipse.jface.viewers.LabelProvider;
00026 import org.eclipse.jface.viewers.TableViewer;
00027 import org.eclipse.jface.viewers.TextCellEditor;
00028 import org.eclipse.swt.SWT;
00029 import org.eclipse.swt.events.SelectionEvent;
00030 import org.eclipse.swt.events.SelectionListener;
00031 import org.eclipse.swt.graphics.Color;
00032 import org.eclipse.swt.graphics.Image;
00033 import org.eclipse.swt.graphics.RGB;
00034 import org.eclipse.swt.layout.FillLayout;
00035 import org.eclipse.swt.layout.RowData;
00036 import org.eclipse.swt.layout.RowLayout;
00037 import org.eclipse.swt.widgets.Button;
00038 import org.eclipse.swt.widgets.Combo;
00039 import org.eclipse.swt.widgets.Composite;
00040 import org.eclipse.swt.widgets.Control;
00041 import org.eclipse.swt.widgets.Group;
00042 import org.eclipse.swt.widgets.Item;
00043 import org.eclipse.swt.widgets.Label;
00044 import org.eclipse.swt.widgets.Shell;
00045 import org.eclipse.swt.widgets.Table;
00046 import org.eclipse.swt.widgets.TableColumn;
00047
00048 import com.generalrobotix.ui.grxui.Activator;
00049 import com.generalrobotix.ui.item.GrxLinkItem;
00050 import com.generalrobotix.ui.item.GrxModelItem;
00051 import com.generalrobotix.ui.util.MessageBundle;
00052
00053
00059 @SuppressWarnings("serial")
00060 public class SeriesDialog extends Dialog {
00061 private boolean updated_;
00062 private ArrayList<DataItemInfo> dataItemInfoList_;
00063 private ArrayList<DataItemInfo> removedList_;
00064 private DataItemInfo[] dataItemInfoArray_;
00065 private DataItemInfo[] removedArray_;
00066
00067 private ArrayList<DataItemInfo> addedList_;
00068 private DataItemInfo[] addedArray_;
00069
00070
00071 private TableViewer tableviewer_;
00072 private static final String ROBOT_MODEL = "ROBOT MODEL";
00073 private static final String DATA_TYPE = "DATA TYPE";
00074 private static final String LINK_NAME = "LINK NAME";
00075 private static final String ATTRIBUTE = "ATTRIBUTE";
00076 private static final String colNode = MessageBundle.get("dialog.graph.series.table.node");
00077 private static final String colAttribute = MessageBundle.get("dialog.graph.series.table.attribute");
00078 private static final String colIndex = MessageBundle.get("dialog.graph.series.table.index");
00079 private static final String colColor = MessageBundle.get("dialog.graph.series.table.color");
00080 private static final String colLegend = MessageBundle.get("dialog.graph.series.table.legend");
00081 private Combo comboModel_ ;
00082 private Combo comboType_ ;
00083 private Combo comboLink_ ;
00084 private Combo comboAttr_ ;
00085 private Button setButton_;
00086 private Button removeButton_;
00087
00088 private static final String GRAPH_PROPERTIES = "/resources/graph.properties";
00089 private URL url = this.getClass().getResource(GRAPH_PROPERTIES);
00090 private Properties prop = new Properties();
00091 private GraphElement currentGraph_;
00092
00093 private MyTable tableModel_;
00094 private final Map<String, ArrayList<String>> nodeMap = new HashMap<String, ArrayList<String>>();
00095 private int graphIndex = 0;
00096 private List<GrxModelItem> currentModels_ = null;
00097
00098 public SeriesDialog(GraphElement initialGraph, Shell shell) {
00099 super(shell);
00100 currentGraph_ = initialGraph;
00101
00102 tableModel_ = new MyTable();
00103
00104 try {
00105 prop.load(url.openStream());
00106 } catch (java.io.IOException e) {
00107 e.printStackTrace();
00108 }
00109
00110
00111 List<String> typeList = new ArrayList<String>();
00112 typeList.add("Joint");
00113 typeList.add("ForceSensor");
00114 typeList.add("Gyro");
00115 typeList.add("AccelerationSensor");
00116
00117 Iterator<Object> it = prop.keySet().iterator();
00118 while (it.hasNext()) {
00119 String key = (String) it.next();
00120 String[] property = key.split("[.]");
00121 if (property.length > 2 && property[2].equals("dataKind") && typeList.contains(property[0])) {
00122 if (!nodeMap.containsKey(property[0]))
00123 nodeMap.put(property[0], new ArrayList<String>());
00124 nodeMap.get(property[0]).add(property[1]);
00125 }
00126 }
00127 }
00128
00129 protected void configureShell(Shell newShell) {
00130 super.configureShell(newShell);
00131 newShell.setText(MessageBundle.get("dialog.graph.series.title"));
00132 }
00133
00134 protected Control createDialogArea(Composite parent) {
00135 Composite composite = (Composite)super.createDialogArea(parent);
00136 composite.setLayout(new RowLayout(SWT.VERTICAL));
00137 RowData rowdata = new RowData();
00138 rowdata.height = 100;
00139 rowdata.width = 600;
00140
00141 Label label = new Label(composite, SWT.LEFT);
00142 label.setText(MessageBundle.get("dialog.graph.series.dataseries"));
00143 tableviewer_ = new TableViewer(composite, SWT.FULL_SELECTION | SWT.BORDER);
00144 tableviewer_.getControl().setLayoutData(rowdata);
00145 Table table = tableviewer_.getTable();
00146 table.setFont(Activator.getDefault().getFont("preference_table"));
00147 table.setLinesVisible(true);
00148 table.setHeaderVisible(true);
00149 TableColumn column = new TableColumn(table,SWT.NONE);
00150 column.setText(colNode);
00151 column.setWidth(100);
00152 column = new TableColumn(table,SWT.NONE);
00153 column.setText(colAttribute);
00154 column.setWidth(100);
00155 column = new TableColumn(table,SWT.NONE);
00156 column.setText(colIndex);
00157 column.setWidth(60);
00158 column = new TableColumn(table,SWT.NONE);
00159 column.setText(colColor);
00160 column.setWidth(60);
00161 column = new TableColumn(table,SWT.NONE);
00162 column.setText(colLegend);
00163 column.setWidth(280);
00164
00165 String[] properties = new String[]{ null, null, null, "color", "legend"};
00166 tableviewer_.setColumnProperties(properties);
00167 CellEditor[] editors = new CellEditor[]{ null, null, null,
00168 new ColorCellEditor(table),
00169 new TextCellEditor(table) };
00170 tableviewer_.setCellEditors(editors);
00171 tableviewer_.setContentProvider(new ArrayContentProvider());
00172 tableviewer_.setLabelProvider(new MyLabelProvider());
00173 tableviewer_.setCellModifier(new MyCellModifier(tableviewer_));
00174
00175 tableviewer_.setInput(tableModel_.getList());
00176
00177 Composite line3 = new Composite(composite, SWT.NONE);
00178 line3.setLayout(new RowLayout());
00179 Group group0 = new Group(line3, SWT.NONE);
00180 group0.setText(ROBOT_MODEL);
00181 group0.setLayout(new FillLayout());
00182 comboModel_ = new Combo(group0,SWT.READ_ONLY);
00183 comboModel_.addSelectionListener(new SelectionListener() {
00184 public void widgetDefaultSelected(SelectionEvent e) {
00185 }
00186 public void widgetSelected(SelectionEvent e) {
00187 comboType_.removeAll();
00188 comboLink_.removeAll();
00189 comboAttr_.removeAll();
00190
00191 Iterator<String> it = nodeMap.keySet().iterator();
00192 if (tableModel_.getRowCount() > 0) {
00193 String curAttr = currentGraph_.getTrendGraph().getDataItemInfoList()[0].dataItem.attribute;
00194 while (it.hasNext()) {
00195 String key = it.next();
00196 if (nodeMap.get(key).contains(curAttr))
00197 comboType_.add(key);
00198 }
00199 } else {
00200 while (it.hasNext()) {
00201 comboType_.add(it.next());
00202 }
00203 }
00204 comboType_.setEnabled(true);
00205 comboLink_.setEnabled(false);
00206 comboAttr_.setEnabled(false);
00207 setButton_.setEnabled(false);
00208
00209
00210
00211 if(comboType_.getItemCount()>0){
00212 comboType_.select(0);
00213 comboType_.notifyListeners(SWT.Selection, null);
00214 }
00215
00216 }
00217 });
00218 Group group1 = new Group(line3, SWT.NONE);
00219 group1.setText(DATA_TYPE);
00220 group1.setLayout(new FillLayout());
00221 comboType_ = new Combo(group1,SWT.READ_ONLY);
00222 comboType_.addSelectionListener(new SelectionListener() {
00223 public void widgetDefaultSelected(SelectionEvent e) {
00224 }
00225 public void widgetSelected(SelectionEvent e) {
00226
00227 comboLink_.removeAll();
00228 comboAttr_.removeAll();
00229
00230 String type = comboType_.getItem(comboType_.getSelectionIndex());
00231 String modelName = comboModel_.getItem(comboModel_.getSelectionIndex());
00232 Iterator<GrxModelItem> it = currentModels_.iterator();
00233 GrxModelItem model=null;
00234 while (it.hasNext()) {
00235 model = it.next();
00236 if(model.getName().equals(modelName))
00237 break;
00238 }
00239 if (type.equals("Joint")) {
00240 Vector<GrxLinkItem> li = model.links_;
00241 for (int i = 0; i < li.size(); i++)
00242 comboLink_.add(li.get(i).getName());
00243 } else {
00244 String t = null;
00245 if (type.equals("ForceSensor"))
00246 t = "Force";
00247 else if (type.equals("Gyro"))
00248 t = "RateGyro";
00249 else if (type.equals("AccelerationSensor"))
00250 t = "Acceleration";
00251 String[] snames = model.getSensorNames(t);
00252
00253 if (snames != null) {
00254 for (int i=0; i<snames.length; i++) {
00255 comboLink_.add(snames[i]);
00256 }
00257 }
00258 }
00259 comboLink_.setEnabled(true);
00260 comboAttr_.setEnabled(false);
00261 setButton_.setEnabled(false);
00262
00263
00264 if(comboLink_.getItemCount()>0){
00265 comboLink_.select(0);
00266 comboLink_.notifyListeners(SWT.Selection, null);
00267 }
00268 }
00269 });
00270 Group group2 = new Group(line3, SWT.NONE);
00271 group2.setText(LINK_NAME);
00272 group2.setLayout(new FillLayout());
00273 comboLink_ = new Combo(group2,SWT.READ_ONLY);
00274 comboLink_.addSelectionListener(new SelectionListener() {
00275
00276 public void widgetDefaultSelected(SelectionEvent e) {
00277 }
00278
00279 public void widgetSelected(SelectionEvent e) {
00280
00281 comboAttr_.removeAll();
00282
00283 String type = comboType_.getItem(comboType_.getSelectionIndex());
00284 List<String> l = nodeMap.get(type);
00285 if(type.equals("Joint")){
00286 String modelName = comboModel_.getItem(comboModel_.getSelectionIndex());
00287 Iterator<GrxModelItem> it = currentModels_.iterator();
00288 GrxModelItem model=null;
00289 while (it.hasNext()) {
00290 model = it.next();
00291 if(model.getName().equals(modelName))
00292 break;
00293 }
00294 String linkName = comboLink_.getItem(comboLink_.getSelectionIndex());
00295 boolean isControlJoint = false;
00296 if(model!=null){
00297 GrxLinkItem link = model.getLink(linkName);
00298 if(link!=null)
00299 if(link.jointType_.equals("rotate") || link.jointType_.equals("slide") )
00300 isControlJoint = true;
00301 }
00302 if (tableModel_.getRowCount() > 0) {
00303 String curAttr = (String)tableModel_.getValueAt(0, 1);
00304 if(!isControlJoint)
00305 if(curAttr.equals("translation") || curAttr.equals("attitude"))
00306 comboAttr_.add(curAttr);
00307 else
00308 ;
00309 else
00310 if (l.contains(curAttr))
00311 comboAttr_.add(curAttr);
00312 else
00313 ;
00314 } else {
00315 if(!isControlJoint){
00316 comboAttr_.add("translation");
00317 comboAttr_.add("attitude");
00318 }else {
00319 Iterator<String> it0 = l.iterator();
00320 while (it0.hasNext()) {
00321 comboAttr_.add(it0.next());
00322 }
00323 }
00324 }
00325 }else{
00326 if (tableModel_.getRowCount() > 0) {
00327 String curAttr = (String)tableModel_.getValueAt(0, 1);
00328 if (l.contains(curAttr))
00329 comboAttr_.add(curAttr);
00330 }else {
00331 Iterator<String> it0 = l.iterator();
00332 while (it0.hasNext())
00333 comboAttr_.add(it0.next());
00334 }
00335 }
00336 comboAttr_.setEnabled(true);
00337
00338 setButton_.setEnabled(comboAttr_.getItemCount() > 0);
00339
00340
00341 if(comboAttr_.getItemCount()>0)
00342 comboAttr_.select(0);
00343 }
00344 });
00345 Group group3 = new Group(line3, SWT.NONE);
00346 group3.setText(ATTRIBUTE);
00347 group3.setLayout(new FillLayout());
00348 comboAttr_ = new Combo(group3,SWT.READ_ONLY);
00349 removeButton_ = new Button(line3,SWT.PUSH);
00350 removeButton_.setText(MessageBundle.get("dialog.graph.series.remove"));
00351 removeButton_.addSelectionListener(new SelectionListener(){
00352 public void widgetDefaultSelected(SelectionEvent e) {
00353 }
00354
00355 public void widgetSelected(SelectionEvent e) {
00356 int ind = tableviewer_.getTable().getSelectionIndex();
00357 if (ind < 0)
00358 return;
00359
00360 tableModel_.removeRow(ind);
00361 tableviewer_.refresh();
00362 int cnt = tableModel_.getRowCount();
00363 if (cnt < 1) {
00364 _resetSelection();
00365 return;
00366 }
00367 if (ind >= cnt) {
00368 ind -= 1;
00369 }
00370 tableviewer_.getTable().select(ind);
00371 }
00372 });
00373 removeButton_.setEnabled(true);
00374 setButton_ = new Button(line3,SWT.PUSH);
00375 setButton_.setText(MessageBundle.get("dialog.graph.series.set"));
00376 setButton_.addSelectionListener(new SelectionListener(){
00377
00378 public void widgetDefaultSelected(SelectionEvent e) {
00379 }
00380
00381 public void widgetSelected(SelectionEvent e) {
00382 int length = 1;
00383 String combo1 = (String)comboType_.getItem(comboType_.getSelectionIndex());
00384 if (combo1.equals("ForceSensor") ||
00385 combo1.equals("AccelerationSensor") ||
00386 combo1.equals("Gyro"))
00387 length = 3;
00388 String model = comboModel_.getItem(comboModel_.getSelectionIndex());
00389 String link = comboLink_.getItem(comboLink_.getSelectionIndex());
00390 String attr = comboAttr_.getItem(comboAttr_.getSelectionIndex());
00391 if(combo1.equals("Joint") && (attr.equals("translation") || attr.equals("attitude")))
00392 length = 3;
00393 for (int i=0; i<length; i++) {
00394 String legend = model + "." + link + "." + attr + (length > 1 ? "." + i : "");
00395 if(!tableModel_.contains(legend)){
00396 DataItemInfo newDataItemInfo = new DataItemInfo(new DataItem(model,link,attr,
00397 length > 1 ? i : -1,
00398 comboType_.getItem(comboType_.getSelectionIndex())),
00399 currentGraph_.getTrendGraph().getGraphColor(graphIndex),
00400 legend);
00401 tableModel_.addRow(newDataItemInfo, legend);
00402 tableviewer_.refresh();
00403 graphIndex++;
00404 }
00405 }
00406 removeButton_.setEnabled(true);
00407 comboLink_.notifyListeners(SWT.Selection, null);
00408 }
00409 });
00410 _resetSelection();
00411 return composite;
00412 }
00413
00414 protected void buttonPressed(int buttonId) {
00415 if (buttonId == IDialogConstants.OK_ID) {
00416 ArrayList<DataItemInfo> newDataItemInfoList = new ArrayList<DataItemInfo>();
00417 for(int i=0; i<tableModel_.getRowCount(); i++){
00418 String fullName = tableModel_.getString(i);
00419 Iterator<DataItemInfo> it = dataItemInfoList_.iterator();
00420 boolean contain = false;
00421 while(it.hasNext()){
00422 DataItemInfo info = it.next();
00423 if(fullName.equals(info.dataItem.toString())){
00424 info.color = (RGB)tableModel_.getValueAt(i, 3);
00425 info.legend = (String)tableModel_.getValueAt(i, 4);
00426 newDataItemInfoList.add(info);
00427 dataItemInfoList_.remove(info);
00428 contain = true;
00429 break;
00430 }
00431 }
00432 if(!contain){
00433 addedList_.add(tableModel_.getItem(i));
00434 }
00435 }
00436 Iterator<DataItemInfo> it = dataItemInfoList_.iterator();
00437 while(it.hasNext()){
00438 removedList_.add(it.next());
00439 }
00440 dataItemInfoArray_ =
00441 newDataItemInfoList.toArray(new DataItemInfo[0]);
00442 removedArray_ = removedList_.toArray(new DataItemInfo[0]);
00443 removeAllRows();
00444 addedArray_ = addedList_.toArray(new DataItemInfo[0]);
00445 updated_ = true;
00446 }else if(buttonId == IDialogConstants.CANCEL_ID){
00447 removeAllRows();
00448 }
00449 setReturnCode(buttonId);
00450 close();
00451 super.buttonPressed(buttonId);
00452 }
00453
00454 private void _resetSelection() {
00455 graphIndex = 0;
00456
00457
00458 comboModel_.removeAll();
00459 Iterator<GrxModelItem> it = currentModels_.iterator();
00460 while (it.hasNext()) {
00461 GrxModelItem model = it.next();
00462 if (model.isRobot())
00463 comboModel_.add(model.getName());
00464 }
00465 comboType_.removeAll();
00466 comboLink_.removeAll();
00467 comboAttr_.removeAll();
00468
00469 comboModel_.setEnabled(true);
00470 comboType_.setEnabled(false);
00471 comboLink_.setEnabled(false);
00472 comboAttr_.setEnabled(false);
00473 setButton_.setEnabled(false);
00474
00475
00476 if(comboModel_.getItemCount()>0){
00477 comboModel_.select(0);
00478 comboModel_.notifyListeners(SWT.Selection, null);
00479 }
00480 }
00481
00482 public void setCurrentGraph(GraphElement currentGraph) {
00483 currentGraph_ = currentGraph;
00484 }
00485
00486
00492 public int open( ) {
00493 removedList_ = new ArrayList<DataItemInfo>();
00494 addedList_ = new ArrayList<DataItemInfo>();
00495 updated_ = false;
00496 return super.open();
00497 }
00498
00499
00503 public void setDataItemInfoList( DataItemInfo[] dii) {
00504 dataItemInfoList_ = new ArrayList<DataItemInfo>();
00505 for (int i = 0; i < dii.length; i++) {
00506 dataItemInfoList_.add(dii[i]);
00507 tableModel_.addRow(dii[i],dii[i].dataItem.toString());
00508 }
00509 }
00510
00514 public DataItemInfo[] getDataItemInfoList() {
00515 return dataItemInfoArray_;
00516 }
00517
00521 public DataItemInfo[] getRemovedList() {
00522 return removedArray_;
00523 }
00524 public DataItemInfo[] getAddedList() {
00525 return addedArray_;
00526 }
00530 public boolean isUpdated() {
00531 return updated_;
00532 }
00533
00537 private void removeAllRows() {
00538 int cnt = tableModel_.getRowCount();
00539 for (int i = 0; i < cnt; i++) {
00540 tableModel_.removeRow(0);
00541 }
00542 }
00543
00544 private class MyTable {
00545 private ArrayList<String> nameList = new ArrayList<String>();
00546 private ArrayList<DataItemInfo> itemList = new ArrayList<DataItemInfo>();
00547
00548 public void addRow(DataItemInfo item, String name){
00549 itemList.add(item);
00550 nameList.add(name);
00551 }
00552
00553 public void removeRow(int i){
00554 itemList.remove(i);
00555 nameList.remove(i);
00556 }
00557
00558 public DataItemInfo getItem(int i){
00559 return itemList.get(i);
00560 }
00561
00562 public int getRowCount(){
00563 return itemList.size();
00564 }
00565
00566 public String getString(int i){
00567 return nameList.get(i);
00568 }
00569
00570 public ArrayList getList(){
00571 return itemList;
00572 }
00573
00574 public boolean contains(String name){
00575 return nameList.contains(name);
00576 }
00577
00578 public Object getValueAt(int i, int j){
00579 DataItemInfo dii = itemList.get(i);
00580 DataItem di = dii.dataItem;
00581 switch (j) {
00582 case 0:
00583 if (di.object == null) {
00584 return di.node;
00585 }else{
00586 return di.object + "." + di.node;
00587 }
00588 case 1:
00589 return di.attribute;
00590 case 2:
00591 return new Integer(di.index);
00592 case 3:
00593 return dii.color;
00594 case 4:
00595 return dii.legend;
00596 default:
00597 break;
00598 }
00599 return null;
00600 }
00601 }
00602
00603 public void setModelList(List<GrxModelItem> list){
00604 currentModels_ = list;
00605 }
00606
00607 public class MyLabelProvider extends LabelProvider
00608 implements ITableLabelProvider, ITableColorProvider {
00609
00610 public Image getColumnImage(Object element, int columnIndex) {
00611 return null;
00612 }
00613
00614 public String getColumnText(Object element, int columnIndex) {
00615 DataItemInfo item = (DataItemInfo) element;
00616 String result = "";
00617 DataItem di = item.dataItem;
00618 switch (columnIndex) {
00619 case 0:
00620 if (di.object == null) {
00621 result = di.node;
00622 }else{
00623 result = di.object + "." + di.node;
00624 }
00625 break;
00626 case 1:
00627 result = di.attribute;
00628 break;
00629 case 2:
00630 if(di.index < 0)
00631 result = "";
00632 else
00633 result = (new Integer(di.index)).toString();
00634 break;
00635 case 3:
00636 result = "";
00637 break;
00638 case 4:
00639 result = item.legend;
00640 break;
00641 default:
00642 break;
00643 }
00644 return result;
00645 }
00646
00647 public Color getBackground(Object element, int columnIndex) {
00648 DataItemInfo item = (DataItemInfo) element;
00649 if(columnIndex == 3)
00650 return Activator.getDefault().getColor(item.color);
00651 else
00652 return null;
00653 }
00654
00655 public Color getForeground(Object element, int columnIndex) {
00656 return null;
00657 }
00658 }
00659
00660 public class MyCellModifier implements ICellModifier {
00661 private TableViewer viewer_;
00662
00663 public MyCellModifier(TableViewer viewer) {
00664 this.viewer_ = viewer;
00665 }
00666
00667 public boolean canModify(Object element, String property) {
00668 if(property == "color" || property == "legend")
00669 return true;
00670 else
00671 return false;
00672 }
00673
00674 public Object getValue(Object element, String property) {
00675 DataItemInfo item = (DataItemInfo) element;
00676 if(property == "color")
00677 return item.color;
00678 else if(property == "legend")
00679 return item.legend;
00680 return null;
00681 }
00682
00683 public void modify(Object element, String property, Object value) {
00684 if (element instanceof Item) {
00685 element = ((Item) element).getData();
00686 }
00687 DataItemInfo item = (DataItemInfo) element;
00688 if(property == "color"){
00689 item.color =(RGB)value;
00690 }else if(property == "legend")
00691 item.legend = (String)value;
00692
00693 viewer_.update(element, null);
00694 }
00695 }
00696 }