      1 /*
      2  * JBoss, Home of Professional Open Source
      3  * Copyright ${year}, Red Hat, Inc. and individual contributors
      4  * by the @authors tag. See the copyright.txt in the distribution for a
      5  * full listing of individual contributors.
      6  *
      7  * This is free software; you can redistribute it and/or modify it
      8  * under the terms of the GNU Lesser General Public License as
      9  * published by the Free Software Foundation; either version 2.1 of
     10  * the License, or (at your option) any later version.
     11  *
     12  * This software is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
     15  * Lesser General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU Lesser General Public
     18  * License along with this software; if not, write to the Free
     19  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
     20  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
     21  */
     22
     23
     24 (function ($, rf) {
     25
     26     rf.ui = rf.ui || {};
     27
     28     var __DEFAULT_OPTIONS = {
     29         expandSingle : true,
     30         bubbleSelection : true
     31     };
     32
     33     rf.ui.PanelMenu = rf.BaseComponent.extendClass({
     34             // class name
     35             name:"PanelMenu",
     36
     37             /**
     38              * @class PanelMenu
     39              * @name PanelMenu
     40              *
     41              * @constructor
     42              * @param {String} componentId - component id
     43              * @param {Hash} options - params
     44              * */
     45             init : function (componentId, options) {
     46                 $super.constructor.call(this, componentId);
     47                 this.items = {};
     48                 this.attachToDom();
     49
     50                 this.options = $.extend(this.options, __DEFAULT_OPTIONS, options || {});
     51                 this.activeItem = this.__getValueInput().value;
     52                 this.nestingLevel = 0;
     53
     54                 this.__addUserEventHandler("collapse");
     55                 this.__addUserEventHandler("expand");
     56             },
     57
     58             addItem: function(item) {
     59                 this.items[item.itemName] = item;
     60             },
     61
     62             deleteItem: function(item) {
     63                 delete this.items[item.itemName];
     64             },
     65
     66             getSelectedItem: function() {
     67                 return this.getItem(this.selectedItem());
     68             },
     69
     70             getItem: function (name) {
     71                 return this.items[name];
     72             },
     73
     74             /***************************** Public Methods  ****************************************************************/
     75             /**
     76              * @methodOf
     77              * @name PanelMenu#selectItem
     78              *
     79              * TODO ...
     80              *
     81              * @param {String} name
     82              * @return {void} TODO ...
     83              */
     84             selectItem: function (name) {
     85                 // TODO implement
     86             },
     87
     88             /**
     89              * @methodOf
     90              * @name PanelMenu#selectedItem
     91              *
     92              * TODO ...
     93              *
     94              * @return {String} TODO ...
     95              */
     96             selectedItem: function (id) {
     97                 if (typeof id != "undefined") {
     98                     var valueInput = this.__getValueInput();
     99                     var prevActiveItem = valueInput.value;
    100
    101                     this.activeItem = id;
    102                     valueInput.value = id;
    103
    104                     for (var itemName in this.items) {
    105                         var item = this.items[itemName];
    106                         if (item.__isSelected()) {
    107                             item.__unselect();
    108                         }
    109                     }
    110
    111                     return prevActiveItem;
    112                 } else {
    113                     return this.activeItem;
    114                 }
    115             },
    116
    117             __getValueInput : function() {
    118                 return document.getElementById(this.id + "-value");
    119             },
    120
    121             /**
    122              * @methodOf
    123              * @name PanelMenu#expandAll
    124              *
    125              * TODO ...
    126              *
    127              * @return {void} TODO ...
    128              */
    129             expandAll: function () {
    130                 // TODO implement
    131             },
    132
    133             /**
    134              * @methodOf
    135              * @name PanelMenu#collapseAll
    136              *
    137              * TODO ...
    138              *
    139              * @return {void} TODO ...
    140              */
    141             collapseAll: function () {
    142                 // TODO implement
    143             },
    144
    145             /**
    146              * @methodOf
    147              * @name PanelMenu#expandGroup
    148              *
    149              * TODO ...
    150              *
    151              * @param {String} groupName
    152              * @return {void} TODO ...
    153              */
    154             expandGroup: function (groupName) {
    155                 // TODO implement
    156             },
    157
    158             /**
    159              * @methodOf
    160              * @name PanelMenu#collapseGroup
    161              *
    162              * TODO ...
    163              *
    164              * @param {String} groupName
    165              * @return {void} TODO ...
    166              */
    167             collapseGroup: function (groupName) {
    168                 // TODO implement
    169             },
    170
    171
    172             /***************************** Private Methods ****************************************************************/
    173
    174
    175             __panelMenu  : function () {
    176                 return $(rf.getDomElement(this.id));
    177             },
    178
    179             __childGroups : function () {
    180                 return this.__panelMenu().children(".rf-pm-top-gr")
    181             },
    182
    183             /**
    184              * @private
    185              * */
    186             __addUserEventHandler : function (name) {
    187                 var handler = this.options["on" + name];
    188                 if (handler) {
    189                     //TODO nick - this will cause slowdowns in IE
    190                     rf.Event.bindById(this.id, name, handler);
    191                 }
    192             },
    193
    194             __isActiveItem: function(item) {
    195                 return item.itemName == this.activeItem;
    196             },
    197
    198             __collapseGroups : function (source) {
    199                 var topGroup = source.__rfTopGroup();
    200                 this.__childGroups().each(function (index, group) {
    201                     if (group.id != source.getEventElement() && (!topGroup || group.id != topGroup.id)) {
    202                         rf.component(group).__collapse();
    203                     }
    204                 });
    205
    206             },
    207
    208             destroy: function () {
    209                 rf.Event.unbindById(this.id, "." + this.namespace);
    210                 $super.destroy.call(this);
    211             }
    212         });
    213
    214     // define super class link
    215     var $super = rf.ui.PanelMenu.$super;
    216
    217 })(RichFaces.jQuery, RichFaces);
    218