Loading rico1 and rico3 files
[infodrom/rico3] / ricoClient / js / ricoLiveGridMenu.js
1 /*
2  *  (c) 2005-2009 Richard Cowin (http://openrico.org)
3  *  (c) 2005-2009 Matt Brown (http://dowdybrown.com)
4  *
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
7  *
8  *         http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
14  */
15
16  if(typeof Rico=='undefined')
17   throw("GridMenu requires the Rico JavaScript framework");
18
19 /**
20  * Standard menu for LiveGrid
21  */
22 Rico.GridMenu = function(options) {
23   this.initialize(options);
24 };
25
26 Rico.GridMenu.prototype = {
27
28 initialize: function(options) {
29   this.options = {
30     width           : '18em',
31     dataMenuHandler : null          // put custom items on the menu
32   };
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' });
39   this.createDiv();
40   this.sortmenu.createDiv();
41   this.filtermenu.createDiv();
42   this.exportmenu.createDiv();
43   this.hideshowmenu.createDiv();
44 },
45
46 // Build context menu for grid
47 buildGridMenu: function(r,c) {
48   this.clearMenu();
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);
55   }
56
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);
63   }
64
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!='');
80       if (column.isText)
81         this.filtermenu.addMenuItemId("gridmenuContains", Rico.bind(this.liveGrid,'openKeyword',c), true);
82       this.filtermenu.addMenuItemId("gridmenuExclude", Rico.bind(column,'setFilterNE'), true);
83     }
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);
87     }
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);
91   }
92
93   // menu items for Print/Export
94   this.exportmenu.clearMenu();
95   if (this.liveGrid.buffer.printVisibleSQL && typeof(this.liveGrid.buffer.dataSource)=='string') {
96     // SQL buffer
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) {
104     // any other buffer
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);
108     if (Rico.isIE) {
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);
112     }
113   }
114
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++;
119   }
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);
131       }
132     }
133     if (hiddenCols.length > 1)
134       this.hideshowmenu.addMenuItemId('gridmenuShowAll', Rico.bind(this.liveGrid,'showAll'));
135   }
136   return true;
137 }
138
139 }
140
141 Rico.includeLoaded('ricoLiveGridMenu.js');