ginebra2/chrome/bedrockchrome/contextmenu.snippet/contextmenu.js
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
parent 3 0954f5dd2cd0
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
hgs
parents: 0
diff changeset
     1
var cm_TheContextMenu;
hgs
parents: 0
diff changeset
     2
hgs
parents: 0
diff changeset
     3
// Return true if the given element's className includes the given class.
hgs
parents: 0
diff changeset
     4
function hasClass(ele,cls) {
hgs
parents: 0
diff changeset
     5
    return ele.className.match(new RegExp('(\\s|^)'+cls+'(\\s|$)'));
hgs
parents: 0
diff changeset
     6
}
hgs
parents: 0
diff changeset
     7
hgs
parents: 0
diff changeset
     8
// Remove a class from an element's className.
hgs
parents: 0
diff changeset
     9
function removeClass(ele,cls) {
hgs
parents: 0
diff changeset
    10
    if (hasClass(ele,cls)) {
hgs
parents: 0
diff changeset
    11
        var reg = new RegExp('(\\s|^)'+cls+'(\\s|$)');
hgs
parents: 0
diff changeset
    12
        ele.className=ele.className.replace(reg,' ');
0
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    13
    }
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    14
}
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
    15
3
hgs
parents: 0
diff changeset
    16
function ContextMenu(snippetId, contentView) {
hgs
parents: 0
diff changeset
    17
    this.snippetId = snippetId;
hgs
parents: 0
diff changeset
    18
    this.mainDiv = undefined;
hgs
parents: 0
diff changeset
    19
    this.tailEl = undefined;
hgs
parents: 0
diff changeset
    20
    this.contentView = contentView;
hgs
parents: 0
diff changeset
    21
    this.showTimeoutId = 0;
16
hgs
parents: 3
diff changeset
    22
    this.editingSnippet = undefined;
3
hgs
parents: 0
diff changeset
    23
    // Width of a tab with no text, just the icon.  Icons must all be the same width.
hgs
parents: 0
diff changeset
    24
    // Update this if icon size or tab border width etc. changes -- or better yet, determine it dynamically.
hgs
parents: 0
diff changeset
    25
    this.normalTabWidth = 64;
hgs
parents: 0
diff changeset
    26
    // Height of the menu is the max possible height to be used when positioning the snippet
hgs
parents: 0
diff changeset
    27
    this.menuHeight = 272;
16
hgs
parents: 3
diff changeset
    28
    this.snippetWidth = 0;
hgs
parents: 3
diff changeset
    29
    // Width of the menu when it has no tab 
hgs
parents: 3
diff changeset
    30
    this.menuWidth = 130;
3
hgs
parents: 0
diff changeset
    31
    // ContextMenu is a singleton to avoid problems with scope-chaining in some of the
hgs
parents: 0
diff changeset
    32
    // callbacks that it uses.  See handleTabActivate.
hgs
parents: 0
diff changeset
    33
    if (cm_TheContextMenu != undefined) app.debug("ERROR: cm_TheContextMenu must be a singleton");
hgs
parents: 0
diff changeset
    34
    cm_TheContextMenu = this;
hgs
parents: 0
diff changeset
    35
hgs
parents: 0
diff changeset
    36
    // Create tabs and their corresponding menus based on JSON data.
hgs
parents: 0
diff changeset
    37
    this.createTabsElement = function(data) {
hgs
parents: 0
diff changeset
    38
        this.mainDiv = document.createElement("div");
hgs
parents: 0
diff changeset
    39
        this.mainDiv.setAttribute("class", "ContextMenuDiv");
hgs
parents: 0
diff changeset
    40
        this.mainDiv.setAttribute("id", "cm_mainDivId");
hgs
parents: 0
diff changeset
    41
hgs
parents: 0
diff changeset
    42
        var tabsDiv = document.createElement("div");
hgs
parents: 0
diff changeset
    43
        tabsDiv.setAttribute("class", "TabsDiv");
hgs
parents: 0
diff changeset
    44
        tabsDiv.setAttribute("id", "cm_tabsDivId");
hgs
parents: 0
diff changeset
    45
hgs
parents: 0
diff changeset
    46
        var menuDiv = document.createElement("div");
hgs
parents: 0
diff changeset
    47
        menuDiv.setAttribute("class", "MenuDiv");
hgs
parents: 0
diff changeset
    48
        menuDiv.setAttribute("id", "cm_menuDivId");
hgs
parents: 0
diff changeset
    49
hgs
parents: 0
diff changeset
    50
        var tabsUl = document.createElement("ul");
hgs
parents: 0
diff changeset
    51
        tabsUl.setAttribute("class", "TabsUl");
hgs
parents: 0
diff changeset
    52
        tabsUl.setAttribute("id", "cm_tabsUlId");
hgs
parents: 0
diff changeset
    53
        tabsDiv.appendChild(tabsUl);
hgs
parents: 0
diff changeset
    54
hgs
parents: 0
diff changeset
    55
        var currentTabFound = false;
16
hgs
parents: 3
diff changeset
    56
        if (data.tabs == undefined) {
hgs
parents: 3
diff changeset
    57
            var menuEl = this.createMenuElement(data.menus[0], true);
hgs
parents: 3
diff changeset
    58
            menuDiv.appendChild(menuEl);
hgs
parents: 3
diff changeset
    59
            document.getElementById(this.snippetId).style.width = this.menuWidth;
hgs
parents: 3
diff changeset
    60
            this.mainDiv.appendChild(menuDiv);
hgs
parents: 3
diff changeset
    61
            return this.mainDiv;
hgs
parents: 3
diff changeset
    62
        }
3
hgs
parents: 0
diff changeset
    63
hgs
parents: 0
diff changeset
    64
        // Iterate through the list of tabs.
hgs
parents: 0
diff changeset
    65
        for (var i=0; i < data.tabs.length; i++) {
hgs
parents: 0
diff changeset
    66
            var tab = data.tabs[i];
hgs
parents: 0
diff changeset
    67
            if (tab.visible != undefined) {
hgs
parents: 0
diff changeset
    68
                if (!tab.visible()) {
hgs
parents: 0
diff changeset
    69
                    continue;
hgs
parents: 0
diff changeset
    70
                }
hgs
parents: 0
diff changeset
    71
            }
hgs
parents: 0
diff changeset
    72
hgs
parents: 0
diff changeset
    73
            // Create the tab.
hgs
parents: 0
diff changeset
    74
            var tabEl = document.createElement("li");
hgs
parents: 0
diff changeset
    75
            tabsUl.appendChild(tabEl);
hgs
parents: 0
diff changeset
    76
            
hgs
parents: 0
diff changeset
    77
            var tabDiv = document.createElement("div");
hgs
parents: 0
diff changeset
    78
            tabEl.appendChild(tabDiv);
hgs
parents: 0
diff changeset
    79
hgs
parents: 0
diff changeset
    80
            var iconEl = undefined;
hgs
parents: 0
diff changeset
    81
            var iconHighlightedEl = undefined;
hgs
parents: 0
diff changeset
    82
            
hgs
parents: 0
diff changeset
    83
            // Create the tab's icons.
hgs
parents: 0
diff changeset
    84
            if (tab.icon != undefined) {
hgs
parents: 0
diff changeset
    85
                iconEl = document.createElement("img");
hgs
parents: 0
diff changeset
    86
                iconEl.setAttribute("id", "icon");
hgs
parents: 0
diff changeset
    87
                iconEl.setAttribute("src", tab.icon);
hgs
parents: 0
diff changeset
    88
                tabDiv.appendChild(iconEl);
hgs
parents: 0
diff changeset
    89
            }
hgs
parents: 0
diff changeset
    90
            if (tab.iconHighlighted != undefined) {
hgs
parents: 0
diff changeset
    91
                iconHighlightedEl = document.createElement("img");
hgs
parents: 0
diff changeset
    92
                iconHighlightedEl.setAttribute("id", "iconHighlighted");
hgs
parents: 0
diff changeset
    93
                iconHighlightedEl.setAttribute("src", tab.iconHighlighted);
hgs
parents: 0
diff changeset
    94
                tabDiv.appendChild(iconHighlightedEl);
hgs
parents: 0
diff changeset
    95
            }
hgs
parents: 0
diff changeset
    96
hgs
parents: 0
diff changeset
    97
            // Create the tab's text.
hgs
parents: 0
diff changeset
    98
            if (tab.text != undefined) {
hgs
parents: 0
diff changeset
    99
                var anchorEl = document.createElement("a");
hgs
parents: 0
diff changeset
   100
                tabDiv.appendChild(anchorEl);
hgs
parents: 0
diff changeset
   101
                var textEl = document.createTextNode(tab.text);
hgs
parents: 0
diff changeset
   102
                anchorEl.appendChild(textEl);
hgs
parents: 0
diff changeset
   103
            }
hgs
parents: 0
diff changeset
   104
hgs
parents: 0
diff changeset
   105
            // Create the menu for this tab.
hgs
parents: 0
diff changeset
   106
            var menuEl = this.createMenuElement(tab);
hgs
parents: 0
diff changeset
   107
            menuDiv.appendChild(menuEl);
hgs
parents: 0
diff changeset
   108
hgs
parents: 0
diff changeset
   109
            var tabClassName;
hgs
parents: 0
diff changeset
   110
            if (tab.current == "true") {
hgs
parents: 0
diff changeset
   111
                // This is the current, or selected, tab.
hgs
parents: 0
diff changeset
   112
                tabClassName = "ViewContext_HighlightedTab";
hgs
parents: 0
diff changeset
   113
                tabDiv.className = "ViewContext_HighlightedTabDiv";
hgs
parents: 0
diff changeset
   114
                if(iconEl != undefined) {
hgs
parents: 0
diff changeset
   115
                    iconEl.setAttribute("style", "display: none;");
hgs
parents: 0
diff changeset
   116
                }
hgs
parents: 0
diff changeset
   117
                currentTabFound = true;
hgs
parents: 0
diff changeset
   118
            }
hgs
parents: 0
diff changeset
   119
            else {
hgs
parents: 0
diff changeset
   120
                // Not selected.
hgs
parents: 0
diff changeset
   121
                tabClassName = "ViewContext_NormalTab";
hgs
parents: 0
diff changeset
   122
                tabDiv.className = "ViewContext_NormalTabDiv";
hgs
parents: 0
diff changeset
   123
                if(iconHighlightedEl != undefined) {
hgs
parents: 0
diff changeset
   124
                    iconHighlightedEl.setAttribute("style", "display: none;");
hgs
parents: 0
diff changeset
   125
                }
hgs
parents: 0
diff changeset
   126
hgs
parents: 0
diff changeset
   127
                // Hide its menu.
hgs
parents: 0
diff changeset
   128
                menuEl.style.display = "none";
hgs
parents: 0
diff changeset
   129
            }
hgs
parents: 0
diff changeset
   130
hgs
parents: 0
diff changeset
   131
            if (tab.disabled == "true") {
hgs
parents: 0
diff changeset
   132
                // The tab is disabled, add the appropriate CSS class to it.
hgs
parents: 0
diff changeset
   133
                tabClassName += " ViewContext_DisabledTab";
hgs
parents: 0
diff changeset
   134
            }
hgs
parents: 0
diff changeset
   135
hgs
parents: 0
diff changeset
   136
            tabEl.className = tabClassName;
hgs
parents: 0
diff changeset
   137
hgs
parents: 0
diff changeset
   138
            // Set up callback to show the menu that corresponds to this tab.
hgs
parents: 0
diff changeset
   139
            tabEl.onmouseup = this.handleTabActivate;
hgs
parents: 0
diff changeset
   140
            tabEl.cm_menu = menuEl;
hgs
parents: 0
diff changeset
   141
hgs
parents: 0
diff changeset
   142
            // Remember that this tab is disabled.
hgs
parents: 0
diff changeset
   143
            tabEl.cm_disabled = tab.disabled == "true";
hgs
parents: 0
diff changeset
   144
        }
hgs
parents: 0
diff changeset
   145
hgs
parents: 0
diff changeset
   146
        // If a "current" tab was not specified, highlight the first tab and display its menu.
hgs
parents: 0
diff changeset
   147
        if (!currentTabFound) {
hgs
parents: 0
diff changeset
   148
            var firstTabEl = tabsUl.firstChild;
hgs
parents: 0
diff changeset
   149
            firstTabEl.className = "ViewContext_HighlightedTab";
hgs
parents: 0
diff changeset
   150
            firstTabEl.firstChild.className = "ViewContext_HighlightedTabDiv";
hgs
parents: 0
diff changeset
   151
            firstTabEl.cm_menu.style.display = "";
hgs
parents: 0
diff changeset
   152
        }
hgs
parents: 0
diff changeset
   153
hgs
parents: 0
diff changeset
   154
//        this.tailEl = document.createElement("img");
hgs
parents: 0
diff changeset
   155
//        this.mainDiv.appendChild(this.tailEl);
hgs
parents: 0
diff changeset
   156
//        this.tailEl.setAttribute("id", "cm_tailId");
16
hgs
parents: 3
diff changeset
   157
//        this.tailEl.setAttribute("src", "/contextmenu/menu_tail.png");
3
hgs
parents: 0
diff changeset
   158
hgs
parents: 0
diff changeset
   159
        this.mainDiv.appendChild(tabsDiv);
hgs
parents: 0
diff changeset
   160
        this.mainDiv.appendChild(menuDiv);
hgs
parents: 0
diff changeset
   161
        return this.mainDiv;
hgs
parents: 0
diff changeset
   162
    }
hgs
parents: 0
diff changeset
   163
hgs
parents: 0
diff changeset
   164
    // Create a single menu based on the given data structure.
16
hgs
parents: 3
diff changeset
   165
    this.createMenuElement = function(data, noTab) {
3
hgs
parents: 0
diff changeset
   166
        // Create menu list.
hgs
parents: 0
diff changeset
   167
        var menuUl = document.createElement("ul");
hgs
parents: 0
diff changeset
   168
        menuUl.setAttribute("class", "MenuUl");
hgs
parents: 0
diff changeset
   169
hgs
parents: 0
diff changeset
   170
        for (var i=0; i < data.menuItems.length; i++) {
hgs
parents: 0
diff changeset
   171
            var menuItem = data.menuItems[i];
hgs
parents: 0
diff changeset
   172
hgs
parents: 0
diff changeset
   173
            // Create the item.
hgs
parents: 0
diff changeset
   174
            var itemLi = document.createElement("li");
16
hgs
parents: 3
diff changeset
   175
            if(noTab == true)
hgs
parents: 3
diff changeset
   176
                itemLi.setAttribute("class", "SpMenuLi");
hgs
parents: 3
diff changeset
   177
            else
hgs
parents: 3
diff changeset
   178
                itemLi.setAttribute("class", "MenuLi");
3
hgs
parents: 0
diff changeset
   179
            var itemSpan = document.createElement("div");
hgs
parents: 0
diff changeset
   180
hgs
parents: 0
diff changeset
   181
            // Is it a row if items? enumerate that as a ul inside of this outer li
hgs
parents: 0
diff changeset
   182
            if(menuItem.menuRow != undefined) {
hgs
parents: 0
diff changeset
   183
                var menuRowUl = document.createElement("ul");
hgs
parents: 0
diff changeset
   184
                menuRowUl.setAttribute("class", "MenuRowUl");
hgs
parents: 0
diff changeset
   185
                itemSpan.appendChild(menuRowUl);
hgs
parents: 0
diff changeset
   186
hgs
parents: 0
diff changeset
   187
                for(var j=0; j < menuItem.menuRow.length; j++)
hgs
parents: 0
diff changeset
   188
                {
hgs
parents: 0
diff changeset
   189
                    var menuRowItem = menuItem.menuRow[j];
hgs
parents: 0
diff changeset
   190
                    
hgs
parents: 0
diff changeset
   191
                    var rowItemLi = document.createElement("li");
hgs
parents: 0
diff changeset
   192
                    rowItemLi.setAttribute("class", "MenuRowLi");
hgs
parents: 0
diff changeset
   193
                    menuRowUl.appendChild(rowItemLi);
hgs
parents: 0
diff changeset
   194
                    
hgs
parents: 0
diff changeset
   195
                    // bind to mouseup
hgs
parents: 0
diff changeset
   196
                    rowItemLi.onmouseup =  (function(handler) {
hgs
parents: 0
diff changeset
   197
                        return function() {
hgs
parents: 0
diff changeset
   198
                            if (handler != undefined)
hgs
parents: 0
diff changeset
   199
                                handler();
hgs
parents: 0
diff changeset
   200
                            this.hide();
hgs
parents: 0
diff changeset
   201
                        }.bind(this)
hgs
parents: 0
diff changeset
   202
                    }.bind(this))(menuRowItem.onclick);
hgs
parents: 0
diff changeset
   203
hgs
parents: 0
diff changeset
   204
                    if (menuRowItem.text != undefined) {
hgs
parents: 0
diff changeset
   205
                        var textEl = document.createTextNode(menuRowItem.text);
hgs
parents: 0
diff changeset
   206
                        rowItemLi.appendChild(textEl);
hgs
parents: 0
diff changeset
   207
                    }
hgs
parents: 0
diff changeset
   208
                }
hgs
parents: 0
diff changeset
   209
            }
hgs
parents: 0
diff changeset
   210
            else {
hgs
parents: 0
diff changeset
   211
                itemLi.className += " RegularMenuLi";
hgs
parents: 0
diff changeset
   212
                if (menuItem.disabled == "true" || data.disabled == "true") {
hgs
parents: 0
diff changeset
   213
                    // Disabled item.
16
hgs
parents: 3
diff changeset
   214
                    if (noTab == "true")
hgs
parents: 3
diff changeset
   215
                        itemLi.setAttribute("color", "#888");
hgs
parents: 3
diff changeset
   216
                    else
hgs
parents: 3
diff changeset
   217
                        itemLi.className += " ViewContext_DisabledMenuItem";
3
hgs
parents: 0
diff changeset
   218
                }
hgs
parents: 0
diff changeset
   219
                else {
hgs
parents: 0
diff changeset
   220
                    // Enabled item.  Set up the onmouseup handler.
hgs
parents: 0
diff changeset
   221
                    itemLi.onmouseup = (function(handler) {
hgs
parents: 0
diff changeset
   222
                        return function() {
hgs
parents: 0
diff changeset
   223
                            if (handler != undefined)
hgs
parents: 0
diff changeset
   224
                                handler();
hgs
parents: 0
diff changeset
   225
                            this.hide();
hgs
parents: 0
diff changeset
   226
                        }.bind(this)
hgs
parents: 0
diff changeset
   227
                    }.bind(this))(menuItem.onclick);
hgs
parents: 0
diff changeset
   228
                }
hgs
parents: 0
diff changeset
   229
hgs
parents: 0
diff changeset
   230
                itemLi.onmouseover = function() {
hgs
parents: 0
diff changeset
   231
                    this.className += " MouseOverItem";
hgs
parents: 0
diff changeset
   232
                }.bind(itemLi)
hgs
parents: 0
diff changeset
   233
hgs
parents: 0
diff changeset
   234
                itemLi.onmouseout = function() {
hgs
parents: 0
diff changeset
   235
                    removeClass(this, "MouseOverItem");
hgs
parents: 0
diff changeset
   236
                }.bind(itemLi)
hgs
parents: 0
diff changeset
   237
hgs
parents: 0
diff changeset
   238
                // Create the item's icon.
hgs
parents: 0
diff changeset
   239
                if (menuItem.icon != undefined) {
hgs
parents: 0
diff changeset
   240
                    var iconEl = document.createElement("img");
hgs
parents: 0
diff changeset
   241
                    itemSpan.appendChild(iconEl);
hgs
parents: 0
diff changeset
   242
                    iconEl.setAttribute("src", menuItem.icon);
hgs
parents: 0
diff changeset
   243
                }
0
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   244
3
hgs
parents: 0
diff changeset
   245
                // Create the item's text.
hgs
parents: 0
diff changeset
   246
                if (menuItem.text != undefined) {
hgs
parents: 0
diff changeset
   247
                    var anchorEl = document.createElement("a");
hgs
parents: 0
diff changeset
   248
                    itemSpan.appendChild(anchorEl);
hgs
parents: 0
diff changeset
   249
                    var textEl = document.createTextNode(menuItem.text);
hgs
parents: 0
diff changeset
   250
                    anchorEl.appendChild(textEl);
hgs
parents: 0
diff changeset
   251
                }
hgs
parents: 0
diff changeset
   252
            }
hgs
parents: 0
diff changeset
   253
hgs
parents: 0
diff changeset
   254
            menuUl.appendChild(itemLi);
hgs
parents: 0
diff changeset
   255
            itemLi.appendChild(itemSpan);
hgs
parents: 0
diff changeset
   256
        }
hgs
parents: 0
diff changeset
   257
        return menuUl;
hgs
parents: 0
diff changeset
   258
    }
hgs
parents: 0
diff changeset
   259
    
hgs
parents: 0
diff changeset
   260
    // Handle mouse clicks on tab elements.
hgs
parents: 0
diff changeset
   261
    // Note: "this" refers to the element that was clicked on, ie. the tab item.
hgs
parents: 0
diff changeset
   262
    this.handleTabActivate = function() {
hgs
parents: 0
diff changeset
   263
        var tabsDivChildren = document.getElementById("cm_tabsUlId").childNodes;
hgs
parents: 0
diff changeset
   264
        var otherTabsWidth = 0;
hgs
parents: 0
diff changeset
   265
        // Set the class for each tab.
hgs
parents: 0
diff changeset
   266
        for (var i = 0; i < tabsDivChildren.length; i++) {
hgs
parents: 0
diff changeset
   267
            var tabEl = tabsDivChildren[i];
hgs
parents: 0
diff changeset
   268
            var iconHighlighted = getChildById(tabEl, "iconHighlighted");
hgs
parents: 0
diff changeset
   269
            var icon = getChildById(tabEl, "icon");
hgs
parents: 0
diff changeset
   270
            if (tabEl == this) {
hgs
parents: 0
diff changeset
   271
                // Activate the tab.
hgs
parents: 0
diff changeset
   272
                tabEl.className = "ViewContext_HighlightedTab";
hgs
parents: 0
diff changeset
   273
                //tabEl.firstChild.className = "ViewContext_HighlightedTabDiv";
hgs
parents: 0
diff changeset
   274
                
hgs
parents: 0
diff changeset
   275
                // Show the highlighted icon, if one exists.
hgs
parents: 0
diff changeset
   276
                if(iconHighlighted != undefined) {
hgs
parents: 0
diff changeset
   277
                    iconHighlighted.style.display = "";
hgs
parents: 0
diff changeset
   278
                    
hgs
parents: 0
diff changeset
   279
                    // Hide the normal icon.
hgs
parents: 0
diff changeset
   280
                    if (icon != undefined) {
hgs
parents: 0
diff changeset
   281
                        icon.style.display = "none";
hgs
parents: 0
diff changeset
   282
                    }
hgs
parents: 0
diff changeset
   283
                }
hgs
parents: 0
diff changeset
   284
            }
hgs
parents: 0
diff changeset
   285
            else {
hgs
parents: 0
diff changeset
   286
                // Deactivate the tab.
hgs
parents: 0
diff changeset
   287
                tabEl.className = "ViewContext_NormalTab";
hgs
parents: 0
diff changeset
   288
                //tabEl.firstChildclassName = "ViewContext_NormalTabDiv";
hgs
parents: 0
diff changeset
   289
                
hgs
parents: 0
diff changeset
   290
                // If a highlighted icon exists, switch to the normal one, otherwise leave
hgs
parents: 0
diff changeset
   291
                // the normal one alone.
hgs
parents: 0
diff changeset
   292
                if(iconHighlighted != undefined) {
hgs
parents: 0
diff changeset
   293
                    iconHighlighted.style.display = "none";
hgs
parents: 0
diff changeset
   294
                    if (icon != undefined) {
hgs
parents: 0
diff changeset
   295
                        icon.style.display = "";
hgs
parents: 0
diff changeset
   296
                    }
hgs
parents: 0
diff changeset
   297
                }
hgs
parents: 0
diff changeset
   298
            }
hgs
parents: 0
diff changeset
   299
            if (tabEl.cm_disabled) {
hgs
parents: 0
diff changeset
   300
                tabEl.className += " ViewContext_DisabledTab";
hgs
parents: 0
diff changeset
   301
                //tabEl.firstClassName += " ViewContext_DisabledTabDiv";
hgs
parents: 0
diff changeset
   302
            }
hgs
parents: 0
diff changeset
   303
        }
hgs
parents: 0
diff changeset
   304
hgs
parents: 0
diff changeset
   305
        // Show the menu of the tab that was just clicked.
hgs
parents: 0
diff changeset
   306
        var menuDivChildren = document.getElementById("cm_menuDivId").childNodes;
hgs
parents: 0
diff changeset
   307
        for (var i = 0; i < menuDivChildren.length; i++) {
hgs
parents: 0
diff changeset
   308
            var menuEl = menuDivChildren[i];
hgs
parents: 0
diff changeset
   309
            if (menuEl == this.cm_menu) {
hgs
parents: 0
diff changeset
   310
                menuDivChildren[i].style.display =  "";
hgs
parents: 0
diff changeset
   311
            }
hgs
parents: 0
diff changeset
   312
            else {
hgs
parents: 0
diff changeset
   313
                menuDivChildren[i].style.display =  "none";
hgs
parents: 0
diff changeset
   314
            }
hgs
parents: 0
diff changeset
   315
        }
hgs
parents: 0
diff changeset
   316
        //cm_TheContextMenu.positionTail();
hgs
parents: 0
diff changeset
   317
        //document.getElementById(this.snippetId).clientHeight = this.mainDiv.clientHeight;
hgs
parents: 0
diff changeset
   318
        //document.getElementById("ContextMenuId").setAttribute("style", "height: " + document.getElementById("cm_mainDivId").clientHeight + "px;")
hgs
parents: 0
diff changeset
   319
hgs
parents: 0
diff changeset
   320
        cm_TheContextMenu.updateTabSizes();
hgs
parents: 0
diff changeset
   321
        snippets[cm_TheContextMenu.snippetId].updateOwnerArea();
hgs
parents: 0
diff changeset
   322
    }
hgs
parents: 0
diff changeset
   323
hgs
parents: 0
diff changeset
   324
    // Return the width of the "non-content" part of the element box, ie. thickness of
hgs
parents: 0
diff changeset
   325
    // the padding, the border and the margin.
hgs
parents: 0
diff changeset
   326
    this.getNonContentWidth = function(element) {
hgs
parents: 0
diff changeset
   327
        var tabStyle = document.defaultView.getComputedStyle(element, null);
hgs
parents: 0
diff changeset
   328
        return parseInt(tabStyle["margin-left"]) + parseInt(tabStyle["margin-right"]) +
hgs
parents: 0
diff changeset
   329
               parseInt(tabStyle["padding-left"]) + parseInt(tabStyle["padding-right"]) +
hgs
parents: 0
diff changeset
   330
               parseInt(tabStyle["border-left-width"]) + parseInt(tabStyle["border-right-width"]);
hgs
parents: 0
diff changeset
   331
    }
hgs
parents: 0
diff changeset
   332
hgs
parents: 0
diff changeset
   333
    // Update the tab widths.  Expand the highlighted tab to its maximum width and shrink the
hgs
parents: 0
diff changeset
   334
    // normal tabs to their minimum widths.  Note: it would be preferable to have this done
hgs
parents: 0
diff changeset
   335
    // by CSS.
hgs
parents: 0
diff changeset
   336
    this.updateTabSizes = function() {
hgs
parents: 0
diff changeset
   337
        var tabsUl = document.getElementById("cm_tabsUlId");
hgs
parents: 0
diff changeset
   338
        var tabsDivChildren = tabsUl.childNodes;
hgs
parents: 0
diff changeset
   339
        var otherTabsWidth = 0;
hgs
parents: 0
diff changeset
   340
        var highlightedTab;
hgs
parents: 0
diff changeset
   341
        for (var i = 0; i < tabsDivChildren.length; i++) {
hgs
parents: 0
diff changeset
   342
            var tabEl = tabsDivChildren[i];
hgs
parents: 0
diff changeset
   343
            if (tabEl.className.indexOf("ViewContext_HighlightedTab") != -1) {
hgs
parents: 0
diff changeset
   344
                highlightedTab = tabEl;
hgs
parents: 0
diff changeset
   345
            }
hgs
parents: 0
diff changeset
   346
            else {
hgs
parents: 0
diff changeset
   347
                var newTabWidth = cm_TheContextMenu.normalTabWidth - cm_TheContextMenu.getNonContentWidth(tabEl);
hgs
parents: 0
diff changeset
   348
                tabEl.style.width = newTabWidth;
hgs
parents: 0
diff changeset
   349
                otherTabsWidth += tabEl.offsetWidth;
hgs
parents: 0
diff changeset
   350
            }
hgs
parents: 0
diff changeset
   351
        }
hgs
parents: 0
diff changeset
   352
        if (highlightedTab != undefined) {
hgs
parents: 0
diff changeset
   353
            var newWidth = tabsUl.offsetWidth - otherTabsWidth;
hgs
parents: 0
diff changeset
   354
            newWidth -= cm_TheContextMenu.getNonContentWidth(highlightedTab) + 2;
hgs
parents: 0
diff changeset
   355
            highlightedTab.style.width = newWidth;
hgs
parents: 0
diff changeset
   356
        }
hgs
parents: 0
diff changeset
   357
    }
hgs
parents: 0
diff changeset
   358
hgs
parents: 0
diff changeset
   359
    this.positionTail = function() {
hgs
parents: 0
diff changeset
   360
        // Move the "tail" into position.
hgs
parents: 0
diff changeset
   361
        var tailEl = document.getElementById("cm_tailId");
hgs
parents: 0
diff changeset
   362
        if (tailEl != undefined) {
hgs
parents: 0
diff changeset
   363
            //var mainDiv = document.getElementById("cm_mainDivId");
hgs
parents: 0
diff changeset
   364
            var tailX = (this.mainDiv.clientWidth - tailEl.clientWidth) / 2;
hgs
parents: 0
diff changeset
   365
            var tailY = this.mainDiv.clientHeight;
hgs
parents: 0
diff changeset
   366
            tailEl.setAttribute("style", "position:absolute; top: " + tailY + "px; left: " + tailX);
hgs
parents: 0
diff changeset
   367
        }
hgs
parents: 0
diff changeset
   368
    }
hgs
parents: 0
diff changeset
   369
hgs
parents: 0
diff changeset
   370
    // Create all the DOM elements of the window.
hgs
parents: 0
diff changeset
   371
    this.create = function(menuData) {
hgs
parents: 0
diff changeset
   372
        var snippetEl = document.getElementById(this.snippetId);
hgs
parents: 0
diff changeset
   373
        var el = this.createTabsElement(menuData);
hgs
parents: 0
diff changeset
   374
        snippetEl.appendChild(el);
16
hgs
parents: 3
diff changeset
   375
        snippetEl.insertAdjacentHTML('beforeEnd', '<div class="hiddenLoadImages"></div>');
3
hgs
parents: 0
diff changeset
   376
    }
hgs
parents: 0
diff changeset
   377
hgs
parents: 0
diff changeset
   378
    // Show the content menu.  The menuData must contain an object tree describing the structure of the
hgs
parents: 0
diff changeset
   379
    // tabs and sub-menus.
hgs
parents: 0
diff changeset
   380
    //
hgs
parents: 0
diff changeset
   381
    // Example menu data in JSON format:
hgs
parents: 0
diff changeset
   382
    //        var MenuData = {
hgs
parents: 0
diff changeset
   383
    //            "tabs": [ {
hgs
parents: 0
diff changeset
   384
    //                     "text": "Tab 1",
hgs
parents: 0
diff changeset
   385
    //                     "icon": "tab1.png",
hgs
parents: 0
diff changeset
   386
    //                     "current": "true",
hgs
parents: 0
diff changeset
   387
    //                     "menuItems": [ {
hgs
parents: 0
diff changeset
   388
    //                             "text": Menu item 1,
hgs
parents: 0
diff changeset
   389
    //                             "onclick": handleMenu1,
hgs
parents: 0
diff changeset
   390
    //                             "icon": "menu1.png",
hgs
parents: 0
diff changeset
   391
    //                           },
hgs
parents: 0
diff changeset
   392
    //                           {
hgs
parents: 0
diff changeset
   393
    //                             "text": Menu item 2,
hgs
parents: 0
diff changeset
   394
    //                             "onclick": function() { alert("hello"); },
hgs
parents: 0
diff changeset
   395
    //                             "icon": "menu2.png",
hgs
parents: 0
diff changeset
   396
    //                           },
hgs
parents: 0
diff changeset
   397
    //                         ],
hgs
parents: 0
diff changeset
   398
    //                 },
hgs
parents: 0
diff changeset
   399
    //                 {
hgs
parents: 0
diff changeset
   400
    //                     "text": "Tab 2",
hgs
parents: 0
diff changeset
   401
    //                     "icon": "tab2.png",
hgs
parents: 0
diff changeset
   402
    //                     "menuItems": [ {
hgs
parents: 0
diff changeset
   403
    //                             "text": Menu item 1,
hgs
parents: 0
diff changeset
   404
    //                             "onclick": handleMenu21,
hgs
parents: 0
diff changeset
   405
    //                           },
hgs
parents: 0
diff changeset
   406
    //                           {
hgs
parents: 0
diff changeset
   407
    //                             "text": Menu item 2,
hgs
parents: 0
diff changeset
   408
    //                             "onclick": handleMenu22,
hgs
parents: 0
diff changeset
   409
    //                           },
hgs
parents: 0
diff changeset
   410
    //                         ],
hgs
parents: 0
diff changeset
   411
    //                 },
hgs
parents: 0
diff changeset
   412
    //                ]
hgs
parents: 0
diff changeset
   413
    //        };
hgs
parents: 0
diff changeset
   414
    //
hgs
parents: 0
diff changeset
   415
    
hgs
parents: 0
diff changeset
   416
    this.cancel = function() {
hgs
parents: 0
diff changeset
   417
        //app.debug("CM: cancel " + this.showTimeoutId);
hgs
parents: 0
diff changeset
   418
        clearTimeout(this.showTimeoutId);
hgs
parents: 0
diff changeset
   419
        this.showTimeoutId = 0;
hgs
parents: 0
diff changeset
   420
        this.cleanUp();
hgs
parents: 0
diff changeset
   421
    }
hgs
parents: 0
diff changeset
   422
hgs
parents: 0
diff changeset
   423
    this.cleanUp = function() {
hgs
parents: 0
diff changeset
   424
        // Remove elements from DOM to save memory.
hgs
parents: 0
diff changeset
   425
        var oldEl = document.getElementById("cm_mainDivId");
hgs
parents: 0
diff changeset
   426
        if (oldEl) {
hgs
parents: 0
diff changeset
   427
            var snippetEl = document.getElementById(cm_TheContextMenu.snippetId);
hgs
parents: 0
diff changeset
   428
            snippetEl.removeChild(oldEl);
hgs
parents: 0
diff changeset
   429
        }
hgs
parents: 0
diff changeset
   430
    }
hgs
parents: 0
diff changeset
   431
hgs
parents: 0
diff changeset
   432
    // Hide this window.
hgs
parents: 0
diff changeset
   433
    this.hide = function() {
hgs
parents: 0
diff changeset
   434
        snippets[cm_TheContextMenu.snippetId].hide();
16
hgs
parents: 3
diff changeset
   435
        if (this.editingSnippet != undefined)
hgs
parents: 3
diff changeset
   436
            this.editingSnippet.setContextMenuStatus(false);
3
hgs
parents: 0
diff changeset
   437
    }
hgs
parents: 0
diff changeset
   438
hgs
parents: 0
diff changeset
   439
    this.onHide = function() {
hgs
parents: 0
diff changeset
   440
        this.cleanUp();
hgs
parents: 0
diff changeset
   441
    }
hgs
parents: 0
diff changeset
   442
hgs
parents: 0
diff changeset
   443
    this.show = function(menuData) {
16
hgs
parents: 3
diff changeset
   444
        if (this.editingSnippet != undefined)
hgs
parents: 3
diff changeset
   445
            this.editingSnippet.setContextMenuStatus(true);
hgs
parents: 3
diff changeset
   446
hgs
parents: 3
diff changeset
   447
        document.getElementById(this.snippetId).style.width = this.snippetWidth;
3
hgs
parents: 0
diff changeset
   448
        this.cleanUp();
hgs
parents: 0
diff changeset
   449
        this.create(menuData);
16
hgs
parents: 3
diff changeset
   450
        if (menuData.tabs != undefined)
hgs
parents: 3
diff changeset
   451
            cm_TheContextMenu.updateTabSizes();
3
hgs
parents: 0
diff changeset
   452
        // Use a timer to actually show the window to allow the page re-layout
hgs
parents: 0
diff changeset
   453
        // to finish.  We don't know when this really happens but 50ms seems to
hgs
parents: 0
diff changeset
   454
        // be enough on the N97.  Without this delay the bottom of the window
hgs
parents: 0
diff changeset
   455
        // often gets clipped.
hgs
parents: 0
diff changeset
   456
        setTimeout("cm_TheContextMenu.showIt2()", 50);
hgs
parents: 0
diff changeset
   457
    }
hgs
parents: 0
diff changeset
   458
hgs
parents: 0
diff changeset
   459
    this.showIt2 = function() {
hgs
parents: 0
diff changeset
   460
hgs
parents: 0
diff changeset
   461
        var snippet = snippets[cm_TheContextMenu.snippetId];
hgs
parents: 0
diff changeset
   462
        snippet.updateOwnerArea();
hgs
parents: 0
diff changeset
   463
        snippet.setZValue(2);
hgs
parents: 0
diff changeset
   464
hgs
parents: 0
diff changeset
   465
        this.centerSnippet();
hgs
parents: 0
diff changeset
   466
hgs
parents: 0
diff changeset
   467
//        if (showTail) {
hgs
parents: 0
diff changeset
   468
//            cm_TheContextMenu.positionTail();
hgs
parents: 0
diff changeset
   469
//        }
hgs
parents: 0
diff changeset
   470
hgs
parents: 0
diff changeset
   471
        snippet.show();
hgs
parents: 0
diff changeset
   472
    }
0
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   473
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   474
3
hgs
parents: 0
diff changeset
   475
    this.centerSnippet = function() {
0
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   476
3
hgs
parents: 0
diff changeset
   477
        
16
hgs
parents: 3
diff changeset
   478
        var statusBarHeight = snippets.StatusBarChromeId.visible ? snippets.StatusBarChromeId.geometry.height : 0;
3
hgs
parents: 0
diff changeset
   479
        
hgs
parents: 0
diff changeset
   480
        var snippet = snippets[cm_TheContextMenu.snippetId];
hgs
parents: 0
diff changeset
   481
        var x = (chrome.displaySize.width - snippet.geometry.width) / 2;
hgs
parents: 0
diff changeset
   482
        
hgs
parents: 0
diff changeset
   483
        // Center the menu in the space between status bar and tool bar
hgs
parents: 0
diff changeset
   484
        var y = (chrome.displaySize.height - statusBarHeight - snippets.WebViewToolbarId.geometry.height - cm_TheContextMenu.menuHeight)/2;
hgs
parents: 0
diff changeset
   485
        snippet.setPosition(x, (y+statusBarHeight));
hgs
parents: 0
diff changeset
   486
    
0
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   487
    }
3
hgs
parents: 0
diff changeset
   488
    chrome.chromeComplete.connect(createDelegate(this,
hgs
parents: 0
diff changeset
   489
        function() {
hgs
parents: 0
diff changeset
   490
            var snippet = snippets[cm_TheContextMenu.snippetId];
16
hgs
parents: 3
diff changeset
   491
            this.snippetWidth = document.getElementById(cm_TheContextMenu.snippetId).style.width;
3
hgs
parents: 0
diff changeset
   492
            chrome.aspectChanged.connect(createDelegate(this,
hgs
parents: 0
diff changeset
   493
                    function(a) {
hgs
parents: 0
diff changeset
   494
                        this.centerSnippet();
hgs
parents: 0
diff changeset
   495
                    }));
0
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   496
3
hgs
parents: 0
diff changeset
   497
            snippet.hidden.connect(createDelegate(this, this.onHide));
0
1450b09d0cfd Revision: 201015
Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
parents:
diff changeset
   498
3
hgs
parents: 0
diff changeset
   499
        }));
hgs
parents: 0
diff changeset
   500
}  // End ContextMenu class