2 * (c) 2005-2009 Richard Cowin (http://openrico.org)
3 * (c) 2005-2009 Matt Brown (http://dowdybrown.com)
5 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
6 * file except in compliance with the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software distributed under the
11 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
12 * either express or implied. See the License for the specific language governing permissions
13 * and limitations under the License.
16 if(typeof Rico=='undefined')
17 throw("GridMenu requires the Rico JavaScript framework");
20 * Standard menu for LiveGrid
22 Rico.GridMenu = function(options) {
23 this.initialize(options);
26 Rico.GridMenu.prototype = {
28 initialize: function(options) {
31 dataMenuHandler : null // put custom items on the menu
33 Rico.extend(this.options, options || {});
34 Rico.extend(this, new Rico.Menu(this.options));
35 this.sortmenu = new Rico.Menu({ width: '15em' });
36 this.filtermenu = new Rico.Menu({ width: '22em' });
37 this.exportmenu = new Rico.Menu({ width: '24em' });
38 this.hideshowmenu = new Rico.Menu({ width: '22em' });
40 this.sortmenu.createDiv();
41 this.filtermenu.createDiv();
42 this.exportmenu.createDiv();
43 this.hideshowmenu.createDiv();
46 // Build context menu for grid
47 buildGridMenu: function(r,c) {
49 var totrows=this.liveGrid.buffer.totalRows;
50 var onBlankRow=r >= totrows;
51 var column=this.liveGrid.columns[c];
52 if (this.options.dataMenuHandler) {
53 var showDefaultMenu=this.options.dataMenuHandler(this.liveGrid,r,c,onBlankRow);
54 if (!showDefaultMenu) return (this.itemCount > 0);
57 // menu items for sorting
58 if (column.sortable && totrows>0) {
59 this.sortmenu.clearMenu();
60 this.addSubMenuItem(Rico.getPhraseById("gridmenuSortBy",column.displayName), this.sortmenu, false);
61 this.sortmenu.addMenuItemId("gridmenuSortAsc", Rico.bind(column,'sortAsc'), true);
62 this.sortmenu.addMenuItemId("gridmenuSortDesc", Rico.bind(column,'sortDesc'), true);
65 // menu items for filtering
66 this.filtermenu.clearMenu();
67 if (column.canFilter() && !column.format.filterUI && (!onBlankRow || column.filterType == Rico.ColumnConst.USERFILTER)) {
68 this.addSubMenuItem(Rico.getPhraseById("gridmenuFilterBy",column.displayName), this.filtermenu, false);
69 column.userFilter=column.getValue(r);
70 if (column.filterType == Rico.ColumnConst.USERFILTER) {
71 this.filtermenu.addMenuItemId("gridmenuRemoveFilter", Rico.bind(column,'setUnfiltered',false), true);
72 if (column.filterOp=='LIKE')
73 this.filtermenu.addMenuItemId("gridmenuChgKeyword", Rico.bind(this.liveGrid,'openKeyword',c), true);
74 if (column.filterOp=='NE' && !onBlankRow)
75 this.filtermenu.addMenuItemId("gridmenuExcludeAlso", Rico.bind(column,'addFilterNE'), true);
76 } else if (!onBlankRow) {
77 this.filtermenu.addMenuItemId("gridmenuInclude", Rico.bind(column,'setFilterEQ'), true);
78 this.filtermenu.addMenuItemId("gridmenuGreaterThan", Rico.bind(column,'setFilterGE'), column.userFilter!='');
79 this.filtermenu.addMenuItemId("gridmenuLessThan", Rico.bind(column,'setFilterLE'), column.userFilter!='');
81 this.filtermenu.addMenuItemId("gridmenuContains", Rico.bind(this.liveGrid,'openKeyword',c), true);
82 this.filtermenu.addMenuItemId("gridmenuExclude", Rico.bind(column,'setFilterNE'), true);
84 if (this.liveGrid.filterCount() > 0) {
85 this.filtermenu.addMenuItemId("gridmenuRefresh", Rico.bind(this.liveGrid,'filterHandler'), true);
86 this.filtermenu.addMenuItemId("gridmenuRemoveAll", Rico.bind(this.liveGrid,'clearFilters'), true);
88 } else if (this.liveGrid.filterCount() > 0) {
89 this.addSubMenuItem(Rico.getPhraseById("gridmenuFilterBy",column.displayName), this.filtermenu, false);
90 this.filtermenu.addMenuItemId("gridmenuRemoveAll", Rico.bind(this.liveGrid,'clearFilters'), true);
93 // menu items for Print/Export
94 this.exportmenu.clearMenu();
95 if (this.liveGrid.buffer.printVisibleSQL && typeof(this.liveGrid.buffer.dataSource)=='string') {
97 this.addSubMenuItem(Rico.getPhraseById('gridmenuExport'),this.exportmenu,false);
98 this.exportmenu.addMenuItemId("gridmenuExportVis2Web", Rico.bind(this.liveGrid.buffer,'printVisibleSQL','html'));
99 this.exportmenu.addMenuItemId("gridmenuExportAll2Web", Rico.bind(this.liveGrid.buffer,'printAllSQL','html'), this.liveGrid.buffer.totalRows <= this.liveGrid.options.maxPrint);
100 this.exportmenu.addMenuBreak();
101 this.exportmenu.addMenuItemId("gridmenuExportVis2SS", Rico.bind(this.liveGrid.buffer,'printVisibleSQL','xl'));
102 this.exportmenu.addMenuItemId("gridmenuExportAll2SS", Rico.bind(this.liveGrid.buffer,'printAllSQL','xl'), this.liveGrid.buffer.totalRows <= this.liveGrid.options.maxPrint);
103 } else if (this.liveGrid.options.maxPrint > 0 && totrows>0) {
105 this.addSubMenuItem(Rico.getPhraseById('gridmenuExport'),this.exportmenu,false);
106 this.exportmenu.addMenuItemId("gridmenuExportVis2Web", Rico.bind(this.liveGrid.buffer,'printVisible','plain'));
107 this.exportmenu.addMenuItemId("gridmenuExportAll2Web", Rico.bind(this.liveGrid.buffer,'printAll','plain'), this.liveGrid.buffer.totalRows <= this.liveGrid.options.maxPrint);
109 this.exportmenu.addMenuBreak();
110 this.exportmenu.addMenuItemId("gridmenuExportVis2SS", Rico.bind(this.liveGrid.buffer,'printVisible','owc'));
111 this.exportmenu.addMenuItemId("gridmenuExportAll2SS", Rico.bind(this.liveGrid.buffer,'printAll','owc'), this.liveGrid.buffer.totalRows <= this.liveGrid.options.maxPrint);
115 // menu items for hide/unhide
116 var hiddenCols=this.liveGrid.listInvisible();
117 for (var showableCnt=0,x=0; x<hiddenCols.length; x++) {
118 if (hiddenCols[x].canHideShow()) showableCnt++;
120 if (showableCnt > 0 || column.canHideShow()) {
121 this.hideshowmenu.clearMenu();
122 this.addSubMenuItem(Rico.getPhraseById('gridmenuHideShow'),this.hideshowmenu,false);
123 this.hideshowmenu.addMenuItemId('gridmenuChooseCols', Rico.bind(this.liveGrid,'chooseColumns'),true,false);
124 var visibleCnt=this.liveGrid.columns.length-hiddenCols.length;
125 var enabled=(visibleCnt>1 && column.visible && column.canHideShow());
126 this.hideshowmenu.addMenuItem(Rico.getPhraseById('gridmenuHide',column.displayName), Rico.bind(column,'hideColumn'), enabled);
127 for (var cnt=0,x=0; x<hiddenCols.length; x++) {
128 if (hiddenCols[x].canHideShow()) {
129 if (cnt++==0) this.hideshowmenu.addMenuBreak();
130 this.hideshowmenu.addMenuItem(Rico.getPhraseById('gridmenuShow',hiddenCols[x].displayName), Rico.bind(hiddenCols[x],'showColumn'), true);
133 if (hiddenCols.length > 1)
134 this.hideshowmenu.addMenuItemId('gridmenuShowAll', Rico.bind(this.liveGrid,'showAll'));
141 Rico.includeLoaded('ricoLiveGridMenu.js');