summaryrefslogtreecommitdiff
path: root/js/dojo-1.7.2/dojox/grid/enhanced/plugins/Printer.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/dojo-1.7.2/dojox/grid/enhanced/plugins/Printer.js')
-rw-r--r--js/dojo-1.7.2/dojox/grid/enhanced/plugins/Printer.js292
1 files changed, 292 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/grid/enhanced/plugins/Printer.js b/js/dojo-1.7.2/dojox/grid/enhanced/plugins/Printer.js
new file mode 100644
index 0000000..09ab390
--- /dev/null
+++ b/js/dojo-1.7.2/dojox/grid/enhanced/plugins/Printer.js
@@ -0,0 +1,292 @@
+//>>built
+define("dojox/grid/enhanced/plugins/Printer", [
+ "dojo/_base/declare",
+ "dojo/_base/html",
+ "dojo/_base/Deferred",
+ "dojo/_base/lang",
+ "dojo/_base/sniff",
+ "dojo/_base/xhr",
+ "dojo/_base/array",
+ "dojo/query",
+ "dojo/DeferredList",
+ "../_Plugin",
+ "../../EnhancedGrid",
+ "./exporter/TableWriter"
+], function(declare, html, Deferred, lang, has, xhr, array, query, DeferredList, _Plugin, EnhancedGrid, TableWriter){
+
+var Printer = declare("dojox.grid.enhanced.plugins.Printer", _Plugin, {
+ // summary:
+ // Provide printGrid function to the grid.
+ // example:
+ // | dojo.require("dojox.grid.enhanced.plugins.Printer");
+ // | dijit.byId("grid1").printGrid("my grid", //A title for the grid,optional
+ // | ["cssfile1.css","cssfile2.css"],//An array of css files to decorate the printed gird,optional
+ // | {table:"border='border'"} //tagName:"attrbuteList" pairs, optional,
+ // | //control the html tags in the generated html
+ // | );
+
+ // __printArgs: {
+ // title: String
+ // A title of the printed page can be specified. Optional.
+ // If given, it's shown in an <h1> tag at the top of the page.
+ // cssFiles: Array | String
+ // CSS file paths. Optional.
+ // Every row and column is given CSS classes, including:
+ // grid_row_{row-number}, grid_odd_row, grid_even_row, grid_header,
+ // grid_col_{col-number}, grid_odd_col, grid_even_col
+ // {row_number} and {col-number} are both integers starting from 1.
+ // Row classes are for <thead> and <tbody> tags.
+ // Column classes are for <th> and <td> tags.
+ // Users can use these classes in the CSS files, but cannot define their own.
+ // writerArgs: Object (Association Array)
+ // Arguments for TableWriter.
+ // fetchArgs: object?
+ // Any arguments for store.fetch
+ // }
+
+ // name: String
+ // Plugin name
+ name: "printer",
+
+ constructor: function(grid){
+ // summary:
+ // only newed by _Plugin
+ // inGrid: EnhancedGrid
+ // The grid to plug in to.
+ this.grid = grid;
+ this._mixinGrid(grid);
+
+ //For print, we usually need the HTML instead of raw data.
+ grid.setExportFormatter(function(data, cell, rowIndex, rowItem){
+ return cell.format(rowIndex, rowItem);
+ });
+ },
+ _mixinGrid: function(){
+ var g = this.grid;
+ g.printGrid = lang.hitch(this, this.printGrid);
+ g.printSelected = lang.hitch(this, this.printSelected);
+ g.exportToHTML = lang.hitch(this, this.exportToHTML);
+ g.exportSelectedToHTML = lang.hitch(this, this.exportSelectedToHTML);
+ g.normalizePrintedGrid = lang.hitch(this, this.normalizeRowHeight);
+ },
+ printGrid: function(args){
+ // summary:
+ // Print all the data in the grid, using title as a title,
+ // decorating generated html by cssFiles,
+ // using tagName:"attrbuteList" pairs(writerArgs) to control html tags
+ // in the generated html string.
+ // tags:
+ // public
+ // args: __printArgs?
+ // Arguments for print.
+ this.exportToHTML(args, lang.hitch(this, this._print));
+ },
+ printSelected: function(args){
+ // summary:
+ // Print selected data. All other features are the same as printGrid.
+ // For meaning of arguments see function *printGrid*
+ // tags:
+ // public
+ // args: __printArgs?
+ // Arguments for print.
+ this.exportSelectedToHTML(args, lang.hitch(this, this._print));
+ },
+ exportToHTML: function(args, onExported){
+ // summary:
+ // Export to HTML string, but do NOT print.
+ // Users can use this to implement print preview.
+ // For meaning of the 1st-3rd arguments see function *printGrid*.
+ // tags:
+ // public
+ // args: __printArgs?
+ // Arguments for print.
+ // onExported: function(string)
+ // call back function
+ args = this._formalizeArgs(args);
+ var _this = this;
+ this.grid.exportGrid("table", args, function(str){
+ _this._wrapHTML(args.title, args.cssFiles, args.titleInBody + str).then(onExported);
+ });
+ },
+ exportSelectedToHTML: function(args, onExported){
+ // summary:
+ // Export selected rows to HTML string, but do NOT print.
+ // Users can use this to implement print preview.
+ // For meaning of arguments see function *printGrid*
+ // tags:
+ // public
+ // args: __printArgs?
+ // Arguments for print.
+ args = this._formalizeArgs(args);
+ var _this = this;
+ this.grid.exportSelected("table", args.writerArgs, function(str){
+ _this._wrapHTML(args.title, args.cssFiles, args.titleInBody + str).then(onExported);
+ });
+ },
+
+ _loadCSSFiles: function(cssFiles){
+ var dl = array.map(cssFiles, function(cssFile){
+ cssFile = lang.trim(cssFile);
+ if(cssFile.substring(cssFile.length - 4).toLowerCase() === '.css'){
+ return xhr.get({
+ url: cssFile
+ });
+ }else{
+ var d = new Deferred();
+ d.callback(cssFile);
+ return d;
+ }
+ });
+ return DeferredList.prototype.gatherResults(dl);
+ },
+ _print: function(/* string */htmlStr){
+ // summary:
+ // Do the print job.
+ // tags:
+ // private
+ // htmlStr: String
+ // The html content string to be printed.
+ // returns:
+ // undefined
+ var win, _this = this,
+ fillDoc = function(w){
+ var doc = w.document;
+ doc.open();
+ doc.write(htmlStr);
+ doc.close();
+ _this.normalizeRowHeight(doc);
+ };
+ if(!window.print){
+ //We don't have a print facility.
+ return;
+ }else if(has("chrome") || has("opera")){
+ //referred from dijit._editor.plugins.Print._print()
+ //In opera and chrome the iframe.contentWindow.print
+ //will also print the outside window. So we must create a
+ //stand-alone new window.
+ win = window.open("javascript: ''", "",
+ "status=0,menubar=0,location=0,toolbar=0,width=1,height=1,resizable=0,scrollbars=0");
+ fillDoc(win);
+ win.print();
+ //Opera will stop at this point, showing the popping-out window.
+ //If the user closes the window, the following codes will not execute.
+ //If the user returns focus to the main window, the print function
+ // is executed, but still a no-op.
+ win.close();
+ }else{
+ //Put private things in deeper namespace to avoid poluting grid namespace.
+ var fn = this._printFrame,
+ dn = this.grid.domNode;
+ if(!fn){
+ var frameId = dn.id + "_print_frame";
+ if(!(fn = html.byId(frameId))){
+ //create an iframe to store the grid data.
+ fn = html.create("iframe");
+ fn.id = frameId;
+ fn.frameBorder = 0;
+ html.style(fn, {
+ width: "1px",
+ height: "1px",
+ position: "absolute",
+ right: 0,
+ bottom: 0,
+ border: "none",
+ overflow: "hidden"
+ });
+ if(!has("ie")){
+ html.style(fn, "visibility", "hidden");
+ }
+ dn.appendChild(fn);
+ }
+ //Reuse this iframe
+ this._printFrame = fn;
+ }
+ win = fn.contentWindow;
+ fillDoc(win);
+ //IE requires the frame to be focused for print to work, and it's harmless for FF.
+ win.focus();
+ win.print();
+ }
+ },
+ _wrapHTML: function(/* string */title, /* Array */cssFiles, /* string */body_content){
+ // summary:
+ // Put title, cssFiles, and body_content together into an HTML string.
+ // tags:
+ // private
+ // title: String
+ // A title for the html page.
+ // cssFiles: Array
+ // css file pathes.
+ // body_content: String
+ // Content to print, not including <head></head> part and <html> tags
+ // returns:
+ // the wrapped HTML string ready for print
+ return this._loadCSSFiles(cssFiles).then(function(cssStrs){
+ var i, sb = ['<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
+ '<html ', html._isBodyLtr() ? '' : 'dir="rtl"', '><head><title>', title,
+ '</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>'];
+ for(i = 0; i < cssStrs.length; ++i){
+ sb.push('<style type="text/css">', cssStrs[i], '</style>');
+ }
+ sb.push('</head>');
+ if(body_content.search(/^\s*<body/i) < 0){
+ body_content = '<body>' + body_content + '</body>';
+ }
+ sb.push(body_content, '</html>');
+ return sb.join('');
+ });
+ },
+ normalizeRowHeight: function(doc){
+ var views = query(".grid_view", doc.body);
+ var headPerView = array.map(views, function(view){
+ return query(".grid_header", view)[0];
+ });
+ var rowsPerView = array.map(views, function(view){
+ return query(".grid_row", view);
+ });
+ var rowCount = rowsPerView[0].length;
+ var i, v, h, maxHeight = 0;
+ for(v = views.length - 1; v >= 0; --v){
+ h = html.contentBox(headPerView[v]).h;
+ if(h > maxHeight){
+ maxHeight = h;
+ }
+ }
+ for(v = views.length - 1; v >= 0; --v){
+ html.style(headPerView[v], "height", maxHeight + "px");
+ }
+ for(i = 0; i < rowCount; ++i){
+ maxHeight = 0;
+ for(v = views.length - 1; v >= 0; --v){
+ h = html.contentBox(rowsPerView[v][i]).h;
+ if(h > maxHeight){
+ maxHeight = h;
+ }
+ }
+ for(v = views.length - 1; v >= 0; --v){
+ html.style(rowsPerView[v][i], "height", maxHeight + "px");
+ }
+ }
+ var left = 0, ltr = html._isBodyLtr();
+ for(v = 0; v < views.length; ++v){
+ html.style(views[v], ltr ? "left" : "right", left + "px");
+ left += html.marginBox(views[v]).w;
+ }
+ },
+ _formalizeArgs: function(args){
+ args = (args && lang.isObject(args)) ? args : {};
+ args.title = String(args.title) || "";
+ if(!lang.isArray(args.cssFiles)){
+ args.cssFiles = [args.cssFiles];
+ }
+ args.titleInBody = args.title ? ['<h1>', args.title, '</h1>'].join('') : '';
+ return args; //Object
+ }
+});
+
+EnhancedGrid.registerPlugin(Printer/*name:'printer'*/, {
+ "dependency": ["exporter"]
+});
+
+return Printer;
+});