Annotation of kupuMPIWG/doc/JSAPI.txt, revision 1.1.1.1

1.1       dwinter     1: ==================
                      2: Kupu API reference
                      3: ==================
                      4: 
                      5: Kupu can be customized in several ways: controls can be customized or
                      6: hidden using CSS, elements can be modified using TAL (modifying the
                      7: macro) and more advanced customization can be done by extending (or
                      8: modifying, although this is usually not advised) the JavaScript,
                      9: either in the macro or in seperate .js files. This document will give
                     10: a short description of how to use and extend the Kupu JavaScripts and
                     11: a reference of the public Kupu API.
                     12: 
                     13: 
                     14: How to use Kupu
                     15: ===============
                     16: 
                     17: The KupuEditor and KupuUI objects
                     18: ---------------------------------
                     19: 
                     20: Generally the body tag of the document will contain a call to the
                     21: initKupu function. This is the glue code of Kupu, here's where all the
                     22: objects get instantiated and tied together to form the
                     23: application. When doing large customizations, this function will
                     24: usually be overwritten or extended. The default implementation takes 1
                     25: argument (the id of the iframe it will control) and return a reference
                     26: to the core object, KupuEditor.
                     27: 
                     28:     kupu = initKupu("kupu-editorframe");
                     29: 
                     30: The KupuEditor object (in this case called 'kupu') will be the object
                     31: with which you can control the iframe, the UI and
                     32: tools. Customizations should generally not involve extending the
                     33: KupuEditor object, but rather by plugging in new tools. Usage is quite
                     34: straightforward, for a reference of the public methods see below.
                     35: 
                     36: The UI object holds event handlers for the toolbar buttons. This is a
                     37: core Kupu object and should generally be left untouched. The event
                     38: handlers, although the preferred method of attaching events is dynamic
                     39: from inside the objects rather then from HTML, should be attached to
                     40: the buttons from the template (this made the code a lot cleaner, it
                     41: might change in future versions though). Therefore a reference to the
                     42: UI object must be retrieved from the KupuEditor object using the
                     43: getTool method:
                     44: 
                     45:     kupuui = kupu.getTool('ui');
                     46: 
                     47: Note that the reason why this method is called getTool is that the UI
                     48: is essentially treated as a tool, an Kupu plugin (more about those 
                     49: later). The string 'ui' is the id by which the object is registered 
                     50: in initKupu. Usually the ui object and the button bindings can just 
                     51: be copied from the kupu.html file (if you don't use ZPT macros in the 
                     52: kupumacros.html file).
                     53: 
                     54: Tools and extending Kupu
                     55: ------------------------
                     56: 
                     57: Tools are extensions of Kupu. A tool can be seen as a plugin in the
                     58: Kupu editor, providing additional functionality. Tools will usually be
                     59: the objects that will be extended or overridden.
                     60: 
                     61: A tool should usually subclass KupuTool and will usually override the
                     62: 'initialize' method (which will be called when the tool is registered to
                     63: the KupuEditor object) and the updateState method (which will be
                     64: called on click and certain keyup events on the iframe so that the
                     65: state of the tool (e.g. add or edit mode) can be controlled. Events on
                     66: elements should generally be bound to the methods from inside the
                     67: tools.
                     68: 
                     69: The initialize method will be called with a single argument, a
                     70: reference to the editor object. The method should at least store that
                     71: reference on this. Note that if you don't override the method, the
                     72: KupuObject class provides a default implementation that does exactly
                     73: that. The updateState method will be called with 2 arguments, the
                     74: first is a reference to the current selected element and the second
                     75: the event object.  If the tool doesn't want to react to state changes,
                     76: it doesn't have to override the method: the superclass will provide a
                     77: dummy implementation.
                     78: 
                     79: Usually a tool will be created and registered inside initKupu,
                     80: although it can also be done from an external document or the HTML. An
                     81: object is registered to the KupuEditor object as such:
                     82: 
                     83:     var myTool = new MyTool();
                     84:     kupu.registerTool('my-tool', myTool);
                     85: 
                     86: As shown above, the getTool method of the KupuEditor object can be
                     87: used to retrieve a reference to the tool later on (so there's no need
                     88: to store a reference in the global namespace or anything).
                     89: 
                     90: For a nice, small example of a tool, see the PathTool in the
                     91: kupubasetools.js file. 
                     92: 
                     93: ToolBoxes and larger Tools
                     94: --------------------------
                     95: 
                     96: Most tools will both harbour functionality and stuff like event handlers 
                     97: and references to HTML elements. To make sure the tool can be used in as
                     98: much different situations as possible, it is advised to split it up in 2
                     99: pieces, one for the logic and one for the UI-related methods and 
                    100: attributes.
                    101: The standard way for doing this is using a subclass of KupuTool for the
                    102: tool and a subclass of KupuToolBox for the UI-part, and register the ToolBox
                    103: to the Tool using the registerToolBox method. It is not mandatory to use
                    104: this baseclass, not even to use registerToolBox, but it should be sufficient.
                    105: 
                    106: For a more complex (and useful) example of a Tool combined with a ToolBox 
                    107: see the LinkTool.
                    108: 
                    109: Public API
                    110: ==========
                    111: 
                    112: Helper functions (kupuhelpers.js)
                    113: ---------------------------------
                    114: 
                    115: Methods on KupuObject (kupueditor.js)
                    116: -------------------------------------
                    117: 
                    118:     registerTool(id, tool) 
                    119:         - register a tool
                    120: 
                    121:     getTool(id)
                    122:         - return a previously registered tool
                    123: 
                    124:     registerFilter(filter)
                    125:         - register a ContentFilter
                    126: 
                    127:     updateState(event)
                    128:         - trigger the updateState machinery
                    129: 
                    130:     saveDocument()
                    131:         - save the document
                    132: 
                    133:     prepareForm(form[, fieldid)
                    134:         - add a hidden field to form with the id fieldid (defaults
                    135:             to 'kupu'), should be called before the form is subbmited
                    136:             to make the Kupu content get sent to the server using POST.
                    137: 
                    138:     execCommand(command[, param])
                    139:         - perform an execCommand on the editor iframe
                    140: 
                    141:     getSelectedNode()
                    142:         - returns the currently selected node
                    143: 
                    144:     getNearestParentOfType(node, type)
                    145:         - returns the nearest parent of node (or node itself) of 
                    146:             element type
                    147:             
                    148:     getDocument()
                    149:         - returns the document object
                    150: 
                    151:     getInnerDocument()
                    152:         - returns the iframe.contentWindow.document
                    153: 
                    154:     insertNodeAtSelection(node)
                    155:         - insert a new node on the cursor location
                    156: 
                    157:     logMessage(message, severity)
                    158:         - log a message with the logger, message is the message to log and
                    159:             severity is an integer that can be 0 (default) for debug messages,
                    160:             1 for warnings and 2 for errors (different loggers can be plugged
                    161:             into Kupu, but a severity of 2 will usually make the logger raise
                    162:             an exception).
                    163: 
                    164:     getBrowserName()
                    165:         - return the name of the client browser, will return IE, Mozilla
                    166:             or raise an exception if the client uses a non-supported one.
                    167: 
                    168:     getXMLBody(transform)
                    169:         - transform is a Sarissa node.
                    170:           Returns the body tag (or body tags if more than one) as text.
                    171: 
                    172:     getHTMLBody()
                    173:         - returns the body node as text (including <body> tag). Will return all
                    174:           body nodes if there are multiple bodies.
                    175: 
                    176:     setHTMLBody(text)
                    177:         - sets the contents of the body to the specified HTML text
                    178:           (which should not include a body tag). If there are multiple
                    179:           bodies they are all replaced.
                    180: 
                    181: Methods on tools (kupubasetools.js)
                    182: -----------------------------------
                    183: 
                    184:     KupuTool - the baseclass for tools
                    185: 
                    186:         initialize(editor)
                    187:             - initialize the tool
                    188: 
                    189:         updateState(selectedNode, event)
                    190:             - update the state of the tool if required
                    191: 
                    192:         registerToolBox(id, toolbox)
                    193:             - register a ui object (ToolBox)
                    194: 
                    195:     KupuToolBox - the baseclass for toolboxes (view elements of tools)
                    196: 
                    197:         initialize(tool, editor)
                    198:             - initialize the toolbox
                    199: 
                    200:         updateState(selNode, event)
                    201:             - update the state of the UI according to the iframe's state
                    202: 
                    203: Tool implementations (depending on the complexity of the tool a tool either
                    204:     exists of a single Tool class, or of a Tool and a ToolBox class, the 
                    205:     ToolBox classes will only harbour event handlers and such so will
                    206:     therefore not be documented):
                    207: 
                    208:     KupuUI - the toolbar, only contains event handlers and generic button
                    209:         handlers
                    210: 
                    211:         basicButtonHandler(action)
                    212:             - handle a basic action like Bold or Italic
                    213: 
                    214:         saveButtonHandler()
                    215: 
                    216:         saveAndExitButtonHandler()
                    217: 
                    218:         cutButtonHandler()
                    219: 
                    220:         copyButtonHandler()
                    221: 
                    222:         pasteButtonHandler()
                    223:             - basic button handlers for a specific action
                    224: 
                    225:         setTextStyle(style)
                    226:             - set the style of the current text block
                    227: 
                    228:     ColorchooserTool - the color picker (part of the toolbar)
                    229: 
                    230:         openFgColorChooser()
                    231:             - open the colorchooser to pick a foreground color
                    232: 
                    233:         openHlColorChooser()
                    234:             - open the colorchooser to pick a background color
                    235: 
                    236:         chooseColor()
                    237:             - event handler for a click inside the colorchooser
                    238: 
                    239:         show()
                    240:             - show the colorchooser
                    241: 
                    242:         hide()
                    243:             - hide the colorchooser
                    244: 
                    245:         createColorChooser(table)
                    246:             - create the colorchooser and inside the table
                    247: 
                    248:     PropertyTool - set the title and metadata of a document
                    249: 
                    250:         updateProperties()
                    251:             - set the properties on the document from the form data
                    252: 
                    253:     LinkTool - add and edit hyperlinks
                    254: 
                    255:         createLink(url, type, name, target, title)
                    256:             - create a link around the current selection
                    257: 
                    258:         deleteLink()
                    259:             - delete the current link, if any
                    260: 
                    261:     ImageTool - add and edit images
                    262: 
                    263:         createImage(url, alttext, imgclass)
                    264:             - create an image
                    265: 
                    266:         setImageClass(imgclass)
                    267:             - set the class of the selected image
                    268: 
                    269:     TableTool - add and edit tables
                    270: 
                    271:         addPlainTable() 
                    272:             - add a table with default settings
                    273: 
                    274:         createTable(rows, cols, makeHeader, tableclass)
                    275:             - create a table
                    276: 
                    277:         addTableRow()
                    278:             - add a row underneath the current selected one
                    279: 
                    280:         delTableRow()
                    281:             - delete the current table row
                    282: 
                    283:         addTableColumn()
                    284:             - add a column to the right of the current one
                    285: 
                    286:         delTableColumn()
                    287:             - delete the current table column
                    288: 
                    289:         setColumnAlign()
                    290:             - set the alignment of the current column according to the form
                    291:               data
                    292: 
                    293:         setTableClass()
                    294:             - set the table class according to the form data
                    295: 
                    296:     ListTool - manage lists (part of the toolbar)
                    297: 
                    298:         addUnorderedList()
                    299:             - add an unordered list
                    300: 
                    301:         addOrderedList()
                    302:             - add an ordered list
                    303: 
                    304:         setUnorderedListStyle()
                    305:             - set the style of the nearest unordered list parent according to
                    306:               the form data
                    307: 
                    308:         setOrderedListStyle()
                    309:             - set the style of the nearest ordered list parent according to
                    310:               the form data
                    311: 
                    312:     ShowPathTool - show the path to the current node in the status bar
                    313: 
                    314:         no methods besides updateState()
                    315: 
                    316: Additional helper functions, objects and methods:
                    317: -------------------------------------------------
                    318: 
                    319:     addEventHandler(element, event, method, context)
                    320:         - bind <method> to <event> on <element>, using <context> as context
                    321:             ('this' inside the method body).
                    322: 
                    323:     removeEventHandler(element, event, method)
                    324:         - remove binding of <method> for <event> from <element>
                    325: 
                    326:     selectSelectItem(select, item)
                    327:         - select item <item> from HTML optionlist <select>
                    328: 
                    329:     loadDictFromXML(document, islandid)
                    330:         - load configuration values from an XML chunk
                    331: 
                    332:     Logger objects:
                    333: 
                    334:         When the KupuEditor gets initialized, it expects a logging
                    335:         object with one method (log(message, severity)) to be passed
                    336:         along as an argument. Two loggers are defined: 1 called
                    337:         DebugLogger that will alert all messages and 1 called
                    338:         PlainLogger that should be instantiated with the ids of the
                    339:         element in which debug messages will be shown and the maximum
                    340:         number of messages as arguments, that will show all debug
                    341:         messages and warnings to the debug window and will raise an
                    342:         exception for all errors.
                    343: 
                    344:     ContextFixer:
                    345:         
                    346:         A helper class to fix the contexts in methods when called in a
                    347:         specific way (usually when used as an event handler). In some
                    348:         cases the 'this' variable inside functions can change, this
                    349:         class helps in resetting it to the object on which the method
                    350:         is defined (and actually it can help in setting a different
                    351:         context as well, although this will not generally be
                    352:         advised). For more information see the source.
                    353: 
                    354:     Timer:
                    355:         
                    356:         A herlper class to overcome a problem with
                    357:         window.setTimeout(), this has the problems that it isn't
                    358:         usable to call object methods without very nasty complications
                    359:         and that it doesn't allow usage of variable references as
                    360:         arguments (both because the argument that is executed is a
                    361:         string that will be evalled in global context). For more
                    362:         information see the source.
                    363: 
                    364:     Array.prototype.contains(element):
                    365: 
                    366:         - a helper method added to the prototype of Array that will
                    367:           return true if element is in the array, false if it isn't.
                    368: 
                    369:     String.prototype.strip(string):
                    370: 
                    371:         - a helper method added to the prototype of String that strips
                    372:           all outer whitespace. The original string is not affected; a
                    373:           new instance of String is returned.

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>