// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {Coordinate2d} from './coordinate2d.js';
import {Margins} from './margins.js';
import {PrintableArea} from './printable_area.js';
import {Size} from './size.js';
export interface DocumentSettings {
allPagesHaveCustomSize: boolean;
allPagesHaveCustomOrientation: boolean;
hasSelection: boolean;
isModifiable: boolean;
isFromArc: boolean;
isScalingDisabled: boolean;
fitToPageScaling: number;
pageCount: number;
title: string;
}
export interface PageLayoutInfo {
marginTop: number;
marginLeft: number;
marginBottom: number;
marginRight: number;
contentWidth: number;
contentHeight: number;
printableAreaX: number;
printableAreaY: number;
printableAreaWidth: number;
printableAreaHeight: number;
}
const PrintPreviewDocumentInfoElementBase = WebUiListenerMixin(PolymerElement);
export class PrintPreviewDocumentInfoElement extends
PrintPreviewDocumentInfoElementBase {
static get is() {
return 'print-preview-document-info';
}
static get properties() {
return {
documentSettings: {
type: Object,
notify: true,
value() {
return {
allPagesHaveCustomSize: false,
allPagesHaveCustomOrientation: false,
hasSelection: false,
isModifiable: true,
isFromArc: false,
isScalingDisabled: false,
fitToPageScaling: 100,
pageCount: 0,
title: '',
};
},
},
inFlightRequestId: {
type: Number,
value: -1,
},
margins: {
type: Object,
notify: true,
},
/**
* Size of the pages of the document in points. Actual page-related
* information won't be set until preview generation occurs, so use
* a default value until then.
*/
pageSize: {
type: Object,
notify: true,
value() {
return new Size(612, 792);
},
},
/**
* Printable area of the document in points.
*/
printableArea: {
type: Object,
notify: true,
value() {
return new PrintableArea(new Coordinate2d(0, 0), new Size(612, 792));
},
},
};
}
documentSettings: DocumentSettings;
inFlightRequestId: number;
margins: Margins;
pageSize: Size;
printableArea: PrintableArea;
private isInitialized_: boolean = false;
override connectedCallback() {
super.connectedCallback();
this.addWebUiListener(
'page-count-ready',
(pageCount: number, previewResponseId: number, scaling: number) =>
this.onPageCountReady_(pageCount, previewResponseId, scaling));
this.addWebUiListener(
'page-layout-ready',
(pageLayout: PageLayoutInfo, allPagesHaveCustomSize: boolean,
allPagesHaveCustomOrientation: boolean) =>
this.onPageLayoutReady_(
pageLayout, allPagesHaveCustomSize,
allPagesHaveCustomOrientation));
}
/**
* Initializes the state of the data model.
*/
init(
isModifiable: boolean, isFromArc: boolean, title: string,
hasSelection: boolean) {
this.isInitialized_ = true;
this.set('documentSettings.isModifiable', isModifiable);
this.set('documentSettings.isFromArc', isFromArc);
this.set('documentSettings.title', title);
this.set('documentSettings.hasSelection', hasSelection);
}
/**
* Updates whether scaling is disabled for the document.
*/
updateIsScalingDisabled(isScalingDisabled: boolean) {
if (this.isInitialized_) {
this.set('documentSettings.isScalingDisabled', isScalingDisabled);
}
}
/**
* Called when the page layout of the document is ready. Always occurs
* as a result of a preview request.
* @param pageLayout Layout information about the document.
* @param allPagesHaveCustomSize Whether this document has a custom page size
* or style to use for all pages.
* @param allPagesHaveCustomOrientation Whether this document has a custom
* page orientation to use for all pages.
*/
private onPageLayoutReady_(
pageLayout: PageLayoutInfo, allPagesHaveCustomSize: boolean,
allPagesHaveCustomOrientation: boolean) {
const origin =
new Coordinate2d(pageLayout.printableAreaX, pageLayout.printableAreaY);
const size =
new Size(pageLayout.printableAreaWidth, pageLayout.printableAreaHeight);
const pageSize = new Size(
Math.round(
pageLayout.contentWidth + pageLayout.marginLeft +
pageLayout.marginRight),
Math.round(
pageLayout.contentHeight + pageLayout.marginTop +
pageLayout.marginBottom));
// Note that `Margins` stores rounded margin values, which is not
// appropriate for use with `pageSize` above, as that could cause rounding
// errors.
const margins = new Margins(
pageLayout.marginTop, pageLayout.marginRight, pageLayout.marginBottom,
pageLayout.marginLeft);
if (this.isInitialized_) {
this.printableArea = new PrintableArea(origin, size);
this.pageSize = pageSize;
this.set(
'documentSettings.allPagesHaveCustomSize', allPagesHaveCustomSize);
this.set(
'documentSettings.allPagesHaveCustomOrientation',
allPagesHaveCustomOrientation);
this.margins = margins;
}
}
/**
* Called when the document page count is received from the native layer.
* Always occurs as a result of a preview request.
* @param pageCount The document's page count.
* @param previewResponseId The request ID for this page count event.
* @param fitToPageScaling The scaling required to fit the document to page.
*/
private onPageCountReady_(
pageCount: number, previewResponseId: number, fitToPageScaling: number) {
if (this.inFlightRequestId !== previewResponseId || !this.isInitialized_) {
return;
}
this.set('documentSettings.pageCount', pageCount);
this.set('documentSettings.fitToPageScaling', fitToPageScaling);
}
}
customElements.define(
PrintPreviewDocumentInfoElement.is, PrintPreviewDocumentInfoElement);