Document: API Specification

Overview:

  This JavaScript library is divided into 8 packages. The top-level <mxClient>
  class includes (or dynamically imports) everything else. The current version
  is stored in <mxClient.VERSION>.

  The *editor* package provides the classes required to implement a diagram
  editor. The main class in this package is <mxEditor>.
  
  The *view* and *model* packages implement the graph component, represented
  by <mxGraph>. It refers to a <mxGraphModel> which contains <mxCell>s and
  caches the state of the cells in a <mxGraphView>. The cells are painted
  using a <mxCellRenderer> based on the appearance defined in <mxStylesheet>.
  Undo history is implemented in <mxUndoManager>. To display an icon on the
  graph, <mxCellOverlay> may be used. Validation rules are defined with
  <mxMultiplicity>.
  
  The *handler*, *layout* and *shape* packages contain event listeners,
  layout algorithms and shapes, respectively. The graph event listeners
  include <mxRubberband> for rubberband selection, <mxTooltipHandler>
  for tooltips and <mxGraphHandler> for  basic cell modifications.
  <mxCompactTreeLayout> implements a tree layout algorithm, and the 
  shape package provides various shapes, which are subclasses of
  <mxShape>.
  
  The *util* package provides utility classes including <mxClipboard> for
  copy-paste, <mxDatatransfer> for drag-and-drop, <mxConstants> for keys and
  values of stylesheets, <mxEvent> and <mxUtils> for cross-browser
  event-handling and general purpose functions, <mxResources> for
  internationalization and <mxLog> for console output.

  The *io* package implements a generic <mxObjectCodec> for turning
  JavaScript objects into XML. The main class is <mxCodec>.
  <mxCodecRegistry> is the global registry for custom codecs.
  
Events:

  There are three different types of events, namely native DOM events,
  <mxEventObjects> which are fired in an <mxEventSource>, and <mxMouseEvents>
  which are fired in <mxGraph>.

  Some helper methods for handling native events are provided in <mxEvent>. It
  also takes care of resolving cycles between DOM nodes and JavaScript event
  handlers, which can lead to memory leaks in IE6.
  
  Most custom events in mxGraph are implemented using <mxEventSource>. Its
  listeners are functions that take a sender and <mxEventObject>. Additionally,
  the <mxGraph> class fires special <mxMouseEvents> which are handled using
  mouse listeners, which are objects that provide a mousedown, mousemove and
  mouseup method.
  
  Events in <mxEventSource> are fired using <mxEventSource.fireEvent>.
  Listeners are added and removed using <mxEventSource.addListener> and
  <mxEventSource.removeListener>. <mxMouseEvents> in <mxGraph> are fired using
  <mxGraph.fireMouseEvent>. Listeners are added and removed using
  <mxGraph.addMouseListener> and <mxGraph.removeMouseListener>, respectively.
  
Key bindings:
  
  The following key bindings are defined for mouse events in the client across
  all browsers and platforms:
  
  - Control-Drag: Duplicates (clones) selected cells
  - Shift-Rightlick: Shows the context menu
  - Alt-Click: Forces rubberband (aka. marquee)
  - Control-Select: Toggles the selection state
  - Shift-Drag: Constrains the offset to one direction
  - Shift-Control-Drag: Panning (also Shift-Rightdrag)
  
Configuration:

  The following global variables may be defined before the client is loaded to
  specify its language or base path, respectively.
  
  - mxBasePath: Specifies the path in <mxClient.basePath>.
  - mxImageBasePath: Specifies the path in <mxClient.imageBasePath>.
  - mxLanguage: Specifies the language for resources in <mxClient.language>.
  - mxDefaultLanguage: Specifies the default language in <mxClient.defaultLanguage>.
  - mxLoadResources: Specifies if any resources should be loaded. Default is true.
  - mxLoadStylesheets: Specifies if any stylesheets should be loaded. Default is true.

Reserved Words:

  The mx prefix is used for all classes and objects in mxGraph. The mx prefix
  can be seen as the global namespace for all JavaScript code in mxGraph. The
  following fieldnames should not be used in objects.
  
  - *mxObjectId*: If the object is used with mxObjectIdentity
  - *as*: If the object is a field of another object
  - *id*: If the object is an idref in a codec
  - *mxListenerList*: Added to DOM nodes when used with <mxEvent>
  - *window._mxDynamicCode*: Temporarily used to load code in Safari and Chrome
  (see <mxClient.include>).
  - *_mxJavaScriptExpression*: Global variable that is temporarily used to
  evaluate code in Safari, Opera, Firefox 3 and IE (see <mxUtils.eval>).

Files:

  The library contains these relative filenames. All filenames are relative
  to <mxClient.basePath>.
  
Built-in Images:
  
  All images are loaded from the <mxClient.imageBasePath>, 
  which you can change to reflect your environment. The image variables can 
  also be changed individually.
  
  - mxGraph.prototype.collapsedImage
  - mxGraph.prototype.expandedImage
  - mxGraph.prototype.warningImage
  - mxWindow.prototype.closeImage
  - mxWindow.prototype.minimizeImage
  - mxWindow.prototype.normalizeImage
  - mxWindow.prototype.maximizeImage
  - mxWindow.prototype.resizeImage
  - mxPopupMenu.prototype.submenuImage
  - mxUtils.errorImage
  - mxConstraintHandler.prototype.pointImage

  The basename of the warning image (images/warning without extension) used in 
  <mxGraph.setCellWarning> is defined in <mxGraph.warningImage>.

Resources:
  
  The <mxEditor> and <mxGraph> classes add the following resources to
  <mxResources> at class loading time:

  - resources/editor*.properties
  - resources/graph*.properties
  
  By default, the library ships with English and German resource files.

