You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2015/03/22 17:05:00 UTC
[08/54] [partial] camel git commit: CAMEL-7263: Remove not maintained
and deprecated camel-web module.
http://git-wip-us.apache.org/repos/asf/camel/blob/9f5e32db/components/camel-web/src/main/webapp/js/dojox/grid/DataGrid.js.uncompressed.js
----------------------------------------------------------------------
diff --git a/components/camel-web/src/main/webapp/js/dojox/grid/DataGrid.js.uncompressed.js b/components/camel-web/src/main/webapp/js/dojox/grid/DataGrid.js.uncompressed.js
deleted file mode 100644
index a76bfef..0000000
--- a/components/camel-web/src/main/webapp/js/dojox/grid/DataGrid.js.uncompressed.js
+++ /dev/null
@@ -1,9545 +0,0 @@
-/*
- Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
-*/
-
-/*
- This is a compiled version of Dojo, built for deployment and not for
- development. To get an editable version, please visit:
-
- http://dojotoolkit.org
-
- for documentation and information on getting the source.
-*/
-
-if(!dojo._hasResource["dijit._KeyNavContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit._KeyNavContainer"] = true;
-dojo.provide("dijit._KeyNavContainer");
-
-
-dojo.declare("dijit._KeyNavContainer",
- [dijit._Container],
- {
-
- // summary:
- // A _Container with keyboard navigation of its children.
- // description:
- // To use this mixin, call connectKeyNavHandlers() in
- // postCreate() and call startupKeyNavChildren() in startup().
- // It provides normalized keyboard and focusing code for Container
- // widgets.
-/*=====
- // focusedChild: [protected] Widget
- // The currently focused child widget, or null if there isn't one
- focusedChild: null,
-=====*/
-
- // tabIndex: Integer
- // Tab index of the container; same as HTML tabindex attribute.
- // Note then when user tabs into the container, focus is immediately
- // moved to the first item in the container.
- tabIndex: "0",
-
-
- _keyNavCodes: {},
-
- connectKeyNavHandlers: function(/*dojo.keys[]*/ prevKeyCodes, /*dojo.keys[]*/ nextKeyCodes){
- // summary:
- // Call in postCreate() to attach the keyboard handlers
- // to the container.
- // preKeyCodes: dojo.keys[]
- // Key codes for navigating to the previous child.
- // nextKeyCodes: dojo.keys[]
- // Key codes for navigating to the next child.
- // tags:
- // protected
-
- var keyCodes = this._keyNavCodes = {};
- var prev = dojo.hitch(this, this.focusPrev);
- var next = dojo.hitch(this, this.focusNext);
- dojo.forEach(prevKeyCodes, function(code){ keyCodes[code] = prev; });
- dojo.forEach(nextKeyCodes, function(code){ keyCodes[code] = next; });
- this.connect(this.domNode, "onkeypress", "_onContainerKeypress");
- this.connect(this.domNode, "onfocus", "_onContainerFocus");
- },
-
- startupKeyNavChildren: function(){
- // summary:
- // Call in startup() to set child tabindexes to -1
- // tags:
- // protected
- dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild"));
- },
-
- addChild: function(/*Widget*/ widget, /*int?*/ insertIndex){
- // summary:
- // Add a child to our _Container
- dijit._KeyNavContainer.superclass.addChild.apply(this, arguments);
- this._startupChild(widget);
- },
-
- focus: function(){
- // summary:
- // Default focus() implementation: focus the first child.
- this.focusFirstChild();
- },
-
- focusFirstChild: function(){
- // summary:
- // Focus the first focusable child in the container.
- // tags:
- // protected
- this.focusChild(this._getFirstFocusableChild());
- },
-
- focusNext: function(){
- // summary:
- // Focus the next widget or focal node (for widgets
- // with multiple focal nodes) within this container.
- // tags:
- // protected
- if(this.focusedChild && this.focusedChild.hasNextFocalNode
- && this.focusedChild.hasNextFocalNode()){
- this.focusedChild.focusNext();
- return;
- }
- var child = this._getNextFocusableChild(this.focusedChild, 1);
- if(child.getFocalNodes){
- this.focusChild(child, child.getFocalNodes()[0]);
- }else{
- this.focusChild(child);
- }
- },
-
- focusPrev: function(){
- // summary:
- // Focus the previous widget or focal node (for widgets
- // with multiple focal nodes) within this container.
- // tags:
- // protected
- if(this.focusedChild && this.focusedChild.hasPrevFocalNode
- && this.focusedChild.hasPrevFocalNode()){
- this.focusedChild.focusPrev();
- return;
- }
- var child = this._getNextFocusableChild(this.focusedChild, -1);
- if(child.getFocalNodes){
- var nodes = child.getFocalNodes();
- this.focusChild(child, nodes[nodes.length-1]);
- }else{
- this.focusChild(child);
- }
- },
-
- focusChild: function(/*Widget*/ widget, /*Node?*/ node){
- // summary:
- // Focus widget. Optionally focus 'node' within widget.
- // tags:
- // protected
- if(widget){
- if(this.focusedChild && widget !== this.focusedChild){
- this._onChildBlur(this.focusedChild);
- }
- this.focusedChild = widget;
- if(node && widget.focusFocalNode){
- widget.focusFocalNode(node);
- }else{
- widget.focus();
- }
- }
- },
-
- _startupChild: function(/*Widget*/ widget){
- // summary:
- // Set tabindex="-1" on focusable widgets so that we
- // can focus them programmatically and by clicking.
- // Connect focus and blur handlers.
- // tags:
- // private
- if(widget.getFocalNodes){
- dojo.forEach(widget.getFocalNodes(), function(node){
- dojo.attr(node, "tabindex", -1);
- this._connectNode(node);
- }, this);
- }else{
- var node = widget.focusNode || widget.domNode;
- if(widget.isFocusable()){
- dojo.attr(node, "tabindex", -1);
- }
- this._connectNode(node);
- }
- },
-
- _connectNode: function(/*Element*/ node){
- // summary:
- // Monitor focus and blur events on the node
- // tags:
- // private
- this.connect(node, "onfocus", "_onNodeFocus");
- this.connect(node, "onblur", "_onNodeBlur");
- },
-
- _onContainerFocus: function(evt){
- // summary:
- // Handler for when the container gets focus
- // description:
- // Initially the container itself has a tabIndex, but when it gets
- // focus, switch focus to first child...
- // tags:
- // private
-
- // Note that we can't use _onFocus() because switching focus from the
- // _onFocus() handler confuses the focus.js code
- // (because it causes _onFocusNode() to be called recursively)
-
- // focus bubbles on Firefox,
- // so just make sure that focus has really gone to the container
- if(evt.target !== this.domNode){ return; }
-
- this.focusFirstChild();
-
- // and then remove the container's tabIndex,
- // so that tab or shift-tab will go to the fields after/before
- // the container, rather than the container itself
- dojo.removeAttr(this.domNode, "tabIndex");
- },
-
- _onBlur: function(evt){
- // When focus is moved away the container, and it's descendant (popup) widgets,
- // then restore the container's tabIndex so that user can tab to it again.
- // Note that using _onBlur() so that this doesn't happen when focus is shifted
- // to one of my child widgets (typically a popup)
- if(this.tabIndex){
- dojo.attr(this.domNode, "tabindex", this.tabIndex);
- }
- // TODO: this.inherited(arguments);
- },
-
- _onContainerKeypress: function(evt){
- // summary:
- // When a key is pressed, if it's an arrow key etc. then
- // it's handled here.
- // tags:
- // private
- if(evt.ctrlKey || evt.altKey){ return; }
- var func = this._keyNavCodes[evt.charOrCode];
- if(func){
- func();
- dojo.stopEvent(evt);
- }
- },
-
- _onNodeFocus: function(evt){
- // summary:
- // Handler for onfocus event on a child node
- // tags:
- // private
-
- // record the child that has been focused
- var widget = dijit.getEnclosingWidget(evt.target);
- if(widget && widget.isFocusable()){
- this.focusedChild = widget;
- }
- dojo.stopEvent(evt);
- },
-
- _onNodeBlur: function(evt){
- // summary:
- // Handler for onblur event on a child node
- // tags:
- // private
- dojo.stopEvent(evt);
- },
-
- _onChildBlur: function(/*Widget*/ widget){
- // summary:
- // Called when focus leaves a child widget to go
- // to a sibling widget.
- // tags:
- // protected
- },
-
- _getFirstFocusableChild: function(){
- // summary:
- // Returns first child that can be focused
- return this._getNextFocusableChild(null, 1);
- },
-
- _getNextFocusableChild: function(child, dir){
- // summary:
- // Returns the next or previous focusable child, compared
- // to "child"
- // child: Widget
- // The current widget
- // dir: Integer
- // * 1 = after
- // * -1 = before
- if(child){
- child = this._getSiblingOfChild(child, dir);
- }
- var children = this.getChildren();
- for(var i=0; i < children.length; i++){
- if(!child){
- child = children[(dir>0) ? 0 : (children.length-1)];
- }
- if(child.isFocusable()){
- return child;
- }
- child = this._getSiblingOfChild(child, dir);
- }
- // no focusable child found
- return null;
- }
- }
-);
-
-}
-
-if(!dojo._hasResource["dijit.MenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.MenuItem"] = true;
-dojo.provide("dijit.MenuItem");
-
-
-
-
-
-dojo.declare("dijit.MenuItem",
- [dijit._Widget, dijit._Templated, dijit._Contained],
- {
- // summary:
- // A line item in a Menu Widget
-
- // Make 3 columns
- // icon, label, and expand arrow (BiDi-dependent) indicating sub-menu
- templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" waiRole=\"presentation\">\n\t\t<div dojoAttachPoint=\"arrowWrapper\" style=\"visibility: hidden\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuExpand\">\n\t\t\t<span class=\"dijitMenuExpandA11y\">+</span>\n\t\t</div>\n\t</td>\n</tr>\n",
-
- attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, {
- label: { node: "containerNode", type: "innerHTML" },
- iconClass: { node: "iconNode", type: "class" }
- }),
-
- // label: String
- // Menu text
- label: '',
-
- // iconClass: String
- // Class to apply to DOMNode to make it display an icon.
- iconClass: "",
-
- // accelKey: String
- // Text for the accelerator (shortcut) key combination.
- // Note that although Menu can display accelerator keys there
- // is no infrastructure to actually catch and execute these
- // accelerators.
- accelKey: "",
-
- // disabled: Boolean
- // If true, the menu item is disabled.
- // If false, the menu item is enabled.
- disabled: false,
-
- _fillContent: function(/*DomNode*/ source){
- // If button label is specified as srcNodeRef.innerHTML rather than
- // this.params.label, handle it here.
- if(source && !("label" in this.params)){
- this.attr('label', source.innerHTML);
- }
- },
-
- postCreate: function(){
- dojo.setSelectable(this.domNode, false);
- dojo.attr(this.containerNode, "id", this.id+"_text");
- dijit.setWaiState(this.domNode, "labelledby", this.id+"_text");
- },
-
- _onHover: function(){
- // summary:
- // Handler when mouse is moved onto menu item
- // tags:
- // protected
- dojo.addClass(this.domNode, 'dijitMenuItemHover');
- this.getParent().onItemHover(this);
- },
-
- _onUnhover: function(){
- // summary:
- // Handler when mouse is moved off of menu item,
- // possibly to a child menu, or maybe to a sibling
- // menuitem or somewhere else entirely.
- // tags:
- // protected
-
- // if we are unhovering the currently selected item
- // then unselect it
- dojo.removeClass(this.domNode, 'dijitMenuItemHover');
- this.getParent().onItemUnhover(this);
- },
-
- _onClick: function(evt){
- // summary:
- // Internal handler for click events on MenuItem.
- // tags:
- // private
- this.getParent().onItemClick(this, evt);
- dojo.stopEvent(evt);
- },
-
- onClick: function(/*Event*/ evt){
- // summary:
- // User defined function to handle clicks
- // tags:
- // callback
- },
-
- focus: function(){
- // summary:
- // Focus on this MenuItem
- try{
- dijit.focus(this.focusNode);
- }catch(e){
- // this throws on IE (at least) in some scenarios
- }
- },
-
- _onFocus: function(){
- // summary:
- // This is called by the focus manager when focus
- // goes to this MenuItem or a child menu.
- // tags:
- // protected
- this._setSelected(true);
-
- // TODO: this.inherited(arguments);
- },
-
- _setSelected: function(selected){
- // summary:
- // Indicate that this node is the currently selected one
- // tags:
- // private
-
- /***
- * TODO: remove this method and calls to it, when _onBlur() is working for MenuItem.
- * Currently _onBlur() gets called when focus is moved from the MenuItem to a child menu.
- * That's not supposed to happen, but the problem is:
- * In order to allow dijit.popup's getTopPopup() work,a sub menu's popupParent
- * points to the parent Menu, bypassing the parent MenuItem... thus the
- * MenuItem is not in the chain of active widgets and gets a premature call to
- * _onBlur()
- */
-
- dojo.toggleClass(this.domNode, "dijitMenuItemSelected", selected);
- },
-
- setLabel: function(/*String*/ content){
- // summary:
- // Deprecated. Use attr('label', ...) instead.
- // tags:
- // deprecated
- dojo.deprecated("dijit.MenuItem.setLabel() is deprecated. Use attr('label', ...) instead.", "", "2.0");
- this.attr("label", content);
- },
-
- setDisabled: function(/*Boolean*/ disabled){
- // summary:
- // Deprecated. Use attr('disabled', bool) instead.
- // tags:
- // deprecated
- dojo.deprecated("dijit.Menu.setDisabled() is deprecated. Use attr('disabled', bool) instead.", "", "2.0");
- this.attr('disabled', disabled);
- },
- _setDisabledAttr: function(/*Boolean*/ value){
- // summary:
- // Hook for attr('disabled', ...) to work.
- // Enable or disable this menu item.
- this.disabled = value;
- dojo[value ? "addClass" : "removeClass"](this.domNode, 'dijitMenuItemDisabled');
- dijit.setWaiState(this.focusNode, 'disabled', value ? 'true' : 'false');
- },
- _setAccelKeyAttr: function(/*String*/ value){
- // summary:
- // Hook for attr('accelKey', ...) to work.
- // Set accelKey on this menu item.
- this.accelKey=value;
-
- this.accelKeyNode.style.display=value?"":"none";
- this.accelKeyNode.innerHTML=value;
- //have to use colSpan to make it work in IE
- dojo.attr(this.containerNode,'colSpan',value?"1":"2");
- }
- });
-
-}
-
-if(!dojo._hasResource["dijit.PopupMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.PopupMenuItem"] = true;
-dojo.provide("dijit.PopupMenuItem");
-
-
-
-dojo.declare("dijit.PopupMenuItem",
- dijit.MenuItem,
- {
- _fillContent: function(){
- // summary:
- // When Menu is declared in markup, this code gets the menu label and
- // the popup widget from the srcNodeRef.
- // description:
- // srcNodeRefinnerHTML contains both the menu item text and a popup widget
- // The first part holds the menu item text and the second part is the popup
- // example:
- // | <div dojoType="dijit.PopupMenuItem">
- // | <span>pick me</span>
- // | <popup> ... </popup>
- // | </div>
- // tags:
- // protected
-
- if(this.srcNodeRef){
- var nodes = dojo.query("*", this.srcNodeRef);
- dijit.PopupMenuItem.superclass._fillContent.call(this, nodes[0]);
-
- // save pointer to srcNode so we can grab the drop down widget after it's instantiated
- this.dropDownContainer = this.srcNodeRef;
- }
- },
-
- startup: function(){
- if(this._started){ return; }
- this.inherited(arguments);
-
- // we didn't copy the dropdown widget from the this.srcNodeRef, so it's in no-man's
- // land now. move it to dojo.doc.body.
- if(!this.popup){
- var node = dojo.query("[widgetId]", this.dropDownContainer)[0];
- this.popup = dijit.byNode(node);
- }
- dojo.body().appendChild(this.popup.domNode);
-
- this.popup.domNode.style.display="none";
- if(this.arrowWrapper){
- dojo.style(this.arrowWrapper, "visibility", "");
- }
- dijit.setWaiState(this.focusNode, "haspopup", "true");
- },
-
- destroyDescendants: function(){
- if(this.popup){
- this.popup.destroyRecursive();
- delete this.popup;
- }
- this.inherited(arguments);
- }
- });
-
-
-}
-
-if(!dojo._hasResource["dijit.CheckedMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.CheckedMenuItem"] = true;
-dojo.provide("dijit.CheckedMenuItem");
-
-
-
-dojo.declare("dijit.CheckedMenuItem",
- dijit.MenuItem,
- {
- // summary:
- // A checkbox-like menu item for toggling on and off
-
- templateString:"<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" waiRole=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset\" waiRole=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\">\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">✓</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" waiRole=\"presentation\">\n\t</td>\n</tr>\n",
-
- // checked: Boolean
- // Our checked state
- checked: false,
- _setCheckedAttr: function(/*Boolean*/ checked){
- // summary:
- // Hook so attr('checked', bool) works.
- // Sets the class and state for the check box.
- dojo.toggleClass(this.domNode, "dijitCheckedMenuItemChecked", checked);
- dijit.setWaiState(this.domNode, "checked", checked);
- this.checked = checked;
- },
-
- onChange: function(/*Boolean*/ checked){
- // summary:
- // User defined function to handle check/uncheck events
- // tags:
- // callback
- },
-
- _onClick: function(/*Event*/ e){
- // summary:
- // Clicking this item just toggles its state
- // tags:
- // private
- if(!this.disabled){
- this.attr("checked", !this.checked);
- this.onChange(this.checked);
- }
- this.inherited(arguments);
- }
- });
-
-}
-
-if(!dojo._hasResource["dijit.MenuSeparator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.MenuSeparator"] = true;
-dojo.provide("dijit.MenuSeparator");
-
-
-
-
-
-dojo.declare("dijit.MenuSeparator",
- [dijit._Widget, dijit._Templated, dijit._Contained],
- {
- // summary:
- // A line between two menu items
-
- templateString:"<tr class=\"dijitMenuSeparator\">\n\t<td colspan=\"4\">\n\t\t<div class=\"dijitMenuSeparatorTop\"></div>\n\t\t<div class=\"dijitMenuSeparatorBottom\"></div>\n\t</td>\n</tr>\n",
-
- postCreate: function(){
- dojo.setSelectable(this.domNode, false);
- },
-
- isFocusable: function(){
- // summary:
- // Override to always return false
- // tags:
- // protected
-
- return false; // Boolean
- }
- });
-
-
-}
-
-if(!dojo._hasResource["dijit.Menu"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dijit.Menu"] = true;
-dojo.provide("dijit.Menu");
-
-
-
-
-
-dojo.declare("dijit._MenuBase",
- [dijit._Widget, dijit._Templated, dijit._KeyNavContainer],
-{
- // summary:
- // Base class for Menu and MenuBar
-
- // parentMenu: [readonly] Widget
- // pointer to menu that displayed me
- parentMenu: null,
-
- // popupDelay: Integer
- // number of milliseconds before hovering (without clicking) causes the popup to automatically open.
- popupDelay: 500,
-
- startup: function(){
- if(this._started){ return; }
-
- dojo.forEach(this.getChildren(), function(child){ child.startup(); });
- this.startupKeyNavChildren();
-
- this.inherited(arguments);
- },
-
- onExecute: function(){
- // summary:
- // Attach point for notification about when a menu item has been executed.
- // This is an internal mechanism used for Menus to signal to their parent to
- // close them, because they are about to execute the onClick handler. In
- // general developers should not attach to or override this method.
- // tags:
- // protected
- },
-
- onCancel: function(/*Boolean*/ closeAll){
- // summary:
- // Attach point for notification about when the user cancels the current menu
- // This is an internal mechanism used for Menus to signal to their parent to
- // close them. In general developers should not attach to or override this method.
- // tags:
- // protected
- },
-
- _moveToPopup: function(/*Event*/ evt){
- // summary:
- // This handles the right arrow key (left arrow key on RTL systems),
- // which will either open a submenu, or move to the next item in the
- // ancestor MenuBar
- // tags:
- // private
-
- if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){
- this.focusedChild._onClick(evt);
- }else{
- var topMenu = this._getTopMenu();
- if(topMenu && topMenu._isMenuBar){
- topMenu.focusNext();
- }
- }
- },
-
- onItemHover: function(/*MenuItem*/ item){
- // summary:
- // Called when cursor is over a MenuItem.
- // tags:
- // protected
-
- // Don't do anything unless user has "activated" the menu by:
- // 1) clicking it
- // 2) tabbing into it
- // 3) opening it from a parent menu (which automatically focuses it)
- if(this.isActive){
- this.focusChild(item);
-
- if(this.focusedChild.popup && !this.focusedChild.disabled && !this.hover_timer){
- this.hover_timer = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay);
- }
- }
- },
-
- _onChildBlur: function(item){
- // summary:
- // Called when a child MenuItem becomes inactive because focus
- // has been removed from the MenuItem *and* it's descendant menus.
- // tags:
- // private
-
- item._setSelected(false);
-
- // Close all popups that are open and descendants of this menu
- dijit.popup.close(item.popup);
- this._stopPopupTimer();
- },
-
- onItemUnhover: function(/*MenuItem*/ item){
- // summary:
- // Callback fires when mouse exits a MenuItem
- // tags:
- // protected
- if(this.isActive){
- this._stopPopupTimer();
- }
- },
-
- _stopPopupTimer: function(){
- // summary:
- // Cancels the popup timer because the user has stop hovering
- // on the MenuItem, etc.
- // tags:
- // private
- if(this.hover_timer){
- clearTimeout(this.hover_timer);
- this.hover_timer = null;
- }
- },
-
- _getTopMenu: function(){
- // summary:
- // Returns the top menu in this chain of Menus
- // tags:
- // private
- for(var top=this; top.parentMenu; top=top.parentMenu);
- return top;
- },
-
- onItemClick: function(/*Widget*/ item, /*Event*/ evt){
- // summary:
- // Handle clicks on an item.
- // tags:
- // private
- if(item.disabled){ return false; }
-
- this.focusChild(item);
-
- if(item.popup){
- if(!this.is_open){
- this._openPopup();
- }
- }else{
- // before calling user defined handler, close hierarchy of menus
- // and restore focus to place it was when menu was opened
- this.onExecute();
-
- // user defined handler for click
- item.onClick(evt);
- }
- },
-
- _openPopup: function(){
- // summary:
- // Open the popup to the side of/underneath the current menu item
- // tags:
- // protected
-
- this._stopPopupTimer();
- var from_item = this.focusedChild;
- var popup = from_item.popup;
-
- if(popup.isShowingNow){ return; }
- popup.parentMenu = this;
- var self = this;
- dijit.popup.open({
- parent: this,
- popup: popup,
- around: from_item.domNode,
- orient: this._orient || (this.isLeftToRight() ? {'TR': 'TL', 'TL': 'TR'} : {'TL': 'TR', 'TR': 'TL'}),
- onCancel: function(){
- // called when the child menu is canceled
- dijit.popup.close(popup);
- from_item.focus(); // put focus back on my node
- self.currentPopup = null;
- },
- onExecute: dojo.hitch(this, "_onDescendantExecute")
- });
-
- this.currentPopup = popup;
-
- if(popup.focus){
- // If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar),
- // if the cursor happens to collide with the popup, it will generate an onmouseover event
- // even though the mouse wasn't moved. Use a setTimeout() to call popup.focus so that
- // our focus() call overrides the onmouseover event, rather than vice-versa. (#8742)
- setTimeout(dojo.hitch(popup, "focus"), 0);
- }
- },
-
- onOpen: function(/*Event*/ e){
- // summary:
- // Callback when this menu is opened.
- // This is called by the popup manager as notification that the menu
- // was opened.
- // tags:
- // private
-
- this.isShowingNow = true;
- },
-
- onClose: function(){
- // summary:
- // Callback when this menu is closed.
- // This is called by the popup manager as notification that the menu
- // was closed.
- // tags:
- // private
-
- this._stopPopupTimer();
- this.parentMenu = null;
- this.isShowingNow = false;
- this.currentPopup = null;
- if(this.focusedChild){
- this._onChildBlur(this.focusedChild);
- this.focusedChild = null;
- }
- },
-
- _onFocus: function(){
- // summary:
- // Called when this Menu gets focus from:
- // 1) clicking it
- // 2) tabbing into it
- // 3) being opened by a parent menu.
- // This is not called just from mouse hover.
- // tags:
- // protected
- this.isActive = true;
- dojo.addClass(this.domNode, "dijitMenuActive");
- dojo.removeClass(this.domNode, "dijitMenuPassive");
- this.inherited(arguments);
- },
-
- _onBlur: function(){
- // summary:
- // Called when focus is moved away from this Menu and it's submenus.
- // tags:
- // protected
- this.isActive = false;
- dojo.removeClass(this.domNode, "dijitMenuActive");
- dojo.addClass(this.domNode, "dijitMenuPassive");
-
- // If user blurs/clicks away from a MenuBar (or always visible Menu), then close all popped up submenus etc.
- this.onClose();
-
- this.inherited(arguments);
- },
-
- _onDescendantExecute: function(){
- // summary:
- // Called when submenu is clicked. Close hierarchy of menus.
- // tags:
- // private
- this.onClose();
- }
-});
-
-dojo.declare("dijit.Menu",
- dijit._MenuBase,
- {
- // summary
- // A context menu you can assign to multiple elements
-
- // TODO: most of the code in here is just for context menu (right-click menu)
- // support. In retrospect that should have been a separate class (dijit.ContextMenu).
- // Split them for 2.0
-
- constructor: function(){
- this._bindings = [];
- },
-
- templateString:"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" waiRole=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n",
-
- // targetNodeIds: [const] String[]
- // Array of dom node ids of nodes to attach to.
- // Fill this with nodeIds upon widget creation and it becomes context menu for those nodes.
- targetNodeIds: [],
-
- // contextMenuForWindow: [const] Boolean
- // If true, right clicking anywhere on the window will cause this context menu to open.
- // If false, must specify targetNodeIds.
- contextMenuForWindow: false,
-
- // leftClickToOpen: [const] Boolean
- // If true, menu will open on left click instead of right click, similiar to a file menu.
- leftClickToOpen: false,
-
- // _contextMenuWithMouse: [private] Boolean
- // Used to record mouse and keyboard events to determine if a context
- // menu is being opened with the keyboard or the mouse.
- _contextMenuWithMouse: false,
-
- postCreate: function(){
- if(this.contextMenuForWindow){
- this.bindDomNode(dojo.body());
- }else{
- dojo.forEach(this.targetNodeIds, this.bindDomNode, this);
- }
- var k = dojo.keys, l = this.isLeftToRight();
- this._openSubMenuKey = l ? k.RIGHT_ARROW : k.LEFT_ARROW;
- this._closeSubMenuKey = l ? k.LEFT_ARROW : k.RIGHT_ARROW;
- this.connectKeyNavHandlers([k.UP_ARROW], [k.DOWN_ARROW]);
- },
-
- _onKeyPress: function(/*Event*/ evt){
- // summary:
- // Handle keyboard based menu navigation.
- // tags:
- // protected
-
- if(evt.ctrlKey || evt.altKey){ return; }
-
- switch(evt.charOrCode){
- case this._openSubMenuKey:
- this._moveToPopup(evt);
- dojo.stopEvent(evt);
- break;
- case this._closeSubMenuKey:
- if(this.parentMenu){
- if(this.parentMenu._isMenuBar){
- this.parentMenu.focusPrev();
- }else{
- this.onCancel(false);
- }
- }else{
- dojo.stopEvent(evt);
- }
- break;
- }
- },
-
- // thanks burstlib!
- _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){
- // summary:
- // Returns the window reference of the passed iframe
- // tags:
- // private
- var win = dijit.getDocumentWindow(dijit.Menu._iframeContentDocument(iframe_el)) ||
- // Moz. TODO: is this available when defaultView isn't?
- dijit.Menu._iframeContentDocument(iframe_el)['__parent__'] ||
- (iframe_el.name && dojo.doc.frames[iframe_el.name]) || null;
- return win; // Window
- },
-
- _iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){
- // summary:
- // Returns a reference to the document object inside iframe_el
- // tags:
- // protected
- var doc = iframe_el.contentDocument // W3
- || (iframe_el.contentWindow && iframe_el.contentWindow.document) // IE
- || (iframe_el.name && dojo.doc.frames[iframe_el.name] && dojo.doc.frames[iframe_el.name].document)
- || null;
- return doc; // HTMLDocument
- },
-
- bindDomNode: function(/*String|DomNode*/ node){
- // summary:
- // Attach menu to given node
- node = dojo.byId(node);
-
- //TODO: this is to support context popups in Editor. Maybe this shouldn't be in dijit.Menu
- var win = dijit.getDocumentWindow(node.ownerDocument);
- if(node.tagName.toLowerCase()=="iframe"){
- win = this._iframeContentWindow(node);
- node = dojo.withGlobal(win, dojo.body);
- }
-
- // to capture these events at the top level,
- // attach to document, not body
- var cn = (node == dojo.body() ? dojo.doc : node);
-
- node[this.id] = this._bindings.push([
- dojo.connect(cn, (this.leftClickToOpen)?"onclick":"oncontextmenu", this, "_openMyself"),
- dojo.connect(cn, "onkeydown", this, "_contextKey"),
- dojo.connect(cn, "onmousedown", this, "_contextMouse")
- ]);
- },
-
- unBindDomNode: function(/*String|DomNode*/ nodeName){
- // summary:
- // Detach menu from given node
- var node = dojo.byId(nodeName);
- if(node){
- var bid = node[this.id]-1, b = this._bindings[bid];
- dojo.forEach(b, dojo.disconnect);
- delete this._bindings[bid];
- }
- },
-
- _contextKey: function(e){
- // summary:
- // Code to handle popping up editor using F10 key rather than mouse
- // tags:
- // private
- this._contextMenuWithMouse = false;
- if(e.keyCode == dojo.keys.F10){
- dojo.stopEvent(e);
- if(e.shiftKey && e.type=="keydown"){
- // FF: copying the wrong property from e will cause the system
- // context menu to appear in spite of stopEvent. Don't know
- // exactly which properties cause this effect.
- var _e = { target: e.target, pageX: e.pageX, pageY: e.pageY };
- _e.preventDefault = _e.stopPropagation = function(){};
- // IE: without the delay, focus work in "open" causes the system
- // context menu to appear in spite of stopEvent.
- window.setTimeout(dojo.hitch(this, function(){ this._openMyself(_e); }), 1);
- }
- }
- },
-
- _contextMouse: function(e){
- // summary:
- // Helper to remember when we opened the context menu with the mouse instead
- // of with the keyboard
- // tags:
- // private
- this._contextMenuWithMouse = true;
- },
-
- _openMyself: function(/*Event*/ e){
- // summary:
- // Internal function for opening myself when the user
- // does a right-click or something similar
- // tags:
- // private
-
- if(this.leftClickToOpen&&e.button>0){
- return;
- }
- dojo.stopEvent(e);
-
- // Get coordinates.
- // if we are opening the menu with the mouse or on safari open
- // the menu at the mouse cursor
- // (Safari does not have a keyboard command to open the context menu
- // and we don't currently have a reliable way to determine
- // _contextMenuWithMouse on Safari)
- var x,y;
- if(dojo.isSafari || this._contextMenuWithMouse){
- x=e.pageX;
- y=e.pageY;
- }else{
- // otherwise open near e.target
- var coords = dojo.coords(e.target, true);
- x = coords.x + 10;
- y = coords.y + 10;
- }
-
- var self=this;
- var savedFocus = dijit.getFocus(this);
- function closeAndRestoreFocus(){
- // user has clicked on a menu or popup
- dijit.focus(savedFocus);
- dijit.popup.close(self);
- }
- dijit.popup.open({
- popup: this,
- x: x,
- y: y,
- onExecute: closeAndRestoreFocus,
- onCancel: closeAndRestoreFocus,
- orient: this.isLeftToRight() ? 'L' : 'R'
- });
- this.focus();
-
- this._onBlur = function(){
- this.inherited('_onBlur', arguments);
- // Usually the parent closes the child widget but if this is a context
- // menu then there is no parent
- dijit.popup.close(this);
- // don't try to restore focus; user has clicked another part of the screen
- // and set focus there
- };
- },
-
- uninitialize: function(){
- dojo.forEach(this.targetNodeIds, this.unBindDomNode, this);
- this.inherited(arguments);
- }
-}
-);
-
-// Back-compat (TODO: remove in 2.0)
-
-
-
-
-
-
-}
-
-if(!dojo._hasResource["dojox.html.metrics"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.html.metrics"] = true;
-dojo.provide("dojox.html.metrics");
-
-(function(){
- var dhm = dojox.html.metrics;
-
- // derived from Morris John's emResized measurer
- dhm.getFontMeasurements = function(){
- // summary
- // Returns an object that has pixel equivilents of standard font size values.
- var heights = {
- '1em':0, '1ex':0, '100%':0, '12pt':0, '16px':0, 'xx-small':0, 'x-small':0,
- 'small':0, 'medium':0, 'large':0, 'x-large':0, 'xx-large':0
- };
-
- if(dojo.isIE){
- // we do a font-size fix if and only if one isn't applied already.
- // NOTE: If someone set the fontSize on the HTML Element, this will kill it.
- dojo.doc.documentElement.style.fontSize="100%";
- }
-
- // set up the measuring node.
- var div=dojo.doc.createElement("div");
- var ds = div.style;
- ds.position="absolute";
- ds.left="-100px";
- ds.top="0";
- ds.width="30px";
- ds.height="1000em";
- ds.border="0";
- ds.margin="0";
- ds.padding="0";
- ds.outline="0";
- ds.lineHeight="1";
- ds.overflow="hidden";
- dojo.body().appendChild(div);
-
- // do the measurements.
- for(var p in heights){
- ds.fontSize = p;
- heights[p] = Math.round(div.offsetHeight * 12/16) * 16/12 / 1000;
- }
-
- dojo.body().removeChild(div);
- div = null;
- return heights; // object
- };
-
- var fontMeasurements = null;
-
- dhm.getCachedFontMeasurements = function(recalculate){
- if(recalculate || !fontMeasurements){
- fontMeasurements = dhm.getFontMeasurements();
- }
- return fontMeasurements;
- };
-
- var measuringNode = null, empty = {};
- dhm.getTextBox = function(/* String */ text, /* Object */ style, /* String? */ className){
- var m;
- if(!measuringNode){
- m = measuringNode = dojo.doc.createElement("div");
- m.style.position = "absolute";
- m.style.left = "-10000px";
- m.style.top = "0";
- dojo.body().appendChild(m);
- }else{
- m = measuringNode;
- }
- // reset styles
- m.className = "";
- m.style.border = "0";
- m.style.margin = "0";
- m.style.padding = "0";
- m.style.outline = "0";
- // set new style
- if(arguments.length > 1 && style){
- for(var i in style){
- if(i in empty){ continue; }
- m.style[i] = style[i];
- }
- }
- // set classes
- if(arguments.length > 2 && className){
- m.className = className;
- }
- // take a measure
- m.innerHTML = text;
- return dojo.marginBox(m);
- };
-
- // determine the scrollbar sizes on load.
- var scroll={ w:16, h:16 };
- dhm.getScrollbar=function(){ return { w:scroll.w, h:scroll.h }; };
-
- dhm._fontResizeNode = null;
-
- dhm.initOnFontResize = function(interval){
- var f = dhm._fontResizeNode = dojo.doc.createElement("iframe");
- var fs = f.style;
- fs.position = "absolute";
- fs.width = "5em";
- fs.height = "10em";
- fs.top = "-10000px";
- f.src = dojo.config["dojoBlankHtmlUrl"] || dojo.moduleUrl("dojo", "resources/blank.html");
- dojo.body().appendChild(f);
-
- if(dojo.isIE){
- f.onreadystatechange = function(){
- if(f.contentWindow.document.readyState == "complete"){
- f.onresize = Function('window.parent.'+dojox._scopeName+'.html.metrics._fontresize()');
- }
- };
- }else{
- f.onload = function(){
- f.contentWindow.onresize = Function('window.parent.'+dojox._scopeName+'.html.metrics._fontresize()');
- };
- }
- dhm.initOnFontResize = function(){};
- };
-
- dhm.onFontResize = function(){};
- dhm._fontresize = function(){
- dhm.onFontResize();
- }
-
- dojo.addOnUnload(function(){
- // destroy our font resize iframe if we have one
- var f = dhm._fontResizeNode;
- if(f){
- if(dojo.isIE && f.onresize){
- f.onresize = null;
- }else if(f.contentWindow && f.contentWindow.onresize){
- f.contentWindow.onresize = null;
- }
- dhm._fontResizeNode = null;
- }
- });
-
- dojo.addOnLoad(function(){
- // getScrollbar metrics node
- try{
- var n=dojo.doc.createElement("div");
- n.style.cssText = "top:0;left:0;width:100px;height:100px;overflow:scroll;position:absolute;visibility:hidden;";
- dojo.body().appendChild(n);
- scroll.w = n.offsetWidth - n.clientWidth;
- scroll.h = n.offsetHeight - n.clientHeight;
- dojo.body().removeChild(n);
- //
- delete n;
- }catch(e){}
-
- // text size poll setup
- if("fontSizeWatch" in dojo.config && !!dojo.config.fontSizeWatch){
- dhm.initOnFontResize();
- }
- });
-})();
-
-}
-
-if(!dojo._hasResource["dojox.grid.util"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid.util"] = true;
-dojo.provide("dojox.grid.util");
-
-// summary: grid utility library
-(function(){
- var dgu = dojox.grid.util;
-
- dgu.na = '...';
- dgu.rowIndexTag = "gridRowIndex";
- dgu.gridViewTag = "gridView";
-
-
- dgu.fire = function(ob, ev, args){
- var fn = ob && ev && ob[ev];
- return fn && (args ? fn.apply(ob, args) : ob[ev]());
- };
-
- dgu.setStyleHeightPx = function(inElement, inHeight){
- if(inHeight >= 0){
- var s = inElement.style;
- var v = inHeight + 'px';
- if(inElement && s['height'] != v){
- s['height'] = v;
- }
- }
- };
-
- dgu.mouseEvents = [ 'mouseover', 'mouseout', /*'mousemove',*/ 'mousedown', 'mouseup', 'click', 'dblclick', 'contextmenu' ];
-
- dgu.keyEvents = [ 'keyup', 'keydown', 'keypress' ];
-
- dgu.funnelEvents = function(inNode, inObject, inMethod, inEvents){
- var evts = (inEvents ? inEvents : dgu.mouseEvents.concat(dgu.keyEvents));
- for (var i=0, l=evts.length; i<l; i++){
- inObject.connect(inNode, 'on' + evts[i], inMethod);
- }
- },
-
- dgu.removeNode = function(inNode){
- inNode = dojo.byId(inNode);
- inNode && inNode.parentNode && inNode.parentNode.removeChild(inNode);
- return inNode;
- };
-
- dgu.arrayCompare = function(inA, inB){
- for(var i=0,l=inA.length; i<l; i++){
- if(inA[i] != inB[i]){return false;}
- }
- return (inA.length == inB.length);
- };
-
- dgu.arrayInsert = function(inArray, inIndex, inValue){
- if(inArray.length <= inIndex){
- inArray[inIndex] = inValue;
- }else{
- inArray.splice(inIndex, 0, inValue);
- }
- };
-
- dgu.arrayRemove = function(inArray, inIndex){
- inArray.splice(inIndex, 1);
- };
-
- dgu.arraySwap = function(inArray, inI, inJ){
- var cache = inArray[inI];
- inArray[inI] = inArray[inJ];
- inArray[inJ] = cache;
- };
-})();
-
-}
-
-if(!dojo._hasResource["dojox.grid._Scroller"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid._Scroller"] = true;
-dojo.provide("dojox.grid._Scroller");
-
-(function(){
- var indexInParent = function(inNode){
- var i=0, n, p=inNode.parentNode;
- while((n = p.childNodes[i++])){
- if(n == inNode){
- return i - 1;
- }
- }
- return -1;
- };
-
- var cleanNode = function(inNode){
- if(!inNode){
- return;
- }
- var filter = function(inW){
- return inW.domNode && dojo.isDescendant(inW.domNode, inNode, true);
- }
- var ws = dijit.registry.filter(filter);
- for(var i=0, w; (w=ws[i]); i++){
- w.destroy();
- }
- delete ws;
- };
-
- var getTagName = function(inNodeOrId){
- var node = dojo.byId(inNodeOrId);
- return (node && node.tagName ? node.tagName.toLowerCase() : '');
- };
-
- var nodeKids = function(inNode, inTag){
- var result = [];
- var i=0, n;
- while((n = inNode.childNodes[i++])){
- if(getTagName(n) == inTag){
- result.push(n);
- }
- }
- return result;
- };
-
- var divkids = function(inNode){
- return nodeKids(inNode, 'div');
- };
-
- dojo.declare("dojox.grid._Scroller", null, {
- constructor: function(inContentNodes){
- this.setContentNodes(inContentNodes);
- this.pageHeights = [];
- this.pageNodes = [];
- this.stack = [];
- },
- // specified
- rowCount: 0, // total number of rows to manage
- defaultRowHeight: 32, // default height of a row
- keepRows: 100, // maximum number of rows that should exist at one time
- contentNode: null, // node to contain pages
- scrollboxNode: null, // node that controls scrolling
- // calculated
- defaultPageHeight: 0, // default height of a page
- keepPages: 10, // maximum number of pages that should exists at one time
- pageCount: 0,
- windowHeight: 0,
- firstVisibleRow: 0,
- lastVisibleRow: 0,
- averageRowHeight: 0, // the average height of a row
- // private
- page: 0,
- pageTop: 0,
- // init
- init: function(inRowCount, inKeepRows, inRowsPerPage){
- switch(arguments.length){
- case 3: this.rowsPerPage = inRowsPerPage;
- case 2: this.keepRows = inKeepRows;
- case 1: this.rowCount = inRowCount;
- }
- this.defaultPageHeight = this.defaultRowHeight * this.rowsPerPage;
- this.pageCount = this._getPageCount(this.rowCount, this.rowsPerPage);
- this.setKeepInfo(this.keepRows);
- this.invalidate();
- if(this.scrollboxNode){
- this.scrollboxNode.scrollTop = 0;
- this.scroll(0);
- this.scrollboxNode.onscroll = dojo.hitch(this, 'onscroll');
- }
- },
- _getPageCount: function(rowCount, rowsPerPage){
- return rowCount ? (Math.ceil(rowCount / rowsPerPage) || 1) : 0;
- },
- destroy: function(){
- this.invalidateNodes();
- delete this.contentNodes;
- delete this.contentNode;
- delete this.scrollboxNode;
- },
- setKeepInfo: function(inKeepRows){
- this.keepRows = inKeepRows;
- this.keepPages = !this.keepRows ? this.keepRows : Math.max(Math.ceil(this.keepRows / this.rowsPerPage), 2);
- },
- // nodes
- setContentNodes: function(inNodes){
- this.contentNodes = inNodes;
- this.colCount = (this.contentNodes ? this.contentNodes.length : 0);
- this.pageNodes = [];
- for(var i=0; i<this.colCount; i++){
- this.pageNodes[i] = [];
- }
- },
- getDefaultNodes: function(){
- return this.pageNodes[0] || [];
- },
- // updating
- invalidate: function(){
- this.invalidateNodes();
- this.pageHeights = [];
- this.height = (this.pageCount ? (this.pageCount - 1)* this.defaultPageHeight + this.calcLastPageHeight() : 0);
- this.resize();
- },
- updateRowCount: function(inRowCount){
- this.invalidateNodes();
- this.rowCount = inRowCount;
- // update page count, adjust document height
- var oldPageCount = this.pageCount;
- this.pageCount = this._getPageCount(this.rowCount, this.rowsPerPage);
- if(this.pageCount < oldPageCount){
- for(var i=oldPageCount-1; i>=this.pageCount; i--){
- this.height -= this.getPageHeight(i);
- delete this.pageHeights[i]
- }
- }else if(this.pageCount > oldPageCount){
- this.height += this.defaultPageHeight * (this.pageCount - oldPageCount - 1) + this.calcLastPageHeight();
- }
- this.resize();
- },
- // implementation for page manager
- pageExists: function(inPageIndex){
- return Boolean(this.getDefaultPageNode(inPageIndex));
- },
- measurePage: function(inPageIndex){
- var n = this.getDefaultPageNode(inPageIndex);
- return (n&&n.innerHTML) ? n.offsetHeight : 0;
- },
- positionPage: function(inPageIndex, inPos){
- for(var i=0; i<this.colCount; i++){
- this.pageNodes[i][inPageIndex].style.top = inPos + 'px';
- }
- },
- repositionPages: function(inPageIndex){
- var nodes = this.getDefaultNodes();
- var last = 0;
-
- for(var i=0; i<this.stack.length; i++){
- last = Math.max(this.stack[i], last);
- }
- //
- var n = nodes[inPageIndex];
- var y = (n ? this.getPageNodePosition(n) + this.getPageHeight(inPageIndex) : 0);
- //
- //
- for(var p=inPageIndex+1; p<=last; p++){
- n = nodes[p];
- if(n){
- //
- if(this.getPageNodePosition(n) == y){
- return;
- }
- //
- this.positionPage(p, y);
- }
- y += this.getPageHeight(p);
- }
- },
- installPage: function(inPageIndex){
- for(var i=0; i<this.colCount; i++){
- this.contentNodes[i].appendChild(this.pageNodes[i][inPageIndex]);
- }
- },
- preparePage: function(inPageIndex, inReuseNode){
- var p = (inReuseNode ? this.popPage() : null);
- for(var i=0; i<this.colCount; i++){
- var nodes = this.pageNodes[i];
- var new_p = (p === null ? this.createPageNode() : this.invalidatePageNode(p, nodes));
- new_p.pageIndex = inPageIndex;
- new_p.id = (this._pageIdPrefix || "") + 'page-' + inPageIndex;
- nodes[inPageIndex] = new_p;
- }
- },
- // rendering implementation
- renderPage: function(inPageIndex){
- var nodes = [];
- for(var i=0; i<this.colCount; i++){
- nodes[i] = this.pageNodes[i][inPageIndex];
- }
- for(var i=0, j=inPageIndex*this.rowsPerPage; (i<this.rowsPerPage)&&(j<this.rowCount); i++, j++){
- this.renderRow(j, nodes);
- }
- },
- removePage: function(inPageIndex){
- for(var i=0, j=inPageIndex*this.rowsPerPage; i<this.rowsPerPage; i++, j++){
- this.removeRow(j);
- }
- },
- destroyPage: function(inPageIndex){
- for(var i=0; i<this.colCount; i++){
- var n = this.invalidatePageNode(inPageIndex, this.pageNodes[i]);
- if(n){
- dojo.destroy(n);
- }
- }
- },
- pacify: function(inShouldPacify){
- },
- // pacification
- pacifying: false,
- pacifyTicks: 200,
- setPacifying: function(inPacifying){
- if(this.pacifying != inPacifying){
- this.pacifying = inPacifying;
- this.pacify(this.pacifying);
- }
- },
- startPacify: function(){
- this.startPacifyTicks = new Date().getTime();
- },
- doPacify: function(){
- var result = (new Date().getTime() - this.startPacifyTicks) > this.pacifyTicks;
- this.setPacifying(true);
- this.startPacify();
- return result;
- },
- endPacify: function(){
- this.setPacifying(false);
- },
- // default sizing implementation
- resize: function(){
- if(this.scrollboxNode){
- this.windowHeight = this.scrollboxNode.clientHeight;
- }
- for(var i=0; i<this.colCount; i++){
- dojox.grid.util.setStyleHeightPx(this.contentNodes[i], this.height);
- }
-
- // Calculate the average row height and update the defaults (row and page).
- this.needPage(this.page, this.pageTop);
- var rowsOnPage = (this.page < this.pageCount - 1) ? this.rowsPerPage : ((this.rowCount % this.rowsPerPage) || this.rowsPerPage);
- var pageHeight = this.getPageHeight(this.page);
- this.averageRowHeight = (pageHeight > 0 && rowsOnPage > 0) ? (pageHeight / rowsOnPage) : 0;
- },
- calcLastPageHeight: function(){
- if(!this.pageCount){
- return 0;
- }
- var lastPage = this.pageCount - 1;
- var lastPageHeight = ((this.rowCount % this.rowsPerPage)||(this.rowsPerPage)) * this.defaultRowHeight;
- this.pageHeights[lastPage] = lastPageHeight;
- return lastPageHeight;
- },
- updateContentHeight: function(inDh){
- this.height += inDh;
- this.resize();
- },
- updatePageHeight: function(inPageIndex){
- if(this.pageExists(inPageIndex)){
- var oh = this.getPageHeight(inPageIndex);
- var h = (this.measurePage(inPageIndex))||(oh);
- this.pageHeights[inPageIndex] = h;
- if((h)&&(oh != h)){
- this.updateContentHeight(h - oh)
- this.repositionPages(inPageIndex);
- }
- }
- },
- rowHeightChanged: function(inRowIndex){
- this.updatePageHeight(Math.floor(inRowIndex / this.rowsPerPage));
- },
- // scroller core
- invalidateNodes: function(){
- while(this.stack.length){
- this.destroyPage(this.popPage());
- }
- },
- createPageNode: function(){
- var p = document.createElement('div');
- p.style.position = 'absolute';
- //p.style.width = '100%';
- p.style[dojo._isBodyLtr() ? "left" : "right"] = '0';
- return p;
- },
- getPageHeight: function(inPageIndex){
- var ph = this.pageHeights[inPageIndex];
- return (ph !== undefined ? ph : this.defaultPageHeight);
- },
- // FIXME: this is not a stack, it's a FIFO list
- pushPage: function(inPageIndex){
- return this.stack.push(inPageIndex);
- },
- popPage: function(){
- return this.stack.shift();
- },
- findPage: function(inTop){
- var i = 0, h = 0;
- for(var ph = 0; i<this.pageCount; i++, h += ph){
- ph = this.getPageHeight(i);
- if(h + ph >= inTop){
- break;
- }
- }
- this.page = i;
- this.pageTop = h;
- },
- buildPage: function(inPageIndex, inReuseNode, inPos){
- this.preparePage(inPageIndex, inReuseNode);
- this.positionPage(inPageIndex, inPos);
- // order of operations is key below
- this.installPage(inPageIndex);
- this.renderPage(inPageIndex);
- // order of operations is key above
- this.pushPage(inPageIndex);
- },
- needPage: function(inPageIndex, inPos){
- var h = this.getPageHeight(inPageIndex), oh = h;
- if(!this.pageExists(inPageIndex)){
- this.buildPage(inPageIndex, this.keepPages&&(this.stack.length >= this.keepPages), inPos);
- h = this.measurePage(inPageIndex) || h;
- this.pageHeights[inPageIndex] = h;
- if(h && (oh != h)){
- this.updateContentHeight(h - oh)
- }
- }else{
- this.positionPage(inPageIndex, inPos);
- }
- return h;
- },
- onscroll: function(){
- this.scroll(this.scrollboxNode.scrollTop);
- },
- scroll: function(inTop){
- this.grid.scrollTop = inTop;
- if(this.colCount){
- this.startPacify();
- this.findPage(inTop);
- var h = this.height;
- var b = this.getScrollBottom(inTop);
- for(var p=this.page, y=this.pageTop; (p<this.pageCount)&&((b<0)||(y<b)); p++){
- y += this.needPage(p, y);
- }
- this.firstVisibleRow = this.getFirstVisibleRow(this.page, this.pageTop, inTop);
- this.lastVisibleRow = this.getLastVisibleRow(p - 1, y, b);
- // indicates some page size has been updated
- if(h != this.height){
- this.repositionPages(p-1);
- }
- this.endPacify();
- }
- },
- getScrollBottom: function(inTop){
- return (this.windowHeight >= 0 ? inTop + this.windowHeight : -1);
- },
- // events
- processNodeEvent: function(e, inNode){
- var t = e.target;
- while(t && (t != inNode) && t.parentNode && (t.parentNode.parentNode != inNode)){
- t = t.parentNode;
- }
- if(!t || !t.parentNode || (t.parentNode.parentNode != inNode)){
- return false;
- }
- var page = t.parentNode;
- e.topRowIndex = page.pageIndex * this.rowsPerPage;
- e.rowIndex = e.topRowIndex + indexInParent(t);
- e.rowTarget = t;
- return true;
- },
- processEvent: function(e){
- return this.processNodeEvent(e, this.contentNode);
- },
- // virtual rendering interface
- renderRow: function(inRowIndex, inPageNode){
- },
- removeRow: function(inRowIndex){
- },
- // page node operations
- getDefaultPageNode: function(inPageIndex){
- return this.getDefaultNodes()[inPageIndex];
- },
- positionPageNode: function(inNode, inPos){
- },
- getPageNodePosition: function(inNode){
- return inNode.offsetTop;
- },
- invalidatePageNode: function(inPageIndex, inNodes){
- var p = inNodes[inPageIndex];
- if(p){
- delete inNodes[inPageIndex];
- this.removePage(inPageIndex, p);
- cleanNode(p);
- p.innerHTML = '';
- }
- return p;
- },
- // scroll control
- getPageRow: function(inPage){
- return inPage * this.rowsPerPage;
- },
- getLastPageRow: function(inPage){
- return Math.min(this.rowCount, this.getPageRow(inPage + 1)) - 1;
- },
- getFirstVisibleRow: function(inPage, inPageTop, inScrollTop){
- if(!this.pageExists(inPage)){
- return 0;
- }
- var row = this.getPageRow(inPage);
- var nodes = this.getDefaultNodes();
- var rows = divkids(nodes[inPage]);
- for(var i=0,l=rows.length; i<l && inPageTop<inScrollTop; i++, row++){
- inPageTop += rows[i].offsetHeight;
- }
- return (row ? row - 1 : row);
- },
- getLastVisibleRow: function(inPage, inBottom, inScrollBottom){
- if(!this.pageExists(inPage)){
- return 0;
- }
- var nodes = this.getDefaultNodes();
- var row = this.getLastPageRow(inPage);
- var rows = divkids(nodes[inPage]);
- for(var i=rows.length-1; i>=0 && inBottom>inScrollBottom; i--, row--){
- inBottom -= rows[i].offsetHeight;
- }
- return row + 1;
- },
- findTopRow: function(inScrollTop){
- var nodes = this.getDefaultNodes();
- var rows = divkids(nodes[this.page]);
- for(var i=0,l=rows.length,t=this.pageTop,h; i<l; i++){
- h = rows[i].offsetHeight;
- t += h;
- if(t >= inScrollTop){
- this.offset = h - (t - inScrollTop);
- return i + this.page * this.rowsPerPage;
- }
- }
- return -1;
- },
- findScrollTop: function(inRow){
- var rowPage = Math.floor(inRow / this.rowsPerPage);
- var t = 0;
- for(var i=0; i<rowPage; i++){
- t += this.getPageHeight(i);
- }
- this.pageTop = t;
- this.needPage(rowPage, this.pageTop);
-
- var nodes = this.getDefaultNodes();
- var rows = divkids(nodes[rowPage]);
- var r = inRow - this.rowsPerPage * rowPage;
- for(var i=0,l=rows.length; i<l && i<r; i++){
- t += rows[i].offsetHeight;
- }
- return t;
- },
- dummy: 0
- });
-})();
-
-}
-
-if(!dojo._hasResource["dojox.grid.cells._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid.cells._base"] = true;
-dojo.provide("dojox.grid.cells._base");
-
-
-
-(function(){
- var focusSelectNode = function(inNode){
- try{
- dojox.grid.util.fire(inNode, "focus");
- dojox.grid.util.fire(inNode, "select");
- }catch(e){// IE sux bad
- }
- };
-
- var whenIdle = function(/*inContext, inMethod, args ...*/){
- setTimeout(dojo.hitch.apply(dojo, arguments), 0);
- };
-
- var dgc = dojox.grid.cells;
-
- dojo.declare("dojox.grid.cells._Base", null, {
- // summary:
- // Respresents a grid cell and contains information about column options and methods
- // for retrieving cell related information.
- // Each column in a grid layout has a cell object and most events and many methods
- // provide access to these objects.
- styles: '',
- classes: '',
- editable: false,
- alwaysEditing: false,
- formatter: null,
- defaultValue: '...',
- value: null,
- hidden: false,
- noresize: false,
- //private
- _valueProp: "value",
- _formatPending: false,
-
- constructor: function(inProps){
- this._props = inProps || {};
- dojo.mixin(this, inProps);
- },
-
- // data source
- format: function(inRowIndex, inItem){
- // summary:
- // provides the html for a given grid cell.
- // inRowIndex: int
- // grid row index
- // returns: html for a given grid cell
- var f, i=this.grid.edit.info, d=this.get ? this.get(inRowIndex, inItem) : (this.value || this.defaultValue);
- if(this.editable && (this.alwaysEditing || (i.rowIndex==inRowIndex && i.cell==this))){
- return this.formatEditing(d, inRowIndex);
- }else{
- var v = (d != this.defaultValue && (f = this.formatter)) ? f.call(this, d, inRowIndex) : d;
- return (typeof v == "undefined" ? this.defaultValue : v);
- }
- },
- formatEditing: function(inDatum, inRowIndex){
- // summary:
- // formats the cell for editing
- // inDatum: anything
- // cell data to edit
- // inRowIndex: int
- // grid row index
- // returns: string of html to place in grid cell
- },
- // utility
- getNode: function(inRowIndex){
- // summary:
- // gets the dom node for a given grid cell.
- // inRowIndex: int
- // grid row index
- // returns: dom node for a given grid cell
- return this.view.getCellNode(inRowIndex, this.index);
- },
- getHeaderNode: function(){
- return this.view.getHeaderCellNode(this.index);
- },
- getEditNode: function(inRowIndex){
- return (this.getNode(inRowIndex) || 0).firstChild || 0;
- },
- canResize: function(){
- var uw = this.unitWidth;
- return uw && (uw=='auto');
- },
- isFlex: function(){
- var uw = this.unitWidth;
- return uw && dojo.isString(uw) && (uw=='auto' || uw.slice(-1)=='%');
- },
- // edit support
- applyEdit: function(inValue, inRowIndex){
- this.grid.edit.applyCellEdit(inValue, this, inRowIndex);
- },
- cancelEdit: function(inRowIndex){
- this.grid.doCancelEdit(inRowIndex);
- },
- _onEditBlur: function(inRowIndex){
- if(this.grid.edit.isEditCell(inRowIndex, this.index)){
- //
- this.grid.edit.apply();
- }
- },
- registerOnBlur: function(inNode, inRowIndex){
- if(this.commitOnBlur){
- dojo.connect(inNode, "onblur", function(e){
- // hack: if editor still thinks this editor is current some ms after it blurs, assume we've focused away from grid
- setTimeout(dojo.hitch(this, "_onEditBlur", inRowIndex), 250);
- });
- }
- },
- //protected
- needFormatNode: function(inDatum, inRowIndex){
- this._formatPending = true;
- whenIdle(this, "_formatNode", inDatum, inRowIndex);
- },
- cancelFormatNode: function(){
- this._formatPending = false;
- },
- //private
- _formatNode: function(inDatum, inRowIndex){
- if(this._formatPending){
- this._formatPending = false;
- // make cell selectable
- dojo.setSelectable(this.grid.domNode, true);
- this.formatNode(this.getEditNode(inRowIndex), inDatum, inRowIndex);
- }
- },
- //protected
- formatNode: function(inNode, inDatum, inRowIndex){
- // summary:
- // format the editing dom node. Use when editor is a widget.
- // inNode: dom node
- // dom node for the editor
- // inDatum: anything
- // cell data to edit
- // inRowIndex: int
- // grid row index
- if(dojo.isIE){
- // IE sux bad
- whenIdle(this, "focus", inRowIndex, inNode);
- }else{
- this.focus(inRowIndex, inNode);
- }
- },
- dispatchEvent: function(m, e){
- if(m in this){
- return this[m](e);
- }
- },
- //public
- getValue: function(inRowIndex){
- // summary:
- // returns value entered into editor
- // inRowIndex: int
- // grid row index
- // returns:
- // value of editor
- return this.getEditNode(inRowIndex)[this._valueProp];
- },
- setValue: function(inRowIndex, inValue){
- // summary:
- // set the value of the grid editor
- // inRowIndex: int
- // grid row index
- // inValue: anything
- // value of editor
- var n = this.getEditNode(inRowIndex);
- if(n){
- n[this._valueProp] = inValue
- };
- },
- focus: function(inRowIndex, inNode){
- // summary:
- // focus the grid editor
- // inRowIndex: int
- // grid row index
- // inNode: dom node
- // editor node
- focusSelectNode(inNode || this.getEditNode(inRowIndex));
- },
- save: function(inRowIndex){
- // summary:
- // save editor state
- // inRowIndex: int
- // grid row index
- this.value = this.value || this.getValue(inRowIndex);
- //
- },
- restore: function(inRowIndex){
- // summary:
- // restore editor state
- // inRowIndex: int
- // grid row index
- this.setValue(inRowIndex, this.value);
- //
- },
- //protected
- _finish: function(inRowIndex){
- // summary:
- // called when editing is completed to clean up editor
- // inRowIndex: int
- // grid row index
- dojo.setSelectable(this.grid.domNode, false);
- this.cancelFormatNode();
- },
- //public
- apply: function(inRowIndex){
- // summary:
- // apply edit from cell editor
- // inRowIndex: int
- // grid row index
- this.applyEdit(this.getValue(inRowIndex), inRowIndex);
- this._finish(inRowIndex);
- },
- cancel: function(inRowIndex){
- // summary:
- // cancel cell edit
- // inRowIndex: int
- // grid row index
- this.cancelEdit(inRowIndex);
- this._finish(inRowIndex);
- }
- });
- dgc._Base.markupFactory = function(node, cellDef){
- var d = dojo;
- var formatter = d.trim(d.attr(node, "formatter")||"");
- if(formatter){
- cellDef.formatter = dojo.getObject(formatter);
- }
- var get = d.trim(d.attr(node, "get")||"");
- if(get){
- cellDef.get = dojo.getObject(get);
- }
- var getBoolAttr = function(attr){
- var value = d.trim(d.attr(node, attr)||"");
- return value ? !(value.toLowerCase()=="false") : undefined;
- }
- cellDef.sortDesc = getBoolAttr("sortDesc");
- cellDef.editable = getBoolAttr("editable");
- cellDef.alwaysEditing = getBoolAttr("alwaysEditing");
- cellDef.noresize = getBoolAttr("noresize");
-
- var value = d.trim(d.attr(node, "loadingText")||d.attr(node, "defaultValue")||"");
- if(value){
- cellDef.defaultValue = value;
- }
-
- var getStrAttr = function(attr){
- return d.trim(d.attr(node, attr)||"")||undefined;
- };
- cellDef.styles = getStrAttr("styles");
- cellDef.headerStyles = getStrAttr("headerStyles");
- cellDef.cellStyles = getStrAttr("cellStyles");
- cellDef.classes = getStrAttr("classes");
- cellDef.headerClasses = getStrAttr("headerClasses");
- cellDef.cellClasses = getStrAttr("cellClasses");
- }
-
- dojo.declare("dojox.grid.cells.Cell", dgc._Base, {
- // summary
- // grid cell that provides a standard text input box upon editing
- constructor: function(){
- this.keyFilter = this.keyFilter;
- },
- // keyFilter: RegExp
- // optional regex for disallowing keypresses
- keyFilter: null,
- formatEditing: function(inDatum, inRowIndex){
- this.needFormatNode(inDatum, inRowIndex);
- return '<input class="dojoxGridInput" type="text" value="' + inDatum + '">';
- },
- formatNode: function(inNode, inDatum, inRowIndex){
- this.inherited(arguments);
- // FIXME: feels too specific for this interface
- this.registerOnBlur(inNode, inRowIndex);
- },
- doKey: function(e){
- if(this.keyFilter){
- var key = String.fromCharCode(e.charCode);
- if(key.search(this.keyFilter) == -1){
- dojo.stopEvent(e);
- }
- }
- },
- _finish: function(inRowIndex){
- this.inherited(arguments);
- var n = this.getEditNode(inRowIndex);
- try{
- dojox.grid.util.fire(n, "blur");
- }catch(e){}
- }
- });
- dgc.Cell.markupFactory = function(node, cellDef){
- dgc._Base.markupFactory(node, cellDef);
- var d = dojo;
- var keyFilter = d.trim(d.attr(node, "keyFilter")||"");
- if(keyFilter){
- cellDef.keyFilter = new RegExp(keyFilter);
- }
- }
-
- dojo.declare("dojox.grid.cells.RowIndex", dgc.Cell, {
- name: 'Row',
-
- postscript: function(){
- this.editable = false;
- },
- get: function(inRowIndex){
- return inRowIndex + 1;
- }
- });
- dgc.RowIndex.markupFactory = function(node, cellDef){
- dgc.Cell.markupFactory(node, cellDef);
- }
-
- dojo.declare("dojox.grid.cells.Select", dgc.Cell, {
- // summary:
- // grid cell that provides a standard select for editing
-
- // options: Array
- // text of each item
- options: null,
-
- // values: Array
- // value for each item
- values: null,
-
- // returnIndex: Integer
- // editor returns only the index of the selected option and not the value
- returnIndex: -1,
-
- constructor: function(inCell){
- this.values = this.values || this.options;
- },
- formatEditing: function(inDatum, inRowIndex){
- this.needFormatNode(inDatum, inRowIndex);
- var h = [ '<select class="dojoxGridSelect">' ];
- for (var i=0, o, v; ((o=this.options[i]) !== undefined)&&((v=this.values[i]) !== undefined); i++){
- h.push("<option", (inDatum==v ? ' selected' : ''), ' value="' + v + '"', ">", o, "</option>");
- }
- h.push('</select>');
- return h.join('');
- },
- getValue: function(inRowIndex){
- var n = this.getEditNode(inRowIndex);
- if(n){
- var i = n.selectedIndex, o = n.options[i];
- return this.returnIndex > -1 ? i : o.value || o.innerHTML;
- }
- }
- });
- dgc.Select.markupFactory = function(node, cell){
- dgc.Cell.markupFactory(node, cell);
- var d=dojo;
- var options = d.trim(d.attr(node, "options")||"");
- if(options){
- var o = options.split(',');
- if(o[0] != options){
- cell.options = o;
- }
- }
- var values = d.trim(d.attr(node, "values")||"");
- if(values){
- var v = values.split(',');
- if(v[0] != values){
- cell.values = v;
- }
- }
- }
-
- dojo.declare("dojox.grid.cells.AlwaysEdit", dgc.Cell, {
- // summary:
- // grid cell that is always in an editable state, regardless of grid editing state
- alwaysEditing: true,
- _formatNode: function(inDatum, inRowIndex){
- this.formatNode(this.getEditNode(inRowIndex), inDatum, inRowIndex);
- },
- applyStaticValue: function(inRowIndex){
- var e = this.grid.edit;
- e.applyCellEdit(this.getValue(inRowIndex), this, inRowIndex);
- e.start(this, inRowIndex, true);
- }
- });
- dgc.AlwaysEdit.markupFactory = function(node, cell){
- dgc.Cell.markupFactory(node, cell);
- }
-
- dojo.declare("dojox.grid.cells.Bool", dgc.AlwaysEdit, {
- // summary:
- // grid cell that provides a standard checkbox that is always on for editing
- _valueProp: "checked",
- formatEditing: function(inDatum, inRowIndex){
- return '<input class="dojoxGridInput" type="checkbox"' + (inDatum ? ' checked="checked"' : '') + ' style="width: auto" />';
- },
- doclick: function(e){
- if(e.target.tagName == 'INPUT'){
- this.applyStaticValue(e.rowIndex);
- }
- }
- });
- dgc.Bool.markupFactory = function(node, cell){
- dgc.AlwaysEdit.markupFactory(node, cell);
- }
-})();
-
-}
-
-if(!dojo._hasResource["dojox.grid.cells"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid.cells"] = true;
-dojo.provide("dojox.grid.cells");
-
-
-}
-
-if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.common"] = true;
-dojo.provide("dojo.dnd.common");
-
-dojo.dnd._isMac = navigator.appVersion.indexOf("Macintosh") >= 0;
-dojo.dnd._copyKey = dojo.dnd._isMac ? "metaKey" : "ctrlKey";
-
-dojo.dnd.getCopyKeyState = function(e) {
- // summary: abstracts away the difference between selection on Mac and PC,
- // and returns the state of the "copy" key to be pressed.
- // e: Event: mouse event
- return e[dojo.dnd._copyKey]; // Boolean
-};
-
-dojo.dnd._uniqueId = 0;
-dojo.dnd.getUniqueId = function(){
- // summary: returns a unique string for use with any DOM element
- var id;
- do{
- id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId);
- }while(dojo.byId(id));
- return id;
-};
-
-dojo.dnd._empty = {};
-
-dojo.dnd.isFormElement = function(/*Event*/ e){
- // summary: returns true, if user clicked on a form element
- var t = e.target;
- if(t.nodeType == 3 /*TEXT_NODE*/){
- t = t.parentNode;
- }
- return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0; // Boolean
-};
-
-// doesn't take into account when multiple buttons are pressed
-dojo.dnd._lmb = dojo.isIE ? 1 : 0; // left mouse button
-
-dojo.dnd._isLmbPressed = dojo.isIE ?
- function(e){ return e.button & 1; } : // intentional bit-and
- function(e){ return e.button === 0; };
-
-}
-
-if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.autoscroll"] = true;
-dojo.provide("dojo.dnd.autoscroll");
-
-dojo.dnd.getViewport = function(){
- // summary: returns a viewport size (visible part of the window)
-
- // FIXME: need more docs!!
- var d = dojo.doc, dd = d.documentElement, w = window, b = dojo.body();
- if(dojo.isMozilla){
- return {w: dd.clientWidth, h: w.innerHeight}; // Object
- }else if(!dojo.isOpera && w.innerWidth){
- return {w: w.innerWidth, h: w.innerHeight}; // Object
- }else if (!dojo.isOpera && dd && dd.clientWidth){
- return {w: dd.clientWidth, h: dd.clientHeight}; // Object
- }else if (b.clientWidth){
- return {w: b.clientWidth, h: b.clientHeight}; // Object
- }
- return null; // Object
-};
-
-dojo.dnd.V_TRIGGER_AUTOSCROLL = 32;
-dojo.dnd.H_TRIGGER_AUTOSCROLL = 32;
-
-dojo.dnd.V_AUTOSCROLL_VALUE = 16;
-dojo.dnd.H_AUTOSCROLL_VALUE = 16;
-
-dojo.dnd.autoScroll = function(e){
- // summary:
- // a handler for onmousemove event, which scrolls the window, if
- // necesary
- // e: Event:
- // onmousemove event
-
- // FIXME: needs more docs!
- var v = dojo.dnd.getViewport(), dx = 0, dy = 0;
- if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){
- dx = -dojo.dnd.H_AUTOSCROLL_VALUE;
- }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){
- dx = dojo.dnd.H_AUTOSCROLL_VALUE;
- }
- if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){
- dy = -dojo.dnd.V_AUTOSCROLL_VALUE;
- }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){
- dy = dojo.dnd.V_AUTOSCROLL_VALUE;
- }
- window.scrollBy(dx, dy);
-};
-
-dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1};
-dojo.dnd._validOverflow = {"auto": 1, "scroll": 1};
-
-dojo.dnd.autoScrollNodes = function(e){
- // summary:
- // a handler for onmousemove event, which scrolls the first avaialble
- // Dom element, it falls back to dojo.dnd.autoScroll()
- // e: Event:
- // onmousemove event
-
- // FIXME: needs more docs!
- for(var n = e.target; n;){
- if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){
- var s = dojo.getComputedStyle(n);
- if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){
- var b = dojo._getContentBox(n, s), t = dojo._abs(n, true);
- //
- var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2),
- h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2),
- rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0;
- if(dojo.isWebKit || dojo.isOpera){
- // FIXME: this code should not be here, it should be taken into account
- // either by the event fixing code, or the dojo._abs()
- // FIXME: this code doesn't work on Opera 9.5 Beta
- rx += dojo.body().scrollLeft, ry += dojo.body().scrollTop;
- }
- if(rx > 0 && rx < b.w){
- if(rx < w){
- dx = -w;
- }else if(rx > b.w - w){
- dx = w;
- }
- }
- //
- if(ry > 0 && ry < b.h){
- if(ry < h){
- dy = -h;
- }else if(ry > b.h - h){
- dy = h;
- }
- }
- var oldLeft = n.scrollLeft, oldTop = n.scrollTop;
- n.scrollLeft = n.scrollLeft + dx;
- n.scrollTop = n.scrollTop + dy;
- if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; }
- }
- }
- try{
- n = n.parentNode;
- }catch(x){
- n = null;
- }
- }
- dojo.dnd.autoScroll(e);
-};
-
-}
-
-if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Mover"] = true;
-dojo.provide("dojo.dnd.Mover");
-
-
-
-
-dojo.declare("dojo.dnd.Mover", null, {
- constructor: function(node, e, host){
- // summary: an object, which makes a node follow the mouse,
- // used as a default mover, and as a base class for custom movers
- // node: Node: a node (or node's id) to be moved
- // e: Event: a mouse event, which started the move;
- // only pageX and pageY properties are used
- // host: Object?: object which implements the functionality of the move,
- // and defines proper events (onMoveStart and onMoveStop)
- this.node = dojo.byId(node);
- this.marginBox = {l: e.pageX, t: e.pageY};
- this.mouseButton = e.button;
- var h = this.host = host, d = node.ownerDocument,
- firstEvent = dojo.connect(d, "onmousemove", this, "onFirstMove");
- this.events = [
- dojo.connect(d, "onmousemove", this, "onMouseMove"),
- dojo.connect(d, "onmouseup", this, "onMouseUp"),
- // cancel text selection and text dragging
- dojo.connect(d, "ondragstart", dojo.stopEvent),
- dojo.connect(d.body, "onselectstart", dojo.stopEvent),
- firstEvent
- ];
- // notify that the move has started
- if(h && h.onMoveStart){
- h.onMoveStart(this);
- }
- },
- // mouse event processors
- onMouseMove: function(e){
- // summary: event processor for onmousemove
- // e: Event: mouse event
- dojo.dnd.autoScroll(e);
- var m = this.marginBox;
- this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY});
- dojo.stopEvent(e);
- },
- onMouseUp: function(e){
- if(dojo.isWebKit && dojo.dnd._isMac && this.mouseButton == 2 ?
- e.button == 0 : this.mouseButton == e.button){
- this.destroy();
- }
- dojo.stopEvent(e);
- },
- // utilities
- onFirstMove: function(){
- // summary: makes the node absolute; it is meant to be called only once
- var s = this.node.style, l, t, h = this.host;
- switch(s.position){
- case "relative":
- case "absolute":
- // assume that left and top values are in pixels already
- l = Math.round(parseFloat(s.left));
- t = Math.round(parseFloat(s.top));
- break;
- default:
- s.position = "absolute"; // enforcing the absolute mode
- var m = dojo.marginBox(this.node);
- // event.pageX/pageY (which we used to generate the initial
- // margin box) includes padding and margin set on the body.
- // However, setting the node's position to absolute and then
- // doing dojo.marginBox on it *doesn't* take that additional
- // space into account - so we need to subtract the combined
- // padding and margin. We use getComputedStyle and
- // _getMarginBox/_getContentBox to avoid the extra lookup of
- // the computed style.
- var b = dojo.doc.body;
- var bs = dojo.getComputedStyle(b);
- var bm = dojo._getMarginBox(b, bs);
- var bc = dojo._getContentBox(b, bs);
- l = m.l - (bc.l - bm.l);
- t = m.t - (bc.t - bm.t);
- break;
- }
- this.marginBox.l = l - this.marginBox.l;
- this.marginBox.t = t - this.marginBox.t;
- if(h && h.onFirstMove){
- h.onFirstMove(this);
- }
- dojo.disconnect(this.events.pop());
- },
- destroy: function(){
- // summary: stops the move, deletes all references, so the object can be garbage-collected
- dojo.forEach(this.events, dojo.disconnect);
- // undo global settings
- var h = this.host;
- if(h && h.onMoveStop){
- h.onMoveStop(this);
- }
- // destroy objects
- this.events = this.node = this.host = null;
- }
-});
-
-}
-
-if(!dojo._hasResource["dojo.dnd.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojo.dnd.Moveable"] = true;
-dojo.provide("dojo.dnd.Moveable");
-
-
-
-dojo.declare("dojo.dnd.Moveable", null, {
- // object attributes (for markup)
- handle: "",
- delay: 0,
- skip: false,
-
- constructor: function(node, params){
- // summary: an object, which makes a node moveable
- // node: Node: a node (or node's id) to be moved
- // params: Object: an optional object with additional parameters;
- // following parameters are recognized:
- // handle: Node: a node (or node's id), which is used as a mouse handle
- // if omitted, the node itself is used as a handle
- // delay: Number: delay move by this number of pixels
- // skip: Boolean: skip move of form elements
- // mover: Object: a constructor of custom Mover
- this.node = dojo.byId(node);
- if(!params){ params = {}; }
- this.handle = params.handle ? dojo.byId(params.handle) : null;
- if(!this.handle){ this.handle = this.node; }
- this.delay = params.delay > 0 ? params.delay : 0;
- this.skip = params.skip;
- this.mover = params.mover ? params.mover : dojo.dnd.Mover;
- this.events = [
- dojo.connect(this.handle, "onmousedown", this, "onMouseDown"),
- // cancel text selection and text dragging
- dojo.connect(this.handle, "ondragstart", this, "onSelectStart"),
- dojo.connect(this.handle, "onselectstart", this, "onSelectStart")
- ];
- },
-
- // markup methods
- markupFactory: function(params, node){
- return new dojo.dnd.Moveable(node, params);
- },
-
- // methods
- destroy: function(){
- // summary: stops watching for possible move, deletes all references, so the object can be garbage-collected
- dojo.forEach(this.events, dojo.disconnect);
- this.events = this.node = this.handle = null;
- },
-
- // mouse event processors
- onMouseDown: function(e){
- // summary: event processor for onmousedown, creates a Mover for the node
- // e: Event: mouse event
- if(this.skip && dojo.dnd.isFormElement(e)){ return; }
- if(this.delay){
- this.events.push(
- dojo.connect(this.handle, "onmousemove", this, "onMouseMove"),
- dojo.connect(this.handle, "onmouseup", this, "onMouseUp")
- );
- this._lastX = e.pageX;
- this._lastY = e.pageY;
- }else{
- this.onDragDetected(e);
- }
- dojo.stopEvent(e);
- },
- onMouseMove: function(e){
- // summary: event processor for onmousemove, used only for delayed drags
- // e: Event: mouse event
- if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){
- this.onMouseUp(e);
- this.onDragDetected(e);
- }
- dojo.stopEvent(e);
- },
- onMouseUp: function(e){
- // summary: event processor for onmouseup, used only for delayed drags
- // e: Event: mouse event
- for(var i = 0; i < 2; ++i){
- dojo.disconnect(this.events.pop());
- }
- dojo.stopEvent(e);
- },
- onSelectStart: function(e){
- // summary: event processor for onselectevent and ondragevent
- // e: Event: mouse event
- if(!this.skip || !dojo.dnd.isFormElement(e)){
- dojo.stopEvent(e);
- }
- },
-
- // local events
- onDragDetected: function(/* Event */ e){
- // summary: called when the drag is detected,
- // responsible for creation of the mover
- new this.mover(this.node, e, this);
- },
- onMoveStart: function(/* dojo.dnd.Mover */ mover){
- // summary: called before every move operation
- dojo.publish("/dnd/move/start", [mover]);
- dojo.addClass(dojo.body(), "dojoMove");
- dojo.addClass(this.node, "dojoMoveItem");
- },
- onMoveStop: function(/* dojo.dnd.Mover */ mover){
- // summary: called after every move operation
- dojo.publish("/dnd/move/stop", [mover]);
- dojo.removeClass(dojo.body(), "dojoMove");
- dojo.removeClass(this.node, "dojoMoveItem");
- },
- onFirstMove: function(/* dojo.dnd.Mover */ mover){
- // summary: called during the very first move notification,
- // can be used to initialize coordinates, can be overwritten.
-
- // default implementation does nothing
- },
- onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
- // summary: called during every move notification,
- // should actually move the node, can be overwritten.
- this.onMoving(mover, leftTop);
- var s = mover.node.style;
- s.left = leftTop.l + "px";
- s.top = leftTop.t + "px";
- this.onMoved(mover, leftTop);
- },
- onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
- // summary: called before every incremental move,
- // can be overwritten.
-
- // default implementation does nothing
- },
- onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){
- // summary: called after every incremental move,
- // can be overwritten.
-
- // default implementation does nothing
- }
-});
-
-}
-
-if(!dojo._hasResource["dojox.grid._Builder"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
-dojo._hasResource["dojox.grid._Builder"] = true;
-dojo.provide("dojox.grid._Builder");
-
-
-
-
-(function(){
- var dg = dojox.grid;
-
- var getTdIndex = function(td){
- return td.cellIndex >=0 ? td.cellIndex : dojo.indexOf(td.parentNode.cells, td);
- };
-
- var getTrIndex = function(tr){
- return tr.rowIndex >=0 ? tr.rowIndex : dojo.indexOf(tr.parentNode.childNodes, tr);
- };
-
- var getTr = function(rowOwner, index){
- return rowOwner && ((rowOwner.rows||0)[index] || rowOwner.childNodes[index]);
- };
-
- var findTable = function(node){
- for(var n=node; n && n.tagName!='TABLE'; n=n.parentNode);
- return n;
- };
-
- var ascendDom = function(inNode, inWhile){
- for(var n=inNode; n && inWhile(n); n=n.parentNode);
- return n;
- };
-
- var makeNotTagName = function(inTagName){
- var name = inTagName.toUpperCase();
- return function(node){ return node.tagName != name; };
- };
-
- var rowIndexTag = dojox.grid.util.rowIndexTag;
- var gridViewTag = dojox.grid.util.gridViewTag;
-
- // base class for generating markup for the views
- dg._Builder = dojo.extend(function(view){
- if(view){
- this.view = view;
- this.grid = view.grid;
- }
- },{
- view: null,
- // boilerplate HTML
- _table: '<table class="dojoxGridRowTable" border="0" cellspacing="0" cellpadding="0" role="wairole:presentation"',
-
- // Returns the table variable as an array - and with the view width, if specified
- getTableArray: function(){
- var html = [this._table];
- if(this.view.viewWidth){
- html.push([' style="width:', this.view.viewWidth, ';"'].join(''));
- }
- html.push('>');
- return html;
- },
-
- // generate starting tags for a cell
- generateCellMarkup: function(inCell, inMoreStyles, inMoreClasses, isHeader){
- var result = [], html;
- var waiPrefix = dojo.isFF<3 ? "wairole:" : "";
- if(isHeader){
- html = ['<th tabIndex="-1" role="', waiPrefix, 'columnheader"'];
- }else{
- html = ['<td tabIndex="-1" role="', waiPrefix, 'gridcell"'];
- }
- inCell.colSpan && html.push(' colspan="', inCell.colSpan, '"');
- inCell.rowSpan && html.push(' rowspan="', inCell.rowSpan, '"');
- html.push(' class="dojoxGridCell ');
- inCell.classes && html.push(inCell.classes, ' ');
- inMoreClasses && html.push(inMoreClasses, ' ');
- // result[0] => td opener, style
- result.push(html.join(''));
- // SLOT: result[1] => td classes
- result.push('');
- html = ['" idx="', inCell.index, '" style="'];
- if(inMoreStyles && inMoreStyles[inMoreStyles.length-1] != ';'){
- inMoreStyles += ';';
- }
- html.push(inCell.styles, inMoreStyles||'', inCell.hidden?'display:none;':'');
- inCell.unitWidth && html.push('width:', inCell.unitWidth, ';');
- // result[2] => markup
- result.push(html.join(''));
- // SLOT: result[3] => td style
- result.push('');
- html = [ '"' ];
- inCell.attrs && html.push(" ", inCell.attrs);
- html.push('>');
- // result[4] => td postfix
- result.push(html.join(''));
- // SLOT: result[5] => content
- result.push('');
- // result[6] => td closes
- result.push('</td>');
- return result; // Array
- },
-
- // cell finding
- isCellNode: function(inNode){
- return Boolean(inNode && inNode!=dojo.doc && dojo.attr(inNode, "idx"));
- },
-
- getCellNodeIndex: function(inCellNode){
- return inCellNode ? Number(dojo.attr(inCellNode, "idx")) : -1;
- },
-
- getCellNode: function(inRowNode, inCellIndex){
- for(var i=0, row; row=getTr(inRowNode.firstChild, i); i++){
- for(var j=0, cell; cell=row.cells[j]; j++){
- if(this.getCellNodeIndex(cell) == inCellIndex){
- return cell;
- }
- }
- }
- },
-
- findCellTarget: function(inSourceNode, inTopNode){
- var n = inSourceNode;
- while(n && (!this.isCellNode(n) || (n.offsetParent && gridViewTag in n.offsetParent.parentNode && n.offsetParent.parentNode[gridViewTag] != this.view.id)) && (n!=inTopNode)){
- n = n.parentNode;
- }
- return n!=inTopNode ? n : null
- },
-
- // event decoration
- baseDecorateEvent: function(e){
- e.dispatch = 'do' + e.type;
- e.grid = this.grid;
- e.sourceView = this.view;
- e.cellNode = this.findCellTarget(e.target, e.rowNode);
- e.cellIndex = this.getCellNodeIndex(e.cellNode);
- e.cell = (e.cellIndex >= 0 ? this.grid.getCell(e.cellIndex) : null);
- },
-
- // event dispatch
- findTarget: function(inSource, inTag){
- var n = inSource;
- while(n && (n!=this.domNode) && (!(inTag in n) || (gridViewTag in n && n[gridViewTag] != this.view.id))){
- n = n.parentNode;
- }
- return (n != this.domNode) ? n : null;
- },
-
- findRowTarget: function(inSource){
- return this.findTarget(inSource, rowIndexTag);
- },
-
- isIntraNodeEvent: function(e){
- try{
- return (e.cellNode && e.relatedTarget && dojo.isDescendant(e.relatedTarget, e.cellNode));
- }catch(x){
- // e.relatedTarget has permission problem in FF if it's an input: https://bugzilla.mozilla.org/show_bug.cgi?id=208427
- return false;
- }
- },
-
- isIntraRowEvent: function(e){
- try{
- var row = e.relatedTarget && this.findRowTarget(e.relatedTarget);
- return !row && (e.rowIndex==-1) || row && (e.rowIndex==row.gridRowIndex);
- }catch(x){
- // e.relatedTarget on INPUT has permission problem in FF: https://bugzilla.mozilla.org/show_bug.cgi?id=208427
- return false;
- }
- },
-
- dispatchEvent: function(e){
- if(e.dispatch in this){
- return this[e.dispatch](e);
- }
- },
-
- // dispatched event handlers
- domouseover: function(e){
- if(e.cellNode && (e.cellNode!=this.lastOverCellNode)){
- this.lastOverCellNode = e.cellNode;
- this.grid.onMouseOver(e);
- }
- this.grid.onMouseOverRow(e);
- },
-
- domouseout: function(e){
- if(e.cellNode && (e.cellNode==this.lastOverCellNode) && !this.isIntraNodeEvent(e, this.lastOverCellNode)){
- this.lastOverCellNode = null;
- this.grid.onMouseOut(e);
- if(!this.isIntraRowEvent(e)){
- this.grid.onMouseOutRow(e);
- }
- }
- },
-
- domousedown: function(e){
- if (e.cellNode)
- this.grid.onMouseDown(e);
- this.grid.onMouseDownRow(e)
- }
- });
-
- // Produces html for grid data content. Owned by grid and used internally
- // for rendering data. Override to implement custom rendering.
- dg._ContentBuilder = dojo.extend(function(view){
- dg._Builder.call(this, view);
- },dg._Builder.prototype,{
- update: function(){
- this.prepareHtml();
- },
-
- // cache html for rendering data rows
- prepareHtml: function(){
- var defaultGet=this.grid.get, cells=this.view.structure.cells;
- for(var j=0, row; (row=cells[j]); j++){
- for(var i=0, cell; (cell=row[i]); i++){
- cell.get = cell.get || (cell.value == undefined) && defaultGet;
- cell.markup = this.generateCellMarkup(cell, cell.cellStyles, cell.cellClasses, false);
- }
- }
- },
-
- // time critical: generate html using cache and data source
- generateHtml: function(inDataIndex, inRowIndex){
- var
- html = this.getTableArray(),
- v = this.view,
- cells = v.structure.cells,
- item = this.grid.getItem(inRowIndex);
-
- dojox.grid.util.fire(this.view, "onBeforeRow", [inRowIndex, cells]);
- for(var j=0, row; (row=cells[j]); j++){
- if(row.hidden || row.header){
- continue;
- }
- html.push(!row.invisible ? '<tr>' : '<tr class="dojoxGridInvisible">');
- for(var i=0, cell, m, cc, cs; (cell=row[i]); i++){
- m = cell.markup, cc = cell.customClasses = [], cs = cell.customStyles = [];
- // content (format can fill in cc and cs as side-effects)
- m[5] = cell.format(inRowIndex, item);
- // classes
- m[1] = cc.join(' ');
- // styles
- m[3] = cs.join(';');
- // in-place concat
- html.push.apply(html, m);
- }
- html.push('</tr>');
- }
- html.push('</table>');
- return html.join(''); // String
- },
-
- decorateEvent: function(e){
- e.rowNode = this.findRowTarget(e.target);
- if(!e.rowNode){return false};
- e.rowIndex = e.rowNode[rowIndexTag];
- this.baseDecorateEvent(e);
- e.cell = this.grid.getCell(e.cellIndex);
- return true; // Boolean
- }
- });
-
- // Produces html for grid header content. Owned by grid and used internally
- // for rendering data. Override to implement custom rendering.
- dg._HeaderBuilder = dojo.extend(function(view){
- this.moveable = null;
- dg._Builder.call(this, view);
- },dg._Builder.prototype,{
- _skipBogusClicks: false,
- overResizeWidth: 4,
- minColWidth: 1,
-
- update: function(){
- if(this.tableMap){
- this.tableMap.mapRows(this.view.structure.cells);
- }else{
- this.tableMap = new dg._TableMap(this.view.structure.cells);
- }
- },
-
- generateHtml: function(inGetValue, inValue){
- var html = this.getTableArray(), cells = this.view.s
<TRUNCATED>