summaryrefslogtreecommitdiff
path: root/src/js/util/mxToolbar.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/js/util/mxToolbar.js')
-rw-r--r--src/js/util/mxToolbar.js528
1 files changed, 528 insertions, 0 deletions
diff --git a/src/js/util/mxToolbar.js b/src/js/util/mxToolbar.js
new file mode 100644
index 0000000..754e6b3
--- /dev/null
+++ b/src/js/util/mxToolbar.js
@@ -0,0 +1,528 @@
+/**
+ * $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();
+ }
+};