00001 package com.generalrobotix.ui.view.simulation;
00002
00003 import java.io.BufferedReader;
00004 import java.io.BufferedWriter;
00005 import java.io.File;
00006 import java.io.FileNotFoundException;
00007 import java.io.FileReader;
00008 import java.io.FileWriter;
00009 import java.io.IOException;
00010 import java.util.HashMap;
00011 import java.util.Iterator;
00012 import java.util.Vector;
00013
00014 import org.eclipse.jface.dialogs.Dialog;
00015 import org.eclipse.jface.dialogs.IDialogConstants;
00016 import org.eclipse.jface.dialogs.MessageDialog;
00017 import org.eclipse.jface.viewers.ArrayContentProvider;
00018 import org.eclipse.jface.viewers.CellEditor;
00019 import org.eclipse.jface.viewers.ComboBoxCellEditor;
00020 import org.eclipse.jface.viewers.DialogCellEditor;
00021 import org.eclipse.jface.viewers.ICellModifier;
00022 import org.eclipse.jface.viewers.ILabelProviderListener;
00023 import org.eclipse.jface.viewers.ITableLabelProvider;
00024 import org.eclipse.jface.viewers.TableViewer;
00025 import org.eclipse.jface.viewers.TextCellEditor;
00026 import org.eclipse.swt.SWT;
00027 import org.eclipse.swt.custom.PopupList;
00028 import org.eclipse.swt.custom.StyledText;
00029 import org.eclipse.swt.dnd.DND;
00030 import org.eclipse.swt.dnd.DragSource;
00031 import org.eclipse.swt.dnd.DragSourceEvent;
00032 import org.eclipse.swt.dnd.DragSourceListener;
00033 import org.eclipse.swt.dnd.DropTarget;
00034 import org.eclipse.swt.dnd.DropTargetEvent;
00035 import org.eclipse.swt.dnd.DropTargetListener;
00036 import org.eclipse.swt.dnd.TextTransfer;
00037 import org.eclipse.swt.dnd.Transfer;
00038 import org.eclipse.swt.events.ModifyEvent;
00039 import org.eclipse.swt.events.ModifyListener;
00040 import org.eclipse.swt.events.MouseEvent;
00041 import org.eclipse.swt.events.MouseListener;
00042 import org.eclipse.swt.events.SelectionEvent;
00043 import org.eclipse.swt.events.SelectionListener;
00044 import org.eclipse.swt.graphics.Color;
00045 import org.eclipse.swt.graphics.Image;
00046 import org.eclipse.swt.graphics.Rectangle;
00047 import org.eclipse.swt.layout.FillLayout;
00048 import org.eclipse.swt.layout.GridData;
00049 import org.eclipse.swt.layout.GridLayout;
00050 import org.eclipse.swt.layout.RowLayout;
00051 import org.eclipse.swt.widgets.Button;
00052 import org.eclipse.swt.widgets.Composite;
00053 import org.eclipse.swt.widgets.Control;
00054 import org.eclipse.swt.widgets.FileDialog;
00055 import org.eclipse.swt.widgets.Item;
00056 import org.eclipse.swt.widgets.Label;
00057 import org.eclipse.swt.widgets.Shell;
00058 import org.eclipse.swt.widgets.Table;
00059 import org.eclipse.swt.widgets.TableColumn;
00060 import org.eclipse.swt.widgets.Text;
00061
00062 import com.generalrobotix.ui.grxui.Activator;
00063 import com.generalrobotix.ui.grxui.GrxUIPerspectiveFactory;
00064 import com.generalrobotix.ui.item.GrxLinkItem;
00065 import com.generalrobotix.ui.item.GrxModelItem;
00066 import com.generalrobotix.ui.item.GrxSensorItem;
00067 import com.generalrobotix.ui.util.GrxDebugUtil;
00068 import com.generalrobotix.ui.util.MessageBundle;
00069
00070 public class ControllerBridgePanel extends Dialog{
00071 private Vector<String> controllerBridgeFile_ = new Vector<String>();
00072 private String fileName_;
00073 private String rtcConfFileName_;
00074 private String controllerName_;
00075 private String projectControllerName_;
00076 private String robotName_;
00077 private GrxModelItem robot_;
00078 private String robotRtcName_;
00079 private Vector<Inport> inport_ = new Vector<Inport>();
00080 private Vector<Outport> outport_ = new Vector<Outport>();
00081 private HashMap<String, String> connection_ = new HashMap<String, String>();
00082 private NameServer nameServer_ = new NameServer();
00083 private Vector<Port> portTable_ = new Vector<Port>();
00084 private boolean useConfigFile_;
00085 private String configFileName_;
00086 private StringBuffer bridgeConfFile_ = new StringBuffer();
00087 private double controlTime_ = 0;
00088 private enum DataTypeId {JOINT_VALUE, JOINT_VELOCITY, JOINT_ACCELERATION, JOINT_TORQUE, EXTERNAL_FORCE,
00089 ABS_TRANSFORM, ABS_VELOCITY, ABS_ACCELERATION, FORCE_SENSOR, RATE_GYRO_SENSOR, ACCELERATION_SENSOR,
00090 RANGE_SENSOR, CONSTRAINT_FORCE, COLOR_IMAGE, GRAYSCALE_IMAGE, DEPTH_IMAGE;
00091 public static enum NUMID_CODE {INVALID_TYPE, NOT_USED, USED, ONLY_ONE, NUMBER};
00092 public static String[] getNames(){
00093 String[] s = new String[values().length];
00094 int i=0;
00095 for(DataTypeId id : values()){
00096 s[i++] = id.name();
00097 }
00098 return s;
00099 }
00100 public static boolean isInport(String type){
00101 if(DataTypeId.valueOf(type).compareTo(DataTypeId.ABS_ACCELERATION) > 0 )
00102 return false;
00103 else
00104 return true;
00105 }
00106 public static boolean isOutport(String type){
00107 if(DataTypeId.valueOf(type).compareTo(DataTypeId.EXTERNAL_FORCE) == 0 )
00108 return false;
00109 else
00110 return true;
00111 }
00112 public static NUMID_CODE numId(String type){
00113 int ordinal = DataTypeId.valueOf(type).ordinal();
00114 if(ordinal <= 3 || (8<=ordinal && ordinal <=11) )
00115 return NUMID_CODE.NOT_USED;
00116 if(4<=ordinal && ordinal<=7)
00117 return NUMID_CODE.USED;
00118 if(ordinal==12)
00119 return NUMID_CODE.ONLY_ONE;
00120 if(13<=ordinal && ordinal<=15)
00121 return NUMID_CODE.NUMBER;
00122 return NUMID_CODE.INVALID_TYPE;
00123 }
00124 }
00125 private String errorMessage_;
00126 private Vector<String> rtcConfFile_ = new Vector<String>();
00127 private NameServer rtcNameServer_ = new NameServer();
00128 private String moduleName_;
00129 private String controllerRtcName_;
00130 private String endChar_ = "";
00131 private String commentChar_ = "";
00132 private int commandLineStart_=0;
00133 private int commandLineEnd_=0;
00134
00135 private StyledText cbtext_;
00136 private StyledText rctext_;
00137 private StyledText bctext_;
00138 private Text rrnText_;
00139 private Text nshText_;
00140 private Text nspText_;
00141 private TableViewer tableviewer_;
00142 private StyledText emText_;
00143 private Button saveButton_ ;
00144 private Button saveAsButton_ ;
00145 private Label fileNameLabel_;
00146 private Label rtcConfFileNameLabel_;
00147 private Label bridgeConfFileNameLabel_;
00148
00149 private int os_;
00150 private final int LINUX = 0;
00151 private final int WINDOWS = 1;
00152
00153 ControllerBridgePanel(Shell shell) {
00154 super(shell);
00155 if(System.getProperty("os.name").equals("Linux") || System.getProperty("os.name").equals("Mac OS X")){
00156 os_ = LINUX;
00157 endChar_ = "\\";
00158 commentChar_ = "#";
00159 }else{
00160 endChar_ = "^";
00161 os_ = WINDOWS;
00162 commentChar_ = "REM";
00163 }
00164 init();
00165 }
00166
00167 protected void configureShell(Shell newShell) {
00168 super.configureShell(newShell);
00169 newShell.setText(MessageBundle.get("panel.Bridge.title"));
00170 }
00171
00172 protected Control createDialogArea(Composite parent) {
00173 Composite composite = (Composite)super.createDialogArea(parent);
00174 composite.setLayout(new GridLayout(1,true));
00175
00176 Composite panel0 = new Composite(composite,SWT.NONE);
00177 panel0.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
00178 panel0.setLayout(new GridLayout(3,false));
00179 Label label = new Label(panel0, SWT.LEFT );
00180 label.setText(MessageBundle.get("panel.Bridge.controllerName")+":");
00181 final Text text = new Text(panel0, SWT.BORDER);
00182 text.setText(controllerName_);
00183 text.addModifyListener(new ModifyListener(){
00184 public void modifyText(ModifyEvent e) {
00185 String newName = text.getText();
00186 if(projectControllerName_.equals(newName))
00187 text.setForeground(Activator.getDefault().getColor("black"));
00188 else
00189 text.setForeground(Activator.getDefault().getColor("red"));
00190 controllerName_ = newName;
00191 rrnTextUpdate();
00192 saveButtonEnabled(false);
00193 }
00194 });
00195
00196 GridData gridData = new GridData(GridData.FILL_HORIZONTAL);
00197 gridData.horizontalSpan = 2;
00198 text.setLayoutData(gridData);
00199 Label label0 = new Label(panel0, SWT.LEFT );
00200 label0.setText(MessageBundle.get("panel.Bridge.robotName")+":"+robotName_+" ");
00201 Label label1 = new Label(panel0, SWT.LEFT);
00202 label1.setText(MessageBundle.get("panel.Bridge.robotRtcName")+":");
00203 label1.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
00204 rrnText_ = new Text(panel0, SWT.BORDER);
00205 GridData gridData0 = new GridData();
00206 gridData0.horizontalAlignment = GridData.FILL;
00207 gridData0.grabExcessHorizontalSpace = true;
00208 rrnText_.setLayoutData(gridData0);
00209 rrnTextUpdate();
00210 rrnText_.addModifyListener(new ModifyListener(){
00211 public void modifyText(ModifyEvent e) {
00212 if(rrnText_.isFocusControl()){
00213 robotRtcName_ = rrnText_.getText();
00214 saveButtonEnabled(false);
00215 }
00216 }
00217 });
00218
00219 tableviewer_ = new TableViewer(composite, SWT.FULL_SELECTION | SWT.BORDER);
00220 Table table = tableviewer_.getTable();
00221 table.setFont(Activator.getDefault().getFont("preference_table"));
00222 table.setLinesVisible(true);
00223 table.setHeaderVisible(true);
00224 TableColumn column = new TableColumn(table,SWT.NONE);
00225 column.setText("Type");
00226 column.setWidth(100);
00227 column = new TableColumn(table,SWT.NONE);
00228 column.setText("name");
00229 column.setWidth(100);
00230 column = new TableColumn(table,SWT.NONE);
00231 column.setText("property");
00232 column.setWidth(100);
00233 column = new TableColumn(table,SWT.NONE);
00234 column.setText("id");
00235 column.setWidth(100);
00236 column = new TableColumn(table,SWT.NONE);
00237 column.setText("output Time");
00238 column.setWidth(100);
00239 column = new TableColumn(table,SWT.NONE);
00240 column.setText("Controller : Port name");
00241 column.setWidth(200);
00242 GridData gridData1 = new GridData(GridData.FILL_VERTICAL);
00243 gridData1.minimumHeight = 200;
00244 tableviewer_.getControl().setLayoutData(gridData1);
00245 tableviewer_.setContentProvider(new ArrayContentProvider());
00246 tableviewer_.setLabelProvider(new InportLabelProvider());
00247 tableviewer_.setInput(portTable_);
00248 tableviewer_.setColumnProperties(new String[] {"type", "name", "property", "id", "time", "portName"});
00249 DialogCellEditor idCellEditor =new DialogCellEditor(tableviewer_.getTable()){
00250 protected Object openDialogBox(Control cellEditorWindow) {
00251 IdCellDialog dialog = new IdCellDialog(cellEditorWindow.getShell());
00252 dialog.setId((String)getValue());
00253 if(dialog.open() == IDialogConstants.OK_ID)
00254 setValue(dialog.getId());
00255 return null;
00256 }
00257 };
00258 CellEditor[] editors = new CellEditor[] {
00259 new ComboBoxCellEditor(tableviewer_.getTable(), new String[]{"IN", "OUT" }),
00260 new TextCellEditor(tableviewer_.getTable()),
00261 new ComboBoxCellEditor(tableviewer_.getTable(), DataTypeId.getNames()),
00262 idCellEditor,
00263 new TextCellEditor(tableviewer_.getTable()),
00264 new TextCellEditor(tableviewer_.getTable()) };
00265 tableviewer_.setCellEditors(editors);
00266 tableviewer_.setCellModifier(new TableCellModifier());
00267 tableviewer_.getControl().addMouseListener(new MouseListener(){
00268 public void mouseDoubleClick(MouseEvent e) {
00269 }
00270 public void mouseDown(MouseEvent e) {
00271 if(e.button!=1){
00272 PopupList list = new PopupList(getShell());
00273 list.setItems(new String[]{MessageBundle.get("panel.Bridge.add"),
00274 MessageBundle.get("panel.Bridge.delete")});
00275 Rectangle rectangle = getShell().getBounds();
00276 String s = list.open(new Rectangle(rectangle.x+e.x, rectangle.y+e.y, 100, 100));
00277 if(s.equals(MessageBundle.get("panel.Bridge.add"))){
00278 Port _port = new Port();
00279 _port.type_ = "IN";
00280 _port.name_ = "";
00281 _port.propertyName_ = "JOINT_VALUE";
00282 _port.id_ = "All joints";
00283 _port.outputTime_ = "";
00284 _port.controllerPortName_ = "";
00285 portTable_.add(_port);
00286 tableviewer_.refresh();
00287 saveButtonEnabled(false);
00288 }else{
00289 int row = tableviewer_.getTable().getSelectionIndex();
00290 portTable_.remove(row);
00291 tableviewer_.refresh();
00292 saveButtonEnabled(false);
00293 }
00294 }
00295 }
00296 public void mouseUp(MouseEvent e) {
00297 }
00298
00299 });
00300
00301 Composite panel1 = new Composite(composite,SWT.NONE);
00302 panel1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
00303 panel1.setLayout(new GridLayout(3,false));
00304 Label label2 = new Label(panel1, SWT.LEFT );
00305 label2.setText(MessageBundle.get("panel.Bridge.nameServer")+": ");
00306 Label label3 = new Label(panel1, SWT.LEFT );
00307 label3.setText(MessageBundle.get("panel.Bridge.host")+": ");
00308 nshText_ = new Text(panel1, SWT.BORDER);
00309 Label dumy = new Label(panel1, SWT.LEFT );
00310 Label label4 = new Label(panel1, SWT.LEFT );
00311 label4.setText(MessageBundle.get("panel.Bridge.port")+": ");
00312 nspText_ = new Text(panel1, SWT.BORDER);
00313 nshText_.setText(nameServer_.host_);
00314 nshText_.setLayoutData(gridData0);
00315 nspText_.setText(nameServer_.port_);
00316 nspText_.setLayoutData(gridData0);
00317 ModifyListener nsModifyListener = new ModifyListener(){
00318 public void modifyText(ModifyEvent e) {
00319 nameServer_.host_ = nshText_.getText();
00320 nameServer_.port_ = nspText_.getText();
00321 saveButtonEnabled(false);
00322 }
00323 };
00324 nshText_.addModifyListener(nsModifyListener);
00325 nspText_.addModifyListener(nsModifyListener);
00326
00327 Composite panel5 = new Composite(composite,SWT.NONE);
00328 panel5.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
00329 panel5.setLayout(new GridLayout(4,false));
00330 Label label8 = new Label(panel5, SWT.LEFT );
00331 label8.setText(MessageBundle.get("panel.Bridge.moduleName")+": ");
00332 final Text text4 = new Text(panel5, SWT.BORDER);
00333 text4.setLayoutData(gridData0);
00334 text4.setText(moduleName_);
00335 text4.addModifyListener(new ModifyListener(){
00336 public void modifyText(ModifyEvent e) {
00337 moduleName_ = text4.getText();
00338 saveButtonEnabled(false);
00339 }
00340 });
00341 Label label9 = new Label(panel5, SWT.LEFT );
00342 label9.setText(MessageBundle.get("panel.Bridge.controllerRTCName")+": ");
00343 final Text text5 = new Text(panel5, SWT.BORDER);
00344 text5.setLayoutData(gridData0);
00345 text5.setText(controllerRtcName_);
00346 text5.addModifyListener(new ModifyListener(){
00347 public void modifyText(ModifyEvent e) {
00348 controllerRtcName_ = text5.getText();
00349 saveButtonEnabled(false);
00350 }
00351 });
00352
00353 Composite panel6 = new Composite(composite,SWT.NONE);
00354 panel6.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
00355 panel6.setLayout(new GridLayout(2,false));
00356 final Button configFileButton = new Button(panel6, SWT.CHECK);
00357 configFileButton.setText(MessageBundle.get("panel.Bridge.useConfigFile"));
00358 configFileButton.addSelectionListener(new SelectionListener(){
00359 public void widgetDefaultSelected(SelectionEvent e) {
00360 }
00361 public void widgetSelected(SelectionEvent e) {
00362 useConfigFile_ = configFileButton.getSelection();
00363 saveButtonEnabled(false);
00364 }
00365 });
00366 if(useConfigFile_)
00367 configFileButton.setSelection(true);
00368 final Text text6 = new Text(panel6, SWT.BORDER);
00369 text6.setLayoutData(gridData0);
00370 text6.setText(configFileName_);
00371 text6.addModifyListener(new ModifyListener(){
00372 public void modifyText(ModifyEvent e) {
00373 configFileName_ = text6.getText();
00374 bridgeConfFileNameLabel_.setText(configFileName_);
00375 saveButtonEnabled(false);
00376 }
00377 });
00378
00379 Composite panel4 = new Composite(composite,SWT.NONE);
00380 panel4.setLayout(new GridLayout(1,false));
00381 Button button = new Button(panel4, SWT.PUSH);
00382 button.setText(MessageBundle.get("panel.Bridge.check"));
00383 button.addSelectionListener(new SelectionListener(){
00384 public void widgetDefaultSelected(SelectionEvent e) {
00385 }
00386 public void widgetSelected(SelectionEvent e) {
00387 errorCheck();
00388 updateControllerBridgeFile();
00389 cbTextUpdate();
00390 updateRtcConfFile();
00391 rcTextUpdate();
00392 saveButtonEnabled(true);
00393 emText_.setText(errorMessage_);
00394 }
00395 });
00396 fileNameLabel_ = new Label(panel4, SWT.LEFT);
00397 if(fileName_=="")
00398 fileNameLabel_.setText("new file");
00399 else
00400 fileNameLabel_.setText(fileName_);
00401 cbtext_ = new StyledText(panel4, SWT.BORDER|SWT.H_SCROLL|SWT.V_SCROLL);
00402 GridData gridData2 = new GridData();
00403 gridData2.horizontalAlignment = GridData.FILL;
00404 gridData2.grabExcessHorizontalSpace = true;
00405 gridData2.verticalAlignment = GridData.FILL;
00406 gridData2.grabExcessVerticalSpace = true;
00407 gridData2.minimumHeight = 100;
00408 gridData2.widthHint = 700;
00409 cbtext_.setLayoutData(gridData2);
00410 cbtext_.setBackground(Activator.getDefault().getColor("gray"));
00411 cbtext_.setEditable(false);
00412 bridgeConfFileNameLabel_ = new Label(panel4, SWT.LEFT);
00413 bridgeConfFileNameLabel_.setLayoutData(gridData0);
00414 bridgeConfFileNameLabel_.setText(configFileName_);
00415 bctext_ = new StyledText(panel4, SWT.BORDER|SWT.H_SCROLL|SWT.V_SCROLL);
00416 GridData gridData5 = new GridData();
00417 gridData5.horizontalAlignment = GridData.FILL;
00418 gridData5.grabExcessHorizontalSpace = true;
00419 gridData5.verticalAlignment = GridData.FILL;
00420 gridData5.grabExcessVerticalSpace = true;
00421 gridData5.minimumHeight = 100;
00422 gridData5.widthHint = 700;
00423 bctext_.setLayoutData(gridData5);
00424 bctext_.setBackground(Activator.getDefault().getColor("gray"));
00425 bctext_.setEditable(false);
00426 cbTextUpdate();
00427
00428 Composite panel3 = new Composite(composite,SWT.NONE);
00429 panel3.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
00430 panel3.setLayout(new GridLayout(1,false));
00431 rtcConfFileNameLabel_ = new Label(panel3, SWT.LEFT);
00432 if(rtcConfFileName_.equals(""))
00433 rtcConfFileNameLabel_.setText("rtc.conf");
00434 else
00435 rtcConfFileNameLabel_.setText(rtcConfFileName_);
00436 rctext_ = new StyledText(panel3, SWT.BORDER|SWT.H_SCROLL|SWT.V_SCROLL );
00437 GridData gridData4 = new GridData();
00438 gridData4.horizontalAlignment = GridData.FILL;
00439 gridData4.grabExcessHorizontalSpace = true;
00440 gridData4.verticalAlignment = GridData.FILL;
00441 gridData4.grabExcessVerticalSpace = true;
00442 gridData4.widthHint = 700;
00443 gridData4.minimumHeight = 50;
00444 rctext_.setLayoutData(gridData4);
00445 rctext_.setBackground(Activator.getDefault().getColor("gray"));
00446 rcTextUpdate();
00447 rctext_.setEditable(false);
00448
00449 emText_ = new StyledText(panel3, SWT.NONE );
00450 GridData gridData3 = new GridData();
00451 gridData3.horizontalAlignment = GridData.FILL;
00452 gridData3.grabExcessHorizontalSpace = true;
00453 gridData3.verticalAlignment = GridData.FILL;
00454 gridData3.grabExcessVerticalSpace = true;
00455 gridData3.minimumHeight = 50;
00456 emText_.setLayoutData(gridData3);
00457 emText_.setBackground(panel3.getBackground());
00458 emText_.setEditable(false);
00459 emText_.setText(errorMessage_);
00460 emText_.setForeground(Activator.getDefault().getColor("red"));
00461
00462 return composite;
00463 }
00464
00465 private final int SAVE_ID = IDialogConstants.CLIENT_ID;
00466 private final int SAVE_AS_ID = IDialogConstants.CLIENT_ID+1;
00467 protected void createButtonsForButtonBar(Composite parent) {
00468 saveButton_ = createButton(parent, SAVE_ID, MessageBundle.get("GrxTextItem.menu.save"), false);
00469 saveAsButton_ = createButton(parent, SAVE_AS_ID, MessageBundle.get("GrxTextItem.menu.saveAs"), false);
00470 saveButtonEnabled(false);
00471 createButton(parent, IDialogConstants.CLOSE_ID, IDialogConstants.CLOSE_LABEL, false);
00472 }
00473
00474 protected void buttonPressed(int buttonId) {
00475 if (buttonId == SAVE_ID) {
00476 save();
00477 }else if(buttonId == SAVE_AS_ID){
00478 if(setFileName())
00479 save();
00480 }else if(buttonId == IDialogConstants.CLOSE_ID){
00481 close();
00482 }
00483 }
00484
00485 private class InportLabelProvider implements ITableLabelProvider{
00486 public Image getColumnImage(Object element, int columnIndex) {
00487 return null;
00488 }
00489 public String getColumnText(Object element, int columnIndex) {
00490 Port node = (Port)element;
00491 switch(columnIndex){
00492 case 0:
00493 return node.type_;
00494 case 1:
00495 return node.name_;
00496 case 2:
00497 return node.propertyName_;
00498 case 3:
00499 return node.id_;
00500 case 4:
00501 return node.outputTime_;
00502 case 5:
00503 if(!node.controllerPortName_.equals(""))
00504 return node.type_.equals("IN") ? "<-- "+node.controllerPortName_ : "--> "+node.controllerPortName_;
00505 }
00506 return null;
00507 }
00508 public void addListener(ILabelProviderListener listener) {
00509 }
00510 public void dispose() {
00511 }
00512 public boolean isLabelProperty(Object element, String property) {
00513 return false;
00514 }
00515 public void removeListener(ILabelProviderListener listener) {
00516 }
00517 }
00518
00519 private class TableCellModifier implements ICellModifier {
00520 public boolean canModify(Object element, String property) {
00521 return true;
00522 }
00523
00524 public Object getValue(Object element, String property) {
00525 Port port = (Port)element;
00526 if(property.equals("type"))
00527 return port.type_.equals("IN") ? 0 : 1 ;
00528 else if(property.equals("name"))
00529 return port.name_;
00530 else if(property.equals("property")){
00531 return DataTypeId.valueOf(port.propertyName_).ordinal();
00532 }else if(property.equals("id"))
00533 return port.id_;
00534 else if(property.equals("time"))
00535 return port.outputTime_;
00536 else if(property.equals("portName"))
00537 return port.controllerPortName_;
00538 return null;
00539 }
00540
00541 public void modify(Object element, String property, Object value) {
00542 if (element instanceof Item) {
00543 element = ((Item) element).getData();
00544 }
00545 Port port = (Port)element;
00546 if(property.equals("type"))
00547 port.type_ = (Integer)value==0 ? "IN" : "OUT";
00548 else if(property.equals("name"))
00549 port.name_ = (String)value;
00550 else if(property.equals("property")){
00551 port.propertyName_ = DataTypeId.values()[(Integer)value].name();
00552 }else if(property.equals("id"))
00553 port.id_ = (String)value;
00554 else if(property.equals("time"))
00555 port.outputTime_ = (String)value;
00556 else if(property.equals("portName"))
00557 port.controllerPortName_ = (String)value;
00558 saveButtonEnabled(false);
00559 tableviewer_.update(element, null);
00560 }
00561 }
00562
00563 public boolean load(String fileName){
00564 File file = new File(fileName);
00565 if (file == null || !file.isFile())
00566 return false;
00567 clear();
00568 fileName_ = fileName;
00569 try {
00570 BufferedReader reader = new BufferedReader(new FileReader(file));
00571 String option="";
00572 boolean comline = false;
00573 int i=0;
00574 while (reader.ready()) {
00575 String string = reader.readLine();
00576 if(string.startsWith(commentChar_))
00577 continue;
00578 controllerBridgeFile_.add(string);
00579 int index = string.indexOf("openhrp-controller-bridge");
00580 if( index != -1 ){
00581 comline = true;
00582 string = string.substring(index+25).trim();
00583 commandLineStart_ = i;
00584 }
00585 if(comline){
00586 string = string.trim();
00587 if(string.endsWith(endChar_)){
00588 option += string.substring(0,string.length()-1);
00589 }
00590 else{
00591 option += string;
00592 commandLineEnd_ =i;
00593 comline = false;
00594 }
00595 }
00596 i++;
00597 }
00598 if(!option.equals("")){
00599 String[] options = option.split("--");
00600 rtcConfFileName_ = file.getCanonicalFile().getParent()+File.separator+"rtc.conf";
00601 boolean ret = loadRtcConf(rtcConfFileName_);
00602 parse(options);
00603 createPortTable();
00604 if(!ret){
00605 rtcConfFileName_="";
00606 rtcConfInit(nameServer_.host_, nameServer_.port_);
00607 }
00608 }else
00609 ;
00610 } catch (FileNotFoundException e) {
00611 GrxDebugUtil.println("File Not Found. ("+file.getName()+")");
00612 return false;
00613 } catch (IOException e) {
00614 e.printStackTrace();
00615 return false;
00616 }
00617 return true;
00618 }
00619
00620 private boolean loadRtcConf(String fileName){
00621 File file = new File(fileName);
00622 if (file == null || !file.isFile())
00623 return false;
00624 try {
00625 BufferedReader reader = new BufferedReader(new FileReader(file));
00626 while (reader.ready()) {
00627 String string = reader.readLine();
00628 if(string.startsWith("#"))
00629 continue;
00630 rtcConfFile_.add(string);
00631 String string0 = string.trim();
00632 if(string0.startsWith("corba.nameservers:")){
00633 String[] s=string0.substring(18).trim().split(":");
00634 if(s.length == 2){
00635 rtcNameServer_.host_ = s[0];
00636 rtcNameServer_.port_ = s[1];
00637 }
00638 }else if(string.trim().startsWith("manager.modules.preload:"))
00639 moduleName_ = string0.substring(24).trim();
00640 else if(string.trim().startsWith("manager.components.precreate:"))
00641 controllerRtcName_ = string0.substring(29).trim();
00642
00643
00644 }
00645 } catch (FileNotFoundException e) {
00646 GrxDebugUtil.println("File Not Found. ("+file.getName()+")");
00647 return false;
00648 } catch (IOException e) {
00649 e.printStackTrace();
00650 return false;
00651 }
00652 return true;
00653 }
00654
00655 private void init(){
00656 fileName_ = "";
00657 rtcConfFileName_ = "";
00658 controllerBridgeFile_.clear();
00659 if(os_==LINUX){
00660 controllerBridgeFile_.add("#!/bin/sh");
00661 commandLineStart_ = 1;
00662 commandLineEnd_ = 1;
00663 }else{
00664 commandLineStart_ = 0;
00665 commandLineEnd_ = 0;
00666 }
00667 controllerBridgeFile_.add("openhrp-controller-bridge "+endChar_);
00668
00669 portTable_.clear();
00670 controllerName_ = "";
00671 robotRtcName_ = "";
00672 inport_.clear();
00673 outport_.clear();
00674 connection_.clear();
00675 nameServer_.host_ = "127.0.0.1";
00676 nameServer_.port_ = "2809";
00677 errorMessage_ = "";
00678 useConfigFile_ = false;
00679 configFileName_ = "";
00680 rtcConfInit(nameServer_.host_, nameServer_.port_);
00681 }
00682
00683 private void rtcConfInit(String host, String port){
00684 rtcConfFile_.clear();
00685 rtcConfFile_.add("corba.nameservers: "+host+":"+port);
00686 rtcConfFile_.add("naming.formats: %n.rtc");
00687 rtcConfFile_.add("logger.log_level: TRACE");
00688 rtcConfFile_.add("exec_cxt.periodic.type: SynchExtTriggerEC");
00689 rtcConfFile_.add("exec_cxt.periodic.rate: 1000000");
00690 rtcConfFile_.add("manager.modules.load_path: .");
00691 rtcConfFile_.add("manager.modules.abs_path_allowed: yes");
00692 rtcConfFile_.add("manager.modules.preload: ");
00693 rtcConfFile_.add("manager.components.precreate: ");
00694 rtcNameServer_.host_ = host;
00695 rtcNameServer_.port_ = port;
00696 moduleName_ = "";
00697 controllerRtcName_ = "";
00698
00699 }
00700
00701 private void clear(){
00702 fileName_ = "";
00703 controllerBridgeFile_.clear();
00704 portTable_.clear();
00705 controllerName_ = "";
00706 robotRtcName_ = "";
00707 inport_.clear();
00708 outport_.clear();
00709 connection_.clear();
00710 nameServer_.host_ = "127.0.0.1";
00711 nameServer_.port_ = "2809";
00712 errorMessage_ = "";
00713
00714 rtcConfFile_.clear();
00715 rtcNameServer_.host_ = "";
00716 rtcNameServer_.port_ = "";
00717 moduleName_ = "";
00718 controllerRtcName_ = "";
00719 useConfigFile_ = false;
00720 configFileName_ = "";
00721 }
00722
00723 private void parse(String[] options){
00724 for(int i=0; i<options.length; i++){
00725 options[i] = options[i].trim();
00726 int endIndex = options[i].indexOf(" ");
00727 if(endIndex == -1)
00728 continue;
00729 String option = options[i].substring(0,endIndex);
00730 String parameter = options[i].substring(endIndex).trim();
00731 if(option.equals("server-name")){
00732 controllerName_ = parameter;
00733 }else if(option.equals("in-port")){
00734 Inport _inport = new Inport();
00735 String[] s = parameter.split(":");
00736 if(s.length==2){
00737 _inport.name_ = s[0].trim();
00738 _inport.propertyName_ = s[1].trim();
00739 _inport.id_ = null;
00740 }else if(s.length==3){
00741 _inport.name_ = s[0].trim();
00742 _inport.propertyName_ = s[2].trim();
00743 _inport.id_ = s[1].split(",");
00744 for(int j=0; j<_inport.id_.length; j++)
00745 _inport.id_[j] = _inport.id_[j].trim();
00746 }else
00747 continue;
00748 inport_.add(_inport);
00749
00750 }else if(option.equals("out-port")){
00751 Outport _outport = new Outport();
00752 String[] s = parameter.split(":");
00753 _outport.name_ = s[0].trim();
00754 _outport.idName_ = null;
00755 int j;
00756 for(j=1; j<3; j++){
00757 try{
00758 DataTypeId type = DataTypeId.valueOf(s[j].trim());
00759
00760 _outport.propertyName_ = s[j].trim();
00761 j++;
00762 break;
00763 }catch(IllegalArgumentException e){
00764
00765 if(j==2)
00766 break;
00767 String[] _id = s[j].split(",");
00768 _outport.idName_ = new String[_id.length];
00769 for(int k=0; k<_id.length; k++){
00770 try{
00771 _outport.idNo_ = Integer.parseInt(_id[k]);
00772 _outport.idName_[k] = "";
00773 }catch(NumberFormatException ex){
00774 _outport.idName_[k] = _id[k].trim();
00775 _outport.idNo_ = -1;
00776 }
00777 }
00778 }
00779 }
00780 if(j<s.length){
00781 _outport.outputTime_ = Double.parseDouble(s[j]);
00782 }else{
00783 _outport.outputTime_ = -1;
00784 }
00785 outport_.add(_outport);
00786 }else if(option.equals("connection")){
00787 String[] s = parameter.split(":");
00788 String controllerPortName="";
00789 if(s.length == 2){
00790 controllerPortName = controllerRtcName_+"0:"+s[1].trim();
00791 }else if(s.length ==3){
00792 controllerPortName = s[1].trim()+":"+s[2].trim();
00793 }
00794 connection_.put(s[0].trim(), controllerPortName);
00795 }else if(option.equals("robot-name")){
00796 robotRtcName_ = parameter;
00797 }else if(option.equals("name-server")){
00798 String[] s = parameter.split(":");
00799 nameServer_.host_ = s[0].trim();
00800 nameServer_.port_ = s[1].trim();
00801 }else if(option.equals("config-file")){
00802 loadConfigFile(parameter);
00803 useConfigFile_ = true;
00804 configFileName_ = parameter;
00805 }
00806 }
00807 }
00808
00809 private void loadConfigFile(String fileName){
00810 File file = new File(fileName_);
00811 try {
00812 fileName = file.getCanonicalFile().getParent()+File.separator+fileName;
00813 } catch (IOException e) {
00814 e.printStackTrace();
00815 }
00816 file = new File(fileName);
00817 if (file == null || !file.isFile())
00818 return;
00819 try {
00820 BufferedReader reader = new BufferedReader(new FileReader(file));
00821 Vector<String> options = new Vector<String>();
00822 while (reader.ready()) {
00823 String string = reader.readLine();
00824 if(string.startsWith("#"))
00825 continue;
00826 bridgeConfFile_.append(string+"\n");
00827 String[] s = string.split("=");
00828 if(s.length==2)
00829 options.add(s[0]+" "+s[1]);
00830 }
00831 parse(options.toArray(new String[0]));
00832
00833 } catch (FileNotFoundException e) {
00834 GrxDebugUtil.println("File Not Found. ("+file.getName()+")");
00835 return;
00836 } catch (IOException e) {
00837 e.printStackTrace();
00838 return;
00839 }
00840 return;
00841 }
00842
00843 private void createPortTable() {
00844 Iterator<Inport> it = inport_.iterator();
00845 while(it.hasNext()){
00846 Inport inport = it.next();
00847 Port _port = new Port();
00848 _port.type_ = "IN";
00849 _port.name_ = inport.name_;
00850 _port.propertyName_ = inport.propertyName_;
00851 if(inport.id_ == null)
00852 _port.id_ = "All joints";
00853 else{
00854 _port.id_ = "";
00855 for(int i=0; i<inport.id_.length-1; i++)
00856 _port.id_ += inport.id_[i] + ",";
00857 _port.id_ += inport.id_[inport.id_.length-1];
00858 }
00859 _port.outputTime_ = "";
00860 String controllerPort = connection_.get(inport.name_);
00861 if(controllerPort==null)
00862 controllerPort = "";
00863 _port.controllerPortName_ = controllerPort;
00864 portTable_.add(_port);
00865 }
00866 Iterator<Outport> it0 = outport_.iterator();
00867 while(it0.hasNext()){
00868 Outport outport = it0.next();
00869 Port _port = new Port();
00870 _port.type_ = "OUT";
00871 _port.name_ = outport.name_;
00872 _port.propertyName_ = outport.propertyName_;
00873 if(outport.idName_ == null)
00874 _port.id_ = "All joints";
00875 else if(outport.idNo_ != -1){
00876 _port.id_ = String.valueOf(outport.idNo_);
00877 }else{
00878 _port.id_ = "";
00879 for(int i=0; i<outport.idName_.length-1; i++)
00880 _port.id_ += outport.idName_[i] + ",";
00881 _port.id_ += outport.idName_[outport.idName_.length-1];
00882 }
00883 if(outport.outputTime_<0)
00884 _port.outputTime_ = "control Time";
00885 else
00886 _port.outputTime_ = String.valueOf(outport.outputTime_);
00887 String controllerPort = connection_.get(outport.name_);
00888 if(controllerPort==null)
00889 controllerPort = "";
00890 _port.controllerPortName_ = controllerPort;
00891 portTable_.add(_port);
00892 }
00893 }
00894
00895 private class Inport {
00896 public String name_;
00897 public String propertyName_;
00898 public String[] id_;
00899 }
00900
00901 private class Outport {
00902 public String name_;
00903 public String propertyName_;
00904 public String[] idName_;
00905 public int idNo_;
00906 public double outputTime_;
00907 }
00908
00909 private class Port {
00910 public String type_;
00911 public String name_;
00912 public String propertyName_;
00913 public String id_;
00914 public String outputTime_;
00915 public String controllerPortName_;
00916 }
00917
00918 private class NameServer {
00919 public String host_;
00920 public String port_;
00921 }
00922
00923 public void setRobot(GrxModelItem robot) {
00924 robot_ = robot;
00925 robotName_ = robot_.getName();
00926 }
00927
00928 public boolean setProjectControllerName(String _controllerName) {
00929 projectControllerName_ = _controllerName;
00930 if(projectControllerName_.equals(controllerName_))
00931 return true;
00932 else
00933 return false;
00934 }
00935
00936 public void setControllerName(String _controllerName) {
00937 controllerName_ = _controllerName;
00938 }
00939
00940 public boolean checkNameServer(){
00941 if(nameServer_.host_.equals(rtcNameServer_.host_) && nameServer_.port_.equals(rtcNameServer_.port_))
00942 return true;
00943 else
00944 return false;
00945 }
00946
00947 public void setNameServer(){
00948 nameServer_.host_ = rtcNameServer_.host_;
00949 nameServer_.port_ = rtcNameServer_.port_;
00950 }
00951
00952 public void save(){
00953 if(fileName_.equals(""))
00954 if(!setFileName())
00955 return;
00956 File file = new File(fileName_);
00957 if(rtcConfFileName_.equals("")){
00958 try {
00959 rtcConfFileName_ = file.getCanonicalFile().getParent()+File.separator+"rtc.conf";
00960 } catch (IOException e) {
00961 e.printStackTrace();
00962 }
00963 }
00964 String bridgeConfFileName=null;
00965 if(useConfigFile_){
00966 try {
00967 bridgeConfFileName = file.getCanonicalFile().getParent()+File.separator+configFileName_;
00968 } catch (IOException e) {
00969 e.printStackTrace();
00970 }
00971 }
00972 try {
00973 BufferedWriter writer = new BufferedWriter(new FileWriter(fileName_));
00974 Iterator<String> it = controllerBridgeFile_.iterator();
00975 while(it.hasNext()){
00976 writer.write(it.next());
00977 writer.newLine();
00978 }
00979 writer.flush();
00980 writer.close();
00981
00982 writer = new BufferedWriter(new FileWriter(rtcConfFileName_));
00983 it = rtcConfFile_.iterator();
00984 while(it.hasNext()){
00985 writer.write(it.next());
00986 writer.newLine();
00987 }
00988 writer.flush();
00989 writer.close();
00990
00991 if(useConfigFile_){
00992 writer = new BufferedWriter(new FileWriter(bridgeConfFileName));
00993 writer.write(bridgeConfFile_.toString());
00994 writer.flush();
00995 writer.close();
00996 }
00997 } catch (IOException e) {
00998 e.printStackTrace();
00999 }
01000 fileNameLabel_.setText(fileName_);
01001 rtcConfFileNameLabel_.setText(rtcConfFileName_);
01002
01003 }
01004
01005 private boolean setFileName(){
01006 FileDialog fdlg = new FileDialog( GrxUIPerspectiveFactory.getCurrentShell(), SWT.SAVE);
01007 String fileName = fdlg.open();
01008 if( fileName != null ) {
01009 fileName_ = fileName;
01010 File file = new File(fileName_);
01011 try {
01012 rtcConfFileName_ = file.getCanonicalFile().getParent()+File.separator+"rtc.conf";
01013 file = new File(rtcConfFileName_);
01014 if(file.exists()){
01015 if(!MessageDialog.openQuestion(getShell(), rtcConfFileName_, MessageBundle.get("Grx3DView.dialog.message.fileExist"))){
01016 fdlg.setFileName(rtcConfFileName_);
01017 rtcConfFileName_ = fdlg.open();
01018 if(rtcConfFileName_==null)
01019 return false;
01020 }
01021 }
01022 } catch (IOException e) {
01023 e.printStackTrace();
01024 }
01025 return true;
01026 }
01027 return false;
01028 }
01029
01030 private void updateControllerBridgeFile(){
01031 String commandLine = controllerBridgeFile_.get(commandLineStart_);
01032 int index = commandLine.indexOf("openhrp-controller-bridge");
01033 if( index != -1 ){
01034 commandLine = commandLine.substring(0,index+25)+" ";
01035 }
01036 for(int i=commandLineEnd_; i>=commandLineStart_; i--)
01037 controllerBridgeFile_.remove(i);
01038 bridgeConfFile_ = new StringBuffer();
01039
01040 if(useConfigFile_){
01041 controllerBridgeFile_.insertElementAt( commandLine+"--config-file "+configFileName_,commandLineStart_);
01042 commandLineEnd_ = commandLineStart_;
01043 updateBridgeConfFile();
01044 }else{
01045 int i = commandLineStart_;
01046 controllerBridgeFile_.insertElementAt(commandLine+endChar_, i++);
01047 if(!controllerName_.equals("")){
01048 String string = "--server-name "+controllerName_ +" "+endChar_;
01049 controllerBridgeFile_.insertElementAt(string, i++);
01050 }
01051 Iterator<Port> it = portTable_.iterator();
01052 while(it.hasNext()){
01053 String string="";
01054 Port port = it.next();
01055 if(port.type_.equals("IN")){
01056 string += "--in-port "+port.name_;
01057 if(!port.id_.equals("All joints") && !port.id_.equals(""))
01058 string += ":"+port.id_;
01059 string += ":"+port.propertyName_;
01060 }else{
01061 string += "--out-port "+port.name_;
01062 if(!port.id_.equals("All joints") && !port.id_.equals(""))
01063 string += ":"+port.id_;
01064 string += ":"+port.propertyName_;
01065 if(!port.outputTime_.equals("control Time"))
01066 string += ":"+port.outputTime_;
01067 }
01068 string += " "+endChar_;
01069 controllerBridgeFile_.insertElementAt(string, i++);
01070 if(!port.controllerPortName_.equals("")){
01071 String[] s = port.controllerPortName_.split(":");
01072 String controllerPortName = port.controllerPortName_;
01073 if(s.length==2 && s[0].equals(controllerRtcName_+"0"))
01074 controllerPortName = s[1];
01075 string = "--connection "+port.name_+":"+controllerPortName+" "+endChar_;
01076 controllerBridgeFile_.insertElementAt(string, i++);
01077 }
01078 }
01079 if(!robotRtcName_.equals("")){
01080 String string = "--robot-name "+robotRtcName_ +" "+endChar_;
01081 controllerBridgeFile_.insertElementAt(string, i++);
01082 }
01083 if(!nameServer_.host_.equals("127.0.0.1") || !nameServer_.port_.equals("2809")){
01084 String string = "--name-server "+nameServer_.host_+":"+nameServer_.port_+" " +endChar_;
01085 controllerBridgeFile_.insertElementAt(string, i++);
01086 }
01087
01088 commandLineEnd_ = i-1;
01089 String string = controllerBridgeFile_.get(commandLineEnd_);
01090 string = string.substring(0, string.length()-1);
01091 controllerBridgeFile_.setElementAt(string, commandLineEnd_);
01092 }
01093 }
01094
01095 private void updateBridgeConfFile(){
01096 String lineSeparator = System.getProperty("line.separator");
01097 if(!controllerName_.equals("")){
01098 bridgeConfFile_.append("server-name = "+controllerName_ +lineSeparator);
01099 }
01100 Iterator<Port> it = portTable_.iterator();
01101 while(it.hasNext()){
01102 String string="";
01103 Port port = it.next();
01104 if(port.type_.equals("IN")){
01105 string += "in-port = "+port.name_;
01106 if(!port.id_.equals("All joints") && !port.id_.equals(""))
01107 string += ":"+port.id_;
01108 string += ":"+port.propertyName_;
01109 }else{
01110 string += "out-port = "+port.name_;
01111 if(!port.id_.equals("All joints") && !port.id_.equals(""))
01112 string += ":"+port.id_;
01113 string += ":"+port.propertyName_;
01114 if(!port.outputTime_.equals("control Time"))
01115 string += ":"+port.outputTime_;
01116 }
01117 bridgeConfFile_.append(string+lineSeparator);
01118 if(!port.controllerPortName_.equals("")){
01119 String[] s = port.controllerPortName_.split(":");
01120 String controllerPortName = port.controllerPortName_;
01121 if(s.length==2 && s[0].equals(controllerRtcName_+"0"))
01122 controllerPortName = s[1];
01123 string = "connection = "+port.name_+":"+controllerPortName+lineSeparator;
01124 bridgeConfFile_.append(string);
01125 }
01126 }
01127 if(!robotRtcName_.equals("")){
01128 String string = "robot-name = "+robotRtcName_ +lineSeparator;
01129 bridgeConfFile_.append(string);
01130 }
01131 if(!nameServer_.host_.equals("127.0.0.1") || !nameServer_.port_.equals("2809")){
01132 String string = "name-server = "+nameServer_.host_+":"+nameServer_.port_+lineSeparator;
01133 bridgeConfFile_.append(string);
01134 }
01135 }
01136
01137 private void updateRtcConfFile(){
01138 for(int i=0; i<rtcConfFile_.size(); i++){
01139 String string = rtcConfFile_.get(i).trim();
01140 if(string.startsWith("corba.nameservers:")){
01141 String s=string.substring(0,18)+" "+ nameServer_.host_+":"+nameServer_.port_;
01142 rtcConfFile_.setElementAt(s, i);
01143 }else if(string.startsWith("manager.modules.preload:")){
01144 String s=string.substring(0,24)+" "+ moduleName_;
01145 rtcConfFile_.setElementAt(s, i);
01146 }else if(string.startsWith("manager.components.precreate:")){
01147 String s=string.substring(0,29)+" "+ controllerRtcName_;
01148 rtcConfFile_.setElementAt(s, i);
01149 }
01150 }
01151 }
01152
01153 private void cbTextUpdate(){
01154 String s="";
01155 Iterator<String> it = controllerBridgeFile_.iterator();
01156 while(it.hasNext())
01157 s += it.next() + "\n";
01158 cbtext_.setText(s);
01159 bctext_.setText(bridgeConfFile_.toString());
01160 }
01161
01162 private void rcTextUpdate(){
01163 String s="";
01164 Iterator<String> it = rtcConfFile_.iterator();
01165 while(it.hasNext())
01166 s += it.next() + "\n";
01167 rctext_.setText(s);
01168 }
01169
01170 private void rrnTextUpdate(){
01171 if(robotRtcName_.equals(""))
01172 rrnText_.setText(controllerName_+"(robot)");
01173 else
01174 rrnText_.setText(robotRtcName_);
01175 }
01176
01177 private void saveButtonEnabled(boolean b){
01178 saveButton_.setEnabled(b);
01179 saveAsButton_.setEnabled(b);
01180 }
01181
01182 private void errorCheck(){
01183 errorMessage_ = "";
01184 if(!projectControllerName_.equals(controllerName_))
01185 errorMessage_ += MessageBundle.get("panel.Bridge.error.controlName")+"\n";
01186 Iterator<Port> it = portTable_.iterator();
01187 while(it.hasNext()){
01188 Port port = it.next();
01189 if(port.name_.equals(""))
01190 errorMessage_ += MessageBundle.get("panel.Bridge.error.setPortName")+"\n";
01191 DataTypeId.NUMID_CODE numId = DataTypeId.numId(port.propertyName_);
01192 if(!(numId==DataTypeId.NUMID_CODE.NOT_USED) && (port.id_.equals("All joints") || port.id_.equals("")))
01193 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+" "+MessageBundle.get("panel.Bridge.error.useID")+"\n";
01194 if(numId==DataTypeId.NUMID_CODE.ONLY_ONE){
01195 String[] s = port.id_.split(",");
01196 if(s.length > 1)
01197 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+" "+MessageBundle.get("panel.Bridge.error.oneID")+"\n";
01198 }
01199 if(numId==DataTypeId.NUMID_CODE.NUMBER){
01200 try{
01201 Integer.valueOf(port.id_);
01202 }catch(NumberFormatException e){
01203 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+" "+MessageBundle.get("panel.Bridge.error.sensorId")+"\n";
01204 }
01205 }
01206 if(port.type_.equals("IN")){
01207 if(!DataTypeId.isInport(port.propertyName_))
01208 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+" : "+port.propertyName_+MessageBundle.get("panel.Bridge.error.inportPropertyName")+"\n";
01209 if(!port.outputTime_.equals(""))
01210 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+ MessageBundle.get("panel.Bridge.error.inportTime")+"\n";
01211 }else{
01212 if(!DataTypeId.isOutport(port.propertyName_))
01213 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+" : "+port.propertyName_+MessageBundle.get("panel.Bridge.error.outportPropertyName")+"\n";
01214 if(!port.outputTime_.equals("control Time") && !port.outputTime_.equals("")){
01215 try{
01216 double time = Double.valueOf(port.outputTime_);
01217 if(time < controlTime_){
01218 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+ MessageBundle.get("panel.Bridge.error.outportTimeValue")+"\n";
01219 }
01220 }catch(NumberFormatException e){
01221 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+ MessageBundle.get("panel.Bridge.error.outportTime")+"\n";
01222 }
01223 }
01224 }
01225 if(port.controllerPortName_.startsWith("0:"))
01226 errorMessage_ += MessageBundle.get("panel.Bridge.errorPort")+" "+port.name_+ MessageBundle.get("panel.Bridge.error.controllerPortName")+"\n";
01227 }
01228
01229 if(moduleName_.equals(""))
01230 errorMessage_ += MessageBundle.get("panel.Bridge.error.moduleName")+"\n";
01231 if(controllerRtcName_.equals(""))
01232 errorMessage_ += MessageBundle.get("panel.Bridge.error.controlRTCName")+"\n";
01233 if(useConfigFile_ && configFileName_.equals(""))
01234 errorMessage_ += MessageBundle.get("panel.Bridge.error.configFileName")+"\n";
01235 }
01236
01237 @SuppressWarnings("unchecked")
01238 private class IdCellDialog extends Dialog {
01239 private class IdData {
01240 public String name_;
01241 public int id_;
01242 public boolean selection_;
01243 public IdData(String name, int id){
01244 name_ = name;
01245 id_ = id;
01246 selection_ = false;
01247 }
01248 public boolean equals(Object object){
01249 if(id_ < 0)
01250 return name_.equals(((IdData)object).name_);
01251 else
01252 return name_.equals(((IdData)object).name_) || id_ == ((IdData)object).id_ ;
01253 }
01254 }
01255 private class Link extends IdData {
01256 public Link(String name, int jointId) {
01257 super(name, jointId);
01258 }
01259 public boolean isJoint(){
01260 if(id_ < 0)
01261 return false;
01262 else
01263 return true;
01264 }
01265 }
01266
01267 private Vector<Link> links_ = new Vector<Link>();
01268 private Vector<IdData>[] sensors_ = new Vector[GrxSensorItem.sensorType.length];
01269 private String id_;
01270 private Vector<Button> linkButtons_ = new Vector<Button>();
01271 private Vector<Button>[] sensorButtons_ = new Vector[GrxSensorItem.sensorType.length];
01272 private Button allJointButton_;
01273
01274 protected IdCellDialog(Shell parentShell) {
01275 super(parentShell);
01276 String[] joints = robot_.getJointNames();
01277 for(int i=0; i<joints.length; i++)
01278 links_.add(new Link(joints[i], i));
01279 Iterator<GrxLinkItem> it = robot_.links_.iterator();
01280 while(it.hasNext()){
01281 GrxLinkItem link = it.next();
01282 if(link.jointId_ < 0)
01283 links_.add(new Link(link.getName(), -1));
01284 }
01285 for(int i=0; i<GrxSensorItem.sensorType.length; i++){
01286 sensors_[i] = new Vector<IdData>();
01287 String[] names = robot_.getSensorNames(GrxSensorItem.sensorType[i]);
01288 if(names!=null){
01289 for(int j=0; j<names.length; j++)
01290 sensors_[i].add(new IdData(names[j], j));
01291 }
01292 sensorButtons_[i] = new Vector<Button>();
01293 }
01294 }
01295
01296 protected Control createDialogArea(Composite parent) {
01297 Composite composite = (Composite)super.createDialogArea(parent);
01298 composite.setLayout(new GridLayout(2,true));
01299
01300 Composite panel0 = new Composite(composite,SWT.NONE);
01301 panel0.setLayoutData(new GridData(GridData.FILL_VERTICAL));
01302 panel0.setLayout(new FillLayout(SWT.VERTICAL));
01303 Label label0 = new Label(panel0, SWT.NONE);
01304 label0.setText("Link");
01305 label0.setForeground(Activator.getDefault().getColor("blue"));
01306 allJointButton_ = new Button(panel0, SWT.TOGGLE|SWT.CENTER);
01307 allJointButton_.setText("All joints");
01308 allJointButton_.addSelectionListener(new SelectionListener(){
01309 public void widgetDefaultSelected(SelectionEvent e) {
01310 }
01311 public void widgetSelected(SelectionEvent e) {
01312 if(allJointButton_.getSelection()){
01313 for(int i=0; i<links_.size(); i++){
01314 if(links_.get(i).isJoint())
01315 linkButtons_.get(i).setSelection(true);
01316 }
01317 }else{
01318 for(int i=0; i<links_.size(); i++){
01319 if(links_.get(i).isJoint())
01320 linkButtons_.get(i).setSelection(false);
01321 }
01322 }
01323 }
01324 });
01325 for(int i=0; i<links_.size(); i++){
01326 linkButtons_.add(new Button(panel0, SWT.CHECK|SWT.LEFT));
01327 linkButtons_.get(i).addSelectionListener(new SelectionListener(){
01328 public void widgetDefaultSelected(SelectionEvent e) {
01329 }
01330 public void widgetSelected(SelectionEvent e) {
01331 updateAllJointButton();
01332 }
01333 });
01334 }
01335 updateButton(true, 0);
01336
01337 Composite panel1 = new Composite(composite,SWT.NONE);
01338 panel1.setLayoutData(new GridData(GridData.FILL_VERTICAL));
01339 panel1.setLayout(new RowLayout(SWT.VERTICAL));
01340 for(int i=0; i<GrxSensorItem.sensorType.length; i++){
01341 Label label = new Label(panel1, SWT.NONE);
01342 label.setText(GrxSensorItem.sensorType[i]);
01343 label.setForeground(Activator.getDefault().getColor("blue"));
01344 for(int j=0; j<sensors_[i].size(); j++){
01345 sensorButtons_[i].add(new Button(panel1, SWT.CHECK|SWT.LEFT));
01346 }
01347 Label dumy = new Label(panel1, SWT.NONE);
01348 }
01349 updateButton(false, -1);
01350
01351 Transfer [] transfers = new Transfer[]{ TextTransfer.getInstance() };
01352 DragSourceListener dragSourceListener = new DragSourceListener() {
01353 public void dragFinished(DragSourceEvent event) {
01354 }
01355 public void dragSetData(DragSourceEvent event) {
01356 Button sourceButton = (Button)((DragSource) event.getSource()).getControl();
01357 int index = linkButtons_.indexOf(sourceButton);
01358 if(index>=0)
01359 event.data = "link "+String.valueOf(index);
01360 else
01361 for(int i=0; i<sensorButtons_.length; i++){
01362 index = sensorButtons_[i].indexOf(sourceButton);
01363 if(index >= 0){
01364 event.data = "sensor "+String.valueOf(i)+" "+String.valueOf(index);
01365 break;
01366 }
01367 }
01368 }
01369 public void dragStart(DragSourceEvent event) {
01370 }
01371 };
01372 DropTargetListener dropTargetListener = new DropTargetListener(){
01373 public void drop(DropTargetEvent event){
01374 if (event != null){
01375 Button targetButton = (Button)((DropTarget) event.getSource()).getControl();
01376 String string = (String)event.data;
01377 String[] source = string.split(" ");
01378 if(source[0].equals("link")){
01379 for(int i=0; i<links_.size(); i++)
01380 links_.get(i).selection_ = linkButtons_.get(i).getSelection();
01381 int sourceIndex = Integer.parseInt(source[1]);
01382 int targetIndex = linkButtons_.indexOf(targetButton);
01383 if(targetIndex >=0){
01384 Link sourceLink = links_.get(sourceIndex);
01385 Link targetLink = links_.get(targetIndex);
01386 links_.remove(sourceLink);
01387 links_.insertElementAt(sourceLink, links_.indexOf(targetLink));
01388 updateButton(true, 0);
01389 }
01390 }else{
01391 int type = Integer.parseInt(source[1]);
01392 for(int i=0; i<sensors_[type].size(); i++)
01393 sensors_[type].get(i).selection_ = sensorButtons_[type].get(i).getSelection();
01394 int sourceIndex = Integer.parseInt(source[2]);
01395 int targetIndex = sensorButtons_[type].indexOf(targetButton);
01396 if(targetIndex >=0){
01397 IdData sourceData = sensors_[type].get(sourceIndex);
01398 IdData targetData = sensors_[type].get(targetIndex);
01399 sensors_[type].remove(sourceData);
01400 sensors_[type].insertElementAt(sourceData, sensors_[type].indexOf(targetData));
01401 updateButton(false, type);
01402 }
01403 }
01404 }
01405 }
01406 private Color buttonColor_;
01407 public void dragEnter(DropTargetEvent event) {
01408 Button targetButton = (Button)((DropTarget) event.getSource()).getControl();
01409 buttonColor_ = targetButton.getBackground();
01410 targetButton.setBackground(Activator.getDefault().getColor("darkGray"));
01411 }
01412 public void dragLeave(DropTargetEvent event) {
01413 Button targetButton = (Button)((DropTarget) event.getSource()).getControl();
01414 targetButton.setBackground(buttonColor_);
01415 }
01416 public void dragOperationChanged(DropTargetEvent event) {
01417 }
01418 public void dragOver(DropTargetEvent event) {
01419 }
01420 public void dropAccept(DropTargetEvent event) {
01421 }
01422 };
01423 for(int i=0; i<links_.size(); i++){
01424 DragSource source = new DragSource(linkButtons_.get(i), DND.DROP_MOVE );
01425 source.setTransfer(transfers);
01426 source.addDragListener(dragSourceListener);
01427 DropTarget target = new DropTarget(linkButtons_.get(i), DND.DROP_MOVE);
01428 target.setTransfer(transfers);
01429 target.addDropListener(dropTargetListener);
01430 }
01431
01432 for(int i=0; i<sensors_.length; i++){
01433 for(int j=0; j<sensors_[i].size(); j++){
01434 DragSource source = new DragSource(sensorButtons_[i].get(j), DND.DROP_MOVE );
01435 source.setTransfer(transfers);
01436 source.addDragListener(dragSourceListener);
01437 DropTarget target = new DropTarget(sensorButtons_[i].get(j), DND.DROP_MOVE);
01438 target.setTransfer(transfers);
01439 target.addDropListener(dropTargetListener);
01440 }
01441 }
01442
01443 return composite;
01444 }
01445
01446 protected void buttonPressed(int buttonId) {
01447 if (buttonId == IDialogConstants.OK_ID) {
01448 boolean b = false;
01449 for(int i=0; i<links_.size(); i++){
01450 if(links_.get(i).isJoint()){
01451 b = true;
01452 if(!linkButtons_.get(i).getSelection()){
01453 b = false;
01454 break;
01455 }
01456 }
01457 }
01458 if(b){
01459 id_ = "All joints";
01460 }else{
01461 id_ = "";
01462 for(int i=0; i<linkButtons_.size(); i++)
01463 if(linkButtons_.get(i).getSelection())
01464 id_ += links_.get(i).name_ + ",";
01465 for(int i=1; i<sensorButtons_.length; i++)
01466 for(int j=0; j<sensorButtons_[i].size(); j++)
01467 if(sensorButtons_[i].get(j).getSelection())
01468 id_ += sensors_[i].get(j).name_ + ",";
01469 if(id_.length()!=0)
01470 id_ = id_.substring(0, id_.length()-1);
01471 else
01472 for(int i=0; i<sensorButtons_[0].size(); i++)
01473 if(sensorButtons_[0].get(i).getSelection())
01474 id_ = String.valueOf(sensors_[0].get(i).id_);
01475
01476 }
01477 }
01478 super.buttonPressed(buttonId);
01479 }
01480
01481 public String getId(){
01482 return id_;
01483 }
01484
01485 public void setId(String value) {
01486 id_ = value;
01487 if(id_.equals("All joints")){
01488 for(int i=0; i<links_.size(); i++){
01489 if(links_.get(i).isJoint())
01490 links_.get(i).selection_ = true;
01491 }
01492 }else{
01493 String[] names = id_.split(",");
01494 for(int i=names.length; i>0; ){
01495 String name = names[--i].trim();
01496 int index = links_.indexOf(new Link(name, -1));
01497 if(index >= 0){
01498 Link link = links_.get(index);
01499 link.selection_ = true;
01500 links_.remove(link);
01501 links_.insertElementAt(link, 0);
01502 continue;
01503 }
01504 for(int j=1; j<GrxSensorItem.sensorType.length; j++){
01505 index = sensors_[j].indexOf(new IdData(name, -1));
01506 if(index >= 0){
01507 IdData idData = sensors_[j].get(index);
01508 idData.selection_ = true;
01509 sensors_[j].remove(idData);
01510 sensors_[j].insertElementAt(idData, 0);
01511 continue;
01512 }
01513 }
01514 try{
01515 int id = Integer.valueOf(name);
01516 index = sensors_[0].indexOf(new IdData("", id));
01517 if(index >= 0){
01518 IdData idData = sensors_[0].get(index);
01519 idData.selection_ = true;
01520 sensors_[0].remove(idData);
01521 sensors_[0].insertElementAt(idData, 0);
01522 }
01523 }catch(NumberFormatException e){
01524 ;
01525 }
01526 }
01527 }
01528 }
01529
01530 private void updateButton(boolean isLink, int type){
01531 if(isLink){
01532 for(int i=0; i<links_.size(); i++){
01533 String string = links_.get(i).name_;
01534 if(links_.get(i).isJoint())
01535 string += " (id= "+links_.get(i).id_+")";
01536 linkButtons_.get(i).setText(string);
01537 linkButtons_.get(i).setSelection(links_.get(i).selection_);
01538 }
01539 updateAllJointButton();
01540 }else{
01541 if(type < 0)
01542 for(int i=0; i<GrxSensorItem.sensorType.length; i++){
01543 for(int j=0; j<sensors_[i].size(); j++){
01544 sensorButtons_[i].get(j).setText(sensors_[i].get(j).name_+" (id= "+sensors_[i].get(j).id_+")");
01545 sensorButtons_[i].get(j).setSelection(sensors_[i].get(j).selection_);
01546 }
01547 }
01548 else{
01549 for(int j=0; j<sensors_[type].size(); j++){
01550 sensorButtons_[type].get(j).setText(sensors_[type].get(j).name_+" (id= "+sensors_[type].get(j).id_+")");
01551 sensorButtons_[type].get(j).setSelection(sensors_[type].get(j).selection_);
01552 }
01553 }
01554 }
01555 }
01556
01557 private void updateAllJointButton() {
01558 boolean b = true;
01559 for(int i=0; i<links_.size(); i++)
01560 if(links_.get(i).isJoint())
01561 b = b && linkButtons_.get(i).getSelection();
01562 if(b)
01563 allJointButton_.setSelection(true);
01564 else
01565 allJointButton_.setSelection(false);
01566 }
01567 }
01568
01569 public void setControlTime(double time) {
01570 controlTime_ = time;
01571 }
01572
01573 }