123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- /*
- Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
- Available via Academic Free License >= 2.1 OR the modified BSD license.
- see: http://dojotoolkit.org/license for details
- */
- if(!dojo._hasResource["dojox.grid.enhanced.plugins.Printer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
- dojo._hasResource["dojox.grid.enhanced.plugins.Printer"] = true;
- dojo.provide("dojox.grid.enhanced.plugins.Printer");
- dojo.require("dojo.DeferredList");
- dojo.require("dojox.grid.enhanced._Plugin");
- dojo.require("dojox.grid.enhanced.plugins.exporter.TableWriter");
- dojo.declare("dojox.grid.enhanced.plugins.Printer", dojox.grid.enhanced._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 = dojo.hitch(this, this.printGrid);
- g.printSelected = dojo.hitch(this, this.printSelected);
- g.exportToHTML = dojo.hitch(this, this.exportToHTML);
- g.exportSelectedToHTML = dojo.hitch(this, this.exportSelectedToHTML);
- g.normalizePrintedGrid = dojo.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, dojo.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, dojo.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 = dojo.map(cssFiles, function(cssFile){
- cssFile = dojo.trim(cssFile);
- if(cssFile.substring(cssFile.length - 4).toLowerCase() === '.css'){
- return dojo.xhrGet({
- url: cssFile
- });
- }else{
- var d = new dojo.Deferred();
- d.callback(cssFile);
- return d;
- }
- });
- return dojo.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(dojo.isChrome || dojo.isOpera){
- //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);
- //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.print();
- 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 = dojo.byId(frameId))){
- //create an iframe to store the grid data.
- fn = dojo.create("iframe");
- fn.id = frameId;
- fn.frameBorder = 0;
- dojo.style(fn, {
- width: "1px",
- height: "1px",
- position: "absolute",
- right: 0,
- bottom: 0,
- border: "none",
- overflow: "hidden"
- });
- if(!dojo.isIE){
- dojo.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, html = ['<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">',
- '<html ', dojo._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){
- html.push('<style type="text/css">', cssStrs[i], '</style>');
- }
- html.push('</head>');
- if(body_content.search(/^\s*<body/i) < 0){
- body_content = '<body>' + body_content + '</body>';
- }
- html.push(body_content, '</html>');
- return html.join('');
- });
- },
- normalizeRowHeight: function(doc){
- var views = dojo.query(".grid_view", doc.body);
- var headPerView = dojo.map(views, function(view){
- return dojo.query(".grid_header", view)[0];
- });
- var rowsPerView = dojo.map(views, function(view){
- return dojo.query(".grid_row", view);
- });
- var rowCount = rowsPerView[0].length;
- var i, v, h, maxHeight = 0;
- for(v = views.length - 1; v >= 0; --v){
- h = dojo.contentBox(headPerView[v]).h;
- if(h > maxHeight){
- maxHeight = h;
- }
- }
- for(v = views.length - 1; v >= 0; --v){
- dojo.style(headPerView[v], "height", maxHeight + "px");
- }
- for(i = 0; i < rowCount; ++i){
- maxHeight = 0;
- for(v = views.length - 1; v >= 0; --v){
- h = dojo.contentBox(rowsPerView[v][i]).h;
- if(h > maxHeight){
- maxHeight = h;
- }
- }
- for(v = views.length - 1; v >= 0; --v){
- dojo.style(rowsPerView[v][i], "height", maxHeight + "px");
- }
- }
- var left = 0, ltr = dojo._isBodyLtr();
- for(v = 0; v < views.length; ++v){
- dojo.style(views[v], ltr ? "left" : "right", left + "px");
- left += dojo.marginBox(views[v]).w;
- }
- },
- _formalizeArgs: function(args){
- args = (args && dojo.isObject(args)) ? args : {};
- args.title = String(args.title) || "";
- if(!dojo.isArray(args.cssFiles)){
- args.cssFiles = [args.cssFiles];
- }
- args.titleInBody = args.title ? ['<h1>', args.title, '</h1>'].join('') : '';
- return args; //Object
- }
- });
- dojox.grid.EnhancedGrid.registerPlugin(dojox.grid.enhanced.plugins.Printer/*name:'printer'*/, {
- "dependency": ["exporter"]
- });
- }
|