Subversion Repositories Applications.papyrus

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
        Copyright (c) 2004-2006, The Dojo Foundation
        All Rights Reserved.

        Licensed under the Academic Free License version 2.1 or above OR the
        modified BSD license. For more information on Dojo licensing, see:

                http://dojotoolkit.org/community/licensing.shtml
*/

dojo.provide("dojo.widget.Menu2");
dojo.require("dojo.widget.PopupContainer");
dojo.declare("dojo.widget.MenuBase", null, function () {
        this.eventNames = {open:""};
}, {isContainer:true, isMenu:true, eventNaming:"default", templateCssString:"\n.dojoPopupMenu2 {\n\tposition: absolute;\n\tborder: 1px solid #7298d0;\n\tbackground:#85aeec url(images/soriaMenuBg.gif) repeat-x bottom left !important;\n\tpadding: 1px;\n\tmargin-top: 1px;\n\tmargin-bottom: 1px;\n}\n\n.dojoMenuItem2{\n\twhite-space: nowrap;\n\tfont: menu;\n\tmargin: 0;\n}\n\n.dojoMenuItem2Hover {\n\tbackground-color: #D2E4FD;\n\tcursor:pointer;\n\tcursor:hand;\n}\n\n.dojoMenuItem2Icon {\n\tposition: relative;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\twidth: 16px;\n\theight: 16px;\n\tpadding-right: 3px;\n}\n\n.dojoMenuItem2Label {\n\tposition: relative;\n\tvertical-align: middle;\n}\n\n/* main label text */\n.dojoMenuItem2Label {\n\tposition: relative;\n\tvertical-align: middle;\n}\n\n.dojoMenuItem2Accel {\n\tposition: relative;\n\tvertical-align: middle;\n\tpadding-left: 3px;\n}\n\n.dojoMenuItem2Disabled .dojoMenuItem2Label,\n.dojoMenuItem2Disabled .dojoMenuItem2Accel {\n\tcolor: #607a9e;\n}\n\n.dojoMenuItem2Submenu {\n\tposition: relative;\n\tbackground-position: center center;\n\tbackground-repeat: no-repeat;\n\tbackground-image: url(images/submenu_off.gif);\n\twidth: 5px;\n\theight: 9px;\n\tpadding-left: 3px;\n}\n.dojoMenuItem2Hover .dojoMenuItem2Submenu {\n\tbackground-image: url(images/submenu_on.gif);\n}\n\n.dojoMenuItem2Disabled .dojoMenuItem2Submenu {\n\tbackground-image: url(images/submenu_disabled.gif);\n}\n\n.dojoMenuSeparator2 {\n\tfont-size: 1px;\n\tmargin: 0;\n}\n\n.dojoMenuSeparator2Top {\n\theight: 50%;\n\tborder-bottom: 1px solid #7a98c4;\n\tmargin: 0px 2px;\n\tfont-size: 1px;\n}\n\n.dojoMenuSeparator2Bottom {\n\theight: 50%;\n\tborder-top: 1px solid #c9deff;\n\tmargin: 0px 2px;\n\tfont-size: 1px;\n}\n\n.dojoMenuBar2 {\n\tbackground:#85aeec url(images/soriaBarBg.gif) repeat-x top left;\n\t/*border-bottom:1px solid #6b9fec;*/\n\tpadding: 1px;\n}\n\n.dojoMenuBar2 .dojoMenuItem2 {\n\twhite-space: nowrap;\n\tfont: menu;\n\tmargin: 0;\n\tposition: relative;\n\tvertical-align: middle;\n\tz-index: 1;\n\tpadding: 3px 8px;\n\tdisplay: inline;/* needed in khtml to display correctly */\n\tdisplay: -moz-inline-box;/* needed in firefox */\n\tcursor:pointer;\n\tcursor:hand;\n}\n\n.dojoMenuBar2 .dojoMenuItem2Hover {\n\tbackground-color:#d2e4fd;\n}\n\n.dojoMenuBar2 .dojoMenuItem2Disabled span {\n\tcolor: #4f6582;\n}\n", templateCssPath:dojo.uri.moduleUri("dojo.widget", "templates/Menu2.css"), submenuDelay:500, initialize:function (args, frag) {
        if (this.eventNaming == "default") {
                for (var eventName in this.eventNames) {
                        this.eventNames[eventName] = this.widgetId + "/" + eventName;
                }
        }
}, _moveToNext:function (evt) {
        this._highlightOption(1);
        return true;
}, _moveToPrevious:function (evt) {
        this._highlightOption(-1);
        return true;
}, _moveToParentMenu:function (evt) {
        if (this._highlighted_option && this.parentMenu) {
                if (evt._menu2UpKeyProcessed) {
                        return true;
                } else {
                        this._highlighted_option.onUnhover();
                        this.closeSubmenu();
                        evt._menu2UpKeyProcessed = true;
                }
        }
        return false;
}, _moveToChildMenu:function (evt) {
        if (this._highlighted_option && this._highlighted_option.submenuId) {
                this._highlighted_option._onClick(true);
                return true;
        }
        return false;
}, _selectCurrentItem:function (evt) {
        if (this._highlighted_option) {
                this._highlighted_option._onClick();
                return true;
        }
        return false;
}, processKey:function (evt) {
        if (evt.ctrlKey || evt.altKey || !evt.key) {
                return false;
        }
        var rval = false;
        switch (evt.key) {
          case evt.KEY_DOWN_ARROW:
                rval = this._moveToNext(evt);
                break;
          case evt.KEY_UP_ARROW:
                rval = this._moveToPrevious(evt);
                break;
          case evt.KEY_RIGHT_ARROW:
                rval = this._moveToChildMenu(evt);
                break;
          case evt.KEY_LEFT_ARROW:
                rval = this._moveToParentMenu(evt);
                break;
          case " ":
          case evt.KEY_ENTER:
                if (rval = this._selectCurrentItem(evt)) {
                        break;
                }
          case evt.KEY_ESCAPE:
          case evt.KEY_TAB:
                this.close(true);
                rval = true;
                break;
        }
        return rval;
}, _findValidItem:function (dir, curItem) {
        if (curItem) {
                curItem = dir > 0 ? curItem.getNextSibling() : curItem.getPreviousSibling();
        }
        for (var i = 0; i < this.children.length; ++i) {
                if (!curItem) {
                        curItem = dir > 0 ? this.children[0] : this.children[this.children.length - 1];
                }
                if (curItem.onHover && curItem.isShowing()) {
                        return curItem;
                }
                curItem = dir > 0 ? curItem.getNextSibling() : curItem.getPreviousSibling();
        }
}, _highlightOption:function (dir) {
        var item;
        if ((!this._highlighted_option)) {
                item = this._findValidItem(dir);
        } else {
                item = this._findValidItem(dir, this._highlighted_option);
        }
        if (item) {
                if (this._highlighted_option) {
                        this._highlighted_option.onUnhover();
                }
                item.onHover();
                dojo.html.scrollIntoView(item.domNode);
                try {
                        var node = dojo.html.getElementsByClass("dojoMenuItem2Label", item.domNode)[0];
                        node.focus();
                }
                catch (e) {
                }
        }
}, onItemClick:function (item) {
}, closeSubmenu:function (force) {
        if (this.currentSubmenu == null) {
                return;
        }
        this.currentSubmenu.close(force);
        this.currentSubmenu = null;
        this.currentSubmenuTrigger.is_open = false;
        this.currentSubmenuTrigger._closedSubmenu(force);
        this.currentSubmenuTrigger = null;
}});
dojo.widget.defineWidget("dojo.widget.PopupMenu2", [dojo.widget.HtmlWidget, dojo.widget.PopupContainerBase, dojo.widget.MenuBase], function () {
        this.targetNodeIds = [];
}, {templateString:"<table class=\"dojoPopupMenu2\" border=0 cellspacing=0 cellpadding=0 style=\"display: none; position: absolute;\">" + "<tbody dojoAttachPoint=\"containerNode\"></tbody>" + "</table>", submenuOverlap:5, contextMenuForWindow:false, parentMenu:null, postCreate:function () {
        if (this.contextMenuForWindow) {
                var doc = dojo.body();
                this.bindDomNode(doc);
        } else {
                if (this.targetNodeIds.length > 0) {
                        dojo.lang.forEach(this.targetNodeIds, this.bindDomNode, this);
                }
        }
        this._subscribeSubitemsOnOpen();
}, _subscribeSubitemsOnOpen:function () {
        var subItems = this.getChildrenOfType(dojo.widget.MenuItem2);
        for (var i = 0; i < subItems.length; i++) {
                dojo.event.topic.subscribe(this.eventNames.open, subItems[i], "menuOpen");
        }
}, getTopOpenEvent:function () {
        var menu = this;
        while (menu.parentMenu) {
                menu = menu.parentMenu;
        }
        return menu.openEvent;
}, bindDomNode:function (node) {
        node = dojo.byId(node);
        var win = dojo.html.getElementWindow(node);
        if (dojo.html.isTag(node, "iframe") == "iframe") {
                win = dojo.html.iframeContentWindow(node);
                node = dojo.withGlobal(win, dojo.body);
        }
        dojo.widget.Menu2.OperaAndKonqFixer.fixNode(node);
        dojo.event.kwConnect({srcObj:node, srcFunc:"oncontextmenu", targetObj:this, targetFunc:"onOpen", once:true});
        if (dojo.render.html.moz && win.document.designMode.toLowerCase() == "on") {
                dojo.event.browser.addListener(node, "contextmenu", dojo.lang.hitch(this, "onOpen"));
        }
        dojo.widget.PopupManager.registerWin(win);
}, unBindDomNode:function (nodeName) {
        var node = dojo.byId(nodeName);
        dojo.event.kwDisconnect({srcObj:node, srcFunc:"oncontextmenu", targetObj:this, targetFunc:"onOpen", once:true});
        dojo.widget.Menu2.OperaAndKonqFixer.cleanNode(node);
}, _openAsSubmenu:function (parent, explodeSrc, orient) {
        if (this.isShowingNow) {
                return;
        }
        this.parentMenu = parent;
        this.open(explodeSrc, parent, explodeSrc, orient);
}, close:function (force) {
        if (this.animationInProgress) {
                dojo.widget.PopupContainerBase.prototype.close.call(this, force);
                return;
        }
        if (this._highlighted_option) {
                this._highlighted_option.onUnhover();
        }
        dojo.widget.PopupContainerBase.prototype.close.call(this, force);
        this.parentMenu = null;
}, closeAll:function (force) {
        if (this.parentMenu) {
                this.parentMenu.closeAll(force);
        } else {
                this.close(force);
        }
}, _openSubmenu:function (submenu, from_item) {
        submenu._openAsSubmenu(this, from_item.arrow, {"TR":"TL", "TL":"TR"});
        this.currentSubmenu = submenu;
        this.currentSubmenuTrigger = from_item;
        this.currentSubmenuTrigger.is_open = true;
}, focus:function () {
        if (this.currentSubmenuTrigger) {
                if (this.currentSubmenuTrigger.caption) {
                        try {
                                this.currentSubmenuTrigger.caption.focus();
                        }
                        catch (e) {
                        }
                } else {
                        try {
                                this.currentSubmenuTrigger.domNode.focus();
                        }
                        catch (e) {
                        }
                }
        }
}, onOpen:function (e) {
        this.openEvent = e;
        if (e["target"]) {
                this.openedForWindow = dojo.html.getElementWindow(e.target);
        } else {
                this.openedForWindow = null;
        }
        var x = e.pageX, y = e.pageY;
        var win = dojo.html.getElementWindow(e.target);
        var iframe = win._frameElement || win.frameElement;
        if (iframe) {
                var cood = dojo.html.abs(iframe, true);
                x += cood.x - dojo.withGlobal(win, dojo.html.getScroll).left;
                y += cood.y - dojo.withGlobal(win, dojo.html.getScroll).top;
        }
        this.open(x, y, null, [x, y]);
        dojo.event.browser.stopEvent(e);
}});
dojo.widget.defineWidget("dojo.widget.MenuItem2", dojo.widget.HtmlWidget, function () {
        this.eventNames = {engage:""};
}, {templateString:"<tr class=\"dojoMenuItem2\" dojoAttachEvent=\"onMouseOver: onHover; onMouseOut: onUnhover; onClick: _onClick; onKey:onKey;\">" + "<td><div class=\"${this.iconClass}\" style=\"${this.iconStyle}\"></div></td>" + "<td tabIndex=\"-1\" class=\"dojoMenuItem2Label\" dojoAttachPoint=\"caption\">${this.caption}</td>" + "<td class=\"dojoMenuItem2Accel\">${this.accelKey}</td>" + "<td><div class=\"dojoMenuItem2Submenu\" style=\"display:${this.arrowDisplay};\" dojoAttachPoint=\"arrow\"></div></td>" + "</tr>", is_hovering:false, hover_timer:null, is_open:false, topPosition:0, caption:"Untitled", accelKey:"", iconSrc:"", disabledClass:"dojoMenuItem2Disabled", iconClass:"dojoMenuItem2Icon", submenuId:"", eventNaming:"default", highlightClass:"dojoMenuItem2Hover", postMixInProperties:function () {
        this.iconStyle = "";
        if (this.iconSrc) {
                if ((this.iconSrc.toLowerCase().substring(this.iconSrc.length - 4) == ".png") && (dojo.render.html.ie55 || dojo.render.html.ie60)) {
                        this.iconStyle = "filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.iconSrc + "', sizingMethod='image')";
                } else {
                        this.iconStyle = "background-image: url(" + this.iconSrc + ")";
                }
        }
        this.arrowDisplay = this.submenuId ? "block" : "none";
        dojo.widget.MenuItem2.superclass.postMixInProperties.apply(this, arguments);
}, fillInTemplate:function () {
        dojo.html.disableSelection(this.domNode);
        if (this.disabled) {
                this.setDisabled(true);
        }
        if (this.eventNaming == "default") {
                for (var eventName in this.eventNames) {
                        this.eventNames[eventName] = this.widgetId + "/" + eventName;
                }
        }
}, onHover:function () {
        this.onUnhover();
        if (this.is_hovering) {
                return;
        }
        if (this.is_open) {
                return;
        }
        if (this.parent._highlighted_option) {
                this.parent._highlighted_option.onUnhover();
        }
        this.parent.closeSubmenu();
        this.parent._highlighted_option = this;
        dojo.widget.PopupManager.setFocusedMenu(this.parent);
        this._highlightItem();
        if (this.is_hovering) {
                this._stopSubmenuTimer();
        }
        this.is_hovering = true;
        this._startSubmenuTimer();
}, onUnhover:function () {
        if (!this.is_open) {
                this._unhighlightItem();
        }
        this.is_hovering = false;
        this.parent._highlighted_option = null;
        if (this.parent.parentMenu) {
                dojo.widget.PopupManager.setFocusedMenu(this.parent.parentMenu);
        }
        this._stopSubmenuTimer();
}, _onClick:function (focus) {
        var displayingSubMenu = false;
        if (this.disabled) {
                return false;
        }
        if (this.submenuId) {
                if (!this.is_open) {
                        this._stopSubmenuTimer();
                        this._openSubmenu();
                }
                displayingSubMenu = true;
        } else {
                this.onUnhover();
                this.parent.closeAll(true);
        }
        this.onClick();
        dojo.event.topic.publish(this.eventNames.engage, this);
        if (displayingSubMenu && focus) {
                dojo.widget.getWidgetById(this.submenuId)._highlightOption(1);
        }
        return;
}, onClick:function () {
        this.parent.onItemClick(this);
}, _highlightItem:function () {
        dojo.html.addClass(this.domNode, this.highlightClass);
}, _unhighlightItem:function () {
        dojo.html.removeClass(this.domNode, this.highlightClass);
}, _startSubmenuTimer:function () {
        this._stopSubmenuTimer();
        if (this.disabled) {
                return;
        }
        var self = this;
        var closure = function () {
                return function () {
                        self._openSubmenu();
                };
        }();
        this.hover_timer = dojo.lang.setTimeout(closure, this.parent.submenuDelay);
}, _stopSubmenuTimer:function () {
        if (this.hover_timer) {
                dojo.lang.clearTimeout(this.hover_timer);
                this.hover_timer = null;
        }
}, _openSubmenu:function () {
        if (this.disabled) {
                return;
        }
        this.parent.closeSubmenu();
        var submenu = dojo.widget.getWidgetById(this.submenuId);
        if (submenu) {
                this.parent._openSubmenu(submenu, this);
        }
}, _closedSubmenu:function () {
        this.onUnhover();
}, setDisabled:function (value) {
        this.disabled = value;
        if (this.disabled) {
                dojo.html.addClass(this.domNode, this.disabledClass);
        } else {
                dojo.html.removeClass(this.domNode, this.disabledClass);
        }
}, enable:function () {
        this.setDisabled(false);
}, disable:function () {
        this.setDisabled(true);
}, menuOpen:function (message) {
}});
dojo.widget.defineWidget("dojo.widget.MenuSeparator2", dojo.widget.HtmlWidget, {templateString:"<tr class=\"dojoMenuSeparator2\"><td colspan=4>" + "<div class=\"dojoMenuSeparator2Top\"></div>" + "<div class=\"dojoMenuSeparator2Bottom\"></div>" + "</td></tr>", postCreate:function () {
        dojo.html.disableSelection(this.domNode);
}});
dojo.widget.defineWidget("dojo.widget.MenuBar2", [dojo.widget.HtmlWidget, dojo.widget.MenuBase], {menuOverlap:2, templateString:"<div class=\"dojoMenuBar2\" dojoAttachPoint=\"containerNode\" tabIndex=\"0\"></div>", close:function (force) {
        if (this._highlighted_option) {
                this._highlighted_option.onUnhover();
        }
        this.closeSubmenu(force);
}, closeAll:function (force) {
        this.close(force);
}, processKey:function (evt) {
        if (evt.ctrlKey || evt.altKey) {
                return false;
        }
        var rval = false;
        switch (evt.key) {
          case evt.KEY_DOWN_ARROW:
                rval = this._moveToChildMenu(evt);
                break;
          case evt.KEY_UP_ARROW:
                rval = this._moveToParentMenu(evt);
                break;
          case evt.KEY_RIGHT_ARROW:
                rval = this._moveToNext(evt);
                break;
          case evt.KEY_LEFT_ARROW:
                rval = this._moveToPrevious(evt);
                break;
          default:
                rval = dojo.widget.MenuBar2.superclass.processKey.apply(this, arguments);
                break;
        }
        return rval;
}, postCreate:function () {
        dojo.widget.MenuBar2.superclass.postCreate.apply(this, arguments);
        this.isShowingNow = true;
}, _openSubmenu:function (submenu, from_item) {
        submenu._openAsSubmenu(this, from_item.domNode, {"BL":"TL", "TL":"BL"});
        this.currentSubmenu = submenu;
        this.currentSubmenuTrigger = from_item;
        this.currentSubmenuTrigger.is_open = true;
}});
dojo.widget.defineWidget("dojo.widget.MenuBarItem2", dojo.widget.MenuItem2, {templateString:"<span class=\"dojoMenuItem2\" dojoAttachEvent=\"onMouseOver: onHover; onMouseOut: onUnhover; onClick: _onClick;\">${this.caption}</span>"});
dojo.widget.Menu2.OperaAndKonqFixer = new function () {
        var implement = true;
        var delfunc = false;
        if (!dojo.lang.isFunction(dojo.doc().oncontextmenu)) {
                dojo.doc().oncontextmenu = function () {
                        implement = false;
                        delfunc = true;
                };
        }
        if (dojo.doc().createEvent) {
                try {
                        var e = dojo.doc().createEvent("MouseEvents");
                        e.initMouseEvent("contextmenu", 1, 1, dojo.global(), 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, null);
                        dojo.doc().dispatchEvent(e);
                }
                catch (e) {
                }
        } else {
                implement = false;
        }
        if (delfunc) {
                delete dojo.doc().oncontextmenu;
        }
        this.fixNode = function (node) {
                if (implement) {
                        if (!dojo.lang.isFunction(node.oncontextmenu)) {
                                node.oncontextmenu = function (e) {
                                };
                        }
                        if (dojo.render.html.opera) {
                                node._menufixer_opera = function (e) {
                                        if (e.ctrlKey) {
                                                this.oncontextmenu(e);
                                        }
                                };
                                dojo.event.connect(node, "onclick", node, "_menufixer_opera");
                        } else {
                                node._menufixer_konq = function (e) {
                                        if (e.button == 2) {
                                                e.preventDefault();
                                                this.oncontextmenu(e);
                                        }
                                };
                                dojo.event.connect(node, "onmousedown", node, "_menufixer_konq");
                        }
                }
        };
        this.cleanNode = function (node) {
                if (implement) {
                        if (node._menufixer_opera) {
                                dojo.event.disconnect(node, "onclick", node, "_menufixer_opera");
                                delete node._menufixer_opera;
                        } else {
                                if (node._menufixer_konq) {
                                        dojo.event.disconnect(node, "onmousedown", node, "_menufixer_konq");
                                        delete node._menufixer_konq;
                                }
                        }
                        if (node.oncontextmenu) {
                                delete node.oncontextmenu;
                        }
                }
        };
};