Converted Rico3 icons to CSS sprites. Moved minsrc and baselibs directories out of...
[infodrom/rico3] / minsrc / 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 livegrid=this.liveGrid;
50   var buffer=livegrid.buffer;
51   var totrows=buffer.totalRows;
52   var maxprint=livegrid.options.maxPrint;
53   var onBlankRow=(r >= totrows);
54   var column=livegrid.columns[c];
55   if (this.options.dataMenuHandler) {
56      var showDefaultMenu=this.options.dataMenuHandler(livegrid,r,c,onBlankRow);
57      if (!showDefaultMenu) return (this.itemCount > 0);
58   }
59
60   // menu items for sorting
61   if (column.sortable && totrows>0) {
62     this.sortmenu.clearMenu();
63     this.addSubMenuItem(Rico.getPhraseById("gridmenuSortBy",column.displayName), this.sortmenu, false);
64     this.sortmenu.addMenuItemId("gridmenuSortAsc", function() { column.sortAsc(); }, true);
65     this.sortmenu.addMenuItemId("gridmenuSortDesc", function() { column.sortDesc(); }, true);
66   }
67
68   // menu items for filtering
69   this.filtermenu.clearMenu();
70   if (column.canFilter() && !column.format.filterUI && (!onBlankRow || column.filterType == Rico.ColumnConst.USERFILTER)) {
71     this.addSubMenuItem(Rico.getPhraseById("gridmenuFilterBy",column.displayName), this.filtermenu, false);
72     column.userFilter=column.getValue(r);
73     if (column.filterType == Rico.ColumnConst.USERFILTER) {
74       this.filtermenu.addMenuItemId("gridmenuRemoveFilter", function() { column.setUnfiltered(false); }, true);
75       if (column.filterOp=='LIKE')
76         this.filtermenu.addMenuItemId("gridmenuChgKeyword", function() { livegrid.openKeyword(c); }, true);
77       if (column.filterOp=='NE' && !onBlankRow)
78         this.filtermenu.addMenuItemId("gridmenuExcludeAlso", function() { column.addFilterNE(); }, true);
79     } else if (!onBlankRow) {
80       this.filtermenu.addMenuItemId("gridmenuInclude", function() { column.setFilterEQ(); }, true);
81       this.filtermenu.addMenuItemId("gridmenuGreaterThan", function() { column.setFilterGE(); }, column.userFilter!='');
82       this.filtermenu.addMenuItemId("gridmenuLessThan", function() { column.setFilterLE(); }, column.userFilter!='');
83       if (column.isText)
84         this.filtermenu.addMenuItemId("gridmenuContains", function() { livegrid.openKeyword(c); }, true);
85       this.filtermenu.addMenuItemId("gridmenuExclude", function() { column.setFilterNE(); }, true);
86     }
87     if (livegrid.filterCount() > 0) {
88       this.filtermenu.addMenuItemId("gridmenuRefresh", function() { livegrid.filterHandler(); }, true);
89       this.filtermenu.addMenuItemId("gridmenuRemoveAll", function() { livegrid.clearFilters(); }, true);
90     }
91   } else if (livegrid.filterCount() > 0) {
92     this.addSubMenuItem(Rico.getPhraseById("gridmenuFilterBy",column.displayName), this.filtermenu, false);
93     this.filtermenu.addMenuItemId("gridmenuRemoveAll", function() { livegrid.clearFilters(); }, true);
94   }
95
96   // menu items for Print/Export
97   this.exportmenu.clearMenu();
98   if (buffer.printVisibleSQL && typeof(buffer.dataSource)=='string') {
99     // SQL buffer
100     this.addSubMenuItem(Rico.getPhraseById('gridmenuExport'),this.exportmenu,false);
101     this.exportmenu.addMenuItemId("gridmenuExportVis2Web", function() { buffer.printVisibleSQL('html'); });
102     this.exportmenu.addMenuItemId("gridmenuExportAll2Web", function() { buffer.printAllSQL('html'); }, buffer.totalRows <= maxprint);
103     this.exportmenu.addMenuBreak();
104     this.exportmenu.addMenuItemId("gridmenuExportVis2SS", function() { buffer.printVisibleSQL('xl'); });
105     this.exportmenu.addMenuItemId("gridmenuExportAll2SS", function() { buffer.printAllSQL('xl'); }, buffer.totalRows <= maxprint);
106   } else if (maxprint > 0 && totrows>0) {
107     // any other buffer
108     this.addSubMenuItem(Rico.getPhraseById('gridmenuExport'),this.exportmenu,false);
109     this.exportmenu.addMenuItemId("gridmenuExportVis2Web", function() { buffer.printVisible('plain'); });
110     this.exportmenu.addMenuItemId("gridmenuExportAll2Web", function() { buffer.printAll('plain'); }, buffer.totalRows <= maxprint);
111     if (Rico.isIE) {
112       this.exportmenu.addMenuBreak();
113       this.exportmenu.addMenuItemId("gridmenuExportVis2SS", function() { buffer.printVisible('owc'); });
114       this.exportmenu.addMenuItemId("gridmenuExportAll2SS", function() { buffer.printAll('owc'); }, buffer.totalRows <= maxprint);
115     }
116   }
117
118   // menu items for hide/unhide
119   var hiddenCols=livegrid.listInvisible();
120   for (var showableCnt=0,x=0; x<hiddenCols.length; x++) {
121     if (hiddenCols[x].canHideShow()) showableCnt++;
122   }
123   if (showableCnt > 0 || column.canHideShow()) {
124     this.hideshowmenu.clearMenu();
125     this.addSubMenuItem(Rico.getPhraseById('gridmenuHideShow'),this.hideshowmenu,false);
126     this.hideshowmenu.addMenuItemId('gridmenuChooseCols', function() { livegrid.chooseColumns(); },true,false);
127     var visibleCnt=livegrid.columns.length-hiddenCols.length;
128     var enabled=(visibleCnt>1 && column.visible && column.canHideShow());
129     this.hideshowmenu.addMenuItem(Rico.getPhraseById('gridmenuHide',column.displayName), function() { column.hideColumn(); }, enabled);
130     if (hiddenCols.length > 1)
131       this.hideshowmenu.addMenuItemId('gridmenuShowAll', function() { livegrid.showAll(); });
132   }
133   return true;
134 }
135
136 }