summaryrefslogtreecommitdiff
path: root/src/js/util
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/util')
-rw-r--r--src/js/util/mxAnimation.js82
-rw-r--r--src/js/util/mxAutoSaveManager.js213
-rw-r--r--src/js/util/mxClipboard.js144
-rw-r--r--src/js/util/mxConstants.js1911
-rw-r--r--src/js/util/mxDictionary.js130
-rw-r--r--src/js/util/mxDivResizer.js151
-rw-r--r--src/js/util/mxDragSource.js594
-rw-r--r--src/js/util/mxEffects.js214
-rw-r--r--src/js/util/mxEvent.js1175
-rw-r--r--src/js/util/mxEventObject.js111
-rw-r--r--src/js/util/mxEventSource.js191
-rw-r--r--src/js/util/mxForm.js202
-rw-r--r--src/js/util/mxGuide.js364
-rw-r--r--src/js/util/mxImage.js40
-rw-r--r--src/js/util/mxImageBundle.js98
-rw-r--r--src/js/util/mxImageExport.js1412
-rw-r--r--src/js/util/mxLog.js410
-rw-r--r--src/js/util/mxMorphing.js239
-rw-r--r--src/js/util/mxMouseEvent.js241
-rw-r--r--src/js/util/mxObjectIdentity.js59
-rw-r--r--src/js/util/mxPanningManager.js262
-rw-r--r--src/js/util/mxPath.js314
-rw-r--r--src/js/util/mxPoint.js55
-rw-r--r--src/js/util/mxPopupMenu.js574
-rw-r--r--src/js/util/mxRectangle.js134
-rw-r--r--src/js/util/mxResources.js366
-rw-r--r--src/js/util/mxSession.js674
-rw-r--r--src/js/util/mxSvgCanvas2D.js1234
-rw-r--r--src/js/util/mxToolbar.js528
-rw-r--r--src/js/util/mxUndoManager.js229
-rw-r--r--src/js/util/mxUndoableEdit.js168
-rw-r--r--src/js/util/mxUrlConverter.js141
-rw-r--r--src/js/util/mxUtils.js3920
-rw-r--r--src/js/util/mxWindow.js1065
-rw-r--r--src/js/util/mxXmlCanvas2D.js715
-rw-r--r--src/js/util/mxXmlRequest.js425
36 files changed, 0 insertions, 18785 deletions
diff --git a/src/js/util/mxAnimation.js b/src/js/util/mxAnimation.js
deleted file mode 100644
index 80901ef..0000000
--- a/src/js/util/mxAnimation.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
- * $Id: mxAnimation.js,v 1.2 2010-03-19 12:53:29 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- *
- * Class: mxAnimation
- *
- * Implements a basic animation in JavaScript.
- *
- * Constructor: mxAnimation
- *
- * Constructs an animation.
- *
- * Parameters:
- *
- * graph - Reference to the enclosing <mxGraph>.
- */
-function mxAnimation(delay)
-{
- this.delay = (delay != null) ? delay : 20;
-};
-
-/**
- * Extends mxEventSource.
- */
-mxAnimation.prototype = new mxEventSource();
-mxAnimation.prototype.constructor = mxAnimation;
-
-/**
- * Variable: delay
- *
- * Specifies the delay between the animation steps. Defaul is 30ms.
- */
-mxAnimation.prototype.delay = null;
-
-/**
- * Variable: thread
- *
- * Reference to the thread while the animation is running.
- */
-mxAnimation.prototype.thread = null;
-
-/**
- * Function: startAnimation
- *
- * Starts the animation by repeatedly invoking updateAnimation.
- */
-mxAnimation.prototype.startAnimation = function()
-{
- if (this.thread == null)
- {
- this.thread = window.setInterval(mxUtils.bind(this, this.updateAnimation), this.delay);
- }
-};
-
-/**
- * Function: updateAnimation
- *
- * Hook for subclassers to implement the animation. Invoke stopAnimation
- * when finished, startAnimation to resume. This is called whenever the
- * timer fires and fires an mxEvent.EXECUTE event with no properties.
- */
-mxAnimation.prototype.updateAnimation = function()
-{
- this.fireEvent(new mxEventObject(mxEvent.EXECUTE));
-};
-
-/**
- * Function: stopAnimation
- *
- * Stops the animation by deleting the timer and fires an <mxEvent.DONE>.
- */
-mxAnimation.prototype.stopAnimation = function()
-{
- if (this.thread != null)
- {
- window.clearInterval(this.thread);
- this.thread = null;
- this.fireEvent(new mxEventObject(mxEvent.DONE));
- }
-};
diff --git a/src/js/util/mxAutoSaveManager.js b/src/js/util/mxAutoSaveManager.js
deleted file mode 100644
index 85c23dc..0000000
--- a/src/js/util/mxAutoSaveManager.js
+++ /dev/null
@@ -1,213 +0,0 @@
-/**
- * $Id: mxAutoSaveManager.js,v 1.9 2010-09-16 09:10:21 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxAutoSaveManager
- *
- * Manager for automatically saving diagrams. The <save> hook must be
- * implemented.
- *
- * Example:
- *
- * (code)
- * var mgr = new mxAutoSaveManager(editor.graph);
- * mgr.save = function()
- * {
- * mxLog.show();
- * mxLog.debug('save');
- * };
- * (end)
- *
- * Constructor: mxAutoSaveManager
- *
- * Constructs a new automatic layout for the given graph.
- *
- * Arguments:
- *
- * graph - Reference to the enclosing graph.
- */
-function mxAutoSaveManager(graph)
-{
- // Notifies the manager of a change
- this.changeHandler = mxUtils.bind(this, function(sender, evt)
- {
- if (this.isEnabled())
- {
- this.graphModelChanged(evt.getProperty('edit').changes);
- }
- });
-
- this.setGraph(graph);
-};
-
-/**
- * Extends mxEventSource.
- */
-mxAutoSaveManager.prototype = new mxEventSource();
-mxAutoSaveManager.prototype.constructor = mxAutoSaveManager;
-
-/**
- * Variable: graph
- *
- * Reference to the enclosing <mxGraph>.
- */
-mxAutoSaveManager.prototype.graph = null;
-
-/**
- * Variable: autoSaveDelay
- *
- * Minimum amount of seconds between two consecutive autosaves. Eg. a
- * value of 1 (s) means the graph is not stored more than once per second.
- * Default is 10.
- */
-mxAutoSaveManager.prototype.autoSaveDelay = 10;
-
-/**
- * Variable: autoSaveThrottle
- *
- * Minimum amount of seconds between two consecutive autosaves triggered by
- * more than <autoSaveThreshhold> changes within a timespan of less than
- * <autoSaveDelay> seconds. Eg. a value of 1 (s) means the graph is not
- * stored more than once per second even if there are more than
- * <autoSaveThreshold> changes within that timespan. Default is 2.
- */
-mxAutoSaveManager.prototype.autoSaveThrottle = 2;
-
-/**
- * Variable: autoSaveThreshold
- *
- * Minimum amount of ignored changes before an autosave. Eg. a value of 2
- * means after 2 change of the graph model the autosave will trigger if the
- * condition below is true. Default is 5.
- */
-mxAutoSaveManager.prototype.autoSaveThreshold = 5;
-
-/**
- * Variable: ignoredChanges
- *
- * Counter for ignored changes in autosave.
- */
-mxAutoSaveManager.prototype.ignoredChanges = 0;
-
-/**
- * Variable: lastSnapshot
- *
- * Used for autosaving. See <autosave>.
- */
-mxAutoSaveManager.prototype.lastSnapshot = 0;
-
-/**
- * Variable: enabled
- *
- * Specifies if event handling is enabled. Default is true.
- */
-mxAutoSaveManager.prototype.enabled = true;
-
-/**
- * Variable: changeHandler
- *
- * Holds the function that handles graph model changes.
- */
-mxAutoSaveManager.prototype.changeHandler = null;
-
-/**
- * Function: isEnabled
- *
- * Returns true if events are handled. This implementation
- * returns <enabled>.
- */
-mxAutoSaveManager.prototype.isEnabled = function()
-{
- return this.enabled;
-};
-
-/**
- * Function: setEnabled
- *
- * Enables or disables event handling. This implementation
- * updates <enabled>.
- *
- * Parameters:
- *
- * enabled - Boolean that specifies the new enabled state.
- */
-mxAutoSaveManager.prototype.setEnabled = function(value)
-{
- this.enabled = value;
-};
-
-/**
- * Function: setGraph
- *
- * Sets the graph that the layouts operate on.
- */
-mxAutoSaveManager.prototype.setGraph = function(graph)
-{
- if (this.graph != null)
- {
- this.graph.getModel().removeListener(this.changeHandler);
- }
-
- this.graph = graph;
-
- if (this.graph != null)
- {
- this.graph.getModel().addListener(mxEvent.CHANGE, this.changeHandler);
- }
-};
-
-/**
- * Function: save
- *
- * Empty hook that is called if the graph should be saved.
- */
-mxAutoSaveManager.prototype.save = function()
-{
- // empty
-};
-
-/**
- * Function: graphModelChanged
- *
- * Invoked when the graph model has changed.
- */
-mxAutoSaveManager.prototype.graphModelChanged = function(changes)
-{
- var now = new Date().getTime();
- var dt = (now - this.lastSnapshot) / 1000;
-
- if (dt > this.autoSaveDelay ||
- (this.ignoredChanges >= this.autoSaveThreshold &&
- dt > this.autoSaveThrottle))
- {
- this.save();
- this.reset();
- }
- else
- {
- // Increments the number of ignored changes
- this.ignoredChanges++;
- }
-};
-
-/**
- * Function: reset
- *
- * Resets all counters.
- */
-mxAutoSaveManager.prototype.reset = function()
-{
- this.lastSnapshot = new Date().getTime();
- this.ignoredChanges = 0;
-};
-
-/**
- * Function: destroy
- *
- * Removes all handlers from the <graph> and deletes the reference to it.
- */
-mxAutoSaveManager.prototype.destroy = function()
-{
- this.setGraph(null);
-};
diff --git a/src/js/util/mxClipboard.js b/src/js/util/mxClipboard.js
deleted file mode 100644
index e9fec6b..0000000
--- a/src/js/util/mxClipboard.js
+++ /dev/null
@@ -1,144 +0,0 @@
-/**
- * $Id: mxClipboard.js,v 1.29 2010-01-02 09:45:14 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-var mxClipboard =
-{
- /**
- * Class: mxClipboard
- *
- * Singleton that implements a clipboard for graph cells.
- *
- * Example:
- *
- * (code)
- * mxClipboard.copy(graph);
- * mxClipboard.paste(graph2);
- * (end)
- *
- * This copies the selection cells from the graph to the
- * clipboard and pastes them into graph2.
- *
- * For fine-grained control of the clipboard data the <mxGraph.canExportCell>
- * and <mxGraph.canImportCell> functions can be overridden.
- *
- * Variable: STEPSIZE
- *
- * Defines the step size to offset the cells
- * after each paste operation. Default is 10.
- */
- STEPSIZE: 10,
-
- /**
- * Variable: insertCount
- *
- * Counts the number of times the clipboard data has been inserted.
- */
- insertCount: 1,
-
- /**
- * Variable: cells
- *
- * Holds the array of <mxCells> currently in the clipboard.
- */
- cells: null,
-
- /**
- * Function: isEmpty
- *
- * Returns true if the clipboard currently has not data stored.
- */
- isEmpty: function()
- {
- return mxClipboard.cells == null;
- },
-
- /**
- * Function: cut
- *
- * Cuts the given array of <mxCells> from the specified graph.
- * If cells is null then the selection cells of the graph will
- * be used. Returns the cells that have been cut from the graph.
- *
- * Parameters:
- *
- * graph - <mxGraph> that contains the cells to be cut.
- * cells - Optional array of <mxCells> to be cut.
- */
- cut: function(graph, cells)
- {
- cells = mxClipboard.copy(graph, cells);
- mxClipboard.insertCount = 0;
- mxClipboard.removeCells(graph, cells);
-
- return cells;
- },
-
- /**
- * Function: removeCells
- *
- * Hook to remove the given cells from the given graph after
- * a cut operation.
- *
- * Parameters:
- *
- * graph - <mxGraph> that contains the cells to be cut.
- * cells - Array of <mxCells> to be cut.
- */
- removeCells: function(graph, cells)
- {
- graph.removeCells(cells);
- },
-
- /**
- * Function: copy
- *
- * Copies the given array of <mxCells> from the specified
- * graph to <cells>.Returns the original array of cells that has
- * been cloned.
- *
- * Parameters:
- *
- * graph - <mxGraph> that contains the cells to be copied.
- * cells - Optional array of <mxCells> to be copied.
- */
- copy: function(graph, cells)
- {
- cells = cells || graph.getSelectionCells();
- var result = graph.getExportableCells(cells);
- mxClipboard.insertCount = 1;
- mxClipboard.cells = graph.cloneCells(result);
-
- return result;
- },
-
- /**
- * Function: paste
- *
- * Pastes the <cells> into the specified graph restoring
- * the relation to <parents>, if possible. If the parents
- * are no longer in the graph or invisible then the
- * cells are added to the graph's default or into the
- * swimlane under the cell's new location if one exists.
- * The cells are added to the graph using <mxGraph.importCells>.
- *
- * Parameters:
- *
- * graph - <mxGraph> to paste the <cells> into.
- */
- paste: function(graph)
- {
- if (mxClipboard.cells != null)
- {
- var cells = graph.getImportableCells(mxClipboard.cells);
- var delta = mxClipboard.insertCount * mxClipboard.STEPSIZE;
- var parent = graph.getDefaultParent();
- cells = graph.importCells(cells, delta, delta, parent);
-
- // Increments the counter and selects the inserted cells
- mxClipboard.insertCount++;
- graph.setSelectionCells(cells);
- }
- }
-
-};
diff --git a/src/js/util/mxConstants.js b/src/js/util/mxConstants.js
deleted file mode 100644
index 8d11dc1..0000000
--- a/src/js/util/mxConstants.js
+++ /dev/null
@@ -1,1911 +0,0 @@
-/**
- * $Id: mxConstants.js,v 1.127 2012-11-20 09:06:07 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
- var mxConstants =
- {
- /**
- * Class: mxConstants
- *
- * Defines various global constants.
- *
- * Variable: DEFAULT_HOTSPOT
- *
- * Defines the portion of the cell which is to be used as a connectable
- * region. Default is 0.3. Possible values are 0 < x <= 1.
- */
- DEFAULT_HOTSPOT: 0.3,
-
- /**
- * Variable: MIN_HOTSPOT_SIZE
- *
- * Defines the minimum size in pixels of the portion of the cell which is
- * to be used as a connectable region. Default is 8.
- */
- MIN_HOTSPOT_SIZE: 8,
-
- /**
- * Variable: MAX_HOTSPOT_SIZE
- *
- * Defines the maximum size in pixels of the portion of the cell which is
- * to be used as a connectable region. Use 0 for no maximum. Default is 0.
- */
- MAX_HOTSPOT_SIZE: 0,
-
- /**
- * Variable: RENDERING_HINT_EXACT
- *
- * Defines the exact rendering hint.
- */
- RENDERING_HINT_EXACT: 'exact',
-
- /**
- * Variable: RENDERING_HINT_FASTER
- *
- * Defines the faster rendering hint.
- */
- RENDERING_HINT_FASTER: 'faster',
-
- /**
- * Variable: RENDERING_HINT_FASTEST
- *
- * Defines the fastest rendering hint.
- */
- RENDERING_HINT_FASTEST: 'fastest',
-
- /**
- * Variable: DIALECT_SVG
- *
- * Defines the SVG display dialect name.
- */
- DIALECT_SVG: 'svg',
-
- /**
- * Variable: DIALECT_VML
- *
- * Defines the VML display dialect name.
- */
- DIALECT_VML: 'vml',
-
- /**
- * Variable: DIALECT_MIXEDHTML
- *
- * Defines the mixed HTML display dialect name.
- */
- DIALECT_MIXEDHTML: 'mixedHtml',
-
- /**
- * Variable: DIALECT_PREFERHTML
- *
- * Defines the preferred HTML display dialect name.
- */
- DIALECT_PREFERHTML: 'preferHtml',
-
- /**
- * Variable: DIALECT_STRICTHTML
- *
- * Defines the strict HTML display dialect.
- */
- DIALECT_STRICTHTML: 'strictHtml',
-
- /**
- * Variable: NS_SVG
- *
- * Defines the SVG namespace.
- */
- NS_SVG: 'http://www.w3.org/2000/svg',
-
- /**
- * Variable: NS_XHTML
- *
- * Defines the XHTML namespace.
- */
- NS_XHTML: 'http://www.w3.org/1999/xhtml',
-
- /**
- * Variable: NS_XLINK
- *
- * Defines the XLink namespace.
- */
- NS_XLINK: 'http://www.w3.org/1999/xlink',
-
- /**
- * Variable: SHADOWCOLOR
- *
- * Defines the color to be used to draw shadows in shapes and windows.
- * Default is gray.
- */
- SHADOWCOLOR: 'gray',
-
- /**
- * Variable: SHADOW_OFFSET_X
- *
- * Specifies the x-offset of the shadow. Default is 2.
- */
- SHADOW_OFFSET_X: 2,
-
- /**
- * Variable: SHADOW_OFFSET_Y
- *
- * Specifies the y-offset of the shadow. Default is 3.
- */
- SHADOW_OFFSET_Y: 3,
-
- /**
- * Variable: SHADOW_OPACITY
- *
- * Defines the opacity for shadows. Default is 1.
- */
- SHADOW_OPACITY: 1,
-
- /**
- * Variable: NODETYPE_ELEMENT
- *
- * DOM node of type ELEMENT.
- */
- NODETYPE_ELEMENT: 1,
-
- /**
- * Variable: NODETYPE_ATTRIBUTE
- *
- * DOM node of type ATTRIBUTE.
- */
- NODETYPE_ATTRIBUTE: 2,
-
- /**
- * Variable: NODETYPE_TEXT
- *
- * DOM node of type TEXT.
- */
- NODETYPE_TEXT: 3,
-
- /**
- * Variable: NODETYPE_CDATA
- *
- * DOM node of type CDATA.
- */
- NODETYPE_CDATA: 4,
-
- /**
- * Variable: NODETYPE_ENTITY_REFERENCE
- *
- * DOM node of type ENTITY_REFERENCE.
- */
- NODETYPE_ENTITY_REFERENCE: 5,
-
- /**
- * Variable: NODETYPE_ENTITY
- *
- * DOM node of type ENTITY.
- */
- NODETYPE_ENTITY: 6,
-
- /**
- * Variable: NODETYPE_PROCESSING_INSTRUCTION
- *
- * DOM node of type PROCESSING_INSTRUCTION.
- */
- NODETYPE_PROCESSING_INSTRUCTION: 7,
-
- /**
- * Variable: NODETYPE_COMMENT
- *
- * DOM node of type COMMENT.
- */
- NODETYPE_COMMENT: 8,
-
- /**
- * Variable: NODETYPE_DOCUMENT
- *
- * DOM node of type DOCUMENT.
- */
- NODETYPE_DOCUMENT: 9,
-
- /**
- * Variable: NODETYPE_DOCUMENTTYPE
- *
- * DOM node of type DOCUMENTTYPE.
- */
- NODETYPE_DOCUMENTTYPE: 10,
-
- /**
- * Variable: NODETYPE_DOCUMENT_FRAGMENT
- *
- * DOM node of type DOCUMENT_FRAGMENT.
- */
- NODETYPE_DOCUMENT_FRAGMENT: 11,
-
- /**
- * Variable: NODETYPE_NOTATION
- *
- * DOM node of type NOTATION.
- */
- NODETYPE_NOTATION: 12,
-
- /**
- * Variable: TOOLTIP_VERTICAL_OFFSET
- *
- * Defines the vertical offset for the tooltip.
- * Default is 16.
- */
- TOOLTIP_VERTICAL_OFFSET: 16,
-
- /**
- * Variable: DEFAULT_VALID_COLOR
- *
- * Specifies the default valid colorr. Default is #0000FF.
- */
- DEFAULT_VALID_COLOR: '#00FF00',
-
- /**
- * Variable: DEFAULT_INVALID_COLOR
- *
- * Specifies the default invalid color. Default is #FF0000.
- */
- DEFAULT_INVALID_COLOR: '#FF0000',
-
- /**
- * Variable: HIGHLIGHT_STROKEWIDTH
- *
- * Defines the strokewidth to be used for the highlights.
- * Default is 3.
- */
- HIGHLIGHT_STROKEWIDTH: 3,
-
- /**
- * Variable: CURSOR_MOVABLE_VERTEX
- *
- * Defines the cursor for a movable vertex. Default is 'move'.
- */
- CURSOR_MOVABLE_VERTEX: 'move',
-
- /**
- * Variable: CURSOR_MOVABLE_EDGE
- *
- * Defines the cursor for a movable edge. Default is 'move'.
- */
- CURSOR_MOVABLE_EDGE: 'move',
-
- /**
- * Variable: CURSOR_LABEL_HANDLE
- *
- * Defines the cursor for a movable label. Default is 'default'.
- */
- CURSOR_LABEL_HANDLE: 'default',
-
- /**
- * Variable: CURSOR_BEND_HANDLE
- *
- * Defines the cursor for a movable bend. Default is 'pointer'.
- */
- CURSOR_BEND_HANDLE: 'pointer',
-
- /**
- * Variable: CURSOR_CONNECT
- *
- * Defines the cursor for a connectable state. Default is 'pointer'.
- */
- CURSOR_CONNECT: 'pointer',
-
- /**
- * Variable: HIGHLIGHT_COLOR
- *
- * Defines the color to be used for the cell highlighting.
- * Use 'none' for no color. Default is #00FF00.
- */
- HIGHLIGHT_COLOR: '#00FF00',
-
- /**
- * Variable: TARGET_HIGHLIGHT_COLOR
- *
- * Defines the color to be used for highlighting a target cell for a new
- * or changed connection. Note that this may be either a source or
- * target terminal in the graph. Use 'none' for no color.
- * Default is #0000FF.
- */
- CONNECT_TARGET_COLOR: '#0000FF',
-
- /**
- * Variable: INVALID_CONNECT_TARGET_COLOR
- *
- * Defines the color to be used for highlighting a invalid target cells
- * for a new or changed connections. Note that this may be either a source
- * or target terminal in the graph. Use 'none' for no color. Default is
- * #FF0000.
- */
- INVALID_CONNECT_TARGET_COLOR: '#FF0000',
-
- /**
- * Variable: DROP_TARGET_COLOR
- *
- * Defines the color to be used for the highlighting target parent cells
- * (for drag and drop). Use 'none' for no color. Default is #0000FF.
- */
- DROP_TARGET_COLOR: '#0000FF',
-
- /**
- * Variable: VALID_COLOR
- *
- * Defines the color to be used for the coloring valid connection
- * previews. Use 'none' for no color. Default is #FF0000.
- */
- VALID_COLOR: '#00FF00',
-
- /**
- * Variable: INVALID_COLOR
- *
- * Defines the color to be used for the coloring invalid connection
- * previews. Use 'none' for no color. Default is #FF0000.
- */
- INVALID_COLOR: '#FF0000',
-
- /**
- * Variable: EDGE_SELECTION_COLOR
- *
- * Defines the color to be used for the selection border of edges. Use
- * 'none' for no color. Default is #00FF00.
- */
- EDGE_SELECTION_COLOR: '#00FF00',
-
- /**
- * Variable: VERTEX_SELECTION_COLOR
- *
- * Defines the color to be used for the selection border of vertices. Use
- * 'none' for no color. Default is #00FF00.
- */
- VERTEX_SELECTION_COLOR: '#00FF00',
-
- /**
- * Variable: VERTEX_SELECTION_STROKEWIDTH
- *
- * Defines the strokewidth to be used for vertex selections.
- * Default is 1.
- */
- VERTEX_SELECTION_STROKEWIDTH: 1,
-
- /**
- * Variable: EDGE_SELECTION_STROKEWIDTH
- *
- * Defines the strokewidth to be used for edge selections.
- * Default is 1.
- */
- EDGE_SELECTION_STROKEWIDTH: 1,
-
- /**
- * Variable: SELECTION_DASHED
- *
- * Defines the dashed state to be used for the vertex selection
- * border. Default is true.
- */
- VERTEX_SELECTION_DASHED: true,
-
- /**
- * Variable: SELECTION_DASHED
- *
- * Defines the dashed state to be used for the edge selection
- * border. Default is true.
- */
- EDGE_SELECTION_DASHED: true,
-
- /**
- * Variable: GUIDE_COLOR
- *
- * Defines the color to be used for the guidelines in mxGraphHandler.
- * Default is #FF0000.
- */
- GUIDE_COLOR: '#FF0000',
-
- /**
- * Variable: GUIDE_STROKEWIDTH
- *
- * Defines the strokewidth to be used for the guidelines in mxGraphHandler.
- * Default is 1.
- */
- GUIDE_STROKEWIDTH: 1,
-
- /**
- * Variable: OUTLINE_COLOR
- *
- * Defines the color to be used for the outline rectangle
- * border. Use 'none' for no color. Default is #0099FF.
- */
- OUTLINE_COLOR: '#0099FF',
-
- /**
- * Variable: OUTLINE_STROKEWIDTH
- *
- * Defines the strokewidth to be used for the outline rectangle
- * stroke width. Default is 3.
- */
- OUTLINE_STROKEWIDTH: (mxClient.IS_IE) ? 2 : 3,
-
- /**
- * Variable: HANDLE_SIZE
- *
- * Defines the default size for handles. Default is 7.
- */
- HANDLE_SIZE: 7,
-
- /**
- * Variable: LABEL_HANDLE_SIZE
- *
- * Defines the default size for label handles. Default is 4.
- */
- LABEL_HANDLE_SIZE: 4,
-
- /**
- * Variable: HANDLE_FILLCOLOR
- *
- * Defines the color to be used for the handle fill color. Use 'none' for
- * no color. Default is #00FF00 (green).
- */
- HANDLE_FILLCOLOR: '#00FF00',
-
- /**
- * Variable: HANDLE_STROKECOLOR
- *
- * Defines the color to be used for the handle stroke color. Use 'none' for
- * no color. Default is black.
- */
- HANDLE_STROKECOLOR: 'black',
-
- /**
- * Variable: LABEL_HANDLE_FILLCOLOR
- *
- * Defines the color to be used for the label handle fill color. Use 'none'
- * for no color. Default is yellow.
- */
- LABEL_HANDLE_FILLCOLOR: 'yellow',
-
- /**
- * Variable: CONNECT_HANDLE_FILLCOLOR
- *
- * Defines the color to be used for the connect handle fill color. Use
- * 'none' for no color. Default is #0000FF (blue).
- */
- CONNECT_HANDLE_FILLCOLOR: '#0000FF',
-
- /**
- * Variable: LOCKED_HANDLE_FILLCOLOR
- *
- * Defines the color to be used for the locked handle fill color. Use
- * 'none' for no color. Default is #FF0000 (red).
- */
- LOCKED_HANDLE_FILLCOLOR: '#FF0000',
-
- /**
- * Variable: OUTLINE_HANDLE_FILLCOLOR
- *
- * Defines the color to be used for the outline sizer fill color. Use
- * 'none' for no color. Default is #00FFFF.
- */
- OUTLINE_HANDLE_FILLCOLOR: '#00FFFF',
-
- /**
- * Variable: OUTLINE_HANDLE_STROKECOLOR
- *
- * Defines the color to be used for the outline sizer stroke color. Use
- * 'none' for no color. Default is #0033FF.
- */
- OUTLINE_HANDLE_STROKECOLOR: '#0033FF',
-
- /**
- * Variable: DEFAULT_FONTFAMILY
- *
- * Defines the default family for all fonts in points. Default is
- * Arial,Helvetica.
- */
- DEFAULT_FONTFAMILY: 'Arial,Helvetica',
-
- /**
- * Variable: DEFAULT_FONTSIZE
- *
- * Defines the default size for all fonts in points. Default is 11.
- */
- DEFAULT_FONTSIZE: 11,
-
- /**
- * Variable: DEFAULT_STARTSIZE
- *
- * Defines the default start size for swimlanes. Default is 40.
- */
- DEFAULT_STARTSIZE: 40,
-
- /**
- * Variable: DEFAULT_MARKERSIZE
- *
- * Defines the default size for all markers. Default is 6.
- */
- DEFAULT_MARKERSIZE: 6,
-
- /**
- * Variable: DEFAULT_IMAGESIZE
- *
- * Defines the default width and height for images used in the
- * label shape. Default is 24.
- */
- DEFAULT_IMAGESIZE: 24,
-
- /**
- * Variable: ENTITY_SEGMENT
- *
- * Defines the length of the horizontal segment of an Entity Relation.
- * This can be overridden using <mxConstants.STYLE_SEGMENT> style.
- * Default is 30.
- */
- ENTITY_SEGMENT: 30,
-
- /**
- * Variable: RECTANGLE_ROUNDING_FACTOR
- *
- * Defines the rounding factor for rounded rectangles in percent between
- * 0 and 1. Values should be smaller than 0.5. Default is 0.15.
- */
- RECTANGLE_ROUNDING_FACTOR: 0.15,
-
- /**
- * Variable: LINE_ARCSIZE
- *
- * Defines the size of the arcs for rounded edges. Default is 20.
- */
- LINE_ARCSIZE: 20,
-
- /**
- * Variable: ARROW_SPACING
- *
- * Defines the spacing between the arrow shape and its terminals. Default
- * is 10.
- */
- ARROW_SPACING: 10,
-
- /**
- * Variable: ARROW_WIDTH
- *
- * Defines the width of the arrow shape. Default is 30.
- */
- ARROW_WIDTH: 30,
-
- /**
- * Variable: ARROW_SIZE
- *
- * Defines the size of the arrowhead in the arrow shape. Default is 30.
- */
- ARROW_SIZE: 30,
-
- /**
- * Variable: PAGE_FORMAT_A4_PORTRAIT
- *
- * Defines the rectangle for the A4 portrait page format. The dimensions
- * of this page format are 826x1169 pixels.
- */
- PAGE_FORMAT_A4_PORTRAIT: new mxRectangle(0, 0, 826, 1169),
-
- /**
- * Variable: PAGE_FORMAT_A4_PORTRAIT
- *
- * Defines the rectangle for the A4 portrait page format. The dimensions
- * of this page format are 826x1169 pixels.
- */
- PAGE_FORMAT_A4_LANDSCAPE: new mxRectangle(0, 0, 1169, 826),
-
- /**
- * Variable: PAGE_FORMAT_LETTER_PORTRAIT
- *
- * Defines the rectangle for the Letter portrait page format. The
- * dimensions of this page format are 850x1100 pixels.
- */
- PAGE_FORMAT_LETTER_PORTRAIT: new mxRectangle(0, 0, 850, 1100),
-
- /**
- * Variable: PAGE_FORMAT_LETTER_PORTRAIT
- *
- * Defines the rectangle for the Letter portrait page format. The dimensions
- * of this page format are 850x1100 pixels.
- */
- PAGE_FORMAT_LETTER_LANDSCAPE: new mxRectangle(0, 0, 1100, 850),
-
- /**
- * Variable: NONE
- *
- * Defines the value for none. Default is "none".
- */
- NONE: 'none',
-
- /**
- * Variable: STYLE_PERIMETER
- *
- * Defines the key for the perimeter style. This is a function that defines
- * the perimeter around a particular shape. Possible values are the
- * functions defined in <mxPerimeter>. Alternatively, the constants in this
- * class that start with <code>PERIMETER_</code> may be used to access
- * perimeter styles in <mxStyleRegistry>.
- */
- STYLE_PERIMETER: 'perimeter',
-
- /**
- * Variable: STYLE_SOURCE_PORT
- *
- * Defines the ID of the cell that should be used for computing the
- * perimeter point of the source for an edge. This allows for graphically
- * connecting to a cell while keeping the actual terminal of the edge.
- */
- STYLE_SOURCE_PORT: 'sourcePort',
-
- /**
- * Variable: STYLE_TARGET_PORT
- *
- * Defines the ID of the cell that should be used for computing the
- * perimeter point of the target for an edge. This allows for graphically
- * connecting to a cell while keeping the actual terminal of the edge.
- */
- STYLE_TARGET_PORT: 'targetPort',
-
- /**
- * Variable: STYLE_PORT_CONSTRAINT
- *
- * Defines the direction(s) that edges are allowed to connect to cells in.
- * Possible values are <code>DIRECTION_NORTH, DIRECTION_SOUTH,
- * DIRECTION_EAST</code> and <code>DIRECTION_WEST</code>.
- */
- STYLE_PORT_CONSTRAINT: 'portConstraint',
-
- /**
- * Variable: STYLE_OPACITY
- *
- * Defines the key for the opacity style. The type of the value is
- * numeric and the possible range is 0-100.
- */
- STYLE_OPACITY: 'opacity',
-
- /**
- * Variable: STYLE_TEXT_OPACITY
- *
- * Defines the key for the text opacity style. The type of the value is
- * numeric and the possible range is 0-100.
- */
- STYLE_TEXT_OPACITY: 'textOpacity',
-
- /**
- * Variable: STYLE_OVERFLOW
- *
- * Defines the key for the overflow style. Possible values are 'visible',
- * 'hidden' and 'fill'. The default value is 'visible'. This value
- * specifies how overlapping vertex labels are handled. A value of
- * 'visible' will show the complete label. A value of 'hidden' will clip
- * the label so that it does not overlap the vertex bounds. A value of
- * 'fill' will use the vertex bounds for the label. See
- * <mxGraph.isLabelClipped>.
- */
- STYLE_OVERFLOW: 'overflow',
-
- /**
- * Variable: STYLE_ORTHOGONAL
- *
- * Defines if the connection points on either end of the edge should be
- * computed so that the edge is vertical or horizontal if possible and
- * if the point is not at a fixed location. Default is false. This is
- * used in <mxGraph.isOrthogonal>, which also returns true if the edgeStyle
- * of the edge is an elbow or entity.
- */
- STYLE_ORTHOGONAL: 'orthogonal',
-
- /**
- * Variable: STYLE_EXIT_X
- *
- * Defines the key for the horizontal relative coordinate connection point
- * of an edge with its source terminal.
- */
- STYLE_EXIT_X: 'exitX',
-
- /**
- * Variable: STYLE_EXIT_Y
- *
- * Defines the key for the vertical relative coordinate connection point
- * of an edge with its source terminal.
- */
- STYLE_EXIT_Y: 'exitY',
-
- /**
- * Variable: STYLE_EXIT_PERIMETER
- *
- * Defines if the perimeter should be used to find the exact entry point
- * along the perimeter of the source. Possible values are 0 (false) and
- * 1 (true). Default is 1 (true).
- */
- STYLE_EXIT_PERIMETER: 'exitPerimeter',
-
- /**
- * Variable: STYLE_ENTRY_X
- *
- * Defines the key for the horizontal relative coordinate connection point
- * of an edge with its target terminal.
- */
- STYLE_ENTRY_X: 'entryX',
-
- /**
- * Variable: STYLE_ENTRY_Y
- *
- * Defines the key for the vertical relative coordinate connection point
- * of an edge with its target terminal.
- */
- STYLE_ENTRY_Y: 'entryY',
-
- /**
- * Variable: STYLE_ENTRY_PERIMETER
- *
- * Defines if the perimeter should be used to find the exact entry point
- * along the perimeter of the target. Possible values are 0 (false) and
- * 1 (true). Default is 1 (true).
- */
- STYLE_ENTRY_PERIMETER: 'entryPerimeter',
-
- /**
- * Variable: STYLE_WHITE_SPACE
- *
- * Defines the key for the white-space style. Possible values are 'nowrap'
- * and 'wrap'. The default value is 'nowrap'. This value specifies how
- * white-space inside a HTML vertex label should be handled. A value of
- * 'nowrap' means the text will never wrap to the next line until a
- * linefeed is encountered. A value of 'wrap' means text will wrap when
- * necessary. This style is only used for HTML labels.
- * See <mxGraph.isWrapping>.
- */
- STYLE_WHITE_SPACE: 'whiteSpace',
-
- /**
- * Variable: STYLE_ROTATION
- *
- * Defines the key for the rotation style. The type of the value is
- * numeric and the possible range is 0-360.
- */
- STYLE_ROTATION: 'rotation',
-
- /**
- * Variable: STYLE_FILLCOLOR
- *
- * Defines the key for the fill color. Possible values are all HTML color
- * names or HEX codes, as well as special keywords such as 'swimlane,
- * 'inherit' or 'indicated' to use the color code of a related cell or the
- * indicator shape.
- */
- STYLE_FILLCOLOR: 'fillColor',
-
- /**
- * Variable: STYLE_GRADIENTCOLOR
- *
- * Defines the key for the gradient color. Possible values are all HTML color
- * names or HEX codes, as well as special keywords such as 'swimlane,
- * 'inherit' or 'indicated' to use the color code of a related cell or the
- * indicator shape. This is ignored if no fill color is defined.
- */
- STYLE_GRADIENTCOLOR: 'gradientColor',
-
- /**
- * Variable: STYLE_GRADIENT_DIRECTION
- *
- * Defines the key for the gradient direction. Possible values are
- * <DIRECTION_EAST>, <DIRECTION_WEST>, <DIRECTION_NORTH> and
- * <DIRECTION_SOUTH>. Default is <DIRECTION_SOUTH>. Generally, and by
- * default in mxGraph, gradient painting is done from the value of
- * <STYLE_FILLCOLOR> to the value of <STYLE_GRADIENTCOLOR>. Taking the
- * example of <DIRECTION_NORTH>, this means <STYLE_FILLCOLOR> color at the
- * bottom of paint pattern and <STYLE_GRADIENTCOLOR> at top, with a
- * gradient in-between.
- */
- STYLE_GRADIENT_DIRECTION: 'gradientDirection',
-
- /**
- * Variable: STYLE_STROKECOLOR
- *
- * Defines the key for the strokeColor style. Possible values are all HTML
- * color names or HEX codes, as well as special keywords such as 'swimlane,
- * 'inherit', 'indicated' to use the color code of a related cell or the
- * indicator shape or 'none' for no color.
- */
- STYLE_STROKECOLOR: 'strokeColor',
-
- /**
- * Variable: STYLE_SEPARATORCOLOR
- *
- * Defines the key for the separatorColor style. Possible values are all
- * HTML color names or HEX codes. This style is only used for
- * <SHAPE_SWIMLANE> shapes.
- */
- STYLE_SEPARATORCOLOR: 'separatorColor',
-
- /**
- * Variable: STYLE_STROKEWIDTH
- *
- * Defines the key for the strokeWidth style. The type of the value is
- * numeric and the possible range is any non-negative value larger or equal
- * to 1. The value defines the stroke width in pixels. Note: To hide a
- * stroke use strokeColor none.
- */
- STYLE_STROKEWIDTH: 'strokeWidth',
-
- /**
- * Variable: STYLE_ALIGN
- *
- * Defines the key for the align style. Possible values are <ALIGN_LEFT>,
- * <ALIGN_CENTER> and <ALIGN_RIGHT>. This value defines how the lines of
- * the label are horizontally aligned. <ALIGN_LEFT> mean label text lines
- * are aligned to left of the label bounds, <ALIGN_RIGHT> to the right of
- * the label bounds and <ALIGN_CENTER> means the center of the text lines
- * are aligned in the center of the label bounds. Note this value doesn't
- * affect the positioning of the overall label bounds relative to the
- * vertex, to move the label bounds horizontally, use
- * <STYLE_LABEL_POSITION>.
- */
- STYLE_ALIGN: 'align',
-
- /**
- * Variable: STYLE_VERTICAL_ALIGN
- *
- * Defines the key for the verticalAlign style. Possible values are
- * <ALIGN_TOP>, <ALIGN_MIDDLE> and <ALIGN_BOTTOM>. This value defines how
- * the lines of the label are vertically aligned. <ALIGN_TOP> means the
- * topmost label text line is aligned against the top of the label bounds,
- * <ALIGN_BOTTOM> means the bottom-most label text line is aligned against
- * the bottom of the label bounds and <ALIGN_MIDDLE> means there is equal
- * spacing between the topmost text label line and the top of the label
- * bounds and the bottom-most text label line and the bottom of the label
- * bounds. Note this value doesn't affect the positioning of the overall
- * label bounds relative to the vertex, to move the label bounds
- * vertically, use <STYLE_VERTICAL_LABEL_POSITION>.
- */
- STYLE_VERTICAL_ALIGN: 'verticalAlign',
-
- /**
- * Variable: STYLE_LABEL_POSITION
- *
- * Defines the key for the horizontal label position of vertices. Possible
- * values are <ALIGN_LEFT>, <ALIGN_CENTER> and <ALIGN_RIGHT>. Default is
- * <ALIGN_CENTER>. The label align defines the position of the label
- * relative to the cell. <ALIGN_LEFT> means the entire label bounds is
- * placed completely just to the left of the vertex, <ALIGN_RIGHT> means
- * adjust to the right and <ALIGN_CENTER> means the label bounds are
- * vertically aligned with the bounds of the vertex. Note this value
- * doesn't affect the positioning of label within the label bounds, to move
- * the label horizontally within the label bounds, use <STYLE_ALIGN>.
- */
- STYLE_LABEL_POSITION: 'labelPosition',
-
- /**
- * Variable: STYLE_VERTICAL_LABEL_POSITION
- *
- * Defines the key for the vertical label position of vertices. Possible
- * values are <ALIGN_TOP>, <ALIGN_BOTTOM> and <ALIGN_MIDDLE>. Default is
- * <ALIGN_MIDDLE>. The label align defines the position of the label
- * relative to the cell. <ALIGN_TOP> means the entire label bounds is
- * placed completely just on the top of the vertex, <ALIGN_BOTTOM> means
- * adjust on the bottom and <ALIGN_MIDDLE> means the label bounds are
- * horizontally aligned with the bounds of the vertex. Note this value
- * doesn't affect the positioning of label within the label bounds, to move
- * the label vertically within the label bounds, use
- * <STYLE_VERTICAL_ALIGN>.
- */
- STYLE_VERTICAL_LABEL_POSITION: 'verticalLabelPosition',
-
- /**
- * Variable: STYLE_IMAGE_ASPECT
- *
- * Defines the key for the image aspect style. Possible values are 0 (do
- * not preserve aspect) or 1 (keep aspect). This is only used in
- * <mxImageShape>. Default is 1.
- */
- STYLE_IMAGE_ASPECT: 'imageAspect',
-
- /**
- * Variable: STYLE_IMAGE_ALIGN
- *
- * Defines the key for the align style. Possible values are <ALIGN_LEFT>,
- * <ALIGN_CENTER> and <ALIGN_RIGHT>. The value defines how any image in the
- * vertex label is aligned horizontally within the label bounds of a
- * <SHAPE_LABEL> shape.
- */
- STYLE_IMAGE_ALIGN: 'imageAlign',
-
- /**
- * Variable: STYLE_IMAGE_VERTICAL_ALIGN
- *
- * Defines the key for the verticalAlign style. Possible values are
- * <ALIGN_TOP>, <ALIGN_MIDDLE> and <ALIGN_BOTTOM>. The value defines how
- * any image in the vertex label is aligned vertically within the label
- * bounds of a <SHAPE_LABEL> shape.
- */
- STYLE_IMAGE_VERTICAL_ALIGN: 'imageVerticalAlign',
-
- /**
- * Variable: STYLE_GLASS
- *
- * Defines the key for the glass style. Possible values are 0 (disabled) and
- * 1(enabled). The default value is 0. This is used in <mxLabel>.
- */
- STYLE_GLASS: 'glass',
-
- /**
- * Variable: STYLE_IMAGE
- *
- * Defines the key for the image style. Possible values are any image URL,
- * the type of the value is String. This is the path to the image to image
- * that is to be displayed within the label of a vertex. Data URLs should
- * use the following format: data:image/png,xyz where xyz is the base64
- * encoded data (without the "base64"-prefix). Note that Data URLs are only
- * supported in modern browsers.
- */
- STYLE_IMAGE: 'image',
-
- /**
- * Variable: STYLE_IMAGE_WIDTH
- *
- * Defines the key for the imageWidth style. The type of this value is
- * int, the value is the image width in pixels and must be greater than 0.
- */
- STYLE_IMAGE_WIDTH: 'imageWidth',
-
- /**
- * Variable: STYLE_IMAGE_HEIGHT
- *
- * Defines the key for the imageHeight style. The type of this value is
- * int, the value is the image height in pixels and must be greater than 0.
- */
- STYLE_IMAGE_HEIGHT: 'imageHeight',
-
- /**
- * Variable: STYLE_IMAGE_BACKGROUND
- *
- * Defines the key for the image background color. This style is only used
- * in <mxImageShape>. Possible values are all HTML color names or HEX
- * codes.
- */
- STYLE_IMAGE_BACKGROUND: 'imageBackground',
-
- /**
- * Variable: STYLE_IMAGE_BORDER
- *
- * Defines the key for the image border color. This style is only used in
- * <mxImageShape>. Possible values are all HTML color names or HEX codes.
- */
- STYLE_IMAGE_BORDER: 'imageBorder',
-
- /**
- * Variable: STYLE_IMAGE_FLIPH
- *
- * Defines the key for the horizontal image flip. This style is only used
- * in <mxImageShape>. Possible values are 0 and 1. Default is 0.
- */
- STYLE_IMAGE_FLIPH: 'imageFlipH',
-
- /**
- * Variable: STYLE_IMAGE_FLIPV
- *
- * Defines the key for the vertical image flip. This style is only used
- * in <mxImageShape>. Possible values are 0 and 1. Default is 0.
- */
- STYLE_IMAGE_FLIPV: 'imageFlipV',
-
- /**
- * Variable: STYLE_STENCIL_FLIPH
- *
- * Defines the key for the horizontal stencil flip. This style is only used
- * for <mxStencilShape>. Possible values are 0 and 1. Default is 0.
- */
- STYLE_STENCIL_FLIPH: 'stencilFlipH',
-
- /**
- * Variable: STYLE_STENCIL_FLIPV
- *
- * Defines the key for the vertical stencil flip. This style is only used
- * for <mxStencilShape>. Possible values are 0 and 1. Default is 0.
- */
- STYLE_STENCIL_FLIPV: 'stencilFlipV',
-
- /**
- * Variable: STYLE_NOLABEL
- *
- * Defines the key for the noLabel style. If this is
- * true then no label is visible for a given cell.
- * Possible values are true or false (1 or 0).
- * Default is false.
- */
- STYLE_NOLABEL: 'noLabel',
-
- /**
- * Variable: STYLE_NOEDGESTYLE
- *
- * Defines the key for the noEdgeStyle style. If this is
- * true then no edge style is applied for a given edge.
- * Possible values are true or false (1 or 0).
- * Default is false.
- */
- STYLE_NOEDGESTYLE: 'noEdgeStyle',
-
- /**
- * Variable: STYLE_LABEL_BACKGROUNDCOLOR
- *
- * Defines the key for the label background color. Possible values are all
- * HTML color names or HEX codes.
- */
- STYLE_LABEL_BACKGROUNDCOLOR: 'labelBackgroundColor',
-
- /**
- * Variable: STYLE_LABEL_BORDERCOLOR
- *
- * Defines the key for the label border color. Possible values are all
- * HTML color names or HEX codes.
- */
- STYLE_LABEL_BORDERCOLOR: 'labelBorderColor',
-
- /**
- * Variable: STYLE_LABEL_PADDING
- *
- * Defines the key for the label padding, ie. the space between the label
- * border and the label.
- */
- STYLE_LABEL_PADDING: 'labelPadding',
-
- /**
- * Variable: STYLE_INDICATOR_SHAPE
- *
- * Defines the key for the indicator shape used within an <mxLabel>.
- * Possible values are all SHAPE_* constants or the names of any new
- * shapes. The indicatorShape has precedence over the indicatorImage.
- */
- STYLE_INDICATOR_SHAPE: 'indicatorShape',
-
- /**
- * Variable: STYLE_INDICATOR_IMAGE
- *
- * Defines the key for the indicator image used within an <mxLabel>.
- * Possible values are all image URLs. The indicatorShape has
- * precedence over the indicatorImage.
- */
- STYLE_INDICATOR_IMAGE: 'indicatorImage',
-
- /**
- * Variable: STYLE_INDICATOR_COLOR
- *
- * Defines the key for the indicatorColor style. Possible values are all
- * HTML color names or HEX codes, as well as the special 'swimlane' keyword
- * to refer to the color of the parent swimlane if one exists.
- */
- STYLE_INDICATOR_COLOR: 'indicatorColor',
-
- /**
- * Variable: STYLE_INDICATOR_STROKECOLOR
- *
- * Defines the key for the indicator stroke color in <mxLabel>.
- * Possible values are all color codes.
- */
- STYLE_INDICATOR_STROKECOLOR: 'indicatorStrokeColor',
-
- /**
- * Variable: STYLE_INDICATOR_GRADIENTCOLOR
- *
- * Defines the key for the indicatorGradientColor style. Possible values
- * are all HTML color names or HEX codes. This style is only supported in
- * <SHAPE_LABEL> shapes.
- */
- STYLE_INDICATOR_GRADIENTCOLOR: 'indicatorGradientColor',
-
- /**
- * Variable: STYLE_INDICATOR_SPACING
- *
- * The defines the key for the spacing between the label and the
- * indicator in <mxLabel>. Possible values are in pixels.
- */
- STYLE_INDICATOR_SPACING: 'indicatorSpacing',
-
- /**
- * Variable: STYLE_INDICATOR_WIDTH
- *
- * Defines the key for the indicator width.
- * Possible values start at 0 (in pixels).
- */
- STYLE_INDICATOR_WIDTH: 'indicatorWidth',
-
- /**
- * Variable: STYLE_INDICATOR_HEIGHT
- *
- * Defines the key for the indicator height.
- * Possible values start at 0 (in pixels).
- */
- STYLE_INDICATOR_HEIGHT: 'indicatorHeight',
-
- /**
- * Variable: STYLE_INDICATOR_DIRECTION
- *
- * Defines the key for the indicatorDirection style. The direction style is
- * used to specify the direction of certain shapes (eg. <mxTriangle>).
- * Possible values are <DIRECTION_EAST> (default), <DIRECTION_WEST>,
- * <DIRECTION_NORTH> and <DIRECTION_SOUTH>.
- */
- STYLE_INDICATOR_DIRECTION: 'indicatorDirection',
-
- /**
- * Variable: STYLE_SHADOW
- *
- * Defines the key for the shadow style. The type of the value is Boolean.
- */
- STYLE_SHADOW: 'shadow',
-
- /**
- * Variable: STYLE_SEGMENT
- *
- * Defines the key for the segment style. The type of this value is
- * float and the value represents the size of the horizontal
- * segment of the entity relation style. Default is ENTITY_SEGMENT.
- */
- STYLE_SEGMENT: 'segment',
-
- /**
- * Variable: STYLE_ENDARROW
- *
- * Defines the key for the end arrow marker.
- * Possible values are all constants with an ARROW-prefix.
- * This is only used in <mxConnector>.
- *
- * Example:
- * (code)
- * style[mxConstants.STYLE_ENDARROW] = mxConstants.ARROW_CLASSIC;
- * (end)
- */
- STYLE_ENDARROW: 'endArrow',
-
- /**
- * Variable: STYLE_STARTARROW
- *
- * Defines the key for the start arrow marker.
- * Possible values are all constants with an ARROW-prefix.
- * This is only used in <mxConnector>.
- * See <STYLE_ENDARROW>.
- */
- STYLE_STARTARROW: 'startArrow',
-
- /**
- * Variable: STYLE_ENDSIZE
- *
- * Defines the key for the endSize style. The type of this value is numeric
- * and the value represents the size of the end marker in pixels.
- */
- STYLE_ENDSIZE: 'endSize',
-
- /**
- * Variable: STYLE_STARTSIZE
- *
- * Defines the key for the startSize style. The type of this value is
- * numeric and the value represents the size of the start marker or the
- * size of the swimlane title region depending on the shape it is used for.
- */
- STYLE_STARTSIZE: 'startSize',
-
- /**
- * Variable: STYLE_ENDFILL
- *
- * Defines the key for the endFill style. Use 0 for no fill or 1
- * (default) for fill. (This style is only exported via <mxImageExport>.)
- */
- STYLE_ENDFILL: 'endFill',
-
- /**
- * Variable: STYLE_STARTFILL
- *
- * Defines the key for the startFill style. Use 0 for no fill or 1
- * (default) for fill. (This style is only exported via <mxImageExport>.)
- */
- STYLE_STARTFILL: 'startFill',
-
- /**
- * Variable: STYLE_DASHED
- *
- * Defines the key for the dashed style. Use 0 (default) for non-dashed or 1
- * for dashed.
- */
- STYLE_DASHED: 'dashed',
-
- /**
- * Defines the key for the dashed pattern style in SVG and image exports.
- * The type of this value is a space separated list of numbers that specify
- * a custom-defined dash pattern. Dash styles are defined in terms of the
- * length of the dash (the drawn part of the stroke) and the length of the
- * space between the dashes. The lengths are relative to the line width: a
- * length of "1" is equal to the line width. VML ignores this style and
- * uses dashStyle instead as defined in the VML specification. This style
- * is only used in the <mxConnector> shape.
- */
- STYLE_DASH_PATTERN: 'dashPattern',
-
- /**
- * Variable: STYLE_ROUNDED
- *
- * Defines the key for the rounded style. The type of this value is
- * Boolean. For edges this determines whether or not joins between edges
- * segments are smoothed to a rounded finish. For vertices that have the
- * rectangle shape, this determines whether or not the rectangle is
- * rounded.
- */
- STYLE_ROUNDED: 'rounded',
-
- /**
- * Variable: STYLE_ARCSIZE
- *
- * Defines the rounding factor for a rounded rectangle in percent (without
- * the percent sign). Possible values are between 0 and 100. If this value
- * is not specified then RECTANGLE_ROUNDING_FACTOR * 100 is used.
- * (This style is only exported via <mxImageExport>.)
- */
- STYLE_ARCSIZE: 'arcSize',
-
- /**
- * Variable: STYLE_SMOOTH
- *
- * An experimental style for edges. This style is currently not available
- * in the backends and is implemented differently for VML and SVG. The use
- * of this style is currently only recommended for VML.
- */
- STYLE_SMOOTH: 'smooth',
-
- /**
- * Variable: STYLE_SOURCE_PERIMETER_SPACING
- *
- * Defines the key for the source perimeter spacing. The type of this value
- * is numeric. This is the distance between the source connection point of
- * an edge and the perimeter of the source vertex in pixels. This style
- * only applies to edges.
- */
- STYLE_SOURCE_PERIMETER_SPACING: 'sourcePerimeterSpacing',
-
- /**
- * Variable: STYLE_TARGET_PERIMETER_SPACING
- *
- * Defines the key for the target perimeter spacing. The type of this value
- * is numeric. This is the distance between the target connection point of
- * an edge and the perimeter of the target vertex in pixels. This style
- * only applies to edges.
- */
- STYLE_TARGET_PERIMETER_SPACING: 'targetPerimeterSpacing',
-
- /**
- * Variable: STYLE_PERIMETER_SPACING
- *
- * Defines the key for the perimeter spacing. This is the distance between
- * the connection point and the perimeter in pixels. When used in a vertex
- * style, this applies to all incoming edges to floating ports (edges that
- * terminate on the perimeter of the vertex). When used in an edge style,
- * this spacing applies to the source and target separately, if they
- * terminate in floating ports (on the perimeter of the vertex).
- */
- STYLE_PERIMETER_SPACING: 'perimeterSpacing',
-
- /**
- * Variable: STYLE_SPACING
- *
- * Defines the key for the spacing. The value represents the spacing, in
- * pixels, added to each side of a label in a vertex (style applies to
- * vertices only).
- */
- STYLE_SPACING: 'spacing',
-
- /**
- * Variable: STYLE_SPACING_TOP
- *
- * Defines the key for the spacingTop style. The value represents the
- * spacing, in pixels, added to the top side of a label in a vertex (style
- * applies to vertices only).
- */
- STYLE_SPACING_TOP: 'spacingTop',
-
- /**
- * Variable: STYLE_SPACING_LEFT
- *
- * Defines the key for the spacingLeft style. The value represents the
- * spacing, in pixels, added to the left side of a label in a vertex (style
- * applies to vertices only).
- */
- STYLE_SPACING_LEFT: 'spacingLeft',
-
- /**
- * Variable: STYLE_SPACING_BOTTOM
- *
- * Defines the key for the spacingBottom style The value represents the
- * spacing, in pixels, added to the bottom side of a label in a vertex
- * (style applies to vertices only).
- */
- STYLE_SPACING_BOTTOM: 'spacingBottom',
-
- /**
- * Variable: STYLE_SPACING_RIGHT
- *
- * Defines the key for the spacingRight style The value represents the
- * spacing, in pixels, added to the right side of a label in a vertex (style
- * applies to vertices only).
- */
- STYLE_SPACING_RIGHT: 'spacingRight',
-
- /**
- * Variable: STYLE_HORIZONTAL
- *
- * Defines the key for the horizontal style. Possible values are
- * true or false. This value only applies to vertices. If the <STYLE_SHAPE>
- * is <code>SHAPE_SWIMLANE</code> a value of false indicates that the
- * swimlane should be drawn vertically, true indicates to draw it
- * horizontally. If the shape style does not indicate that this vertex is a
- * swimlane, this value affects only whether the label is drawn
- * horizontally or vertically.
- */
- STYLE_HORIZONTAL: 'horizontal',
-
- /**
- * Variable: STYLE_DIRECTION
- *
- * Defines the key for the direction style. The direction style is used
- * to specify the direction of certain shapes (eg. <mxTriangle>).
- * Possible values are <DIRECTION_EAST> (default), <DIRECTION_WEST>,
- * <DIRECTION_NORTH> and <DIRECTION_SOUTH>.
- */
- STYLE_DIRECTION: 'direction',
-
- /**
- * Variable: STYLE_ELBOW
- *
- * Defines the key for the elbow style. Possible values are
- * <ELBOW_HORIZONTAL> and <ELBOW_VERTICAL>. Default is <ELBOW_HORIZONTAL>.
- * This defines how the three segment orthogonal edge style leaves its
- * terminal vertices. The vertical style leaves the terminal vertices at
- * the top and bottom sides.
- */
- STYLE_ELBOW: 'elbow',
-
- /**
- * Variable: STYLE_FONTCOLOR
- *
- * Defines the key for the fontColor style. Possible values are all HTML
- * color names or HEX codes.
- */
- STYLE_FONTCOLOR: 'fontColor',
-
- /**
- * Variable: STYLE_FONTFAMILY
- *
- * Defines the key for the fontFamily style. Possible values are names such
- * as Arial; Dialog; Verdana; Times New Roman. The value is of type String.
- */
- STYLE_FONTFAMILY: 'fontFamily',
-
- /**
- * Variable: STYLE_FONTSIZE
- *
- * Defines the key for the fontSize style (in points). The type of the value
- * is int.
- */
- STYLE_FONTSIZE: 'fontSize',
-
- /**
- * Variable: STYLE_FONTSTYLE
- *
- * Defines the key for the fontStyle style. Values may be any logical AND
- * (sum) of <FONT_BOLD>, <FONT_ITALIC>, <FONT_UNDERLINE> and <FONT_SHADOW>.
- * The type of the value is int.
- */
- STYLE_FONTSTYLE: 'fontStyle',
-
- /**
- * Variable: STYLE_AUTOSIZE
- *
- * Defines the key for the autosize style. This specifies if a cell should be
- * resized automatically if the value has changed. Possible values are 0 or 1.
- * Default is 0. See <mxGraph.isAutoSizeCell>. This is normally combined with
- * <STYLE_RESIZABLE> to disable manual sizing.
- */
- STYLE_AUTOSIZE: 'autosize',
-
- /**
- * Variable: STYLE_FOLDABLE
- *
- * Defines the key for the foldable style. This specifies if a cell is foldable
- * using a folding icon. Possible values are 0 or 1. Default is 1. See
- * <mxGraph.isCellFoldable>.
- */
- STYLE_FOLDABLE: 'foldable',
-
- /**
- * Variable: STYLE_EDITABLE
- *
- * Defines the key for the editable style. This specifies if the value of
- * a cell can be edited using the in-place editor. Possible values are 0 or
- * 1. Default is 1. See <mxGraph.isCellEditable>.
- */
- STYLE_EDITABLE: 'editable',
-
- /**
- * Variable: STYLE_BENDABLE
- *
- * Defines the key for the bendable style. This specifies if the control
- * points of an edge can be moved. Possible values are 0 or 1. Default is
- * 1. See <mxGraph.isCellBendable>.
- */
- STYLE_BENDABLE: 'bendable',
-
- /**
- * Variable: STYLE_MOVABLE
- *
- * Defines the key for the movable style. This specifies if a cell can
- * be moved. Possible values are 0 or 1. Default is 1. See
- * <mxGraph.isCellMovable>.
- */
- STYLE_MOVABLE: 'movable',
-
- /**
- * Variable: STYLE_RESIZABLE
- *
- * Defines the key for the resizable style. This specifies if a cell can
- * be resized. Possible values are 0 or 1. Default is 1. See
- * <mxGraph.isCellResizable>.
- */
- STYLE_RESIZABLE: 'resizable',
-
- /**
- * Variable: STYLE_CLONEABLE
- *
- * Defines the key for the cloneable style. This specifies if a cell can
- * be cloned. Possible values are 0 or 1. Default is 1. See
- * <mxGraph.isCellCloneable>.
- */
- STYLE_CLONEABLE: 'cloneable',
-
- /**
- * Variable: STYLE_DELETABLE
- *
- * Defines the key for the deletable style. This specifies if a cell can be
- * deleted. Possible values are 0 or 1. Default is 1. See
- * <mxGraph.isCellDeletable>.
- */
- STYLE_DELETABLE: 'deletable',
-
- /**
- * Variable: STYLE_SHAPE
- *
- * Defines the key for the shape. Possible values are all constants
- * with a SHAPE-prefix or any newly defined shape names.
- */
- STYLE_SHAPE: 'shape',
-
- /**
- * Variable: STYLE_EDGE
- *
- * Defines the key for the edge style. Possible values are the functions
- * defined in <mxEdgeStyle>.
- */
- STYLE_EDGE: 'edgeStyle',
-
- /**
- * Variable: STYLE_LOOP
- *
- * Defines the key for the loop style. Possible values are the functions
- * defined in <mxEdgeStyle>.
- */
- STYLE_LOOP: 'loopStyle',
-
- /**
- * Variable: STYLE_ROUTING_CENTER_X
- *
- * Defines the key for the horizontal routing center. Possible values are
- * between -0.5 and 0.5. This is the relative offset from the center used
- * for connecting edges. The type of this value is numeric.
- */
- STYLE_ROUTING_CENTER_X: 'routingCenterX',
-
- /**
- * Variable: STYLE_ROUTING_CENTER_Y
- *
- * Defines the key for the vertical routing center. Possible values are
- * between -0.5 and 0.5. This is the relative offset from the center used
- * for connecting edges. The type of this value is numeric.
- */
- STYLE_ROUTING_CENTER_Y: 'routingCenterY',
-
- /**
- * Variable: FONT_BOLD
- *
- * Constant for bold fonts. Default is 1.
- */
- FONT_BOLD: 1,
-
- /**
- * Variable: FONT_ITALIC
- *
- * Constant for italic fonts. Default is 2.
- */
- FONT_ITALIC: 2,
-
- /**
- * Variable: FONT_UNDERLINE
- *
- * Constant for underlined fonts. Default is 4.
- */
- FONT_UNDERLINE: 4,
-
- /**
- * Variable: FONT_SHADOW
- *
- * Constant for fonts with a shadow. Default is 8.
- */
- FONT_SHADOW: 8,
-
- /**
- * Variable: SHAPE_RECTANGLE
- *
- * Name under which <mxRectangleShape> is registered
- * in <mxCellRenderer>. Default is rectangle.
- */
- SHAPE_RECTANGLE: 'rectangle',
-
- /**
- * Variable: SHAPE_ELLIPSE
- *
- * Name under which <mxEllipse> is registered
- * in <mxCellRenderer>. Default is ellipse.
- */
- SHAPE_ELLIPSE: 'ellipse',
-
- /**
- * Variable: SHAPE_DOUBLE_ELLIPSE
- *
- * Name under which <mxDoubleEllipse> is registered
- * in <mxCellRenderer>. Default is doubleEllipse.
- */
- SHAPE_DOUBLE_ELLIPSE: 'doubleEllipse',
-
- /**
- * Variable: SHAPE_RHOMBUS
- *
- * Name under which <mxRhombus> is registered
- * in <mxCellRenderer>. Default is rhombus.
- */
- SHAPE_RHOMBUS: 'rhombus',
-
- /**
- * Variable: SHAPE_LINE
- *
- * Name under which <mxLine> is registered
- * in <mxCellRenderer>. Default is line.
- */
- SHAPE_LINE: 'line',
-
- /**
- * Variable: SHAPE_IMAGE
- *
- * Name under which <mxImageShape> is registered
- * in <mxCellRenderer>. Default is image.
- */
- SHAPE_IMAGE: 'image',
-
- /**
- * Variable: SHAPE_ARROW
- *
- * Name under which <mxArrow> is registered
- * in <mxCellRenderer>. Default is arrow.
- */
- SHAPE_ARROW: 'arrow',
-
- /**
- * Variable: SHAPE_LABEL
- *
- * Name under which <mxLabel> is registered
- * in <mxCellRenderer>. Default is label.
- */
- SHAPE_LABEL: 'label',
-
- /**
- * Variable: SHAPE_CYLINDER
- *
- * Name under which <mxCylinder> is registered
- * in <mxCellRenderer>. Default is cylinder.
- */
- SHAPE_CYLINDER: 'cylinder',
-
- /**
- * Variable: SHAPE_SWIMLANE
- *
- * Name under which <mxSwimlane> is registered
- * in <mxCellRenderer>. Default is swimlane.
- */
- SHAPE_SWIMLANE: 'swimlane',
-
- /**
- * Variable: SHAPE_CONNECTOR
- *
- * Name under which <mxConnector> is registered
- * in <mxCellRenderer>. Default is connector.
- */
- SHAPE_CONNECTOR: 'connector',
-
- /**
- * Variable: SHAPE_ACTOR
- *
- * Name under which <mxActor> is registered
- * in <mxCellRenderer>. Default is actor.
- */
- SHAPE_ACTOR: 'actor',
-
- /**
- * Variable: SHAPE_CLOUD
- *
- * Name under which <mxCloud> is registered
- * in <mxCellRenderer>. Default is cloud.
- */
- SHAPE_CLOUD: 'cloud',
-
- /**
- * Variable: SHAPE_TRIANGLE
- *
- * Name under which <mxTriangle> is registered
- * in <mxCellRenderer>. Default is triangle.
- */
- SHAPE_TRIANGLE: 'triangle',
-
- /**
- * Variable: SHAPE_HEXAGON
- *
- * Name under which <mxHexagon> is registered
- * in <mxCellRenderer>. Default is hexagon.
- */
- SHAPE_HEXAGON: 'hexagon',
-
- /**
- * Variable: ARROW_CLASSIC
- *
- * Constant for classic arrow markers.
- */
- ARROW_CLASSIC: 'classic',
-
- /**
- * Variable: ARROW_BLOCK
- *
- * Constant for block arrow markers.
- */
- ARROW_BLOCK: 'block',
-
- /**
- * Variable: ARROW_OPEN
- *
- * Constant for open arrow markers.
- */
- ARROW_OPEN: 'open',
-
- /**
- * Variable: ARROW_OVAL
- *
- * Constant for oval arrow markers.
- */
- ARROW_OVAL: 'oval',
-
- /**
- * Variable: ARROW_DIAMOND
- *
- * Constant for diamond arrow markers.
- */
- ARROW_DIAMOND: 'diamond',
-
- /**
- * Variable: ARROW_DIAMOND
- *
- * Constant for diamond arrow markers.
- */
- ARROW_DIAMOND_THIN: 'diamondThin',
-
- /**
- * Variable: ALIGN_LEFT
- *
- * Constant for left horizontal alignment. Default is left.
- */
- ALIGN_LEFT: 'left',
-
- /**
- * Variable: ALIGN_CENTER
- *
- * Constant for center horizontal alignment. Default is center.
- */
- ALIGN_CENTER: 'center',
-
- /**
- * Variable: ALIGN_RIGHT
- *
- * Constant for right horizontal alignment. Default is right.
- */
- ALIGN_RIGHT: 'right',
-
- /**
- * Variable: ALIGN_TOP
- *
- * Constant for top vertical alignment. Default is top.
- */
- ALIGN_TOP: 'top',
-
- /**
- * Variable: ALIGN_MIDDLE
- *
- * Constant for middle vertical alignment. Default is middle.
- */
- ALIGN_MIDDLE: 'middle',
-
- /**
- * Variable: ALIGN_BOTTOM
- *
- * Constant for bottom vertical alignment. Default is bottom.
- */
- ALIGN_BOTTOM: 'bottom',
-
- /**
- * Variable: DIRECTION_NORTH
- *
- * Constant for direction north. Default is north.
- */
- DIRECTION_NORTH: 'north',
-
- /**
- * Variable: DIRECTION_SOUTH
- *
- * Constant for direction south. Default is south.
- */
- DIRECTION_SOUTH: 'south',
-
- /**
- * Variable: DIRECTION_EAST
- *
- * Constant for direction east. Default is east.
- */
- DIRECTION_EAST: 'east',
-
- /**
- * Variable: DIRECTION_WEST
- *
- * Constant for direction west. Default is west.
- */
- DIRECTION_WEST: 'west',
-
- /**
- * Variable: DIRECTION_MASK_NONE
- *
- * Constant for no direction.
- */
- DIRECTION_MASK_NONE: 0,
-
- /**
- * Variable: DIRECTION_MASK_WEST
- *
- * Bitwise mask for west direction.
- */
- DIRECTION_MASK_WEST: 1,
-
- /**
- * Variable: DIRECTION_MASK_NORTH
- *
- * Bitwise mask for north direction.
- */
- DIRECTION_MASK_NORTH: 2,
-
- /**
- * Variable: DIRECTION_MASK_SOUTH
- *
- * Bitwise mask for south direction.
- */
- DIRECTION_MASK_SOUTH: 4,
-
- /**
- * Variable: DIRECTION_MASK_EAST
- *
- * Bitwise mask for east direction.
- */
- DIRECTION_MASK_EAST: 8,
-
- /**
- * Variable: DIRECTION_MASK_ALL
- *
- * Bitwise mask for all directions.
- */
- DIRECTION_MASK_ALL: 15,
-
- /**
- * Variable: ELBOW_VERTICAL
- *
- * Constant for elbow vertical. Default is horizontal.
- */
- ELBOW_VERTICAL: 'vertical',
-
- /**
- * Variable: ELBOW_HORIZONTAL
- *
- * Constant for elbow horizontal. Default is horizontal.
- */
- ELBOW_HORIZONTAL: 'horizontal',
-
- /**
- * Variable: EDGESTYLE_ELBOW
- *
- * Name of the elbow edge style. Can be used as a string value
- * for the STYLE_EDGE style.
- */
- EDGESTYLE_ELBOW: 'elbowEdgeStyle',
-
- /**
- * Variable: EDGESTYLE_ENTITY_RELATION
- *
- * Name of the entity relation edge style. Can be used as a string value
- * for the STYLE_EDGE style.
- */
- EDGESTYLE_ENTITY_RELATION: 'entityRelationEdgeStyle',
-
- /**
- * Variable: EDGESTYLE_LOOP
- *
- * Name of the loop edge style. Can be used as a string value
- * for the STYLE_EDGE style.
- */
- EDGESTYLE_LOOP: 'loopEdgeStyle',
-
- /**
- * Variable: EDGESTYLE_SIDETOSIDE
- *
- * Name of the side to side edge style. Can be used as a string value
- * for the STYLE_EDGE style.
- */
- EDGESTYLE_SIDETOSIDE: 'sideToSideEdgeStyle',
-
- /**
- * Variable: EDGESTYLE_TOPTOBOTTOM
- *
- * Name of the top to bottom edge style. Can be used as a string value
- * for the STYLE_EDGE style.
- */
- EDGESTYLE_TOPTOBOTTOM: 'topToBottomEdgeStyle',
-
- /**
- * Variable: EDGESTYLE_ORTHOGONAL
- *
- * Name of the generic orthogonal edge style. Can be used as a string value
- * for the STYLE_EDGE style.
- */
- EDGESTYLE_ORTHOGONAL: 'orthogonalEdgeStyle',
-
- /**
- * Variable: EDGESTYLE_SEGMENT
- *
- * Name of the generic segment edge style. Can be used as a string value
- * for the STYLE_EDGE style.
- */
- EDGESTYLE_SEGMENT: 'segmentEdgeStyle',
-
- /**
- * Variable: PERIMETER_ELLIPSE
- *
- * Name of the ellipse perimeter. Can be used as a string value
- * for the STYLE_PERIMETER style.
- */
- PERIMETER_ELLIPSE: 'ellipsePerimeter',
-
- /**
- * Variable: PERIMETER_RECTANGLE
- *
- * Name of the rectangle perimeter. Can be used as a string value
- * for the STYLE_PERIMETER style.
- */
- PERIMETER_RECTANGLE: 'rectanglePerimeter',
-
- /**
- * Variable: PERIMETER_RHOMBUS
- *
- * Name of the rhombus perimeter. Can be used as a string value
- * for the STYLE_PERIMETER style.
- */
- PERIMETER_RHOMBUS: 'rhombusPerimeter',
-
- /**
- * Variable: PERIMETER_TRIANGLE
- *
- * Name of the triangle perimeter. Can be used as a string value
- * for the STYLE_PERIMETER style.
- */
- PERIMETER_TRIANGLE: 'trianglePerimeter'
-
-};
diff --git a/src/js/util/mxDictionary.js b/src/js/util/mxDictionary.js
deleted file mode 100644
index a2e503a..0000000
--- a/src/js/util/mxDictionary.js
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * $Id: mxDictionary.js,v 1.12 2012-04-26 08:08:54 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxDictionary
- *
- * A wrapper class for an associative array with object keys. Note: This
- * implementation uses <mxObjectIdentitiy> to turn object keys into strings.
- *
- * Constructor: mxEventSource
- *
- * Constructs a new dictionary which allows object to be used as keys.
- */
-function mxDictionary()
-{
- this.clear();
-};
-
-/**
- * Function: map
- *
- * Stores the (key, value) pairs in this dictionary.
- */
-mxDictionary.prototype.map = null;
-
-/**
- * Function: clear
- *
- * Clears the dictionary.
- */
-mxDictionary.prototype.clear = function()
-{
- this.map = {};
-};
-
-/**
- * Function: get
- *
- * Returns the value for the given key.
- */
-mxDictionary.prototype.get = function(key)
-{
- var id = mxObjectIdentity.get(key);
-
- return this.map[id];
-};
-
-/**
- * Function: put
- *
- * Stores the value under the given key and returns the previous
- * value for that key.
- */
-mxDictionary.prototype.put = function(key, value)
-{
- var id = mxObjectIdentity.get(key);
- var previous = this.map[id];
- this.map[id] = value;
-
- return previous;
-};
-
-/**
- * Function: remove
- *
- * Removes the value for the given key and returns the value that
- * has been removed.
- */
-mxDictionary.prototype.remove = function(key)
-{
- var id = mxObjectIdentity.get(key);
- var previous = this.map[id];
- delete this.map[id];
-
- return previous;
-};
-
-/**
- * Function: getKeys
- *
- * Returns all keys as an array.
- */
-mxDictionary.prototype.getKeys = function()
-{
- var result = [];
-
- for (var key in this.map)
- {
- result.push(key);
- }
-
- return result;
-};
-
-/**
- * Function: getValues
- *
- * Returns all values as an array.
- */
-mxDictionary.prototype.getValues = function()
-{
- var result = [];
-
- for (var key in this.map)
- {
- result.push(this.map[key]);
- }
-
- return result;
-};
-
-/**
- * Function: visit
- *
- * Visits all entries in the dictionary using the given function with the
- * following signature: function(key, value) where key is a string and
- * value is an object.
- *
- * Parameters:
- *
- * visitor - A function that takes the key and value as arguments.
- */
-mxDictionary.prototype.visit = function(visitor)
-{
- for (var key in this.map)
- {
- visitor(key, this.map[key]);
- }
-};
diff --git a/src/js/util/mxDivResizer.js b/src/js/util/mxDivResizer.js
deleted file mode 100644
index 2a2e4eb..0000000
--- a/src/js/util/mxDivResizer.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * $Id: mxDivResizer.js,v 1.22 2010-01-02 09:45:14 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxDivResizer
- *
- * Maintains the size of a div element in Internet Explorer. This is a
- * workaround for the right and bottom style being ignored in IE.
- *
- * If you need a div to cover the scrollwidth and -height of a document,
- * then you can use this class as follows:
- *
- * (code)
- * var resizer = new mxDivResizer(background);
- * resizer.getDocumentHeight = function()
- * {
- * return document.body.scrollHeight;
- * }
- * resizer.getDocumentWidth = function()
- * {
- * return document.body.scrollWidth;
- * }
- * resizer.resize();
- * (end)
- *
- * Constructor: mxDivResizer
- *
- * Constructs an object that maintains the size of a div
- * element when the window is being resized. This is only
- * required for Internet Explorer as it ignores the respective
- * stylesheet information for DIV elements.
- *
- * Parameters:
- *
- * div - Reference to the DOM node whose size should be maintained.
- * container - Optional Container that contains the div. Default is the
- * window.
- */
-function mxDivResizer(div, container)
-{
- if (div.nodeName.toLowerCase() == 'div')
- {
- if (container == null)
- {
- container = window;
- }
-
- this.div = div;
- var style = mxUtils.getCurrentStyle(div);
-
- if (style != null)
- {
- this.resizeWidth = style.width == 'auto';
- this.resizeHeight = style.height == 'auto';
- }
-
- mxEvent.addListener(container, 'resize',
- mxUtils.bind(this, function(evt)
- {
- if (!this.handlingResize)
- {
- this.handlingResize = true;
- this.resize();
- this.handlingResize = false;
- }
- })
- );
-
- this.resize();
- }
-};
-
-/**
- * Function: resizeWidth
- *
- * Boolean specifying if the width should be updated.
- */
-mxDivResizer.prototype.resizeWidth = true;
-
-/**
- * Function: resizeHeight
- *
- * Boolean specifying if the height should be updated.
- */
-mxDivResizer.prototype.resizeHeight = true;
-
-/**
- * Function: handlingResize
- *
- * Boolean specifying if the width should be updated.
- */
-mxDivResizer.prototype.handlingResize = false;
-
-/**
- * Function: resize
- *
- * Updates the style of the DIV after the window has been resized.
- */
-mxDivResizer.prototype.resize = function()
-{
- var w = this.getDocumentWidth();
- var h = this.getDocumentHeight();
-
- var l = parseInt(this.div.style.left);
- var r = parseInt(this.div.style.right);
- var t = parseInt(this.div.style.top);
- var b = parseInt(this.div.style.bottom);
-
- if (this.resizeWidth &&
- !isNaN(l) &&
- !isNaN(r) &&
- l >= 0 &&
- r >= 0 &&
- w - r - l > 0)
- {
- this.div.style.width = (w - r - l)+'px';
- }
-
- if (this.resizeHeight &&
- !isNaN(t) &&
- !isNaN(b) &&
- t >= 0 &&
- b >= 0 &&
- h - t - b > 0)
- {
- this.div.style.height = (h - t - b)+'px';
- }
-};
-
-/**
- * Function: getDocumentWidth
- *
- * Hook for subclassers to return the width of the document (without
- * scrollbars).
- */
-mxDivResizer.prototype.getDocumentWidth = function()
-{
- return document.body.clientWidth;
-};
-
-/**
- * Function: getDocumentHeight
- *
- * Hook for subclassers to return the height of the document (without
- * scrollbars).
- */
-mxDivResizer.prototype.getDocumentHeight = function()
-{
- return document.body.clientHeight;
-};
diff --git a/src/js/util/mxDragSource.js b/src/js/util/mxDragSource.js
deleted file mode 100644
index d0cafdf..0000000
--- a/src/js/util/mxDragSource.js
+++ /dev/null
@@ -1,594 +0,0 @@
-/**
- * $Id: mxDragSource.js,v 1.14 2012-12-05 21:43:16 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxDragSource
- *
- * Wrapper to create a drag source from a DOM element so that the element can
- * be dragged over a graph and dropped into the graph as a new cell.
- *
- * TODO: Problem is that in the dropHandler the current preview location is
- * not available, so the preview and the dropHandler must match.
- *
- * Constructor: mxDragSource
- *
- * Constructs a new drag source for the given element.
- */
-function mxDragSource(element, dropHandler)
-{
- this.element = element;
- this.dropHandler = dropHandler;
-
- // Handles a drag gesture on the element
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- mxEvent.addListener(element, md, mxUtils.bind(this, this.mouseDown));
-};
-
-/**
- * Variable: element
- *
- * Reference to the DOM node which was made draggable.
- */
-mxDragSource.prototype.element = null;
-
-/**
- * Variable: dropHandler
- *
- * Holds the DOM node that is used to represent the drag preview. If this is
- * null then the source element will be cloned and used for the drag preview.
- */
-mxDragSource.prototype.dropHandler = null;
-
-/**
- * Variable: dragOffset
- *
- * <mxPoint> that specifies the offset of the <dragElement>. Default is null.
- */
-mxDragSource.prototype.dragOffset = null;
-
-/**
- * Variable: dragElement
- *
- * Holds the DOM node that is used to represent the drag preview. If this is
- * null then the source element will be cloned and used for the drag preview.
- */
-mxDragSource.prototype.dragElement = null;
-
-/**
- * Variable: previewElement
- *
- * Optional <mxRectangle> that specifies the unscaled size of the preview.
- */
-mxDragSource.prototype.previewElement = null;
-
-/**
- * Variable: enabled
- *
- * Specifies if this drag source is enabled. Default is true.
- */
-mxDragSource.prototype.enabled = true;
-
-/**
- * Variable: currentGraph
- *
- * Reference to the <mxGraph> that is the current drop target.
- */
-mxDragSource.prototype.currentGraph = null;
-
-/**
- * Variable: currentDropTarget
- *
- * Holds the current drop target under the mouse.
- */
-mxDragSource.prototype.currentDropTarget = null;
-
-/**
- * Variable: currentPoint
- *
- * Holds the current drop location.
- */
-mxDragSource.prototype.currentPoint = null;
-
-/**
- * Variable: currentGuide
- *
- * Holds an <mxGuide> for the <currentGraph> if <dragPreview> is not null.
- */
-mxDragSource.prototype.currentGuide = null;
-
-/**
- * Variable: currentGuide
- *
- * Holds an <mxGuide> for the <currentGraph> if <dragPreview> is not null.
- */
-mxDragSource.prototype.currentHighlight = null;
-
-/**
- * Variable: autoscroll
- *
- * Specifies if the graph should scroll automatically. Default is true.
- */
-mxDragSource.prototype.autoscroll = true;
-
-/**
- * Variable: guidesEnabled
- *
- * Specifies if <mxGuide> should be enabled. Default is true.
- */
-mxDragSource.prototype.guidesEnabled = true;
-
-/**
- * Variable: gridEnabled
- *
- * Specifies if the grid should be allowed. Default is true.
- */
-mxDragSource.prototype.gridEnabled = true;
-
-/**
- * Variable: highlightDropTargets
- *
- * Specifies if drop targets should be highlighted. Default is true.
- */
-mxDragSource.prototype.highlightDropTargets = true;
-
-/**
- * Variable: dragElementZIndex
- *
- * ZIndex for the drag element. Default is 100.
- */
-mxDragSource.prototype.dragElementZIndex = 100;
-
-/**
- * Variable: dragElementOpacity
- *
- * Opacity of the drag element in %. Default is 70.
- */
-mxDragSource.prototype.dragElementOpacity = 70;
-
-/**
- * Function: isEnabled
- *
- * Returns <enabled>.
- */
-mxDragSource.prototype.isEnabled = function()
-{
- return this.enabled;
-};
-
-/**
- * Function: setEnabled
- *
- * Sets <enabled>.
- */
-mxDragSource.prototype.setEnabled = function(value)
-{
- this.enabled = value;
-};
-
-/**
- * Function: isGuidesEnabled
- *
- * Returns <guidesEnabled>.
- */
-mxDragSource.prototype.isGuidesEnabled = function()
-{
- return this.guidesEnabled;
-};
-
-/**
- * Function: setGuidesEnabled
- *
- * Sets <guidesEnabled>.
- */
-mxDragSource.prototype.setGuidesEnabled = function(value)
-{
- this.guidesEnabled = value;
-};
-
-/**
- * Function: isGridEnabled
- *
- * Returns <gridEnabled>.
- */
-mxDragSource.prototype.isGridEnabled = function()
-{
- return this.gridEnabled;
-};
-
-/**
- * Function: setGridEnabled
- *
- * Sets <gridEnabled>.
- */
-mxDragSource.prototype.setGridEnabled = function(value)
-{
- this.gridEnabled = value;
-};
-
-/**
- * Function: getGraphForEvent
- *
- * Returns the graph for the given mouse event. This implementation returns
- * null.
- */
-mxDragSource.prototype.getGraphForEvent = function(evt)
-{
- return null;
-};
-
-/**
- * Function: getDropTarget
- *
- * Returns the drop target for the given graph and coordinates. This
- * implementation uses <mxGraph.getCellAt>.
- */
-mxDragSource.prototype.getDropTarget = function(graph, x, y)
-{
- return graph.getCellAt(x, y);
-};
-
-/**
- * Function: createDragElement
- *
- * Creates and returns a clone of the <dragElementPrototype> or the <element>
- * if the former is not defined.
- */
-mxDragSource.prototype.createDragElement = function(evt)
-{
- return this.element.cloneNode(true);
-};
-
-/**
- * Function: createPreviewElement
- *
- * Creates and returns an element which can be used as a preview in the given
- * graph.
- */
-mxDragSource.prototype.createPreviewElement = function(graph)
-{
- return null;
-};
-
-/**
- * Function: mouseDown
- *
- * Returns the drop target for the given graph and coordinates. This
- * implementation uses <mxGraph.getCellAt>.
- */
-mxDragSource.prototype.mouseDown = function(evt)
-{
- if (this.enabled && !mxEvent.isConsumed(evt) && this.mouseMoveHandler == null)
- {
- this.startDrag(evt);
-
- var mm = (mxClient.IS_TOUCH) ? 'touchmove' : 'mousemove';
- var mu = (mxClient.IS_TOUCH) ? 'touchend' : 'mouseup';
-
- this.mouseMoveHandler = mxUtils.bind(this, this.mouseMove);
- mxEvent.addListener(document, mm, this.mouseMoveHandler);
- this.mouseUpHandler = mxUtils.bind(this, this.mouseUp);
- mxEvent.addListener(document, mu, this.mouseUpHandler);
-
- // Prevents default action (native DnD for images in FF 10)
- // but does not stop event propagation
- mxEvent.consume(evt, true, false);
- }
-};
-
-/**
- * Function: startDrag
- *
- * Creates the <dragElement> using <createDragElement>.
- */
-mxDragSource.prototype.startDrag = function(evt)
-{
- this.dragElement = this.createDragElement(evt);
- this.dragElement.style.position = 'absolute';
- this.dragElement.style.zIndex = this.dragElementZIndex;
- mxUtils.setOpacity(this.dragElement, this.dragElementOpacity);
-};
-
-
-/**
- * Function: stopDrag
- *
- * Removes and destroys the <dragElement>.
- */
-mxDragSource.prototype.stopDrag = function(evt)
-{
- if (this.dragElement != null)
- {
- if (this.dragElement.parentNode != null)
- {
- this.dragElement.parentNode.removeChild(this.dragElement);
- }
-
- this.dragElement = null;
- }
-};
-
-/**
- * Function: graphContainsEvent
- *
- * Returns true if the given graph contains the given event.
- */
-mxDragSource.prototype.graphContainsEvent = function(graph, evt)
-{
- var x = mxEvent.getClientX(evt);
- var y = mxEvent.getClientY(evt);
- var offset = mxUtils.getOffset(graph.container);
- var origin = mxUtils.getScrollOrigin();
-
- // Checks if event is inside the bounds of the graph container
- return x >= offset.x - origin.x && y >= offset.y - origin.y &&
- x <= offset.x - origin.x + graph.container.offsetWidth &&
- y <= offset.y - origin.y + graph.container.offsetHeight;
-};
-
-/**
- * Function: mouseMove
- *
- * Gets the graph for the given event using <getGraphForEvent>, updates the
- * <currentGraph>, calling <dragEnter> and <dragExit> on the new and old graph,
- * respectively, and invokes <dragOver> if <currentGraph> is not null.
- */
-mxDragSource.prototype.mouseMove = function(evt)
-{
- var graph = this.getGraphForEvent(evt);
-
- // Checks if event is inside the bounds of the graph container
- if (graph != null && !this.graphContainsEvent(graph, evt))
- {
- graph = null;
- }
-
- if (graph != this.currentGraph)
- {
- if (this.currentGraph != null)
- {
- this.dragExit(this.currentGraph);
- }
-
- this.currentGraph = graph;
-
- if (this.currentGraph != null)
- {
- this.dragEnter(this.currentGraph);
- }
- }
-
- if (this.currentGraph != null)
- {
- this.dragOver(this.currentGraph, evt);
- }
-
- if (this.dragElement != null && (this.previewElement == null || this.previewElement.style.visibility != 'visible'))
- {
- var x = mxEvent.getClientX(evt);
- var y = mxEvent.getClientY(evt);
-
- if (this.dragElement.parentNode == null)
- {
- document.body.appendChild(this.dragElement);
- }
-
- this.dragElement.style.visibility = 'visible';
-
- if (this.dragOffset != null)
- {
- x += this.dragOffset.x;
- y += this.dragOffset.y;
- }
-
- x += document.body.scrollLeft || document.documentElement.scrollLeft;
- y += document.body.scrollTop || document.documentElement.scrollTop;
- this.dragElement.style.left = x + 'px';
- this.dragElement.style.top = y + 'px';
- }
- else if (this.dragElement != null)
- {
- this.dragElement.style.visibility = 'hidden';
- }
-
- mxEvent.consume(evt);
-};
-
-/**
- * Function: mouseUp
- *
- * Processes the mouse up event and invokes <drop>, <dragExit> and <stopDrag>
- * as required.
- */
-mxDragSource.prototype.mouseUp = function(evt)
-{
- if (this.currentGraph != null)
- {
- if (this.currentPoint != null && (this.previewElement == null ||
- this.previewElement.style.visibility != 'hidden'))
- {
- var scale = this.currentGraph.view.scale;
- var tr = this.currentGraph.view.translate;
- var x = this.currentPoint.x / scale - tr.x;
- var y = this.currentPoint.y / scale - tr.y;
-
- this.drop(this.currentGraph, evt, this.currentDropTarget, x, y);
- }
-
- this.dragExit(this.currentGraph);
- }
-
- this.stopDrag(evt);
-
- this.currentGraph = null;
-
- if (this.mouseMoveHandler != null)
- {
- var mm = (mxClient.IS_TOUCH) ? 'touchmove' : 'mousemove';
- mxEvent.removeListener(document, mm, this.mouseMoveHandler);
- this.mouseMoveHandler = null;
- }
-
- if (this.mouseUpHandler != null)
- {
- var mu = (mxClient.IS_TOUCH) ? 'touchend' : 'mouseup';
- mxEvent.removeListener(document, mu, this.mouseUpHandler);
- this.mouseUpHandler = null;
- }
-
- mxEvent.consume(evt);
-};
-
-/**
- * Function: dragEnter
- *
- * Actives the given graph as a drop target.
- */
-mxDragSource.prototype.dragEnter = function(graph)
-{
- graph.isMouseDown = true;
- this.previewElement = this.createPreviewElement(graph);
-
- // Guide is only needed if preview element is used
- if (this.isGuidesEnabled() && this.previewElement != null)
- {
- this.currentGuide = new mxGuide(graph, graph.graphHandler.getGuideStates());
- }
-
- if (this.highlightDropTargets)
- {
- this.currentHighlight = new mxCellHighlight(graph, mxConstants.DROP_TARGET_COLOR);
- }
-};
-
-/**
- * Function: dragExit
- *
- * Deactivates the given graph as a drop target.
- */
-mxDragSource.prototype.dragExit = function(graph)
-{
- this.currentDropTarget = null;
- this.currentPoint = null;
- graph.isMouseDown = false;
-
- if (this.previewElement != null)
- {
- if (this.previewElement.parentNode != null)
- {
- this.previewElement.parentNode.removeChild(this.previewElement);
- }
-
- this.previewElement = null;
- }
-
- if (this.currentGuide != null)
- {
- this.currentGuide.destroy();
- this.currentGuide = null;
- }
-
- if (this.currentHighlight != null)
- {
- this.currentHighlight.destroy();
- this.currentHighlight = null;
- }
-};
-
-/**
- * Function: dragOver
- *
- * Implements autoscroll, updates the <currentPoint>, highlights any drop
- * targets and updates the preview.
- */
-mxDragSource.prototype.dragOver = function(graph, evt)
-{
- var offset = mxUtils.getOffset(graph.container);
- var origin = mxUtils.getScrollOrigin(graph.container);
- var x = mxEvent.getClientX(evt) - offset.x + origin.x;
- var y = mxEvent.getClientY(evt) - offset.y + origin.y;
-
- if (graph.autoScroll && (this.autoscroll == null || this.autoscroll))
- {
- graph.scrollPointToVisible(x, y, graph.autoExtend);
- }
-
- // Highlights the drop target under the mouse
- if (this.currentHighlight != null && graph.isDropEnabled())
- {
- this.currentDropTarget = this.getDropTarget(graph, x, y);
- var state = graph.getView().getState(this.currentDropTarget);
- this.currentHighlight.highlight(state);
- }
-
- // Updates the location of the preview
- if (this.previewElement != null)
- {
- if (this.previewElement.parentNode == null)
- {
- graph.container.appendChild(this.previewElement);
-
- this.previewElement.style.zIndex = '3';
- this.previewElement.style.position = 'absolute';
- }
-
- var gridEnabled = this.isGridEnabled() && graph.isGridEnabledEvent(evt);
- var hideGuide = true;
-
- // Grid and guides
- if (this.currentGuide != null && this.currentGuide.isEnabledForEvent(evt))
- {
- // LATER: HTML preview appears smaller than SVG preview
- var w = parseInt(this.previewElement.style.width);
- var h = parseInt(this.previewElement.style.height);
- var bounds = new mxRectangle(0, 0, w, h);
- var delta = new mxPoint(x, y);
- delta = this.currentGuide.move(bounds, delta, gridEnabled);
- hideGuide = false;
- x = delta.x;
- y = delta.y;
- }
- else if (gridEnabled)
- {
- var scale = graph.view.scale;
- var tr = graph.view.translate;
- var off = graph.gridSize / 2;
- x = (graph.snap(x / scale - tr.x - off) + tr.x) * scale;
- y = (graph.snap(y / scale - tr.y - off) + tr.y) * scale;
- }
-
- if (this.currentGuide != null && hideGuide)
- {
- this.currentGuide.hide();
- }
-
- if (this.previewOffset != null)
- {
- x += this.previewOffset.x;
- y += this.previewOffset.y;
- }
-
- this.previewElement.style.left = Math.round(x) + 'px';
- this.previewElement.style.top = Math.round(y) + 'px';
- this.previewElement.style.visibility = 'visible';
- }
-
- this.currentPoint = new mxPoint(x, y);
-};
-
-/**
- * Function: drop
- *
- * Returns the drop target for the given graph and coordinates. This
- * implementation uses <mxGraph.getCellAt>.
- */
-mxDragSource.prototype.drop = function(graph, evt, dropTarget, x, y)
-{
- this.dropHandler(graph, evt, dropTarget, x, y);
-
- // Had to move this to after the insert because it will
- // affect the scrollbars of the window in IE to try and
- // make the complete container visible.
- // LATER: Should be made optional.
- graph.container.focus();
-};
diff --git a/src/js/util/mxEffects.js b/src/js/util/mxEffects.js
deleted file mode 100644
index 89d6a71..0000000
--- a/src/js/util/mxEffects.js
+++ /dev/null
@@ -1,214 +0,0 @@
-/**
- * $Id: mxEffects.js,v 1.6 2012-01-04 10:01:16 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-var mxEffects =
-{
-
- /**
- * Class: mxEffects
- *
- * Provides animation effects.
- */
-
- /**
- * Function: animateChanges
- *
- * Asynchronous animated move operation. See also: <mxMorphing>.
- *
- * Example:
- *
- * (code)
- * graph.model.addListener(mxEvent.CHANGE, function(sender, evt)
- * {
- * var changes = evt.getProperty('edit').changes;
- *
- * if (changes.length < 10)
- * {
- * mxEffects.animateChanges(graph, changes);
- * }
- * });
- * (end)
- *
- * Parameters:
- *
- * graph - <mxGraph> that received the changes.
- * changes - Array of changes to be animated.
- * done - Optional function argument that is invoked after the
- * last step of the animation.
- */
- animateChanges: function(graph, changes, done)
- {
- var maxStep = 10;
- var step = 0;
-
- var animate = function()
- {
- var isRequired = false;
-
- for (var i = 0; i < changes.length; i++)
- {
- var change = changes[i];
-
- if (change instanceof mxGeometryChange ||
- change instanceof mxTerminalChange ||
- change instanceof mxValueChange ||
- change instanceof mxChildChange ||
- change instanceof mxStyleChange)
- {
- var state = graph.getView().getState(change.cell || change.child, false);
-
- if (state != null)
- {
- isRequired = true;
-
- if (change.constructor != mxGeometryChange || graph.model.isEdge(change.cell))
- {
- mxUtils.setOpacity(state.shape.node, 100 * step / maxStep);
- }
- else
- {
- var scale = graph.getView().scale;
-
- var dx = (change.geometry.x - change.previous.x) * scale;
- var dy = (change.geometry.y - change.previous.y) * scale;
-
- var sx = (change.geometry.width - change.previous.width) * scale;
- var sy = (change.geometry.height - change.previous.height) * scale;
-
- if (step == 0)
- {
- state.x -= dx;
- state.y -= dy;
- state.width -= sx;
- state.height -= sy;
- }
- else
- {
- state.x += dx / maxStep;
- state.y += dy / maxStep;
- state.width += sx / maxStep;
- state.height += sy / maxStep;
- }
-
- graph.cellRenderer.redraw(state);
-
- // Fades all connected edges and children
- mxEffects.cascadeOpacity(graph, change.cell, 100 * step / maxStep);
- }
- }
- }
- }
-
- // Workaround to force a repaint in AppleWebKit
- mxUtils.repaintGraph(graph, new mxPoint(1, 1));
-
- if (step < maxStep && isRequired)
- {
- step++;
- window.setTimeout(animate, delay);
- }
- else if (done != null)
- {
- done();
- }
- };
-
- var delay = 30;
- animate();
- },
-
- /**
- * Function: cascadeOpacity
- *
- * Sets the opacity on the given cell and its descendants.
- *
- * Parameters:
- *
- * graph - <mxGraph> that contains the cells.
- * cell - <mxCell> to set the opacity for.
- * opacity - New value for the opacity in %.
- */
- cascadeOpacity: function(graph, cell, opacity)
- {
- // Fades all children
- var childCount = graph.model.getChildCount(cell);
-
- for (var i=0; i<childCount; i++)
- {
- var child = graph.model.getChildAt(cell, i);
- var childState = graph.getView().getState(child);
-
- if (childState != null)
- {
- mxUtils.setOpacity(childState.shape.node, opacity);
- mxEffects.cascadeOpacity(graph, child, opacity);
- }
- }
-
- // Fades all connected edges
- var edges = graph.model.getEdges(cell);
-
- if (edges != null)
- {
- for (var i=0; i<edges.length; i++)
- {
- var edgeState = graph.getView().getState(edges[i]);
-
- if (edgeState != null)
- {
- mxUtils.setOpacity(edgeState.shape.node, opacity);
- }
- }
- }
- },
-
- /**
- * Function: fadeOut
- *
- * Asynchronous fade-out operation.
- */
- fadeOut: function(node, from, remove, step, delay, isEnabled)
- {
- step = step || 40;
- delay = delay || 30;
-
- var opacity = from || 100;
-
- mxUtils.setOpacity(node, opacity);
-
- if (isEnabled || isEnabled == null)
- {
- var f = function()
- {
- opacity = Math.max(opacity-step, 0);
- mxUtils.setOpacity(node, opacity);
-
- if (opacity > 0)
- {
- window.setTimeout(f, delay);
- }
- else
- {
- node.style.visibility = 'hidden';
-
- if (remove && node.parentNode)
- {
- node.parentNode.removeChild(node);
- }
- }
- };
- window.setTimeout(f, delay);
- }
- else
- {
- node.style.visibility = 'hidden';
-
- if (remove && node.parentNode)
- {
- node.parentNode.removeChild(node);
- }
- }
- }
-
-};
diff --git a/src/js/util/mxEvent.js b/src/js/util/mxEvent.js
deleted file mode 100644
index f831631..0000000
--- a/src/js/util/mxEvent.js
+++ /dev/null
@@ -1,1175 +0,0 @@
-/**
- * $Id: mxEvent.js,v 1.76 2012-12-07 07:39:03 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-var mxEvent =
-{
-
- /**
- * Class: mxEvent
- *
- * Cross-browser DOM event support. For internal event handling,
- * <mxEventSource> and the graph event dispatch loop in <mxGraph> are used.
- *
- * Memory Leaks:
- *
- * Use this class for adding and removing listeners to/from DOM nodes. The
- * <removeAllListeners> function is provided to remove all listeners that
- * have been added using <addListener>. The function should be invoked when
- * the last reference is removed in the JavaScript code, typically when the
- * referenced DOM node is removed from the DOM, and helps to reduce memory
- * leaks in IE6.
- *
- * Variable: objects
- *
- * Contains all objects where any listener was added using <addListener>.
- * This is used to reduce memory leaks in IE, see <mxClient.dispose>.
- */
- objects: [],
-
- /**
- * Function: addListener
- *
- * Binds the function to the specified event on the given element. Use
- * <mxUtils.bind> in order to bind the "this" keyword inside the function
- * to a given execution scope.
- */
- addListener: function()
- {
- var updateListenerList = function(element, eventName, funct)
- {
- if (element.mxListenerList == null)
- {
- element.mxListenerList = [];
- mxEvent.objects.push(element);
- }
-
- var entry = {name: eventName, f: funct};
- element.mxListenerList.push(entry);
- };
-
- if (window.addEventListener)
- {
- return function(element, eventName, funct)
- {
- element.addEventListener(eventName, funct, false);
- updateListenerList(element, eventName, funct);
- };
- }
- else
- {
- return function(element, eventName, funct)
- {
- element.attachEvent('on' + eventName, funct);
- updateListenerList(element, eventName, funct);
- };
- }
- }(),
-
- /**
- * Function: removeListener
- *
- * Removes the specified listener from the given element.
- */
- removeListener: function()
- {
- var updateListener = function(element, eventName, funct)
- {
- if (element.mxListenerList != null)
- {
- var listenerCount = element.mxListenerList.length;
-
- for (var i=0; i<listenerCount; i++)
- {
- var entry = element.mxListenerList[i];
-
- if (entry.f == funct)
- {
- element.mxListenerList.splice(i, 1);
- break;
- }
- }
-
- if (element.mxListenerList.length == 0)
- {
- element.mxListenerList = null;
- }
- }
- };
-
- if (window.removeEventListener)
- {
- return function(element, eventName, funct)
- {
- element.removeEventListener(eventName, funct, false);
- updateListener(element, eventName, funct);
- };
- }
- else
- {
- return function(element, eventName, funct)
- {
- element.detachEvent('on' + eventName, funct);
- updateListener(element, eventName, funct);
- };
- }
- }(),
-
- /**
- * Function: removeAllListeners
- *
- * Removes all listeners from the given element.
- */
- removeAllListeners: function(element)
- {
- var list = element.mxListenerList;
-
- if (list != null)
- {
- while (list.length > 0)
- {
- var entry = list[0];
- mxEvent.removeListener(element, entry.name, entry.f);
- }
- }
- },
-
- /**
- * Function: redirectMouseEvents
- *
- * Redirects the mouse events from the given DOM node to the graph dispatch
- * loop using the event and given state as event arguments. State can
- * either be an instance of <mxCellState> or a function that returns an
- * <mxCellState>. The down, move, up and dblClick arguments are optional
- * functions that take the trigger event as arguments and replace the
- * default behaviour.
- */
- redirectMouseEvents: function(node, graph, state, down, move, up, dblClick)
- {
- var getState = function(evt)
- {
- return (typeof(state) == 'function') ? state(evt) : state;
- };
-
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- var mm = (mxClient.IS_TOUCH) ? 'touchmove' : 'mousemove';
- var mu = (mxClient.IS_TOUCH) ? 'touchend' : 'mouseup';
-
- mxEvent.addListener(node, md, function (evt)
- {
- if (down != null)
- {
- down(evt);
- }
- else if (!mxEvent.isConsumed(evt))
- {
- graph.fireMouseEvent(mxEvent.MOUSE_DOWN,
- new mxMouseEvent(evt, getState(evt)));
- }
- });
-
- mxEvent.addListener(node, mm, function (evt)
- {
- if (move != null)
- {
- move(evt);
- }
- else if (!mxEvent.isConsumed(evt))
- {
- graph.fireMouseEvent(mxEvent.MOUSE_MOVE,
- new mxMouseEvent(evt, getState(evt)));
- }
- });
-
- mxEvent.addListener(node, mu, function (evt)
- {
- if (up != null)
- {
- up(evt);
- }
- else if (!mxEvent.isConsumed(evt))
- {
- graph.fireMouseEvent(mxEvent.MOUSE_UP,
- new mxMouseEvent(evt, getState(evt)));
- }
- });
-
- mxEvent.addListener(node, 'dblclick', function (evt)
- {
- if (dblClick != null)
- {
- dblClick(evt);
- }
- else if (!mxEvent.isConsumed(evt))
- {
- var tmp = getState(evt);
- graph.dblClick(evt, (tmp != null) ? tmp.cell : null);
- }
- });
- },
-
- /**
- * Function: release
- *
- * Removes the known listeners from the given DOM node and its descendants.
- *
- * Parameters:
- *
- * element - DOM node to remove the listeners from.
- */
- release: function(element)
- {
- if (element != null)
- {
- mxEvent.removeAllListeners(element);
-
- var children = element.childNodes;
-
- if (children != null)
- {
- var childCount = children.length;
-
- for (var i = 0; i < childCount; i += 1)
- {
- mxEvent.release(children[i]);
- }
- }
- }
- },
-
- /**
- * Function: addMouseWheelListener
- *
- * Installs the given function as a handler for mouse wheel events. The
- * function has two arguments: the mouse event and a boolean that specifies
- * if the wheel was moved up or down.
- *
- * This has been tested with IE 6 and 7, Firefox (all versions), Opera and
- * Safari. It does currently not work on Safari for Mac.
- *
- * Example:
- *
- * (code)
- * mxEvent.addMouseWheelListener(function (evt, up)
- * {
- * mxLog.show();
- * mxLog.debug('mouseWheel: up='+up);
- * });
- *(end)
- *
- * Parameters:
- *
- * funct - Handler function that takes the event argument and a boolean up
- * argument for the mousewheel direction.
- */
- addMouseWheelListener: function(funct)
- {
- if (funct != null)
- {
- var wheelHandler = function(evt)
- {
- // IE does not give an event object but the
- // global event object is the mousewheel event
- // at this point in time.
- if (evt == null)
- {
- evt = window.event;
- }
-
- var delta = 0;
-
- if (mxClient.IS_NS && !mxClient.IS_SF && !mxClient.IS_GC)
- {
- delta = -evt.detail/2;
- }
- else
- {
- delta = evt.wheelDelta/120;
- }
-
- // Handles the event using the given function
- if (delta != 0)
- {
- funct(evt, delta > 0);
- }
- };
-
- // Webkit has NS event API, but IE event name and details
- if (mxClient.IS_NS)
- {
- var eventName = (mxClient.IS_SF || mxClient.IS_GC) ?
- 'mousewheel' : 'DOMMouseScroll';
- mxEvent.addListener(window, eventName, wheelHandler);
- }
- else
- {
- // TODO: Does not work with Safari and Chrome but it should be
- // working as tested in etc/markup/wheel.html
- mxEvent.addListener(document, 'mousewheel', wheelHandler);
- }
- }
- },
-
- /**
- * Function: disableContextMenu
- *
- * Disables the context menu for the given element.
- */
- disableContextMenu: function()
- {
- if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9))
- {
- return function(element)
- {
- mxEvent.addListener(element, 'contextmenu', function()
- {
- return false;
- });
- };
- }
- else
- {
- return function(element)
- {
- element.setAttribute('oncontextmenu', 'return false;');
- };
- }
- }(),
-
- /**
- * Function: getSource
- *
- * Returns the event's target or srcElement depending on the browser.
- */
- getSource: function(evt)
- {
- return (evt.srcElement != null) ? evt.srcElement : evt.target;
- },
-
- /**
- * Function: isConsumed
- *
- * Returns true if the event has been consumed using <consume>.
- */
- isConsumed: function(evt)
- {
- return evt.isConsumed != null && evt.isConsumed;
- },
-
- /**
- * Function: isLeftMouseButton
- *
- * Returns true if the left mouse button is pressed for the given event.
- * To check if a button is pressed during a mouseMove you should use the
- * <mxGraph.isMouseDown> property.
- */
- isLeftMouseButton: function(evt)
- {
- return evt.button == ((mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9)) ? 1 : 0);
- },
-
- /**
- * Function: isRightMouseButton
- *
- * Returns true if the right mouse button was pressed. Note that this
- * button might not be available on some systems. For handling a popup
- * trigger <isPopupTrigger> should be used.
- */
- isRightMouseButton: function(evt)
- {
- return evt.button == 2;
- },
-
- /**
- * Function: isPopupTrigger
- *
- * Returns true if the event is a popup trigger. This implementation
- * returns true if the right mouse button or shift was pressed.
- */
- isPopupTrigger: function(evt)
- {
- return mxEvent.isRightMouseButton(evt) ||
- (mxEvent.isShiftDown(evt) &&
- !mxEvent.isControlDown(evt));
- },
-
- /**
- * Function: isShiftDown
- *
- * Returns true if the shift key is pressed for the given event.
- */
- isShiftDown: function(evt)
- {
- return (evt != null) ? evt.shiftKey : false;
- },
-
- /**
- * Function: isAltDown
- *
- * Returns true if the alt key is pressed for the given event.
- */
- isAltDown: function(evt)
- {
- return (evt != null) ? evt.altKey : false;
- },
-
- /**
- * Function: isControlDown
- *
- * Returns true if the control key is pressed for the given event.
- */
- isControlDown: function(evt)
- {
- return (evt != null) ? evt.ctrlKey : false;
- },
-
- /**
- * Function: isMetaDown
- *
- * Returns true if the meta key is pressed for the given event.
- */
- isMetaDown: function(evt)
- {
- return (evt != null) ? evt.metaKey : false;
- },
-
- /**
- * Function: getMainEvent
- *
- * Returns the touch or mouse event that contains the mouse coordinates.
- */
- getMainEvent: function(e)
- {
- if ((e.type == 'touchstart' || e.type == 'touchmove') &&
- e.touches != null && e.touches[0] != null)
- {
- e = e.touches[0];
- }
- else if (e.type == 'touchend' && e.changedTouches != null &&
- e.changedTouches[0] != null)
- {
- e = e.changedTouches[0];
- }
-
- return e;
- },
-
- /**
- * Function: getClientX
- *
- * Returns true if the meta key is pressed for the given event.
- */
- getClientX: function(e)
- {
- return mxEvent.getMainEvent(e).clientX;
- },
-
- /**
- * Function: getClientY
- *
- * Returns true if the meta key is pressed for the given event.
- */
- getClientY: function(e)
- {
- return mxEvent.getMainEvent(e).clientY;
- },
-
- /**
- * Function: consume
- *
- * Consumes the given event.
- *
- * Parameters:
- *
- * evt - Native event to be consumed.
- * preventDefault - Optional boolean to prevent the default for the event.
- * Default is true.
- * stopPropagation - Option boolean to stop event propagation. Default is
- * true.
- */
- consume: function(evt, preventDefault, stopPropagation)
- {
- preventDefault = (preventDefault != null) ? preventDefault : true;
- stopPropagation = (stopPropagation != null) ? stopPropagation : true;
-
- if (preventDefault)
- {
- if (evt.preventDefault)
- {
- if (stopPropagation)
- {
- evt.stopPropagation();
- }
-
- evt.preventDefault();
- }
- else if (stopPropagation)
- {
- evt.cancelBubble = true;
- }
- }
-
- // Opera
- evt.isConsumed = true;
-
- // Other browsers
- evt.returnValue = false;
- },
-
- //
- // Special handles in mouse events
- //
-
- /**
- * Variable: LABEL_HANDLE
- *
- * Index for the label handle in an mxMouseEvent. This should be a negative
- * value that does not interfere with any possible handle indices. Default
- * is -1.
- */
- LABEL_HANDLE: -1,
-
- /**
- * Variable: ROTATION_HANDLE
- *
- * Index for the rotation handle in an mxMouseEvent. This should be a
- * negative value that does not interfere with any possible handle indices.
- * Default is -2.
- */
- ROTATION_HANDLE: -2,
-
- //
- // Event names
- //
-
- /**
- * Variable: MOUSE_DOWN
- *
- * Specifies the event name for mouseDown.
- */
- MOUSE_DOWN: 'mouseDown',
-
- /**
- * Variable: MOUSE_MOVE
- *
- * Specifies the event name for mouseMove.
- */
- MOUSE_MOVE: 'mouseMove',
-
- /**
- * Variable: MOUSE_UP
- *
- * Specifies the event name for mouseUp.
- */
- MOUSE_UP: 'mouseUp',
-
- /**
- * Variable: ACTIVATE
- *
- * Specifies the event name for activate.
- */
- ACTIVATE: 'activate',
-
- /**
- * Variable: RESIZE_START
- *
- * Specifies the event name for resizeStart.
- */
- RESIZE_START: 'resizeStart',
-
- /**
- * Variable: RESIZE
- *
- * Specifies the event name for resize.
- */
- RESIZE: 'resize',
-
- /**
- * Variable: RESIZE_END
- *
- * Specifies the event name for resizeEnd.
- */
- RESIZE_END: 'resizeEnd',
-
- /**
- * Variable: MOVE_START
- *
- * Specifies the event name for moveStart.
- */
- MOVE_START: 'moveStart',
-
- /**
- * Variable: MOVE
- *
- * Specifies the event name for move.
- */
- MOVE: 'move',
-
- /**
- * Variable: MOVE_END
- *
- * Specifies the event name for moveEnd.
- */
- MOVE_END: 'moveEnd',
-
- /**
- * Variable: PAN_START
- *
- * Specifies the event name for panStart.
- */
- PAN_START: 'panStart',
-
- /**
- * Variable: PAN
- *
- * Specifies the event name for pan.
- */
- PAN: 'pan',
-
- /**
- * Variable: PAN_END
- *
- * Specifies the event name for panEnd.
- */
- PAN_END: 'panEnd',
-
- /**
- * Variable: MINIMIZE
- *
- * Specifies the event name for minimize.
- */
- MINIMIZE: 'minimize',
-
- /**
- * Variable: NORMALIZE
- *
- * Specifies the event name for normalize.
- */
- NORMALIZE: 'normalize',
-
- /**
- * Variable: MAXIMIZE
- *
- * Specifies the event name for maximize.
- */
- MAXIMIZE: 'maximize',
-
- /**
- * Variable: HIDE
- *
- * Specifies the event name for hide.
- */
- HIDE: 'hide',
-
- /**
- * Variable: SHOW
- *
- * Specifies the event name for show.
- */
- SHOW: 'show',
-
- /**
- * Variable: CLOSE
- *
- * Specifies the event name for close.
- */
- CLOSE: 'close',
-
- /**
- * Variable: DESTROY
- *
- * Specifies the event name for destroy.
- */
- DESTROY: 'destroy',
-
- /**
- * Variable: REFRESH
- *
- * Specifies the event name for refresh.
- */
- REFRESH: 'refresh',
-
- /**
- * Variable: SIZE
- *
- * Specifies the event name for size.
- */
- SIZE: 'size',
-
- /**
- * Variable: SELECT
- *
- * Specifies the event name for select.
- */
- SELECT: 'select',
-
- /**
- * Variable: FIRED
- *
- * Specifies the event name for fired.
- */
- FIRED: 'fired',
-
- /**
- * Variable: GET
- *
- * Specifies the event name for get.
- */
- GET: 'get',
-
- /**
- * Variable: RECEIVE
- *
- * Specifies the event name for receive.
- */
- RECEIVE: 'receive',
-
- /**
- * Variable: CONNECT
- *
- * Specifies the event name for connect.
- */
- CONNECT: 'connect',
-
- /**
- * Variable: DISCONNECT
- *
- * Specifies the event name for disconnect.
- */
- DISCONNECT: 'disconnect',
-
- /**
- * Variable: SUSPEND
- *
- * Specifies the event name for suspend.
- */
- SUSPEND: 'suspend',
-
- /**
- * Variable: RESUME
- *
- * Specifies the event name for suspend.
- */
- RESUME: 'resume',
-
- /**
- * Variable: MARK
- *
- * Specifies the event name for mark.
- */
- MARK: 'mark',
-
- /**
- * Variable: SESSION
- *
- * Specifies the event name for session.
- */
- SESSION: 'session',
-
- /**
- * Variable: ROOT
- *
- * Specifies the event name for root.
- */
- ROOT: 'root',
-
- /**
- * Variable: POST
- *
- * Specifies the event name for post.
- */
- POST: 'post',
-
- /**
- * Variable: OPEN
- *
- * Specifies the event name for open.
- */
- OPEN: 'open',
-
- /**
- * Variable: SAVE
- *
- * Specifies the event name for open.
- */
- SAVE: 'save',
-
- /**
- * Variable: BEFORE_ADD_VERTEX
- *
- * Specifies the event name for beforeAddVertex.
- */
- BEFORE_ADD_VERTEX: 'beforeAddVertex',
-
- /**
- * Variable: ADD_VERTEX
- *
- * Specifies the event name for addVertex.
- */
- ADD_VERTEX: 'addVertex',
-
- /**
- * Variable: AFTER_ADD_VERTEX
- *
- * Specifies the event name for afterAddVertex.
- */
- AFTER_ADD_VERTEX: 'afterAddVertex',
-
- /**
- * Variable: DONE
- *
- * Specifies the event name for done.
- */
- DONE: 'done',
-
- /**
- * Variable: EXECUTE
- *
- * Specifies the event name for execute.
- */
- EXECUTE: 'execute',
-
- /**
- * Variable: BEGIN_UPDATE
- *
- * Specifies the event name for beginUpdate.
- */
- BEGIN_UPDATE: 'beginUpdate',
-
- /**
- * Variable: END_UPDATE
- *
- * Specifies the event name for endUpdate.
- */
- END_UPDATE: 'endUpdate',
-
- /**
- * Variable: BEFORE_UNDO
- *
- * Specifies the event name for beforeUndo.
- */
- BEFORE_UNDO: 'beforeUndo',
-
- /**
- * Variable: UNDO
- *
- * Specifies the event name for undo.
- */
- UNDO: 'undo',
-
- /**
- * Variable: REDO
- *
- * Specifies the event name for redo.
- */
- REDO: 'redo',
-
- /**
- * Variable: CHANGE
- *
- * Specifies the event name for change.
- */
- CHANGE: 'change',
-
- /**
- * Variable: NOTIFY
- *
- * Specifies the event name for notify.
- */
- NOTIFY: 'notify',
-
- /**
- * Variable: LAYOUT_CELLS
- *
- * Specifies the event name for layoutCells.
- */
- LAYOUT_CELLS: 'layoutCells',
-
- /**
- * Variable: CLICK
- *
- * Specifies the event name for click.
- */
- CLICK: 'click',
-
- /**
- * Variable: SCALE
- *
- * Specifies the event name for scale.
- */
- SCALE: 'scale',
-
- /**
- * Variable: TRANSLATE
- *
- * Specifies the event name for translate.
- */
- TRANSLATE: 'translate',
-
- /**
- * Variable: SCALE_AND_TRANSLATE
- *
- * Specifies the event name for scaleAndTranslate.
- */
- SCALE_AND_TRANSLATE: 'scaleAndTranslate',
-
- /**
- * Variable: UP
- *
- * Specifies the event name for up.
- */
- UP: 'up',
-
- /**
- * Variable: DOWN
- *
- * Specifies the event name for down.
- */
- DOWN: 'down',
-
- /**
- * Variable: ADD
- *
- * Specifies the event name for add.
- */
- ADD: 'add',
-
- /**
- * Variable: REMOVE
- *
- * Specifies the event name for remove.
- */
- REMOVE: 'remove',
-
- /**
- * Variable: CLEAR
- *
- * Specifies the event name for clear.
- */
- CLEAR: 'clear',
-
- /**
- * Variable: ADD_CELLS
- *
- * Specifies the event name for addCells.
- */
- ADD_CELLS: 'addCells',
-
- /**
- * Variable: CELLS_ADDED
- *
- * Specifies the event name for cellsAdded.
- */
- CELLS_ADDED: 'cellsAdded',
-
- /**
- * Variable: MOVE_CELLS
- *
- * Specifies the event name for moveCells.
- */
- MOVE_CELLS: 'moveCells',
-
- /**
- * Variable: CELLS_MOVED
- *
- * Specifies the event name for cellsMoved.
- */
- CELLS_MOVED: 'cellsMoved',
-
- /**
- * Variable: RESIZE_CELLS
- *
- * Specifies the event name for resizeCells.
- */
- RESIZE_CELLS: 'resizeCells',
-
- /**
- * Variable: CELLS_RESIZED
- *
- * Specifies the event name for cellsResized.
- */
- CELLS_RESIZED: 'cellsResized',
-
- /**
- * Variable: TOGGLE_CELLS
- *
- * Specifies the event name for toggleCells.
- */
- TOGGLE_CELLS: 'toggleCells',
-
- /**
- * Variable: CELLS_TOGGLED
- *
- * Specifies the event name for cellsToggled.
- */
- CELLS_TOGGLED: 'cellsToggled',
-
- /**
- * Variable: ORDER_CELLS
- *
- * Specifies the event name for orderCells.
- */
- ORDER_CELLS: 'orderCells',
-
- /**
- * Variable: CELLS_ORDERED
- *
- * Specifies the event name for cellsOrdered.
- */
- CELLS_ORDERED: 'cellsOrdered',
-
- /**
- * Variable: REMOVE_CELLS
- *
- * Specifies the event name for removeCells.
- */
- REMOVE_CELLS: 'removeCells',
-
- /**
- * Variable: CELLS_REMOVED
- *
- * Specifies the event name for cellsRemoved.
- */
- CELLS_REMOVED: 'cellsRemoved',
-
- /**
- * Variable: GROUP_CELLS
- *
- * Specifies the event name for groupCells.
- */
- GROUP_CELLS: 'groupCells',
-
- /**
- * Variable: UNGROUP_CELLS
- *
- * Specifies the event name for ungroupCells.
- */
- UNGROUP_CELLS: 'ungroupCells',
-
- /**
- * Variable: REMOVE_CELLS_FROM_PARENT
- *
- * Specifies the event name for removeCellsFromParent.
- */
- REMOVE_CELLS_FROM_PARENT: 'removeCellsFromParent',
-
- /**
- * Variable: FOLD_CELLS
- *
- * Specifies the event name for foldCells.
- */
- FOLD_CELLS: 'foldCells',
-
- /**
- * Variable: CELLS_FOLDED
- *
- * Specifies the event name for cellsFolded.
- */
- CELLS_FOLDED: 'cellsFolded',
-
- /**
- * Variable: ALIGN_CELLS
- *
- * Specifies the event name for alignCells.
- */
- ALIGN_CELLS: 'alignCells',
-
- /**
- * Variable: LABEL_CHANGED
- *
- * Specifies the event name for labelChanged.
- */
- LABEL_CHANGED: 'labelChanged',
-
- /**
- * Variable: CONNECT_CELL
- *
- * Specifies the event name for connectCell.
- */
- CONNECT_CELL: 'connectCell',
-
- /**
- * Variable: CELL_CONNECTED
- *
- * Specifies the event name for cellConnected.
- */
- CELL_CONNECTED: 'cellConnected',
-
- /**
- * Variable: SPLIT_EDGE
- *
- * Specifies the event name for splitEdge.
- */
- SPLIT_EDGE: 'splitEdge',
-
- /**
- * Variable: FLIP_EDGE
- *
- * Specifies the event name for flipEdge.
- */
- FLIP_EDGE: 'flipEdge',
-
- /**
- * Variable: START_EDITING
- *
- * Specifies the event name for startEditing.
- */
- START_EDITING: 'startEditing',
-
- /**
- * Variable: ADD_OVERLAY
- *
- * Specifies the event name for addOverlay.
- */
- ADD_OVERLAY: 'addOverlay',
-
- /**
- * Variable: REMOVE_OVERLAY
- *
- * Specifies the event name for removeOverlay.
- */
- REMOVE_OVERLAY: 'removeOverlay',
-
- /**
- * Variable: UPDATE_CELL_SIZE
- *
- * Specifies the event name for updateCellSize.
- */
- UPDATE_CELL_SIZE: 'updateCellSize',
-
- /**
- * Variable: ESCAPE
- *
- * Specifies the event name for escape.
- */
- ESCAPE: 'escape',
-
- /**
- * Variable: CLICK
- *
- * Specifies the event name for click.
- */
- CLICK: 'click',
-
- /**
- * Variable: DOUBLE_CLICK
- *
- * Specifies the event name for doubleClick.
- */
- DOUBLE_CLICK: 'doubleClick',
-
- /**
- * Variable: START
- *
- * Specifies the event name for start.
- */
- START: 'start',
-
- /**
- * Variable: RESET
- *
- * Specifies the event name for reset.
- */
- RESET: 'reset'
-
-};
diff --git a/src/js/util/mxEventObject.js b/src/js/util/mxEventObject.js
deleted file mode 100644
index cb08a55..0000000
--- a/src/js/util/mxEventObject.js
+++ /dev/null
@@ -1,111 +0,0 @@
-/**
- * $Id: mxEventObject.js,v 1.11 2011-09-09 10:29:05 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxEventObject
- *
- * The mxEventObject is a wrapper for all properties of a single event.
- * Additionally, it also offers functions to consume the event and check if it
- * was consumed as follows:
- *
- * (code)
- * evt.consume();
- * INV: evt.isConsumed() == true
- * (end)
- *
- * Constructor: mxEventObject
- *
- * Constructs a new event object with the specified name. An optional
- * sequence of key, value pairs can be appended to define properties.
- *
- * Example:
- *
- * (code)
- * new mxEventObject("eventName", key1, val1, .., keyN, valN)
- * (end)
- */
-function mxEventObject(name)
-{
- this.name = name;
- this.properties = [];
-
- for (var i = 1; i < arguments.length; i += 2)
- {
- if (arguments[i + 1] != null)
- {
- this.properties[arguments[i]] = arguments[i + 1];
- }
- }
-};
-
-/**
- * Variable: name
- *
- * Holds the name.
- */
-mxEventObject.prototype.name = null;
-
-/**
- * Variable: properties
- *
- * Holds the properties as an associative array.
- */
-mxEventObject.prototype.properties = null;
-
-/**
- * Variable: consumed
- *
- * Holds the consumed state. Default is false.
- */
-mxEventObject.prototype.consumed = false;
-
-/**
- * Function: getName
- *
- * Returns <name>.
- */
-mxEventObject.prototype.getName = function()
-{
- return this.name;
-};
-
-/**
- * Function: getProperties
- *
- * Returns <properties>.
- */
-mxEventObject.prototype.getProperties = function()
-{
- return this.properties;
-};
-
-/**
- * Function: getProperty
- *
- * Returns the property for the given key.
- */
-mxEventObject.prototype.getProperty = function(key)
-{
- return this.properties[key];
-};
-
-/**
- * Function: isConsumed
- *
- * Returns true if the event has been consumed.
- */
-mxEventObject.prototype.isConsumed = function()
-{
- return this.consumed;
-};
-
-/**
- * Function: consume
- *
- * Consumes the event.
- */
-mxEventObject.prototype.consume = function()
-{
- this.consumed = true;
-};
diff --git a/src/js/util/mxEventSource.js b/src/js/util/mxEventSource.js
deleted file mode 100644
index 595f560..0000000
--- a/src/js/util/mxEventSource.js
+++ /dev/null
@@ -1,191 +0,0 @@
-/**
- * $Id: mxEventSource.js,v 1.25 2012-04-16 10:54:20 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxEventSource
- *
- * Base class for objects that dispatch named events. To create a subclass that
- * inherits from mxEventSource, the following code is used.
- *
- * (code)
- * function MyClass() { };
- *
- * MyClass.prototype = new mxEventSource();
- * MyClass.prototype.constructor = MyClass;
- * (end)
- *
- * Known Subclasses:
- *
- * <mxGraphModel>, <mxGraph>, <mxGraphView>, <mxEditor>, <mxCellOverlay>,
- * <mxToolbar>, <mxWindow>
- *
- * Constructor: mxEventSource
- *
- * Constructs a new event source.
- */
-function mxEventSource(eventSource)
-{
- this.setEventSource(eventSource);
-};
-
-/**
- * Variable: eventListeners
- *
- * Holds the event names and associated listeners in an array. The array
- * contains the event name followed by the respective listener for each
- * registered listener.
- */
-mxEventSource.prototype.eventListeners = null;
-
-/**
- * Variable: eventsEnabled
- *
- * Specifies if events can be fired. Default is true.
- */
-mxEventSource.prototype.eventsEnabled = true;
-
-/**
- * Variable: eventSource
- *
- * Optional source for events. Default is null.
- */
-mxEventSource.prototype.eventSource = null;
-
-/**
- * Function: isEventsEnabled
- *
- * Returns <eventsEnabled>.
- */
-mxEventSource.prototype.isEventsEnabled = function()
-{
- return this.eventsEnabled;
-};
-
-/**
- * Function: setEventsEnabled
- *
- * Sets <eventsEnabled>.
- */
-mxEventSource.prototype.setEventsEnabled = function(value)
-{
- this.eventsEnabled = value;
-};
-
-/**
- * Function: getEventSource
- *
- * Returns <eventSource>.
- */
-mxEventSource.prototype.getEventSource = function()
-{
- return this.eventSource;
-};
-
-/**
- * Function: setEventSource
- *
- * Sets <eventSource>.
- */
-mxEventSource.prototype.setEventSource = function(value)
-{
- this.eventSource = value;
-};
-
-/**
- * Function: addListener
- *
- * Binds the specified function to the given event name. If no event name
- * is given, then the listener is registered for all events.
- *
- * The parameters of the listener are the sender and an <mxEventObject>.
- */
-mxEventSource.prototype.addListener = function(name, funct)
-{
- if (this.eventListeners == null)
- {
- this.eventListeners = [];
- }
-
- this.eventListeners.push(name);
- this.eventListeners.push(funct);
-};
-
-/**
- * Function: removeListener
- *
- * Removes all occurrences of the given listener from <eventListeners>.
- */
-mxEventSource.prototype.removeListener = function(funct)
-{
- if (this.eventListeners != null)
- {
- var i = 0;
-
- while (i < this.eventListeners.length)
- {
- if (this.eventListeners[i+1] == funct)
- {
- this.eventListeners.splice(i, 2);
- }
- else
- {
- i += 2;
- }
- }
- }
-};
-
-/**
- * Function: fireEvent
- *
- * Dispatches the given event to the listeners which are registered for
- * the event. The sender argument is optional. The current execution scope
- * ("this") is used for the listener invocation (see <mxUtils.bind>).
- *
- * Example:
- *
- * (code)
- * fireEvent(new mxEventObject("eventName", key1, val1, .., keyN, valN))
- * (end)
- *
- * Parameters:
- *
- * evt - <mxEventObject> that represents the event.
- * sender - Optional sender to be passed to the listener. Default value is
- * the return value of <getEventSource>.
- */
-mxEventSource.prototype.fireEvent = function(evt, sender)
-{
- if (this.eventListeners != null &&
- this.isEventsEnabled())
- {
- if (evt == null)
- {
- evt = new mxEventObject();
- }
-
- if (sender == null)
- {
- sender = this.getEventSource();
- }
-
- if (sender == null)
- {
- sender = this;
- }
-
- var args = [sender, evt];
-
- for (var i = 0; i < this.eventListeners.length; i += 2)
- {
- var listen = this.eventListeners[i];
-
- if (listen == null ||
- listen == evt.getName())
- {
- this.eventListeners[i+1].apply(this, args);
- }
- }
- }
-};
diff --git a/src/js/util/mxForm.js b/src/js/util/mxForm.js
deleted file mode 100644
index bcee299..0000000
--- a/src/js/util/mxForm.js
+++ /dev/null
@@ -1,202 +0,0 @@
-/**
- * $Id: mxForm.js,v 1.16 2010-10-08 04:21:45 david Exp $
- * Copyright (c) 2006-2010, Gaudenz Alder, David Benson
- */
-/**
- * Class: mxForm
- *
- * A simple class for creating HTML forms.
- *
- * Constructor: mxForm
- *
- * Creates a HTML table using the specified classname.
- */
-function mxForm(className)
-{
- this.table = document.createElement('table');
- this.table.className = className;
- this.body = document.createElement('tbody');
-
- this.table.appendChild(this.body);
-};
-
-/**
- * Variable: table
- *
- * Holds the DOM node that represents the table.
- */
-mxForm.prototype.table = null;
-
-/**
- * Variable: body
- *
- * Holds the DOM node that represents the tbody (table body). New rows
- * can be added to this object using DOM API.
- */
-mxForm.prototype.body = false;
-
-/**
- * Function: getTable
- *
- * Returns the table that contains this form.
- */
-mxForm.prototype.getTable = function()
-{
- return this.table;
-};
-
-/**
- * Function: addButtons
- *
- * Helper method to add an OK and Cancel button using the respective
- * functions.
- */
-mxForm.prototype.addButtons = function(okFunct, cancelFunct)
-{
- var tr = document.createElement('tr');
- var td = document.createElement('td');
- tr.appendChild(td);
- td = document.createElement('td');
-
- // Adds the ok button
- var button = document.createElement('button');
- mxUtils.write(button, mxResources.get('ok') || 'OK');
- td.appendChild(button);
-
- mxEvent.addListener(button, 'click', function()
- {
- okFunct();
- });
-
- // Adds the cancel button
- button = document.createElement('button');
- mxUtils.write(button, mxResources.get('cancel') || 'Cancel');
- td.appendChild(button);
-
- mxEvent.addListener(button, 'click', function()
- {
- cancelFunct();
- });
-
- tr.appendChild(td);
- this.body.appendChild(tr);
-};
-
-/**
- * Function: addText
- *
- * Adds a textfield for the given name and value and returns the textfield.
- */
-mxForm.prototype.addText = function(name, value)
-{
- var input = document.createElement('input');
-
- input.setAttribute('type', 'text');
- input.value = value;
-
- return this.addField(name, input);
-};
-
-/**
- * Function: addCheckbox
- *
- * Adds a checkbox for the given name and value and returns the textfield.
- */
-mxForm.prototype.addCheckbox = function(name, value)
-{
- var input = document.createElement('input');
-
- input.setAttribute('type', 'checkbox');
- this.addField(name, input);
-
- // IE can only change the checked value if the input is inside the DOM
- if (value)
- {
- input.checked = true;
- }
-
- return input;
-};
-
-/**
- * Function: addTextarea
- *
- * Adds a textarea for the given name and value and returns the textarea.
- */
-mxForm.prototype.addTextarea = function(name, value, rows)
-{
- var input = document.createElement('textarea');
-
- if (mxClient.IS_NS)
- {
- rows--;
- }
-
- input.setAttribute('rows', rows || 2);
- input.value = value;
-
- return this.addField(name, input);
-};
-
-/**
- * Function: addCombo
- *
- * Adds a combo for the given name and returns the combo.
- */
-mxForm.prototype.addCombo = function(name, isMultiSelect, size)
-{
- var select = document.createElement('select');
-
- if (size != null)
- {
- select.setAttribute('size', size);
- }
-
- if (isMultiSelect)
- {
- select.setAttribute('multiple', 'true');
- }
-
- return this.addField(name, select);
-};
-
-/**
- * Function: addOption
- *
- * Adds an option for the given label to the specified combo.
- */
-mxForm.prototype.addOption = function(combo, label, value, isSelected)
-{
- var option = document.createElement('option');
-
- mxUtils.writeln(option, label);
- option.setAttribute('value', value);
-
- if (isSelected)
- {
- option.setAttribute('selected', isSelected);
- }
-
- combo.appendChild(option);
-};
-
-/**
- * Function: addField
- *
- * Adds a new row with the name and the input field in two columns and
- * returns the given input.
- */
-mxForm.prototype.addField = function(name, input)
-{
- var tr = document.createElement('tr');
- var td = document.createElement('td');
- mxUtils.write(td, name);
- tr.appendChild(td);
-
- td = document.createElement('td');
- td.appendChild(input);
- tr.appendChild(td);
- this.body.appendChild(tr);
-
- return input;
-};
diff --git a/src/js/util/mxGuide.js b/src/js/util/mxGuide.js
deleted file mode 100644
index ab5c26d..0000000
--- a/src/js/util/mxGuide.js
+++ /dev/null
@@ -1,364 +0,0 @@
-/**
- * $Id: mxGuide.js,v 1.7 2012-04-13 12:53:30 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxGuide
- *
- * Implements the alignment of selection cells to other cells in the graph.
- *
- * Constructor: mxGuide
- *
- * Constructs a new guide object.
- */
-function mxGuide(graph, states)
-{
- this.graph = graph;
- this.setStates(states);
-};
-
-/**
- * Variable: graph
- *
- * Reference to the enclosing <mxGraph> instance.
- */
-mxGuide.prototype.graph = null;
-
-/**
- * Variable: states
- *
- * Contains the <mxCellStates> that are used for alignment.
- */
-mxGuide.prototype.states = null;
-
-/**
- * Variable: horizontal
- *
- * Specifies if horizontal guides are enabled. Default is true.
- */
-mxGuide.prototype.horizontal = true;
-
-/**
- * Variable: vertical
- *
- * Specifies if vertical guides are enabled. Default is true.
- */
-mxGuide.prototype.vertical = true;
-
-/**
- * Variable: vertical
- *
- * Holds the <mxShape> for the horizontal guide.
- */
-mxGuide.prototype.guideX = null;
-
-/**
- * Variable: vertical
- *
- * Holds the <mxShape> for the vertical guide.
- */
-mxGuide.prototype.guideY = null;
-
-/**
- * Variable: crisp
- *
- * Specifies if theguide should be rendered in crisp mode if applicable.
- * Default is true.
- */
-mxGuide.prototype.crisp = true;
-
-/**
- * Function: setStates
- *
- * Sets the <mxCellStates> that should be used for alignment.
- */
-mxGuide.prototype.setStates = function(states)
-{
- this.states = states;
-};
-
-/**
- * Function: isEnabledForEvent
- *
- * Returns true if the guide should be enabled for the given native event. This
- * implementation always returns true.
- */
-mxGuide.prototype.isEnabledForEvent = function(evt)
-{
- return true;
-};
-
-/**
- * Function: getGuideTolerance
- *
- * Returns the tolerance for the guides. Default value is
- * gridSize * scale / 2.
- */
-mxGuide.prototype.getGuideTolerance = function()
-{
- return this.graph.gridSize * this.graph.view.scale / 2;
-};
-
-/**
- * Function: createGuideShape
- *
- * Returns the mxShape to be used for painting the respective guide. This
- * implementation returns a new, dashed and crisp <mxPolyline> using
- * <mxConstants.GUIDE_COLOR> and <mxConstants.GUIDE_STROKEWIDTH> as the format.
- *
- * Parameters:
- *
- * horizontal - Boolean that specifies which guide should be created.
- */
-mxGuide.prototype.createGuideShape = function(horizontal)
-{
- var guide = new mxPolyline([], mxConstants.GUIDE_COLOR, mxConstants.GUIDE_STROKEWIDTH);
- guide.crisp = this.crisp;
- guide.isDashed = true;
-
- return guide;
-};
-
-/**
- * Function: move
- *
- * Moves the <bounds> by the given <mxPoint> and returnt the snapped point.
- */
-mxGuide.prototype.move = function(bounds, delta, gridEnabled)
-{
- if (this.states != null && (this.horizontal || this.vertical) && bounds != null && delta != null)
- {
- var trx = this.graph.getView().translate;
- var scale = this.graph.getView().scale;
- var dx = delta.x;
- var dy = delta.y;
-
- var overrideX = false;
- var overrideY = false;
-
- var tt = this.getGuideTolerance();
- var ttX = tt;
- var ttY = tt;
-
- var b = bounds.clone();
- b.x += delta.x;
- b.y += delta.y;
-
- var left = b.x;
- var right = b.x + b.width;
- var center = b.getCenterX();
- var top = b.y;
- var bottom = b.y + b.height;
- var middle = b.getCenterY();
-
- // Snaps the left, center and right to the given x-coordinate
- function snapX(x)
- {
- x += this.graph.panDx;
- var override = false;
-
- if (Math.abs(x - center) < ttX)
- {
- dx = x - bounds.getCenterX();
- ttX = Math.abs(x - center);
- override = true;
- }
- else if (Math.abs(x - left) < ttX)
- {
- dx = x - bounds.x;
- ttX = Math.abs(x - left);
- override = true;
- }
- else if (Math.abs(x - right) < ttX)
- {
- dx = x - bounds.x - bounds.width;
- ttX = Math.abs(x - right);
- override = true;
- }
-
- if (override)
- {
- if (this.guideX == null)
- {
- this.guideX = this.createGuideShape(true);
-
- // Makes sure to use either VML or SVG shapes in order to implement
- // event-transparency on the background area of the rectangle since
- // HTML shapes do not let mouseevents through even when transparent
- this.guideX.dialect = (this.graph.dialect != mxConstants.DIALECT_SVG) ?
- mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
- this.guideX.init(this.graph.getView().getOverlayPane());
-
- if (this.graph.dialect == mxConstants.DIALECT_SVG)
- {
- this.guideX.node.setAttribute('pointer-events', 'none');
- this.guideX.pipe.setAttribute('pointer-events', 'none');
- }
- }
-
- var c = this.graph.container;
- x -= this.graph.panDx;
- this.guideX.points = [new mxPoint(x, -this.graph.panDy), new mxPoint(x, c.scrollHeight - 3 - this.graph.panDy)];
- }
-
- overrideX = overrideX || override;
- };
-
- // Snaps the top, middle or bottom to the given y-coordinate
- function snapY(y)
- {
- y += this.graph.panDy;
- var override = false;
-
- if (Math.abs(y - middle) < ttY)
- {
- dy = y - bounds.getCenterY();
- ttY = Math.abs(y - middle);
- override = true;
- }
- else if (Math.abs(y - top) < ttY)
- {
- dy = y - bounds.y;
- ttY = Math.abs(y - top);
- override = true;
- }
- else if (Math.abs(y - bottom) < ttY)
- {
- dy = y - bounds.y - bounds.height;
- ttY = Math.abs(y - bottom);
- override = true;
- }
-
- if (override)
- {
- if (this.guideY == null)
- {
- this.guideY = this.createGuideShape(false);
-
- // Makes sure to use either VML or SVG shapes in order to implement
- // event-transparency on the background area of the rectangle since
- // HTML shapes do not let mouseevents through even when transparent
- this.guideY.dialect = (this.graph.dialect != mxConstants.DIALECT_SVG) ?
- mxConstants.DIALECT_VML : mxConstants.DIALECT_SVG;
- this.guideY.init(this.graph.getView().getOverlayPane());
-
- if (this.graph.dialect == mxConstants.DIALECT_SVG)
- {
- this.guideY.node.setAttribute('pointer-events', 'none');
- this.guideY.pipe.setAttribute('pointer-events', 'none');
- }
- }
-
- var c = this.graph.container;
- y -= this.graph.panDy;
- this.guideY.points = [new mxPoint(-this.graph.panDx, y), new mxPoint(c.scrollWidth - 3 - this.graph.panDx, y)];
- }
-
- overrideY = overrideY || override;
- };
-
- for (var i = 0; i < this.states.length; i++)
- {
- var state = this.states[i];
-
- if (state != null)
- {
- // Align x
- if (this.horizontal)
- {
- snapX.call(this, state.getCenterX());
- snapX.call(this, state.x);
- snapX.call(this, state.x + state.width);
- }
-
- // Align y
- if (this.vertical)
- {
- snapY.call(this, state.getCenterY());
- snapY.call(this, state.y);
- snapY.call(this, state.y + state.height);
- }
- }
- }
-
- if (!overrideX && this.guideX != null)
- {
- this.guideX.node.style.visibility = 'hidden';
- }
- else if (this.guideX != null)
- {
- this.guideX.node.style.visibility = 'visible';
- this.guideX.redraw();
- }
-
- if (!overrideY && this.guideY != null)
- {
- this.guideY.node.style.visibility = 'hidden';
- }
- else if (this.guideY != null)
- {
- this.guideY.node.style.visibility = 'visible';
- this.guideY.redraw();
- }
-
- // Moves cells that are off-grid back to the grid on move
- if (gridEnabled)
- {
- if (!overrideX)
- {
- var tx = bounds.x - (this.graph.snap(bounds.x /
- scale - trx.x) + trx.x) * scale;
- dx = this.graph.snap(dx / scale) * scale - tx;
- }
-
- if (!overrideY)
- {
- var ty = bounds.y - (this.graph.snap(bounds.y /
- scale - trx.y) + trx.y) * scale;
- dy = this.graph.snap(dy / scale) * scale - ty;
- }
- }
-
- delta = new mxPoint(dx, dy);
- }
-
- return delta;
-};
-
-/**
- * Function: hide
- *
- * Hides all current guides.
- */
-mxGuide.prototype.hide = function()
-{
- if (this.guideX != null)
- {
- this.guideX.node.style.visibility = 'hidden';
- }
-
- if (this.guideY != null)
- {
- this.guideY.node.style.visibility = 'hidden';
- }
-};
-
-/**
- * Function: destroy
- *
- * Destroys all resources that this object uses.
- */
-mxGuide.prototype.destroy = function()
-{
- if (this.guideX != null)
- {
- this.guideX.destroy();
- this.guideX = null;
- }
-
- if (this.guideY != null)
- {
- this.guideY.destroy();
- this.guideY = null;
- }
-};
diff --git a/src/js/util/mxImage.js b/src/js/util/mxImage.js
deleted file mode 100644
index 39d1a09..0000000
--- a/src/js/util/mxImage.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * $Id: mxImage.js,v 1.7 2010-01-02 09:45:14 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxImage
- *
- * Encapsulates the URL, width and height of an image.
- *
- * Constructor: mxImage
- *
- * Constructs a new image.
- */
-function mxImage(src, width, height)
-{
- this.src = src;
- this.width = width;
- this.height = height;
-};
-
-/**
- * Variable: src
- *
- * String that specifies the URL of the image.
- */
-mxImage.prototype.src = null;
-
-/**
- * Variable: width
- *
- * Integer that specifies the width of the image.
- */
-mxImage.prototype.width = null;
-
-/**
- * Variable: height
- *
- * Integer that specifies the height of the image.
- */
-mxImage.prototype.height = null;
diff --git a/src/js/util/mxImageBundle.js b/src/js/util/mxImageBundle.js
deleted file mode 100644
index dc4c2cf..0000000
--- a/src/js/util/mxImageBundle.js
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * $Id: mxImageBundle.js,v 1.3 2011-01-20 19:08:11 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxImageBundle
- *
- * Maps from keys to base64 encoded images or file locations. All values must
- * be URLs or use the format data:image/format followed by a comma and the base64
- * encoded image data, eg. "data:image/gif,XYZ", where XYZ is the base64 encoded
- * image data.
- *
- * To add a new image bundle to an existing graph, the following code is used:
- *
- * (code)
- * var bundle = new mxImageBundle(alt);
- * bundle.putImage('myImage', 'data:image/gif,R0lGODlhEAAQAMIGAAAAAICAAICAgP' +
- * '//AOzp2O3r2////////yH+FUNyZWF0ZWQgd2l0aCBUaGUgR0lNUAAh+QQBCgAHACwAAAAA' +
- * 'EAAQAAADTXi63AowynnAMDfjPUDlnAAJhmeBFxAEloliKltWmiYCQvfVr6lBPB1ggxN1hi' +
- * 'laSSASFQpIV5HJBDyHpqK2ejVRm2AAgZCdmCGO9CIBADs=', fallback);
- * graph.addImageBundle(bundle);
- * (end);
- *
- * Alt is an optional boolean (default is false) that specifies if the value
- * or the fallback should be returned in <getImage>.
- *
- * The image can then be referenced in any cell style using image=myImage.
- * If you are using mxOutline, you should use the same image bundles in the
- * graph that renders the outline.
- *
- * The keys for images are resolved in <mxGraph.postProcessCellStyle> and
- * turned into a data URI if the returned value has a short data URI format
- * as specified above.
- *
- * A typical value for the fallback is a MTHML link as defined in RFC 2557.
- * Note that this format requires a file to be dynamically created on the
- * server-side, or the page that contains the graph to be modified to contain
- * the resources, this can be done by adding a comment that contains the
- * resource in the HEAD section of the page after the title tag.
- *
- * This type of fallback mechanism should be used in IE6 and IE7. IE8 does
- * support data URIs, but the maximum size is limited to 32 KB, which means
- * all data URIs should be limited to 32 KB.
- */
-function mxImageBundle(alt)
-{
- this.images = [];
- this.alt = (alt != null) ? alt : false;
-};
-
-/**
- * Variable: images
- *
- * Maps from keys to images.
- */
-mxImageBundle.prototype.images = null;
-
-/**
- * Variable: alt
- *
- * Specifies if the fallback representation should be returned.
- */
-mxImageBundle.prototype.images = null;
-
-/**
- * Function: putImage
- *
- * Adds the specified entry to the map. The entry is an object with a value and
- * fallback property as specified in the arguments.
- */
-mxImageBundle.prototype.putImage = function(key, value, fallback)
-{
- this.images[key] = {value: value, fallback: fallback};
-};
-
-/**
- * Function: getImage
- *
- * Returns the value for the given key. This returns the value
- * or fallback, depending on <alt>. The fallback is returned if
- * <alt> is true, the value is returned otherwise.
- */
-mxImageBundle.prototype.getImage = function(key)
-{
- var result = null;
-
- if (key != null)
- {
- var img = this.images[key];
-
- if (img != null)
- {
- result = (this.alt) ? img.fallback : img.value;
- }
- }
-
- return result;
-};
diff --git a/src/js/util/mxImageExport.js b/src/js/util/mxImageExport.js
deleted file mode 100644
index dcbcf9a..0000000
--- a/src/js/util/mxImageExport.js
+++ /dev/null
@@ -1,1412 +0,0 @@
-/**
- * $Id: mxImageExport.js,v 1.47 2012-09-24 14:54:32 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxImageExport
- *
- * Creates a new image export instance to be used with an export canvas. Here
- * is an example that uses this class to create an image via a backend using
- * <mxXmlExportCanvas>.
- *
- * (code)
- * var xmlDoc = mxUtils.createXmlDocument();
- * var root = xmlDoc.createElement('output');
- * xmlDoc.appendChild(root);
- *
- * var xmlCanvas = new mxXmlCanvas2D(root);
- * var imgExport = new mxImageExport();
- * imgExport.drawState(graph.getView().getState(graph.model.root), xmlCanvas);
- *
- * var bounds = graph.getGraphBounds();
- * var w = Math.ceil(bounds.x + bounds.width);
- * var h = Math.ceil(bounds.y + bounds.height);
- *
- * var xml = mxUtils.getXml(root);
- * new mxXmlRequest('export', 'format=png&w=' + w +
- * '&h=' + h + '&bg=#F9F7ED&xml=' + encodeURIComponent(xml))
- * .simulate(document, '_blank');
- * (end)
- *
- * In order to export images for a graph whose container is not visible or not
- * part of the DOM, the following workaround can be used to compute the size of
- * the labels.
- *
- * (code)
- * mxText.prototype.getTableSize = function(table)
- * {
- * var oldParent = table.parentNode;
- *
- * document.body.appendChild(table);
- * var size = new mxRectangle(0, 0, table.offsetWidth, table.offsetHeight);
- * oldParent.appendChild(table);
- *
- * return size;
- * };
- * (end)
- *
- * Constructor: mxImageExport
- *
- * Constructs a new image export.
- */
-function mxImageExport()
-{
- this.initShapes();
- this.initMarkers();
-};
-
-/**
- * Variable: includeOverlays
- *
- * Specifies if overlays should be included in the export. Default is false.
- */
-mxImageExport.prototype.includeOverlays = false;
-
-/**
- * Variable: glassSize
- *
- * Reference to the thread while the animation is running.
- */
-mxImageExport.prototype.glassSize = 0.4;
-
-/**
- * Variable: shapes
- *
- * Holds implementations for the built-in shapes.
- */
-mxImageExport.prototype.shapes = null;
-
-/**
- * Variable: markers
- *
- * Holds implementations for the built-in markers.
- */
-mxImageExport.prototype.markers = null;
-
-/**
- * Function: drawState
- *
- * Draws the given state and all its descendants to the given canvas.
- */
-mxImageExport.prototype.drawState = function(state, canvas)
-{
- if (state != null)
- {
- if (state.shape != null)
- {
- var shape = (state.shape.stencil != null) ?
- state.shape.stencil :
- this.shapes[state.style[mxConstants.STYLE_SHAPE]];
-
- if (shape == null)
- {
- // Checks if there is a custom shape
- if (typeof(state.shape.redrawPath) == 'function')
- {
- shape = this.createShape(state, canvas);
- }
- // Uses a rectangle for all vertices where no shape can be found
- else if (state.view.graph.getModel().isVertex(state.cell))
- {
- shape = this.shapes['rectangle'];
- }
- }
-
- if (shape != null)
- {
- this.drawShape(state, canvas, shape);
-
- if (this.includeOverlays)
- {
- this.drawOverlays(state, canvas);
- }
- }
- }
-
- var graph = state.view.graph;
- var childCount = graph.model.getChildCount(state.cell);
-
- for (var i = 0; i < childCount; i++)
- {
- var childState = graph.view.getState(graph.model.getChildAt(state.cell, i));
- this.drawState(childState, canvas);
- }
- }
-};
-
-/**
- * Function: createShape
- *
- * Creates a shape wrapper for the custom shape in the given cell state and
- * links its output to the given canvas.
- */
-mxImageExport.prototype.createShape = function(state, canvas)
-{
- return {
- drawShape: function(canvas, state, bounds, background)
- {
- var path =
- {
- translate: new mxPoint(bounds.x, bounds.y),
- moveTo: function(x, y)
- {
- canvas.moveTo(this.translate.x + x, this.translate.y + y);
- },
- lineTo: function(x, y)
- {
- canvas.lineTo(this.translate.x + x, this.translate.y + y);
- },
- quadTo: function(x1, y1, x, y)
- {
- canvas.quadTo(this.translate.x + x1, this.translate.y + y1, this.translate.x + x, this.translate.y + y);
- },
- curveTo: function(x1, y1, x2, y2, x, y)
- {
- canvas.curveTo(this.translate.x + x1, this.translate.y + y1, this.translate.x + x2, this.translate.y + y2, this.translate.x + x, this.translate.y + y);
- },
- end: function()
- {
- // do nothing
- },
- close: function()
- {
- canvas.close();
- }
- };
-
- if (!background)
- {
- canvas.fillAndStroke();
- }
-
- // LATER: Remove empty path if shape does not implement foreground, add shadow/clipping
- canvas.begin();
- state.shape.redrawPath.call(state.shape, path, bounds.x, bounds.y, bounds.width, bounds.height, !background);
-
- if (!background)
- {
- canvas.fillAndStroke();
- }
-
- return true;
- }
- };
-};
-
-/**
- * Function: drawOverlays
- *
- * Draws the overlays for the given state. This is called if <includeOverlays>
- * is true.
- */
-mxImageExport.prototype.drawOverlays = function(state, canvas)
-{
- if (state.overlays != null)
- {
- state.overlays.visit(function(id, shape)
- {
- var bounds = shape.bounds;
-
- if (bounds != null)
- {
- canvas.image(bounds.x, bounds.y, bounds.width, bounds.height, shape.image);
- }
- });
- }
-};
-
-/**
- * Function: drawShape
- *
- * Draws the given state to the given canvas.
- */
-mxImageExport.prototype.drawShape = function(state, canvas, shape)
-{
- var rotation = mxUtils.getNumber(state.style, mxConstants.STYLE_ROTATION, 0);
- var direction = mxUtils.getValue(state.style, mxConstants.STYLE_DIRECTION, null);
-
- // New styles for shape flipping the stencil
- var flipH = state.style[mxConstants.STYLE_STENCIL_FLIPH];
- var flipV = state.style[mxConstants.STYLE_STENCIL_FLIPV];
-
- if (flipH ? !flipV : flipV)
- {
- rotation *= -1;
- }
-
- // Default direction is east (ignored if rotation exists)
- if (direction != null)
- {
- if (direction == 'north')
- {
- rotation += 270;
- }
- else if (direction == 'west')
- {
- rotation += 180;
- }
- else if (direction == 'south')
- {
- rotation += 90;
- }
- }
-
- if (flipH && flipV)
- {
- rotation += 180;
- flipH = false;
- flipV = false;
- }
-
- // Saves the global state for each cell
- canvas.save();
-
- // Adds rotation and horizontal/vertical flipping
- // FIXME: Rotation and stencil flip only supported for stencil shapes
- rotation = rotation % 360;
-
- if (rotation != 0 || flipH || flipV)
- {
- canvas.rotate(rotation, flipH, flipV, state.getCenterX(), state.getCenterY());
- }
-
- // Note: Overwritten in mxStencil.paintShape (can depend on aspect)
- var scale = state.view.scale;
- var sw = mxUtils.getNumber(state.style, mxConstants.STYLE_STROKEWIDTH, 1) * scale;
- canvas.setStrokeWidth(sw);
-
- var sw2 = sw / 2;
- var bg = this.getBackgroundBounds(state);
-
- // Stencils will rotate the bounds as required
- if (state.shape.stencil == null && (direction == 'south' || direction == 'north'))
- {
- var dx = (bg.width - bg.height) / 2;
- bg.x += dx;
- bg.y += -dx;
- var tmp = bg.width;
- bg.width = bg.height;
- bg.height = tmp;
- }
-
- var bb = new mxRectangle(bg.x - sw2, bg.y - sw2, bg.width + sw, bg.height + sw);
- var alpha = mxUtils.getValue(state.style, mxConstants.STYLE_OPACITY, 100) / 100;
-
- var shp = state.style[mxConstants.STYLE_SHAPE];
- var imageShape = shp == mxConstants.SHAPE_IMAGE;
- var gradientColor = (imageShape) ? null : mxUtils.getValue(state.style, mxConstants.STYLE_GRADIENTCOLOR);
-
- // Converts colors with special keyword none to null
- if (gradientColor == mxConstants.NONE)
- {
- gradientColor = null;
- }
-
- var fcKey = (imageShape) ? mxConstants.STYLE_IMAGE_BACKGROUND : mxConstants.STYLE_FILLCOLOR;
- var fillColor = mxUtils.getValue(state.style, fcKey, null);
-
- if (fillColor == mxConstants.NONE)
- {
- fillColor = null;
- }
-
- var scKey = (imageShape) ? mxConstants.STYLE_IMAGE_BORDER : mxConstants.STYLE_STROKECOLOR;
- var strokeColor = mxUtils.getValue(state.style, scKey, null);
-
- if (strokeColor == mxConstants.NONE)
- {
- strokeColor = null;
- }
-
- var glass = (fillColor != null && (shp == mxConstants.SHAPE_LABEL || shp == mxConstants.SHAPE_RECTANGLE));
-
- // Draws the shadow if the fillColor is not transparent
- if (mxUtils.getValue(state.style, mxConstants.STYLE_SHADOW, false))
- {
- this.drawShadow(canvas, state, shape, rotation, flipH, flipV, bg, alpha, fillColor != null);
- }
-
- canvas.setAlpha(alpha);
-
- // Sets the dashed state
- if (mxUtils.getValue(state.style, mxConstants.STYLE_DASHED, '0') == '1')
- {
- canvas.setDashed(true);
-
- // Supports custom dash patterns
- var dash = state.style['dashPattern'];
-
- if (dash != null)
- {
- canvas.setDashPattern(dash);
- }
- }
-
- // Draws background and foreground
- if (strokeColor != null || fillColor != null)
- {
- if (strokeColor != null)
- {
- canvas.setStrokeColor(strokeColor);
- }
-
- if (fillColor != null)
- {
- if (gradientColor != null && gradientColor != 'transparent')
- {
- canvas.setGradient(fillColor, gradientColor, bg.x, bg.y, bg.width, bg.height, direction);
- }
- else
- {
- canvas.setFillColor(fillColor);
- }
- }
-
- // Draws background and foreground of shape
- glass = shape.drawShape(canvas, state, bg, true, false) && glass;
- shape.drawShape(canvas, state, bg, false, false);
- }
-
- // Draws the glass effect
- // Requires background in generic shape for clipping
- if (glass && mxUtils.getValue(state.style, mxConstants.STYLE_GLASS, 0) == 1)
- {
- this.drawGlass(state, canvas, bb, shape, this.glassSize);
- }
-
- // Draws the image (currently disabled for everything but image and label shapes)
- if (imageShape || shp == mxConstants.SHAPE_LABEL)
- {
- var src = state.view.graph.getImage(state);
-
- if (src != null)
- {
- var imgBounds = this.getImageBounds(state);
-
- if (imgBounds != null)
- {
- this.drawImage(state, canvas, imgBounds, src);
- }
- }
- }
-
- // Restores canvas state
- canvas.restore();
-
- // Draws the label (label has separate rotation)
- var txt = state.text;
-
- // Does not use mxCellRenderer.getLabelValue to avoid conversion of HTML entities for VML
- var label = state.view.graph.getLabel(state.cell);
-
- if (txt != null && label != null && label.length > 0)
- {
- canvas.save();
- canvas.setAlpha(mxUtils.getValue(state.style, mxConstants.STYLE_TEXT_OPACITY, 100) / 100);
- var bounds = new mxRectangle(txt.boundingBox.x, txt.boundingBox.y, txt.boundingBox.width, txt.boundingBox.height);
- var vert = mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, 1) == 0;
-
- // Vertical error offset
- bounds.y += 2;
-
- if (vert)
- {
- if (txt.dialect != mxConstants.DIALECT_SVG)
- {
- var cx = bounds.x + bounds.width / 2;
- var cy = bounds.y + bounds.height / 2;
- var tmp = bounds.width;
- bounds.width = bounds.height;
- bounds.height = tmp;
- bounds.x = cx - bounds.width / 2;
- bounds.y = cy - bounds.height / 2;
- }
- else if (txt.dialect == mxConstants.DIALECT_SVG)
- {
- // Workarounds for different label bounding boxes (mostly ignoring rotation).
- // LATER: Fix in mxText so that the bounding box is consistent and rotated.
- // TODO: Check non-center/middle-aligned vertical labels in VML for IE8.
- var b = state.y + state.height;
- var cx = bounds.getCenterX() - state.x;
- var cy = bounds.getCenterY() - state.y;
-
- var y = b - cx - bounds.height / 2;
- bounds.x = state.x + cy - bounds.width / 2;
- bounds.y = y;
- //bounds.x -= state.height / 2 - state.width / 2;
- //bounds.y -= state.width / 2 - state.height / 2;
- }
- }
-
- this.drawLabelBackground(state, canvas, bounds, vert);
- this.drawLabel(state, canvas, bounds, vert, label);
- canvas.restore();
- }
-};
-
-/**
- * Function: drawGlass
- *
- * Draws the given state to the given canvas.
- */
-mxImageExport.prototype.drawShadow = function(canvas, state, shape, rotation, flipH, flipV, bounds, alpha, filled)
-{
- // Requires background in generic shape for shadow, looks like only one
- // fillAndStroke is allowed per current path, try working around that
- // Computes rotated shadow offset
- var rad = rotation * Math.PI / 180;
- var cos = Math.cos(-rad);
- var sin = Math.sin(-rad);
- var offset = mxUtils.getRotatedPoint(new mxPoint(mxConstants.SHADOW_OFFSET_X, mxConstants.SHADOW_OFFSET_Y), cos, sin);
-
- if (flipH)
- {
- offset.x *= -1;
- }
-
- if (flipV)
- {
- offset.y *= -1;
- }
-
- // TODO: Use save/restore instead of negative offset to restore (requires fix for HTML canvas)
- canvas.translate(offset.x, offset.y);
-
- // Returns true if a shadow has been painted (path has been created)
- if (shape.drawShape(canvas, state, bounds, true, true))
- {
- canvas.setAlpha(mxConstants.SHADOW_OPACITY * alpha);
- canvas.shadow(mxConstants.SHADOWCOLOR, filled);
- }
-
- canvas.translate(-offset.x, -offset.y);
-};
-
-/**
- * Function: drawGlass
- *
- * Draws the given state to the given canvas.
- */
-mxImageExport.prototype.drawGlass = function(state, canvas, bounds, shape, size)
-{
- // LATER: Clipping region should include stroke
- if (shape.drawShape(canvas, state, bounds, true, false))
- {
- canvas.save();
- canvas.clip();
- canvas.setGlassGradient(bounds.x, bounds.y, bounds.width, bounds.height);
-
- canvas.begin();
- canvas.moveTo(bounds.x, bounds.y);
- canvas.lineTo(bounds.x, (bounds.y + bounds.height * size));
- canvas.quadTo((bounds.x + bounds.width * 0.5),
- (bounds.y + bounds.height * 0.7), bounds.x + bounds.width,
- (bounds.y + bounds.height * size));
- canvas.lineTo(bounds.x + bounds.width, bounds.y);
- canvas.close();
-
- canvas.fill();
- canvas.restore();
- }
-};
-
-/**
- * Function: drawImage
- *
- * Draws the given state to the given canvas.
- */
-mxImageExport.prototype.drawImage = function(state, canvas, bounds, image)
-{
- var aspect = mxUtils.getValue(state.style, mxConstants.STYLE_IMAGE_ASPECT, 1) == 1;
- var flipH = mxUtils.getValue(state.style, mxConstants.STYLE_IMAGE_FLIPH, 0) == 1;
- var flipV = mxUtils.getValue(state.style, mxConstants.STYLE_IMAGE_FLIPV, 0) == 1;
-
- canvas.image(bounds.x, bounds.y, bounds.width, bounds.height, image, aspect, flipH, flipV);
-};
-
-/**
- * Function: drawLabelBackground
- *
- * Draws background for the label of the given state to the given canvas.
- */
-mxImageExport.prototype.drawLabelBackground = function(state, canvas, bounds, vert)
-{
- var stroke = mxUtils.getValue(state.style, mxConstants.STYLE_LABEL_BORDERCOLOR);
- var fill = mxUtils.getValue(state.style, mxConstants.STYLE_LABEL_BACKGROUNDCOLOR);
-
- if (stroke == mxConstants.NONE)
- {
- stroke = null;
- }
-
- if (fill == mxConstants.NONE)
- {
- fill = null;
- }
-
- if (stroke != null || fill != null)
- {
- var x = bounds.x;
- var y = bounds.y - mxUtils.getValue(state.style, mxConstants.STYLE_LABEL_PADDING, 0);
- var w = bounds.width;
- var h = bounds.height;
-
- if (vert)
- {
- x += (w - h) / 2;
- y += (h - w) / 2;
- var tmp = w;
- w = h;
- h = tmp;
- }
-
- if (fill != null)
- {
- canvas.setFillColor(fill);
- }
-
- if (stroke != null)
- {
- canvas.setStrokeColor(stroke);
- canvas.setStrokeWidth(1);
- canvas.setDashed(false);
- }
-
- canvas.rect(x, y, w, h);
-
- if (fill != null && stroke != null)
- {
- canvas.fillAndStroke();
- }
- else if (fill != null)
- {
- canvas.fill();
- }
- else if (stroke != null)
- {
- canvas.stroke();
- }
- }
-};
-
-/**
- * Function: drawLabel
- *
- * Draws the given state to the given canvas.
- */
-mxImageExport.prototype.drawLabel = function(state, canvas, bounds, vert, str)
-{
- var scale = state.view.scale;
-
- // Applies color
- canvas.setFontColor(mxUtils.getValue(state.style, mxConstants.STYLE_FONTCOLOR, '#000000'));
-
- // Applies font settings
- canvas.setFontFamily(mxUtils.getValue(state.style, mxConstants.STYLE_FONTFAMILY,
- mxConstants.DEFAULT_FONTFAMILY));
- canvas.setFontStyle(mxUtils.getValue(state.style, mxConstants.STYLE_FONTSTYLE, 0));
- canvas.setFontSize(mxUtils.getValue(state.style, mxConstants.STYLE_FONTSIZE,
- mxConstants.DEFAULT_FONTSIZE) * scale);
-
- var align = mxUtils.getValue(state.style, mxConstants.STYLE_ALIGN, mxConstants.ALIGN_LEFT);
-
- // Uses null alignment for default values (valign default is 'top' which is fine)
- if (align == 'left')
- {
- align = null;
- }
-
- var y = bounds.y - mxUtils.getValue(state.style, mxConstants.STYLE_LABEL_PADDING, 0);
- var wrap = state.view.graph.isWrapping(state.cell);
- var html = state.view.graph.isHtmlLabel(state.cell);
-
- // Replaces linefeeds in HTML markup to match the display output
- if (html && mxText.prototype.replaceLinefeeds)
- {
- str = str.replace(/\n/g, '<br/>');
- }
-
- canvas.text(bounds.x, y, bounds.width, bounds.height, str, align, null, vert, wrap, (html) ? 'html' : '');
-};
-
-/**
- * Function: getBackgroundBounds
- *
- * Draws the given state to the given canvas.
- */
-mxImageExport.prototype.getBackgroundBounds = function(state)
-{
- if (state.style[mxConstants.STYLE_SHAPE] == mxConstants.SHAPE_SWIMLANE)
- {
- var scale = state.view.scale;
- var start = mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE, mxConstants.DEFAULT_STARTSIZE) * scale;
- var w = state.width;
- var h = state.height;
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, true))
- {
- h = start;
- }
- else
- {
- w = start;
- }
-
- return new mxRectangle(state.x, state.y, Math.min(state.width, w), Math.min(state.height, h));
- }
- else
- {
- return new mxRectangle(state.x, state.y, state.width, state.height);
- }
-};
-
-/**
- * Function: getImageBounds
- *
- * Draws the given state to the given canvas.
- */
-mxImageExport.prototype.getImageBounds = function(state)
-{
- var bounds = new mxRectangle(state.x, state.y, state.width, state.height);
- var style = state.style;
-
- if (mxUtils.getValue(style, mxConstants.STYLE_SHAPE) != mxConstants.SHAPE_IMAGE)
- {
- var imgAlign = mxUtils.getValue(style, mxConstants.STYLE_IMAGE_ALIGN, mxConstants.ALIGN_LEFT);
- var imgValign = mxUtils.getValue(style, mxConstants.STYLE_IMAGE_VERTICAL_ALIGN, mxConstants.ALIGN_MIDDLE);
- var imgWidth = mxUtils.getValue(style, mxConstants.STYLE_IMAGE_WIDTH, mxConstants.DEFAULT_IMAGESIZE);
- var imgHeight = mxUtils.getValue(style, mxConstants.STYLE_IMAGE_HEIGHT, mxConstants.DEFAULT_IMAGESIZE);
- var spacing = mxUtils.getValue(style, mxConstants.STYLE_SPACING, 2);
-
- if (imgAlign == mxConstants.ALIGN_CENTER)
- {
- bounds.x += (bounds.width - imgWidth) / 2;
- }
- else if (imgAlign == mxConstants.ALIGN_RIGHT)
- {
- bounds.x += bounds.width - imgWidth - spacing - 2;
- }
- else
- // LEFT
- {
- bounds.x += spacing + 4;
- }
-
- if (imgValign == mxConstants.ALIGN_TOP)
- {
- bounds.y += spacing;
- }
- else if (imgValign == mxConstants.ALIGN_BOTTOM)
- {
- bounds.y += bounds.height - imgHeight - spacing;
- }
- else
- // MIDDLE
- {
- bounds.y += (bounds.height - imgHeight) / 2;
- }
-
- bounds.width = imgWidth;
- bounds.height = imgHeight;
- }
-
- return bounds;
-};
-
-/**
- * Function: drawMarker
- *
- * Initializes the built-in shapes.
- */
-mxImageExport.prototype.drawMarker = function(canvas, state, source)
-{
- var offset = null;
-
- // Computes the norm and the inverse norm
- var pts = state.absolutePoints;
- var n = pts.length;
-
- var p0 = (source) ? pts[1] : pts[n - 2];
- var pe = (source) ? pts[0] : pts[n - 1];
-
- var dx = pe.x - p0.x;
- var dy = pe.y - p0.y;
-
- var dist = Math.max(1, Math.sqrt(dx * dx + dy * dy));
-
- var unitX = dx / dist;
- var unitY = dy / dist;
-
- var size = mxUtils.getValue(state.style, (source) ?
- mxConstants.STYLE_STARTSIZE :
- mxConstants.STYLE_ENDSIZE,
- mxConstants.DEFAULT_MARKERSIZE);
-
- // Allow for stroke width in the end point used and the
- // orthogonal vectors describing the direction of the marker
- // TODO: Should get strokewidth from canvas (same for strokecolor)
- var sw = mxUtils.getValue(state.style, mxConstants.STYLE_STROKEWIDTH, 1);
-
- pe = pe.clone();
-
- var type = mxUtils.getValue(state.style, (source) ?
- mxConstants.STYLE_STARTARROW :
- mxConstants.STYLE_ENDARROW);
- var f = this.markers[type];
-
- if (f != null)
- {
- offset = f(canvas, state, type, pe, unitX, unitY, size, source, sw);
- }
-
- return offset;
-};
-
-/**
- * Function: initShapes
- *
- * Initializes the built-in shapes.
- */
-mxImageExport.prototype.initShapes = function()
-{
- this.shapes = [];
-
- // Implements the rectangle and rounded rectangle shape
- this.shapes['rectangle'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- // Paints the shape
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- var f = mxUtils.getValue(state.style, mxConstants.STYLE_ARCSIZE, mxConstants.RECTANGLE_ROUNDING_FACTOR * 100) / 100;
- var r = Math.min(bounds.width * f, bounds.height * f);
- canvas.roundrect(bounds.x, bounds.y, bounds.width, bounds.height, r, r);
- }
- else
- {
- canvas.rect(bounds.x, bounds.y, bounds.width, bounds.height);
- }
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- }
- }
- };
-
- // Implements the swimlane shape
- this.shapes['swimlane'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- if (mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false))
- {
- var r = Math.min(bounds.width * mxConstants.RECTANGLE_ROUNDING_FACTOR,
- bounds.height * mxConstants.RECTANGLE_ROUNDING_FACTOR);
- canvas.roundrect(bounds.x, bounds.y, bounds.width, bounds.height, r, r);
- }
- else
- {
- canvas.rect(bounds.x, bounds.y, bounds.width, bounds.height);
- }
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- canvas.begin();
-
- var x = state.x;
- var y = state.y;
- var w = state.width;
- var h = state.height;
-
- if (mxUtils.getValue(state.style, mxConstants.STYLE_HORIZONTAL, 1) == 0)
- {
- x += bounds.width;
- w -= bounds.width;
-
- canvas.moveTo(x, y);
- canvas.lineTo(x + w, y);
- canvas.lineTo(x + w, y + h);
- canvas.lineTo(x, y + h);
- }
- else
- {
- y += bounds.height;
- h -= bounds.height;
-
- canvas.moveTo(x, y);
- canvas.lineTo(x, y + h);
- canvas.lineTo(x + w, y + h);
- canvas.lineTo(x + w, y);
- }
-
- canvas.stroke();
- }
- }
- };
-
- this.shapes['image'] = this.shapes['rectangle'];
- this.shapes['label'] = this.shapes['rectangle'];
-
- var imageExport = this;
-
- this.shapes['connector'] =
- {
- translatePoint: function(points, index, offset)
- {
- if (offset != null)
- {
- var pt = points[index].clone();
- pt.x += offset.x;
- pt.y += offset.y;
- points[index] = pt;
- }
- },
-
- drawShape: function(canvas, state, bounds, background, shadow)
- {
- if (background)
- {
- var rounded = mxUtils.getValue(state.style, mxConstants.STYLE_ROUNDED, false);
- var arcSize = mxConstants.LINE_ARCSIZE / 2;
-
- // Does not draw the markers in the shadow to match the display
- canvas.setFillColor((shadow) ? mxConstants.NONE : mxUtils.getValue(state.style, mxConstants.STYLE_STROKECOLOR, "#000000"));
- canvas.setDashed(false);
- var pts = state.absolutePoints.slice();
- this.translatePoint(pts, 0, imageExport.drawMarker(canvas, state, true));
- this.translatePoint(pts, pts.length - 1, imageExport.drawMarker(canvas, state, false));
- canvas.setDashed(mxUtils.getValue(state.style, mxConstants.STYLE_DASHED, '0') == '1');
-
- var pt = pts[0];
- var pe = pts[pts.length - 1];
- canvas.begin();
- canvas.moveTo(pt.x, pt.y);
-
- // Draws the line segments
- for (var i = 1; i < pts.length - 1; i++)
- {
- var tmp = pts[i];
- var dx = pt.x - tmp.x;
- var dy = pt.y - tmp.y;
-
- if ((rounded && i < pts.length - 1) && (dx != 0 || dy != 0))
- {
- // Draws a line from the last point to the current
- // point with a spacing of size off the current point
- // into direction of the last point
- var dist = Math.sqrt(dx * dx + dy * dy);
- var nx1 = dx * Math.min(arcSize, dist / 2) / dist;
- var ny1 = dy * Math.min(arcSize, dist / 2) / dist;
-
- var x1 = tmp.x + nx1;
- var y1 = tmp.y + ny1;
- canvas.lineTo(x1, y1);
-
- // Draws a curve from the last point to the current
- // point with a spacing of size off the current point
- // into direction of the next point
- var next = pts[i + 1];
- dx = next.x - tmp.x;
- dy = next.y - tmp.y;
-
- dist = Math.max(1, Math.sqrt(dx * dx + dy * dy));
- var nx2 = dx * Math.min(arcSize, dist / 2) / dist;
- var ny2 = dy * Math.min(arcSize, dist / 2) / dist;
-
- var x2 = tmp.x + nx2;
- var y2 = tmp.y + ny2;
-
- canvas.curveTo(tmp.x, tmp.y, tmp.x, tmp.y, x2, y2);
- tmp = new mxPoint(x2, y2);
- }
- else
- {
- canvas.lineTo(tmp.x, tmp.y);
- }
-
- pt = tmp;
- }
-
- canvas.lineTo(pe.x, pe.y);
- canvas.stroke();
-
- return true;
- }
- else
- {
- // no foreground
- }
- }
- };
-
- this.shapes['arrow'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- // Geometry of arrow
- var spacing = mxConstants.ARROW_SPACING;
- var width = mxConstants.ARROW_WIDTH;
- var arrow = mxConstants.ARROW_SIZE;
-
- // Base vector (between end points)
- var pts = state.absolutePoints;
- var p0 = pts[0];
- var pe = pts[pts.length - 1];
- var dx = pe.x - p0.x;
- var dy = pe.y - p0.y;
- var dist = Math.sqrt(dx * dx + dy * dy);
- var length = dist - 2 * spacing - arrow;
-
- // Computes the norm and the inverse norm
- var nx = dx / dist;
- var ny = dy / dist;
- var basex = length * nx;
- var basey = length * ny;
- var floorx = width * ny/3;
- var floory = -width * nx/3;
-
- // Computes points
- var p0x = p0.x - floorx / 2 + spacing * nx;
- var p0y = p0.y - floory / 2 + spacing * ny;
- var p1x = p0x + floorx;
- var p1y = p0y + floory;
- var p2x = p1x + basex;
- var p2y = p1y + basey;
- var p3x = p2x + floorx;
- var p3y = p2y + floory;
- // p4 not necessary
- var p5x = p3x - 3 * floorx;
- var p5y = p3y - 3 * floory;
-
- canvas.begin();
- canvas.moveTo(p0x, p0y);
- canvas.lineTo(p1x, p1y);
- canvas.lineTo(p2x, p2y);
- canvas.lineTo(p3x, p3y);
- canvas.lineTo(pe.x - spacing * nx, pe.y - spacing * ny);
- canvas.lineTo(p5x, p5y);
- canvas.lineTo(p5x + floorx, p5y + floory);
- canvas.close();
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- }
- }
- };
-
- this.shapes['cylinder'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- return false;
- }
- else
- {
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
- var dy = Math.min(mxCylinder.prototype.maxHeight, Math.floor(h / 5));
-
- canvas.begin();
- canvas.moveTo(x, y + dy);
- canvas.curveTo(x, y - dy / 3, x + w, y - dy / 3, x + w, y + dy);
- canvas.lineTo(x + w, y + h - dy);
- canvas.curveTo(x + w, y + h + dy / 3, x, y + h + dy / 3, x, y + h - dy);
- canvas.close();
- canvas.fillAndStroke();
-
- canvas.begin();
- canvas.moveTo(x, y + dy);
- canvas.curveTo(x, y + 2 * dy, x + w, y + 2 * dy, x + w, y + dy);
- canvas.stroke();
- }
- }
- };
-
- this.shapes['line'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- return false;
- }
- else
- {
- canvas.begin();
-
- var mid = state.getCenterY();
- canvas.moveTo(bounds.x, mid);
- canvas.lineTo(bounds.x + bounds.width, mid);
-
- canvas.stroke();
- }
- }
- };
-
- this.shapes['ellipse'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- canvas.ellipse(bounds.x, bounds.y, bounds.width, bounds.height);
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- }
- }
- };
-
- this.shapes['doubleEllipse'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
-
- if (background)
- {
- canvas.ellipse(x, y, w, h);
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
-
- var inset = Math.min(4, Math.min(w / 5, h / 5));
- x += inset;
- y += inset;
- w -= 2 * inset;
- h -= 2 * inset;
-
- if (w > 0 && h > 0)
- {
- canvas.ellipse(x, y, w, h);
- }
-
- canvas.stroke();
- }
- }
- };
-
- this.shapes['triangle'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
- canvas.begin();
- canvas.moveTo(x, y);
- canvas.lineTo(x + w, y + h / 2);
- canvas.lineTo(x, y + h);
- canvas.close();
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- }
- }
- };
-
- this.shapes['rhombus'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
- var hw = w / 2;
- var hh = h / 2;
-
- canvas.begin();
- canvas.moveTo(x + hw, y);
- canvas.lineTo(x + w, y + hh);
- canvas.lineTo(x + hw, y + h);
- canvas.lineTo(x, y + hh);
- canvas.close();
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- }
- }
-
- };
-
- this.shapes['hexagon'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
-
- canvas.begin();
- canvas.moveTo(x + 0.25 * w, y);
- canvas.lineTo(x + 0.75 * w, y);
- canvas.lineTo(x + w, y + 0.5 * h);
- canvas.lineTo(x + 0.75 * w, y + h);
- canvas.lineTo(x + 0.25 * w, y + h);
- canvas.lineTo(x, y + 0.5 * h);
- canvas.close();
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- }
- }
- };
-
- this.shapes['actor'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
- var width = w * 2 / 6;
-
- canvas.begin();
- canvas.moveTo(x, y + h);
- canvas.curveTo(x, y + 3 * h / 5, x, y + 2 * h / 5, x + w / 2, y + 2 * h
- / 5);
- canvas.curveTo(x + w / 2 - width, y + 2 * h / 5, x + w / 2 - width, y, x
- + w / 2, y);
- canvas.curveTo(x + w / 2 + width, y, x + w / 2 + width, y + 2 * h / 5, x
- + w / 2, y + 2 * h / 5);
- canvas.curveTo(x + w, y + 2 * h / 5, x + w, y + 3 * h / 5, x + w, y + h);
- canvas.close();
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- }
- }
- };
-
- this.shapes['cloud'] =
- {
- drawShape: function(canvas, state, bounds, background)
- {
- if (background)
- {
- var x = bounds.x;
- var y = bounds.y;
- var w = bounds.width;
- var h = bounds.height;
-
- canvas.begin();
- canvas.moveTo(x + 0.25 * w, y + 0.25 * h);
- canvas.curveTo(x + 0.05 * w, y + 0.25 * h, x,
- y + 0.5 * h, x + 0.16 * w, y + 0.55 * h);
- canvas.curveTo(x, y + 0.66 * h, x + 0.18 * w,
- y + 0.9 * h, x + 0.31 * w, y + 0.8 * h);
- canvas.curveTo(x + 0.4 * w, y + h, x + 0.7 * w,
- y + h, x + 0.8 * w, y + 0.8 * h);
- canvas.curveTo(x + w, y + 0.8 * h, x + w,
- y + 0.6 * h, x + 0.875 * w, y + 0.5 * h);
- canvas.curveTo(x + w, y + 0.3 * h, x + 0.8 * w,
- y + 0.1 * h, x + 0.625 * w, y + 0.2 * h);
- canvas.curveTo(x + 0.5 * w, y + 0.05 * h,
- x + 0.3 * w, y + 0.05 * h,
- x + 0.25 * w, y + 0.25 * h);
- canvas.close();
-
- return true;
- }
- else
- {
- canvas.fillAndStroke();
- }
- }
- };
-
-};
-
-/**
- * Function: initMarkers
- *
- * Initializes the built-in markers.
- */
-mxImageExport.prototype.initMarkers = function()
-{
- this.markers = [];
-
- var tmp = function(canvas, state, type, pe, unitX, unitY, size, source, sw)
- {
- // The angle of the forward facing arrow sides against the x axis is
- // 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for
- // only half the strokewidth is processed ).
- var endOffsetX = unitX * sw * 1.118;
- var endOffsetY = unitY * sw * 1.118;
-
- pe.x -= endOffsetX;
- pe.y -= endOffsetY;
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
-
- canvas.begin();
- canvas.moveTo(pe.x, pe.y);
- canvas.lineTo(pe.x - unitX - unitY / 2, pe.y - unitY + unitX / 2);
-
- if (type == mxConstants.ARROW_CLASSIC)
- {
- canvas.lineTo(pe.x - unitX * 3 / 4, pe.y - unitY * 3 / 4);
- }
-
- canvas.lineTo(pe.x + unitY / 2 - unitX, pe.y - unitY - unitX / 2);
- canvas.close();
-
- var key = (source) ? mxConstants.STYLE_STARTFILL : mxConstants.STYLE_ENDFILL;
-
- if (state.style[key] == 0)
- {
- canvas.stroke();
- }
- else
- {
- canvas.fillAndStroke();
- }
-
- var f = (type != mxConstants.ARROW_CLASSIC) ? 1 : 3 / 4;
- return new mxPoint(-unitX * f - endOffsetX, -unitY * f - endOffsetY);
- };
-
- this.markers['classic'] = tmp;
- this.markers['block'] = tmp;
-
- this.markers['open'] = function(canvas, state, type, pe, unitX, unitY, size, source, sw)
- {
- // The angle of the forward facing arrow sides against the x axis is
- // 26.565 degrees, 1/sin(26.565) = 2.236 / 2 = 1.118 ( / 2 allows for
- // only half the strokewidth is processed ).
- var endOffsetX = unitX * sw * 1.118;
- var endOffsetY = unitY * sw * 1.118;
-
- pe.x -= endOffsetX;
- pe.y -= endOffsetY;
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
-
- canvas.begin();
- canvas.moveTo(pe.x - unitX - unitY / 2, pe.y - unitY + unitX / 2);
- canvas.lineTo(pe.x, pe.y);
- canvas.lineTo(pe.x + unitY / 2 - unitX, pe.y - unitY - unitX / 2);
- canvas.stroke();
-
- return new mxPoint(-endOffsetX * 2, -endOffsetY * 2);
- };
-
- this.markers['oval'] = function(canvas, state, type, pe, unitX, unitY, size, source, sw)
- {
- var a = size / 2;
-
- canvas.ellipse(pe.x - a, pe.y - a, size, size);
-
- var key = (source) ? mxConstants.STYLE_STARTFILL : mxConstants.STYLE_ENDFILL;
-
- if (state.style[key] == 0)
- {
- canvas.stroke();
- }
- else
- {
- canvas.fillAndStroke();
- }
-
- return new mxPoint(-unitX / 2, -unitY / 2);
- };
-
- var tmp_diamond = function(canvas, state, type, pe, unitX, unitY, size, source, sw)
- {
- // The angle of the forward facing arrow sides against the x axis is
- // 45 degrees, 1/sin(45) = 1.4142 / 2 = 0.7071 ( / 2 allows for
- // only half the strokewidth is processed ). Or 0.9862 for thin diamond.
- // Note these values and the tk variable below are dependent, update
- // both together (saves trig hard coding it).
- var swFactor = (type == mxConstants.ARROW_DIAMOND) ? 0.7071 : 0.9862;
- var endOffsetX = unitX * sw * swFactor;
- var endOffsetY = unitY * sw * swFactor;
-
- unitX = unitX * (size + sw);
- unitY = unitY * (size + sw);
-
- pe.x -= endOffsetX;
- pe.y -= endOffsetY;
-
- // thickness factor for diamond
- var tk = ((type == mxConstants.ARROW_DIAMOND) ? 2 : 3.4);
-
- canvas.begin();
- canvas.moveTo(pe.x, pe.y);
- canvas.lineTo(pe.x - unitX / 2 - unitY / tk, pe.y + unitX / tk - unitY / 2);
- canvas.lineTo(pe.x - unitX, pe.y - unitY);
- canvas.lineTo(pe.x - unitX / 2 + unitY / tk, pe.y - unitY / 2 - unitX / tk);
- canvas.close();
-
- var key = (source) ? mxConstants.STYLE_STARTFILL : mxConstants.STYLE_ENDFILL;
-
- if (state.style[key] == 0)
- {
- canvas.stroke();
- }
- else
- {
- canvas.fillAndStroke();
- }
-
- return new mxPoint(-endOffsetX - unitX, -endOffsetY - unitY);
- };
-
- this.markers['diamond'] = tmp_diamond;
- this.markers['diamondThin'] = tmp_diamond;
-};
diff --git a/src/js/util/mxLog.js b/src/js/util/mxLog.js
deleted file mode 100644
index c556e22..0000000
--- a/src/js/util/mxLog.js
+++ /dev/null
@@ -1,410 +0,0 @@
-/**
- * $Id: mxLog.js,v 1.32 2012-11-12 09:40:59 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-var mxLog =
-{
- /**
- * Class: mxLog
- *
- * A singleton class that implements a simple console.
- *
- * Variable: consoleName
- *
- * Specifies the name of the console window. Default is 'Console'.
- */
- consoleName: 'Console',
-
- /**
- * Variable: TRACE
- *
- * Specified if the output for <enter> and <leave> should be visible in the
- * console. Default is false.
- */
- TRACE: false,
-
- /**
- * Variable: DEBUG
- *
- * Specifies if the output for <debug> should be visible in the console.
- * Default is true.
- */
- DEBUG: true,
-
- /**
- * Variable: WARN
- *
- * Specifies if the output for <warn> should be visible in the console.
- * Default is true.
- */
- WARN: true,
-
- /**
- * Variable: buffer
- *
- * Buffer for pre-initialized content.
- */
- buffer: '',
-
- /**
- * Function: init
- *
- * Initializes the DOM node for the console. This requires document.body to
- * point to a non-null value. This is called from within <setVisible> if the
- * log has not yet been initialized.
- */
- init: function()
- {
- if (mxLog.window == null && document.body != null)
- {
- var title = mxLog.consoleName + ' - mxGraph ' + mxClient.VERSION;
-
- // Creates a table that maintains the layout
- var table = document.createElement('table');
- table.setAttribute('width', '100%');
- table.setAttribute('height', '100%');
-
- var tbody = document.createElement('tbody');
- var tr = document.createElement('tr');
- var td = document.createElement('td');
- td.style.verticalAlign = 'top';
-
- // Adds the actual console as a textarea
- mxLog.textarea = document.createElement('textarea');
- mxLog.textarea.setAttribute('readOnly', 'true');
- mxLog.textarea.style.height = '100%';
- mxLog.textarea.style.resize = 'none';
- mxLog.textarea.value = mxLog.buffer;
-
- // Workaround for wrong width in standards mode
- if (mxClient.IS_NS && document.compatMode != 'BackCompat')
- {
- mxLog.textarea.style.width = '99%';
- }
- else
- {
- mxLog.textarea.style.width = '100%';
- }
-
- td.appendChild(mxLog.textarea);
- tr.appendChild(td);
- tbody.appendChild(tr);
-
- // Creates the container div
- tr = document.createElement('tr');
- mxLog.td = document.createElement('td');
- mxLog.td.style.verticalAlign = 'top';
- mxLog.td.setAttribute('height', '30px');
-
- tr.appendChild(mxLog.td);
- tbody.appendChild(tr);
- table.appendChild(tbody);
-
- // Adds various debugging buttons
- mxLog.addButton('Info', function (evt)
- {
- mxLog.info();
- });
-
- mxLog.addButton('DOM', function (evt)
- {
- var content = mxUtils.getInnerHtml(document.body);
- mxLog.debug(content);
- });
-
- mxLog.addButton('Trace', function (evt)
- {
- mxLog.TRACE = !mxLog.TRACE;
-
- if (mxLog.TRACE)
- {
- mxLog.debug('Tracing enabled');
- }
- else
- {
- mxLog.debug('Tracing disabled');
- }
- });
-
- mxLog.addButton('Copy', function (evt)
- {
- try
- {
- mxUtils.copy(mxLog.textarea.value);
- }
- catch (err)
- {
- mxUtils.alert(err);
- }
- });
-
- mxLog.addButton('Show', function (evt)
- {
- try
- {
- mxUtils.popup(mxLog.textarea.value);
- }
- catch (err)
- {
- mxUtils.alert(err);
- }
- });
-
- mxLog.addButton('Clear', function (evt)
- {
- mxLog.textarea.value = '';
- });
-
- // Cross-browser code to get window size
- var h = 0;
- var w = 0;
-
- if (typeof(window.innerWidth) === 'number')
- {
- h = window.innerHeight;
- w = window.innerWidth;
- }
- else
- {
- h = (document.documentElement.clientHeight || document.body.clientHeight);
- w = document.body.clientWidth;
- }
-
- mxLog.window = new mxWindow(title, table, Math.max(0, w-320), Math.max(0, h-210), 300, 160);
- mxLog.window.setMaximizable(true);
- mxLog.window.setScrollable(false);
- mxLog.window.setResizable(true);
- mxLog.window.setClosable(true);
- mxLog.window.destroyOnClose = false;
-
- // Workaround for ignored textarea height in various setups
- if ((mxClient.IS_NS || mxClient.IS_IE) && !mxClient.IS_GC &&
- !mxClient.IS_SF && document.compatMode != 'BackCompat')
- {
- var elt = mxLog.window.getElement();
-
- var resizeHandler = function(sender, evt)
- {
- mxLog.textarea.style.height = Math.max(0, elt.offsetHeight - 70)+'px';
- };
-
- mxLog.window.addListener(mxEvent.RESIZE_END, resizeHandler);
- mxLog.window.addListener(mxEvent.MAXIMIZE, resizeHandler);
- mxLog.window.addListener(mxEvent.NORMALIZE, resizeHandler);
-
- mxLog.textarea.style.height = '92px';
- }
- }
- },
-
- /**
- * Function: info
- *
- * Writes the current navigator information to the console.
- */
- info: function()
- {
- mxLog.writeln(mxUtils.toString(navigator));
- },
-
- /**
- * Function: addButton
- *
- * Adds a button to the console using the given label and function.
- */
- addButton: function(lab, funct)
- {
- var button = document.createElement('button');
- mxUtils.write(button, lab);
- mxEvent.addListener(button, 'click', funct);
- mxLog.td.appendChild(button);
- },
-
- /**
- * Function: isVisible
- *
- * Returns true if the console is visible.
- */
- isVisible: function()
- {
- if (mxLog.window != null)
- {
- return mxLog.window.isVisible();
- }
- return false;
- },
-
-
- /**
- * Function: show
- *
- * Shows the console.
- */
- show: function()
- {
- mxLog.setVisible(true);
- },
-
- /**
- * Function: setVisible
- *
- * Shows or hides the console.
- */
- setVisible: function(visible)
- {
- if (mxLog.window == null)
- {
- mxLog.init();
- }
-
- if (mxLog.window != null)
- {
- mxLog.window.setVisible(visible);
- }
- },
-
- /**
- * Function: enter
- *
- * Writes the specified string to the console
- * if <TRACE> is true and returns the current
- * time in milliseconds.
- *
- * Example:
- *
- * (code)
- * mxLog.show();
- * var t0 = mxLog.enter('Hello');
- * // Do something
- * mxLog.leave('World!', t0);
- * (end)
- */
- enter: function(string)
- {
- if (mxLog.TRACE)
- {
- mxLog.writeln('Entering '+string);
-
- return new Date().getTime();
- }
- },
-
- /**
- * Function: leave
- *
- * Writes the specified string to the console
- * if <TRACE> is true and computes the difference
- * between the current time and t0 in milliseconds.
- * See <enter> for an example.
- */
- leave: function(string, t0)
- {
- if (mxLog.TRACE)
- {
- var dt = (t0 != 0) ? ' ('+(new Date().getTime() - t0)+' ms)' : '';
- mxLog.writeln('Leaving '+string+dt);
- }
- },
-
- /**
- * Function: debug
- *
- * Adds all arguments to the console if <DEBUG> is enabled.
- *
- * Example:
- *
- * (code)
- * mxLog.show();
- * mxLog.debug('Hello, World!');
- * (end)
- */
- debug: function()
- {
- if (mxLog.DEBUG)
- {
- mxLog.writeln.apply(this, arguments);
- }
- },
-
- /**
- * Function: warn
- *
- * Adds all arguments to the console if <WARN> is enabled.
- *
- * Example:
- *
- * (code)
- * mxLog.show();
- * mxLog.warn('Hello, World!');
- * (end)
- */
- warn: function()
- {
- if (mxLog.WARN)
- {
- mxLog.writeln.apply(this, arguments);
- }
- },
-
- /**
- * Function: write
- *
- * Adds the specified strings to the console.
- */
- write: function()
- {
- var string = '';
-
- for (var i = 0; i < arguments.length; i++)
- {
- string += arguments[i];
-
- if (i < arguments.length - 1)
- {
- string += ' ';
- }
- }
-
- if (mxLog.textarea != null)
- {
- mxLog.textarea.value = mxLog.textarea.value + string;
-
- // Workaround for no update in Presto 2.5.22 (Opera 10.5)
- if (navigator.userAgent.indexOf('Presto/2.5') >= 0)
- {
- mxLog.textarea.style.visibility = 'hidden';
- mxLog.textarea.style.visibility = 'visible';
- }
-
- mxLog.textarea.scrollTop = mxLog.textarea.scrollHeight;
- }
- else
- {
- mxLog.buffer += string;
- }
- },
-
- /**
- * Function: writeln
- *
- * Adds the specified strings to the console, appending a linefeed at the
- * end of each string.
- */
- writeln: function()
- {
- var string = '';
-
- for (var i = 0; i < arguments.length; i++)
- {
- string += arguments[i];
-
- if (i < arguments.length - 1)
- {
- string += ' ';
- }
- }
-
- mxLog.write(string + '\n');
- }
-
-};
diff --git a/src/js/util/mxMorphing.js b/src/js/util/mxMorphing.js
deleted file mode 100644
index 442143d..0000000
--- a/src/js/util/mxMorphing.js
+++ /dev/null
@@ -1,239 +0,0 @@
-/**
- * $Id: mxMorphing.js,v 1.4 2010-06-03 13:37:07 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- *
- * Class: mxMorphing
- *
- * Implements animation for morphing cells. Here is an example of
- * using this class for animating the result of a layout algorithm:
- *
- * (code)
- * graph.getModel().beginUpdate();
- * try
- * {
- * var circleLayout = new mxCircleLayout(graph);
- * circleLayout.execute(graph.getDefaultParent());
- * }
- * finally
- * {
- * var morph = new mxMorphing(graph);
- * morph.addListener(mxEvent.DONE, function()
- * {
- * graph.getModel().endUpdate();
- * });
- *
- * morph.startAnimation();
- * }
- * (end)
- *
- * Constructor: mxMorphing
- *
- * Constructs an animation.
- *
- * Parameters:
- *
- * graph - Reference to the enclosing <mxGraph>.
- * steps - Optional number of steps in the morphing animation. Default is 6.
- * ease - Optional easing constant for the animation. Default is 1.5.
- * delay - Optional delay between the animation steps. Passed to <mxAnimation>.
- */
-function mxMorphing(graph, steps, ease, delay)
-{
- mxAnimation.call(this, delay);
- this.graph = graph;
- this.steps = (steps != null) ? steps : 6;
- this.ease = (ease != null) ? ease : 1.5;
-};
-
-/**
- * Extends mxEventSource.
- */
-mxMorphing.prototype = new mxAnimation();
-mxMorphing.prototype.constructor = mxMorphing;
-
-/**
- * Variable: graph
- *
- * Specifies the delay between the animation steps. Defaul is 30ms.
- */
-mxMorphing.prototype.graph = null;
-
-/**
- * Variable: steps
- *
- * Specifies the maximum number of steps for the morphing.
- */
-mxMorphing.prototype.steps = null;
-
-/**
- * Variable: step
- *
- * Contains the current step.
- */
-mxMorphing.prototype.step = 0;
-
-/**
- * Variable: ease
- *
- * Ease-off for movement towards the given vector. Larger values are
- * slower and smoother. Default is 4.
- */
-mxMorphing.prototype.ease = null;
-
-/**
- * Variable: cells
- *
- * Optional array of cells to be animated. If this is not specified
- * then all cells are checked and animated if they have been moved
- * in the current transaction.
- */
-mxMorphing.prototype.cells = null;
-
-/**
- * Function: updateAnimation
- *
- * Animation step.
- */
-mxMorphing.prototype.updateAnimation = function()
-{
- var move = new mxCellStatePreview(this.graph);
-
- if (this.cells != null)
- {
- // Animates the given cells individually without recursion
- for (var i = 0; i < this.cells.length; i++)
- {
- this.animateCell(cells[i], move, false);
- }
- }
- else
- {
- // Animates all changed cells by using recursion to find
- // the changed cells but not for the animation itself
- this.animateCell(this.graph.getModel().getRoot(), move, true);
- }
-
- this.show(move);
-
- if (move.isEmpty() ||
- this.step++ >= this.steps)
- {
- this.stopAnimation();
- }
-};
-
-/**
- * Function: show
- *
- * Shows the changes in the given <mxCellStatePreview>.
- */
-mxMorphing.prototype.show = function(move)
-{
- move.show();
-};
-
-/**
- * Function: animateCell
- *
- * Animates the given cell state using <mxCellStatePreview.moveState>.
- */
-mxMorphing.prototype.animateCell = function(cell, move, recurse)
-{
- var state = this.graph.getView().getState(cell);
- var delta = null;
-
- if (state != null)
- {
- // Moves the animated state from where it will be after the model
- // change by subtracting the given delta vector from that location
- delta = this.getDelta(state);
-
- if (this.graph.getModel().isVertex(cell) &&
- (delta.x != 0 || delta.y != 0))
- {
- var translate = this.graph.view.getTranslate();
- var scale = this.graph.view.getScale();
-
- delta.x += translate.x * scale;
- delta.y += translate.y * scale;
-
- move.moveState(state, -delta.x / this.ease, -delta.y / this.ease);
- }
- }
-
- if (recurse && !this.stopRecursion(state, delta))
- {
- var childCount = this.graph.getModel().getChildCount(cell);
-
- for (var i = 0; i < childCount; i++)
- {
- this.animateCell(this.graph.getModel().getChildAt(cell, i), move, recurse);
- }
- }
-};
-
-/**
- * Function: stopRecursion
- *
- * Returns true if the animation should not recursively find more
- * deltas for children if the given parent state has been animated.
- */
-mxMorphing.prototype.stopRecursion = function(state, delta)
-{
- return delta != null && (delta.x != 0 || delta.y != 0);
-};
-
-/**
- * Function: getDelta
- *
- * Returns the vector between the current rendered state and the future
- * location of the state after the display will be updated.
- */
-mxMorphing.prototype.getDelta = function(state)
-{
- var origin = this.getOriginForCell(state.cell);
- var translate = this.graph.getView().getTranslate();
- var scale = this.graph.getView().getScale();
- var current = new mxPoint(
- state.x / scale - translate.x,
- state.y / scale - translate.y);
-
- return new mxPoint(
- (origin.x - current.x) * scale,
- (origin.y - current.y) * scale);
-};
-
-/**
- * Function: getOriginForCell
- *
- * Returns the top, left corner of the given cell. TODO: Improve performance
- * by using caching inside this method as the result per cell never changes
- * during the lifecycle of this object.
- */
-mxMorphing.prototype.getOriginForCell = function(cell)
-{
- var result = null;
-
- if (cell != null)
- {
- result = this.getOriginForCell(this.graph.getModel().getParent(cell));
- var geo = this.graph.getCellGeometry(cell);
-
- // TODO: Handle offset, relative geometries etc
- if (geo != null)
- {
- result.x += geo.x;
- result.y += geo.y;
- }
- }
-
- if (result == null)
- {
- var t = this.graph.view.getTranslate();
- result = new mxPoint(-t.x, -t.y);
- }
-
- return result;
-};
diff --git a/src/js/util/mxMouseEvent.js b/src/js/util/mxMouseEvent.js
deleted file mode 100644
index e161d3a..0000000
--- a/src/js/util/mxMouseEvent.js
+++ /dev/null
@@ -1,241 +0,0 @@
-/**
- * $Id: mxMouseEvent.js,v 1.20 2011-03-02 17:24:39 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxMouseEvent
- *
- * Base class for all mouse events in mxGraph. A listener for this event should
- * implement the following methods:
- *
- * (code)
- * graph.addMouseListener(
- * {
- * mouseDown: function(sender, evt)
- * {
- * mxLog.debug('mouseDown');
- * },
- * mouseMove: function(sender, evt)
- * {
- * mxLog.debug('mouseMove');
- * },
- * mouseUp: function(sender, evt)
- * {
- * mxLog.debug('mouseUp');
- * }
- * });
- * (end)
- *
- * Constructor: mxMouseEvent
- *
- * Constructs a new event object for the given arguments.
- *
- * Parameters:
- *
- * evt - Native mouse event.
- * state - Optional <mxCellState> under the mouse.
- *
- */
-function mxMouseEvent(evt, state)
-{
- this.evt = evt;
- this.state = state;
-};
-
-/**
- * Variable: consumed
- *
- * Holds the consumed state of this event.
- */
-mxMouseEvent.prototype.consumed = false;
-
-/**
- * Variable: evt
- *
- * Holds the inner event object.
- */
-mxMouseEvent.prototype.evt = null;
-
-/**
- * Variable: graphX
- *
- * Holds the x-coordinate of the event in the graph. This value is set in
- * <mxGraph.fireMouseEvent>.
- */
-mxMouseEvent.prototype.graphX = null;
-
-/**
- * Variable: graphY
- *
- * Holds the y-coordinate of the event in the graph. This value is set in
- * <mxGraph.fireMouseEvent>.
- */
-mxMouseEvent.prototype.graphY = null;
-
-/**
- * Variable: state
- *
- * Holds the optional <mxCellState> associated with this event.
- */
-mxMouseEvent.prototype.state = null;
-
-/**
- * Function: getEvent
- *
- * Returns <evt>.
- */
-mxMouseEvent.prototype.getEvent = function()
-{
- return this.evt;
-};
-
-/**
- * Function: getSource
- *
- * Returns the target DOM element using <mxEvent.getSource> for <evt>.
- */
-mxMouseEvent.prototype.getSource = function()
-{
- return mxEvent.getSource(this.evt);
-};
-
-/**
- * Function: isSource
- *
- * Returns true if the given <mxShape> is the source of <evt>.
- */
-mxMouseEvent.prototype.isSource = function(shape)
-{
- if (shape != null)
- {
- var source = this.getSource();
-
- while (source != null)
- {
- if (source == shape.node)
- {
- return true;
- }
-
- source = source.parentNode;
- }
- }
-
- return false;
-};
-
-/**
- * Function: getX
- *
- * Returns <evt.clientX>.
- */
-mxMouseEvent.prototype.getX = function()
-{
- return mxEvent.getClientX(this.getEvent());
-};
-
-/**
- * Function: getY
- *
- * Returns <evt.clientY>.
- */
-mxMouseEvent.prototype.getY = function()
-{
- return mxEvent.getClientY(this.getEvent());
-};
-
-/**
- * Function: getGraphX
- *
- * Returns <graphX>.
- */
-mxMouseEvent.prototype.getGraphX = function()
-{
- return this.graphX;
-};
-
-/**
- * Function: getGraphY
- *
- * Returns <graphY>.
- */
-mxMouseEvent.prototype.getGraphY = function()
-{
- return this.graphY;
-};
-
-/**
- * Function: getState
- *
- * Returns <state>.
- */
-mxMouseEvent.prototype.getState = function()
-{
- return this.state;
-};
-
-/**
- * Function: getCell
- *
- * Returns the <mxCell> in <state> is not null.
- */
-mxMouseEvent.prototype.getCell = function()
-{
- var state = this.getState();
-
- if (state != null)
- {
- return state.cell;
- }
-
- return null;
-};
-
-/**
- * Function: isPopupTrigger
- *
- * Returns true if the event is a popup trigger.
- */
-mxMouseEvent.prototype.isPopupTrigger = function()
-{
- return mxEvent.isPopupTrigger(this.getEvent());
-};
-
-/**
- * Function: isConsumed
- *
- * Returns <consumed>.
- */
-mxMouseEvent.prototype.isConsumed = function()
-{
- return this.consumed;
-};
-
-/**
- * Function: consume
- *
- * Sets <consumed> to true and invokes preventDefault on the native event
- * if such a method is defined. This is used mainly to avoid the cursor from
- * being changed to a text cursor in Webkit. You can use the preventDefault
- * flag to disable this functionality.
- *
- * Parameters:
- *
- * preventDefault - Specifies if the native event should be canceled. Default
- * is true.
- */
-mxMouseEvent.prototype.consume = function(preventDefault)
-{
- preventDefault = (preventDefault != null) ? preventDefault : true;
-
- if (preventDefault && this.evt.preventDefault)
- {
- this.evt.preventDefault();
- }
-
- // Workaround for images being dragged in IE
- this.evt.returnValue = false;
-
- // Sets local consumed state
- this.consumed = true;
-};
diff --git a/src/js/util/mxObjectIdentity.js b/src/js/util/mxObjectIdentity.js
deleted file mode 100644
index 778a4ea..0000000
--- a/src/js/util/mxObjectIdentity.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * $Id: mxObjectIdentity.js,v 1.8 2010-01-02 09:45:14 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-var mxObjectIdentity =
-{
- /**
- * Class: mxObjectIdentity
- *
- * Identity for JavaScript objects. This is implemented using a simple
- * incremeting counter which is stored in each object under <ID_NAME>.
- *
- * The identity for an object does not change during its lifecycle.
- *
- * Variable: FIELD_NAME
- *
- * Name of the field to be used to store the object ID. Default is
- * '_mxObjectId'.
- */
- FIELD_NAME: 'mxObjectId',
-
- /**
- * Variable: counter
- *
- * Current counter for objects.
- */
- counter: 0,
-
- /**
- * Function: get
- *
- * Returns the object id for the given object.
- */
- get: function(obj)
- {
- if (typeof(obj) == 'object' &&
- obj[mxObjectIdentity.FIELD_NAME] == null)
- {
- var ctor = mxUtils.getFunctionName(obj.constructor);
- obj[mxObjectIdentity.FIELD_NAME] = ctor+'#'+mxObjectIdentity.counter++;
- }
-
- return obj[mxObjectIdentity.FIELD_NAME];
- },
-
- /**
- * Function: clear
- *
- * Removes the object id from the given object.
- */
- clear: function(obj)
- {
- if (typeof(obj) == 'object')
- {
- delete obj[mxObjectIdentity.FIELD_NAME];
- }
- }
-
-};
diff --git a/src/js/util/mxPanningManager.js b/src/js/util/mxPanningManager.js
deleted file mode 100644
index 9f9f349..0000000
--- a/src/js/util/mxPanningManager.js
+++ /dev/null
@@ -1,262 +0,0 @@
-/**
- * $Id: mxPanningManager.js,v 1.7 2012-06-13 06:46:37 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxPanningManager
- *
- * Implements a handler for panning.
- */
-function mxPanningManager(graph)
-{
- this.thread = null;
- this.active = false;
- this.tdx = 0;
- this.tdy = 0;
- this.t0x = 0;
- this.t0y = 0;
- this.dx = 0;
- this.dy = 0;
- this.scrollbars = false;
- this.scrollLeft = 0;
- this.scrollTop = 0;
-
- this.mouseListener =
- {
- mouseDown: function(sender, me) { },
- mouseMove: function(sender, me) { },
- mouseUp: mxUtils.bind(this, function(sender, me)
- {
- if (this.active)
- {
- this.stop();
- }
- })
- };
-
- graph.addMouseListener(this.mouseListener);
-
- // Stops scrolling on every mouseup anywhere in the document
- mxEvent.addListener(document, 'mouseup', mxUtils.bind(this, function()
- {
- if (this.active)
- {
- this.stop();
- }
- }));
-
- var createThread = mxUtils.bind(this, function()
- {
- this.scrollbars = mxUtils.hasScrollbars(graph.container);
- this.scrollLeft = graph.container.scrollLeft;
- this.scrollTop = graph.container.scrollTop;
-
- return window.setInterval(mxUtils.bind(this, function()
- {
- this.tdx -= this.dx;
- this.tdy -= this.dy;
-
- if (this.scrollbars)
- {
- var left = -graph.container.scrollLeft - Math.ceil(this.dx);
- var top = -graph.container.scrollTop - Math.ceil(this.dy);
- graph.panGraph(left, top);
- graph.panDx = this.scrollLeft - graph.container.scrollLeft;
- graph.panDy = this.scrollTop - graph.container.scrollTop;
- graph.fireEvent(new mxEventObject(mxEvent.PAN));
- // TODO: Implement graph.autoExtend
- }
- else
- {
- graph.panGraph(this.getDx(), this.getDy());
- }
- }), this.delay);
- });
-
- this.isActive = function()
- {
- return active;
- };
-
- this.getDx = function()
- {
- return Math.round(this.tdx);
- };
-
- this.getDy = function()
- {
- return Math.round(this.tdy);
- };
-
- this.start = function()
- {
- this.t0x = graph.view.translate.x;
- this.t0y = graph.view.translate.y;
- this.active = true;
- };
-
- this.panTo = function(x, y, w, h)
- {
- if (!this.active)
- {
- this.start();
- }
-
- this.scrollLeft = graph.container.scrollLeft;
- this.scrollTop = graph.container.scrollTop;
-
- w = (w != null) ? w : 0;
- h = (h != null) ? h : 0;
-
- var c = graph.container;
- this.dx = x + w - c.scrollLeft - c.clientWidth;
-
- if (this.dx < 0 && Math.abs(this.dx) < this.border)
- {
- this.dx = this.border + this.dx;
- }
- else if (this.handleMouseOut)
- {
- this.dx = Math.max(this.dx, 0);
- }
- else
- {
- this.dx = 0;
- }
-
- if (this.dx == 0)
- {
- this.dx = x - c.scrollLeft;
-
- if (this.dx > 0 && this.dx < this.border)
- {
- this.dx = this.dx - this.border;
- }
- else if (this.handleMouseOut)
- {
- this.dx = Math.min(0, this.dx);
- }
- else
- {
- this.dx = 0;
- }
- }
-
- this.dy = y + h - c.scrollTop - c.clientHeight;
-
- if (this.dy < 0 && Math.abs(this.dy) < this.border)
- {
- this.dy = this.border + this.dy;
- }
- else if (this.handleMouseOut)
- {
- this.dy = Math.max(this.dy, 0);
- }
- else
- {
- this.dy = 0;
- }
-
- if (this.dy == 0)
- {
- this.dy = y - c.scrollTop;
-
- if (this.dy > 0 && this.dy < this.border)
- {
- this.dy = this.dy - this.border;
- }
- else if (this.handleMouseOut)
- {
- this.dy = Math.min(0, this.dy);
- }
- else
- {
- this.dy = 0;
- }
- }
-
- if (this.dx != 0 || this.dy != 0)
- {
- this.dx *= this.damper;
- this.dy *= this.damper;
-
- if (this.thread == null)
- {
- this.thread = createThread();
- }
- }
- else if (this.thread != null)
- {
- window.clearInterval(this.thread);
- this.thread = null;
- }
- };
-
- this.stop = function()
- {
- if (this.active)
- {
- this.active = false;
-
- if (this.thread != null)
- {
- window.clearInterval(this.thread);
- this.thread = null;
- }
-
- this.tdx = 0;
- this.tdy = 0;
-
- if (!this.scrollbars)
- {
- var px = graph.panDx;
- var py = graph.panDy;
-
- if (px != 0 || py != 0)
- {
- graph.panGraph(0, 0);
- graph.view.setTranslate(this.t0x + px / graph.view.scale, this.t0y + py / graph.view.scale);
- }
- }
- else
- {
- graph.panDx = 0;
- graph.panDy = 0;
- graph.fireEvent(new mxEventObject(mxEvent.PAN));
- }
- }
- };
-
- this.destroy = function()
- {
- graph.removeMouseListener(this.mouseListener);
- };
-};
-
-/**
- * Variable: damper
- *
- * Damper value for the panning. Default is 1/6.
- */
-mxPanningManager.prototype.damper = 1/6;
-
-/**
- * Variable: delay
- *
- * Delay in milliseconds for the panning. Default is 10.
- */
-mxPanningManager.prototype.delay = 10;
-
-/**
- * Variable: handleMouseOut
- *
- * Specifies if mouse events outside of the component should be handled. Default is true.
- */
-mxPanningManager.prototype.handleMouseOut = true;
-
-/**
- * Variable: border
- *
- * Border to handle automatic panning inside the component. Default is 0 (disabled).
- */
-mxPanningManager.prototype.border = 0;
diff --git a/src/js/util/mxPath.js b/src/js/util/mxPath.js
deleted file mode 100644
index 57efe74..0000000
--- a/src/js/util/mxPath.js
+++ /dev/null
@@ -1,314 +0,0 @@
-/**
- * $Id: mxPath.js,v 1.24 2012-06-13 17:31:32 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxPath
- *
- * An abstraction for creating VML and SVG paths. See <mxActor> for using this
- * object inside an <mxShape> for painting cells.
- *
- * Constructor: mxPath
- *
- * Constructs a path for the given format, which is one of svg or vml.
- *
- * Parameters:
- *
- * format - String specifying the <format>. May be one of vml or svg
- * (default).
- */
-function mxPath(format)
-{
- this.format = format;
- this.path = [];
- this.translate = new mxPoint(0, 0);
-};
-
-/**
- * Variable: format
- *
- * Defines the format for the output of this path. Possible values are
- * svg and vml.
- */
-mxPath.prototype.format = null;
-
-/**
- * Variable: translate
- *
- * <mxPoint> that specifies the translation of the complete path.
- */
-mxPath.prototype.translate = null;
-
-/**
- * Variable: scale
- *
- * Number that specifies the translation of the path.
- */
-mxPath.prototype.scale = 1;
-
-/**
- * Variable: path
- *
- * Contains the textual representation of the path as an array.
- */
-mxPath.prototype.path = null;
-
-/**
- * Function: isVml
- *
- * Returns true if <format> is vml.
- */
-mxPath.prototype.isVml = function()
-{
- return this.format == 'vml';
-};
-
-/**
- * Function: getPath
- *
- * Returns string that represents the path in <format>.
- */
-mxPath.prototype.getPath = function()
-{
- return this.path.join('');
-};
-
-/**
- * Function: setTranslate
- *
- * Set the global translation of this path, that is, the origin of the
- * coordinate system.
- *
- * Parameters:
- *
- * x - X-coordinate of the new origin.
- * y - Y-coordinate of the new origin.
- */
-mxPath.prototype.setTranslate = function(x, y)
-{
- this.translate = new mxPoint(x, y);
-};
-
-/**
- * Function: moveTo
- *
- * Moves the cursor to (x, y).
- *
- * Parameters:
- *
- * x - X-coordinate of the new cursor location.
- * y - Y-coordinate of the new cursor location.
- */
-mxPath.prototype.moveTo = function(x, y)
-{
- x += this.translate.x;
- y += this.translate.y;
-
- x *= this.scale;
- y *= this.scale;
-
- if (this.isVml())
- {
- this.path.push('m ', Math.round(x), ' ', Math.round(y), ' ');
- }
- else
- {
- this.path.push('M ', x, ' ', y, ' ');
- }
-};
-
-/**
- * Function: lineTo
- *
- * Draws a straight line from the current poin to (x, y).
- *
- * Parameters:
- *
- * x - X-coordinate of the endpoint.
- * y - Y-coordinate of the endpoint.
- */
-mxPath.prototype.lineTo = function(x, y)
-{
- x += this.translate.x;
- y += this.translate.y;
-
- x *= this.scale;
- y *= this.scale;
-
- if (this.isVml())
- {
- this.path.push('l ', Math.round(x), ' ', Math.round(y), ' ');
- }
- else
- {
- this.path.push('L ', x, ' ', y, ' ');
- }
-};
-
-/**
- * Function: quadTo
- *
- * Draws a quadratic Bézier curve from the current point to (x, y) using
- * (x1, y1) as the control point.
- *
- * Parameters:
- *
- * x1 - X-coordinate of the control point.
- * y1 - Y-coordinate of the control point.
- * x - X-coordinate of the endpoint.
- * y - Y-coordinate of the endpoint.
- */
-mxPath.prototype.quadTo = function(x1, y1, x, y)
-{
- x1 += this.translate.x;
- y1 += this.translate.y;
-
- x1 *= this.scale;
- y1 *= this.scale;
-
- x += this.translate.x;
- y += this.translate.y;
-
- x *= this.scale;
- y *= this.scale;
-
- if (this.isVml())
- {
- this.path.push('c ', Math.round(x1), ' ', Math.round(y1), ' ', Math.round(x), ' ',
- Math.round(y), ' ', Math.round(x), ' ', Math.round(y), ' ');
- }
- else
- {
- this.path.push('Q ', x1, ' ', y1, ' ', x, ' ', y, ' ');
- }
-};
-
-/**
- * Function: curveTo
- *
- * Draws a cubic Bézier curve from the current point to (x, y) using
- * (x1, y1) as the control point at the beginning of the curve and (x2, y2)
- * as the control point at the end of the curve.
- *
- * Parameters:
- *
- * x1 - X-coordinate of the first control point.
- * y1 - Y-coordinate of the first control point.
- * x2 - X-coordinate of the second control point.
- * y2 - Y-coordinate of the second control point.
- * x - X-coordinate of the endpoint.
- * y - Y-coordinate of the endpoint.
- */
-mxPath.prototype.curveTo = function(x1, y1, x2, y2, x, y)
-{
- x1 += this.translate.x;
- y1 += this.translate.y;
-
- x1 *= this.scale;
- y1 *= this.scale;
-
- x2 += this.translate.x;
- y2 += this.translate.y;
-
- x2 *= this.scale;
- y2 *= this.scale;
-
- x += this.translate.x;
- y += this.translate.y;
-
- x *= this.scale;
- y *= this.scale;
-
- if (this.isVml())
- {
- this.path.push('c ', Math.round(x1), ' ', Math.round(y1), ' ', Math.round(x2),
- ' ', Math.round(y2), ' ', Math.round(x), ' ', Math.round(y), ' ');
- }
- else
- {
- this.path.push('C ', x1, ' ', y1, ' ', x2,
- ' ', y2, ' ', x, ' ', y, ' ');
- }
-};
-
-/**
- * Function: ellipse
- *
- * Adds the given ellipse. Some implementations may require the path to be
- * closed after this operation.
- */
-mxPath.prototype.ellipse = function(x, y, w, h)
-{
- x += this.translate.x;
- y += this.translate.y;
- x *= this.scale;
- y *= this.scale;
-
- if (this.isVml())
- {
- this.path.push('at ', Math.round(x), ' ', Math.round(y), ' ', Math.round(x + w), ' ', Math.round(y + h), ' ',
- Math.round(x), ' ', Math.round(y + h / 2), ' ', Math.round(x), ' ', Math.round(y + h / 2));
- }
- else
- {
- var startX = x;
- var startY = y + h/2;
- var endX = x + w;
- var endY = y + h/2;
- var r1 = w/2;
- var r2 = h/2;
- this.path.push('M ', startX, ' ', startY, ' ');
- this.path.push('A ', r1, ' ', r2, ' 0 1 0 ', endX, ' ', endY, ' ');
- this.path.push('A ', r1, ' ', r2, ' 0 1 0 ', startX, ' ', startY);
- }
-};
-
-/**
- * Function: addPath
- *
- * Adds the given path.
- */
-mxPath.prototype.addPath = function(path)
-{
- this.path = this.path.concat(path.path);
-};
-
-/**
- * Function: write
- *
- * Writes directly into the path. This bypasses all conversions.
- */
-mxPath.prototype.write = function(string)
-{
- this.path.push(string, ' ');
-};
-
-/**
- * Function: end
- *
- * Ends the path.
- */
-mxPath.prototype.end = function()
-{
- if (this.format == 'vml')
- {
- this.path.push('e');
- }
-};
-
-/**
- * Function: close
- *
- * Closes the path.
- */
-mxPath.prototype.close = function()
-{
- if (this.format == 'vml')
- {
- this.path.push('x e');
- }
- else
- {
- this.path.push('Z');
- }
-};
diff --git a/src/js/util/mxPoint.js b/src/js/util/mxPoint.js
deleted file mode 100644
index e029a29..0000000
--- a/src/js/util/mxPoint.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * $Id: mxPoint.js,v 1.12 2010-01-02 09:45:14 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxPoint
- *
- * Implements a 2-dimensional vector with double precision coordinates.
- *
- * Constructor: mxPoint
- *
- * Constructs a new point for the optional x and y coordinates. If no
- * coordinates are given, then the default values for <x> and <y> are used.
- */
-function mxPoint(x, y)
-{
- this.x = (x != null) ? x : 0;
- this.y = (y != null) ? y : 0;
-};
-
-/**
- * Variable: x
- *
- * Holds the x-coordinate of the point. Default is 0.
- */
-mxPoint.prototype.x = null;
-
-/**
- * Variable: y
- *
- * Holds the y-coordinate of the point. Default is 0.
- */
-mxPoint.prototype.y = null;
-
-/**
- * Function: equals
- *
- * Returns true if the given object equals this rectangle.
- */
-mxPoint.prototype.equals = function(obj)
-{
- return obj.x == this.x &&
- obj.y == this.y;
-};
-
-/**
- * Function: clone
- *
- * Returns a clone of this <mxPoint>.
- */
-mxPoint.prototype.clone = function()
-{
- // Handles subclasses as well
- return mxUtils.clone(this);
-};
diff --git a/src/js/util/mxPopupMenu.js b/src/js/util/mxPopupMenu.js
deleted file mode 100644
index b188cb6..0000000
--- a/src/js/util/mxPopupMenu.js
+++ /dev/null
@@ -1,574 +0,0 @@
-/**
- * $Id: mxPopupMenu.js,v 1.37 2012-04-22 10:16:23 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxPopupMenu
- *
- * Event handler that pans and creates popupmenus. To use the left
- * mousebutton for panning without interfering with cell moving and
- * resizing, use <isUseLeftButton> and <isIgnoreCell>. For grid size
- * steps while panning, use <useGrid>. This handler is built-into
- * <mxGraph.panningHandler> and enabled using <mxGraph.setPanning>.
- *
- * Constructor: mxPopupMenu
- *
- * Constructs an event handler that creates a popupmenu. The
- * event handler is not installed anywhere in this ctor.
- *
- * Event: mxEvent.SHOW
- *
- * Fires after the menu has been shown in <popup>.
- */
-function mxPopupMenu(factoryMethod)
-{
- this.factoryMethod = factoryMethod;
-
- if (factoryMethod != null)
- {
- this.init();
- }
-};
-
-/**
- * Extends mxEventSource.
- */
-mxPopupMenu.prototype = new mxEventSource();
-mxPopupMenu.prototype.constructor = mxPopupMenu;
-
-/**
- * Variable: submenuImage
- *
- * URL of the image to be used for the submenu icon.
- */
-mxPopupMenu.prototype.submenuImage = mxClient.imageBasePath + '/submenu.gif';
-
-/**
- * Variable: zIndex
- *
- * Specifies the zIndex for the popupmenu and its shadow. Default is 1006.
- */
-mxPopupMenu.prototype.zIndex = 10006;
-
-/**
- * Variable: factoryMethod
- *
- * Function that is used to create the popup menu. The function takes the
- * current panning handler, the <mxCell> under the mouse and the mouse
- * event that triggered the call as arguments.
- */
-mxPopupMenu.prototype.factoryMethod = null;
-
-/**
- * Variable: useLeftButtonForPopup
- *
- * Specifies if popupmenus should be activated by clicking the left mouse
- * button. Default is false.
- */
-mxPopupMenu.prototype.useLeftButtonForPopup = false;
-
-/**
- * Variable: enabled
- *
- * Specifies if events are handled. Default is true.
- */
-mxPopupMenu.prototype.enabled = true;
-
-/**
- * Variable: itemCount
- *
- * Contains the number of times <addItem> has been called for a new menu.
- */
-mxPopupMenu.prototype.itemCount = 0;
-
-/**
- * Variable: autoExpand
- *
- * Specifies if submenus should be expanded on mouseover. Default is false.
- */
-mxPopupMenu.prototype.autoExpand = false;
-
-/**
- * Variable: smartSeparators
- *
- * Specifies if separators should only be added if a menu item follows them.
- * Default is false.
- */
-mxPopupMenu.prototype.smartSeparators = false;
-
-/**
- * Variable: labels
- *
- * Specifies if any labels should be visible. Default is true.
- */
-mxPopupMenu.prototype.labels = true;
-
-/**
- * Function: init
- *
- * Initializes the shapes required for this vertex handler.
- */
-mxPopupMenu.prototype.init = function()
-{
- // Adds the inner table
- this.table = document.createElement('table');
- this.table.className = 'mxPopupMenu';
-
- this.tbody = document.createElement('tbody');
- this.table.appendChild(this.tbody);
-
- // Adds the outer div
- this.div = document.createElement('div');
- this.div.className = 'mxPopupMenu';
- this.div.style.display = 'inline';
- this.div.style.zIndex = this.zIndex;
- this.div.appendChild(this.table);
-
- // Disables the context menu on the outer div
- mxEvent.disableContextMenu(this.div);
-};
-
-/**
- * Function: isEnabled
- *
- * Returns true if events are handled. This implementation
- * returns <enabled>.
- */
-mxPopupMenu.prototype.isEnabled = function()
-{
- return this.enabled;
-};
-
-/**
- * Function: setEnabled
- *
- * Enables or disables event handling. This implementation
- * updates <enabled>.
- */
-mxPopupMenu.prototype.setEnabled = function(enabled)
-{
- this.enabled = enabled;
-};
-
-/**
- * Function: isPopupTrigger
- *
- * Returns true if the given event is a popupmenu trigger for the optional
- * given cell.
- *
- * Parameters:
- *
- * me - <mxMouseEvent> that represents the mouse event.
- */
-mxPopupMenu.prototype.isPopupTrigger = function(me)
-{
- return me.isPopupTrigger() || (this.useLeftButtonForPopup &&
- mxEvent.isLeftMouseButton(me.getEvent()));
-};
-
-/**
- * Function: addItem
- *
- * Adds the given item to the given parent item. If no parent item is specified
- * then the item is added to the top-level menu. The return value may be used
- * as the parent argument, ie. as a submenu item. The return value is the table
- * row that represents the item.
- *
- * Paramters:
- *
- * title - String that represents the title of the menu item.
- * image - Optional URL for the image icon.
- * funct - Function associated that takes a mouseup or touchend event.
- * parent - Optional item returned by <addItem>.
- * iconCls - Optional string that represents the CSS class for the image icon.
- * IconsCls is ignored if image is given.
- * enabled - Optional boolean indicating if the item is enabled. Default is true.
- */
-mxPopupMenu.prototype.addItem = function(title, image, funct, parent, iconCls, enabled)
-{
- parent = parent || this;
- this.itemCount++;
-
- // Smart separators only added if element contains items
- if (parent.willAddSeparator)
- {
- if (parent.containsItems)
- {
- this.addSeparator(parent, true);
- }
-
- parent.willAddSeparator = false;
- }
-
- parent.containsItems = true;
- var tr = document.createElement('tr');
- tr.className = 'mxPopupMenuItem';
- var col1 = document.createElement('td');
- col1.className = 'mxPopupMenuIcon';
-
- // Adds the given image into the first column
- if (image != null)
- {
- var img = document.createElement('img');
- img.src = image;
- col1.appendChild(img);
- }
- else if (iconCls != null)
- {
- var div = document.createElement('div');
- div.className = iconCls;
- col1.appendChild(div);
- }
-
- tr.appendChild(col1);
-
- if (this.labels)
- {
- var col2 = document.createElement('td');
- col2.className = 'mxPopupMenuItem' +
- ((enabled != null && !enabled) ? ' disabled' : '');
- mxUtils.write(col2, title);
- col2.align = 'left';
- tr.appendChild(col2);
-
- var col3 = document.createElement('td');
- col3.className = 'mxPopupMenuItem' +
- ((enabled != null && !enabled) ? ' disabled' : '');
- col3.style.paddingRight = '6px';
- col3.style.textAlign = 'right';
-
- tr.appendChild(col3);
-
- if (parent.div == null)
- {
- this.createSubmenu(parent);
- }
- }
-
- parent.tbody.appendChild(tr);
-
- if (enabled == null || enabled)
- {
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- var mm = (mxClient.IS_TOUCH) ? 'touchmove' : 'mousemove';
- var mu = (mxClient.IS_TOUCH) ? 'touchend' : 'mouseup';
-
- // Consumes the event on mouse down
- mxEvent.addListener(tr, md, mxUtils.bind(this, function(evt)
- {
- this.eventReceiver = tr;
-
- if (parent.activeRow != tr && parent.activeRow != parent)
- {
- if (parent.activeRow != null &&
- parent.activeRow.div.parentNode != null)
- {
- this.hideSubmenu(parent);
- }
-
- if (tr.div != null)
- {
- this.showSubmenu(parent, tr);
- parent.activeRow = tr;
- }
- }
-
- mxEvent.consume(evt);
- }));
-
- mxEvent.addListener(tr, mm, mxUtils.bind(this, function(evt)
- {
- if (parent.activeRow != tr && parent.activeRow != parent)
- {
- if (parent.activeRow != null &&
- parent.activeRow.div.parentNode != null)
- {
- this.hideSubmenu(parent);
- }
-
- if (this.autoExpand && tr.div != null)
- {
- this.showSubmenu(parent, tr);
- parent.activeRow = tr;
- }
- }
-
- // Sets hover style because TR in IE doesn't have hover
- tr.className = 'mxPopupMenuItemHover';
- }));
-
- mxEvent.addListener(tr, mu, mxUtils.bind(this, function(evt)
- {
- // EventReceiver avoids clicks on a submenu item
- // which has just been shown in the mousedown
- if (this.eventReceiver == tr)
- {
- if (parent.activeRow != tr)
- {
- this.hideMenu();
- }
-
- if (funct != null)
- {
- funct(evt);
- }
- }
-
- this.eventReceiver = null;
- mxEvent.consume(evt);
- }));
-
- // Resets hover style because TR in IE doesn't have hover
- mxEvent.addListener(tr, 'mouseout',
- mxUtils.bind(this, function(evt)
- {
- tr.className = 'mxPopupMenuItem';
- })
- );
- }
-
- return tr;
-};
-
-/**
- * Function: createSubmenu
- *
- * Creates the nodes required to add submenu items inside the given parent
- * item. This is called in <addItem> if a parent item is used for the first
- * time. This adds various DOM nodes and a <submenuImage> to the parent.
- *
- * Parameters:
- *
- * parent - An item returned by <addItem>.
- */
-mxPopupMenu.prototype.createSubmenu = function(parent)
-{
- parent.table = document.createElement('table');
- parent.table.className = 'mxPopupMenu';
-
- parent.tbody = document.createElement('tbody');
- parent.table.appendChild(parent.tbody);
-
- parent.div = document.createElement('div');
- parent.div.className = 'mxPopupMenu';
-
- parent.div.style.position = 'absolute';
- parent.div.style.display = 'inline';
- parent.div.style.zIndex = this.zIndex;
-
- parent.div.appendChild(parent.table);
-
- var img = document.createElement('img');
- img.setAttribute('src', this.submenuImage);
-
- // Last column of the submenu item in the parent menu
- td = parent.firstChild.nextSibling.nextSibling;
- td.appendChild(img);
-};
-
-/**
- * Function: showSubmenu
- *
- * Shows the submenu inside the given parent row.
- */
-mxPopupMenu.prototype.showSubmenu = function(parent, row)
-{
- if (row.div != null)
- {
- row.div.style.left = (parent.div.offsetLeft +
- row.offsetLeft+row.offsetWidth - 1) + 'px';
- row.div.style.top = (parent.div.offsetTop+row.offsetTop) + 'px';
- document.body.appendChild(row.div);
-
- // Moves the submenu to the left side if there is no space
- var left = parseInt(row.div.offsetLeft);
- var width = parseInt(row.div.offsetWidth);
-
- var b = document.body;
- var d = document.documentElement;
-
- var right = (b.scrollLeft || d.scrollLeft) + (b.clientWidth || d.clientWidth);
-
- if (left + width > right)
- {
- row.div.style.left = (parent.div.offsetLeft - width +
- ((mxClient.IS_IE) ? 6 : -6)) + 'px';
- }
-
- mxUtils.fit(row.div);
- }
-};
-
-/**
- * Function: addSeparator
- *
- * Adds a horizontal separator in the given parent item or the top-level menu
- * if no parent is specified.
- *
- * Parameters:
- *
- * parent - Optional item returned by <addItem>.
- * force - Optional boolean to ignore <smartSeparators>. Default is false.
- */
-mxPopupMenu.prototype.addSeparator = function(parent, force)
-{
- parent = parent || this;
-
- if (this.smartSeparators && !force)
- {
- parent.willAddSeparator = true;
- }
- else if (parent.tbody != null)
- {
- parent.willAddSeparator = false;
- var tr = document.createElement('tr');
-
- var col1 = document.createElement('td');
- col1.className = 'mxPopupMenuIcon';
- col1.style.padding = '0 0 0 0px';
-
- tr.appendChild(col1);
-
- var col2 = document.createElement('td');
- col2.style.padding = '0 0 0 0px';
- col2.setAttribute('colSpan', '2');
-
- var hr = document.createElement('hr');
- hr.setAttribute('size', '1');
- col2.appendChild(hr);
-
- tr.appendChild(col2);
-
- parent.tbody.appendChild(tr);
- }
-};
-
-/**
- * Function: popup
- *
- * Shows the popup menu for the given event and cell.
- *
- * Example:
- *
- * (code)
- * graph.panningHandler.popup = function(x, y, cell, evt)
- * {
- * mxUtils.alert('Hello, World!');
- * }
- * (end)
- */
-mxPopupMenu.prototype.popup = function(x, y, cell, evt)
-{
- if (this.div != null && this.tbody != null && this.factoryMethod != null)
- {
- this.div.style.left = x + 'px';
- this.div.style.top = y + 'px';
-
- // Removes all child nodes from the existing menu
- while (this.tbody.firstChild != null)
- {
- mxEvent.release(this.tbody.firstChild);
- this.tbody.removeChild(this.tbody.firstChild);
- }
-
- this.itemCount = 0;
- this.factoryMethod(this, cell, evt);
-
- if (this.itemCount > 0)
- {
- this.showMenu();
- this.fireEvent(new mxEventObject(mxEvent.SHOW));
- }
- }
-};
-
-/**
- * Function: isMenuShowing
- *
- * Returns true if the menu is showing.
- */
-mxPopupMenu.prototype.isMenuShowing = function()
-{
- return this.div != null && this.div.parentNode == document.body;
-};
-
-/**
- * Function: showMenu
- *
- * Shows the menu.
- */
-mxPopupMenu.prototype.showMenu = function()
-{
- // Disables filter-based shadow in IE9 standards mode
- if (document.documentMode >= 9)
- {
- this.div.style.filter = 'none';
- }
-
- // Fits the div inside the viewport
- document.body.appendChild(this.div);
- mxUtils.fit(this.div);
-};
-
-/**
- * Function: hideMenu
- *
- * Removes the menu and all submenus.
- */
-mxPopupMenu.prototype.hideMenu = function()
-{
- if (this.div != null)
- {
- if (this.div.parentNode != null)
- {
- this.div.parentNode.removeChild(this.div);
- }
-
- this.hideSubmenu(this);
- this.containsItems = false;
- }
-};
-
-/**
- * Function: hideSubmenu
- *
- * Removes all submenus inside the given parent.
- *
- * Parameters:
- *
- * parent - An item returned by <addItem>.
- */
-mxPopupMenu.prototype.hideSubmenu = function(parent)
-{
- if (parent.activeRow != null)
- {
- this.hideSubmenu(parent.activeRow);
-
- if (parent.activeRow.div.parentNode != null)
- {
- parent.activeRow.div.parentNode.removeChild(parent.activeRow.div);
- }
-
- parent.activeRow = null;
- }
-};
-
-/**
- * Function: destroy
- *
- * Destroys the handler and all its resources and DOM nodes.
- */
-mxPopupMenu.prototype.destroy = function()
-{
- if (this.div != null)
- {
- mxEvent.release(this.div);
-
- if (this.div.parentNode != null)
- {
- this.div.parentNode.removeChild(this.div);
- }
-
- this.div = null;
- }
-};
diff --git a/src/js/util/mxRectangle.js b/src/js/util/mxRectangle.js
deleted file mode 100644
index 035abf5..0000000
--- a/src/js/util/mxRectangle.js
+++ /dev/null
@@ -1,134 +0,0 @@
-/**
- * $Id: mxRectangle.js,v 1.17 2010-12-08 12:46:03 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxRectangle
- *
- * Extends <mxPoint> to implement a 2-dimensional rectangle with double
- * precision coordinates.
- *
- * Constructor: mxRectangle
- *
- * Constructs a new rectangle for the optional parameters. If no parameters
- * are given then the respective default values are used.
- */
-function mxRectangle(x, y, width, height)
-{
- mxPoint.call(this, x, y);
-
- this.width = (width != null) ? width : 0;
- this.height = (height != null) ? height : 0;
-};
-
-/**
- * Extends mxPoint.
- */
-mxRectangle.prototype = new mxPoint();
-mxRectangle.prototype.constructor = mxRectangle;
-
-/**
- * Variable: width
- *
- * Holds the width of the rectangle. Default is 0.
- */
-mxRectangle.prototype.width = null;
-
-/**
- * Variable: height
- *
- * Holds the height of the rectangle. Default is 0.
- */
-mxRectangle.prototype.height = null;
-
-/**
- * Function: setRect
- *
- * Sets this rectangle to the specified values
- */
-mxRectangle.prototype.setRect = function(x, y, w, h)
-{
- this.x = x;
- this.y = y;
- this.width = w;
- this.height = h;
-};
-
-/**
- * Function: getCenterX
- *
- * Returns the x-coordinate of the center point.
- */
-mxRectangle.prototype.getCenterX = function ()
-{
- return this.x + this.width/2;
-};
-
-/**
- * Function: getCenterY
- *
- * Returns the y-coordinate of the center point.
- */
-mxRectangle.prototype.getCenterY = function ()
-{
- return this.y + this.height/2;
-};
-
-/**
- * Function: add
- *
- * Adds the given rectangle to this rectangle.
- */
-mxRectangle.prototype.add = function(rect)
-{
- if (rect != null)
- {
- var minX = Math.min(this.x, rect.x);
- var minY = Math.min(this.y, rect.y);
- var maxX = Math.max(this.x + this.width, rect.x + rect.width);
- var maxY = Math.max(this.y + this.height, rect.y + rect.height);
-
- this.x = minX;
- this.y = minY;
- this.width = maxX - minX;
- this.height = maxY - minY;
- }
-};
-
-/**
- * Function: grow
- *
- * Grows the rectangle by the given amount, that is, this method subtracts
- * the given amount from the x- and y-coordinates and adds twice the amount
- * to the width and height.
- */
-mxRectangle.prototype.grow = function(amount)
-{
- this.x -= amount;
- this.y -= amount;
- this.width += 2 * amount;
- this.height += 2 * amount;
-};
-
-/**
- * Function: getPoint
- *
- * Returns the top, left corner as a new <mxPoint>.
- */
-mxRectangle.prototype.getPoint = function()
-{
- return new mxPoint(this.x, this.y);
-};
-
-/**
- * Function: equals
- *
- * Returns true if the given object equals this rectangle.
- */
-mxRectangle.prototype.equals = function(obj)
-{
- return obj.x == this.x &&
- obj.y == this.y &&
- obj.width == this.width &&
- obj.height == this.height;
-};
diff --git a/src/js/util/mxResources.js b/src/js/util/mxResources.js
deleted file mode 100644
index 0969ebe..0000000
--- a/src/js/util/mxResources.js
+++ /dev/null
@@ -1,366 +0,0 @@
-/**
- * $Id: mxResources.js,v 1.32 2012-10-26 13:36:50 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-var mxResources =
-{
- /**
- * Class: mxResources
- *
- * Implements internationalization. You can provide any number of
- * resource files on the server using the following format for the
- * filename: name[-en].properties. The en stands for any lowercase
- * 2-character language shortcut (eg. de for german, fr for french).
- *
- * If the optional language extension is omitted, then the file is used as a
- * default resource which is loaded in all cases. If a properties file for a
- * specific language exists, then it is used to override the settings in the
- * default resource. All entries in the file are of the form key=value. The
- * values may then be accessed in code via <get>. Lines without
- * equal signs in the properties files are ignored.
- *
- * Resource files may either be added programmatically using
- * <add> or via a resource tag in the UI section of the
- * editor configuration file, eg:
- *
- * (code)
- * <mxEditor>
- * <ui>
- * <resource basename="examples/resources/mxWorkflow"/>
- * (end)
- *
- * The above element will load examples/resources/mxWorkflow.properties as well
- * as the language specific file for the current language, if it exists.
- *
- * Values may contain placeholders of the form {1}...{n} where each placeholder
- * is replaced with the value of the corresponding array element in the params
- * argument passed to <mxResources.get>. The placeholder {1} maps to the first
- * element in the array (at index 0).
- *
- * See <mxClient.language> for more information on specifying the default
- * language or disabling all loading of resources.
- *
- * Lines that start with a # sign will be ignored.
- *
- * Special characters
- *
- * To use unicode characters, use the standard notation (eg. \u8fd1) or %u as a
- * prefix (eg. %u20AC will display a Euro sign). For normal hex encoded strings,
- * use % as a prefix, eg. %F6 will display a � (&ouml;).
- *
- * See <resourcesEncoded> to disable this. If you disable this, make sure that
- * your files are UTF-8 encoded.
- *
- * Variable: resources
- *
- * Associative array that maps from keys to values.
- */
- resources: [],
-
- /**
- * Variable: extension
- *
- * Specifies the extension used for language files. Default is '.properties'.
- */
- extension: '.properties',
-
- /**
- * Variable: resourcesEncoded
- *
- * Specifies whether or not values in resource files are encoded with \u or
- * percentage. Default is true.
- */
- resourcesEncoded: true,
-
- /**
- * Variable: loadDefaultBundle
- *
- * Specifies if the default file for a given basename should be loaded.
- * Default is true.
- */
- loadDefaultBundle: true,
-
- /**
- * Variable: loadDefaultBundle
- *
- * Specifies if the specific language file file for a given basename should
- * be loaded. Default is true.
- */
- loadSpecialBundle: true,
-
- /**
- * Function: isBundleSupported
- *
- * Hook for subclassers to disable support for a given language. This
- * implementation always returns true.
- *
- * Parameters:
- *
- * basename - The basename for which the file should be loaded.
- * lan - The current language.
- */
- isLanguageSupported: function(lan)
- {
- if (mxClient.languages != null)
- {
- return mxUtils.indexOf(mxClient.languages, lan) >= 0;
- }
-
- return true;
- },
-
- /**
- * Function: getDefaultBundle
- *
- * Hook for subclassers to return the URL for the special bundle. This
- * implementation returns basename + <extension> or null if
- * <loadDefaultBundle> is false.
- *
- * Parameters:
- *
- * basename - The basename for which the file should be loaded.
- * lan - The current language.
- */
- getDefaultBundle: function(basename, lan)
- {
- if (mxResources.loadDefaultBundle || !mxResources.isLanguageSupported(lan))
- {
- return basename + mxResources.extension;
- }
- else
- {
- return null;
- }
- },
-
- /**
- * Function: getSpecialBundle
- *
- * Hook for subclassers to return the URL for the special bundle. This
- * implementation returns basename + '_' + lan + <extension> or null if
- * <loadSpecialBundle> is false or lan equals <mxClient.defaultLanguage>.
- *
- * If <mxResources.languages> is not null and <mxClient.language> contains
- * a dash, then this method checks if <isLanguageSupported> returns true
- * for the full language (including the dash). If that returns false the
- * first part of the language (up to the dash) will be tried as an extension.
- *
- * If <mxResources.language> is null then the first part of the language is
- * used to maintain backwards compatibility.
- *
- * Parameters:
- *
- * basename - The basename for which the file should be loaded.
- * lan - The language for which the file should be loaded.
- */
- getSpecialBundle: function(basename, lan)
- {
- if (mxClient.languages == null || !this.isLanguageSupported(lan))
- {
- var dash = lan.indexOf('-');
-
- if (dash > 0)
- {
- lan = lan.substring(0, dash);
- }
- }
-
- if (mxResources.loadSpecialBundle && mxResources.isLanguageSupported(lan) && lan != mxClient.defaultLanguage)
- {
- return basename + '_' + lan + mxResources.extension;
- }
- else
- {
- return null;
- }
- },
-
- /**
- * Function: add
- *
- * Adds the default and current language properties
- * file for the specified basename. Existing keys
- * are overridden as new files are added.
- *
- * Example:
- *
- * At application startup, additional resources may be
- * added using the following code:
- *
- * (code)
- * mxResources.add('resources/editor');
- * (end)
- */
- add: function(basename, lan)
- {
- lan = (lan != null) ? lan : mxClient.language.toLowerCase();
-
- if (lan != mxConstants.NONE)
- {
- // Loads the common language file (no extension)
- var defaultBundle = mxResources.getDefaultBundle(basename, lan);
-
- if (defaultBundle != null)
- {
- try
- {
- var req = mxUtils.load(defaultBundle);
-
- if (req.isReady())
- {
- mxResources.parse(req.getText());
- }
- }
- catch (e)
- {
- // ignore
- }
- }
-
- // Overlays the language specific file (_lan-extension)
- var specialBundle = mxResources.getSpecialBundle(basename, lan);
-
- if (specialBundle != null)
- {
- try
- {
- var req = mxUtils.load(specialBundle);
-
- if (req.isReady())
- {
- mxResources.parse(req.getText());
- }
- }
- catch (e)
- {
- // ignore
- }
- }
- }
- },
-
- /**
- * Function: parse
- *
- * Parses the key, value pairs in the specified
- * text and stores them as local resources.
- */
- parse: function(text)
- {
- if (text != null)
- {
- var lines = text.split('\n');
-
- for (var i = 0; i < lines.length; i++)
- {
- if (lines[i].charAt(0) != '#')
- {
- var index = lines[i].indexOf('=');
-
- if (index > 0)
- {
- var key = lines[i].substring(0, index);
- var idx = lines[i].length;
-
- if (lines[i].charCodeAt(idx - 1) == 13)
- {
- idx--;
- }
-
- var value = lines[i].substring(index + 1, idx);
-
- if (this.resourcesEncoded)
- {
- value = value.replace(/\\(?=u[a-fA-F\d]{4})/g,"%");
- mxResources.resources[key] = unescape(value);
- }
- else
- {
- mxResources.resources[key] = value;
- }
- }
- }
- }
- }
- },
-
- /**
- * Function: get
- *
- * Returns the value for the specified resource key.
- *
- * Example:
- * To read the value for 'welomeMessage', use the following:
- * (code)
- * var result = mxResources.get('welcomeMessage') || '';
- * (end)
- *
- * This would require an entry of the following form in
- * one of the English language resource files:
- * (code)
- * welcomeMessage=Welcome to mxGraph!
- * (end)
- *
- * The part behind the || is the string value to be used if the given
- * resource is not available.
- *
- * Parameters:
- *
- * key - String that represents the key of the resource to be returned.
- * params - Array of the values for the placeholders of the form {1}...{n}
- * to be replaced with in the resulting string.
- * defaultValue - Optional string that specifies the default return value.
- */
- get: function(key, params, defaultValue)
- {
- var value = mxResources.resources[key];
-
- // Applies the default value if no resource was found
- if (value == null)
- {
- value = defaultValue;
- }
-
- // Replaces the placeholders with the values in the array
- if (value != null &&
- params != null)
- {
- var result = [];
- var index = null;
-
- for (var i = 0; i < value.length; i++)
- {
- var c = value.charAt(i);
-
- if (c == '{')
- {
- index = '';
- }
- else if (index != null && c == '}')
- {
- index = parseInt(index)-1;
-
- if (index >= 0 && index < params.length)
- {
- result.push(params[index]);
- }
-
- index = null;
- }
- else if (index != null)
- {
- index += c;
- }
- else
- {
- result.push(c);
- }
- }
-
- value = result.join('');
- }
-
- return value;
- }
-
-};
diff --git a/src/js/util/mxSession.js b/src/js/util/mxSession.js
deleted file mode 100644
index 4c2a70c..0000000
--- a/src/js/util/mxSession.js
+++ /dev/null
@@ -1,674 +0,0 @@
-/**
- * $Id: mxSession.js,v 1.46 2012-08-22 15:30:49 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxSession
- *
- * Session for sharing an <mxGraphModel> with other parties
- * via a backend that acts as a multicaster for all changes.
- *
- * Diagram Sharing:
- *
- * The diagram sharing is a mechanism where each atomic change of the model is
- * encoded into XML using <mxCodec> and then transmitted to the server by the
- * <mxSession> object. On the server, the XML data is dispatched to each
- * listener on the same diagram (except the sender), and the XML is decoded
- * back into atomic changes on the client side, which are then executed on the
- * model and stored in the command history.
- *
- * The <mxSession.significantRemoteChanges> specifies how these changes are
- * treated with respect to undo: The default value (true) will undo the last
- * change regardless of whether it was a remote or a local change. If the
- * switch is false, then an undo will go back until the last local change,
- * silently undoing all remote changes up to that point. Note that these
- * changes will be added as new remote changes to the history of the other
- * clients.
- *
- * Event: mxEvent.CONNECT
- *
- * Fires after the session has been started, that is, after the response to the
- * initial request was received and the session goes into polling mode. This
- * event has no properties.
- *
- * Event: mxEvent.SUSPEND
- *
- * Fires after <suspend> was called an the session was not already in suspended
- * state. This event has no properties.
- *
- * Event: mxEvent.RESUME
- *
- * Fires after the session was resumed in <resume>. This event has no
- * properties.
- *
- * Event: mxEvent.DISCONNECT
- *
- * Fires after the session was stopped in <stop>. The <code>reason</code>
- * property contains the optional exception that was passed to the stop method.
- *
- * Event: mxEvent.NOTIFY
- *
- * Fires after a notification was sent in <notify>. The <code>url</code>
- * property contains the URL and the <code>xml</code> property contains the XML
- * data of the request.
- *
- * Event: mxEvent.GET
- *
- * Fires after a response was received in <get>. The <code>url</code> property
- * contains the URL and the <code>request</code> is the <mxXmlRequest> that
- * contains the response.
- *
- * Event: mxEvent.FIRED
- *
- * Fires after an array of edits has been executed on the model. The
- * <code>changes</code> property contains the array of changes.
- *
- * Event: mxEvent.RECEIVE
- *
- * Fires after an XML node was received in <receive>. The <code>node</code>
- * property contains the node that was received.
- *
- * Constructor: mxSession
- *
- * Constructs a new session using the given <mxGraphModel> and URLs to
- * communicate with the backend.
- *
- * Parameters:
- *
- * model - <mxGraphModel> that contains the data.
- * urlInit - URL to be used for initializing the session.
- * urlPoll - URL to be used for polling the backend.
- * urlNotify - URL to be used for sending changes to the backend.
- */
-function mxSession(model, urlInit, urlPoll, urlNotify)
-{
- this.model = model;
- this.urlInit = urlInit;
- this.urlPoll = urlPoll;
- this.urlNotify = urlNotify;
-
- // Resolves cells by id using the model
- if (model != null)
- {
- this.codec = new mxCodec();
-
- this.codec.lookup = function(id)
- {
- return model.getCell(id);
- };
- }
-
- // Adds the listener for notifying the backend of any
- // changes in the model
- model.addListener(mxEvent.NOTIFY, mxUtils.bind(this, function(sender, evt)
- {
- var edit = evt.getProperty('edit');
-
- if (edit != null && this.debug || (this.connected && !this.suspended))
- {
- this.notify('<edit>'+this.encodeChanges(edit.changes, edit.undone)+'</edit>');
- }
- }));
-};
-
-/**
- * Extends mxEventSource.
- */
-mxSession.prototype = new mxEventSource();
-mxSession.prototype.constructor = mxSession;
-
-/**
- * Variable: model
- *
- * Reference to the enclosing <mxGraphModel>.
- */
-mxSession.prototype.model = null;
-
-/**
- * Variable: urlInit
- *
- * URL to initialize the session.
- */
-mxSession.prototype.urlInit = null;
-
-/**
- * Variable: urlPoll
- *
- * URL for polling the backend.
- */
-mxSession.prototype.urlPoll = null;
-
-/**
- * Variable: urlNotify
- *
- * URL to send changes to the backend.
- */
-mxSession.prototype.urlNotify = null;
-
-/**
- * Variable: codec
- *
- * Reference to the <mxCodec> used to encoding and decoding changes.
- */
-mxSession.prototype.codec = null;
-
-/**
- * Variable: linefeed
- *
- * Used for encoding linefeeds. Default is '&#xa;'.
- */
-mxSession.prototype.linefeed = '&#xa;';
-
-/**
- * Variable: escapePostData
- *
- * Specifies if the data in the post request sent in <notify>
- * should be converted using encodeURIComponent. Default is true.
- */
-mxSession.prototype.escapePostData = true;
-
-/**
- * Variable: significantRemoteChanges
- *
- * Whether remote changes should be significant in the
- * local command history. Default is true.
- */
-mxSession.prototype.significantRemoteChanges = true;
-
-/**
- * Variable: sent
- *
- * Total number of sent bytes.
- */
-mxSession.prototype.sent = 0;
-
-/**
- * Variable: received
- *
- * Total number of received bytes.
- */
-mxSession.prototype.received = 0;
-
-/**
- * Variable: debug
- *
- * Specifies if the session should run in debug mode. In this mode, no
- * connection is established. The data is written to the console instead.
- * Default is false.
- */
-mxSession.prototype.debug = false;
-
-/**
- * Variable: connected
- */
-mxSession.prototype.connected = false;
-
-/**
- * Variable: send
- */
-mxSession.prototype.suspended = false;
-
-/**
- * Variable: polling
- */
-mxSession.prototype.polling = false;
-
-/**
- * Function: start
- */
-mxSession.prototype.start = function()
-{
- if (this.debug)
- {
- this.connected = true;
- this.fireEvent(new mxEventObject(mxEvent.CONNECT));
- }
- else if (!this.connected)
- {
- this.get(this.urlInit, mxUtils.bind(this, function(req)
- {
- this.connected = true;
- this.fireEvent(new mxEventObject(mxEvent.CONNECT));
- this.poll();
- }));
- }
-};
-
-/**
- * Function: suspend
- *
- * Suspends the polling. Use <resume> to reactive the session. Fires a
- * suspend event.
- */
-mxSession.prototype.suspend = function()
-{
- if (this.connected && !this.suspended)
- {
- this.suspended = true;
- this.fireEvent(new mxEventObject(mxEvent.SUSPEND));
- }
-};
-
-/**
- * Function: resume
- *
- * Resumes the session if it has been suspended. Fires a resume-event
- * before starting the polling.
- */
-mxSession.prototype.resume = function(type, attr, value)
-{
- if (this.connected &&
- this.suspended)
- {
- this.suspended = false;
- this.fireEvent(new mxEventObject(mxEvent.RESUME));
-
- if (!this.polling)
- {
- this.poll();
- }
- }
-};
-
-/**
- * Function: stop
- *
- * Stops the session and fires a disconnect event. The given reason is
- * passed to the disconnect event listener as the second argument.
- */
-mxSession.prototype.stop = function(reason)
-{
- if (this.connected)
- {
- this.connected = false;
- }
-
- this.fireEvent(new mxEventObject(mxEvent.DISCONNECT,
- 'reason', reason));
-};
-
-/**
- * Function: poll
- *
- * Sends an asynchronous GET request to <urlPoll>.
- */
-mxSession.prototype.poll = function()
-{
- if (this.connected &&
- !this.suspended &&
- this.urlPoll != null)
- {
- this.polling = true;
-
- this.get(this.urlPoll, mxUtils.bind(this, function()
- {
- this.poll();
- }));
- }
- else
- {
- this.polling = false;
- }
-};
-
-/**
- * Function: notify
- *
- * Sends out the specified XML to <urlNotify> and fires a <notify> event.
- */
-mxSession.prototype.notify = function(xml, onLoad, onError)
-{
- if (xml != null &&
- xml.length > 0)
- {
- if (this.urlNotify != null)
- {
- if (this.debug)
- {
- mxLog.show();
- mxLog.debug('mxSession.notify: '+this.urlNotify+' xml='+xml);
- }
- else
- {
- xml = '<message><delta>'+xml+'</delta></message>';
-
- if (this.escapePostData)
- {
- xml = encodeURIComponent(xml);
- }
-
- mxUtils.post(this.urlNotify, 'xml='+xml, onLoad, onError);
- }
- }
-
- this.sent += xml.length;
- this.fireEvent(new mxEventObject(mxEvent.NOTIFY,
- 'url', this.urlNotify, 'xml', xml));
- }
-};
-
-/**
- * Function: get
- *
- * Sends an asynchronous get request to the given URL, fires a <get> event
- * and invokes the given onLoad function when a response is received.
- */
-mxSession.prototype.get = function(url, onLoad, onError)
-{
- // Response after browser refresh has no global scope
- // defined. This response is ignored and the session
- // stops implicitely.
- if (typeof(mxUtils) != 'undefined')
- {
- var onErrorWrapper = mxUtils.bind(this, function(ex)
- {
- if (onError != null)
- {
- onError(ex);
- }
- else
- {
- this.stop(ex);
- }
- });
-
- // Handles a successful response for
- // the above request.
- mxUtils.get(url, mxUtils.bind(this, function(req)
- {
- if (typeof(mxUtils) != 'undefined')
- {
- if (req.isReady() && req.getStatus() != 404)
- {
- this.received += req.getText().length;
- this.fireEvent(new mxEventObject(mxEvent.GET, 'url', url, 'request', req));
-
- if (this.isValidResponse(req))
- {
- if (req.getText().length > 0)
- {
- var node = req.getDocumentElement();
-
- if (node == null)
- {
- onErrorWrapper('Invalid response: '+req.getText());
- }
- else
- {
- this.receive(node);
- }
- }
-
- if (onLoad != null)
- {
- onLoad(req);
- }
- }
- }
- else
- {
- onErrorWrapper('Response not ready');
- }
- }
- }),
- // Handles a transmission error for the
- // above request
- function(req)
- {
- onErrorWrapper('Transmission error');
- });
- }
-};
-
-/**
- * Function: isValidResponse
- *
- * Returns true if the response data in the given <mxXmlRequest> is valid.
- */
-mxSession.prototype.isValidResponse = function(req)
-{
- // TODO: Find condition to check if response
- // contains valid XML (not eg. the PHP code).
- return req.getText().indexOf('<?php') < 0;
-};
-
-/**
- * Function: encodeChanges
- *
- * Returns the XML representation for the given array of changes.
- */
-mxSession.prototype.encodeChanges = function(changes, invert)
-{
- // TODO: Use array for string concatenation
- var xml = '';
- var step = (invert) ? -1 : 1;
- var i0 = (invert) ? changes.length - 1 : 0;
-
- for (var i = i0; i >= 0 && i < changes.length; i += step)
- {
- // Newlines must be kept, they will be converted
- // to &#xa; when the server sends data to the
- // client
- var node = this.codec.encode(changes[i]);
- xml += mxUtils.getXml(node, this.linefeed);
- }
-
- return xml;
-};
-
-/**
- * Function: receive
- *
- * Processes the given node by applying the changes to the model. If the nodename
- * is state, then the namespace is used as a prefix for creating Ids in the model,
- * and the child nodes are visited recursively. If the nodename is delta, then the
- * changes encoded in the child nodes are applied to the model. Each call to the
- * receive function fires a <receive> event with the given node as the second argument
- * after processing. If changes are processed, then the function additionally fires
- * a <mxEvent.FIRED> event before the <mxEvent.RECEIVE> event.
- */
-mxSession.prototype.receive = function(node)
-{
- if (node != null && node.nodeType == mxConstants.NODETYPE_ELEMENT)
- {
- // Uses the namespace in the model
- var ns = node.getAttribute('namespace');
-
- if (ns != null)
- {
- this.model.prefix = ns + '-';
- }
-
- var child = node.firstChild;
-
- while (child != null)
- {
- var name = child.nodeName.toLowerCase();
-
- if (name == 'state')
- {
- this.processState(child);
- }
- else if (name == 'delta')
- {
- this.processDelta(child);
- }
-
- child = child.nextSibling;
- }
-
- // Fires receive event
- this.fireEvent(new mxEventObject(mxEvent.RECEIVE, 'node', node));
- }
-};
-
-/**
- * Function: processState
- *
- * Processes the given state node which contains the current state of the
- * remote model.
- */
-mxSession.prototype.processState = function(node)
-{
- var dec = new mxCodec(node.ownerDocument);
- dec.decode(node.firstChild, this.model);
-};
-
-/**
- * Function: processDelta
- *
- * Processes the given delta node which contains a sequence of edits which in
- * turn map to one transaction on the remote model each.
- */
-mxSession.prototype.processDelta = function(node)
-{
- var edit = node.firstChild;
-
- while (edit != null)
- {
- if (edit.nodeName == 'edit')
- {
- this.processEdit(edit);
- }
-
- edit = edit.nextSibling;
- }
-};
-
-/**
- * Function: processEdit
- *
- * Processes the given edit by executing its changes and firing the required
- * events via the model.
- */
-mxSession.prototype.processEdit = function(node)
-{
- var changes = this.decodeChanges(node);
-
- if (changes.length > 0)
- {
- var edit = this.createUndoableEdit(changes);
-
- // No notify event here to avoid the edit from being encoded and transmitted
- // LATER: Remove changes property (deprecated)
- this.model.fireEvent(new mxEventObject(mxEvent.CHANGE,
- 'edit', edit, 'changes', changes));
- this.model.fireEvent(new mxEventObject(mxEvent.UNDO, 'edit', edit));
- this.fireEvent(new mxEventObject(mxEvent.FIRED, 'edit', edit));
- }
-};
-
-/**
- * Function: createUndoableEdit
- *
- * Creates a new <mxUndoableEdit> that implements the notify function to fire a
- * <change> and <notify> event via the model.
- */
-mxSession.prototype.createUndoableEdit = function(changes)
-{
- var edit = new mxUndoableEdit(this.model, this.significantRemoteChanges);
- edit.changes = changes;
-
- edit.notify = function()
- {
- // LATER: Remove changes property (deprecated)
- edit.source.fireEvent(new mxEventObject(mxEvent.CHANGE,
- 'edit', edit, 'changes', edit.changes));
- edit.source.fireEvent(new mxEventObject(mxEvent.NOTIFY,
- 'edit', edit, 'changes', edit.changes));
- };
-
- return edit;
-};
-
-/**
- * Function: decodeChanges
- *
- * Decodes and executes the changes represented by the children in the
- * given node. Returns an array that contains all changes.
- */
-mxSession.prototype.decodeChanges = function(node)
-{
- // Updates the document in the existing codec
- this.codec.document = node.ownerDocument;
-
- // Parses and executes the changes on the model
- var changes = [];
- node = node.firstChild;
-
- while (node != null)
- {
- var change = this.decodeChange(node);
-
- if (change != null)
- {
- changes.push(change);
- }
-
- node = node.nextSibling;
- }
-
- return changes;
-};
-
-/**
- * Function: decodeChange
- *
- * Decodes, executes and returns the change object represented by the given
- * XML node.
- */
-mxSession.prototype.decodeChange = function(node)
-{
- var change = null;
-
- if (node.nodeType == mxConstants.NODETYPE_ELEMENT)
- {
- if (node.nodeName == 'mxRootChange')
- {
- // Handles the special case were no ids should be
- // resolved in the existing model. This change will
- // replace all registered ids and cells from the
- // model and insert a new cell hierarchy instead.
- var tmp = new mxCodec(node.ownerDocument);
- change = tmp.decode(node);
- }
- else
- {
- change = this.codec.decode(node);
- }
-
- if (change != null)
- {
- change.model = this.model;
- change.execute();
-
- // Workaround for references not being resolved if cells have
- // been removed from the model prior to being referenced. This
- // adds removed cells in the codec object lookup table.
- if (node.nodeName == 'mxChildChange' && change.parent == null)
- {
- this.cellRemoved(change.child);
- }
- }
- }
-
- return change;
-};
-
-/**
- * Function: cellRemoved
- *
- * Adds removed cells to the codec object lookup for references to the removed
- * cells after this point in time.
- */
-mxSession.prototype.cellRemoved = function(cell, codec)
-{
- this.codec.putObject(cell.getId(), cell);
-
- var childCount = this.model.getChildCount(cell);
-
- for (var i = 0; i < childCount; i++)
- {
- this.cellRemoved(this.model.getChildAt(cell, i));
- }
-};
diff --git a/src/js/util/mxSvgCanvas2D.js b/src/js/util/mxSvgCanvas2D.js
deleted file mode 100644
index 4af0642..0000000
--- a/src/js/util/mxSvgCanvas2D.js
+++ /dev/null
@@ -1,1234 +0,0 @@
-/**
- * $Id: mxSvgCanvas2D.js,v 1.18 2012-11-23 15:13:19 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- *
- * Class: mxSvgCanvas2D
- *
- * Implements a canvas to be used with <mxImageExport>. This canvas writes all
- * calls as SVG output to the given SVG root node.
- *
- * (code)
- * var svgDoc = mxUtils.createXmlDocument();
- * var root = (svgDoc.createElementNS != null) ?
- * svgDoc.createElementNS(mxConstants.NS_SVG, 'svg') : svgDoc.createElement('svg');
- *
- * if (svgDoc.createElementNS == null)
- * {
- * root.setAttribute('xmlns', mxConstants.NS_SVG);
- * }
- *
- * var bounds = graph.getGraphBounds();
- * root.setAttribute('width', (bounds.x + bounds.width + 4) + 'px');
- * root.setAttribute('height', (bounds.y + bounds.height + 4) + 'px');
- * root.setAttribute('version', '1.1');
- *
- * svgDoc.appendChild(root);
- *
- * var svgCanvas = new mxSvgCanvas2D(root);
- * (end)
- *
- * Constructor: mxSvgCanvas2D
- *
- * Constructs an SVG canvas.
- *
- * Parameters:
- *
- * root - SVG container for the output.
- * styleEnabled - Optional boolean that specifies if a style section should be
- * added. The style section sets the default font-size, font-family and
- * stroke-miterlimit globally. Default is false.
- */
-var mxSvgCanvas2D = function(root, styleEnabled)
-{
- styleEnabled = (styleEnabled != null) ? styleEnabled : false;
-
- /**
- * Variable: converter
- *
- * Holds the <mxUrlConverter> to convert image URLs.
- */
- var converter = new mxUrlConverter();
-
- /**
- * Variable: autoAntiAlias
- *
- * Specifies if anti aliasing should be disabled for rectangles
- * and orthogonal paths. Default is true.
- */
- var autoAntiAlias = true;
-
- /**
- * Variable: textEnabled
- *
- * Specifies if text output should be enabled. Default is true.
- */
- var textEnabled = true;
-
- /**
- * Variable: foEnabled
- *
- * Specifies if use of foreignObject for HTML markup is allowed. Default is true.
- */
- var foEnabled = true;
-
- // Private helper function to create SVG elements
- var create = function(tagName, namespace)
- {
- var doc = root.ownerDocument || document;
-
- if (doc.createElementNS != null)
- {
- return doc.createElementNS(namespace || mxConstants.NS_SVG, tagName);
- }
- else
- {
- var elt = doc.createElement(tagName);
-
- if (namespace != null)
- {
- elt.setAttribute('xmlns', namespace);
- }
-
- return elt;
- }
- };
-
- // Defs section contains optional style and gradients
- var defs = create('defs');
-
- // Creates defs section with optional global style
- if (styleEnabled)
- {
- var style = create('style');
- style.setAttribute('type', 'text/css');
- mxUtils.write(style, 'svg{font-family:' + mxConstants.DEFAULT_FONTFAMILY +
- ';font-size:' + mxConstants.DEFAULT_FONTSIZE +
- ';fill:none;stroke-miterlimit:10}');
-
- if (autoAntiAlias)
- {
- mxUtils.write(style, 'rect{shape-rendering:crispEdges}');
- }
-
- // Appends style to defs and defs to SVG container
- defs.appendChild(style);
- }
-
- root.appendChild(defs);
-
- // Defines the current state
- var currentState =
- {
- dx: 0,
- dy: 0,
- scale: 1,
- transform: '',
- fill: null,
- gradient: null,
- stroke: null,
- strokeWidth: 1,
- dashed: false,
- dashpattern: '3 3',
- alpha: 1,
- linecap: 'flat',
- linejoin: 'miter',
- miterlimit: 10,
- fontColor: '#000000',
- fontSize: mxConstants.DEFAULT_FONTSIZE,
- fontFamily: mxConstants.DEFAULT_FONTFAMILY,
- fontStyle: 0
- };
-
- // Local variables
- var currentPathIsOrthogonal = true;
- var glassGradient = null;
- var currentNode = null;
- var currentPath = null;
- var lastPoint = null;
- var gradients = [];
- var refCount = 0;
- var stack = [];
-
- // Other private helper methods
- var createGradientId = function(start, end, direction)
- {
- // Removes illegal characters from gradient ID
- if (start.charAt(0) == '#')
- {
- start = start.substring(1);
- }
-
- if (end.charAt(0) == '#')
- {
- end = end.substring(1);
- }
-
- // Workaround for gradient IDs not working in Safari 5 / Chrome 6
- // if they contain uppercase characters
- start = start.toLowerCase();
- end = end.toLowerCase();
-
- // Wrong gradient directions possible?
- var dir = null;
-
- if (direction == null || direction == mxConstants.DIRECTION_SOUTH)
- {
- dir = 's';
- }
- else if (direction == mxConstants.DIRECTION_EAST)
- {
- dir = 'e';
- }
- else
- {
- var tmp = start;
- start = end;
- end = tmp;
-
- if (direction == mxConstants.DIRECTION_NORTH)
- {
- dir = 's';
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- dir = 'e';
- }
- }
-
- return start+'-'+end+'-'+dir;
- };
-
- var createHtmlBody = function(str, align, valign)
- {
- var style = 'margin:0px;font-size:' + Math.floor(currentState.fontSize) + 'px;' +
- 'font-family:' + currentState.fontFamily + ';color:' + currentState.fontColor+ ';';
-
- if ((currentState.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD)
- {
- style += 'font-weight:bold;';
- }
-
- if ((currentState.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC)
- {
- style += 'font-style:italic;';
- }
-
- if ((currentState.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE)
- {
- style += 'font-decoration:underline;';
- }
-
- if (align == mxConstants.ALIGN_CENTER)
- {
- style += 'text-align:center;';
- }
- else if (align == mxConstants.ALIGN_RIGHT)
- {
- style += 'text-align:right;';
- }
-
- // Converts HTML entities to unicode
- var t = document.createElement('div');
- t.innerHTML = str;
- str = t.innerHTML.replace(/&nbsp;/g, '&#160;');
-
- // LATER: Add vertical align support via table, adds xmlns to workaround empty NS in IE9 standards
- var node = mxUtils.parseXml('<div xmlns="http://www.w3.org/1999/xhtml" style="' +
- style + '">' + str + '</div>').documentElement;
-
- return node;
- };
-
- var getSvgGradient = function(start, end, direction)
- {
- var id = createGradientId(start, end, direction);
- var gradient = gradients[id];
-
- if (gradient == null)
- {
- gradient = create('linearGradient');
- gradient.setAttribute('id', ++refCount);
- gradient.setAttribute('x1', '0%');
- gradient.setAttribute('y1', '0%');
- gradient.setAttribute('x2', '0%');
- gradient.setAttribute('y2', '0%');
-
- if (direction == null || direction == mxConstants.DIRECTION_SOUTH)
- {
- gradient.setAttribute('y2', '100%');
- }
- else if (direction == mxConstants.DIRECTION_EAST)
- {
- gradient.setAttribute('x2', '100%');
- }
- else if (direction == mxConstants.DIRECTION_NORTH)
- {
- gradient.setAttribute('y1', '100%');
- }
- else if (direction == mxConstants.DIRECTION_WEST)
- {
- gradient.setAttribute('x1', '100%');
- }
-
- var stop = create('stop');
- stop.setAttribute('offset', '0%');
- stop.setAttribute('style', 'stop-color:'+start);
- gradient.appendChild(stop);
-
- stop = create('stop');
- stop.setAttribute('offset', '100%');
- stop.setAttribute('style', 'stop-color:'+end);
- gradient.appendChild(stop);
-
- defs.appendChild(gradient);
- gradients[id] = gradient;
- }
-
- return gradient.getAttribute('id');
- };
-
- var appendNode = function(node, state, filled, stroked)
- {
- if (node != null)
- {
- if (state.clip != null)
- {
- node.setAttribute('clip-path', 'url(#' + state.clip + ')');
- state.clip = null;
- }
-
- if (currentPath != null)
- {
- node.setAttribute('d', currentPath.join(' '));
- currentPath = null;
-
- if (autoAntiAlias && currentPathIsOrthogonal)
- {
- node.setAttribute('shape-rendering', 'crispEdges');
- state.strokeWidth = Math.max(1, state.strokeWidth);
- }
- }
-
- if (state.alpha < 1)
- {
- // LATER: Check if using fill/stroke-opacity here is faster
- node.setAttribute('opacity', state.alpha);
- //node.setAttribute('fill-opacity', state.alpha);
- //node.setAttribute('stroke-opacity', state.alpha);
- }
-
- if (filled && (state.fill != null || state.gradient != null))
- {
- if (state.gradient != null)
- {
- node.setAttribute('fill', 'url(#' + state.gradient + ')');
- }
- else
- {
- node.setAttribute('fill', state.fill.toLowerCase());
- }
- }
- else if (!styleEnabled)
- {
- node.setAttribute('fill', 'none');
- }
-
- if (stroked && state.stroke != null)
- {
- node.setAttribute('stroke', state.stroke.toLowerCase());
-
- // Sets the stroke properties (1 is default is SVG)
- if (state.strokeWidth != 1)
- {
- if (node.nodeName == 'rect' && autoAntiAlias)
- {
- state.strokeWidth = Math.max(1, state.strokeWidth);
- }
-
- node.setAttribute('stroke-width', state.strokeWidth);
- }
-
- if (node.nodeName == 'path')
- {
- // Linejoin miter is default in SVG
- if (state.linejoin != null && state.linejoin != 'miter')
- {
- node.setAttribute('stroke-linejoin', state.linejoin);
- }
-
- if (state.linecap != null)
- {
- // flat is called butt in SVG
- var value = state.linecap;
-
- if (value == 'flat')
- {
- value = 'butt';
- }
-
- // Linecap butt is default in SVG
- if (value != 'butt')
- {
- node.setAttribute('stroke-linecap', value);
- }
- }
-
- // Miterlimit 10 is default in our document
- if (state.miterlimit != null && (!styleEnabled || state.miterlimit != 10))
- {
- node.setAttribute('stroke-miterlimit', state.miterlimit);
- }
- }
-
- if (state.dashed)
- {
- var dash = state.dashpattern.split(' ');
-
- if (dash.length > 0)
- {
- var pat = [];
-
- for (var i = 0; i < dash.length; i++)
- {
- pat[i] = Number(dash[i]) * currentState.strokeWidth;
- }
-
-
- node.setAttribute('stroke-dasharray', pat.join(' '));
- }
- }
- }
-
- if (state.transform.length > 0)
- {
- node.setAttribute('transform', state.transform);
- }
-
- root.appendChild(node);
- }
- };
-
- // Private helper function to format a number
- var f2 = function(x)
- {
- return Math.round(parseFloat(x) * 100) / 100;
- };
-
- // Returns public interface
- return {
-
- /**
- * Function: getConverter
- *
- * Returns <converter>.
- */
- getConverter: function()
- {
- return converter;
- },
-
- /**
- * Function: isAutoAntiAlias
- *
- * Returns <autoAntiAlias>.
- */
- isAutoAntiAlias: function()
- {
- return autoAntiAlias;
- },
-
- /**
- * Function: setAutoAntiAlias
- *
- * Sets <autoAntiAlias>.
- */
- setAutoAntiAlias: function(value)
- {
- autoAntiAlias = value;
- },
-
- /**
- * Function: isTextEnabled
- *
- * Returns <textEnabled>.
- */
- isTextEnabled: function()
- {
- return textEnabled;
- },
-
- /**
- * Function: setTextEnabled
- *
- * Sets <textEnabled>.
- */
- setTextEnabled: function(value)
- {
- textEnabled = value;
- },
-
- /**
- * Function: isFoEnabled
- *
- * Returns <foEnabled>.
- */
- isFoEnabled: function()
- {
- return foEnabled;
- },
-
- /**
- * Function: setFoEnabled
- *
- * Sets <foEnabled>.
- */
- setFoEnabled: function(value)
- {
- foEnabled = value;
- },
-
- /**
- * Function: save
- *
- * Saves the state of the graphics object.
- */
- save: function()
- {
- stack.push(currentState);
- currentState = mxUtils.clone(currentState);
- },
-
- /**
- * Function: restore
- *
- * Restores the state of the graphics object.
- */
- restore: function()
- {
- currentState = stack.pop();
- },
-
- /**
- * Function: scale
- *
- * Scales the current graphics object.
- */
- scale: function(value)
- {
- currentState.scale *= value;
- currentState.strokeWidth *= value;
- },
-
- /**
- * Function: translate
- *
- * Translates the current graphics object.
- */
- translate: function(dx, dy)
- {
- currentState.dx += dx;
- currentState.dy += dy;
- },
-
- /**
- * Function: rotate
- *
- * Rotates and/or flips the current graphics object.
- */
- rotate: function(theta, flipH, flipV, cx, cy)
- {
- cx += currentState.dx;
- cy += currentState.dy;
-
- cx *= currentState.scale;
- cy *= currentState.scale;
-
- // This implementation uses custom scale/translate and built-in rotation
- // Rotation state is part of the AffineTransform in state.transform
- if (flipH ^ flipV)
- {
- var tx = (flipH) ? cx : 0;
- var sx = (flipH) ? -1 : 1;
-
- var ty = (flipV) ? cy : 0;
- var sy = (flipV) ? -1 : 1;
-
- currentState.transform += 'translate(' + f2(tx) + ',' + f2(ty) + ')';
- currentState.transform += 'scale(' + f2(sx) + ',' + f2(sy) + ')';
- currentState.transform += 'translate(' + f2(-tx) + ' ' + f2(-ty) + ')';
- }
-
- currentState.transform += 'rotate(' + f2(theta) + ',' + f2(cx) + ',' + f2(cy) + ')';
- },
-
- /**
- * Function: setStrokeWidth
- *
- * Sets the stroke width.
- */
- setStrokeWidth: function(value)
- {
- currentState.strokeWidth = value * currentState.scale;
- },
-
- /**
- * Function: setStrokeColor
- *
- * Sets the stroke color.
- */
- setStrokeColor: function(value)
- {
- currentState.stroke = value;
- },
-
- /**
- * Function: setDashed
- *
- * Sets the dashed state to true or false.
- */
- setDashed: function(value)
- {
- currentState.dashed = value;
- },
-
- /**
- * Function: setDashPattern
- *
- * Sets the dashed pattern to the given space separated list of numbers.
- */
- setDashPattern: function(value)
- {
- currentState.dashpattern = value;
- },
-
- /**
- * Function: setLineCap
- *
- * Sets the linecap.
- */
- setLineCap: function(value)
- {
- currentState.linecap = value;
- },
-
- /**
- * Function: setLineJoin
- *
- * Sets the linejoin.
- */
- setLineJoin: function(value)
- {
- currentState.linejoin = value;
- },
-
- /**
- * Function: setMiterLimit
- *
- * Sets the miterlimit.
- */
- setMiterLimit: function(value)
- {
- currentState.miterlimit = value;
- },
-
- /**
- * Function: setFontSize
- *
- * Sets the fontsize.
- */
- setFontSize: function(value)
- {
- currentState.fontSize = value;
- },
-
- /**
- * Function: setFontColor
- *
- * Sets the fontcolor.
- */
- setFontColor: function(value)
- {
- currentState.fontColor = value;
- },
-
- /**
- * Function: setFontFamily
- *
- * Sets the fontfamily.
- */
- setFontFamily: function(value)
- {
- currentState.fontFamily = value;
- },
-
- /**
- * Function: setFontStyle
- *
- * Sets the fontstyle.
- */
- setFontStyle: function(value)
- {
- currentState.fontStyle = value;
- },
-
- /**
- * Function: setAlpha
- *
- * Sets the current alpha.
- */
- setAlpha: function(alpha)
- {
- currentState.alpha = alpha;
- },
-
- /**
- * Function: setFillColor
- *
- * Sets the fillcolor.
- */
- setFillColor: function(value)
- {
- currentState.fill = value;
- currentState.gradient = null;
- },
-
- /**
- * Function: setGradient
- *
- * Sets the gradient color.
- */
- setGradient: function(color1, color2, x, y, w, h, direction)
- {
- if (color1 != null && color2 != null)
- {
- currentState.gradient = getSvgGradient(color1, color2, direction);
- currentState.fill = color1;
- }
- },
-
- /**
- * Function: setGlassGradient
- *
- * Sets the glass gradient.
- */
- setGlassGradient: function(x, y, w, h)
- {
- // Creates glass overlay gradient
- if (glassGradient == null)
- {
- glassGradient = create('linearGradient');
- glassGradient.setAttribute('id', '0');
- glassGradient.setAttribute('x1', '0%');
- glassGradient.setAttribute('y1', '0%');
- glassGradient.setAttribute('x2', '0%');
- glassGradient.setAttribute('y2', '100%');
-
- var stop1 = create('stop');
- stop1.setAttribute('offset', '0%');
- stop1.setAttribute('style', 'stop-color:#ffffff;stop-opacity:0.9');
- glassGradient.appendChild(stop1);
-
- var stop2 = create('stop');
- stop2.setAttribute('offset', '100%');
- stop2.setAttribute('style', 'stop-color:#ffffff;stop-opacity:0.1');
- glassGradient.appendChild(stop2);
-
- // Makes it the first entry of all gradients in defs
- if (defs.firstChild.nextSibling != null)
- {
- defs.insertBefore(glassGradient, defs.firstChild.nextSibling);
- }
- else
- {
- defs.appendChild(glassGradient);
- }
- }
-
- // Glass gradient has hardcoded ID (see above)
- currentState.gradient = '0';
- },
-
- /**
- * Function: rect
- *
- * Sets the current path to a rectangle.
- */
- rect: function(x, y, w, h)
- {
- x += currentState.dx;
- y += currentState.dy;
-
- currentNode = create('rect');
- currentNode.setAttribute('x', f2(x * currentState.scale));
- currentNode.setAttribute('y', f2(y * currentState.scale));
- currentNode.setAttribute('width', f2(w * currentState.scale));
- currentNode.setAttribute('height', f2(h * currentState.scale));
-
- if (!styleEnabled && autoAntiAlias)
- {
- currentNode.setAttribute('shape-rendering', 'crispEdges');
- }
- },
-
- /**
- * Function: roundrect
- *
- * Sets the current path to a rounded rectangle.
- */
- roundrect: function(x, y, w, h, dx, dy)
- {
- x += currentState.dx;
- y += currentState.dy;
-
- currentNode = create('rect');
- currentNode.setAttribute('x', f2(x * currentState.scale));
- currentNode.setAttribute('y', f2(y * currentState.scale));
- currentNode.setAttribute('width', f2(w * currentState.scale));
- currentNode.setAttribute('height', f2(h * currentState.scale));
-
- if (dx > 0)
- {
- currentNode.setAttribute('rx', f2(dx * currentState.scale));
- }
-
- if (dy > 0)
- {
- currentNode.setAttribute('ry', f2(dy * currentState.scale));
- }
-
- if (!styleEnabled && autoAntiAlias)
- {
- currentNode.setAttribute('shape-rendering', 'crispEdges');
- }
- },
-
- /**
- * Function: ellipse
- *
- * Sets the current path to an ellipse.
- */
- ellipse: function(x, y, w, h)
- {
- x += currentState.dx;
- y += currentState.dy;
-
- currentNode = create('ellipse');
- currentNode.setAttribute('cx', f2((x + w / 2) * currentState.scale));
- currentNode.setAttribute('cy', f2((y + h / 2) * currentState.scale));
- currentNode.setAttribute('rx', f2(w / 2 * currentState.scale));
- currentNode.setAttribute('ry', f2(h / 2 * currentState.scale));
- },
-
- /**
- * Function: image
- *
- * Paints an image.
- */
- image: function(x, y, w, h, src, aspect, flipH, flipV)
- {
- src = converter.convert(src);
-
- // TODO: Add option for embedded images as base64. Current
- // known issues are binary loading of cross-domain images.
- aspect = (aspect != null) ? aspect : true;
- flipH = (flipH != null) ? flipH : false;
- flipV = (flipV != null) ? flipV : false;
- x += currentState.dx;
- y += currentState.dy;
-
- var node = create('image');
- node.setAttribute('x', f2(x * currentState.scale));
- node.setAttribute('y', f2(y * currentState.scale));
- node.setAttribute('width', f2(w * currentState.scale));
- node.setAttribute('height', f2(h * currentState.scale));
-
- if (mxClient.IS_VML)
- {
- node.setAttribute('xlink:href', src);
- }
- else
- {
- node.setAttributeNS(mxConstants.NS_XLINK, 'xlink:href', src);
- }
-
- if (!aspect)
- {
- node.setAttribute('preserveAspectRatio', 'none');
- }
-
- if (currentState.alpha < 1)
- {
- node.setAttribute('opacity', currentState.alpha);
- }
-
-
- var tr = currentState.transform;
-
- if (flipH || flipV)
- {
- var sx = 1;
- var sy = 1;
- var dx = 0;
- var dy = 0;
-
- if (flipH)
- {
- sx = -1;
- dx = -w - 2 * x;
- }
-
- if (flipV)
- {
- sy = -1;
- dy = -h - 2 * y;
- }
-
- // Adds image tansformation to existing transforms
- tr += 'scale(' + sx + ',' + sy + ')translate(' + dx + ',' + dy + ')';
- }
-
- if (tr.length > 0)
- {
- node.setAttribute('transform', tr);
- }
-
- root.appendChild(node);
- },
-
- /**
- * Function: text
- *
- * Paints the given text. Possible values for format are empty string for
- * plain text and html for HTML markup.
- */
- text: function(x, y, w, h, str, align, valign, vertical, wrap, format)
- {
- if (textEnabled)
- {
- x += currentState.dx;
- y += currentState.dy;
-
- if (foEnabled && format == 'html')
- {
- var node = create('g');
- node.setAttribute('transform', currentState.transform + 'scale(' + currentState.scale + ',' + currentState.scale + ')');
-
- if (currentState.alpha < 1)
- {
- node.setAttribute('opacity', currentState.alpha);
- }
-
- var fo = create('foreignObject');
- fo.setAttribute('x', Math.round(x));
- fo.setAttribute('y', Math.round(y));
- fo.setAttribute('width', Math.round(w));
- fo.setAttribute('height', Math.round(h));
- fo.appendChild(createHtmlBody(str, align, valign));
- node.appendChild(fo);
- root.appendChild(node);
- }
- else
- {
- var size = Math.floor(currentState.fontSize);
- var node = create('g');
- var tr = currentState.transform;
-
- if (vertical)
- {
- var cx = x + w / 2;
- var cy = y + h / 2;
- tr += 'rotate(-90,' + f2(cx * currentState.scale) + ',' + f2(cy * currentState.scale) + ')';
- }
-
- if (tr.length > 0)
- {
- node.setAttribute('transform', tr);
- }
-
- if (currentState.alpha < 1)
- {
- node.setAttribute('opacity', currentState.alpha);
- }
-
- // Default is left
- var anchor = (align == mxConstants.ALIGN_RIGHT) ? 'end' :
- (align == mxConstants.ALIGN_CENTER) ? 'middle' :
- 'start';
-
- if (anchor == 'end')
- {
- x += Math.max(0, w - 2);
- }
- else if (anchor == 'middle')
- {
- x += w / 2;
- }
- else
- {
- x += (w > 0) ? 2 : 0;
- }
-
- if ((currentState.fontStyle & mxConstants.FONT_BOLD) == mxConstants.FONT_BOLD)
- {
- node.setAttribute('font-weight', 'bold');
- }
-
- if ((currentState.fontStyle & mxConstants.FONT_ITALIC) == mxConstants.FONT_ITALIC)
- {
- node.setAttribute('font-style', 'italic');
- }
-
- if ((currentState.fontStyle & mxConstants.FONT_UNDERLINE) == mxConstants.FONT_UNDERLINE)
- {
- node.setAttribute('text-decoration', 'underline');
- }
-
- // Text-anchor start is default in SVG
- if (anchor != 'start')
- {
- node.setAttribute('text-anchor', anchor);
- }
-
- if (!styleEnabled || size != mxConstants.DEFAULT_FONTSIZE)
- {
- node.setAttribute('font-size', Math.floor(size * currentState.scale) + 'px');
- }
-
- if (!styleEnabled || currentState.fontFamily != mxConstants.DEFAULT_FONTFAMILY)
- {
- node.setAttribute('font-family', currentState.fontFamily);
- }
-
- node.setAttribute('fill', currentState.fontColor);
-
- var lines = str.split('\n');
-
- var lineHeight = size * 1.25;
- var textHeight = (h > 0) ? size + (lines.length - 1) * lineHeight : lines.length * lineHeight - 1;
- var dy = h - textHeight;
-
- // Top is default
- if (valign == null || valign == mxConstants.ALIGN_TOP)
- {
- y = Math.max(y - 3 * currentState.scale, y + dy / 2 + ((h > 0) ? lineHeight / 2 - 8 : 0));
- }
- else if (valign == mxConstants.ALIGN_MIDDLE)
- {
- y = y + dy / 2;
- }
- else if (valign == mxConstants.ALIGN_BOTTOM)
- {
- y = Math.min(y, y + dy + 2 * currentState.scale);
- }
-
- y += size;
-
- for (var i = 0; i < lines.length; i++)
- {
- var text = create('text');
- text.setAttribute('x', f2(x * currentState.scale));
- text.setAttribute('y', f2(y * currentState.scale));
-
- mxUtils.write(text, lines[i]);
- node.appendChild(text);
- y += size * 1.3;
- }
-
- root.appendChild(node);
- }
- }
- },
-
- /**
- * Function: begin
- *
- * Starts a new path.
- */
- begin: function()
- {
- currentNode = create('path');
- currentPath = [];
- lastPoint = null;
- currentPathIsOrthogonal = true;
- },
-
- /**
- * Function: moveTo
- *
- * Moves the current path the given coordinates.
- */
- moveTo: function(x, y)
- {
- if (currentPath != null)
- {
- x += currentState.dx;
- y += currentState.dy;
- currentPath.push('M ' + f2(x * currentState.scale) + ' ' + f2(y * currentState.scale));
-
- if (autoAntiAlias)
- {
- lastPoint = new mxPoint(x, y);
- }
- }
- },
-
- /**
- * Function: lineTo
- *
- * Adds a line to the current path.
- */
- lineTo: function(x, y)
- {
- if (currentPath != null)
- {
- x += currentState.dx;
- y += currentState.dy;
- currentPath.push('L ' + f2(x * currentState.scale) + ' ' + f2(y * currentState.scale));
-
- if (autoAntiAlias)
- {
- if (lastPoint != null && currentPathIsOrthogonal && x != lastPoint.x && y != lastPoint.y)
- {
- currentPathIsOrthogonal = false;
- }
-
- lastPoint = new mxPoint(x, y);
- }
- }
- },
-
- /**
- * Function: quadTo
- *
- * Adds a quadratic curve to the current path.
- */
- quadTo: function(x1, y1, x2, y2)
- {
- if (currentPath != null)
- {
- x1 += currentState.dx;
- y1 += currentState.dy;
- x2 += currentState.dx;
- y2 += currentState.dy;
- currentPath.push('Q ' + f2(x1 * currentState.scale) + ' ' + f2(y1 * currentState.scale) +
- ' ' + f2(x2 * currentState.scale) + ' ' + f2(y2 * currentState.scale));
- currentPathIsOrthogonal = false;
- }
- },
-
- /**
- * Function: curveTo
- *
- * Adds a bezier curve to the current path.
- */
- curveTo: function(x1, y1, x2, y2, x3, y3)
- {
- if (currentPath != null)
- {
- x1 += currentState.dx;
- y1 += currentState.dy;
- x2 += currentState.dx;
- y2 += currentState.dy;
- x3 += currentState.dx;
- y3 += currentState.dy;
- currentPath.push('C ' + f2(x1 * currentState.scale) + ' ' + f2(y1 * currentState.scale) +
- ' ' + f2(x2 * currentState.scale) + ' ' + f2(y2 * currentState.scale) +' ' +
- f2(x3 * currentState.scale) + ' ' + f2(y3 * currentState.scale));
- currentPathIsOrthogonal = false;
- }
- },
-
- /**
- * Function: close
- *
- * Closes the current path.
- */
- close: function()
- {
- if (currentPath != null)
- {
- currentPath.push('Z');
- }
- },
-
- /**
- * Function: stroke
- *
- * Paints the outline of the current path.
- */
- stroke: function()
- {
- appendNode(currentNode, currentState, false, true);
- },
-
- /**
- * Function: fill
- *
- * Fills the current path.
- */
- fill: function()
- {
- appendNode(currentNode, currentState, true, false);
- },
-
- /**
- * Function: fillstroke
- *
- * Fills and paints the outline of the current path.
- */
- fillAndStroke: function()
- {
- appendNode(currentNode, currentState, true, true);
- },
-
- /**
- * Function: shadow
- *
- * Paints the current path as a shadow of the given color.
- */
- shadow: function(value, filled)
- {
- this.save();
- this.setStrokeColor(value);
-
- if (filled)
- {
- this.setFillColor(value);
- this.fillAndStroke();
- }
- else
- {
- this.stroke();
- }
-
- this.restore();
- },
-
- /**
- * Function: clip
- *
- * Uses the current path for clipping.
- */
- clip: function()
- {
- if (currentNode != null)
- {
- if (currentPath != null)
- {
- currentNode.setAttribute('d', currentPath.join(' '));
- currentPath = null;
- }
-
- var id = ++refCount;
- var clip = create('clipPath');
- clip.setAttribute('id', id);
- clip.appendChild(currentNode);
- defs.appendChild(clip);
- currentState.clip = id;
- }
- }
- };
-
-}; \ No newline at end of file
diff --git a/src/js/util/mxToolbar.js b/src/js/util/mxToolbar.js
deleted file mode 100644
index 754e6b3..0000000
--- a/src/js/util/mxToolbar.js
+++ /dev/null
@@ -1,528 +0,0 @@
-/**
- * $Id: mxToolbar.js,v 1.36 2012-06-22 11:17:13 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxToolbar
- *
- * Creates a toolbar inside a given DOM node. The toolbar may contain icons,
- * buttons and combo boxes.
- *
- * Event: mxEvent.SELECT
- *
- * Fires when an item was selected in the toolbar. The <code>function</code>
- * property contains the function that was selected in <selectMode>.
- *
- * Constructor: mxToolbar
- *
- * Constructs a toolbar in the specified container.
- *
- * Parameters:
- *
- * container - DOM node that contains the toolbar.
- */
-function mxToolbar(container)
-{
- this.container = container;
-};
-
-/**
- * Extends mxEventSource.
- */
-mxToolbar.prototype = new mxEventSource();
-mxToolbar.prototype.constructor = mxToolbar;
-
-/**
- * Variable: container
- *
- * Reference to the DOM nodes that contains the toolbar.
- */
-mxToolbar.prototype.container = null;
-
-/**
- * Variable: enabled
- *
- * Specifies if events are handled. Default is true.
- */
-mxToolbar.prototype.enabled = true;
-
-/**
- * Variable: noReset
- *
- * Specifies if <resetMode> requires a forced flag of true for resetting
- * the current mode in the toolbar. Default is false. This is set to true
- * if the toolbar item is double clicked to avoid a reset after a single
- * use of the item.
- */
-mxToolbar.prototype.noReset = false;
-
-/**
- * Variable: updateDefaultMode
- *
- * Boolean indicating if the default mode should be the last selected
- * switch mode or the first inserted switch mode. Default is true, that
- * is the last selected switch mode is the default mode. The default mode
- * is the mode to be selected after a reset of the toolbar. If this is
- * false, then the default mode is the first inserted mode item regardless
- * of what was last selected. Otherwise, the selected item after a reset is
- * the previously selected item.
- */
-mxToolbar.prototype.updateDefaultMode = true;
-
-/**
- * Function: addItem
- *
- * Adds the given function as an image with the specified title and icon
- * and returns the new image node.
- *
- * Parameters:
- *
- * title - Optional string that is used as the tooltip.
- * icon - Optional URL of the image to be used. If no URL is given, then a
- * button is created.
- * funct - Function to execute on a mouse click.
- * pressedIcon - Optional URL of the pressed image. Default is a gray
- * background.
- * style - Optional style classname. Default is mxToolbarItem.
- * factoryMethod - Optional factory method for popup menu, eg.
- * function(menu, evt, cell) { menu.addItem('Hello, World!'); }
- */
-mxToolbar.prototype.addItem = function(title, icon, funct, pressedIcon, style, factoryMethod)
-{
- var img = document.createElement((icon != null) ? 'img' : 'button');
- var initialClassName = style || ((factoryMethod != null) ?
- 'mxToolbarMode' : 'mxToolbarItem');
- img.className = initialClassName;
- img.setAttribute('src', icon);
-
- if (title != null)
- {
- if (icon != null)
- {
- img.setAttribute('title', title);
- }
- else
- {
- mxUtils.write(img, title);
- }
- }
-
- this.container.appendChild(img);
-
- // Invokes the function on a click on the toolbar item
- if (funct != null)
- {
- mxEvent.addListener(img, (mxClient.IS_TOUCH) ? 'touchend' : 'click', funct);
- }
-
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- var mu = (mxClient.IS_TOUCH) ? 'touchend' : 'mouseup';
-
- // Highlights the toolbar item with a gray background
- // while it is being clicked with the mouse
- mxEvent.addListener(img, md, mxUtils.bind(this, function(evt)
- {
- if (pressedIcon != null)
- {
- img.setAttribute('src', pressedIcon);
- }
- else
- {
- img.style.backgroundColor = 'gray';
- }
-
- // Popup Menu
- if (factoryMethod != null)
- {
- if (this.menu == null)
- {
- this.menu = new mxPopupMenu();
- this.menu.init();
- }
-
- var last = this.currentImg;
-
- if (this.menu.isMenuShowing())
- {
- this.menu.hideMenu();
- }
-
- if (last != img)
- {
- // Redirects factory method to local factory method
- this.currentImg = img;
- this.menu.factoryMethod = factoryMethod;
-
- var point = new mxPoint(
- img.offsetLeft,
- img.offsetTop + img.offsetHeight);
- this.menu.popup(point.x, point.y, null, evt);
-
- // Sets and overrides to restore classname
- if (this.menu.isMenuShowing())
- {
- img.className = initialClassName + 'Selected';
-
- this.menu.hideMenu = function()
- {
- mxPopupMenu.prototype.hideMenu.apply(this);
- img.className = initialClassName;
- this.currentImg = null;
- };
- }
- }
- }
- }));
-
- var mouseHandler = mxUtils.bind(this, function(evt)
- {
- if (pressedIcon != null)
- {
- img.setAttribute('src', icon);
- }
- else
- {
- img.style.backgroundColor = '';
- }
- });
-
- mxEvent.addListener(img, mu, mouseHandler);
- mxEvent.addListener(img, 'mouseout', mouseHandler);
-
- return img;
-};
-
-/**
- * Function: addCombo
- *
- * Adds and returns a new SELECT element using the given style. The element
- * is placed inside a DIV with the mxToolbarComboContainer style classname.
- *
- * Parameters:
- *
- * style - Optional style classname. Default is mxToolbarCombo.
- */
-mxToolbar.prototype.addCombo = function(style)
-{
- var div = document.createElement('div');
- div.style.display = 'inline';
- div.className = 'mxToolbarComboContainer';
-
- var select = document.createElement('select');
- select.className = style || 'mxToolbarCombo';
- div.appendChild(select);
-
- this.container.appendChild(div);
-
- return select;
-};
-
-/**
- * Function: addCombo
- *
- * Adds and returns a new SELECT element using the given title as the
- * default element. The selection is reset to this element after each
- * change.
- *
- * Parameters:
- *
- * title - String that specifies the title of the default element.
- * style - Optional style classname. Default is mxToolbarCombo.
- */
-mxToolbar.prototype.addActionCombo = function(title, style)
-{
- var select = document.createElement('select');
- select.className = style || 'mxToolbarCombo';
-
- this.addOption(select, title, null);
-
- mxEvent.addListener(select, 'change', function(evt)
- {
- var value = select.options[select.selectedIndex];
- select.selectedIndex = 0;
- if (value.funct != null)
- {
- value.funct(evt);
- }
- });
-
- this.container.appendChild(select);
-
- return select;
-};
-
-/**
- * Function: addOption
- *
- * Adds and returns a new OPTION element inside the given SELECT element.
- * If the given value is a function then it is stored in the option's funct
- * field.
- *
- * Parameters:
- *
- * combo - SELECT element that will contain the new entry.
- * title - String that specifies the title of the option.
- * value - Specifies the value associated with this option.
- */
-mxToolbar.prototype.addOption = function(combo, title, value)
-{
- var option = document.createElement('option');
- mxUtils.writeln(option, title);
-
- if (typeof(value) == 'function')
- {
- option.funct = value;
- }
- else
- {
- option.setAttribute('value', value);
- }
-
- combo.appendChild(option);
-
- return option;
-};
-
-/**
- * Function: addSwitchMode
- *
- * Adds a new selectable item to the toolbar. Only one switch mode item may
- * be selected at a time. The currently selected item is the default item
- * after a reset of the toolbar.
- */
-mxToolbar.prototype.addSwitchMode = function(title, icon, funct, pressedIcon, style)
-{
- var img = document.createElement('img');
- img.initialClassName = style || 'mxToolbarMode';
- img.className = img.initialClassName;
- img.setAttribute('src', icon);
- img.altIcon = pressedIcon;
-
- if (title != null)
- {
- img.setAttribute('title', title);
- }
-
- mxEvent.addListener(img, 'click', mxUtils.bind(this, function(evt)
- {
- var tmp = this.selectedMode.altIcon;
-
- if (tmp != null)
- {
- this.selectedMode.altIcon = this.selectedMode.getAttribute('src');
- this.selectedMode.setAttribute('src', tmp);
- }
- else
- {
- this.selectedMode.className = this.selectedMode.initialClassName;
- }
-
- if (this.updateDefaultMode)
- {
- this.defaultMode = img;
- }
-
- this.selectedMode = img;
-
- var tmp = img.altIcon;
-
- if (tmp != null)
- {
- img.altIcon = img.getAttribute('src');
- img.setAttribute('src', tmp);
- }
- else
- {
- img.className = img.initialClassName+'Selected';
- }
-
- this.fireEvent(new mxEventObject(mxEvent.SELECT));
- funct();
- }));
-
- this.container.appendChild(img);
-
- if (this.defaultMode == null)
- {
- this.defaultMode = img;
-
- // Function should fire only once so
- // do not pass it with the select event
- this.selectMode(img);
- funct();
- }
-
- return img;
-};
-
-/**
- * Function: addMode
- *
- * Adds a new item to the toolbar. The selection is typically reset after
- * the item has been consumed, for example by adding a new vertex to the
- * graph. The reset is not carried out if the item is double clicked.
- *
- * The function argument uses the following signature: funct(evt, cell) where
- * evt is the native mouse event and cell is the cell under the mouse.
- */
-mxToolbar.prototype.addMode = function(title, icon, funct, pressedIcon, style, toggle)
-{
- toggle = (toggle != null) ? toggle : true;
- var img = document.createElement((icon != null) ? 'img' : 'button');
-
- img.initialClassName = style || 'mxToolbarMode';
- img.className = img.initialClassName;
- img.setAttribute('src', icon);
- img.altIcon = pressedIcon;
-
- if (title != null)
- {
- img.setAttribute('title', title);
- }
-
- if (this.enabled && toggle)
- {
- mxEvent.addListener(img, 'click', mxUtils.bind(this, function(evt)
- {
- this.selectMode(img, funct);
- this.noReset = false;
- }));
- mxEvent.addListener(img, 'dblclick',
- mxUtils.bind(this, function(evt)
- {
- this.selectMode(img, funct);
- this.noReset = true;
- })
- );
-
- if (this.defaultMode == null)
- {
- this.defaultMode = img;
- this.defaultFunction = funct;
- this.selectMode(img, funct);
- }
- }
-
- this.container.appendChild(img);
-
- return img;
-};
-
-/**
- * Function: selectMode
- *
- * Resets the state of the previously selected mode and displays the given
- * DOM node as selected. This function fires a select event with the given
- * function as a parameter.
- */
-mxToolbar.prototype.selectMode = function(domNode, funct)
-{
- if (this.selectedMode != domNode)
- {
- if (this.selectedMode != null)
- {
- var tmp = this.selectedMode.altIcon;
-
- if (tmp != null)
- {
- this.selectedMode.altIcon = this.selectedMode.getAttribute('src');
- this.selectedMode.setAttribute('src', tmp);
- }
- else
- {
- this.selectedMode.className = this.selectedMode.initialClassName;
- }
- }
-
- this.selectedMode = domNode;
- var tmp = this.selectedMode.altIcon;
-
- if (tmp != null)
- {
- this.selectedMode.altIcon = this.selectedMode.getAttribute('src');
- this.selectedMode.setAttribute('src', tmp);
- }
- else
- {
- this.selectedMode.className = this.selectedMode.initialClassName+'Selected';
- }
-
- this.fireEvent(new mxEventObject(mxEvent.SELECT, "function", funct));
- }
-};
-
-/**
- * Function: resetMode
- *
- * Selects the default mode and resets the state of the previously selected
- * mode.
- */
-mxToolbar.prototype.resetMode = function(forced)
-{
- if ((forced || !this.noReset) &&
- this.selectedMode != this.defaultMode)
- {
- // The last selected switch mode will be activated
- // so the function was already executed and is
- // no longer required here
- this.selectMode(this.defaultMode, this.defaultFunction);
- }
-};
-
-/**
- * Function: addSeparator
- *
- * Adds the specifies image as a separator.
- *
- * Parameters:
- *
- * icon - URL of the separator icon.
- */
-mxToolbar.prototype.addSeparator = function(icon)
-{
- return this.addItem(null, icon, null);
-};
-
-/**
- * Function: addBreak
- *
- * Adds a break to the container.
- */
-mxToolbar.prototype.addBreak = function()
-{
- mxUtils.br(this.container);
-};
-
-/**
- * Function: addLine
- *
- * Adds a horizontal line to the container.
- */
-mxToolbar.prototype.addLine = function()
-{
- var hr = document.createElement('hr');
-
- hr.style.marginRight = '6px';
- hr.setAttribute('size', '1');
-
- this.container.appendChild(hr);
-};
-
-/**
- * Function: destroy
- *
- * Removes the toolbar and all its associated resources.
- */
-mxToolbar.prototype.destroy = function ()
-{
- mxEvent.release(this.container);
- this.container = null;
- this.defaultMode = null;
- this.defaultFunction = null;
- this.selectedMode = null;
-
- if (this.menu != null)
- {
- this.menu.destroy();
- }
-};
diff --git a/src/js/util/mxUndoManager.js b/src/js/util/mxUndoManager.js
deleted file mode 100644
index 2cb93cb..0000000
--- a/src/js/util/mxUndoManager.js
+++ /dev/null
@@ -1,229 +0,0 @@
-/**
- * $Id: mxUndoManager.js,v 1.30 2011-10-05 06:39:19 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxUndoManager
- *
- * Implements a command history. When changing the graph model, an
- * <mxUndoableChange> object is created at the start of the transaction (when
- * model.beginUpdate is called). All atomic changes are then added to this
- * object until the last model.endUpdate call, at which point the
- * <mxUndoableEdit> is dispatched in an event, and added to the history inside
- * <mxUndoManager>. This is done by an event listener in
- * <mxEditor.installUndoHandler>.
- *
- * Each atomic change of the model is represented by an object (eg.
- * <mxRootChange>, <mxChildChange>, <mxTerminalChange> etc) which contains the
- * complete undo information. The <mxUndoManager> also listens to the
- * <mxGraphView> and stores it's changes to the current root as insignificant
- * undoable changes, so that drilling (step into, step up) is undone.
- *
- * This means when you execute an atomic change on the model, then change the
- * current root on the view and click undo, the change of the root will be
- * undone together with the change of the model so that the display represents
- * the state at which the model was changed. However, these changes are not
- * transmitted for sharing as they do not represent a state change.
- *
- * Example:
- *
- * When adding an undo manager to a graph, make sure to add it
- * to the model and the view as well to maintain a consistent
- * display across multiple undo/redo steps.
- *
- * (code)
- * var undoManager = new mxUndoManager();
- * var listener = function(sender, evt)
- * {
- * undoManager.undoableEditHappened(evt.getProperty('edit'));
- * };
- * graph.getModel().addListener(mxEvent.UNDO, listener);
- * graph.getView().addListener(mxEvent.UNDO, listener);
- * (end)
- *
- * The code creates a function that informs the undoManager
- * of an undoable edit and binds it to the undo event of
- * <mxGraphModel> and <mxGraphView> using
- * <mxEventSource.addListener>.
- *
- * Event: mxEvent.CLEAR
- *
- * Fires after <clear> was invoked. This event has no properties.
- *
- * Event: mxEvent.UNDO
- *
- * Fires afer a significant edit was undone in <undo>. The <code>edit</code>
- * property contains the <mxUndoableEdit> that was undone.
- *
- * Event: mxEvent.REDO
- *
- * Fires afer a significant edit was redone in <redo>. The <code>edit</code>
- * property contains the <mxUndoableEdit> that was redone.
- *
- * Event: mxEvent.ADD
- *
- * Fires after an undoable edit was added to the history. The <code>edit</code>
- * property contains the <mxUndoableEdit> that was added.
- *
- * Constructor: mxUndoManager
- *
- * Constructs a new undo manager with the given history size. If no history
- * size is given, then a default size of 100 steps is used.
- */
-function mxUndoManager(size)
-{
- this.size = (size != null) ? size : 100;
- this.clear();
-};
-
-/**
- * Extends mxEventSource.
- */
-mxUndoManager.prototype = new mxEventSource();
-mxUndoManager.prototype.constructor = mxUndoManager;
-
-/**
- * Variable: size
- *
- * Maximum command history size. 0 means unlimited history. Default is
- * 100.
- */
-mxUndoManager.prototype.size = null;
-
-/**
- * Variable: history
- *
- * Array that contains the steps of the command history.
- */
-mxUndoManager.prototype.history = null;
-
-/**
- * Variable: indexOfNextAdd
- *
- * Index of the element to be added next.
- */
-mxUndoManager.prototype.indexOfNextAdd = 0;
-
-/**
- * Function: isEmpty
- *
- * Returns true if the history is empty.
- */
-mxUndoManager.prototype.isEmpty = function()
-{
- return this.history.length == 0;
-};
-
-/**
- * Function: clear
- *
- * Clears the command history.
- */
-mxUndoManager.prototype.clear = function()
-{
- this.history = [];
- this.indexOfNextAdd = 0;
- this.fireEvent(new mxEventObject(mxEvent.CLEAR));
-};
-
-/**
- * Function: canUndo
- *
- * Returns true if an undo is possible.
- */
-mxUndoManager.prototype.canUndo = function()
-{
- return this.indexOfNextAdd > 0;
-};
-
-/**
- * Function: undo
- *
- * Undoes the last change.
- */
-mxUndoManager.prototype.undo = function()
-{
- while (this.indexOfNextAdd > 0)
- {
- var edit = this.history[--this.indexOfNextAdd];
- edit.undo();
-
- if (edit.isSignificant())
- {
- this.fireEvent(new mxEventObject(mxEvent.UNDO, 'edit', edit));
- break;
- }
- }
-};
-
-/**
- * Function: canRedo
- *
- * Returns true if a redo is possible.
- */
-mxUndoManager.prototype.canRedo = function()
-{
- return this.indexOfNextAdd < this.history.length;
-};
-
-/**
- * Function: redo
- *
- * Redoes the last change.
- */
-mxUndoManager.prototype.redo = function()
-{
- var n = this.history.length;
-
- while (this.indexOfNextAdd < n)
- {
- var edit = this.history[this.indexOfNextAdd++];
- edit.redo();
-
- if (edit.isSignificant())
- {
- this.fireEvent(new mxEventObject(mxEvent.REDO, 'edit', edit));
- break;
- }
- }
-};
-
-/**
- * Function: undoableEditHappened
- *
- * Method to be called to add new undoable edits to the <history>.
- */
-mxUndoManager.prototype.undoableEditHappened = function(undoableEdit)
-{
- this.trim();
-
- if (this.size > 0 &&
- this.size == this.history.length)
- {
- this.history.shift();
- }
-
- this.history.push(undoableEdit);
- this.indexOfNextAdd = this.history.length;
- this.fireEvent(new mxEventObject(mxEvent.ADD, 'edit', undoableEdit));
-};
-
-/**
- * Function: trim
- *
- * Removes all pending steps after <indexOfNextAdd> from the history,
- * invoking die on each edit. This is called from <undoableEditHappened>.
- */
-mxUndoManager.prototype.trim = function()
-{
- if (this.history.length > this.indexOfNextAdd)
- {
- var edits = this.history.splice(this.indexOfNextAdd,
- this.history.length - this.indexOfNextAdd);
-
- for (var i = 0; i < edits.length; i++)
- {
- edits[i].die();
- }
- }
-};
diff --git a/src/js/util/mxUndoableEdit.js b/src/js/util/mxUndoableEdit.js
deleted file mode 100644
index 886c262..0000000
--- a/src/js/util/mxUndoableEdit.js
+++ /dev/null
@@ -1,168 +0,0 @@
-/**
- * $Id: mxUndoableEdit.js,v 1.14 2010-09-15 16:58:51 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxUndoableEdit
- *
- * Implements a composite undoable edit.
- *
- * Constructor: mxUndoableEdit
- *
- * Constructs a new undoable edit for the given source.
- */
-function mxUndoableEdit(source, significant)
-{
- this.source = source;
- this.changes = [];
- this.significant = (significant != null) ? significant : true;
-};
-
-/**
- * Variable: source
- *
- * Specifies the source of the edit.
- */
-mxUndoableEdit.prototype.source = null;
-
-/**
- * Variable: changes
- *
- * Array that contains the changes that make up this edit. The changes are
- * expected to either have an undo and redo function, or an execute
- * function. Default is an empty array.
- */
-mxUndoableEdit.prototype.changes = null;
-
-/**
- * Variable: significant
- *
- * Specifies if the undoable change is significant.
- * Default is true.
- */
-mxUndoableEdit.prototype.significant = null;
-
-/**
- * Variable: undone
- *
- * Specifies if this edit has been undone. Default is false.
- */
-mxUndoableEdit.prototype.undone = false;
-
-/**
- * Variable: redone
- *
- * Specifies if this edit has been redone. Default is false.
- */
-mxUndoableEdit.prototype.redone = false;
-
-/**
- * Function: isEmpty
- *
- * Returns true if the this edit contains no changes.
- */
-mxUndoableEdit.prototype.isEmpty = function()
-{
- return this.changes.length == 0;
-};
-
-/**
- * Function: isSignificant
- *
- * Returns <significant>.
- */
-mxUndoableEdit.prototype.isSignificant = function()
-{
- return this.significant;
-};
-
-/**
- * Function: add
- *
- * Adds the specified change to this edit. The change is an object that is
- * expected to either have an undo and redo, or an execute function.
- */
-mxUndoableEdit.prototype.add = function(change)
-{
- this.changes.push(change);
-};
-
-/**
- * Function: notify
- *
- * Hook to notify any listeners of the changes after an <undo> or <redo>
- * has been carried out. This implementation is empty.
- */
-mxUndoableEdit.prototype.notify = function() { };
-
-/**
- * Function: die
- *
- * Hook to free resources after the edit has been removed from the command
- * history. This implementation is empty.
- */
-mxUndoableEdit.prototype.die = function() { };
-
-/**
- * Function: undo
- *
- * Undoes all changes in this edit.
- */
-mxUndoableEdit.prototype.undo = function()
-{
- if (!this.undone)
- {
- var count = this.changes.length;
-
- for (var i = count - 1; i >= 0; i--)
- {
- var change = this.changes[i];
-
- if (change.execute != null)
- {
- change.execute();
- }
- else if (change.undo != null)
- {
- change.undo();
- }
- }
-
- this.undone = true;
- this.redone = false;
- }
-
- this.notify();
-};
-
-/**
- * Function: redo
- *
- * Redoes all changes in this edit.
- */
-mxUndoableEdit.prototype.redo = function()
-{
- if (!this.redone)
- {
- var count = this.changes.length;
-
- for (var i = 0; i < count; i++)
- {
- var change = this.changes[i];
-
- if (change.execute != null)
- {
- change.execute();
- }
- else if (change.redo != null)
- {
- change.redo();
- }
- }
-
- this.undone = false;
- this.redone = true;
- }
-
- this.notify();
-};
diff --git a/src/js/util/mxUrlConverter.js b/src/js/util/mxUrlConverter.js
deleted file mode 100644
index 764767f..0000000
--- a/src/js/util/mxUrlConverter.js
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * $Id: mxUrlConverter.js,v 1.3 2012-08-24 17:10:41 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- *
- * Class: mxUrlConverter
- *
- * Converts relative and absolute URLs to absolute URLs with protocol and domain.
- */
-var mxUrlConverter = function(root)
-{
- /**
- * Variable: enabled
- *
- * Specifies if the converter is enabled. Default is true.
- */
- var enabled = true;
-
- /**
- * Variable: baseUrl
- *
- * Specifies the base URL to be used as a prefix for relative URLs.
- */
- var baseUrl = null;
-
- /**
- * Variable: baseDomain
- *
- * Specifies the base domain to be used as a prefix for absolute URLs.
- */
- var baseDomain = null;
-
- // Private helper function to update the base URL
- var updateBaseUrl = function()
- {
- baseDomain = location.protocol + '//' + location.host;
- baseUrl = baseDomain + location.pathname;
- var tmp = baseUrl.lastIndexOf('/');
-
- // Strips filename etc
- if (tmp > 0)
- {
- baseUrl = baseUrl.substring(0, tmp + 1);
- }
- };
-
- // Returns public interface
- return {
-
- /**
- * Function: isEnabled
- *
- * Returns <enabled>.
- */
- isEnabled: function()
- {
- return enabled;
- },
-
- /**
- * Function: setEnabled
- *
- * Sets <enabled>.
- */
- setEnabled: function(value)
- {
- enabled = value;
- },
-
- /**
- * Function: getBaseUrl
- *
- * Returns <baseUrl>.
- */
- getBaseUrl: function()
- {
- return baseUrl;
- },
-
- /**
- * Function: setBaseUrl
- *
- * Sets <baseUrl>.
- */
- setBaseUrl: function(value)
- {
- baseUrl = value;
- },
-
- /**
- * Function: getBaseDomain
- *
- * Returns <baseDomain>.
- */
- getBaseDomain: function()
- {
- return baseUrl;
- },
-
- /**
- * Function: setBaseDomain
- *
- * Sets <baseDomain>.
- */
- setBaseDomain: function(value)
- {
- baseUrl = value;
- },
-
- /**
- * Function: convert
- *
- * Converts the given URL to an absolute URL with protol and domain.
- * Relative URLs are first converted to absolute URLs.
- */
- convert: function(url)
- {
- if (enabled && url.indexOf('http://') != 0 && url.indexOf('https://') != 0 && url.indexOf('data:image') != 0)
- {
- if (baseUrl == null)
- {
- updateBaseUrl();
- }
-
- if (url.charAt(0) == '/')
- {
- url = baseDomain + url;
- }
- else
- {
- url = baseUrl + url;
- }
- }
-
- return url;
- }
-
- };
-
-}; \ No newline at end of file
diff --git a/src/js/util/mxUtils.js b/src/js/util/mxUtils.js
deleted file mode 100644
index 34c0318..0000000
--- a/src/js/util/mxUtils.js
+++ /dev/null
@@ -1,3920 +0,0 @@
-/**
- * $Id: mxUtils.js,v 1.297 2012-12-07 19:47:29 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-var mxUtils =
-{
- /**
- * Class: mxUtils
- *
- * A singleton class that provides cross-browser helper methods.
- * This is a global functionality. To access the functions in this
- * class, use the global classname appended by the functionname.
- * You may have to load chrome://global/content/contentAreaUtils.js
- * to disable certain security restrictions in Mozilla for the <open>,
- * <save>, <saveAs> and <copy> function.
- *
- * For example, the following code displays an error message:
- *
- * (code)
- * mxUtils.error('Browser is not supported!', 200, false);
- * (end)
- *
- * Variable: errorResource
- *
- * Specifies the resource key for the title of the error window. If the
- * resource for this key does not exist then the value is used as
- * the title. Default is 'error'.
- */
- errorResource: (mxClient.language != 'none') ? 'error' : '',
-
- /**
- * Variable: closeResource
- *
- * Specifies the resource key for the label of the close button. If the
- * resource for this key does not exist then the value is used as
- * the label. Default is 'close'.
- */
- closeResource: (mxClient.language != 'none') ? 'close' : '',
-
- /**
- * Variable: errorImage
- *
- * Defines the image used for error dialogs.
- */
- errorImage: mxClient.imageBasePath + '/error.gif',
-
- /**
- * Function: removeCursors
- *
- * Removes the cursors from the style of the given DOM node and its
- * descendants.
- *
- * Parameters:
- *
- * element - DOM node to remove the cursor style from.
- */
- removeCursors: function(element)
- {
- if (element.style != null)
- {
- element.style.cursor = '';
- }
-
- var children = element.childNodes;
-
- if (children != null)
- {
- var childCount = children.length;
-
- for (var i = 0; i < childCount; i += 1)
- {
- mxUtils.removeCursors(children[i]);
- }
- }
- },
-
- /**
- * Function: repaintGraph
- *
- * Normally not required, this contains the code to workaround a repaint
- * issue and force a repaint of the graph container in AppleWebKit.
- *
- * Parameters:
- *
- * graph - <mxGraph> to be repainted.
- * pt - <mxPoint> where the dummy element should be placed.
- */
- repaintGraph: function(graph, pt)
- {
- if (mxClient.IS_GC || mxClient.IS_SF || mxClient.IS_OP)
- {
- var c = graph.container;
-
- if (c != null && pt != null && (c.scrollLeft > 0 || c.scrollTop > 0))
- {
- var dummy = document.createElement('div');
- dummy.style.position = 'absolute';
- dummy.style.left = pt.x + 'px';
- dummy.style.top = pt.y + 'px';
- dummy.style.width = '1px';
- dummy.style.height = '1px';
-
- c.appendChild(dummy);
- c.removeChild(dummy);
- }
- }
- },
-
- /**
- * Function: getCurrentStyle
- *
- * Returns the current style of the specified element.
- *
- * Parameters:
- *
- * element - DOM node whose current style should be returned.
- */
- getCurrentStyle: function()
- {
- if (mxClient.IS_IE)
- {
- return function(element)
- {
- return (element != null) ? element.currentStyle : null;
- };
- }
- else
- {
- return function(element)
- {
- return (element != null) ?
- window.getComputedStyle(element, '') :
- null;
- };
- }
- }(),
-
- /**
- * Function: hasScrollbars
- *
- * Returns true if the overflow CSS property of the given node is either
- * scroll or auto.
- *
- * Parameters:
- *
- * node - DOM node whose style should be checked for scrollbars.
- */
- hasScrollbars: function(node)
- {
- var style = mxUtils.getCurrentStyle(node);
-
- return style != null && (style.overflow == 'scroll' || style.overflow == 'auto');
- },
-
- /**
- * Function: bind
- *
- * Returns a wrapper function that locks the execution scope of the given
- * function to the specified scope. Inside funct, the "this" keyword
- * becomes a reference to that scope.
- */
- bind: function(scope, funct)
- {
- return function()
- {
- return funct.apply(scope, arguments);
- };
- },
-
- /**
- * Function: eval
- *
- * Evaluates the given expression using eval and returns the JavaScript
- * object that represents the expression result. Supports evaluation of
- * expressions that define functions and returns the function object for
- * these expressions.
- *
- * Parameters:
- *
- * expr - A string that represents a JavaScript expression.
- */
- eval: function(expr)
- {
- var result = null;
-
- if (expr.indexOf('function') >= 0)
- {
- try
- {
- eval('var _mxJavaScriptExpression='+expr);
- result = _mxJavaScriptExpression;
- // TODO: Use delete here?
- _mxJavaScriptExpression = null;
- }
- catch (e)
- {
- mxLog.warn(e.message + ' while evaluating ' + expr);
- }
- }
- else
- {
- try
- {
- result = eval(expr);
- }
- catch (e)
- {
- mxLog.warn(e.message + ' while evaluating ' + expr);
- }
- }
-
- return result;
- },
-
- /**
- * Function: findNode
- *
- * Returns the first node where attr equals value.
- * This implementation does not use XPath.
- */
- findNode: function(node, attr, value)
- {
- var tmp = node.getAttribute(attr);
-
- if (tmp != null && tmp == value)
- {
- return node;
- }
-
- node = node.firstChild;
-
- while (node != null)
- {
- var result = mxUtils.findNode(node, attr, value);
-
- if (result != null)
- {
- return result;
- }
-
- node = node.nextSibling;
- }
-
- return null;
- },
-
- /**
- * Function: findNodeByAttribute
- *
- * Returns the first node where the given attribute matches the given value.
- *
- * Parameters:
- *
- * node - Root node where the search should start.
- * attr - Name of the attribute to be checked.
- * value - Value of the attribute to match.
- */
- findNodeByAttribute: function()
- {
- // Workaround for missing XPath support in IE9
- if (document.documentMode >= 9)
- {
- return function(node, attr, value)
- {
- var result = null;
-
- if (node != null)
- {
- if (node.nodeType == mxConstants.NODETYPE_ELEMENT && node.getAttribute(attr) == value)
- {
- result = node;
- }
- else
- {
- var child = node.firstChild;
-
- while (child != null && result == null)
- {
- result = mxUtils.findNodeByAttribute(child, attr, value);
- child = child.nextSibling;
- }
- }
- }
-
- return result;
- };
- }
- else if (mxClient.IS_IE)
- {
- return function(node, attr, value)
- {
- if (node == null)
- {
- return null;
- }
- else
- {
- var expr = '//*[@' + attr + '=\'' + value + '\']';
-
- return node.ownerDocument.selectSingleNode(expr);
- }
- };
- }
- else
- {
- return function(node, attr, value)
- {
- if (node == null)
- {
- return null;
- }
- else
- {
- var result = node.ownerDocument.evaluate(
- '//*[@' + attr + '=\'' + value + '\']',
- node.ownerDocument, null,
- XPathResult.ANY_TYPE, null);
-
- return result.iterateNext();
- }
- };
- }
- }(),
-
- /**
- * Function: getFunctionName
- *
- * Returns the name for the given function.
- *
- * Parameters:
- *
- * f - JavaScript object that represents a function.
- */
- getFunctionName: function(f)
- {
- var str = null;
-
- if (f != null)
- {
- if (f.name != null)
- {
- str = f.name;
- }
- else
- {
- var tmp = f.toString();
- var idx1 = 9;
-
- while (tmp.charAt(idx1) == ' ')
- {
- idx1++;
- }
-
- var idx2 = tmp.indexOf('(', idx1);
- str = tmp.substring(idx1, idx2);
- }
- }
-
- return str;
- },
-
- /**
- * Function: indexOf
- *
- * Returns the index of obj in array or -1 if the array does not contains
- * the given object.
- *
- * Parameters:
- *
- * array - Array to check for the given obj.
- * obj - Object to find in the given array.
- */
- indexOf: function(array, obj)
- {
- if (array != null && obj != null)
- {
- for (var i = 0; i < array.length; i++)
- {
- if (array[i] == obj)
- {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- /**
- * Function: remove
- *
- * Removes all occurrences of the given object in the given array or
- * object. If there are multiple occurrences of the object, be they
- * associative or as an array entry, all occurrences are removed from
- * the array or deleted from the object. By removing the object from
- * the array, all elements following the removed element are shifted
- * by one step towards the beginning of the array.
- *
- * The length of arrays is not modified inside this function.
- *
- * Parameters:
- *
- * obj - Object to find in the given array.
- * array - Array to check for the given obj.
- */
- remove: function(obj, array)
- {
- var result = null;
-
- if (typeof(array) == 'object')
- {
- var index = mxUtils.indexOf(array, obj);
-
- while (index >= 0)
- {
- array.splice(index, 1);
- result = obj;
- index = mxUtils.indexOf(array, obj);
- }
- }
-
- for (var key in array)
- {
- if (array[key] == obj)
- {
- delete array[key];
- result = obj;
- }
- }
-
- return result;
- },
-
- /**
- * Function: isNode
- *
- * Returns true if the given value is an XML node with the node name
- * and if the optional attribute has the specified value.
- *
- * This implementation assumes that the given value is a DOM node if the
- * nodeType property is numeric, that is, if isNaN returns false for
- * value.nodeType.
- *
- * Parameters:
- *
- * value - Object that should be examined as a node.
- * nodeName - String that specifies the node name.
- * attributeName - Optional attribute name to check.
- * attributeValue - Optional attribute value to check.
- */
- isNode: function(value, nodeName, attributeName, attributeValue)
- {
- if (value != null && !isNaN(value.nodeType) && (nodeName == null ||
- value.nodeName.toLowerCase() == nodeName.toLowerCase()))
- {
- return attributeName == null ||
- value.getAttribute(attributeName) == attributeValue;
- }
-
- return false;
- },
-
- /**
- * Function: getChildNodes
- *
- * Returns an array of child nodes that are of the given node type.
- *
- * Parameters:
- *
- * node - Parent DOM node to return the children from.
- * nodeType - Optional node type to return. Default is
- * <mxConstants.NODETYPE_ELEMENT>.
- */
- getChildNodes: function(node, nodeType)
- {
- nodeType = nodeType || mxConstants.NODETYPE_ELEMENT;
-
- var children = [];
- var tmp = node.firstChild;
-
- while (tmp != null)
- {
- if (tmp.nodeType == nodeType)
- {
- children.push(tmp);
- }
-
- tmp = tmp.nextSibling;
- }
-
- return children;
- },
-
- /**
- * Function: createXmlDocument
- *
- * Returns a new, empty XML document.
- */
- createXmlDocument: function()
- {
- var doc = null;
-
- if (document.implementation && document.implementation.createDocument)
- {
- doc = document.implementation.createDocument('', '', null);
- }
- else if (window.ActiveXObject)
- {
- doc = new ActiveXObject('Microsoft.XMLDOM');
- }
-
- return doc;
- },
-
- /**
- * Function: parseXml
- *
- * Parses the specified XML string into a new XML document and returns the
- * new document.
- *
- * Example:
- *
- * (code)
- * var doc = mxUtils.parseXml(
- * '<mxGraphModel><root><MyDiagram id="0"><mxCell/></MyDiagram>'+
- * '<MyLayer id="1"><mxCell parent="0" /></MyLayer><MyObject id="2">'+
- * '<mxCell style="strokeColor=blue;fillColor=red" parent="1" vertex="1">'+
- * '<mxGeometry x="10" y="10" width="80" height="30" as="geometry"/>'+
- * '</mxCell></MyObject></root></mxGraphModel>');
- * (end)
- *
- * Parameters:
- *
- * xml - String that contains the XML data.
- */
- parseXml: function()
- {
- if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9))
- {
- return function(xml)
- {
- var result = mxUtils.createXmlDocument();
-
- result.async = 'false';
- result.loadXML(xml);
-
- return result;
- };
- }
- else
- {
- return function(xml)
- {
- var parser = new DOMParser();
-
- return parser.parseFromString(xml, 'text/xml');
- };
- }
- }(),
-
- /**
- * Function: clearSelection
- *
- * Clears the current selection in the page.
- */
- clearSelection: function()
- {
- if (document.selection)
- {
- return function()
- {
- document.selection.empty();
- };
- }
- else if (window.getSelection)
- {
- return function()
- {
- window.getSelection().removeAllRanges();
- };
- }
- }(),
-
- /**
- * Function: getPrettyXML
- *
- * Returns a pretty printed string that represents the XML tree for the
- * given node. This method should only be used to print XML for reading,
- * use <getXml> instead to obtain a string for processing.
- *
- * Parameters:
- *
- * node - DOM node to return the XML for.
- * tab - Optional string that specifies the indentation for one level.
- * Default is two spaces.
- * indent - Optional string that represents the current indentation.
- * Default is an empty string.
- */
- getPrettyXml: function(node, tab, indent)
- {
- var result = [];
-
- if (node != null)
- {
- tab = tab || ' ';
- indent = indent || '';
-
- if (node.nodeType == mxConstants.NODETYPE_TEXT)
- {
- result.push(node.nodeValue);
- }
- else
- {
- result.push(indent + '<'+node.nodeName);
-
- // Creates the string with the node attributes
- // and converts all HTML entities in the values
- var attrs = node.attributes;
-
- if (attrs != null)
- {
- for (var i = 0; i < attrs.length; i++)
- {
- var val = mxUtils.htmlEntities(attrs[i].nodeValue);
- result.push(' ' + attrs[i].nodeName +
- '="' + val + '"');
- }
- }
-
- // Recursively creates the XML string for each
- // child nodes and appends it here with an
- // indentation
- var tmp = node.firstChild;
-
- if (tmp != null)
- {
- result.push('>\n');
-
- while (tmp != null)
- {
- result.push(mxUtils.getPrettyXml(
- tmp, tab, indent + tab));
- tmp = tmp.nextSibling;
- }
-
- result.push(indent + '</'+node.nodeName+'>\n');
- }
- else
- {
- result.push('/>\n');
- }
- }
- }
-
- return result.join('');
- },
-
- /**
- * Function: removeWhitespace
- *
- * Removes the sibling text nodes for the given node that only consists
- * of tabs, newlines and spaces.
- *
- * Parameters:
- *
- * node - DOM node whose siblings should be removed.
- * before - Optional boolean that specifies the direction of the traversal.
- */
- removeWhitespace: function(node, before)
- {
- var tmp = (before) ? node.previousSibling : node.nextSibling;
-
- while (tmp != null && tmp.nodeType == mxConstants.NODETYPE_TEXT)
- {
- var next = (before) ? tmp.previousSibling : tmp.nextSibling;
- var text = mxUtils.getTextContent(tmp);
-
- if (mxUtils.trim(text).length == 0)
- {
- tmp.parentNode.removeChild(tmp);
- }
-
- tmp = next;
- }
- },
-
- /**
- * Function: htmlEntities
- *
- * Replaces characters (less than, greater than, newlines and quotes) with
- * their HTML entities in the given string and returns the result.
- *
- * Parameters:
- *
- * s - String that contains the characters to be converted.
- * newline - If newlines should be replaced. Default is true.
- */
- htmlEntities: function(s, newline)
- {
- s = s || '';
-
- s = s.replace(/&/g,'&amp;'); // 38 26
- s = s.replace(/"/g,'&quot;'); // 34 22
- s = s.replace(/\'/g,'&#39;'); // 39 27
- s = s.replace(/</g,'&lt;'); // 60 3C
- s = s.replace(/>/g,'&gt;'); // 62 3E
-
- if (newline == null || newline)
- {
- s = s.replace(/\n/g, '&#xa;');
- }
-
- return s;
- },
-
- /**
- * Function: isVml
- *
- * Returns true if the given node is in the VML namespace.
- *
- * Parameters:
- *
- * node - DOM node whose tag urn should be checked.
- */
- isVml: function(node)
- {
- return node != null && node.tagUrn == 'urn:schemas-microsoft-com:vml';
- },
-
- /**
- * Function: getXml
- *
- * Returns the XML content of the specified node. For Internet Explorer,
- * all \r\n\t[\t]* are removed from the XML string and the remaining \r\n
- * are replaced by \n. All \n are then replaced with linefeed, or &#xa; if
- * no linefeed is defined.
- *
- * Parameters:
- *
- * node - DOM node to return the XML for.
- * linefeed - Optional string that linefeeds are converted into. Default is
- * &#xa;
- */
- getXml: function(node, linefeed)
- {
- var xml = '';
-
- if (node != null)
- {
- xml = node.xml;
-
- if (xml == null)
- {
- if (node.innerHTML)
- {
- xml = node.innerHTML;
- }
- else
- {
- var xmlSerializer = new XMLSerializer();
- xml = xmlSerializer.serializeToString(node);
- }
- }
- else
- {
- xml = xml.replace(/\r\n\t[\t]*/g, '').
- replace(/>\r\n/g, '>').
- replace(/\r\n/g, '\n');
- }
- }
-
- // Replaces linefeeds with HTML Entities.
- linefeed = linefeed || '&#xa;';
- xml = xml.replace(/\n/g, linefeed);
-
- return xml;
- },
-
- /**
- * Function: getTextContent
- *
- * Returns the text content of the specified node.
- *
- * Parameters:
- *
- * node - DOM node to return the text content for.
- */
- getTextContent: function(node)
- {
- var result = '';
-
- if (node != null)
- {
- if (node.firstChild != null)
- {
- node = node.firstChild;
- }
-
- result = node.nodeValue || '';
- }
-
- return result;
- },
-
- /**
- * Function: getInnerHtml
- *
- * Returns the inner HTML for the given node as a string or an empty string
- * if no node was specified. The inner HTML is the text representing all
- * children of the node, but not the node itself.
- *
- * Parameters:
- *
- * node - DOM node to return the inner HTML for.
- */
- getInnerHtml: function()
- {
- if (mxClient.IS_IE)
- {
- return function(node)
- {
- if (node != null)
- {
- return node.innerHTML;
- }
-
- return '';
- };
- }
- else
- {
- return function(node)
- {
- if (node != null)
- {
- var serializer = new XMLSerializer();
- return serializer.serializeToString(node);
- }
-
- return '';
- };
- }
- }(),
-
- /**
- * Function: getOuterHtml
- *
- * Returns the outer HTML for the given node as a string or an empty
- * string if no node was specified. The outer HTML is the text representing
- * all children of the node including the node itself.
- *
- * Parameters:
- *
- * node - DOM node to return the outer HTML for.
- */
- getOuterHtml: function()
- {
- if (mxClient.IS_IE)
- {
- return function(node)
- {
- if (node != null)
- {
- if (node.outerHTML != null)
- {
- return node.outerHTML;
- }
- else
- {
- var tmp = [];
- tmp.push('<'+node.nodeName);
-
- var attrs = node.attributes;
-
- if (attrs != null)
- {
- for (var i = 0; i < attrs.length; i++)
- {
- var value = attrs[i].nodeValue;
-
- if (value != null && value.length > 0)
- {
- tmp.push(' ');
- tmp.push(attrs[i].nodeName);
- tmp.push('="');
- tmp.push(value);
- tmp.push('"');
- }
- }
- }
-
- if (node.innerHTML.length == 0)
- {
- tmp.push('/>');
- }
- else
- {
- tmp.push('>');
- tmp.push(node.innerHTML);
- tmp.push('</'+node.nodeName+'>');
- }
-
- return tmp.join('');
- }
- }
-
- return '';
- };
- }
- else
- {
- return function(node)
- {
- if (node != null)
- {
- var serializer = new XMLSerializer();
- return serializer.serializeToString(node);
- }
-
- return '';
- };
- }
- }(),
-
- /**
- * Function: write
- *
- * Creates a text node for the given string and appends it to the given
- * parent. Returns the text node.
- *
- * Parameters:
- *
- * parent - DOM node to append the text node to.
- * text - String representing the text to be added.
- */
- write: function(parent, text)
- {
- var doc = parent.ownerDocument;
- var node = doc.createTextNode(text);
-
- if (parent != null)
- {
- parent.appendChild(node);
- }
-
- return node;
- },
-
- /**
- * Function: writeln
- *
- * Creates a text node for the given string and appends it to the given
- * parent with an additional linefeed. Returns the text node.
- *
- * Parameters:
- *
- * parent - DOM node to append the text node to.
- * text - String representing the text to be added.
- */
- writeln: function(parent, text)
- {
- var doc = parent.ownerDocument;
- var node = doc.createTextNode(text);
-
- if (parent != null)
- {
- parent.appendChild(node);
- parent.appendChild(document.createElement('br'));
- }
-
- return node;
- },
-
- /**
- * Function: br
- *
- * Appends a linebreak to the given parent and returns the linebreak.
- *
- * Parameters:
- *
- * parent - DOM node to append the linebreak to.
- */
- br: function(parent, count)
- {
- count = count || 1;
- var br = null;
-
- for (var i = 0; i < count; i++)
- {
- if (parent != null)
- {
- br = parent.ownerDocument.createElement('br');
- parent.appendChild(br);
- }
- }
-
- return br;
- },
-
- /**
- * Function: button
- *
- * Returns a new button with the given level and function as an onclick
- * event handler.
- *
- * (code)
- * document.body.appendChild(mxUtils.button('Test', function(evt)
- * {
- * alert('Hello, World!');
- * }));
- * (end)
- *
- * Parameters:
- *
- * label - String that represents the label of the button.
- * funct - Function to be called if the button is pressed.
- * doc - Optional document to be used for creating the button. Default is the
- * current document.
- */
- button: function(label, funct, doc)
- {
- doc = (doc != null) ? doc : document;
-
- var button = doc.createElement('button');
- mxUtils.write(button, label);
-
- mxEvent.addListener(button, 'click', function(evt)
- {
- funct(evt);
- });
-
- return button;
- },
-
- /**
- * Function: para
- *
- * Appends a new paragraph with the given text to the specified parent and
- * returns the paragraph.
- *
- * Parameters:
- *
- * parent - DOM node to append the text node to.
- * text - String representing the text for the new paragraph.
- */
- para: function(parent, text)
- {
- var p = document.createElement('p');
- mxUtils.write(p, text);
-
- if (parent != null)
- {
- parent.appendChild(p);
- }
-
- return p;
- },
-
- /**
- * Function: linkAction
- *
- * Adds a hyperlink to the specified parent that invokes action on the
- * specified editor.
- *
- * Parameters:
- *
- * parent - DOM node to contain the new link.
- * text - String that is used as the link label.
- * editor - <mxEditor> that will execute the action.
- * action - String that defines the name of the action to be executed.
- * pad - Optional left-padding for the link. Default is 0.
- */
- linkAction: function(parent, text, editor, action, pad)
- {
- return mxUtils.link(parent, text, function()
- {
- editor.execute(action);
- }, pad);
- },
-
- /**
- * Function: linkInvoke
- *
- * Adds a hyperlink to the specified parent that invokes the specified
- * function on the editor passing along the specified argument. The
- * function name is the name of a function of the editor instance,
- * not an action name.
- *
- * Parameters:
- *
- * parent - DOM node to contain the new link.
- * text - String that is used as the link label.
- * editor - <mxEditor> instance to execute the function on.
- * functName - String that represents the name of the function.
- * arg - Object that represents the argument to the function.
- * pad - Optional left-padding for the link. Default is 0.
- */
- linkInvoke: function(parent, text, editor, functName, arg, pad)
- {
- return mxUtils.link(parent, text, function()
- {
- editor[functName](arg);
- }, pad);
- },
-
- /**
- * Function: link
- *
- * Adds a hyperlink to the specified parent and invokes the given function
- * when the link is clicked.
- *
- * Parameters:
- *
- * parent - DOM node to contain the new link.
- * text - String that is used as the link label.
- * funct - Function to execute when the link is clicked.
- * pad - Optional left-padding for the link. Default is 0.
- */
- link: function(parent, text, funct, pad)
- {
- var a = document.createElement('span');
-
- a.style.color = 'blue';
- a.style.textDecoration = 'underline';
- a.style.cursor = 'pointer';
-
- if (pad != null)
- {
- a.style.paddingLeft = pad+'px';
- }
-
- mxEvent.addListener(a, 'click', funct);
- mxUtils.write(a, text);
-
- if (parent != null)
- {
- parent.appendChild(a);
- }
-
- return a;
- },
-
- /**
- * Function: fit
- *
- * Makes sure the given node is inside the visible area of the window. This
- * is done by setting the left and top in the style.
- */
- fit: function(node)
- {
- var left = parseInt(node.offsetLeft);
- var width = parseInt(node.offsetWidth);
-
- var b = document.body;
- var d = document.documentElement;
-
- var right = (b.scrollLeft || d.scrollLeft) +
- (b.clientWidth || d.clientWidth);
-
- if (left + width > right)
- {
- node.style.left = Math.max((b.scrollLeft || d.scrollLeft),
- right - width)+'px';
- }
-
- var top = parseInt(node.offsetTop);
- var height = parseInt(node.offsetHeight);
-
- var bottom = (b.scrollTop || d.scrollTop) +
- Math.max(b.clientHeight || 0, d.clientHeight);
-
- if (top + height > bottom)
- {
- node.style.top = Math.max((b.scrollTop || d.scrollTop),
- bottom - height)+'px';
- }
- },
-
- /**
- * Function: open
- *
- * Opens the specified file from the local filesystem and returns the
- * contents of the file as a string. This implementation requires an
- * ActiveX object in IE and special privileges in Firefox. Relative
- * filenames are only supported in IE and will go onto the users'
- * Desktop. You may have to load
- * chrome://global/content/contentAreaUtils.js to disable certain
- * security restrictions in Mozilla for this to work.
- *
- * See known-issues before using this function.
- *
- * Example:
- * (code)
- * var data = mxUtils.open('C:\\temp\\test.txt');
- * mxUtils.alert('Data: '+data);
- * (end)
- *
- * Parameters:
- *
- * filename - String representing the local file name.
- */
- open: function(filename)
- {
- // Requests required privileges in Firefox
- if (mxClient.IS_NS)
- {
- try
- {
- netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
- }
- catch (e)
- {
- mxUtils.alert('Permission to read file denied.');
-
- return '';
- }
-
- var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(filename);
-
- if (!file.exists())
- {
- mxUtils.alert('File not found.');
- return '';
- }
-
- var is = Components.classes['@mozilla.org/network/file-input-stream;1'].createInstance(Components.interfaces.nsIFileInputStream);
- is.init(file,0x01, 00004, null);
-
- var sis = Components.classes['@mozilla.org/scriptableinputstream;1'].createInstance(Components.interfaces.nsIScriptableInputStream);
- sis.init(is);
-
- var output = sis.read(sis.available());
-
- return output;
- }
- else
- {
- var activeXObject = new ActiveXObject('Scripting.FileSystemObject');
-
- var newStream = activeXObject.OpenTextFile(filename, 1);
- var text = newStream.readAll();
- newStream.close();
-
- return text;
- }
- },
-
- /**
- * Function: save
- *
- * Saves the specified content in the given file on the local file system.
- * This implementation requires an ActiveX object in IE and special
- * privileges in Firefox. Relative filenames are only supported in IE and
- * will be loaded from the users' Desktop. You may have to load
- * chrome://global/content/contentAreaUtils.js to disable certain
- * security restrictions in Mozilla for this to work.
- *
- * See known-issues before using this function.
- *
- * Example:
- *
- * (code)
- * var data = 'Hello, World!';
- * mxUtils.save('C:\\test.txt', data);
- * (end)
- *
- * Parameters:
- *
- * filename - String representing the local file name.
- */
- save: function(filename, content)
- {
- if (mxClient.IS_NS)
- {
- try
- {
- netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
- }
- catch (e)
- {
- mxUtils.alert('Permission to write file denied.');
- return;
- }
-
- var file = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
- file.initWithPath(filename);
-
- if (!file.exists())
- {
- file.create(0x00, 0644);
- }
-
- var outputStream = Components.classes['@mozilla.org/network/file-output-stream;1'].createInstance(Components.interfaces.nsIFileOutputStream);
-
- outputStream.init(file, 0x20 | 0x02,00004, null);
- outputStream.write(content, content.length);
- outputStream.flush();
- outputStream.close();
- }
- else
- {
- var fso = new ActiveXObject('Scripting.FileSystemObject');
-
- var file = fso.CreateTextFile(filename, true);
- file.Write(content);
- file.Close();
- }
- },
-
- /**
- * Function: saveAs
- *
- * Saves the specified content by displaying a dialog to save the content
- * as a file on the local filesystem. This implementation does not use an
- * ActiveX object in IE, however, it does require special privileges in
- * Firefox. You may have to load
- * chrome://global/content/contentAreaUtils.js to disable certain
- * security restrictions in Mozilla for this to work.
- *
- * See known-issues before using this function. It is not recommended using
- * this function in production environment as access to the filesystem
- * cannot be guaranteed in Firefox. The following code is used in
- * Firefox to try and enable saving to the filesystem.
- *
- * (code)
- * netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
- * (end)
- *
- * Example:
- *
- * (code)
- * mxUtils.saveAs('Hello, World!');
- * (end)
- *
- * Parameters:
- *
- * content - String representing the file's content.
- */
- saveAs: function(content)
- {
- var iframe = document.createElement('iframe');
- iframe.setAttribute('src', '');
- iframe.style.visibility = 'hidden';
- document.body.appendChild(iframe);
-
- try
- {
- if (mxClient.IS_NS)
- {
- var doc = iframe.contentDocument;
-
- doc.open();
- doc.write(content);
- doc.close();
-
- try
- {
- netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
- // LATER: Remove existing HTML markup in file
- iframe.focus();
- saveDocument(doc);
- }
- catch (e)
- {
- mxUtils.alert('Permission to save document denied.');
- }
- }
- else
- {
- var doc = iframe.contentWindow.document;
- doc.write(content);
- doc.execCommand('SaveAs', false, document.location);
- }
- }
- finally
- {
- document.body.removeChild(iframe);
- }
- },
-
- /**
- * Function: copy
- *
- * Copies the specified content to the local clipboard. This implementation
- * requires special privileges in Firefox. You may have to load
- * chrome://global/content/contentAreaUtils.js to disable certain
- * security restrictions in Mozilla for this to work.
- *
- * Parameters:
- *
- * content - String to be copied to the clipboard.
- */
- copy: function(content)
- {
- if (window.clipboardData)
- {
- window.clipboardData.setData('Text', content);
- }
- else
- {
- netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
-
- var clip = Components.classes['@mozilla.org/widget/clipboard;1']
- .createInstance(Components.interfaces.nsIClipboard);
-
- if (!clip)
- {
- return;
- }
-
- var trans = Components.classes['@mozilla.org/widget/transferable;1']
- .createInstance(Components.interfaces.nsITransferable);
-
- if (!trans)
- {
- return;
- }
-
- trans.addDataFlavor('text/unicode');
- var str = Components.classes['@mozilla.org/supports-string;1']
- .createInstance(Components.interfaces.nsISupportsString);
-
- var copytext=content;
- str.data=copytext;
- trans.setTransferData('text/unicode', str, copytext.length*2);
- var clipid=Components.interfaces.nsIClipboard;
-
- clip.setData(trans,null,clipid.kGlobalClipboard);
- }
- },
-
- /**
- * Function: load
- *
- * Loads the specified URL *synchronously* and returns the <mxXmlRequest>.
- * Throws an exception if the file cannot be loaded. See <mxUtils.get> for
- * an asynchronous implementation.
- *
- * Example:
- *
- * (code)
- * try
- * {
- * var req = mxUtils.load(filename);
- * var root = req.getDocumentElement();
- * // Process XML DOM...
- * }
- * catch (ex)
- * {
- * mxUtils.alert('Cannot load '+filename+': '+ex);
- * }
- * (end)
- *
- * Parameters:
- *
- * url - URL to get the data from.
- */
- load: function(url)
- {
- var req = new mxXmlRequest(url, null, 'GET', false);
- req.send();
-
- return req;
- },
-
- /**
- * Function: get
- *
- * Loads the specified URL *asynchronously* and invokes the given functions
- * depending on the request status. Returns the <mxXmlRequest> in use. Both
- * functions take the <mxXmlRequest> as the only parameter. See
- * <mxUtils.load> for a synchronous implementation.
- *
- * Example:
- *
- * (code)
- * mxUtils.get(url, function(req)
- * {
- * var node = req.getDocumentElement();
- * // Process XML DOM...
- * });
- * (end)
- *
- * So for example, to load a diagram into an existing graph model, the
- * following code is used.
- *
- * (code)
- * mxUtils.get(url, function(req)
- * {
- * var node = req.getDocumentElement();
- * var dec = new mxCodec(node.ownerDocument);
- * dec.decode(node, graph.getModel());
- * });
- * (end)
- *
- * Parameters:
- *
- * url - URL to get the data from.
- * onload - Optional function to execute for a successful response.
- * onerror - Optional function to execute on error.
- */
- get: function(url, onload, onerror)
- {
- return new mxXmlRequest(url, null, 'GET').send(onload, onerror);
- },
-
- /**
- * Function: post
- *
- * Posts the specified params to the given URL *asynchronously* and invokes
- * the given functions depending on the request status. Returns the
- * <mxXmlRequest> in use. Both functions take the <mxXmlRequest> as the
- * only parameter. Make sure to use encodeURIComponent for the parameter
- * values.
- *
- * Example:
- *
- * (code)
- * mxUtils.post(url, 'key=value', function(req)
- * {
- * mxUtils.alert('Ready: '+req.isReady()+' Status: '+req.getStatus());
- * // Process req.getDocumentElement() using DOM API if OK...
- * });
- * (end)
- *
- * Parameters:
- *
- * url - URL to get the data from.
- * params - Parameters for the post request.
- * onload - Optional function to execute for a successful response.
- * onerror - Optional function to execute on error.
- */
- post: function(url, params, onload, onerror)
- {
- return new mxXmlRequest(url, params).send(onload, onerror);
- },
-
- /**
- * Function: submit
- *
- * Submits the given parameters to the specified URL using
- * <mxXmlRequest.simulate> and returns the <mxXmlRequest>.
- * Make sure to use encodeURIComponent for the parameter
- * values.
- *
- * Parameters:
- *
- * url - URL to get the data from.
- * params - Parameters for the form.
- * doc - Document to create the form in.
- * target - Target to send the form result to.
- */
- submit: function(url, params, doc, target)
- {
- return new mxXmlRequest(url, params).simulate(doc, target);
- },
-
- /**
- * Function: loadInto
- *
- * Loads the specified URL *asynchronously* into the specified document,
- * invoking onload after the document has been loaded. This implementation
- * does not use <mxXmlRequest>, but the document.load method.
- *
- * Parameters:
- *
- * url - URL to get the data from.
- * doc - The document to load the URL into.
- * onload - Function to execute when the URL has been loaded.
- */
- loadInto: function(url, doc, onload)
- {
- if (mxClient.IS_IE)
- {
- doc.onreadystatechange = function ()
- {
- if (doc.readyState == 4)
- {
- onload();
- }
- };
- }
- else
- {
- doc.addEventListener('load', onload, false);
- }
-
- doc.load(url);
- },
-
- /**
- * Function: getValue
- *
- * Returns the value for the given key in the given associative array or
- * the given default value if the value is null.
- *
- * Parameters:
- *
- * array - Associative array that contains the value for the key.
- * key - Key whose value should be returned.
- * defaultValue - Value to be returned if the value for the given
- * key is null.
- */
- getValue: function(array, key, defaultValue)
- {
- var value = (array != null) ? array[key] : null;
-
- if (value == null)
- {
- value = defaultValue;
- }
-
- return value;
- },
-
- /**
- * Function: getNumber
- *
- * Returns the numeric value for the given key in the given associative
- * array or the given default value (or 0) if the value is null. The value
- * is converted to a numeric value using the Number function.
- *
- * Parameters:
- *
- * array - Associative array that contains the value for the key.
- * key - Key whose value should be returned.
- * defaultValue - Value to be returned if the value for the given
- * key is null. Default is 0.
- */
- getNumber: function(array, key, defaultValue)
- {
- var value = (array != null) ? array[key] : null;
-
- if (value == null)
- {
- value = defaultValue || 0;
- }
-
- return Number(value);
- },
-
- /**
- * Function: getColor
- *
- * Returns the color value for the given key in the given associative
- * array or the given default value if the value is null. If the value
- * is <mxConstants.NONE> then null is returned.
- *
- * Parameters:
- *
- * array - Associative array that contains the value for the key.
- * key - Key whose value should be returned.
- * defaultValue - Value to be returned if the value for the given
- * key is null. Default is null.
- */
- getColor: function(array, key, defaultValue)
- {
- var value = (array != null) ? array[key] : null;
-
- if (value == null)
- {
- value = defaultValue;
- }
- else if (value == mxConstants.NONE)
- {
- value = null;
- }
-
- return value;
- },
-
- /**
- * Function: clone
- *
- * Recursively clones the specified object ignoring all fieldnames in the
- * given array of transient fields. <mxObjectIdentity.FIELD_NAME> is always
- * ignored by this function.
- *
- * Parameters:
- *
- * obj - Object to be cloned.
- * transients - Optional array of strings representing the fieldname to be
- * ignored.
- * shallow - Optional boolean argument to specify if a shallow clone should
- * be created, that is, one where all object references are not cloned or,
- * in other words, one where only atomic (strings, numbers) values are
- * cloned. Default is false.
- */
- clone: function(obj, transients, shallow)
- {
- shallow = (shallow != null) ? shallow : false;
- var clone = null;
-
- if (obj != null && typeof(obj.constructor) == 'function')
- {
- clone = new obj.constructor();
-
- for (var i in obj)
- {
- if (i != mxObjectIdentity.FIELD_NAME && (transients == null ||
- mxUtils.indexOf(transients, i) < 0))
- {
- if (!shallow && typeof(obj[i]) == 'object')
- {
- clone[i] = mxUtils.clone(obj[i]);
- }
- else
- {
- clone[i] = obj[i];
- }
- }
- }
- }
-
- return clone;
- },
-
- /**
- * Function: equalPoints
- *
- * Compares all mxPoints in the given lists.
- *
- * Parameters:
- *
- * a - Array of <mxPoints> to be compared.
- * b - Array of <mxPoints> to be compared.
- */
- equalPoints: function(a, b)
- {
- if ((a == null && b != null) || (a != null && b == null) ||
- (a != null && b != null && a.length != b.length))
- {
- return false;
- }
- else if (a != null && b != null)
- {
- for (var i = 0; i < a.length; i++)
- {
- if (a[i] == b[i] || (a[i] != null && !a[i].equals(b[i])))
- {
- return false;
- }
- }
- }
-
- return true;
- },
-
- /**
- * Function: equalEntries
- *
- * Compares all entries in the given dictionaries.
- *
- * Parameters:
- *
- * a - <mxRectangle> to be compared.
- * b - <mxRectangle> to be compared.
- */
- equalEntries: function(a, b)
- {
- if ((a == null && b != null) || (a != null && b == null) ||
- (a != null && b != null && a.length != b.length))
- {
- return false;
- }
- else if (a != null && b != null)
- {
- for (var key in a)
- {
- if (a[key] != b[key])
- {
- return false;
- }
- }
- }
-
- return true;
- },
-
- /**
- * Function: extend
- *
- * Assigns a copy of the superclass prototype to the subclass prototype.
- * Note that this does not call the constructor of the superclass at this
- * point, the superclass constructor should be called explicitely in the
- * subclass constructor. Below is an example.
- *
- * (code)
- * MyGraph = function(container, model, renderHint, stylesheet)
- * {
- * mxGraph.call(this, container, model, renderHint, stylesheet);
- * }
- *
- * mxUtils.extend(MyGraph, mxGraph);
- * (end)
- *
- * Parameters:
- *
- * ctor - Constructor of the subclass.
- * superCtor - Constructor of the superclass.
- */
- extend: function(ctor, superCtor)
- {
- var f = function() {};
- f.prototype = superCtor.prototype;
-
- ctor.prototype = new f();
- ctor.prototype.constructor = ctor;
- },
-
- /**
- * Function: toString
- *
- * Returns a textual representation of the specified object.
- *
- * Parameters:
- *
- * obj - Object to return the string representation for.
- */
- toString: function(obj)
- {
- var output = '';
-
- for (var i in obj)
- {
- try
- {
- if (obj[i] == null)
- {
- output += i + ' = [null]\n';
- }
- else if (typeof(obj[i]) == 'function')
- {
- output += i + ' => [Function]\n';
- }
- else if (typeof(obj[i]) == 'object')
- {
- var ctor = mxUtils.getFunctionName(obj[i].constructor);
- output += i + ' => [' + ctor + ']\n';
- }
- else
- {
- output += i + ' = ' + obj[i] + '\n';
- }
- }
- catch (e)
- {
- output += i + '=' + e.message;
- }
- }
-
- return output;
- },
-
- /**
- * Function: toRadians
- *
- * Converts the given degree to radians.
- */
- toRadians: function(deg)
- {
- return Math.PI * deg / 180;
- },
-
- /**
- * Function: arcToCurves
- *
- * Converts the given arc to a series of curves.
- */
- arcToCurves: function(x0, y0, r1, r2, angle, largeArcFlag, sweepFlag, x, y)
- {
- x -= x0;
- y -= y0;
-
- if (r1 === 0 || r2 === 0)
- {
- return result;
- }
-
- var fS = sweepFlag;
- var psai = angle;
- r1 = Math.abs(r1);
- r2 = Math.abs(r2);
- var ctx = -x / 2;
- var cty = -y / 2;
- var cpsi = Math.cos(psai * Math.PI / 180);
- var spsi = Math.sin(psai * Math.PI / 180);
- var rxd = cpsi * ctx + spsi * cty;
- var ryd = -1 * spsi * ctx + cpsi * cty;
- var rxdd = rxd * rxd;
- var rydd = ryd * ryd;
- var r1x = r1 * r1;
- var r2y = r2 * r2;
- var lamda = rxdd / r1x + rydd / r2y;
- var sds;
-
- if (lamda > 1)
- {
- r1 = Math.sqrt(lamda) * r1;
- r2 = Math.sqrt(lamda) * r2;
- sds = 0;
- }
- else
- {
- var seif = 1;
-
- if (largeArcFlag === fS)
- {
- seif = -1;
- }
-
- sds = seif * Math.sqrt((r1x * r2y - r1x * rydd - r2y * rxdd) / (r1x * rydd + r2y * rxdd));
- }
-
- var txd = sds * r1 * ryd / r2;
- var tyd = -1 * sds * r2 * rxd / r1;
- var tx = cpsi * txd - spsi * tyd + x / 2;
- var ty = spsi * txd + cpsi * tyd + y / 2;
- var rad = Math.atan2((ryd - tyd) / r2, (rxd - txd) / r1) - Math.atan2(0, 1);
- var s1 = (rad >= 0) ? rad : 2 * Math.PI + rad;
- rad = Math.atan2((-ryd - tyd) / r2, (-rxd - txd) / r1) - Math.atan2((ryd - tyd) / r2, (rxd - txd) / r1);
- var dr = (rad >= 0) ? rad : 2 * Math.PI + rad;
-
- if (fS == 0 && dr > 0)
- {
- dr -= 2 * Math.PI;
- }
- else if (fS != 0 && dr < 0)
- {
- dr += 2 * Math.PI;
- }
-
- var sse = dr * 2 / Math.PI;
- var seg = Math.ceil(sse < 0 ? -1 * sse : sse);
- var segr = dr / seg;
- var t = 8/3 * Math.sin(segr / 4) * Math.sin(segr / 4) / Math.sin(segr / 2);
- var cpsir1 = cpsi * r1;
- var cpsir2 = cpsi * r2;
- var spsir1 = spsi * r1;
- var spsir2 = spsi * r2;
- var mc = Math.cos(s1);
- var ms = Math.sin(s1);
- var x2 = -t * (cpsir1 * ms + spsir2 * mc);
- var y2 = -t * (spsir1 * ms - cpsir2 * mc);
- var x3 = 0;
- var y3 = 0;
-
- var result = [];
-
- for (var n = 0; n < seg; ++n)
- {
- s1 += segr;
- mc = Math.cos(s1);
- ms = Math.sin(s1);
-
- x3 = cpsir1 * mc - spsir2 * ms + tx;
- y3 = spsir1 * mc + cpsir2 * ms + ty;
- var dx = -t * (cpsir1 * ms + spsir2 * mc);
- var dy = -t * (spsir1 * ms - cpsir2 * mc);
-
- // CurveTo updates x0, y0 so need to restore it
- var index = n * 6;
- result[index] = Number(x2 + x0);
- result[index + 1] = Number(y2 + y0);
- result[index + 2] = Number(x3 - dx + x0);
- result[index + 3] = Number(y3 - dy + y0);
- result[index + 4] = Number(x3 + x0);
- result[index + 5] = Number(y3 + y0);
-
- x2 = x3 + dx;
- y2 = y3 + dy;
- }
-
- return result;
- },
-
- /**
- * Function: getBoundingBox
- *
- * Returns the bounding box for the rotated rectangle.
- */
- getBoundingBox: function(rect, rotation)
- {
- var result = null;
-
- if (rect != null && rotation != null && rotation != 0)
- {
- var rad = mxUtils.toRadians(rotation);
- var cos = Math.cos(rad);
- var sin = Math.sin(rad);
-
- var cx = new mxPoint(
- rect.x + rect.width / 2,
- rect.y + rect.height / 2);
-
- var p1 = new mxPoint(rect.x, rect.y);
- var p2 = new mxPoint(rect.x + rect.width, rect.y);
- var p3 = new mxPoint(p2.x, rect.y + rect.height);
- var p4 = new mxPoint(rect.x, p3.y);
-
- p1 = mxUtils.getRotatedPoint(p1, cos, sin, cx);
- p2 = mxUtils.getRotatedPoint(p2, cos, sin, cx);
- p3 = mxUtils.getRotatedPoint(p3, cos, sin, cx);
- p4 = mxUtils.getRotatedPoint(p4, cos, sin, cx);
-
- result = new mxRectangle(p1.x, p1.y, 0, 0);
- result.add(new mxRectangle(p2.x, p2.y, 0, 0));
- result.add(new mxRectangle(p3.x, p3.y, 0, 0));
- result.add(new mxRectangle(p4.x, p4.y, 0, 0));
- }
-
- return result;
- },
-
- /**
- * Function: getRotatedPoint
- *
- * Rotates the given point by the given cos and sin.
- */
- getRotatedPoint: function(pt, cos, sin, c)
- {
- c = (c != null) ? c : new mxPoint();
- var x = pt.x - c.x;
- var y = pt.y - c.y;
-
- var x1 = x * cos - y * sin;
- var y1 = y * cos + x * sin;
-
- return new mxPoint(x1 + c.x, y1 + c.y);
- },
-
- /**
- * Returns an integer mask of the port constraints of the given map
- * @param dict the style map to determine the port constraints for
- * @param defaultValue Default value to return if the key is undefined.
- * @return the mask of port constraint directions
- *
- * Parameters:
- *
- * terminal - <mxCelState> that represents the terminal.
- * edge - <mxCellState> that represents the edge.
- * source - Boolean that specifies if the terminal is the source terminal.
- * defaultValue - Default value to be returned.
- */
- getPortConstraints: function(terminal, edge, source, defaultValue)
- {
- var value = mxUtils.getValue(terminal.style, mxConstants.STYLE_PORT_CONSTRAINT, null);
-
- if (value == null)
- {
- return defaultValue;
- }
- else
- {
- var directions = value.toString();
- var returnValue = mxConstants.DIRECTION_MASK_NONE;
-
- if (directions.indexOf(mxConstants.DIRECTION_NORTH) >= 0)
- {
- returnValue |= mxConstants.DIRECTION_MASK_NORTH;
- }
- if (directions.indexOf(mxConstants.DIRECTION_WEST) >= 0)
- {
- returnValue |= mxConstants.DIRECTION_MASK_WEST;
- }
- if (directions.indexOf(mxConstants.DIRECTION_SOUTH) >= 0)
- {
- returnValue |= mxConstants.DIRECTION_MASK_SOUTH;
- }
- if (directions.indexOf(mxConstants.DIRECTION_EAST) >= 0)
- {
- returnValue |= mxConstants.DIRECTION_MASK_EAST;
- }
-
- return returnValue;
- }
- },
-
- /**
- * Function: reversePortConstraints
- *
- * Reverse the port constraint bitmask. For example, north | east
- * becomes south | west
- */
- reversePortConstraints: function(constraint)
- {
- var result = 0;
-
- result = (constraint & mxConstants.DIRECTION_MASK_WEST) << 3;
- result |= (constraint & mxConstants.DIRECTION_MASK_NORTH) << 1;
- result |= (constraint & mxConstants.DIRECTION_MASK_SOUTH) >> 1;
- result |= (constraint & mxConstants.DIRECTION_MASK_EAST) >> 3;
-
- return result;
- },
-
- /**
- * Function: findNearestSegment
- *
- * Finds the index of the nearest segment on the given cell state for
- * the specified coordinate pair.
- */
- findNearestSegment: function(state, x, y)
- {
- var index = -1;
-
- if (state.absolutePoints.length > 0)
- {
- var last = state.absolutePoints[0];
- var min = null;
-
- for (var i = 1; i < state.absolutePoints.length; i++)
- {
- var current = state.absolutePoints[i];
- var dist = mxUtils.ptSegDistSq(last.x, last.y,
- current.x, current.y, x, y);
-
- if (min == null || dist < min)
- {
- min = dist;
- index = i - 1;
- }
-
- last = current;
- }
- }
-
- return index;
- },
-
- /**
- * Function: rectangleIntersectsSegment
- *
- * Returns true if the given rectangle intersects the given segment.
- *
- * Parameters:
- *
- * bounds - <mxRectangle> that represents the rectangle.
- * p1 - <mxPoint> that represents the first point of the segment.
- * p2 - <mxPoint> that represents the second point of the segment.
- */
- rectangleIntersectsSegment: function(bounds, p1, p2)
- {
- var top = bounds.y;
- var left = bounds.x;
- var bottom = top + bounds.height;
- var right = left + bounds.width;
-
- // Find min and max X for the segment
- var minX = p1.x;
- var maxX = p2.x;
-
- if (p1.x > p2.x)
- {
- minX = p2.x;
- maxX = p1.x;
- }
-
- // Find the intersection of the segment's and rectangle's x-projections
- if (maxX > right)
- {
- maxX = right;
- }
-
- if (minX < left)
- {
- minX = left;
- }
-
- if (minX > maxX) // If their projections do not intersect return false
- {
- return false;
- }
-
- // Find corresponding min and max Y for min and max X we found before
- var minY = p1.y;
- var maxY = p2.y;
- var dx = p2.x - p1.x;
-
- if (Math.abs(dx) > 0.0000001)
- {
- var a = (p2.y - p1.y) / dx;
- var b = p1.y - a * p1.x;
- minY = a * minX + b;
- maxY = a * maxX + b;
- }
-
- if (minY > maxY)
- {
- var tmp = maxY;
- maxY = minY;
- minY = tmp;
- }
-
- // Find the intersection of the segment's and rectangle's y-projections
- if (maxY > bottom)
- {
- maxY = bottom;
- }
-
- if (minY < top)
- {
- minY = top;
- }
-
- if (minY > maxY) // If Y-projections do not intersect return false
- {
- return false;
- }
-
- return true;
- },
-
- /**
- * Function: contains
- *
- * Returns true if the specified point (x, y) is contained in the given rectangle.
- *
- * Parameters:
- *
- * bounds - <mxRectangle> that represents the area.
- * x - X-coordinate of the point.
- * y - Y-coordinate of the point.
- */
- contains: function(bounds, x, y)
- {
- return (bounds.x <= x && bounds.x + bounds.width >= x &&
- bounds.y <= y && bounds.y + bounds.height >= y);
- },
-
- /**
- * Function: intersects
- *
- * Returns true if the two rectangles intersect.
- *
- * Parameters:
- *
- * a - <mxRectangle> to be checked for intersection.
- * b - <mxRectangle> to be checked for intersection.
- */
- intersects: function(a, b)
- {
- var tw = a.width;
- var th = a.height;
- var rw = b.width;
- var rh = b.height;
-
- if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0)
- {
- return false;
- }
-
- var tx = a.x;
- var ty = a.y;
- var rx = b.x;
- var ry = b.y;
-
- rw += rx;
- rh += ry;
- tw += tx;
- th += ty;
-
- return ((rw < rx || rw > tx) &&
- (rh < ry || rh > ty) &&
- (tw < tx || tw > rx) &&
- (th < ty || th > ry));
- },
-
- /**
- * Function: intersects
- *
- * Returns true if the two rectangles intersect.
- *
- * Parameters:
- *
- * a - <mxRectangle> to be checked for intersection.
- * b - <mxRectangle> to be checked for intersection.
- */
- intersectsHotspot: function(state, x, y, hotspot, min, max)
- {
- hotspot = (hotspot != null) ? hotspot : 1;
- min = (min != null) ? min : 0;
- max = (max != null) ? max : 0;
-
- if (hotspot > 0)
- {
- var cx = state.getCenterX();
- var cy = state.getCenterY();
- var w = state.width;
- var h = state.height;
-
- var start = mxUtils.getValue(state.style, mxConstants.STYLE_STARTSIZE) * state.view.scale;
-
- if (start > 0)
- {
- if (mxUtils.getValue(state.style,
- mxConstants.STYLE_HORIZONTAL, true))
- {
- cy = state.y + start / 2;
- h = start;
- }
- else
- {
- cx = state.x + start / 2;
- w = start;
- }
- }
-
- w = Math.max(min, w * hotspot);
- h = Math.max(min, h * hotspot);
-
- if (max > 0)
- {
- w = Math.min(w, max);
- h = Math.min(h, max);
- }
-
- var rect = new mxRectangle(cx - w / 2, cy - h / 2, w, h);
-
- return mxUtils.contains(rect, x, y);
- }
-
- return true;
- },
-
- /**
- * Function: getOffset
- *
- * Returns the offset for the specified container as an <mxPoint>. The
- * offset is the distance from the top left corner of the container to the
- * top left corner of the document.
- *
- * Parameters:
- *
- * container - DOM node to return the offset for.
- * scollOffset - Optional boolean to add the scroll offset of the document.
- * Default is false.
- */
- getOffset: function(container, scrollOffset)
- {
- var offsetLeft = 0;
- var offsetTop = 0;
-
- if (scrollOffset != null && scrollOffset)
- {
- var b = document.body;
- var d = document.documentElement;
- offsetLeft += (b.scrollLeft || d.scrollLeft);
- offsetTop += (b.scrollTop || d.scrollTop);
- }
-
- while (container.offsetParent)
- {
- offsetLeft += container.offsetLeft;
- offsetTop += container.offsetTop;
-
- container = container.offsetParent;
- }
-
- return new mxPoint(offsetLeft, offsetTop);
- },
-
- /**
- * Function: getScrollOrigin
- *
- * Returns the top, left corner of the viewrect as an <mxPoint>.
- */
- getScrollOrigin: function(node)
- {
- var b = document.body;
- var d = document.documentElement;
- var sl = (b.scrollLeft || d.scrollLeft);
- var st = (b.scrollTop || d.scrollTop);
-
- var result = new mxPoint(sl, st);
-
- while (node != null && node != b && node != d)
- {
- if (!isNaN(node.scrollLeft) && !isNaN(node.scrollTop))
- {
- result.x += node.scrollLeft;
- result.y += node.scrollTop;
- }
-
- node = node.parentNode;
- }
-
- return result;
- },
-
- /**
- * Function: convertPoint
- *
- * Converts the specified point (x, y) using the offset of the specified
- * container and returns a new <mxPoint> with the result.
- *
- * Parameters:
- *
- * container - DOM node to use for the offset.
- * x - X-coordinate of the point to be converted.
- * y - Y-coordinate of the point to be converted.
- */
- convertPoint: function(container, x, y)
- {
- var origin = mxUtils.getScrollOrigin(container);
- var offset = mxUtils.getOffset(container);
-
- offset.x -= origin.x;
- offset.y -= origin.y;
-
- return new mxPoint(x - offset.x, y - offset.y);
- },
-
- /**
- * Function: ltrim
- *
- * Strips all whitespaces from the beginning of the string.
- * Without the second parameter, Javascript function will trim these
- * characters:
- *
- * - " " (ASCII 32 (0x20)), an ordinary space
- * - "\t" (ASCII 9 (0x09)), a tab
- * - "\n" (ASCII 10 (0x0A)), a new line (line feed)
- * - "\r" (ASCII 13 (0x0D)), a carriage return
- * - "\0" (ASCII 0 (0x00)), the NUL-byte
- * - "\x0B" (ASCII 11 (0x0B)), a vertical tab
- */
- ltrim: function(str, chars)
- {
- chars = chars || "\\s";
-
- return str.replace(new RegExp("^[" + chars + "]+", "g"), "");
- },
-
- /**
- * Function: rtrim
- *
- * Strips all whitespaces from the end of the string.
- * Without the second parameter, Javascript function will trim these
- * characters:
- *
- * - " " (ASCII 32 (0x20)), an ordinary space
- * - "\t" (ASCII 9 (0x09)), a tab
- * - "\n" (ASCII 10 (0x0A)), a new line (line feed)
- * - "\r" (ASCII 13 (0x0D)), a carriage return
- * - "\0" (ASCII 0 (0x00)), the NUL-byte
- * - "\x0B" (ASCII 11 (0x0B)), a vertical tab
- */
- rtrim: function(str, chars)
- {
- chars = chars || "\\s";
-
- return str.replace(new RegExp("[" + chars + "]+$", "g"), "");
- },
-
- /**
- * Function: trim
- *
- * Strips all whitespaces from both end of the string.
- * Without the second parameter, Javascript function will trim these
- * characters:
- *
- * - " " (ASCII 32 (0x20)), an ordinary space
- * - "\t" (ASCII 9 (0x09)), a tab
- * - "\n" (ASCII 10 (0x0A)), a new line (line feed)
- * - "\r" (ASCII 13 (0x0D)), a carriage return
- * - "\0" (ASCII 0 (0x00)), the NUL-byte
- * - "\x0B" (ASCII 11 (0x0B)), a vertical tab
- */
- trim: function(str, chars)
- {
- return mxUtils.ltrim(mxUtils.rtrim(str, chars), chars);
- },
-
- /**
- * Function: isNumeric
- *
- * Returns true if the specified value is numeric, that is, if it is not
- * null, not an empty string, not a HEX number and isNaN returns false.
- *
- * Parameters:
- *
- * str - String representing the possibly numeric value.
- */
- isNumeric: function(str)
- {
- return str != null && (str.length == null || (str.length > 0 &&
- str.indexOf('0x') < 0) && str.indexOf('0X') < 0) && !isNaN(str);
- },
-
- /**
- * Function: mod
- *
- * Returns the remainder of division of n by m. You should use this instead
- * of the built-in operation as the built-in operation does not properly
- * handle negative numbers.
- */
- mod: function(n, m)
- {
- return ((n % m) + m) % m;
- },
-
- /**
- * Function: intersection
- *
- * Returns the intersection of two lines as an <mxPoint>.
- *
- * Parameters:
- *
- * x0 - X-coordinate of the first line's startpoint.
- * y0 - X-coordinate of the first line's startpoint.
- * x1 - X-coordinate of the first line's endpoint.
- * y1 - Y-coordinate of the first line's endpoint.
- * x2 - X-coordinate of the second line's startpoint.
- * y2 - Y-coordinate of the second line's startpoint.
- * x3 - X-coordinate of the second line's endpoint.
- * y3 - Y-coordinate of the second line's endpoint.
- */
- intersection: function (x0, y0, x1, y1, x2, y2, x3, y3)
- {
- var denom = ((y3 - y2)*(x1 - x0)) - ((x3 - x2)*(y1 - y0));
- var nume_a = ((x3 - x2)*(y0 - y2)) - ((y3 - y2)*(x0 - x2));
- var nume_b = ((x1 - x0)*(y0 - y2)) - ((y1 - y0)*(x0 - x2));
-
- var ua = nume_a / denom;
- var ub = nume_b / denom;
-
- if(ua >= 0.0 && ua <= 1.0 && ub >= 0.0 && ub <= 1.0)
- {
- // Get the intersection point
- var intersectionX = x0 + ua*(x1 - x0);
- var intersectionY = y0 + ua*(y1 - y0);
-
- return new mxPoint(intersectionX, intersectionY);
- }
-
- // No intersection
- return null;
- },
-
- /**
- * Function: ptSeqDistSq
- *
- * Returns the square distance between a segment and a point.
- *
- * Parameters:
- *
- * x1 - X-coordinate of the startpoint of the segment.
- * y1 - Y-coordinate of the startpoint of the segment.
- * x2 - X-coordinate of the endpoint of the segment.
- * y2 - Y-coordinate of the endpoint of the segment.
- * px - X-coordinate of the point.
- * py - Y-coordinate of the point.
- */
- ptSegDistSq: function(x1, y1, x2, y2, px, py)
- {
- x2 -= x1;
- y2 -= y1;
-
- px -= x1;
- py -= y1;
-
- var dotprod = px * x2 + py * y2;
- var projlenSq;
-
- if (dotprod <= 0.0)
- {
- projlenSq = 0.0;
- }
- else
- {
- px = x2 - px;
- py = y2 - py;
- dotprod = px * x2 + py * y2;
-
- if (dotprod <= 0.0)
- {
- projlenSq = 0.0;
- }
- else
- {
- projlenSq = dotprod * dotprod / (x2 * x2 + y2 * y2);
- }
- }
-
- var lenSq = px * px + py * py - projlenSq;
-
- if (lenSq < 0)
- {
- lenSq = 0;
- }
-
- return lenSq;
- },
-
- /**
- * Function: relativeCcw
- *
- * Returns 1 if the given point on the right side of the segment, 0 if its
- * on the segment, and -1 if the point is on the left side of the segment.
- *
- * Parameters:
- *
- * x1 - X-coordinate of the startpoint of the segment.
- * y1 - Y-coordinate of the startpoint of the segment.
- * x2 - X-coordinate of the endpoint of the segment.
- * y2 - Y-coordinate of the endpoint of the segment.
- * px - X-coordinate of the point.
- * py - Y-coordinate of the point.
- */
- relativeCcw: function(x1, y1, x2, y2, px, py)
- {
- x2 -= x1;
- y2 -= y1;
- px -= x1;
- py -= y1;
- var ccw = px * y2 - py * x2;
-
- if (ccw == 0.0)
- {
- ccw = px * x2 + py * y2;
-
- if (ccw > 0.0)
- {
- px -= x2;
- py -= y2;
- ccw = px * x2 + py * y2;
-
- if (ccw < 0.0)
- {
- ccw = 0.0;
- }
- }
- }
-
- return (ccw < 0.0) ? -1 : ((ccw > 0.0) ? 1 : 0);
- },
-
- /**
- * Function: animateChanges
- *
- * See <mxEffects.animateChanges>. This is for backwards compatibility and
- * will be removed later.
- */
- animateChanges: function(graph, changes)
- {
- // LATER: Deprecated, remove this function
- mxEffects.animateChanges.apply(this, arguments);
- },
-
- /**
- * Function: cascadeOpacity
- *
- * See <mxEffects.cascadeOpacity>. This is for backwards compatibility and
- * will be removed later.
- */
- cascadeOpacity: function(graph, cell, opacity)
- {
- mxEffects.cascadeOpacity.apply(this, arguments);
- },
-
- /**
- * Function: fadeOut
- *
- * See <mxEffects.fadeOut>. This is for backwards compatibility and
- * will be removed later.
- */
- fadeOut: function(node, from, remove, step, delay, isEnabled)
- {
- mxEffects.fadeOut.apply(this, arguments);
- },
-
- /**
- * Function: setOpacity
- *
- * Sets the opacity of the specified DOM node to the given value in %.
- *
- * Parameters:
- *
- * node - DOM node to set the opacity for.
- * value - Opacity in %. Possible values are between 0 and 100.
- */
- setOpacity: function(node, value)
- {
- if (mxUtils.isVml(node))
- {
- if (value >= 100)
- {
- node.style.filter = null;
- }
- else
- {
- // TODO: Why is the division by 5 needed in VML?
- node.style.filter = 'alpha(opacity=' + (value/5) + ')';
- }
- }
- else if (mxClient.IS_IE && (typeof(document.documentMode) === 'undefined' || document.documentMode < 9))
- {
- if (value >= 100)
- {
- node.style.filter = null;
- }
- else
- {
- node.style.filter = 'alpha(opacity=' + value + ')';
- }
- }
- else
- {
- node.style.opacity = (value / 100);
- }
- },
-
- /**
- * Function: createImage
- *
- * Creates and returns an image (IMG node) or VML image (v:image) in IE6 in
- * quirs mode.
- *
- * Parameters:
- *
- * src - URL that points to the image to be displayed.
- */
- createImage: function(src)
- {
- var imageNode = null;
-
- if (mxClient.IS_IE6 && document.compatMode != 'CSS1Compat')
- {
- imageNode = document.createElement('v:image');
- imageNode.setAttribute('src', src);
- imageNode.style.borderStyle = 'none';
- }
- else
- {
- imageNode = document.createElement('img');
- imageNode.setAttribute('src', src);
- imageNode.setAttribute('border', '0');
- }
-
- return imageNode;
- },
-
- /**
- * Function: sortCells
- *
- * Sorts the given cells according to the order in the cell hierarchy.
- * Ascending is optional and defaults to true.
- */
- sortCells: function(cells, ascending)
- {
- ascending = (ascending != null) ? ascending : true;
- var lookup = new mxDictionary();
- cells.sort(function(o1, o2)
- {
- var p1 = lookup.get(o1);
-
- if (p1 == null)
- {
- p1 = mxCellPath.create(o1).split(mxCellPath.PATH_SEPARATOR);
- lookup.put(o1, p1);
- }
-
- var p2 = lookup.get(o2);
-
- if (p2 == null)
- {
- p2 = mxCellPath.create(o2).split(mxCellPath.PATH_SEPARATOR);
- lookup.put(o2, p2);
- }
-
- var comp = mxCellPath.compare(p1, p2);
-
- return (comp == 0) ? 0 : (((comp > 0) == ascending) ? 1 : -1);
- });
-
- return cells;
- },
-
- /**
- * Function: getStylename
- *
- * Returns the stylename in a style of the form [(stylename|key=value);] or
- * an empty string if the given style does not contain a stylename.
- *
- * Parameters:
- *
- * style - String of the form [(stylename|key=value);].
- */
- getStylename: function(style)
- {
- if (style != null)
- {
- var pairs = style.split(';');
- var stylename = pairs[0];
-
- if (stylename.indexOf('=') < 0)
- {
- return stylename;
- }
- }
-
- return '';
- },
-
- /**
- * Function: getStylenames
- *
- * Returns the stylenames in a style of the form [(stylename|key=value);]
- * or an empty array if the given style does not contain any stylenames.
- *
- * Parameters:
- *
- * style - String of the form [(stylename|key=value);].
- */
- getStylenames: function(style)
- {
- var result = [];
-
- if (style != null)
- {
- var pairs = style.split(';');
-
- for (var i = 0; i < pairs.length; i++)
- {
- if (pairs[i].indexOf('=') < 0)
- {
- result.push(pairs[i]);
- }
- }
- }
-
- return result;
- },
-
- /**
- * Function: indexOfStylename
- *
- * Returns the index of the given stylename in the given style. This
- * returns -1 if the given stylename does not occur (as a stylename) in the
- * given style, otherwise it returns the index of the first character.
- */
- indexOfStylename: function(style, stylename)
- {
- if (style != null && stylename != null)
- {
- var tokens = style.split(';');
- var pos = 0;
-
- for (var i = 0; i < tokens.length; i++)
- {
- if (tokens[i] == stylename)
- {
- return pos;
- }
-
- pos += tokens[i].length + 1;
- }
- }
-
- return -1;
- },
-
- /**
- * Function: addStylename
- *
- * Adds the specified stylename to the given style if it does not already
- * contain the stylename.
- */
- addStylename: function(style, stylename)
- {
- if (mxUtils.indexOfStylename(style, stylename) < 0)
- {
- if (style == null)
- {
- style = '';
- }
- else if (style.length > 0 && style.charAt(style.length - 1) != ';')
- {
- style += ';';
- }
-
- style += stylename;
- }
-
- return style;
- },
-
- /**
- * Function: removeStylename
- *
- * Removes all occurrences of the specified stylename in the given style
- * and returns the updated style. Trailing semicolons are not preserved.
- */
- removeStylename: function(style, stylename)
- {
- var result = [];
-
- if (style != null)
- {
- var tokens = style.split(';');
-
- for (var i = 0; i < tokens.length; i++)
- {
- if (tokens[i] != stylename)
- {
- result.push(tokens[i]);
- }
- }
- }
-
- return result.join(';');
- },
-
- /**
- * Function: removeAllStylenames
- *
- * Removes all stylenames from the given style and returns the updated
- * style.
- */
- removeAllStylenames: function(style)
- {
- var result = [];
-
- if (style != null)
- {
- var tokens = style.split(';');
-
- for (var i = 0; i < tokens.length; i++)
- {
- // Keeps the key, value assignments
- if (tokens[i].indexOf('=') >= 0)
- {
- result.push(tokens[i]);
- }
- }
- }
-
- return result.join(';');
- },
-
- /**
- * Function: setCellStyles
- *
- * Assigns the value for the given key in the styles of the given cells, or
- * removes the key from the styles if the value is null.
- *
- * Parameters:
- *
- * model - <mxGraphModel> to execute the transaction in.
- * cells - Array of <mxCells> to be updated.
- * key - Key of the style to be changed.
- * value - New value for the given key.
- */
- setCellStyles: function(model, cells, key, value)
- {
- if (cells != null && cells.length > 0)
- {
- model.beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- if (cells[i] != null)
- {
- var style = mxUtils.setStyle(
- model.getStyle(cells[i]),
- key, value);
- model.setStyle(cells[i], style);
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
- }
- },
-
- /**
- * Function: setStyle
- *
- * Adds or removes the given key, value pair to the style and returns the
- * new style. If value is null or zero length then the key is removed from
- * the style. This is for cell styles, not for CSS styles.
- *
- * Parameters:
- *
- * style - String of the form [(stylename|key=value);].
- * key - Key of the style to be changed.
- * value - New value for the given key.
- */
- setStyle: function(style, key, value)
- {
- var isValue = value != null && (typeof(value.length) == 'undefined' || value.length > 0);
-
- if (style == null || style.length == 0)
- {
- if (isValue)
- {
- style = key+'='+value;
- }
- }
- else
- {
- var index = style.indexOf(key+'=');
-
- if (index < 0)
- {
- if (isValue)
- {
- var sep = (style.charAt(style.length-1) == ';') ? '' : ';';
- style = style + sep + key+'='+value;
- }
- }
- else
- {
- var tmp = (isValue) ? (key + '=' + value) : '';
- var cont = style.indexOf(';', index);
-
- if (!isValue)
- {
- cont++;
- }
-
- style = style.substring(0, index) + tmp +
- ((cont > index) ? style.substring(cont) : '');
- }
- }
-
- return style;
- },
-
- /**
- * Function: setCellStyleFlags
- *
- * Sets or toggles the flag bit for the given key in the cell's styles.
- * If value is null then the flag is toggled.
- *
- * Example:
- *
- * (code)
- * var cells = graph.getSelectionCells();
- * mxUtils.setCellStyleFlags(graph.model,
- * cells,
- * mxConstants.STYLE_FONTSTYLE,
- * mxConstants.FONT_BOLD);
- * (end)
- *
- * Toggles the bold font style.
- *
- * Parameters:
- *
- * model - <mxGraphModel> that contains the cells.
- * cells - Array of <mxCells> to change the style for.
- * key - Key of the style to be changed.
- * flag - Integer for the bit to be changed.
- * value - Optional boolean value for the flag.
- */
- setCellStyleFlags: function(model, cells, key, flag, value)
- {
- if (cells != null && cells.length > 0)
- {
- model.beginUpdate();
- try
- {
- for (var i = 0; i < cells.length; i++)
- {
- if (cells[i] != null)
- {
- var style = mxUtils.setStyleFlag(
- model.getStyle(cells[i]),
- key, flag, value);
- model.setStyle(cells[i], style);
- }
- }
- }
- finally
- {
- model.endUpdate();
- }
- }
- },
-
- /**
- * Function: setStyleFlag
- *
- * Sets or removes the given key from the specified style and returns the
- * new style. If value is null then the flag is toggled.
- *
- * Parameters:
- *
- * style - String of the form [(stylename|key=value);].
- * key - Key of the style to be changed.
- * flag - Integer for the bit to be changed.
- * value - Optional boolean value for the given flag.
- */
- setStyleFlag: function(style, key, flag, value)
- {
- if (style == null || style.length == 0)
- {
- if (value || value == null)
- {
- style = key+'='+flag;
- }
- else
- {
- style = key+'=0';
- }
- }
- else
- {
- var index = style.indexOf(key+'=');
-
- if (index < 0)
- {
- var sep = (style.charAt(style.length-1) == ';') ? '' : ';';
-
- if (value || value == null)
- {
- style = style + sep + key + '=' + flag;
- }
- else
- {
- style = style + sep + key + '=0';
- }
- }
- else
- {
- var cont = style.indexOf(';', index);
- var tmp = '';
-
- if (cont < 0)
- {
- tmp = style.substring(index+key.length+1);
- }
- else
- {
- tmp = style.substring(index+key.length+1, cont);
- }
-
- if (value == null)
- {
- tmp = parseInt(tmp) ^ flag;
- }
- else if (value)
- {
- tmp = parseInt(tmp) | flag;
- }
- else
- {
- tmp = parseInt(tmp) & ~flag;
- }
-
- style = style.substring(0, index) + key + '=' + tmp +
- ((cont >= 0) ? style.substring(cont) : '');
- }
- }
-
- return style;
- },
-
- /**
- * Function: getSizeForString
- *
- * Returns an <mxRectangle> with the size (width and height in pixels) of
- * the given string. The string may contain HTML markup. Newlines should be
- * converted to <br> before calling this method.
- *
- * Example:
- *
- * (code)
- * var label = graph.getLabel(cell).replace(/\n/g, "<br>");
- * var size = graph.getSizeForString(label);
- * (end)
- *
- * Parameters:
- *
- * text - String whose size should be returned.
- * fontSize - Integer that specifies the font size in pixels. Default is
- * <mxConstants.DEFAULT_FONTSIZE>.
- * fontFamily - String that specifies the name of the font family. Default
- * is <mxConstants.DEFAULT_FONTFAMILY>.
- */
- getSizeForString: function(text, fontSize, fontFamily)
- {
- var div = document.createElement('div');
-
- // Sets the font size and family if non-default
- div.style.fontSize = (fontSize || mxConstants.DEFAULT_FONTSIZE) + 'px';
- div.style.fontFamily = fontFamily || mxConstants.DEFAULT_FONTFAMILY;
-
- // Disables block layout and outside wrapping and hides the div
- div.style.position = 'absolute';
- div.style.display = 'inline';
- div.style.visibility = 'hidden';
-
- // Adds the text and inserts into DOM for updating of size
- div.innerHTML = text;
- document.body.appendChild(div);
-
- // Gets the size and removes from DOM
- var size = new mxRectangle(0, 0, div.offsetWidth, div.offsetHeight);
- document.body.removeChild(div);
-
- return size;
- },
-
- /**
- * Function: getViewXml
- */
- getViewXml: function(graph, scale, cells, x0, y0)
- {
- x0 = (x0 != null) ? x0 : 0;
- y0 = (y0 != null) ? y0 : 0;
- scale = (scale != null) ? scale : 1;
-
- if (cells == null)
- {
- var model = graph.getModel();
- cells = [model.getRoot()];
- }
-
- var view = graph.getView();
- var result = null;
-
- // Disables events on the view
- var eventsEnabled = view.isEventsEnabled();
- view.setEventsEnabled(false);
-
- // Workaround for label bounds not taken into account for image export.
- // Creates a temporary draw pane which is used for rendering the text.
- // Text rendering is required for finding the bounds of the labels.
- var drawPane = view.drawPane;
- var overlayPane = view.overlayPane;
-
- if (graph.dialect == mxConstants.DIALECT_SVG)
- {
- view.drawPane = document.createElementNS(mxConstants.NS_SVG, 'g');
- view.canvas.appendChild(view.drawPane);
-
- // Redirects cell overlays into temporary container
- view.overlayPane = document.createElementNS(mxConstants.NS_SVG, 'g');
- view.canvas.appendChild(view.overlayPane);
- }
- else
- {
- view.drawPane = view.drawPane.cloneNode(false);
- view.canvas.appendChild(view.drawPane);
-
- // Redirects cell overlays into temporary container
- view.overlayPane = view.overlayPane.cloneNode(false);
- view.canvas.appendChild(view.overlayPane);
- }
-
- // Resets the translation
- var translate = view.getTranslate();
- view.translate = new mxPoint(x0, y0);
-
- // Creates the temporary cell states in the view
- var temp = new mxTemporaryCellStates(graph.getView(), scale, cells);
-
- try
- {
- var enc = new mxCodec();
- result = enc.encode(graph.getView());
- }
- finally
- {
- temp.destroy();
- view.translate = translate;
- view.canvas.removeChild(view.drawPane);
- view.canvas.removeChild(view.overlayPane);
- view.drawPane = drawPane;
- view.overlayPane = overlayPane;
- view.setEventsEnabled(eventsEnabled);
- }
-
- return result;
- },
-
- /**
- * Function: getScaleForPageCount
- *
- * Returns the scale to be used for printing the graph with the given
- * bounds across the specifies number of pages with the given format. The
- * scale is always computed such that it given the given amount or fewer
- * pages in the print output. See <mxPrintPreview> for an example.
- *
- * Parameters:
- *
- * pageCount - Specifies the number of pages in the print output.
- * graph - <mxGraph> that should be printed.
- * pageFormat - Optional <mxRectangle> that specifies the page format.
- * Default is <mxConstants.PAGE_FORMAT_A4_PORTRAIT>.
- * border - The border along each side of every page.
- */
- getScaleForPageCount: function(pageCount, graph, pageFormat, border)
- {
- if (pageCount < 1)
- {
- // We can't work with less than 1 page, return no scale
- // change
- return 1;
- }
-
- pageFormat = (pageFormat != null) ? pageFormat : mxConstants.PAGE_FORMAT_A4_PORTRAIT;
- border = (border != null) ? border : 0;
-
- var availablePageWidth = pageFormat.width - (border * 2);
- var availablePageHeight = pageFormat.height - (border * 2);
-
- // Work out the number of pages required if the
- // graph is not scaled.
- var graphBounds = graph.getGraphBounds().clone();
- var sc = graph.getView().getScale();
- graphBounds.width /= sc;
- graphBounds.height /= sc;
- var graphWidth = graphBounds.width;
- var graphHeight = graphBounds.height;
-
- var scale = 1;
-
- // The ratio of the width/height for each printer page
- var pageFormatAspectRatio = availablePageWidth / availablePageHeight;
- // The ratio of the width/height for the graph to be printer
- var graphAspectRatio = graphWidth / graphHeight;
-
- // The ratio of horizontal pages / vertical pages for this
- // graph to maintain its aspect ratio on this page format
- var pagesAspectRatio = graphAspectRatio / pageFormatAspectRatio;
-
- // Factor the square root of the page count up and down
- // by the pages aspect ratio to obtain a horizontal and
- // vertical page count that adds up to the page count
- // and has the correct aspect ratio
- var pageRoot = Math.sqrt(pageCount);
- var pagesAspectRatioSqrt = Math.sqrt(pagesAspectRatio);
- var numRowPages = pageRoot * pagesAspectRatioSqrt;
- var numColumnPages = pageRoot / pagesAspectRatioSqrt;
-
- // These value are rarely more than 2 rounding downs away from
- // a total that meets the page count. In cases of one being less
- // than 1 page, the other value can be too high and take more iterations
- // In this case, just change that value to be the page count, since
- // we know the other value is 1
- if (numRowPages < 1 && numColumnPages > pageCount)
- {
- var scaleChange = numColumnPages / pageCount;
- numColumnPages = pageCount;
- numRowPages /= scaleChange;
- }
-
- if (numColumnPages < 1 && numRowPages > pageCount)
- {
- var scaleChange = numRowPages / pageCount;
- numRowPages = pageCount;
- numColumnPages /= scaleChange;
- }
-
- var currentTotalPages = Math.ceil(numRowPages) * Math.ceil(numColumnPages);
-
- var numLoops = 0;
-
- // Iterate through while the rounded up number of pages comes to
- // a total greater than the required number
- while (currentTotalPages > pageCount)
- {
- // Round down the page count (rows or columns) that is
- // closest to its next integer down in percentage terms.
- // i.e. Reduce the page total by reducing the total
- // page area by the least possible amount
-
- var roundRowDownProportion = Math.floor(numRowPages) / numRowPages;
- var roundColumnDownProportion = Math.floor(numColumnPages) / numColumnPages;
-
- // If the round down proportion is, work out the proportion to
- // round down to 1 page less
- if (roundRowDownProportion == 1)
- {
- roundRowDownProportion = Math.floor(numRowPages-1) / numRowPages;
- }
- if (roundColumnDownProportion == 1)
- {
- roundColumnDownProportion = Math.floor(numColumnPages-1) / numColumnPages;
- }
-
- // Check which rounding down is smaller, but in the case of very small roundings
- // try the other dimension instead
- var scaleChange = 1;
-
- // Use the higher of the two values
- if (roundRowDownProportion > roundColumnDownProportion)
- {
- scaleChange = roundRowDownProportion;
- }
- else
- {
- scaleChange = roundColumnDownProportion;
- }
-
- numRowPages = numRowPages * scaleChange;
- numColumnPages = numColumnPages * scaleChange;
- currentTotalPages = Math.ceil(numRowPages) * Math.ceil(numColumnPages);
-
- numLoops++;
-
- if (numLoops > 10)
- {
- break;
- }
- }
-
- // Work out the scale from the number of row pages required
- // The column pages will give the same value
- var posterWidth = availablePageWidth * numRowPages;
- scale = posterWidth / graphWidth;
-
- // Allow for rounding errors
- return scale * 0.99999;
- },
-
- /**
- * Function: show
- *
- * Copies the styles and the markup from the graph's container into the
- * given document and removes all cursor styles. The document is returned.
- *
- * This function should be called from within the document with the graph.
- * If you experience problems with missing stylesheets in IE then try adding
- * the domain to the trusted sites.
- *
- * Parameters:
- *
- * graph - <mxGraph> to be copied.
- * doc - Document where the new graph is created.
- * x0 - X-coordinate of the graph view origin. Default is 0.
- * y0 - Y-coordinate of the graph view origin. Default is 0.
- */
- show: function(graph, doc, x0, y0)
- {
- x0 = (x0 != null) ? x0 : 0;
- y0 = (y0 != null) ? y0 : 0;
-
- if (doc == null)
- {
- var wnd = window.open();
- doc = wnd.document;
- }
- else
- {
- doc.open();
- }
-
- var bounds = graph.getGraphBounds();
- var dx = -bounds.x + x0;
- var dy = -bounds.y + y0;
-
- // Needs a special way of creating the page so that no click is required
- // to refresh the contents after the external CSS styles have been loaded.
- // To avoid a click or programmatic refresh, the styleSheets[].cssText
- // property is copied over from the original document.
- if (mxClient.IS_IE)
- {
- var html = '<html>';
- html += '<head>';
-
- var base = document.getElementsByTagName('base');
-
- for (var i = 0; i < base.length; i++)
- {
- html += base[i].outerHTML;
- }
-
- html += '<style>';
-
- // Copies the stylesheets without having to load them again
- for (var i = 0; i < document.styleSheets.length; i++)
- {
- try
- {
- html += document.styleSheets(i).cssText;
- }
- catch (e)
- {
- // ignore security exception
- }
- }
-
- html += '</style>';
-
- html += '</head>';
- html += '<body>';
-
- // Copies the contents of the graph container
- html += graph.container.innerHTML;
-
- html += '</body>';
- html += '<html>';
-
- doc.writeln(html);
- doc.close();
-
- // Makes sure the inner container is on the top, left
- var node = doc.body.getElementsByTagName('DIV')[0];
-
- if (node != null)
- {
- node.style.position = 'absolute';
- node.style.left = dx + 'px';
- node.style.top = dy + 'px';
- }
- }
- else
- {
- doc.writeln('<html');
- doc.writeln('<head>');
-
- var base = document.getElementsByTagName('base');
-
- for (var i=0; i<base.length; i++)
- {
- doc.writeln(mxUtils.getOuterHtml(base[i]));
- }
-
- var links = document.getElementsByTagName('link');
-
- for (var i=0; i<links.length; i++)
- {
- doc.writeln(mxUtils.getOuterHtml(links[i]));
- }
-
- var styles = document.getElementsByTagName('style');
-
- for (var i=0; i<styles.length; i++)
- {
- doc.writeln(mxUtils.getOuterHtml(styles[i]));
- }
-
- doc.writeln('</head>');
- doc.writeln('</html>');
- doc.close();
-
- // Workaround for FF2 which has no body element in a document where
- // the body has been added using document.write.
- if (doc.body == null)
- {
- doc.documentElement.appendChild(doc.createElement('body'));
- }
-
- // Workaround for missing scrollbars in FF
- doc.body.style.overflow = 'auto';
-
- var node = graph.container.firstChild;
-
- while (node != null)
- {
- var clone = node.cloneNode(true);
- doc.body.appendChild(clone);
- node = node.nextSibling;
- }
-
- // Shifts negative coordinates into visible space
- var node = doc.getElementsByTagName('g')[0];
-
- if (node != null)
- {
- node.setAttribute('transform', 'translate(' + dx + ',' + dy + ')');
-
- // Updates the size of the SVG container
- var root = node.ownerSVGElement;
- root.setAttribute('width', bounds.width + Math.max(bounds.x, 0) + 3);
- root.setAttribute('height', bounds.height + Math.max(bounds.y, 0) + 3);
- }
- }
-
- mxUtils.removeCursors(doc.body);
-
- return doc;
- },
-
- /**
- * Function: printScreen
- *
- * Prints the specified graph using a new window and the built-in print
- * dialog.
- *
- * This function should be called from within the document with the graph.
- *
- * Parameters:
- *
- * graph - <mxGraph> to be printed.
- */
- printScreen: function(graph)
- {
- var wnd = window.open();
- mxUtils.show(graph, wnd.document);
-
- var print = function()
- {
- wnd.focus();
- wnd.print();
- wnd.close();
- };
-
- // Workaround for Google Chrome which needs a bit of a
- // delay in order to render the SVG contents
- if (mxClient.IS_GC)
- {
- wnd.setTimeout(print, 500);
- }
- else
- {
- print();
- }
- },
-
- /**
- * Function: popup
- *
- * Shows the specified text content in a new <mxWindow> or a new browser
- * window if isInternalWindow is false.
- *
- * Parameters:
- *
- * content - String that specifies the text to be displayed.
- * isInternalWindow - Optional boolean indicating if an mxWindow should be
- * used instead of a new browser window. Default is false.
- */
- popup: function(content, isInternalWindow)
- {
- if (isInternalWindow)
- {
- var div = document.createElement('div');
-
- div.style.overflow = 'scroll';
- div.style.width = '636px';
- div.style.height = '460px';
-
- var pre = document.createElement('pre');
- pre.innerHTML = mxUtils.htmlEntities(content, false).
- replace(/\n/g,'<br>').replace(/ /g, '&nbsp;');
-
- div.appendChild(pre);
-
- var w = document.body.clientWidth;
- var h = (document.body.clientHeight || document.documentElement.clientHeight);
- var wnd = new mxWindow('Popup Window', div,
- w/2-320, h/2-240, 640, 480, false, true);
-
- wnd.setClosable(true);
- wnd.setVisible(true);
- }
- else
- {
- // Wraps up the XML content in a textarea
- if (mxClient.IS_NS)
- {
- var wnd = window.open();
- wnd.document.writeln('<pre>'+mxUtils.htmlEntities(content)+'</pre');
- wnd.document.close();
- }
- else
- {
- var wnd = window.open();
- var pre = wnd.document.createElement('pre');
- pre.innerHTML = mxUtils.htmlEntities(content, false).
- replace(/\n/g,'<br>').replace(/ /g, '&nbsp;');
- wnd.document.body.appendChild(pre);
- }
- }
- },
-
- /**
- * Function: alert
- *
- * Displayss the given alert in a new dialog. This implementation uses the
- * built-in alert function. This is used to display validation errors when
- * connections cannot be changed or created.
- *
- * Parameters:
- *
- * message - String specifying the message to be displayed.
- */
- alert: function(message)
- {
- alert(message);
- },
-
- /**
- * Function: prompt
- *
- * Displays the given message in a prompt dialog. This implementation uses
- * the built-in prompt function.
- *
- * Parameters:
- *
- * message - String specifying the message to be displayed.
- * defaultValue - Optional string specifying the default value.
- */
- prompt: function(message, defaultValue)
- {
- return prompt(message, defaultValue);
- },
-
- /**
- * Function: confirm
- *
- * Displays the given message in a confirm dialog. This implementation uses
- * the built-in confirm function.
- *
- * Parameters:
- *
- * message - String specifying the message to be displayed.
- */
- confirm: function(message)
- {
- return confirm(message);
- },
-
- /**
- * Function: error
- *
- * Displays the given error message in a new <mxWindow> of the given width.
- * If close is true then an additional close button is added to the window.
- * The optional icon specifies the icon to be used for the window. Default
- * is <mxUtils.errorImage>.
- *
- * Parameters:
- *
- * message - String specifying the message to be displayed.
- * width - Integer specifying the width of the window.
- * close - Optional boolean indicating whether to add a close button.
- * icon - Optional icon for the window decoration.
- */
- error: function(message, width, close, icon)
- {
- var div = document.createElement('div');
- div.style.padding = '20px';
-
- var img = document.createElement('img');
- img.setAttribute('src', icon || mxUtils.errorImage);
- img.setAttribute('valign', 'bottom');
- img.style.verticalAlign = 'middle';
- div.appendChild(img);
-
- div.appendChild(document.createTextNode('\u00a0')); // &nbsp;
- div.appendChild(document.createTextNode('\u00a0')); // &nbsp;
- div.appendChild(document.createTextNode('\u00a0')); // &nbsp;
- mxUtils.write(div, message);
-
- var w = document.body.clientWidth;
- var h = (document.body.clientHeight || document.documentElement.clientHeight);
- var warn = new mxWindow(mxResources.get(mxUtils.errorResource) ||
- mxUtils.errorResource, div, (w-width)/2, h/4, width, null,
- false, true);
-
- if (close)
- {
- mxUtils.br(div);
-
- var tmp = document.createElement('p');
- var button = document.createElement('button');
-
- if (mxClient.IS_IE)
- {
- button.style.cssText = 'float:right';
- }
- else
- {
- button.setAttribute('style', 'float:right');
- }
-
- mxEvent.addListener(button, 'click', function(evt)
- {
- warn.destroy();
- });
-
- mxUtils.write(button, mxResources.get(mxUtils.closeResource) ||
- mxUtils.closeResource);
-
- tmp.appendChild(button);
- div.appendChild(tmp);
-
- mxUtils.br(div);
-
- warn.setClosable(true);
- }
-
- warn.setVisible(true);
-
- return warn;
- },
-
- /**
- * Function: makeDraggable
- *
- * Configures the given DOM element to act as a drag source for the
- * specified graph. Returns a a new <mxDragSource>. If
- * <mxDragSource.guideEnabled> is enabled then the x and y arguments must
- * be used in funct to match the preview location.
- *
- * Example:
- *
- * (code)
- * var funct = function(graph, evt, cell, x, y)
- * {
- * if (graph.canImportCell(cell))
- * {
- * var parent = graph.getDefaultParent();
- * var vertex = null;
- *
- * graph.getModel().beginUpdate();
- * try
- * {
- * vertex = graph.insertVertex(parent, null, 'Hello', x, y, 80, 30);
- * }
- * finally
- * {
- * graph.getModel().endUpdate();
- * }
- *
- * graph.setSelectionCell(vertex);
- * }
- * }
- *
- * var img = document.createElement('img');
- * img.setAttribute('src', 'editors/images/rectangle.gif');
- * img.style.position = 'absolute';
- * img.style.left = '0px';
- * img.style.top = '0px';
- * img.style.width = '16px';
- * img.style.height = '16px';
- *
- * var dragImage = img.cloneNode(true);
- * dragImage.style.width = '32px';
- * dragImage.style.height = '32px';
- * mxUtils.makeDraggable(img, graph, funct, dragImage);
- * document.body.appendChild(img);
- * (end)
- *
- * Parameters:
- *
- * element - DOM element to make draggable.
- * graphF - <mxGraph> that acts as the drop target or a function that takes a
- * mouse event and returns the current <mxGraph>.
- * funct - Function to execute on a successful drop.
- * dragElement - Optional DOM node to be used for the drag preview.
- * dx - Optional horizontal offset between the cursor and the drag
- * preview.
- * dy - Optional vertical offset between the cursor and the drag
- * preview.
- * autoscroll - Optional boolean that specifies if autoscroll should be
- * used. Default is mxGraph.autoscroll.
- * scalePreview - Optional boolean that specifies if the preview element
- * should be scaled according to the graph scale. If this is true, then
- * the offsets will also be scaled. Default is false.
- * highlightDropTargets - Optional boolean that specifies if dropTargets
- * should be highlighted. Default is true.
- * getDropTarget - Optional function to return the drop target for a given
- * location (x, y). Default is mxGraph.getCellAt.
- */
- makeDraggable: function(element, graphF, funct, dragElement, dx, dy, autoscroll,
- scalePreview, highlightDropTargets, getDropTarget)
- {
- var dragSource = new mxDragSource(element, funct);
- dragSource.dragOffset = new mxPoint((dx != null) ? dx : 0,
- (dy != null) ? dy : mxConstants.TOOLTIP_VERTICAL_OFFSET);
- dragSource.autoscroll = autoscroll;
-
- // Cannot enable this by default. This needs to be enabled in the caller
- // if the funct argument uses the new x- and y-arguments.
- dragSource.setGuidesEnabled(false);
-
- if (highlightDropTargets != null)
- {
- dragSource.highlightDropTargets = highlightDropTargets;
- }
-
- // Overrides function to find drop target cell
- if (getDropTarget != null)
- {
- dragSource.getDropTarget = getDropTarget;
- }
-
- // Overrides function to get current graph
- dragSource.getGraphForEvent = function(evt)
- {
- return (typeof(graphF) == 'function') ? graphF(evt) : graphF;
- };
-
- // Translates switches into dragSource customizations
- if (dragElement != null)
- {
- dragSource.createDragElement = function()
- {
- return dragElement.cloneNode(true);
- };
-
- if (scalePreview)
- {
- dragSource.createPreviewElement = function(graph)
- {
- var elt = dragElement.cloneNode(true);
-
- var w = parseInt(elt.style.width);
- var h = parseInt(elt.style.height);
- elt.style.width = Math.round(w * graph.view.scale) + 'px';
- elt.style.height = Math.round(h * graph.view.scale) + 'px';
-
- return elt;
- };
- }
- }
-
- return dragSource;
- }
-
-};
diff --git a/src/js/util/mxWindow.js b/src/js/util/mxWindow.js
deleted file mode 100644
index e4cbcfc..0000000
--- a/src/js/util/mxWindow.js
+++ /dev/null
@@ -1,1065 +0,0 @@
-/**
- * $Id: mxWindow.js,v 1.67 2012-10-11 17:18:51 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxWindow
- *
- * Basic window inside a document.
- *
- * Examples:
- *
- * Creating a simple window.
- *
- * (code)
- * var tb = document.createElement('div');
- * var wnd = new mxWindow('Title', tb, 100, 100, 200, 200, true, true);
- * wnd.setVisible(true);
- * (end)
- *
- * Creating a window that contains an iframe.
- *
- * (code)
- * var frame = document.createElement('iframe');
- * frame.setAttribute('width', '192px');
- * frame.setAttribute('height', '172px');
- * frame.setAttribute('src', 'http://www.example.com/');
- * frame.style.backgroundColor = 'white';
- *
- * var w = document.body.clientWidth;
- * var h = (document.body.clientHeight || document.documentElement.clientHeight);
- * var wnd = new mxWindow('Title', frame, (w-200)/2, (h-200)/3, 200, 200);
- * wnd.setVisible(true);
- * (end)
- *
- * To limit the movement of a window, eg. to keep it from being moved beyond
- * the top, left corner the following method can be overridden (recommended):
- *
- * (code)
- * wnd.setLocation = function(x, y)
- * {
- * x = Math.max(0, x);
- * y = Math.max(0, y);
- * mxWindow.prototype.setLocation.apply(this, arguments);
- * };
- * (end)
- *
- * Or the following event handler can be used:
- *
- * (code)
- * wnd.addListener(mxEvent.MOVE, function(e)
- * {
- * wnd.setLocation(Math.max(0, wnd.getX()), Math.max(0, wnd.getY()));
- * });
- * (end)
- *
- * Event: mxEvent.MOVE_START
- *
- * Fires before the window is moved. The <code>event</code> property contains
- * the corresponding mouse event.
- *
- * Event: mxEvent.MOVE
- *
- * Fires while the window is being moved. The <code>event</code> property
- * contains the corresponding mouse event.
- *
- * Event: mxEvent.MOVE_END
- *
- * Fires after the window is moved. The <code>event</code> property contains
- * the corresponding mouse event.
- *
- * Event: mxEvent.RESIZE_START
- *
- * Fires before the window is resized. The <code>event</code> property contains
- * the corresponding mouse event.
- *
- * Event: mxEvent.RESIZE
- *
- * Fires while the window is being resized. The <code>event</code> property
- * contains the corresponding mouse event.
- *
- * Event: mxEvent.RESIZE_END
- *
- * Fires after the window is resized. The <code>event</code> property contains
- * the corresponding mouse event.
- *
- * Event: mxEvent.MAXIMIZE
- *
- * Fires after the window is maximized. The <code>event</code> property
- * contains the corresponding mouse event.
- *
- * Event: mxEvent.MINIMIZE
- *
- * Fires after the window is minimized. The <code>event</code> property
- * contains the corresponding mouse event.
- *
- * Event: mxEvent.NORMALIZE
- *
- * Fires after the window is normalized, that is, it returned from
- * maximized or minimized state. The <code>event</code> property contains the
- * corresponding mouse event.
- *
- * Event: mxEvent.ACTIVATE
- *
- * Fires after a window is activated. The <code>previousWindow</code> property
- * contains the previous window. The event sender is the active window.
- *
- * Event: mxEvent.SHOW
- *
- * Fires after the window is shown. This event has no properties.
- *
- * Event: mxEvent.HIDE
- *
- * Fires after the window is hidden. This event has no properties.
- *
- * Event: mxEvent.CLOSE
- *
- * Fires before the window is closed. The <code>event</code> property contains
- * the corresponding mouse event.
- *
- * Event: mxEvent.DESTROY
- *
- * Fires before the window is destroyed. This event has no properties.
- *
- * Constructor: mxWindow
- *
- * Constructs a new window with the given dimension and title to display
- * the specified content. The window elements use the given style as a
- * prefix for the classnames of the respective window elements, namely,
- * the window title and window pane. The respective postfixes are appended
- * to the given stylename as follows:
- *
- * style - Base style for the window.
- * style+Title - Style for the window title.
- * style+Pane - Style for the window pane.
- *
- * The default value for style is mxWindow, resulting in the following
- * classnames for the window elements: mxWindow, mxWindowTitle and
- * mxWindowPane.
- *
- * If replaceNode is given then the window replaces the given DOM node in
- * the document.
- *
- * Parameters:
- *
- * title - String that represents the title of the new window.
- * content - DOM node that is used as the window content.
- * x - X-coordinate of the window location.
- * y - Y-coordinate of the window location.
- * width - Width of the window.
- * height - Optional height of the window. Default is to match the height
- * of the content at the specified width.
- * minimizable - Optional boolean indicating if the window is minimizable.
- * Default is true.
- * movable - Optional boolean indicating if the window is movable. Default
- * is true.
- * replaceNode - Optional DOM node that the window should replace.
- * style - Optional base classname for the window elements. Default is
- * mxWindow.
- */
-function mxWindow(title, content, x, y, width, height, minimizable, movable, replaceNode, style)
-{
- if (content != null)
- {
- minimizable = (minimizable != null) ? minimizable : true;
- this.content = content;
- this.init(x, y, width, height, style);
-
- this.installMaximizeHandler();
- this.installMinimizeHandler();
- this.installCloseHandler();
- this.setMinimizable(minimizable);
- this.setTitle(title);
-
- if (movable == null || movable)
- {
- this.installMoveHandler();
- }
-
- if (replaceNode != null && replaceNode.parentNode != null)
- {
- replaceNode.parentNode.replaceChild(this.div, replaceNode);
- }
- else
- {
- document.body.appendChild(this.div);
- }
- }
-};
-
-/**
- * Extends mxEventSource.
- */
-mxWindow.prototype = new mxEventSource();
-mxWindow.prototype.constructor = mxWindow;
-
-/**
- * Variable: closeImage
- *
- * URL of the image to be used for the close icon in the titlebar.
- */
-mxWindow.prototype.closeImage = mxClient.imageBasePath + '/close.gif';
-
-/**
- * Variable: minimizeImage
- *
- * URL of the image to be used for the minimize icon in the titlebar.
- */
-mxWindow.prototype.minimizeImage = mxClient.imageBasePath + '/minimize.gif';
-
-/**
- * Variable: normalizeImage
- *
- * URL of the image to be used for the normalize icon in the titlebar.
- */
-mxWindow.prototype.normalizeImage = mxClient.imageBasePath + '/normalize.gif';
-
-/**
- * Variable: maximizeImage
- *
- * URL of the image to be used for the maximize icon in the titlebar.
- */
-mxWindow.prototype.maximizeImage = mxClient.imageBasePath + '/maximize.gif';
-
-/**
- * Variable: normalizeImage
- *
- * URL of the image to be used for the resize icon.
- */
-mxWindow.prototype.resizeImage = mxClient.imageBasePath + '/resize.gif';
-
-/**
- * Variable: visible
- *
- * Boolean flag that represents the visible state of the window.
- */
-mxWindow.prototype.visible = false;
-
-/**
- * Variable: content
- *
- * Reference to the DOM node that represents the window content.
- */
-mxWindow.prototype.content = false;
-
-/**
- * Variable: minimumSize
- *
- * <mxRectangle> that specifies the minimum width and height of the window.
- * Default is (50, 40).
- */
-mxWindow.prototype.minimumSize = new mxRectangle(0, 0, 50, 40);
-
-/**
- * Variable: title
- *
- * Reference to the DOM node (TD) that contains the title.
- */
-mxWindow.prototype.title = false;
-
-/**
- * Variable: content
- *
- * Reference to the DOM node that represents the window content.
- */
-mxWindow.prototype.content = false;
-
-/**
- * Variable: destroyOnClose
- *
- * Specifies if the window should be destroyed when it is closed. If this
- * is false then the window is hidden using <setVisible>. Default is true.
- */
-mxWindow.prototype.destroyOnClose = true;
-
-/**
- * Function: init
- *
- * Initializes the DOM tree that represents the window.
- */
-mxWindow.prototype.init = function(x, y, width, height, style)
-{
- style = (style != null) ? style : 'mxWindow';
-
- this.div = document.createElement('div');
- this.div.className = style;
- this.div.style.left = x+'px';
- this.div.style.top = y+'px';
- this.table = document.createElement('table');
- this.table.className = style;
-
- // Workaround for table size problems in FF
- if (width != null)
- {
- if (!mxClient.IS_IE)
- {
- this.div.style.width = width+'px';
- }
-
- this.table.style.width = width+'px';
- }
-
- if (height != null)
- {
- if (!mxClient.IS_IE)
- {
- this.div.style.height = height+'px';
- }
-
- this.table.style.height = height+'px';
- }
-
- // Creates title row
- var tbody = document.createElement('tbody');
- var tr = document.createElement('tr');
-
- this.title = document.createElement('td');
- this.title.className = style+'Title';
- tr.appendChild(this.title);
- tbody.appendChild(tr);
-
- // Creates content row and table cell
- tr = document.createElement('tr');
- this.td = document.createElement('td');
- this.td.className = style+'Pane';
-
- this.contentWrapper = document.createElement('div');
- this.contentWrapper.className = style+'Pane';
- this.contentWrapper.style.width = '100%';
- this.contentWrapper.appendChild(this.content);
-
- // Workaround for div around div restricts height
- // of inner div if outerdiv has hidden overflow
- if (mxClient.IS_IE || this.content.nodeName.toUpperCase() != 'DIV')
- {
- this.contentWrapper.style.height = '100%';
- }
-
- // Puts all content into the DOM
- this.td.appendChild(this.contentWrapper);
- tr.appendChild(this.td);
- tbody.appendChild(tr);
- this.table.appendChild(tbody);
- this.div.appendChild(this.table);
-
- // Puts the window on top of other windows when clicked
- var activator = mxUtils.bind(this, function(evt)
- {
- this.activate();
- });
-
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- mxEvent.addListener(this.title, md, activator);
- mxEvent.addListener(this.table, md, activator);
-
- this.hide();
-};
-
-/**
- * Function: setTitle
- *
- * Sets the window title to the given string. HTML markup inside the title
- * will be escaped.
- */
-mxWindow.prototype.setTitle = function(title)
-{
- // Removes all text content nodes (normally just one)
- var child = this.title.firstChild;
-
- while (child != null)
- {
- var next = child.nextSibling;
-
- if (child.nodeType == mxConstants.NODETYPE_TEXT)
- {
- child.parentNode.removeChild(child);
- }
-
- child = next;
- }
-
- mxUtils.write(this.title, title || '');
-};
-
-/**
- * Function: setScrollable
- *
- * Sets if the window contents should be scrollable.
- */
-mxWindow.prototype.setScrollable = function(scrollable)
-{
- // Workaround for hang in Presto 2.5.22 (Opera 10.5)
- if (navigator.userAgent.indexOf('Presto/2.5') < 0)
- {
- if (scrollable)
- {
- this.contentWrapper.style.overflow = 'auto';
- }
- else
- {
- this.contentWrapper.style.overflow = 'hidden';
- }
- }
-};
-
-/**
- * Function: activate
- *
- * Puts the window on top of all other windows.
- */
-mxWindow.prototype.activate = function()
-{
- if (mxWindow.activeWindow != this)
- {
- var style = mxUtils.getCurrentStyle(this.getElement());
- var index = (style != null) ? style.zIndex : 3;
-
- if (mxWindow.activeWindow)
- {
- var elt = mxWindow.activeWindow.getElement();
-
- if (elt != null && elt.style != null)
- {
- elt.style.zIndex = index;
- }
- }
-
- var previousWindow = mxWindow.activeWindow;
- this.getElement().style.zIndex = parseInt(index) + 1;
- mxWindow.activeWindow = this;
-
- this.fireEvent(new mxEventObject(mxEvent.ACTIVATE, 'previousWindow', previousWindow));
- }
-};
-
-/**
- * Function: getElement
- *
- * Returuns the outermost DOM node that makes up the window.
- */
-mxWindow.prototype.getElement = function()
-{
- return this.div;
-};
-
-/**
- * Function: fit
- *
- * Makes sure the window is inside the client area of the window.
- */
-mxWindow.prototype.fit = function()
-{
- mxUtils.fit(this.div);
-};
-
-/**
- * Function: isResizable
- *
- * Returns true if the window is resizable.
- */
-mxWindow.prototype.isResizable = function()
-{
- if (this.resize != null)
- {
- return this.resize.style.display != 'none';
- }
-
- return false;
-};
-
-/**
- * Function: setResizable
- *
- * Sets if the window should be resizable.
- */
-mxWindow.prototype.setResizable = function(resizable)
-{
- if (resizable)
- {
- if (this.resize == null)
- {
- this.resize = document.createElement('img');
- this.resize.style.position = 'absolute';
- this.resize.style.bottom = '2px';
- this.resize.style.right = '2px';
-
- this.resize.setAttribute('src', mxClient.imageBasePath + '/resize.gif');
- this.resize.style.cursor = 'nw-resize';
-
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- var mm = (mxClient.IS_TOUCH) ? 'touchmove' : 'mousemove';
- var mu = (mxClient.IS_TOUCH) ? 'touchend' : 'mouseup';
-
- mxEvent.addListener(this.resize, md, mxUtils.bind(this, function(evt)
- {
- this.activate();
- var startX = mxEvent.getClientX(evt);
- var startY = mxEvent.getClientY(evt);
- var width = this.div.offsetWidth;
- var height = this.div.offsetHeight;
-
- // Adds a temporary pair of listeners to intercept
- // the gesture event in the document
- var dragHandler = mxUtils.bind(this, function(evt)
- {
- var dx = mxEvent.getClientX(evt) - startX;
- var dy = mxEvent.getClientY(evt) - startY;
-
- this.setSize(width + dx, height + dy);
-
- this.fireEvent(new mxEventObject(mxEvent.RESIZE, 'event', evt));
- mxEvent.consume(evt);
- });
-
- var dropHandler = mxUtils.bind(this, function(evt)
- {
- mxEvent.removeListener(document, mm, dragHandler);
- mxEvent.removeListener(document, mu, dropHandler);
-
- this.fireEvent(new mxEventObject(mxEvent.RESIZE_END, 'event', evt));
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(document, mm, dragHandler);
- mxEvent.addListener(document, mu, dropHandler);
-
- this.fireEvent(new mxEventObject(mxEvent.RESIZE_START, 'event', evt));
- mxEvent.consume(evt);
- }));
-
- this.div.appendChild(this.resize);
- }
- else
- {
- this.resize.style.display = 'inline';
- }
- }
- else if (this.resize != null)
- {
- this.resize.style.display = 'none';
- }
-};
-
-/**
- * Function: setSize
- *
- * Sets the size of the window.
- */
-mxWindow.prototype.setSize = function(width, height)
-{
- width = Math.max(this.minimumSize.width, width);
- height = Math.max(this.minimumSize.height, height);
-
- // Workaround for table size problems in FF
- if (!mxClient.IS_IE)
- {
- this.div.style.width = width + 'px';
- this.div.style.height = height + 'px';
- }
-
- this.table.style.width = width + 'px';
- this.table.style.height = height + 'px';
-
- if (!mxClient.IS_IE)
- {
- this.contentWrapper.style.height =
- (this.div.offsetHeight - this.title.offsetHeight - 2)+'px';
- }
-};
-
-/**
- * Function: setMinimizable
- *
- * Sets if the window is minimizable.
- */
-mxWindow.prototype.setMinimizable = function(minimizable)
-{
- this.minimize.style.display = (minimizable) ? '' : 'none';
-};
-
-/**
- * Function: getMinimumSize
- *
- * Returns an <mxRectangle> that specifies the size for the minimized window.
- * A width or height of 0 means keep the existing width or height. This
- * implementation returns the height of the window title and keeps the width.
- */
-mxWindow.prototype.getMinimumSize = function()
-{
- return new mxRectangle(0, 0, 0, this.title.offsetHeight);
-};
-
-/**
- * Function: installMinimizeHandler
- *
- * Installs the event listeners required for minimizing the window.
- */
-mxWindow.prototype.installMinimizeHandler = function()
-{
- this.minimize = document.createElement('img');
-
- this.minimize.setAttribute('src', this.minimizeImage);
- this.minimize.setAttribute('align', 'right');
- this.minimize.setAttribute('title', 'Minimize');
- this.minimize.style.cursor = 'pointer';
- this.minimize.style.marginRight = '1px';
- this.minimize.style.display = 'none';
-
- this.title.appendChild(this.minimize);
-
- var minimized = false;
- var maxDisplay = null;
- var height = null;
-
- var funct = mxUtils.bind(this, function(evt)
- {
- this.activate();
-
- if (!minimized)
- {
- minimized = true;
-
- this.minimize.setAttribute('src', this.normalizeImage);
- this.minimize.setAttribute('title', 'Normalize');
- this.contentWrapper.style.display = 'none';
- maxDisplay = this.maximize.style.display;
-
- this.maximize.style.display = 'none';
- height = this.table.style.height;
-
- var minSize = this.getMinimumSize();
-
- if (minSize.height > 0)
- {
- if (!mxClient.IS_IE)
- {
- this.div.style.height = minSize.height + 'px';
- }
-
- this.table.style.height = minSize.height + 'px';
- }
-
- if (minSize.width > 0)
- {
- if (!mxClient.IS_IE)
- {
- this.div.style.width = minSize.width + 'px';
- }
-
- this.table.style.width = minSize.width + 'px';
- }
-
- if (this.resize != null)
- {
- this.resize.style.visibility = 'hidden';
- }
-
- this.fireEvent(new mxEventObject(mxEvent.MINIMIZE, 'event', evt));
- }
- else
- {
- minimized = false;
-
- this.minimize.setAttribute('src', this.minimizeImage);
- this.minimize.setAttribute('title', 'Minimize');
- this.contentWrapper.style.display = ''; // default
- this.maximize.style.display = maxDisplay;
-
- if (!mxClient.IS_IE)
- {
- this.div.style.height = height;
- }
-
- this.table.style.height = height;
-
- if (this.resize != null)
- {
- this.resize.style.visibility = '';
- }
-
- this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, 'event', evt));
- }
-
- mxEvent.consume(evt);
- });
-
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- mxEvent.addListener(this.minimize, md, funct);
-};
-
-/**
- * Function: setMaximizable
- *
- * Sets if the window is maximizable.
- */
-mxWindow.prototype.setMaximizable = function(maximizable)
-{
- this.maximize.style.display = (maximizable) ? '' : 'none';
-};
-
-/**
- * Function: installMaximizeHandler
- *
- * Installs the event listeners required for maximizing the window.
- */
-mxWindow.prototype.installMaximizeHandler = function()
-{
- this.maximize = document.createElement('img');
-
- this.maximize.setAttribute('src', this.maximizeImage);
- this.maximize.setAttribute('align', 'right');
- this.maximize.setAttribute('title', 'Maximize');
- this.maximize.style.cursor = 'default';
- this.maximize.style.marginLeft = '1px';
- this.maximize.style.cursor = 'pointer';
- this.maximize.style.display = 'none';
-
- this.title.appendChild(this.maximize);
-
- var maximized = false;
- var x = null;
- var y = null;
- var height = null;
- var width = null;
-
- var funct = mxUtils.bind(this, function(evt)
- {
- this.activate();
-
- if (this.maximize.style.display != 'none')
- {
- if (!maximized)
- {
- maximized = true;
-
- this.maximize.setAttribute('src', this.normalizeImage);
- this.maximize.setAttribute('title', 'Normalize');
- this.contentWrapper.style.display = '';
- this.minimize.style.visibility = 'hidden';
-
- // Saves window state
- x = parseInt(this.div.style.left);
- y = parseInt(this.div.style.top);
- height = this.table.style.height;
- width = this.table.style.width;
-
- this.div.style.left = '0px';
- this.div.style.top = '0px';
-
- if (!mxClient.IS_IE)
- {
- this.div.style.height = (document.body.clientHeight-2)+'px';
- this.div.style.width = (document.body.clientWidth-2)+'px';
- }
-
- this.table.style.width = (document.body.clientWidth-2)+'px';
- this.table.style.height = (document.body.clientHeight-2)+'px';
-
- if (this.resize != null)
- {
- this.resize.style.visibility = 'hidden';
- }
-
- if (!mxClient.IS_IE)
- {
- var style = mxUtils.getCurrentStyle(this.contentWrapper);
-
- if (style.overflow == 'auto' || this.resize != null)
- {
- this.contentWrapper.style.height =
- (this.div.offsetHeight - this.title.offsetHeight - 2)+'px';
- }
- }
-
- this.fireEvent(new mxEventObject(mxEvent.MAXIMIZE, 'event', evt));
- }
- else
- {
- maximized = false;
-
- this.maximize.setAttribute('src', this.maximizeImage);
- this.maximize.setAttribute('title', 'Maximize');
- this.contentWrapper.style.display = '';
- this.minimize.style.visibility = '';
-
- // Restores window state
- this.div.style.left = x+'px';
- this.div.style.top = y+'px';
-
- if (!mxClient.IS_IE)
- {
- this.div.style.height = height;
- this.div.style.width = width;
-
- var style = mxUtils.getCurrentStyle(this.contentWrapper);
-
- if (style.overflow == 'auto' || this.resize != null)
- {
- this.contentWrapper.style.height =
- (this.div.offsetHeight - this.title.offsetHeight - 2)+'px';
- }
- }
-
- this.table.style.height = height;
- this.table.style.width = width;
-
- if (this.resize != null)
- {
- this.resize.style.visibility = '';
- }
-
- this.fireEvent(new mxEventObject(mxEvent.NORMALIZE, 'event', evt));
- }
-
- mxEvent.consume(evt);
- }
- });
-
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- mxEvent.addListener(this.maximize, md, funct);
- mxEvent.addListener(this.title, 'dblclick', funct);
-};
-
-/**
- * Function: installMoveHandler
- *
- * Installs the event listeners required for moving the window.
- */
-mxWindow.prototype.installMoveHandler = function()
-{
- this.title.style.cursor = 'move';
-
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- var mm = (mxClient.IS_TOUCH) ? 'touchmove' : 'mousemove';
- var mu = (mxClient.IS_TOUCH) ? 'touchend' : 'mouseup';
-
- mxEvent.addListener(this.title, md, mxUtils.bind(this, function(evt)
- {
- var startX = mxEvent.getClientX(evt);
- var startY = mxEvent.getClientY(evt);
- var x = this.getX();
- var y = this.getY();
-
- // Adds a temporary pair of listeners to intercept
- // the gesture event in the document
- var dragHandler = mxUtils.bind(this, function(evt)
- {
- var dx = mxEvent.getClientX(evt) - startX;
- var dy = mxEvent.getClientY(evt) - startY;
- this.setLocation(x + dx, y + dy);
- this.fireEvent(new mxEventObject(mxEvent.MOVE, 'event', evt));
- mxEvent.consume(evt);
- });
-
- var dropHandler = mxUtils.bind(this, function(evt)
- {
- mxEvent.removeListener(document, mm, dragHandler);
- mxEvent.removeListener(document, mu, dropHandler);
-
- this.fireEvent(new mxEventObject(mxEvent.MOVE_END, 'event', evt));
- mxEvent.consume(evt);
- });
-
- mxEvent.addListener(document, mm, dragHandler);
- mxEvent.addListener(document, mu, dropHandler);
-
- this.fireEvent(new mxEventObject(mxEvent.MOVE_START, 'event', evt));
- mxEvent.consume(evt);
- }));
-};
-
-/**
- * Function: setLocation
- *
- * Sets the upper, left corner of the window.
- */
- mxWindow.prototype.setLocation = function(x, y)
- {
- this.div.style.left = x + 'px';
- this.div.style.top = y + 'px';
- };
-
-/**
- * Function: getX
- *
- * Returns the current position on the x-axis.
- */
-mxWindow.prototype.getX = function()
-{
- return parseInt(this.div.style.left);
-};
-
-/**
- * Function: getY
- *
- * Returns the current position on the y-axis.
- */
-mxWindow.prototype.getY = function()
-{
- return parseInt(this.div.style.top);
-};
-
-/**
- * Function: installCloseHandler
- *
- * Adds the <closeImage> as a new image node in <closeImg> and installs the
- * <close> event.
- */
-mxWindow.prototype.installCloseHandler = function()
-{
- this.closeImg = document.createElement('img');
-
- this.closeImg.setAttribute('src', this.closeImage);
- this.closeImg.setAttribute('align', 'right');
- this.closeImg.setAttribute('title', 'Close');
- this.closeImg.style.marginLeft = '2px';
- this.closeImg.style.cursor = 'pointer';
- this.closeImg.style.display = 'none';
-
- this.title.insertBefore(this.closeImg, this.title.firstChild);
-
- var md = (mxClient.IS_TOUCH) ? 'touchstart' : 'mousedown';
- mxEvent.addListener(this.closeImg, md, mxUtils.bind(this, function(evt)
- {
- this.fireEvent(new mxEventObject(mxEvent.CLOSE, 'event', evt));
-
- if (this.destroyOnClose)
- {
- this.destroy();
- }
- else
- {
- this.setVisible(false);
- }
-
- mxEvent.consume(evt);
- }));
-};
-
-/**
- * Function: setImage
- *
- * Sets the image associated with the window.
- *
- * Parameters:
- *
- * image - URL of the image to be used.
- */
-mxWindow.prototype.setImage = function(image)
-{
- this.image = document.createElement('img');
- this.image.setAttribute('src', image);
- this.image.setAttribute('align', 'left');
- this.image.style.marginRight = '4px';
- this.image.style.marginLeft = '0px';
- this.image.style.marginTop = '-2px';
-
- this.title.insertBefore(this.image, this.title.firstChild);
-};
-
-/**
- * Function: setClosable
- *
- * Sets the image associated with the window.
- *
- * Parameters:
- *
- * closable - Boolean specifying if the window should be closable.
- */
-mxWindow.prototype.setClosable = function(closable)
-{
- this.closeImg.style.display = (closable) ? '' : 'none';
-};
-
-/**
- * Function: isVisible
- *
- * Returns true if the window is visible.
- */
-mxWindow.prototype.isVisible = function()
-{
- if (this.div != null)
- {
- return this.div.style.visibility != 'hidden';
- }
-
- return false;
-};
-
-/**
- * Function: setVisible
- *
- * Shows or hides the window depending on the given flag.
- *
- * Parameters:
- *
- * visible - Boolean indicating if the window should be made visible.
- */
-mxWindow.prototype.setVisible = function(visible)
-{
- if (this.div != null && this.isVisible() != visible)
- {
- if (visible)
- {
- this.show();
- }
- else
- {
- this.hide();
- }
- }
-};
-
-/**
- * Function: show
- *
- * Shows the window.
- */
-mxWindow.prototype.show = function()
-{
- this.div.style.visibility = '';
- this.activate();
-
- var style = mxUtils.getCurrentStyle(this.contentWrapper);
-
- if (!mxClient.IS_IE && (style.overflow == 'auto' || this.resize != null))
- {
- this.contentWrapper.style.height =
- (this.div.offsetHeight - this.title.offsetHeight - 2)+'px';
- }
-
- this.fireEvent(new mxEventObject(mxEvent.SHOW));
-};
-
-/**
- * Function: hide
- *
- * Hides the window.
- */
-mxWindow.prototype.hide = function()
-{
- this.div.style.visibility = 'hidden';
- this.fireEvent(new mxEventObject(mxEvent.HIDE));
-};
-
-/**
- * Function: destroy
- *
- * Destroys the window and removes all associated resources. Fires a
- * <destroy> event prior to destroying the window.
- */
-mxWindow.prototype.destroy = function()
-{
- this.fireEvent(new mxEventObject(mxEvent.DESTROY));
-
- if (this.div != null)
- {
- mxEvent.release(this.div);
- this.div.parentNode.removeChild(this.div);
- this.div = null;
- }
-
- this.title = null;
- this.content = null;
- this.contentWrapper = null;
-};
diff --git a/src/js/util/mxXmlCanvas2D.js b/src/js/util/mxXmlCanvas2D.js
deleted file mode 100644
index 499c71a..0000000
--- a/src/js/util/mxXmlCanvas2D.js
+++ /dev/null
@@ -1,715 +0,0 @@
-/**
- * $Id: mxXmlCanvas2D.js,v 1.9 2012-04-24 13:56:56 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- *
- * Class: mxXmlCanvas2D
- *
- * Implements a canvas to be used with <mxImageExport>. This canvas writes all
- * calls as child nodes to the given root XML node.
- *
- * (code)
- * var xmlDoc = mxUtils.createXmlDocument();
- * var root = xmlDoc.createElement('output');
- * xmlDoc.appendChild(root);
- * var xmlCanvas = new mxXmlCanvas2D(root);
- * (end)
- *
- * Constructor: mxXmlCanvas2D
- *
- * Constructs a XML canvas.
- *
- * Parameters:
- *
- * root - XML node for adding child nodes.
- */
-var mxXmlCanvas2D = function(root)
-{
- /**
- * Variable: converter
- *
- * Holds the <mxUrlConverter> to convert image URLs.
- */
- var converter = new mxUrlConverter();
-
- /**
- * Variable: compressed
- *
- * Specifies if the output should be compressed by removing redundant calls.
- * Default is true.
- */
- var compressed = true;
-
- /**
- * Variable: textEnabled
- *
- * Specifies if text output should be enabled. Default is true.
- */
- var textEnabled = true;
-
- // Private reference to the owner document
- var doc = root.ownerDocument;
-
- // Implements stack for save/restore
- var stack = [];
-
- // Implements state for redundancy checks
- var state =
- {
- alpha: 1,
- dashed: false,
- strokewidth: 1,
- fontsize: mxConstants.DEFAULT_FONTSIZE,
- fontfamily: mxConstants.DEFAULT_FONTFAMILY,
- fontcolor: '#000000'
- };
-
- // Private helper function set set precision to 2
- var f2 = function(x)
- {
- return Math.round(parseFloat(x) * 100) / 100;
- };
-
- // Returns public interface
- return {
-
- /**
- * Function: getConverter
- *
- * Returns <converter>.
- */
- getConverter: function()
- {
- return converter;
- },
-
- /**
- * Function: isCompressed
- *
- * Returns <compressed>.
- */
- isCompressed: function()
- {
- return compressed;
- },
-
- /**
- * Function: setCompressed
- *
- * Sets <compressed>.
- */
- setCompressed: function(value)
- {
- compressed = value;
- },
-
- /**
- * Function: isTextEnabled
- *
- * Returns <textEnabled>.
- */
- isTextEnabled: function()
- {
- return textEnabled;
- },
-
- /**
- * Function: setTextEnabled
- *
- * Sets <textEnabled>.
- */
- setTextEnabled: function(value)
- {
- textEnabled = value;
- },
-
- /**
- * Function: getDocument
- *
- * Returns the owner document of the root element.
- */
- getDocument: function()
- {
- return doc;
- },
-
- /**
- * Function: save
- *
- * Saves the state of the graphics object.
- */
- save: function()
- {
- if (compressed)
- {
- stack.push(state);
- state = mxUtils.clone(state);
- }
-
- root.appendChild(doc.createElement('save'));
- },
-
- /**
- * Function: restore
- *
- * Restores the state of the graphics object.
- */
- restore: function()
- {
- if (compressed)
- {
- state = stack.pop();
- }
-
- root.appendChild(doc.createElement('restore'));
- },
-
- /**
- * Function: scale
- *
- * Scales the current graphics object.
- */
- scale: function(value)
- {
- var elem = doc.createElement('scale');
- elem.setAttribute('scale', value);
- root.appendChild(elem);
- },
-
- /**
- * Function: translate
- *
- * Translates the current graphics object.
- */
- translate: function(dx, dy)
- {
- var elem = doc.createElement('translate');
- elem.setAttribute('dx', f2(dx));
- elem.setAttribute('dy', f2(dy));
- root.appendChild(elem);
- },
-
- /**
- * Function: rotate
- *
- * Rotates and/or flips the current graphics object.
- */
- rotate: function(theta, flipH, flipV, cx, cy)
- {
- var elem = doc.createElement('rotate');
- elem.setAttribute('theta', f2(theta));
- elem.setAttribute('flipH', (flipH) ? '1' : '0');
- elem.setAttribute('flipV', (flipV) ? '1' : '0');
- elem.setAttribute('cx', f2(cx));
- elem.setAttribute('cy', f2(cy));
- root.appendChild(elem);
- },
-
- /**
- * Function: setStrokeWidth
- *
- * Sets the stroke width.
- */
- setStrokeWidth: function(value)
- {
- if (compressed)
- {
- if (state.strokewidth == value)
- {
- return;
- }
-
- state.strokewidth = value;
- }
-
- var elem = doc.createElement('strokewidth');
- elem.setAttribute('width', f2(value));
- root.appendChild(elem);
- },
-
- /**
- * Function: setStrokeColor
- *
- * Sets the stroke color.
- */
- setStrokeColor: function(value)
- {
- var elem = doc.createElement('strokecolor');
- elem.setAttribute('color', value);
- root.appendChild(elem);
- },
-
- /**
- * Function: setDashed
- *
- * Sets the dashed state to true or false.
- */
- setDashed: function(value)
- {
- if (compressed)
- {
- if (state.dashed == value)
- {
- return;
- }
-
- state.dashed = value;
- }
-
- var elem = doc.createElement('dashed');
- elem.setAttribute('dashed', (value) ? '1' : '0');
- root.appendChild(elem);
- },
-
- /**
- * Function: setDashPattern
- *
- * Sets the dashed pattern to the given space separated list of numbers.
- */
- setDashPattern: function(value)
- {
- var elem = doc.createElement('dashpattern');
- elem.setAttribute('pattern', value);
- root.appendChild(elem);
- },
-
- /**
- * Function: setLineCap
- *
- * Sets the linecap.
- */
- setLineCap: function(value)
- {
- var elem = doc.createElement('linecap');
- elem.setAttribute('cap', value);
- root.appendChild(elem);
- },
-
- /**
- * Function: setLineJoin
- *
- * Sets the linejoin.
- */
- setLineJoin: function(value)
- {
- var elem = doc.createElement('linejoin');
- elem.setAttribute('join', value);
- root.appendChild(elem);
- },
-
- /**
- * Function: setMiterLimit
- *
- * Sets the miterlimit.
- */
- setMiterLimit: function(value)
- {
- var elem = doc.createElement('miterlimit');
- elem.setAttribute('limit', value);
- root.appendChild(elem);
- },
-
- /**
- * Function: setFontSize
- *
- * Sets the fontsize.
- */
- setFontSize: function(value)
- {
- if (textEnabled)
- {
- if (compressed)
- {
- if (state.fontsize == value)
- {
- return;
- }
-
- state.fontsize = value;
- }
-
- var elem = doc.createElement('fontsize');
- elem.setAttribute('size', value);
- root.appendChild(elem);
- }
- },
-
- /**
- * Function: setFontColor
- *
- * Sets the fontcolor.
- */
- setFontColor: function(value)
- {
- if (textEnabled)
- {
- if (compressed)
- {
- if (state.fontcolor == value)
- {
- return;
- }
-
- state.fontcolor = value;
- }
-
- var elem = doc.createElement('fontcolor');
- elem.setAttribute('color', value);
- root.appendChild(elem);
- }
- },
-
- /**
- * Function: setFontFamily
- *
- * Sets the fontfamily.
- */
- setFontFamily: function(value)
- {
- if (textEnabled)
- {
- if (compressed)
- {
- if (state.fontfamily == value)
- {
- return;
- }
-
- state.fontfamily = value;
- }
-
- var elem = doc.createElement('fontfamily');
- elem.setAttribute('family', value);
- root.appendChild(elem);
- }
- },
-
- /**
- * Function: setFontStyle
- *
- * Sets the fontstyle.
- */
- setFontStyle: function(value)
- {
- if (textEnabled)
- {
- var elem = doc.createElement('fontstyle');
- elem.setAttribute('style', value);
- root.appendChild(elem);
- }
- },
-
- /**
- * Function: setAlpha
- *
- * Sets the current alpha.
- */
- setAlpha: function(alpha)
- {
- if (compressed)
- {
- if (state.alpha == alpha)
- {
- return;
- }
-
- state.alpha = alpha;
- }
-
- var elem = doc.createElement('alpha');
- elem.setAttribute('alpha', f2(alpha));
- root.appendChild(elem);
- },
-
- /**
- * Function: setFillColor
- *
- * Sets the fillcolor.
- */
- setFillColor: function(value)
- {
- var elem = doc.createElement('fillcolor');
- elem.setAttribute('color', value);
- root.appendChild(elem);
- },
-
- /**
- * Function: setGradient
- *
- * Sets the gradient color.
- */
- setGradient: function(color1, color2, x, y, w, h, direction)
- {
- var elem = doc.createElement('gradient');
- elem.setAttribute('c1', color1);
- elem.setAttribute('c2', color2);
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- elem.setAttribute('w', f2(w));
- elem.setAttribute('h', f2(h));
-
- // Default direction is south
- if (direction != null)
- {
- elem.setAttribute('direction', direction);
- }
-
- root.appendChild(elem);
- },
-
- /**
- * Function: setGlassGradient
- *
- * Sets the glass gradient.
- */
- setGlassGradient: function(x, y, w, h)
- {
- var elem = doc.createElement('glass');
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- elem.setAttribute('w', f2(w));
- elem.setAttribute('h', f2(h));
- root.appendChild(elem);
- },
-
- /**
- * Function: rect
- *
- * Sets the current path to a rectangle.
- */
- rect: function(x, y, w, h)
- {
- var elem = doc.createElement('rect');
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- elem.setAttribute('w', f2(w));
- elem.setAttribute('h', f2(h));
- root.appendChild(elem);
- },
-
- /**
- * Function: roundrect
- *
- * Sets the current path to a rounded rectangle.
- */
- roundrect: function(x, y, w, h, dx, dy)
- {
- var elem = doc.createElement('roundrect');
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- elem.setAttribute('w', f2(w));
- elem.setAttribute('h', f2(h));
- elem.setAttribute('dx', f2(dx));
- elem.setAttribute('dy', f2(dy));
- root.appendChild(elem);
- },
-
- /**
- * Function: ellipse
- *
- * Sets the current path to an ellipse.
- */
- ellipse: function(x, y, w, h)
- {
- var elem = doc.createElement('ellipse');
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- elem.setAttribute('w', f2(w));
- elem.setAttribute('h', f2(h));
- root.appendChild(elem);
- },
-
- /**
- * Function: image
- *
- * Paints an image.
- */
- image: function(x, y, w, h, src, aspect, flipH, flipV)
- {
- src = converter.convert(src);
-
- // TODO: Add option for embedding images as base64
- var elem = doc.createElement('image');
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- elem.setAttribute('w', f2(w));
- elem.setAttribute('h', f2(h));
- elem.setAttribute('src', src);
- elem.setAttribute('aspect', (aspect) ? '1' : '0');
- elem.setAttribute('flipH', (flipH) ? '1' : '0');
- elem.setAttribute('flipV', (flipV) ? '1' : '0');
- root.appendChild(elem);
- },
-
- /**
- * Function: text
- *
- * Paints the given text.
- */
- text: function(x, y, w, h, str, align, valign, vertical, wrap, format)
- {
- if (textEnabled)
- {
- var elem = doc.createElement('text');
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- elem.setAttribute('w', f2(w));
- elem.setAttribute('h', f2(h));
- elem.setAttribute('str', str);
-
- if (align != null)
- {
- elem.setAttribute('align', align);
- }
-
- if (valign != null)
- {
- elem.setAttribute('valign', valign);
- }
-
- elem.setAttribute('vertical', (vertical) ? '1' : '0');
- elem.setAttribute('wrap', (wrap) ? '1' : '0');
- elem.setAttribute('format', format);
- root.appendChild(elem);
- }
- },
-
- /**
- * Function: begin
- *
- * Starts a new path.
- */
- begin: function()
- {
- root.appendChild(doc.createElement('begin'));
- },
-
- /**
- * Function: moveTo
- *
- * Moves the current path the given coordinates.
- */
- moveTo: function(x, y)
- {
- var elem = doc.createElement('move');
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- root.appendChild(elem);
- },
-
- /**
- * Function: lineTo
- *
- * Adds a line to the current path.
- */
- lineTo: function(x, y)
- {
- var elem = doc.createElement('line');
- elem.setAttribute('x', f2(x));
- elem.setAttribute('y', f2(y));
- root.appendChild(elem);
- },
-
- /**
- * Function: quadTo
- *
- * Adds a quadratic curve to the current path.
- */
- quadTo: function(x1, y1, x2, y2)
- {
- var elem = doc.createElement('quad');
- elem.setAttribute('x1', f2(x1));
- elem.setAttribute('y1', f2(y1));
- elem.setAttribute('x2', f2(x2));
- elem.setAttribute('y2', f2(y2));
- root.appendChild(elem);
- },
-
- /**
- * Function: curveTo
- *
- * Adds a bezier curve to the current path.
- */
- curveTo: function(x1, y1, x2, y2, x3, y3)
- {
- var elem = doc.createElement('curve');
- elem.setAttribute('x1', f2(x1));
- elem.setAttribute('y1', f2(y1));
- elem.setAttribute('x2', f2(x2));
- elem.setAttribute('y2', f2(y2));
- elem.setAttribute('x3', f2(x3));
- elem.setAttribute('y3', f2(y3));
- root.appendChild(elem);
- },
-
- /**
- * Function: close
- *
- * Closes the current path.
- */
- close: function()
- {
- root.appendChild(doc.createElement('close'));
- },
-
- /**
- * Function: stroke
- *
- * Paints the outline of the current path.
- */
- stroke: function()
- {
- root.appendChild(doc.createElement('stroke'));
- },
-
- /**
- * Function: fill
- *
- * Fills the current path.
- */
- fill: function()
- {
- root.appendChild(doc.createElement('fill'));
- },
-
- /**
- * Function: fillstroke
- *
- * Fills and paints the outline of the current path.
- */
- fillAndStroke: function()
- {
- root.appendChild(doc.createElement('fillstroke'));
- },
-
- /**
- * Function: shadow
- *
- * Paints the current path as a shadow of the given color.
- */
- shadow: function(value, filled)
- {
- var elem = doc.createElement('shadow');
- elem.setAttribute('value', value);
-
- if (filled != null)
- {
- elem.setAttribute('filled', (filled) ? '1' : '0');
- }
-
- root.appendChild(elem);
- },
-
- /**
- * Function: clip
- *
- * Uses the current path for clipping.
- */
- clip: function()
- {
- root.appendChild(doc.createElement('clip'));
- }
- };
-
-}; \ No newline at end of file
diff --git a/src/js/util/mxXmlRequest.js b/src/js/util/mxXmlRequest.js
deleted file mode 100644
index 0ac55ed..0000000
--- a/src/js/util/mxXmlRequest.js
+++ /dev/null
@@ -1,425 +0,0 @@
-/**
- * $Id: mxXmlRequest.js,v 1.38 2012-04-22 10:16:23 gaudenz Exp $
- * Copyright (c) 2006-2010, JGraph Ltd
- */
-/**
- * Class: mxXmlRequest
- *
- * XML HTTP request wrapper. See also: <mxUtils.get>, <mxUtils.post> and
- * <mxUtils.load>. This class provides a cross-browser abstraction for Ajax
- * requests.
- *
- * Encoding:
- *
- * For encoding parameter values, the built-in encodeURIComponent JavaScript
- * method must be used. For automatic encoding of post data in <mxEditor> the
- * <mxEditor.escapePostData> switch can be set to true (default). The encoding
- * will be carried out using the conte type of the page. That is, the page
- * containting the editor should contain a meta tag in the header, eg.
- * <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- *
- * Example:
- *
- * (code)
- * var onload = function(req)
- * {
- * mxUtils.alert(req.getDocumentElement());
- * }
- *
- * var onerror = function(req)
- * {
- * mxUtils.alert(req.getStatus());
- * }
- * new mxXmlRequest(url, 'key=value').send(onload, onerror);
- * (end)
- *
- * Sends an asynchronous POST request to the specified URL.
- *
- * Example:
- *
- * (code)
- * var req = new mxXmlRequest(url, 'key=value', 'POST', false);
- * req.send();
- * mxUtils.alert(req.getDocumentElement());
- * (end)
- *
- * Sends a synchronous POST request to the specified URL.
- *
- * Example:
- *
- * (code)
- * var encoder = new mxCodec();
- * var result = encoder.encode(graph.getModel());
- * var xml = encodeURIComponent(mxUtils.getXml(result));
- * new mxXmlRequest(url, 'xml='+xml).send();
- * (end)
- *
- * Sends an encoded graph model to the specified URL using xml as the
- * parameter name. The parameter can then be retrieved in C# as follows:
- *
- * (code)
- * string xml = HttpUtility.UrlDecode(context.Request.Params["xml"]);
- * (end)
- *
- * Or in Java as follows:
- *
- * (code)
- * String xml = URLDecoder.decode(request.getParameter("xml"), "UTF-8").replace("\n", "&#xa;");
- * (end)
- *
- * Note that the linefeeds should only be replaced if the XML is
- * processed in Java, for example when creating an image.
- *
- * Constructor: mxXmlRequest
- *
- * Constructs an XML HTTP request.
- *
- * Parameters:
- *
- * url - Target URL of the request.
- * params - Form encoded parameters to send with a POST request.
- * method - String that specifies the request method. Possible values are
- * POST and GET. Default is POST.
- * async - Boolean specifying if an asynchronous request should be used.
- * Default is true.
- * username - String specifying the username to be used for the request.
- * password - String specifying the password to be used for the request.
- */
-function mxXmlRequest(url, params, method, async, username, password)
-{
- this.url = url;
- this.params = params;
- this.method = method || 'POST';
- this.async = (async != null) ? async : true;
- this.username = username;
- this.password = password;
-};
-
-/**
- * Variable: url
- *
- * Holds the target URL of the request.
- */
-mxXmlRequest.prototype.url = null;
-
-/**
- * Variable: params
- *
- * Holds the form encoded data for the POST request.
- */
-mxXmlRequest.prototype.params = null;
-
-/**
- * Variable: method
- *
- * Specifies the request method. Possible values are POST and GET. Default
- * is POST.
- */
-mxXmlRequest.prototype.method = null;
-
-/**
- * Variable: async
- *
- * Boolean indicating if the request is asynchronous.
- */
-mxXmlRequest.prototype.async = null;
-
-/**
- * Variable: binary
- *
- * Boolean indicating if the request is binary. This option is ignored in IE.
- * In all other browsers the requested mime type is set to
- * text/plain; charset=x-user-defined. Default is false.
- */
-mxXmlRequest.prototype.binary = false;
-
-/**
- * Variable: username
- *
- * Specifies the username to be used for authentication.
- */
-mxXmlRequest.prototype.username = null;
-
-/**
- * Variable: password
- *
- * Specifies the password to be used for authentication.
- */
-mxXmlRequest.prototype.password = null;
-
-/**
- * Variable: request
- *
- * Holds the inner, browser-specific request object.
- */
-mxXmlRequest.prototype.request = null;
-
-/**
- * Function: isBinary
- *
- * Returns <binary>.
- */
-mxXmlRequest.prototype.isBinary = function()
-{
- return this.binary;
-};
-
-/**
- * Function: setBinary
- *
- * Sets <binary>.
- */
-mxXmlRequest.prototype.setBinary = function(value)
-{
- this.binary = value;
-};
-
-/**
- * Function: getText
- *
- * Returns the response as a string.
- */
-mxXmlRequest.prototype.getText = function()
-{
- return this.request.responseText;
-};
-
-/**
- * Function: isReady
- *
- * Returns true if the response is ready.
- */
-mxXmlRequest.prototype.isReady = function()
-{
- return this.request.readyState == 4;
-};
-
-/**
- * Function: getDocumentElement
- *
- * Returns the document element of the response XML document.
- */
-mxXmlRequest.prototype.getDocumentElement = function()
-{
- var doc = this.getXml();
-
- if (doc != null)
- {
- return doc.documentElement;
- }
-
- return null;
-};
-
-/**
- * Function: getXml
- *
- * Returns the response as an XML document. Use <getDocumentElement> to get
- * the document element of the XML document.
- */
-mxXmlRequest.prototype.getXml = function()
-{
- var xml = this.request.responseXML;
-
- // Handles missing response headers in IE, the first condition handles
- // the case where responseXML is there, but using its nodes leads to
- // type errors in the mxCellCodec when putting the nodes into a new
- // document. This happens in IE9 standards mode and with XML user
- // objects only, as they are used directly as values in cells.
- if (document.documentMode >= 9 || xml == null || xml.documentElement == null)
- {
- xml = mxUtils.parseXml(this.request.responseText);
- }
-
- return xml;
-};
-
-/**
- * Function: getText
- *
- * Returns the response as a string.
- */
-mxXmlRequest.prototype.getText = function()
-{
- return this.request.responseText;
-};
-
-/**
- * Function: getStatus
- *
- * Returns the status as a number, eg. 404 for "Not found" or 200 for "OK".
- * Note: The NS_ERROR_NOT_AVAILABLE for invalid responses cannot be cought.
- */
-mxXmlRequest.prototype.getStatus = function()
-{
- return this.request.status;
-};
-
-/**
- * Function: create
- *
- * Creates and returns the inner <request> object.
- */
-mxXmlRequest.prototype.create = function()
-{
- if (window.XMLHttpRequest)
- {
- return function()
- {
- var req = new XMLHttpRequest();
-
- // TODO: Check for overrideMimeType required here?
- if (this.isBinary() && req.overrideMimeType)
- {
- req.overrideMimeType('text/plain; charset=x-user-defined');
- }
-
- return req;
- };
- }
- else if (typeof(ActiveXObject) != "undefined")
- {
- return function()
- {
- // TODO: Implement binary option
- return new ActiveXObject("Microsoft.XMLHTTP");
- };
- }
-}();
-
-/**
- * Function: send
- *
- * Send the <request> to the target URL using the specified functions to
- * process the response asychronously.
- *
- * Parameters:
- *
- * onload - Function to be invoked if a successful response was received.
- * onerror - Function to be called on any error.
- */
-mxXmlRequest.prototype.send = function(onload, onerror)
-{
- this.request = this.create();
-
- if (this.request != null)
- {
- if (onload != null)
- {
- this.request.onreadystatechange = mxUtils.bind(this, function()
- {
- if (this.isReady())
- {
- onload(this);
- this.onreadystatechaange = null;
- }
- });
- }
-
- this.request.open(this.method, this.url, this.async,
- this.username, this.password);
- this.setRequestHeaders(this.request, this.params);
- this.request.send(this.params);
- }
-};
-
-/**
- * Function: setRequestHeaders
- *
- * Sets the headers for the given request and parameters. This sets the
- * content-type to application/x-www-form-urlencoded if any params exist.
- *
- * Example:
- *
- * (code)
- * request.setRequestHeaders = function(request, params)
- * {
- * if (params != null)
- * {
- * request.setRequestHeader('Content-Type',
- * 'multipart/form-data');
- * request.setRequestHeader('Content-Length',
- * params.length);
- * }
- * };
- * (end)
- *
- * Use the code above before calling <send> if you require a
- * multipart/form-data request.
- */
-mxXmlRequest.prototype.setRequestHeaders = function(request, params)
-{
- if (params != null)
- {
- request.setRequestHeader('Content-Type',
- 'application/x-www-form-urlencoded');
- }
-};
-
-/**
- * Function: simulate
- *
- * Creates and posts a request to the given target URL using a dynamically
- * created form inside the given document.
- *
- * Parameters:
- *
- * docs - Document that contains the form element.
- * target - Target to send the form result to.
- */
-mxXmlRequest.prototype.simulate = function(doc, target)
-{
- doc = doc || document;
- var old = null;
-
- if (doc == document)
- {
- old = window.onbeforeunload;
- window.onbeforeunload = null;
- }
-
- var form = doc.createElement('form');
- form.setAttribute('method', this.method);
- form.setAttribute('action', this.url);
-
- if (target != null)
- {
- form.setAttribute('target', target);
- }
-
- form.style.display = 'none';
- form.style.visibility = 'hidden';
-
- var pars = (this.params.indexOf('&') > 0) ?
- this.params.split('&') :
- this.params.split();
-
- // Adds the parameters as textareas to the form
- for (var i=0; i<pars.length; i++)
- {
- var pos = pars[i].indexOf('=');
-
- if (pos > 0)
- {
- var name = pars[i].substring(0, pos);
- var value = pars[i].substring(pos+1);
-
- var textarea = doc.createElement('textarea');
- textarea.setAttribute('name', name);
- value = value.replace(/\n/g, '&#xa;');
-
- var content = doc.createTextNode(value);
- textarea.appendChild(content);
- form.appendChild(textarea);
- }
- }
-
- doc.body.appendChild(form);
- form.submit();
- doc.body.removeChild(form);
-
- if (old != null)
- {
- window.onbeforeunload = old;
- }
-};