1. 程式人生 > >基於Web實現線上繪畫拓撲圖[GraphEditor]

基於Web實現線上繪畫拓撲圖[GraphEditor]

  1. function Actions(editorUi)
  2. {
  3.     this.editorUi = editorUi;
  4.     this.actions = new Object();
  5.     this.init();
  6. };
  7. /**
  8. * 新增預設的行為
  9. */
  10. Actions.prototype.init = function()
  11. {
  12.     var ui = this.editorUi;
  13.     var editor = ui.editor;
  14.     var graph = editor.graph;
  15.     graph.cellsMovable=!0;//設定不可移動
  16.     graph.cellsDisconnectable=!0;//設定邊不可編輯
  17.     graph.cellsResizable=!0;//設定不可改變大小
  18.     $.post($("#path").val()+"/SaveToXmlServlet",{"tp":$("#mapTp").val(),"type":"get"},function(text){
  19.         if(text=="0"){
  20.             alert("檔案載入失敗!");
  21.         }else{
  22.             var xml = text;
  23.             var doc = mxUtils.par**ml(xml);
  24.             var model = new mxGraphModel();
  25.             var codec = new mxCodec(doc);
  26.             codec.decode(doc.documentElement, model);
  27.             var children = model.getChildren(model.getChildAt(model.getRoot(), 0));
  28.             graph.setSelectionCells(editor.graph.importCells(children));
  29.         }        
  30.     });
  31.     // 檔案操作
  32.     this.addAction('new', function() { window.open(ui.getUrl()); });
  33.     this.addAction('open', function()
  34.     {
  35.         window.openNew = true;
  36.         window.openKey = 'open';
  37.         ui.openFile();
  38.     });
  39.     this.addAction('import', function()
  40.     {
  41.         window.openNew = false;
  42.         window.openKey = 'import';
  43.         // 後關閉對話方塊開啟
  44.         window.openFile = new OpenFile(mxUtils.bind(this, function()
  45.         {
  46.             ui.hideDialog();
  47.         }));
  48.         window.openFile.setConsumer(mxUtils.bind(this, function(xml, filename)
  49.         {
  50.             try
  51.             {
  52.                 var doc = mxUtils.par**ml(xml);
  53.                 var model = new mxGraphModel();
  54.                 var codec = new mxCodec(doc);
  55.                 codec.decode(doc.documentElement, model);
  56.                 var children = model.getChildren(model.getChildAt(model.getRoot(), 0));
  57.                 editor.graph.setSelectionCells(editor.graph.importCells(children));
  58.             }
  59.             catch (e)
  60.             {
  61.                 mxUtils.alert(mxResources.get('invalidOrMissingFile') + ': ' + e.message);
  62.             }
  63.         }));
  64.         // 刪除openFile是否關閉對話方塊
  65.         ui.showDialog(new OpenDialog(this).container, 300, 180, true, true, function()
  66.         {
  67.             window.openFile = null;
  68.         });
  69.     });
  70.     this.addAction('save', function() { ui.save(); }, null, null, 'Ctrl+S');
  71.     //addAction(saveAs,函式(){ ui.saveFile(真正);},空,空,“Ctrl + Shift-S”);
  72.     //addAction(“出口”,函式(){ ui。showDialog(新ExportDialog(ui)。容器、300、200,真的,真的);},空,空,“Ctrl + E”);
  73.     //(“editFile”,新的行動(mxResources.get(“編輯”),mxUtils。繫結(此功能()
  74.     //(“editFile”,新的行動(mxResources.get(“編輯”),mxUtils。繫結(此功能()
  75.     this.addAction('pageSetup', function() { ui.showDialog(new PageSetupDialog(ui).container, 300, 200, true, true); });
  76.     this.addAction('print', function() { ui.showDialog(new PrintDialog(ui).container, 300, 200, true, true); }, null, 'sprite-print', 'Ctrl+P');
  77.     this.addAction('preview', function() { mxUtils.show(graph, null, 10, 10); });
  78.     // Edit actions
  79.     this.addAction('undo', function() { editor.undoManager.undo(); }, null, 'sprite-undo', 'Ctrl+Z');
  80.     this.addAction('redo', function() { editor.undoManager.redo(); }, null, 'sprite-redo', 'Ctrl+Y');
  81.     this.addAction('cut', function() { mxClipboard.cut(graph); }, null, 'sprite-cut', 'Ctrl+X');
  82.     this.addAction('copy', function() { mxClipboard.copy(graph); }, null, 'sprite-copy', 'Ctrl+C');
  83.     this.addAction('paste', function() { mxClipboard.paste(graph); }, false, 'sprite-paste', 'Ctrl+V');
  84.     this.addAction('delete', function() { graph.removeCells(); }, null, null, 'Delete');
  85.     this.addAction('duplicate', function()
  86.     {
  87.         var s = graph.gridSize;
  88.         graph.setSelectionCells(graph.moveCells(graph.getSelectionCells(), s, s, true));
  89.     }, null, null, 'Ctrl+D');
  90.     this.addAction('selectVertices', function() { graph.selectVertices(); }, null, null, 'Ctrl+Shift+V');
  91.     this.addAction('selectEdges', function() { graph.selectEdges(); }, null, null, 'Ctrl+Shift+E');
  92.     this.addAction('selectAll', function() { graph.selectAll(); }, null, null, 'Ctrl+A');
  93.     // 導航
  94.     this.addAction('home', function() { graph.home(); }, null, null, 'Home');
  95.     this.addAction('exitGroup', function() { graph.exitGroup(); }, null, null, 'Page Up');
  96.     this.addAction('enterGroup', function() { graph.enterGroup(); }, null, null, 'Page Down');
  97.     this.addAction('expand', function() { graph.foldCells(false); }, null, null, 'Enter');
  98.     this.addAction('collapse', function() { graph.foldCells(true); }, null, null, 'Backspace');
  99.     //安排操作
  100.     this.addAction('toFront', function() { graph.orderCells(false); }, null, null, 'Ctrl+F');
  101.     this.addAction('toBack', function() { graph.orderCells(true); }, null, null, 'Ctrl+B');
  102.     this.addAction('group', function() { graph.setSelectionCell(graph.groupCells(null, 0)); }, null, null, 'Ctrl+G');
  103.     this.addAction('ungroup', function() { graph.setSelectionCells(graph.ungroupCells()); }, null, null, 'Ctrl+U');
  104.     this.addAction('removeFromGroup', function() { graph.removeCellsFromParent(); });
  105.     this.addAction('editLink', function()
  106.     {
  107.         var cell = graph.getSelectionCell();
  108.         var link = graph.getLinkForCell(cell);
  109.         if (link == null)
  110.         {
  111.             link = '';
  112.         }
  113.         link = mxUtils.prompt(mxResources.get('enterValue'), link);
  114.         if (link != null)
  115.         {
  116.             graph.setLinkForCell(cell, link);
  117.         }
  118.     });
  119.     this.addAction('openLink', function()
  120.     {
  121.         var cell = graph.getSelectionCell();
  122.         var link = graph.getLinkForCell(cell);
  123.         if (link != null)
  124.         {
  125.             window.open(link);
  126.         }
  127.     });
  128.     this.addAction('autosize', function()
  129.     {
  130.         var cells = graph.getSelectionCells();
  131.         if (cells != null)
  132.         {
  133.             graph.getModel().beginUpdate();
  134.             try
  135.             {
  136.                 for (var i = 0; i < cells.length; i++)
  137.                 {
  138.                     var cell = cells[i];
  139.                     if (graph.getModel().getChildCount(cell))
  140.                     {
  141.                         graph.updateGroupBounds([cell], 20);
  142.                     }
  143.                     else
  144.                     {
  145.                         graph.updateCellSize(cell);
  146.                     }
  147.                 }
  148.             }
  149.             finally
  150.             {
  151.                 graph.getModel().endUpdate();
  152.             }
  153.         }
  154.     });
  155.     this.addAction('rotation', function()
  156.     {
  157.         var value = '0';
  158.         var state = graph.getView().getState(graph.getSelectionCell());
  159.         if (state != null)
  160.         {
  161.             value = state.style[mxConstants.STYLE_ROTATION] || value;
  162.         }
  163.         value = mxUtils.prompt(mxResources.get('enterValue') + ' (' +
  164.                 mxResources.get('rotation') + ' 0-360)', value);
  165.         if (value != null)
  166.         {
  167.             graph.setCellStyles(mxConstants.STYLE_ROTATION, value);
  168.         }
  169.     });
  170.     this.addAction('rotate', function()
  171.     {
  172.         var cells = graph.getSelectionCells();
  173.         if (cells != null)
  174.         {
  175.             graph.getModel().beginUpdate();
  176.             try
  177.             {
  178.                 for (var i = 0; i < cells.length; i++)
  179.                 {
  180.                     var cell = cells[i];
  181.                     if (graph.getModel().isVertex(cell) && graph.getModel().getChildCount(cell) == 0)
  182.                     {
  183.                         var geo = graph.getCellGeometry(cell);
  184.                         if (geo != null)
  185.                         {
  186.                             // 旋轉幾何圖形的大小和位置
  187.                             geo = geo.clone();
  188.                             geo.x += geo.width / 2 - geo.height / 2;
  189.                             geo.y += geo.height / 2 - geo.width / 2;
  190.                             var tmp = geo.width;
  191.                             geo.width = geo.height;
  192.                             geo.height = tmp;
  193.                             graph.getModel().setGeometry(cell, geo);
  194.                             //讀取當前的方向並提出90度
  195.                             var state = graph.view.getState(cell);
  196.                             if (state != null)
  197.                             {
  198.                                 var dir = state.style[mxConstants.STYLE_DIRECTION] || 'east'/*default*/;
  199.                                 if (dir == 'east')
  200.                                 {
  201.                                     dir = 'south';
  202.                                 }
  203.                                 else if (dir == 'south')
  204.                                 {
  205.                                     dir = 'west';
  206.                                 }
  207.                                 else if (dir == 'west')
  208.                                 {
  209.