00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 package com.generalrobotix.ui.item;
00020
00021 import java.io.*;
00022 import java.lang.reflect.InvocationTargetException;
00023 import java.net.URL;
00024 import java.util.*;
00025
00026 import javax.xml.parsers.DocumentBuilder;
00027 import javax.xml.parsers.DocumentBuilderFactory;
00028 import javax.xml.parsers.ParserConfigurationException;
00029 import javax.xml.transform.OutputKeys;
00030 import javax.xml.transform.Transformer;
00031 import javax.xml.transform.TransformerConfigurationException;
00032 import javax.xml.transform.TransformerException;
00033 import javax.xml.transform.TransformerFactory;
00034 import javax.xml.transform.dom.DOMSource;
00035 import javax.xml.transform.stream.StreamResult;
00036
00037 import org.eclipse.core.runtime.IProgressMonitor;
00038 import org.eclipse.jface.action.Action;
00039 import org.eclipse.jface.dialogs.InputDialog;
00040 import org.eclipse.jface.dialogs.MessageDialog;
00041 import org.eclipse.jface.dialogs.ProgressMonitorDialog;
00042 import org.eclipse.jface.operation.IRunnableWithProgress;
00043 import org.eclipse.jface.preference.IPreferenceStore;
00044 import org.eclipse.osgi.util.NLS;
00045 import org.eclipse.swt.SWT;
00046 import org.eclipse.swt.widgets.FileDialog;
00047 import org.eclipse.ui.IPerspectiveDescriptor;
00048 import org.eclipse.ui.IPerspectiveRegistry;
00049 import org.eclipse.ui.IWorkbench;
00050 import org.eclipse.ui.IWorkbenchPage;
00051 import org.eclipse.ui.IWorkbenchWindow;
00052 import org.eclipse.ui.PlatformUI;
00053 import org.w3c.dom.Document;
00054 import org.w3c.dom.Element;
00055 import org.w3c.dom.Node;
00056 import org.w3c.dom.NodeList;
00057 import org.xml.sax.InputSource;
00058 import org.xml.sax.SAXException;
00059
00060 import com.generalrobotix.ui.grxui.Activator;
00061 import com.generalrobotix.ui.grxui.GrxUIPerspectiveFactory;
00062 import com.generalrobotix.ui.grxui.PreferenceConstants;
00063 import com.generalrobotix.ui.*;
00064 import com.generalrobotix.ui.view.Grx3DView;
00065 import com.generalrobotix.ui.util.GrxConfigBundle;
00066 import com.generalrobotix.ui.util.GrxCorbaUtil;
00067 import com.generalrobotix.ui.util.GrxDebugUtil;
00068 import com.generalrobotix.ui.util.GrxXmlUtil;
00069 import com.generalrobotix.ui.util.MessageBundle;
00070 import com.generalrobotix.ui.util.OrderedHashMap;
00071 import com.generalrobotix.ui.util.TwoInputDialog;
00072
00073 @SuppressWarnings({ "unchecked", "serial" })
00074 public class GrxProjectItem extends GrxBaseItem {
00075 public static final String TITLE = "Project";
00076 public static final String DEFAULT_DIR = "/";
00077 public static final String FILE_EXTENSION = "xml";
00078
00079 public static final int MENU_CREATE=0, MENU_RESTORE=1, MENU_LOAD=2, MENU_SAVE=3, MENU_SAVE_AS=4, MENU_IMPORT=5;
00080 private Vector<Action> menu_;
00081
00082 private static final String MODE_TAG = "mode";
00083 private static final String WINCONF_TAG = "perspective";
00084
00085 private Document doc_;
00086 private DocumentBuilder builder_;
00087 private Transformer transformer_;
00088 private HashMap<String, Properties> viewProperties_ = new HashMap<String, Properties>();
00089
00090 private Map<String, ModeNodeInfo> modeInfoMap_ = new HashMap<String, ModeNodeInfo>();
00091
00092 private class ModeNodeInfo {
00093 Element root;
00094 List propList;
00095 NodeList itemList;
00096 NodeList viewList;
00097 Element windowConfig;
00098 }
00099
00100 public GrxProjectItem(String name, GrxPluginManager manager) {
00101 super(name, manager);
00102
00103 DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
00104 TransformerFactory tffactory = TransformerFactory.newInstance();
00105
00106 try {
00107 builder_ = dbfactory.newDocumentBuilder();
00108 transformer_ = tffactory.newTransformer();
00109 transformer_.setOutputProperty(OutputKeys.INDENT, "yes");
00110 transformer_.setOutputProperty(OutputKeys.METHOD, "xml");
00111 setDefaultDirectory();
00112 } catch (ParserConfigurationException e) {
00113 e.printStackTrace();
00114 } catch (TransformerConfigurationException e) {
00115 e.printStackTrace();
00116 }
00117 }
00118
00119 public boolean create() {
00120 viewProperties_.clear();
00121 clear();
00122 setURL("");
00123 for (int i=0; ; i++) {
00124 File f = new File(getDefaultDir().getAbsolutePath()+"/"+"newproject"+i+".xml");
00125 if (!f.isFile()) {
00126 setName(f.getName().split("[.]")[0]);
00127 break;
00128 }
00129 }
00130
00131 doc_ = builder_.newDocument();
00132 element_ = doc_.createElement("grxui");
00133 element_.appendChild(doc_.createTextNode("\n"));
00134 doc_.appendChild(element_);
00135 _updateModeInfo();
00136 IWorkbenchPage page=null;
00137 IWorkbench workbench = PlatformUI.getWorkbench();
00138 if( workbench != null){
00139 IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
00140 for(IWorkbenchWindow window : windows){
00141 page = window.getActivePage();
00142 if (page != null &&
00143 page.getPerspective().getId().equals(GrxUIPerspectiveFactory.ID+ ".project") )
00144 page.closePerspective(page.getPerspective(), false, false);
00145 }
00146 }
00147
00148 List<GrxBaseView> vl = manager_.getViewList();
00149 for (int i=0; i<vl.size(); i++)
00150 if (vl.get(i) != null) vl.get(i).restoreProperties();
00151
00152 return true;
00153 }
00154
00155 private void _updateModeInfo() {
00156 modeInfoMap_.clear();
00157
00158 NodeList modeList = doc_.getElementsByTagName(MODE_TAG);
00159 for (int i=0; i<modeList.getLength(); i++) {
00160 ModeNodeInfo mi = new ModeNodeInfo();
00161 mi.root = (Element)modeList.item(i);
00162 modeInfoMap_.put(mi.root.getAttribute("name"), mi);
00163
00164
00165 NodeList propList = mi.root.getElementsByTagName(PROPERTY_TAG);
00166 List<Element> elList = new ArrayList<Element>();
00167 for (int j=0; j<propList.getLength(); j++) {
00168 if (propList.item(j).getParentNode() == mi.root)
00169 elList.add((Element)propList.item(j));
00170 }
00171 mi.propList = elList;
00172
00173
00174 mi.itemList = mi.root.getElementsByTagName(ITEM_TAG);
00175
00176
00177 mi.viewList = mi.root.getElementsByTagName(VIEW_TAG);
00178
00179
00180 NodeList wconfList = mi.root.getElementsByTagName(WINCONF_TAG);
00181 if (wconfList.getLength() > 0)
00182 mi.windowConfig = (Element)wconfList.item(0);
00183 else
00184 mi.windowConfig = null;
00185
00186 }
00187 }
00188
00189 private ModeNodeInfo _getModeNodeInfo(String mode) {
00190 ModeNodeInfo mi = modeInfoMap_.get(mode);
00191 if (mi == null) {
00192 mi = new ModeNodeInfo();
00193
00194 NodeList nodeList = doc_.getElementsByTagName(MODE_TAG);
00195 for (int i=0; i<nodeList.getLength(); i++) {
00196 Element e = (Element)nodeList.item(i);
00197 if (e.getAttribute("name").equals(mode)) {
00198 mi.root = e;
00199 break;
00200 }
00201 }
00202 if (mi.root == null) {
00203 mi.root = doc_.createElement(MODE_TAG);
00204 mi.root.setAttribute("name", mode);
00205 element_.appendChild(doc_.createTextNode(INDENT4));
00206 element_.appendChild(mi.root);
00207 element_.appendChild(doc_.createTextNode("\n"));
00208 }
00209
00210 _updateModeInfo();
00211 }
00212
00213 return mi;
00214 }
00215
00216 public void setWindowConfigElement(String mode, Element element){
00217 _getModeNodeInfo(mode).windowConfig = element;
00218 }
00219
00220 public Element getWindowConfigElement(String mode) {
00221 return _getModeNodeInfo(mode).windowConfig;
00222 }
00223
00224 private void storeMode(String mode) {
00225 Element modeEl = _getModeNodeInfo(mode).root;
00226 NodeList list = modeEl.getChildNodes();
00227 for (int i=list.getLength()-1; i>=0; i--)
00228 modeEl.removeChild(list.item(i));
00229
00230 modeEl.appendChild(doc_.createTextNode("\n"));
00231
00232 List<GrxBaseItem> itemList = manager_.getActiveItemList();
00233 for (int i=0; i<itemList.size(); i++) {
00234 GrxBaseItem item = itemList.get(i);
00235 modeEl.appendChild(doc_.createTextNode(INDENT4+INDENT4));
00236 item.setDocument(doc_);
00237 modeEl.appendChild(item.storeProperties());
00238 modeEl.appendChild(doc_.createTextNode("\n"));
00239 }
00240
00241 List<GrxBaseView> viewList = manager_.getActiveViewList();
00242 for (int i=0; i<viewList.size(); i++) {
00243 GrxBaseView view = viewList.get(i);
00244 if (view.propertyNames().hasMoreElements()) {
00245 view.setDocument(doc_);
00246 Element element = view.storeProperties();
00247 if(element!=null){
00248 modeEl.appendChild(doc_.createTextNode(INDENT4+INDENT4));
00249 modeEl.appendChild(element);
00250 modeEl.appendChild(doc_.createTextNode("\n"));
00251 }
00252 }
00253 }
00254
00255 modeEl.appendChild(doc_.createTextNode(INDENT4));
00256 }
00257
00258 @SuppressWarnings("deprecation")
00259 private Element storePerspectiveConf(Element element){
00260 IWorkbenchPage page=null;
00261 IWorkbench workbench = PlatformUI.getWorkbench();
00262 if( workbench != null){
00263 IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
00264 if (window != null){
00265 page = window.getActivePage();
00266 if (!page.getPerspective().getId().contains(GrxUIPerspectiveFactory.ID) ){
00267 return null;
00268 }
00269 }
00270 }
00271
00272 IPerspectiveRegistry perspectiveRegistry=workbench.getPerspectiveRegistry();
00273 IPerspectiveDescriptor orgPd=perspectiveRegistry.findPerspectiveWithId(GrxUIPerspectiveFactory.ID );
00274 IPerspectiveDescriptor tempPd=perspectiveRegistry.findPerspectiveWithId(GrxUIPerspectiveFactory.ID + ".project");
00275 if(tempPd!=null)
00276 perspectiveRegistry.deletePerspective(tempPd);
00277 tempPd = perspectiveRegistry.clonePerspective(GrxUIPerspectiveFactory.ID + ".project", getName(), orgPd);
00278 page.savePerspectiveAs(tempPd);
00279 page.setPerspective(orgPd);
00280 page.setPerspective(tempPd);
00281 IPreferenceStore store = workbench.getPreferenceStore();
00282 String confString=store.getString(GrxUIPerspectiveFactory.ID +".project"+"_persp");
00283 Document doc=null;
00284 try {
00285 doc = builder_.parse(new InputSource(new StringReader(confString)));
00286 Element confElement =doc.getDocumentElement();
00287 Node elementCopy = doc_.importNode(confElement, true);
00288 element.appendChild(elementCopy);
00289 return (Element) elementCopy;
00290 } catch (SAXException e1) {
00291 e1.printStackTrace();
00292 } catch (IOException e1) {
00293 e1.printStackTrace();
00294 }
00295 return null;
00296 }
00297
00298 public Vector<Action> getMenu() {
00299
00300 if( menu_ == null ){
00301 menu_ = new Vector<Action>();
00302
00303
00304 menu_.add( new Action(){
00305 public String getText(){ return MessageBundle.get("GrxProjectItem.menu.CreateProject"); }
00306 public void run(){
00307 boolean ans = MessageDialog.openConfirm( null, MessageBundle.get("GrxProjectItem.dialog.title.createProject"), MessageBundle.get("GrxProjectItem.dialog.message.createProject") );
00308 if ( ans ){
00309 if(!checkModifiedModel())
00310 return;
00311 manager_.refuseItemChange();
00312 manager_.removeAllItems();
00313 manager_.acceptItemChange();
00314 }else if ( ans == false )
00315 return;
00316 create();
00317 }
00318 } );
00319
00320 menu_.add( new Action(){
00321 public String getText(){ return MessageBundle.get("GrxProjectItem.menu.restoreProject"); }
00322 public void run(){
00323 manager_.refuseItemChange();
00324 manager_.removeAllItems();
00325 restoreProject();
00326 manager_.acceptItemChange();
00327 }
00328 } );
00329
00330 menu_.add( new Action(){
00331 public String getText(){ return MessageBundle.get("GrxProjectItem.menu.loadProject"); }
00332 public void run(){
00333 if(!checkModifiedModel())
00334 return;
00335 load();
00336 }
00337 } );
00338
00339 menu_.add( new Action(){
00340 public String getText(){ return MessageBundle.get("GrxProjectItem.menu.saveProject"); }
00341 public void run(){
00342 save();
00343 }
00344 } );
00345
00346 menu_.add( new Action(){
00347 public String getText(){ return MessageBundle.get("GrxProjectItem.menu.saveProjectAs"); }
00348 public void run(){
00349 saveAs();
00350 }
00351 } );
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361 menu_.add( new Action(){
00362 public String getText(){ return MessageBundle.get("GrxProjectItem.menu.addItem"); }
00363 public void run(){
00364 addItem();
00365 }
00366 } );
00367
00368 }
00369
00370 return menu_;
00371 }
00372
00373 private boolean checkModifiedModel()
00374 {
00375 List<GrxModelItem> modelList = manager_.<GrxModelItem>getSelectedItemList(GrxModelItem.class);
00376 List<GrxModelItem> modifiedModels = new ArrayList<GrxModelItem>();
00377 for (int i=0; i<modelList.size(); i++) {
00378 GrxModelItem model = modelList.get(i);
00379 int ret=model.checkModifiedModel(false);
00380 if(ret==GrxModelItem.MODIFIED_NG){
00381 for(GrxModelItem modifiedModel : modifiedModels){
00382 modifiedModel.reload();
00383 }
00384 return false;
00385 }else if(ret==GrxModelItem.MODIFIED_OK){
00386 modifiedModels.add(model);
00387 }
00388 }
00389 return true;
00390 }
00391
00392 public void save(File f) {
00393 if (f.exists()) {
00394 if (!f.isFile())
00395 return;
00396 }
00397
00398 String mode = manager_.getCurrentModeName();
00399 storeMode(mode);
00400
00401 setName(f.getName().split("[.]")[0]);
00402 setURL(f.getAbsolutePath());
00403
00404 if (MessageDialog.openQuestion(null, MessageBundle.get("GrxProjectItem.dialog.savewindow.title"),
00405 MessageBundle.get("GrxProjectItem.dialog.savewindow.message"))) {
00406 Element element = _getModeNodeInfo(mode).root;
00407 Element windowConfigElement = storePerspectiveConf(element);
00408 setWindowConfigElement(mode, windowConfigElement);
00409 }
00410
00411 if (f == null)
00412 f = new File(getDefaultDir().getAbsolutePath()+"/"+getName()+".xml");
00413
00414 if (!f.getAbsolutePath().endsWith(".xml"))
00415 f = new File(f.getAbsolutePath()+".xml");
00416
00417 try {
00418 DOMSource src = new DOMSource();
00419 src.setNode(doc_);
00420 StreamResult target = new StreamResult();
00421 target.setOutputStream(new FileOutputStream(f));
00422 transformer_.transform(src, target);
00423 return ;
00424 } catch (TransformerConfigurationException e) {
00425 e.printStackTrace();
00426 } catch (FileNotFoundException e) {
00427 e.printStackTrace();
00428 } catch (TransformerException e) {
00429 e.printStackTrace();
00430 }
00431 MessageDialog.openError(null, MessageBundle.get("GrxProjectItem.dialog.saveError.title"), MessageBundle.get("GrxProjectItem.dialog.saveError.message"));
00432 }
00433
00434 public void saveAs() {
00435 String path = getURL(true);
00436 if (path == null)
00437 path = getDefaultDir().getAbsolutePath()+"/"+getName()+".xml";
00438
00439 File initialFile = new File(path);
00440
00441 FileDialog fdlg = new FileDialog( GrxUIPerspectiveFactory.getCurrentShell(), SWT.SAVE);
00442 String[] exts = { "*.xml" }, extNames={"GrxUI Project"};
00443 fdlg.setFilterExtensions( exts );
00444 fdlg.setFilterNames( extNames );
00445
00446 fdlg.setFilterPath( initialFile.getParent() );
00447 fdlg.setFileName( initialFile.getName() );
00448
00449 String fPath = fdlg.open();
00450 if( fPath != null ) {
00451 File f = new File(fPath);
00452 if (f.exists() && f.isFile()){
00453 boolean ans = MessageDialog.openConfirm( null, MessageBundle.get("GrxProjectItem.dialog.title.saveProject"),
00454 MessageBundle.get("GrxProjectItem.dialog.message.saveProject0")+f.getName()+MessageBundle.get("GrxProjectItem.dialog.message.saveProject1") +
00455 MessageBundle.get("GrxProjectItem.dialog.message.saveProject2") );
00456 if (ans == false)
00457 return;
00458 }
00459 System.setProperty("CURRENT_DIR", f.getParent());
00460 save( f );
00461 setDefaultDirectory(f.getParent());
00462 }
00463 }
00464
00465 public void save(){
00466 if (getURL(true) == null){
00467 saveAs();
00468 }else{
00469 File f = new File(getURL(true));
00470 if (f.exists()){
00471 save(f);
00472 }else{
00473 saveAs();
00474 }
00475 }
00476 }
00477
00481 public void load() {
00482 FileDialog fdlg = new FileDialog( GrxUIPerspectiveFactory.getCurrentShell(), SWT.OPEN);
00483 String[] fe = { "*.xml" };
00484 fdlg.setFilterExtensions( fe );
00485 fdlg.setFilterPath(getDefaultDir().getAbsolutePath());
00486
00487 String fPath = fdlg.open();
00488 if( fPath != null ) {
00489 File f = new File(fPath);
00490 load(f);
00491 }
00492 }
00493
00499 public boolean load(File f) {
00500 System.out.println( "[ProjectItem]@load ProjectFile load "+ f.toString());
00501
00502 if (f == null || !f.isFile())
00503 return false;
00504 GrxSimulationItem simItem = manager_.<GrxSimulationItem>getSelectedItem(GrxSimulationItem.class, null);
00505 if(simItem!=null && simItem.isSimulating())
00506 simItem.stopSimulation();
00507
00508 manager_.refuseItemChange();
00509 manager_.removeAllItems();
00510 manager_.focusedItem(manager_.getProject());
00511 setName(f.getName().split("[.]")[0]);
00512
00513 String dir = f.getParent();
00514 if(dir != null)
00515 System.setProperty("CURRENT_DIR", dir);
00516
00517 try {
00518 doc_ = builder_.parse(f);
00519 element_ = doc_.getDocumentElement();
00520 _updateModeInfo();
00521 file_ = f;
00522 setURL(f.getAbsolutePath());
00523 } catch (Exception e) {
00524 GrxDebugUtil.printErr("project load:",e);
00525 file_ = null;
00526 return false;
00527 }
00528
00529
00530 OrderedHashMap modes=(OrderedHashMap)manager_.getItemMap(GrxModeInfoItem.class);
00531 Iterator<GrxModeInfoItem> it = modes.values().iterator();
00532 NodeList list = doc_.getElementsByTagName(MODE_TAG);
00533 for (int i=0; i<list.getLength(); i++) {
00534 Element modeEl = (Element) list.item(i);
00535 String modeName = modeEl.getAttribute("name");
00536 if (modeName == null)
00537 continue;
00538 boolean found=false;
00539 while (it.hasNext()) {
00540 GrxModeInfoItem mode = it.next();
00541 if(modeName.equals(mode.getName())){
00542 mode.setElement(modeEl);
00543 found=true;
00544 break;
00545 }
00546 }
00547 if(!found){
00548 GrxModeInfoItem item = (GrxModeInfoItem)manager_.createItem(GrxModeInfoItem.class, modeName);
00549 if (item != null) {
00550 item.setElement(modeEl);
00551 if (GrxXmlUtil.getBoolean(modeEl, "select", true)) {
00552 manager_.setSelectedItem(item, true);
00553 }
00554 }
00555 manager_.setCurrentMode(item);
00556 }
00557 }
00558
00559 setDefaultDirectory(f.getParent());
00560 restoreProject();
00561 manager_.acceptItemChange();
00562 return true;
00563 }
00564
00565 public void restoreProject() {
00566
00567 String mode = manager_.getCurrentModeName();
00568 System.out.println("Restore Project (Mode:" +mode+")");
00569
00570 IRunnableWithProgress runnableProgress = new IRunnableWithProgress() {
00571 public void run(IProgressMonitor monitor) throws InterruptedException {
00572 String mode = manager_.getCurrentModeName();
00573 monitor.beginTask("Restore Project (Mode:" +mode+")", 10 );
00574 restoreProject_work(mode, monitor);
00575 monitor.done();
00576 }
00577 };
00578 ProgressMonitorDialog progressMonitorDlg = new ProgressMonitorDialog(GrxUIPerspectiveFactory.getCurrentShell());
00579 try {
00580 progressMonitorDlg.run(false,false, runnableProgress);
00581
00582 Grx3DView view3d = (Grx3DView)manager_.getView( Grx3DView.class, true );
00583 if(view3d!=null){
00584 view3d.repaint();
00585 }
00586 } catch (InvocationTargetException e) {
00587 e.printStackTrace();
00588 } catch (InterruptedException e) {
00589 e.printStackTrace();
00590 }
00591 }
00592
00593 private void restoreProject_work(String mode, IProgressMonitor monitor) {
00594
00595
00596 monitor.worked(1);
00597
00598 if (file_ == null || !file_.isFile())
00599 {
00600 return;
00601 }
00602 ModeNodeInfo minfo = modeInfoMap_.get(mode);
00603
00604 monitor.worked(1);
00605
00606 List propList = minfo.propList;
00607 if (propList != null) {
00608 for (int i=0; i<propList.size(); i++) {
00609 Element propEl = (Element)propList.get(i);
00610 String key = propEl.getAttribute("name");
00611 String val = propEl.getAttribute("value");
00612 setProperty(key, val);
00613 }
00614 }
00615
00616 monitor.worked(1);
00617
00618 if (minfo.itemList != null) {
00619
00620
00621
00622 if(mode.equals("Simulation") && !containSimulationItem(minfo.itemList)){
00623 Element simElement = doc_.createElement(ITEM_TAG);
00624 simElement.setAttribute("class", PreferenceConstants.SIMULATIONITEM);
00625 simElement.setAttribute("name", "simulationItem");
00626 simElement.setAttribute("select", "true");
00627 minfo.root.appendChild(simElement);
00628 minfo.itemList = minfo.root.getElementsByTagName(ITEM_TAG);
00629 for (int i=0; i<minfo.itemList.getLength(); i++) {
00630 Element itemElement = (Element)minfo.itemList.item(i);
00631 if(itemElement.getAttribute("class").equals(PreferenceConstants.WORLDSTATEITEM)){
00632 NodeList props = itemElement.getElementsByTagName(PROPERTY_TAG);
00633 for (int j = 0; j < props.getLength(); ) {
00634 Element propEl = (Element) props.item(j);
00635 String key = propEl.getAttribute("name");
00636 String val = propEl.getAttribute("value");
00637 if(!key.equals("logTimeStep")){
00638 Element element = doc_.createElement(PROPERTY_TAG);
00639 element.setAttribute("name", key);
00640 element.setAttribute("value", val);
00641 simElement.appendChild(element);
00642 itemElement.removeChild(propEl);
00643 }else
00644 j++;
00645 }
00646 }
00647 }
00648 }
00649
00650 List<GrxBaseItem> il = new ArrayList<GrxBaseItem>();
00651 for (int i = 0; i < minfo.itemList.getLength(); i++) {
00652 GrxBaseItem p = (GrxBaseItem)_restorePlugin((Element) minfo.itemList.item(i));
00653 if (p != null)
00654 il.add(p);
00655 }
00656
00657
00658 for (int i=0; i<il.size(); i++) {
00659 GrxBaseItem item = il.get(i);
00660 boolean select = GrxXmlUtil.getBoolean(item.getElement(), "select", false);
00661
00662 }
00663 }
00664
00665 monitor.worked(1);
00666
00667 if (minfo.windowConfig != null) {
00668 Document doc = builder_.newDocument();
00669 Node nodeCopy = doc.importNode(minfo.windowConfig, true);
00670 doc.appendChild(nodeCopy);
00671 StringWriter sw = new StringWriter();
00672 try {
00673 DOMSource src = new DOMSource();
00674 src.setNode(doc);
00675 StreamResult target = new StreamResult(sw);
00676 transformer_.transform(src, target);
00677 } catch (TransformerConfigurationException e) {
00678 e.printStackTrace();
00679 } catch (TransformerException e) {
00680 e.printStackTrace();
00681 }
00682
00683 IWorkbenchPage page=null;
00684 IWorkbench workbench = PlatformUI.getWorkbench();
00685 if( workbench != null){
00686 IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
00687 if (window != null){
00688 page = window.getActivePage();
00689 if (!page.getPerspective().getId().contains(GrxUIPerspectiveFactory.ID) ){
00690 return;
00691 }
00692 }
00693 }
00694 if (page!=null && page.getPerspective().getId().equals(GrxUIPerspectiveFactory.ID+ ".project") )
00695 page.closePerspective(page.getPerspective(), false, false);
00696 IPreferenceStore store = workbench.getPreferenceStore();
00697 IPerspectiveRegistry perspectiveRegistry=workbench.getPerspectiveRegistry();
00698 IPerspectiveDescriptor orgPd=perspectiveRegistry.findPerspectiveWithId(GrxUIPerspectiveFactory.ID );
00699 IPerspectiveDescriptor tempPd=perspectiveRegistry.findPerspectiveWithId(GrxUIPerspectiveFactory.ID + ".project");
00700 if(tempPd!=null)
00701 perspectiveRegistry.deletePerspective(tempPd);
00702 tempPd = perspectiveRegistry.clonePerspective(GrxUIPerspectiveFactory.ID + ".project", getName(), orgPd);
00703 store.setValue(GrxUIPerspectiveFactory.ID + ".project"+"_persp", sw.toString());
00704 if(page!=null)
00705 page.setPerspective(tempPd);
00706 }else{
00707 IWorkbench workbench = PlatformUI.getWorkbench();
00708 if( workbench != null){
00709 IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
00710 for(IWorkbenchWindow window : windows){
00711 IWorkbenchPage page = window.getActivePage();
00712 if (page != null &&
00713 page.getPerspective().getId().equals(GrxUIPerspectiveFactory.ID+ ".project") )
00714 page.closePerspective(page.getPerspective(), false, false);
00715 }
00716 }
00717 }
00718
00719 viewProperties_.clear();
00720 if (minfo.viewList != null) {
00721 for (int i = 0; i < minfo.viewList.getLength(); i++){
00722 Element element = (Element)minfo.viewList.item(i);
00723 NodeList props = element.getElementsByTagName(PROPERTY_TAG);
00724 Properties properties = new Properties();
00725 for (int j = 0; j < props.getLength(); j++) {
00726 Element propEl = (Element) props.item(j);
00727 String key = propEl.getAttribute("name");
00728 String val = propEl.getAttribute("value");
00729 properties.setProperty(key, val);
00730 }
00731 viewProperties_.put(element.getAttribute("name"), properties);
00732 }
00733 }
00734
00735 List<GrxBaseView> vl = manager_.getViewList();
00736 for (int i=0; i<vl.size(); i++)
00737 if (vl.get(i) != null) vl.get(i).restoreProperties();
00738
00739 }
00740
00741 private GrxBasePlugin _restorePlugin(Element e) {
00742 String iname = e.getAttribute("name");
00743 if (iname == null || iname.length() == 0)
00744 return null;
00745 manager_.pluginLoader_.addURL(GrxXmlUtil.expandEnvVal(e.getAttribute("lib")));
00746 Class cls = manager_.registerPlugin(e.getAttribute("class"));
00747 if (cls == null)
00748 return null;
00749 manager_.getMode().addItemClassList(cls);
00750
00751 GrxBasePlugin plugin = null;
00752 if (GrxBaseItem.class.isAssignableFrom(cls)) {
00753 Class<? extends GrxBaseItem> icls = (Class<? extends GrxBaseItem>) cls;
00754 String url = e.getAttribute("url");
00755 if (!url.equals(""))
00756 plugin = manager_.loadItem(icls, iname, url);
00757 else
00758 plugin = manager_.createItem(icls, iname);
00759 plugin = manager_.getItem(icls, iname);
00760 }
00761
00762 if (plugin != null) {
00763 plugin.setElement(e);
00764 plugin.restoreProperties();
00765 if (GrxBaseItem.class.isAssignableFrom(cls)) {
00766 manager_.itemChange((GrxBaseItem)plugin, GrxPluginManager.ADD_ITEM);
00767 manager_.setSelectedItem((GrxBaseItem)plugin, true);
00768 }
00769 }
00770
00771 return plugin;
00772 }
00773
00774 private boolean containSimulationItem(NodeList list){
00775 for (int i = 0; i < list.getLength(); i++) {
00776 if(((Element) list.item(i)).getAttribute("class").equals(PreferenceConstants.SIMULATIONITEM))
00777 return true;
00778 }
00779 return false;
00780 }
00781
00782 private static final File DEFAULT_ISE_PROJECT_DIR = new File("../ISE/Projects");
00783 public void importISEProject() {
00784
00785 FileDialog fDialog = new FileDialog(null,SWT.SAVE);
00786
00787 String [] exts = {"*.prj"};
00788 String [] filterNames = {"ISE Project File(*.prj)"};
00789 fDialog.setFilterExtensions(exts);
00790 fDialog.setFilterNames(filterNames);
00791 if( DEFAULT_ISE_PROJECT_DIR != null )
00792 fDialog.setFilterPath( DEFAULT_ISE_PROJECT_DIR.getPath() );
00793
00794 String openPath = fDialog.open();
00795
00796 if( openPath != null ) {
00797
00798
00799
00800
00801
00802
00803 File f = new File( openPath );
00804 setName(f.getName().split(".prj")[0]);
00805 importISEProject(f);
00806
00807
00808 storeMode(manager_.getCurrentModeName());
00809
00810
00811
00812 }
00813 }
00814
00815 public Properties getViewProperties(String viewName){
00816 return viewProperties_.get(viewName);
00817 }
00818
00819 private static String ENVIRONMENT_NODE = "jp.go.aist.hrp.simulator.EnvironmentNode";
00820 private static String ROBOT_NODE = "jp.go.aist.hrp.simulator.RobotNode";
00821 private static String COLLISIONPAIR_NODE = "jp.go.aist.hrp.simulator.CollisionPairNode";
00822 private static String GRAPH_NODE = "jp.go.aist.hrp.simulator.GraphNode";
00823
00824 private static String WORLD_STATE_ITEM = "com.generalrobotix.ui.item.GrxWorldStateItem";
00825 private static String MODEL_ITEM = "com.generalrobotix.ui.item.GrxModelItem";
00826 private static String COLLISIONPAIR_ITEM = "com.generalrobotix.ui.item.GrxCollisionPairItem";
00827 private static String GRAPH_ITEM = "com.generalrobotix.ui.item.GrxGraphItem";
00828
00829 public void importISEProject(File f) {
00830 manager_.removeAllItems();
00831
00832 GrxConfigBundle prop = null;
00833 try {
00834 prop = new GrxConfigBundle(f.getAbsolutePath());
00835 } catch (FileNotFoundException e) {
00836 e.printStackTrace();
00837 } catch (IOException e) {
00838 e.printStackTrace();
00839 }
00840
00841 setProperty("nsHost", GrxCorbaUtil.nsHost());
00842 Integer nsPort = new Integer(GrxCorbaUtil.nsPort());
00843 setProperty("nsPort", nsPort.toString());
00844
00845 String pname = prop.getStr("Project.name", "");
00846 Class cls = manager_.registerPlugin(WORLD_STATE_ITEM);
00847 GrxBaseItem newItem = manager_.createItem((Class <? extends GrxBaseItem>)cls, pname);
00848 newItem.setDbl("totalTime", prop.getDbl("Project.totalTime", 20.0));
00849 newItem.setDbl("timeStep", prop.getDbl("Project.timeStep", 0.001));
00850 newItem.setDbl("logTimeStep", prop.getDbl("Project.timeStep", 0.001));
00851 newItem.setProperty("method", prop.getStr("Project.method"));
00852 manager_.itemChange(newItem, GrxPluginManager.ADD_ITEM);
00853 manager_.setSelectedItem(newItem, true);
00854
00855 for (int i = 0; i < prop.getInt("Project.num_object", 0); i++) {
00856 String header = "Object" + i + ".";
00857 String oName = prop.getStr(header + "name");
00858 String cName = prop.getStr(header + "class");
00859 if (oName == null || cName == null)
00860 continue;
00861
00862 if (cName.equals(ENVIRONMENT_NODE) || cName.equals(ROBOT_NODE)) {
00863 cls = manager_.registerPlugin(MODEL_ITEM);
00864 try {
00865 URL url = new URL(prop.getStr(header + "url"));
00866 newItem = manager_.loadItem((Class<? extends GrxBaseItem>)cls, oName, url.getPath());
00867 if(newItem!=null){
00868 manager_.itemChange(newItem, GrxPluginManager.ADD_ITEM);
00869 manager_.setSelectedItem(newItem, true);
00870 }
00871 } catch (Exception e) {
00872 e.printStackTrace();
00873 }
00874 if (newItem == null)
00875 continue;
00876
00877 if (cName.equals(ENVIRONMENT_NODE)) {
00878 newItem.setProperty("isRobot", "false");
00879 } else if (cName.equals(ROBOT_NODE)) {
00880 newItem.setProperty("isRobot", "true");
00881 Enumeration e = prop.keys();
00882 while (e.hasMoreElements()) {
00883 String key = (String)e.nextElement();
00884 if (key.startsWith(header)) {
00885 String newKey = key.substring(header.length());
00886 if (key.endsWith(".angle")) {
00887 newItem.setDbl(newKey, prop.getDbl(key, 0.0));
00888 } else if (key.endsWith(".mode")) {
00889 newItem.setProperty(newKey, prop.getStr(key, "Torque"));
00890 } else if (key.endsWith(".translation")) {
00891 newItem.setDblAry(newKey,
00892 prop.getDblAry(key, new double[]{0.0, 0.0, 0.0}));
00893 } else if (key.endsWith(".rotation")) {
00894 newItem.setDblAry(newKey,
00895 prop.getDblAry(key, new double[]{0.0, 1.0, 0.0, 0.0}));
00896 }
00897 }
00898 }
00899
00900 String controller = prop.getStr(header + "controller");
00901 controller = controller.replaceFirst("openhrp.", "");
00902 double controlTime = prop.getDbl(header + "controlTime", 0.001);
00903 newItem.setProperty("controller", controller);
00904 newItem.setProperty("controlTime", String.valueOf(controlTime));
00905
00906 String imageProcessor = prop.getStr(header + "imageProcessor");
00907 if (imageProcessor != null) {
00908 double imageProcessTime = prop.getDbl(header + "imageProcessTime", 0.001);
00909 newItem.setProperty("imageProcessor", imageProcessor);
00910 newItem.setProperty("imageProcessTime", String.valueOf(imageProcessTime));
00911 }
00912 }
00913
00914 } else if (cName.equals(COLLISIONPAIR_NODE)) {
00915 cls = manager_.registerPlugin(COLLISIONPAIR_ITEM);
00916 newItem = manager_.createItem((Class<? extends GrxBaseItem>)cls, oName);
00917 newItem.setProperty("objectName1", prop.getStr(header + "objectName1"));
00918 newItem.setProperty("jointName1", prop.getStr(header + "jointName1"));
00919 newItem.setProperty("objectName2", prop.getStr(header + "objectName2"));
00920 newItem.setProperty("jointName2", prop.getStr(header + "jointName2"));
00921 newItem.setProperty("slidingFriction", prop.getStr(header + "slidingFriction", "0.5"));
00922 newItem.setProperty("staticFriction", prop.getStr(header + "staticFriction", "0.5"));
00923 newItem.setProperty("cullingThresh", prop.getStr(header + "cullingThresh", "0.01"));
00924 newItem.setProperty("Restitution", prop.getStr(header + "Restitution", "0.0"));
00925 newItem.setProperty("sprintDamperModel", prop.getStr(header + "springDamplerModel", "false"));
00926 newItem.setProperty("springConstant", prop.getStr(header + "springConstant", "0.0 0.0 0.0 0.0 0.0 0.0"));
00927 newItem.setProperty("damperConstant", prop.getStr(header + "damperConstant", "0.0 0.0 0.0 0.0 0.0 0.0"));
00928
00929 } else if (cName.equals(GRAPH_NODE)) {
00930 cls = manager_.registerPlugin(GRAPH_ITEM);
00931 newItem = manager_.getItem((Class<? extends GrxBaseItem>)cls, null);
00932 if (newItem == null)
00933 newItem = manager_.createItem((Class<? extends GrxBaseItem>)cls, "GraphList1");
00934 String items = prop.getStr(header + "dataItems");
00935 newItem.setProperty(oName + ".dataItems", items);
00936 String[] str = items.split(",");
00937 String[] p = {
00938 "object", "node", "attr", "index",
00939 "numSibling", "legend", "color"
00940 };
00941 for (int j = 0; j < str.length; j++) {
00942 for (int k = 0; k < p.length; k++) {
00943 String key = str[j] + "." + p[k];
00944 String value = prop.getStr(header + key);
00945 if (value != null)
00946 newItem.setProperty(oName + "." + key, value);
00947 }
00948 }
00949 }
00950 newItem.restoreProperties();
00951 manager_.setSelectedItem(newItem, true);
00952 }
00953 }
00954
00955
00956 private void setDefaultDirectory(){
00957 String dir = Activator.getDefault().getPreferenceStore().getString("PROJECT_DIR");
00958 if(dir.equals(""))
00959 dir = System.getenv("PROJECT_DIR");
00960 if( dir != null ){
00961 setDefaultDirectory( dir );
00962 }
00963 }
00964
00965 private void addItem(){
00966 TwoInputDialog dialog = new TwoInputDialog( null, MessageBundle.get("GrxProjectItem.dialog.addItem.title"), MessageBundle.get("GrxProjectItem.dialog.addItem.message0"),
00967 "", null, MessageBundle.get("GrxProjectItem.dialog.addItem.message1"),"" );
00968 if(dialog.open()==InputDialog.OK){
00969 String[] values = dialog.getValues();
00970 manager_.addPlugin(values[0], values[1]);
00971 }
00972 }
00973 }