/* @pooja, orientation.js contains the implementation of block tranformation functions (rotation, flip and mirror) */ function transformBlockImage(graph, cell) { var imageName = cell.style; if (imageName.indexOf(";") != -1) { imageName = imageName.substring(0, imageName.indexOf(";")); } var value = graph.getModel().getValue(cell); var dec = new mxCodec(); var details = dec.decode(value); // Get the stylesheet for the graph var stylesheet = graph.getStylesheet(); // From the stylesheet, get the style of the particular block var style = stylesheet.styles[imageName]; var geometry = cell.getGeometry(); var point_x = geometry.x; var point_y = geometry.y; //IS_GC is to check if browser is Google Chrome, IS_FF is for Firefox. Updating the image style. if (mxClient.IS_GC == true) { details['label'] = ''; } else { details['label'] = ''; } var enc = new mxCodec(mxUtils.createXmlDocument()); var value = enc.encode(details); graph.getModel().setValue(cell, value); } function rotateCustom(editor, graph, cell) { var selectedCells = graph.getSelectionCells(); graph.getModel().beginUpdate(); try { for (var count = 0; count < selectedCells.length; count++) { var selectedCell = selectedCells[count]; if (selectedCell != null) { var cells = []; cells.push(selectedCell); for (var i = 0; i < selectedCell.getChildCount(); i++) cells.push(selectedCell.getChildAt(i)); for (var i = 0; i < cells.length; i++) { var cell = cells[i]; if (cell.isVertex() == true) { var geo = graph.getCellGeometry(cell); if (geo != null) { // Rotates the size and position in the geometry geo = geo.clone(); geo.x += geo.width / 2 - geo.height / 2; geo.y += geo.height / 2 - geo.width / 2; var tmp = geo.width; geo.width = geo.height; geo.height = tmp; graph.getModel().setGeometry(cell, geo); // Reads the current direction and advances by 90 degrees var state = graph.view.getState(cell); if (state != null) { if (cell.isConnectable() == true) { var dir = state.style[mxConstants.STYLE_ROTATION] || '0'; var geoCell = cell.getGeometry(); /* To rotate the ports in sync with the block rotation. A rotate makes port directing east direct to south, south direct to west, west direct to north and north direct to east. */ if (cell.value == "ExplicitOutputPort" || cell.value == "ImplicitOutputPort") { if (dir == '0' || dir == '180') { var temp = geoCell.x; geoCell.x = geoCell.y - 0.0625; geoCell.y = temp + 0.0625; if (dir == '0') { dir = '90'; } else { dir = '270'; } } else if (dir == '90' || dir == '270') { geoCell.y = geoCell.x + 0.0625; if (dir == '90') { dir = '180'; geoCell.x = 0 - 0.125; } else { dir = '0'; geoCell.x = 1; } } cell.setGeometry(geoCell); } else if (cell.value == "ExplicitInputPort" || cell.value == "ImplicitInputPort") { if (dir == '90' || dir == '270') { geoCell.y = geoCell.x - 0.0625; if (dir == '90') { dir = '180'; geoCell.x = 1 + 0.125; } else { dir = '0'; geoCell.x = 0; } } else if (dir == '0' || dir == '180') { geoCell = geoCell.clone(); var temp = geoCell.x; geoCell.x = parseFloat(geoCell.y) + 0.0625; geoCell.y = temp - 0.0625; if (dir == '0') { dir = '90'; } else { dir = '270'; } } cell.setGeometry(geoCell); } else if (cell.value == 'CommandPort') { if (dir == '0' || dir == '180') { var temp = geoCell.x; geoCell.x = geoCell.y + 0.0625; geoCell.y = temp - 0.0625; if (dir == '0') { dir = '90'; } else { dir = '270'; } } else if (dir == '90' || dir == '270') { geoCell.y = parseFloat(geoCell.x) - 0.0625; if (dir == '90') { dir = '180'; geoCell.x = 0 - 0.0625; } else { dir = '0'; geoCell.x = 1 + 0.0625; } } cell.setGeometry(geoCell); } else if (cell.value == 'ControlPort') { if (dir == '0' || dir == '180') { var temp = geoCell.x; geoCell.x = geoCell.y - 0.0625; geoCell.y = temp + 0.0625; if (dir == '0') { dir = '90'; } else { dir = '270'; } } else if (dir == '90' || dir == '270') { geoCell.y = parseFloat(geoCell.x) + 0.0625; if (dir == '90') { dir = '180'; geoCell.x = 1 + 0.0625; } else { dir = '0'; geoCell.x = 0 - 0.0625; } } cell.setGeometry(geoCell); } } graph.setCellStyles(mxConstants.STYLE_ROTATION, dir, [cell]); } } } if (cell.isConnectable() == false) { var state = graph.view.getState(cell); if (state != null) { var dir = state.style[mxConstants.STYLE_ROTATION] || '0'; dir = (dir + 90) % 360; graph.setCellStyles(mxConstants.STYLE_ROTATION, dir, [cell]); } if (cell.value.getAttribute('label') != null && cell.value.getAttribute('label').substring(1, 4) == "img") { cell.currentAngle = (parseInt(cell.currentAngle) + 90) % 360; var imageName = cell.style; transformBlockImage(graph, cell); } } } } } } finally { graph.getModel().endUpdate(); } } function flipCustom(editor, graph, cell) { var selectedCells = graph.getSelectionCells(); graph.getModel().beginUpdate(); try { for (var count = 0; count < selectedCells.length; count++) { var selectedCell = selectedCells[count]; if (selectedCell != null) { var cells = []; cells.push(selectedCell); for (var i = 0; i < selectedCell.getChildCount(); i++) cells.push(selectedCell.getChildAt(i)); for (var i = 0; i < cells.length; i++) { var cell = cells[i]; if (cell.isVertex() == true) { var geo = graph.getCellGeometry(cell); if (geo != null) { // Rotates the size and position in the geometry geo = geo.clone(); geo.x += geo.width / 2 - geo.height / 2; geo.y += geo.height / 2 - geo.width / 2; var tmp = geo.width; geo.width = geo.height; geo.height = tmp; graph.getModel().setGeometry(cell, geo); // Reads the current direction and flips the ports var state = graph.view.getState(cell); if (state != null) { if (cell.isConnectable() == true) { var dir = state.style[mxConstants.STYLE_ROTATION] || '0'; var flip = state.style[mxConstants.STYLE_STENCIL_FLIPV] || '0'; var geoCell = cell.getGeometry(); /* To flip the ports in sync with the block flip. A flip makes port directing north direct to south and vice versa. A port directing east or west will have to aligh with the other ports which have same direction. */ if (cell.value == 'CommandPort' || cell.value == 'ControlPort') { if (dir == '90' || dir == '270') { if (cell.value == 'CommandPort') { if (dir == '90') { geoCell.y = geoCell.y - 1 - 0.125; dir = '270'; } else { geoCell.y = geoCell.y + 1 + 0.125; dir = '90'; } } else { if (dir == '90') { geoCell.y = geoCell.y + 1 + 0.125; dir = '270'; } else { geoCell.y = geoCell.y - 1 - 0.125; dir = '90'; } } } else if (dir == '0' || dir == '180') { if (cell.value == 'CommandPort') { geoCell.y = 1 - geoCell.y - 0.125; } else { geoCell.y = 1 - geoCell.y + 0.125; } } cell.setGeometry(geoCell); } else if (cell.value == "ExplicitOutputPort" || cell.value == "ImplicitOutputPort" || cell.value == "ExplicitInputPort" || cell.value == "ImplicitInputPort") { if (dir == '90' || dir == '270') { if (cell.value == "ExplicitOutputPort" || cell.value == "ImplicitOutputPort") { if (dir == '90') { geoCell.y = geoCell.y - 1 - 0.125; dir = '270'; } else { geoCell.y = geoCell.y + 1 + 0.125; dir = '90'; } } else { if (dir == '90') { geoCell.y = geoCell.y + 1 + 0.125; dir = '270'; } else { geoCell.y = geoCell.y - 1 - 0.125; dir = '90'; } } } else if (dir == '0' || dir == '180') { geoCell.y = 1 - geoCell.y; } cell.setGeometry(geoCell); } } graph.setCellStyles(mxConstants.STYLE_ROTATION, dir, [cell]); if (flip == '0') { graph.setCellStyles(mxConstants.STYLE_STENCIL_FLIPV, '1', [cell]); } else { graph.setCellStyles(mxConstants.STYLE_STENCIL_FLIPV, '0', [cell]); } } } } if (cell.isConnectable() == false) { var state = graph.view.getState(cell); if (state != null) { var dir = state.style[mxConstants.STYLE_ROTATION]; var flip = state.style[mxConstants.STYLE_STENCIL_FLIPV] || '0'; if (flip == '0') { graph.setCellStyles(mxConstants.STYLE_STENCIL_FLIPV, '1', [cell]); } else { graph.setCellStyles(mxConstants.STYLE_STENCIL_FLIPV, '0', [cell]); } if (dir == '0' || dir == '180') { dir = (dir + 180) % 360; } graph.setCellStyles(mxConstants.STYLE_ROTATION, dir, [cell]); } if (cell.value.getAttribute('label') != null && cell.value.getAttribute('label').substring(1, 4) == "img") { if (cell.currentAngle == 90 || cell.currentAngle == 270) { cell.flipX = -parseInt(cell.flipX); } else { cell.flipY = -parseInt(cell.flipY); } transformBlockImage(graph, cell); } } } } } } finally { graph.getModel().endUpdate(); } } function mirrorCustom(editor, graph, cell) { var selectedCells = graph.getSelectionCells(); graph.getModel().beginUpdate(); try { for (var count = 0; count < selectedCells.length; count++) { var selectedCell = selectedCells[count]; if (selectedCell != null) { var cells = []; cells.push(selectedCell); for (var i = 0; i < selectedCell.getChildCount(); i++) cells.push(selectedCell.getChildAt(i)); for (var i = 0; i < cells.length; i++) { var cell = cells[i]; if (cell.isVertex() == true) { var geo = graph.getCellGeometry(cell); if (geo != null) { // Rotates the size and position in the geometry geo = geo.clone(); geo.x += geo.width / 2 - geo.height / 2; geo.y += geo.height / 2 - geo.width / 2; var tmp = geo.width; geo.width = geo.height; geo.height = tmp; graph.getModel().setGeometry(cell, geo); // Reads the current direction and mirrors the ports var state = graph.view.getState(cell); if (state != null) { var dir = state.style[mxConstants.STYLE_ROTATION] || '0'; var mirror = state.style[mxConstants.STYLE_STENCIL_FLIPH] || '0'; if (cell.isConnectable() == true) { var geoCell = cell.getGeometry(); /* To mirror the ports in sync with the block mirror. A mirror makes port directing east direct to west and vice versa. A port directing north or south will have to aligh with the other ports which have same direction. */ if (cell.value == "ExplicitOutputPort" || cell.value == "ImplicitOutputPort" || cell.value == "ExplicitInputPort" || cell.value == "ImplicitInputPort") { if (dir == '180' || dir == '0') { if (cell.value == "ExplicitOutputPort" || cell.value == "ImplicitOutputPort") { if (dir == '0') { geoCell.x = geoCell.x - 1 - 0.125; dir = '180'; } else { geoCell.x = geoCell.x + 1 + 0.125; dir = '0'; } } else { geoCell = geoCell.clone(); if (dir == '0') { geoCell.x = geoCell.x + 1 + 0.125; dir = '180'; } else { geoCell.x = geoCell.x - 1 - 0.125; dir = '0'; } } } else if (dir == '90' || dir == '270') { if (cell.value == "ExplicitOutputPort" || cell.value == "ImplicitOutputPort") { geoCell.x = 1 - geoCell.x - 0.125; } else { geoCell.x = 1 - geoCell.x + 0.125; } } cell.setGeometry(geoCell); } else if (cell.value == 'CommandPort' || cell.value == 'ControlPort') { if (dir == '0' || dir == '180') { if (cell.value == 'CommandPort') { if (dir == '180') { geoCell.x = geoCell.x + 1 + 0.125; dir = '0'; } else { geoCell.x = geoCell.x - 1 - 0.125; dir = '180'; } } else { if (dir == '180') { geoCell.x = geoCell.x - 1 - 0.125; dir = '0'; } else { geoCell.x = geoCell.x + 1 + 0.125; dir = '180'; } } } else if (dir == '90' || dir == '270') { geoCell.x = 1 - geoCell.x; } cell.setGeometry(geoCell); } } graph.setCellStyles(mxConstants.STYLE_ROTATION, dir, [cell]); if (mirror == '0') { graph.setCellStyles(mxConstants.STYLE_STENCIL_FLIPH, '1', [cell]); } else { graph.setCellStyles(mxConstants.STYLE_STENCIL_FLIPH, '0', [cell]); } } } } if (cell.isConnectable() == false) { var state = graph.view.getState(cell); if (state != null) { var dir = state.style[mxConstants.STYLE_ROTATION]; var mirror = state.style[mxConstants.STYLE_STENCIL_FLIPH] || '0'; if (mirror == '0') { graph.setCellStyles(mxConstants.STYLE_STENCIL_FLIPH, '1', [cell]); } else { graph.setCellStyles(mxConstants.STYLE_STENCIL_FLIPH, '0', [cell]); } if (dir == '90' || dir == '270') { dir = (dir + 180) % 360; } graph.setCellStyles(mxConstants.STYLE_ROTATION, dir, [cell]); } if (cell.value.getAttribute('label') != null && cell.value.getAttribute('label').substring(1, 4) == "img") { if (cell.currentAngle == 90 || cell.currentAngle == 270) { cell.flipY = -parseInt(cell.flipY); } else { cell.flipX = -parseInt(cell.flipX); } transformBlockImage(graph, cell); } } } } } } finally { graph.getModel().endUpdate(); } }