Images:

  Recommendations for using images. Use GIF images (256 color palette) in HTML
  elements (such as the toolbar and context menu), and PNG images (24 bit) for
  all images which appear inside the graph component.
  
  - For PNG images inside HTML elements, Internet Explorer will ignore any 
    transparency information.
  - For GIF images inside the graph, Firefox on the Mac will display strange 
    colors. Furthermore, only the first image for animated GIFs is displayed 
    on the Mac.
    
  For faster image rendering during application runtime, images can be
  prefetched using the following code:
  
  (code)
  var image = new Image();
  image.src = url_to_image;
  (end)

Deployment:

  The client is added to the page using the following script tag inside the
  head of a document:

  (code)
  <script type="text/javascript" src="js/mxClient.js"></script>
  (end)

  The deployment version of the mxClient.js file contains all required code
  in a single file. For deployment, the complete javascript/src directory is
  required.
  
Source Code:

  If you are a source code customer and you wish to develop using the 
  full source code, the commented source code is shipped in the 
  javascript/devel/source.zip file. It contains one file for each class 
  in mxGraph. To use the source code the source.zip file must be 
  uncompressed and the mxClient.js URL in the HTML  page must be changed 
  to reference the uncompressed mxClient.js from the source.zip file.

Compression:
 
  When using Apache2 with mod_deflate, you can use the following directive
  in src/js/.htaccess to speedup the loading of the JavaScript sources:
  
  (code)
  SetOutputFilter DEFLATE
  (end)

Classes:
  
  There are two types of "classes" in mxGraph: classes and singletons (where
  only one instance exists). Singletons are mapped to global objects where the
  variable name equals the classname. For example mxConstants is an object with
  all the constants defined as object fields. Normal classes are mapped to a
  constructor function and a prototype which defines the instance fields and
  methods. For example, <mxEditor> is a function and mxEditor.prototype is the
  prototype for the object that the mxEditor function creates. The mx prefix is
  a convention that is used for all classes in the mxGraph package to avoid
  conflicts with other objects in the global namespace.

Subclassing:

  For subclassing, the superclass must provide a constructor that is either
  parameterless or handles an invocation with no arguments. Furthermore, the
  special constructor field must be redefined after extending the prototype.
  For example, the superclass of mxEditor is <mxEventSource>. This is
  represented in JavaScript by first "inheriting" all fields and methods from
  the superclass by assigning the prototype to an instance of the superclass,
  eg. mxEditor.prototype = new mxEventSource() and redefining the constructor
  field using mxEditor.prototype.constructor = mxEditor. The latter rule is
  applied so that the type of an object can be retrieved via the name of it�s
  constructor using mxUtils.getFunctionName(obj.constructor).

Constructor:

  For subclassing in mxGraph, the same scheme should be applied. For example,
  for subclassing the <mxGraph> class, first a constructor must be defined for
  the new class. The constructor calls the super constructor with any arguments
  that it may have using the call function on the mxGraph function object,
  passing along explitely each argument:

  (code)
  function MyGraph(container)
  {
    mxGraph.call(this, container);
  }
  (end)
  
  The prototype of MyGraph inherits from mxGraph as follows. As usual, the
  constructor is redefined after extending the superclass:

  (code)
  MyGraph.prototype = new mxGraph();
  MyGraph.prototype.constructor = MyGraph;
  (end)
  
  You may want to define the codec associated for the class after the above
  code. This code will be executed at class loading time and makes sure the
  same codec is used to encode instances of mxGraph and MyGraph.

  (code)
  var codec = mxCodecRegistry.getCodec(mxGraph);
  codec.template = new MyGraph();
  mxCodecRegistry.register(codec);
  (end)
  
Functions:

  In the prototype for MyGraph, functions of mxGraph can then be extended as
  follows.
  
  (code)
  MyGraph.prototype.isCellSelectable = function(cell)
  {
    var selectable = mxGraph.prototype.isSelectable.apply(this, arguments);

    var geo = this.model.getGeometry(cell);
    return selectable && (geo == null || !geo.relative);
  }
  (end)
  
  The supercall in the first line is optional. It is done using the apply
  function on the isSelectable function object of the mxGraph prototype, using
  the special this and arguments variables as parameters. Calls to the
  superclass function are only possible if the function is not replaced in the
  superclass as follows, which is another way of �subclassing� in JavaScript.

  (code)
  mxGraph.prototype.isCellSelectable = function(cell)
  {
    var geo = this.model.getGeometry(cell);
    return selectable &&
        (geo == null ||
        !geo.relative);
  }
  (end)

  The above scheme is useful if a function definition needs to be replaced
  completely.
  
  In referenceId to add new functions and fields to the subclass, the following code
  is used. The example below adds a new function to return the XML
  representation of the graph model:

  (code)
  MyGraph.prototype.getXml = function()
  {
    var enc = new mxCodec();
    return enc.encode(this.getModel());
  }
  (end)
  
Variables:

  Likewise, a new field is declared and defined as follows.

  (code)
  MyGraph.prototype.myField = 'Hello, World!';
  (end)
  
  Note that the value assigned to myField is created only once, that is, all
  instances of MyGraph share the same value. If you require instance-specific
  values, then the field must be defined in the constructor instead.

  (code)
  function MyGraph(container)
  {
    mxGraph.call(this, container);
    
    this.myField = new Array();
  }
  (end)

  Finally, a new instance of MyGraph is created using the following code, where
  container is a DOM node that acts as a container for the graph view:

  (code)
  var graph = new MyGraph(container);
  (end)
