385 lines
18 KiB
JavaScript
385 lines
18 KiB
JavaScript
/*
|
|
*
|
|
* (c) Copyright Ascensio System Limited 2010-2016
|
|
*
|
|
* This program is a free software product. You can redistribute it and/or
|
|
* modify it under the terms of the GNU Affero General Public License (AGPL)
|
|
* version 3 as published by the Free Software Foundation. In accordance with
|
|
* Section 7(a) of the GNU AGPL its Section 15 shall be amended to the effect
|
|
* that Ascensio System SIA expressly excludes the warranty of non-infringement
|
|
* of any third-party rights.
|
|
*
|
|
* This program is distributed WITHOUT ANY WARRANTY; without even the implied
|
|
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. For
|
|
* details, see the GNU AGPL at: http://www.gnu.org/licenses/agpl-3.0.html
|
|
*
|
|
* You can contact Ascensio System SIA at Lubanas st. 125a-25, Riga, Latvia,
|
|
* EU, LV-1021.
|
|
*
|
|
* The interactive user interfaces in modified source and object code versions
|
|
* of the Program must display Appropriate Legal Notices, as required under
|
|
* Section 5 of the GNU AGPL version 3.
|
|
*
|
|
* Pursuant to Section 7(b) of the License you must retain the original Product
|
|
* logo when distributing the program. Pursuant to Section 7(e) we decline to
|
|
* grant you any rights under trademark law for use of our trademarks.
|
|
*
|
|
* All the Product's GUI elements, including illustrations and icon sets, as
|
|
* well as technical writing content are licensed under the terms of the
|
|
* Creative Commons Attribution-ShareAlike 4.0 International. See the License
|
|
* terms at http://creativecommons.org/licenses/by-sa/4.0/legalcode
|
|
*
|
|
*/
|
|
define([
|
|
'core',
|
|
'spreadsheeteditor/main/app/view/FileMenuPanels',
|
|
'spreadsheeteditor/main/app/view/PrintSettings'
|
|
], function () {
|
|
'use strict';
|
|
|
|
SSE.Controllers.Print = Backbone.Controller.extend(_.extend({
|
|
views: [
|
|
'MainSettingsPrint'
|
|
],
|
|
|
|
initialize: function() {
|
|
this.adjPrintParams = new Asc.asc_CAdjustPrint();
|
|
this.adjPrintParams.asc_setLayoutPageType(c_oAscLayoutPageType.ActualSize);
|
|
|
|
var value = Common.localStorage.getItem("sse-print-settings-range");
|
|
value = (value!==null) ? parseInt(value) : c_oAscPrintType.ActiveSheets;
|
|
this.adjPrintParams.asc_setPrintType(value);
|
|
this.diffParams = {};
|
|
|
|
this.addListeners({
|
|
'MainSettingsPrint': {
|
|
'show': _.bind(this.onShowMainSettingsPrint, this),
|
|
'render:after': _.bind(this.onAfterRender, this)
|
|
},
|
|
'PrintSettings': {
|
|
'changerange': _.bind(this.onChangeRange,this)
|
|
}
|
|
});
|
|
},
|
|
|
|
onLaunch: function() {
|
|
this.printSettings = this.createView('MainSettingsPrint');
|
|
},
|
|
|
|
onAfterRender: function(view) {
|
|
this.printSettings.cmbSheet.on('selected', _.bind(this.comboSheetsChange, this));
|
|
this.printSettings.btnOk.on('click', _.bind(this.querySavePrintSettings, this));
|
|
var toolbar = SSE.getController('Toolbar').getView('Toolbar');
|
|
if (toolbar)
|
|
toolbar.mnuPrint.on('item:click', _.bind(this.openPrintSettings, this));
|
|
},
|
|
|
|
setApi: function(o) {
|
|
this.api = o;
|
|
this.api.asc_registerCallback('asc_onSheetsChanged', _.bind(this.updateSheetsInfo, this));
|
|
},
|
|
|
|
updateSheetsInfo: function() {
|
|
if (this.printSettings.isVisible()) {
|
|
this.updateSettings();
|
|
} else {
|
|
this.isFillSheets = false;
|
|
this.diffParams = {};
|
|
}
|
|
},
|
|
|
|
updateSettings: function() {
|
|
var wc = this.api.asc_getWorksheetsCount(), i = -1;
|
|
var items = [{displayValue: this.strAllSheets, value:-255}];
|
|
|
|
while (++i < wc) {
|
|
if (!this.api.asc_isWorksheetHidden(i)) {
|
|
items.push({
|
|
displayValue:this.api.asc_getWorksheetName(i),
|
|
value: i
|
|
});
|
|
}
|
|
}
|
|
|
|
this.printSettings.cmbSheet.store.reset(items);
|
|
var item = this.printSettings.cmbSheet.store.findWhere({value: this.printSettings.cmbSheet.getValue()}) ||
|
|
this.printSettings.cmbSheet.store.findWhere({value: this.api.asc_getActiveWorksheetIndex()});
|
|
if (item) {
|
|
this.printSettings.cmbSheet.setValue(item.get('value'));
|
|
}
|
|
},
|
|
|
|
comboSheetsChange: function(combo, record) {
|
|
var newvalue = record.value;
|
|
if (newvalue == -255) {
|
|
this.indeterminatePageOptions(this.printSettings);
|
|
} else {
|
|
this.fillPageOptions(this.printSettings, this.api.asc_getPageOptions(newvalue));
|
|
}
|
|
},
|
|
|
|
isDiffRefill: function() {
|
|
for (var item in this.diffParams) {
|
|
if (this.diffParams[item] == undefined) return true;
|
|
}
|
|
|
|
return item == undefined;
|
|
},
|
|
|
|
indeterminatePageOptions: function(panel) {
|
|
if (this.isDiffRefill()) {
|
|
var wc = this.api.asc_getWorksheetsCount();
|
|
if (wc == 1) {
|
|
this.diffParams.orientation = false;
|
|
this.diffParams.size = false;
|
|
this.diffParams.headings = false;
|
|
this.diffParams.grid = false;
|
|
this.diffParams.margintop = false;
|
|
this.diffParams.marginright = false;
|
|
this.diffParams.marginbottom = false;
|
|
this.diffParams.marginleft = false;
|
|
} else {
|
|
var index = 0;
|
|
var opts = this.api.asc_getPageOptions(index), opts_next;
|
|
|
|
while (++index < wc) {
|
|
opts_next = this.api.asc_getPageOptions(index);
|
|
|
|
if (this.diffParams.orientation == undefined)
|
|
this.diffParams.orientation = opts.asc_getPageSetup().asc_getOrientation() != opts_next.asc_getPageSetup().asc_getOrientation();
|
|
|
|
if (this.diffParams.size == undefined)
|
|
this.diffParams.size = (opts.asc_getPageSetup().asc_getWidth() != opts_next.asc_getPageSetup().asc_getWidth() || opts.asc_getPageSetup().asc_getHeight() != opts_next.asc_getPageSetup().asc_getHeight());
|
|
|
|
if (this.diffParams.headings == undefined)
|
|
this.diffParams.headings = opts.asc_getHeadings() != opts_next.asc_getHeadings();
|
|
|
|
if (this.diffParams.grid == undefined)
|
|
this.diffParams.grid = opts.asc_getGridLines() != opts_next.asc_getGridLines();
|
|
|
|
if (this.diffParams.margintop == undefined)
|
|
this.diffParams.margintop = Math.abs(opts.asc_getPageMargins().asc_getTop()-opts_next.asc_getPageMargins().asc_getTop()) > 0.001;
|
|
|
|
if (this.diffParams.marginright == undefined)
|
|
this.diffParams.marginright = Math.abs(opts.asc_getPageMargins().asc_getRight() - opts_next.asc_getPageMargins().asc_getRight()) > 0.001;
|
|
|
|
if (this.diffParams.marginbottom == undefined)
|
|
this.diffParams.marginbottom = Math.abs(opts.asc_getPageMargins().asc_getBottom() - opts_next.asc_getPageMargins().asc_getBottom()) > 0.001;
|
|
|
|
if (this.diffParams.marginleft == undefined)
|
|
this.diffParams.marginleft = Math.abs(opts.asc_getPageMargins().asc_getLeft() - opts_next.asc_getPageMargins().asc_getLeft()) > 0.001;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (this.diffParams.orientation) panel.cmbPaperOrientation.setValue('-');
|
|
if (this.diffParams.size) panel.cmbPaperSize.setValue('-');
|
|
|
|
if (this.diffParams.margintop) panel.spnMarginTop.setValue('-');
|
|
if (this.diffParams.marginright) panel.spnMarginRight.setValue('-');
|
|
if (this.diffParams.marginbottom) panel.spnMarginBottom.setValue('-');
|
|
if (this.diffParams.marginleft) panel.spnMarginLeft.setValue('-');
|
|
|
|
if (this.diffParams.grid) panel.chPrintGrid.setValue('indeterminate');
|
|
if (this.diffParams.headings) panel.chPrintRows.setValue('indeterminate');
|
|
},
|
|
|
|
fillPageOptions: function(panel, props) {
|
|
var opt = props.asc_getPageSetup();
|
|
|
|
var item = panel.cmbPaperOrientation.store.findWhere({value: opt.asc_getOrientation()});
|
|
if (item) panel.cmbPaperOrientation.setValue(item.get('value'));
|
|
|
|
var w = opt.asc_getWidth();
|
|
var h = opt.asc_getHeight();
|
|
|
|
item = panel.cmbPaperSize.store.findWhere({value: w+'|'+h});
|
|
if (item)
|
|
panel.cmbPaperSize.setValue(item.get('value'));
|
|
else
|
|
panel.cmbPaperSize.setValue('Custom (' + w +' x ' + h);
|
|
|
|
opt = props.asc_getPageMargins();
|
|
panel.spnMarginLeft.setValue(Common.Utils.Metric.fnRecalcFromMM(opt.asc_getLeft()));
|
|
panel.spnMarginTop.setValue(Common.Utils.Metric.fnRecalcFromMM(opt.asc_getTop()));
|
|
panel.spnMarginRight.setValue(Common.Utils.Metric.fnRecalcFromMM(opt.asc_getRight()));
|
|
panel.spnMarginBottom.setValue(Common.Utils.Metric.fnRecalcFromMM(opt.asc_getBottom()));
|
|
|
|
panel.chPrintGrid.setValue(props.asc_getGridLines());
|
|
panel.chPrintRows.setValue(props.asc_getHeadings());
|
|
},
|
|
|
|
fillPrintOptions: function(panel, props) {
|
|
panel.setRange(props.asc_getPrintType());
|
|
// panel.setLayout(props.asc_getLayoutPageType());
|
|
},
|
|
|
|
getPageOptions: function(panel) {
|
|
var props = new Asc.asc_CPageOptions();
|
|
props.asc_setGridLines(panel.chPrintGrid.getValue() == 'indeterminate' ? undefined : panel.chPrintGrid.getValue()=='checked'?1:0);
|
|
props.asc_setHeadings(panel.chPrintRows.getValue() == 'indeterminate' ? undefined : panel.chPrintRows.getValue()=='checked'?1:0);
|
|
|
|
var opt = new Asc.asc_CPageSetup();
|
|
opt.asc_setOrientation(panel.cmbPaperOrientation.getValue() == '-' ? undefined : panel.cmbPaperOrientation.getValue());
|
|
|
|
var pagew = /^\d{3}\.?\d*/.exec(panel.cmbPaperSize.getValue());
|
|
var pageh = /\d{3}\.?\d*$/.exec(panel.cmbPaperSize.getValue());
|
|
|
|
// if (pagew && pageh) {
|
|
opt.asc_setWidth(!pagew ? undefined : parseFloat(pagew[0]));
|
|
opt.asc_setHeight(!pageh? undefined : parseFloat(pageh[0]));
|
|
// }
|
|
|
|
props.asc_setPageSetup(opt);
|
|
|
|
opt = new Asc.asc_CPageMargins();
|
|
opt.asc_setLeft(panel.spnMarginLeft.getValue() == '-' ? undefined : Common.Utils.Metric.fnRecalcToMM(panel.spnMarginLeft.getNumberValue())); // because 1.91*10=19.0999999...
|
|
opt.asc_setTop(panel.spnMarginTop.getValue() == '-' ? undefined : Common.Utils.Metric.fnRecalcToMM(panel.spnMarginTop.getNumberValue()));
|
|
opt.asc_setRight(panel.spnMarginRight.getValue() == '-' ? undefined : Common.Utils.Metric.fnRecalcToMM(panel.spnMarginRight.getNumberValue()));
|
|
opt.asc_setBottom(panel.spnMarginBottom.getValue() == '-' ? undefined : Common.Utils.Metric.fnRecalcToMM(panel.spnMarginBottom.getNumberValue()));
|
|
|
|
props.asc_setPageMargins(opt);
|
|
|
|
return props;
|
|
},
|
|
|
|
savePageOptions: function(panel, index) {
|
|
var opts = this.getPageOptions(panel);
|
|
|
|
if (index == -255) {
|
|
var wc = this.api.asc_getWorksheetsCount();
|
|
index = -1;
|
|
|
|
while (++index < wc) {
|
|
this.api.asc_setPageOptions(opts, index);
|
|
}
|
|
|
|
if (this.diffParams.orientation) this.diffParams.orientation = opts.asc_getPageSetup().asc_getOrientation() == undefined;
|
|
if (this.diffParams.size) this.diffParams.size = (opts.asc_getPageSetup().asc_getWidth() == undefined || opts.asc_getPageSetup().asc_getHeight() == undefined);
|
|
if (this.diffParams.headings) this.diffParams.headings = opts.asc_getHeadings() == undefined;
|
|
if (this.diffParams.grid) this.diffParams.grid = opts.asc_getGridLines() == undefined;
|
|
if (this.diffParams.margintop) this.diffParams.margintop = opts.asc_getPageMargins().asc_getTop() == undefined;
|
|
if (this.diffParams.marginright) this.diffParams.marginright = opts.asc_getPageMargins().asc_getRight() == undefined;
|
|
if (this.diffParams.marginbottom) this.diffParams.marginbottom = opts.asc_getPageMargins().asc_getBottom() == undefined;
|
|
if (this.diffParams.marginleft) this.diffParams.marginleft = opts.asc_getPageMargins().asc_getLeft() == undefined;
|
|
} else {
|
|
this.api.asc_setPageOptions(opts, index);
|
|
this.diffParams = {};
|
|
}
|
|
},
|
|
|
|
onShowMainSettingsPrint: function() {
|
|
if (!this.isFillSheets) {
|
|
this.isFillSheets = true;
|
|
this.updateSettings();
|
|
}
|
|
|
|
if (!this.isUpdatedSettings) {
|
|
this.isUpdatedSettings = true;
|
|
|
|
var item = this.printSettings.cmbSheet.store.findWhere({value: this.api.asc_getActiveWorksheetIndex()});
|
|
if (item) {
|
|
this.printSettings.cmbSheet.setValue(item.get('value'));
|
|
this.comboSheetsChange(this.printSettings.cmbSheet, item.toJSON());
|
|
}
|
|
}
|
|
},
|
|
|
|
openPrintSettings: function(menu, item) {
|
|
if (item.value === 'options' && this.api ) {
|
|
this.printSettingsDlg = (new SSE.Views.PrintSettings({
|
|
handler: _.bind(this.resultPrintSettings,this),
|
|
afterrender: _.bind(function() {
|
|
this.fillPageOptions(this.printSettingsDlg, this.api.asc_getPageOptions());
|
|
this.fillPrintOptions(this.printSettingsDlg, this.adjPrintParams);
|
|
},this)
|
|
}));
|
|
this.printSettingsDlg.show();
|
|
}
|
|
},
|
|
|
|
resultPrintSettings: function(result, value) {
|
|
var view = SSE.getController('Toolbar').getView('Toolbar');
|
|
if (result == 'ok') {
|
|
if ( this.checkMargins(this.printSettingsDlg) ) {
|
|
this.savePageOptions(this.printSettingsDlg, this.printSettingsDlg.getRange() == c_oAscPrintType.EntireWorkbook ? -255:undefined);
|
|
|
|
var printtype = this.printSettingsDlg.getRange();
|
|
this.adjPrintParams.asc_setPrintType(printtype);
|
|
Common.localStorage.setItem("sse-print-settings-range", printtype);
|
|
|
|
// this.adjPrintParams.asc_setLayoutPageType(this.printSettingsDlg.getLayout());
|
|
this.api.asc_Print(this.adjPrintParams, Common.Utils.isChrome || Common.Utils.isSafari || Common.Utils.isOpera);
|
|
|
|
this.isUpdatedSettings = false;
|
|
} else
|
|
return true;
|
|
}
|
|
|
|
Common.NotificationCenter.trigger('edit:complete', view);
|
|
},
|
|
|
|
onChangeRange: function() {
|
|
var newvalue = this.printSettingsDlg.getRange();
|
|
if (newvalue == c_oAscPrintType.EntireWorkbook) {
|
|
this.indeterminatePageOptions(this.printSettingsDlg);
|
|
} else if (this.lastCheckedRange == c_oAscPrintType.EntireWorkbook) {
|
|
this.fillPageOptions(this.printSettingsDlg, this.api.asc_getPageOptions());
|
|
}
|
|
this.lastCheckedRange = newvalue;
|
|
},
|
|
|
|
querySavePrintSettings: function() {
|
|
if ( this.checkMargins(this.printSettings) ) {
|
|
this.savePageOptions(this.printSettings, this.printSettings.cmbSheet.getValue());
|
|
this.printSettings.applySettings();
|
|
}
|
|
},
|
|
|
|
checkMargins: function(panel) {
|
|
if (panel.cmbPaperOrientation.getValue() == c_oAscPageOrientation.PagePortrait) {
|
|
var pagewidth = /^\d{3}\.?\d*/.exec(panel.cmbPaperSize.getValue());
|
|
var pageheight = /\d{3}\.?\d*$/.exec(panel.cmbPaperSize.getValue());
|
|
} else {
|
|
pageheight = /^\d{3}\.?\d*/.exec(panel.cmbPaperSize.getValue());
|
|
pagewidth = /\d{3}\.?\d*$/.exec(panel.cmbPaperSize.getValue());
|
|
}
|
|
pagewidth = parseFloat(pagewidth[0]);
|
|
pageheight = parseFloat(pageheight[0]);
|
|
|
|
var ml = Common.Utils.Metric.fnRecalcToMM(panel.spnMarginLeft.getNumberValue());
|
|
var mr = Common.Utils.Metric.fnRecalcToMM(panel.spnMarginRight.getNumberValue());
|
|
var mt = Common.Utils.Metric.fnRecalcToMM(panel.spnMarginTop.getNumberValue());
|
|
var mb = Common.Utils.Metric.fnRecalcToMM(panel.spnMarginBottom.getNumberValue());
|
|
|
|
var result = false;
|
|
if (ml > pagewidth) result = 'left'; else
|
|
if (mr > pagewidth-ml) result = 'right'; else
|
|
if (mt > pageheight) result = 'top'; else
|
|
if (mb > pageheight-mt) result = 'bottom';
|
|
|
|
if (result) {
|
|
Common.UI.warning({
|
|
title: this.textWarning,
|
|
msg: this.warnCheckMargings,
|
|
callback: function(btn,text) {
|
|
switch(result) {
|
|
case 'left': panel.spnMarginLeft.$el.focus(); return;
|
|
case 'right': panel.spnMarginRight.$el.focus(); return;
|
|
case 'top': panel.spnMarginTop.$el.focus(); return;
|
|
case 'bottom': panel.spnMarginBottom.$el.focus(); return;
|
|
}
|
|
}
|
|
});
|
|
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
},
|
|
|
|
warnCheckMargings: 'Margins are incorrect',
|
|
strAllSheets: 'All Sheets',
|
|
textWarning: 'Warning'
|
|
}, SSE.Controllers.Print || {}));
|
|
}); |