| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496 | ///<reference path="./GC.Spread.Sheets.d.ts" />import { Component, Input, OnChanges, SimpleChanges, AfterViewInit, QueryList, ContentChildren, OnDestroy, Output, EventEmitter, ElementRef, Inject, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; @Component({    selector: 'gc-column',    template: `        <ng-content></ng-content>    `})export class ColumnComponent implements OnChanges {    private changes: any = {};    private sheet: GC.Spread.Sheets.Worksheet;    private index: number;    //indicate all inputs    @Input() width: number;    @Input() dataField: string;    @Input() headerText: string;    @Input() visible: boolean;    @Input() resizable: boolean;    @Input() autoFit: boolean;    @Input() style: GC.Spread.Sheets.Style;    @Input() cellType: GC.Spread.Sheets.CellTypes.Base;    @Input() headerStyle: GC.Spread.Sheets.Style;    @Input() formatter: any;    public onAttached(sheet: GC.Spread.Sheets.Worksheet, index: number): void {        this.sheet = sheet;        this.index = index;        this.onColumnChanged();    }    private onColumnChanged() {        if (this.sheet) {            let sheet = this.sheet;            sheet.suspendPaint();            sheet.suspendEvent();            let changes = this.changes;            for (let changeName in changes) {                let newValue = changes[changeName].currentValue;                if (newValue === null || newValue === void 0) {                    continue;                }                switch (changeName) {                    case 'width':                        sheet.setColumnWidth(this.index, newValue);                        break;                    case 'visible':                        sheet.setColumnVisible(this.index, newValue);                        break;                    case 'resizable':                        sheet.setColumnResizable(this.index, newValue);                        break;                    case 'autoFit':                        if (newValue) {                            sheet.autoFitColumn(this.index);                        }                        break;                    case 'style':                        sheet.setStyle(-1, this.index, newValue);                        break;                    case 'headerStyle':                        sheet.setStyle(-1, this.index, newValue, GC.Spread.Sheets.SheetArea.colHeader);                        break;                    case 'cellType':                        sheet.setCellType(-1, this.index, newValue);                        break;                    case 'formatter':                        sheet.setFormatter(-1, this.index, newValue, GC.Spread.Sheets.SheetArea.viewport);                        break;                }            }            sheet.resumeEvent();            sheet.resumePaint();        }    }    ngOnChanges(changes: SimpleChanges) {        this.changes = {};        let changesCache = this.changes;        for (let changeName in changes) {            changesCache[changeName] = changes[changeName];        }        this.onColumnChanged();    }}@Component({    selector: 'gc-worksheet',    template: `        <ng-content></ng-content>    `})export class WorksheetComponent implements OnChanges, AfterViewInit {    private sheet: GC.Spread.Sheets.Worksheet;    @ContentChildren(ColumnComponent)    columns: QueryList<ColumnComponent>;    //indicate all inputs    @Input() rowCount: number;    @Input() colCount: number;    @Input() dataSource: any;    @Input() name: string;    @Input() frozenColumnCount: number;    @Input() frozenRowCount: number;    @Input() frozenTrailingRowCount: number;    @Input() frozenTrailingColumnCount: number;    @Input() allowCellOverflow: boolean;    @Input() frozenlineColor: string;    @Input() sheetTabColor: string;    @Input() selectionPolicy: number;    @Input() selectionUnit: number;    @Input() zoom: number;    @Input() currentTheme: string;    @Input() clipBoardOptions: number;    @Input() rowHeaderVisible: boolean;    @Input() colHeaderVisible: boolean;    @Input() rowHeaderAutoText: number;    @Input() colHeaderAutoText: number;    @Input() rowHeaderAutoTextIndex: number;    @Input() colHeaderAutoTextIndex: number;    @Input() isProtected: boolean;    @Input() showRowOutline: boolean;    @Input() showColumnOutline: boolean;    @Input() selectionBackColor: string;    @Input() selectionBorderColor: string;    @Input() defaultStyle: GC.Spread.Sheets.Style;    @Input() rowOutlineInfo: any[];    @Input() columnOutlineInfo: any[];    @Input() autoGenerateColumns: boolean;    constructor() {        this.sheet = new GC.Spread.Sheets.Worksheet("");    }    public onAttached(): void {        let sheet = this.sheet;        sheet.suspendPaint();        sheet.suspendEvent();        if (this.dataSource) {            sheet.setDataSource(this.dataSource);            this.columns.forEach((columnComponent: ColumnComponent, index: number) => {                if (columnComponent.dataField) {                    sheet.bindColumn(index, {                        name: columnComponent.dataField,                        displayName: columnComponent.headerText                    });                }            });        }        if (this.columns.length > 0) {            sheet.setColumnCount(this.columns.length);            this.columns.forEach((columnComponent: ColumnComponent, index: number) => {                columnComponent.onAttached(this.sheet, index);            });        }        sheet.resumeEvent();        sheet.resumePaint();    }    public getSheet() {        return this.sheet;    }    ngOnChanges(changes: SimpleChanges) {        let sheet = this.sheet;        sheet.suspendPaint();        sheet.suspendEvent();        for (let changeName in changes) {            let newValue = changes[changeName].currentValue;            if (newValue === null || newValue === void 0) {                continue;            }            switch (changeName) {                case "rowCount":                    sheet.setRowCount(newValue);                    break;                case "colCount":                    sheet.setColumnCount(newValue);                    break;                case "name":                    sheet.name(newValue);                    break;                case "frozenColumnCount":                    sheet.frozenColumnCount(newValue);                    break;                case "frozenRowCount":                    sheet.frozenRowCount(newValue);                    break;                case "frozenTrailingRowCount":                    sheet.frozenTrailingRowCount(newValue);                    break;                case "frozenTrailingColumnCount":                    sheet.frozenTrailingColumnCount(newValue);                    break;                case "selectionPolicy":                    sheet.selectionPolicy(newValue);                    break;                case "selectionUnit":                    sheet.selectionUnit(newValue);                    break;                case "zoom":                    sheet.zoom(newValue);                    break;                case "currentTheme":                    sheet.currentTheme(newValue);                    break;                case "defaultStyle":                    sheet.setDefaultStyle(newValue);                    break;                case "rowOutlineInfo":                    newValue.forEach((item: any) => {                        sheet.rowOutlines.group(item.index, item.count);                    });                    sheet.repaint();                    break;                case "columnOutlineInfo":                    newValue.forEach((item: any) => {                        sheet.columnOutlines.group(item.index, item.count);                    });                    sheet.repaint();                    break;                case "showRowOutline":                    sheet.showRowOutline(newValue);                    break;                case "showColumnOutline":                    sheet.showColumnOutline(newValue);                    break;                case "dataSource":                    sheet.setDataSource(newValue);                    break;                case "autoGenerateColumns":                    sheet[changeName] = newValue;                default:                    sheet.options[changeName] = newValue;            }        }        sheet.resumeEvent();        sheet.resumePaint();    }    ngAfterViewInit() {        this.columns.changes.subscribe(() => { this.onAttached() });    }    ngOnDestroy() {        let sheet = this.sheet;        let spread = sheet ? sheet.getParent() : null;        if (spread) {            let sheetIndex = spread.getSheetIndex(sheet.name());            if (sheetIndex !== void 0) {                spread.removeSheet(sheetIndex);            }        }    }}@Component({    selector: 'gc-spread-sheets',    template: `        <div [ngStyle]="style" [ngClass]="hostClass">            <ng-content></ng-content>        </div>    `})export class SpreadSheetsComponent implements OnChanges, AfterViewInit, OnDestroy {    private elRef: ElementRef;    private spread: GC.Spread.Sheets.Workbook;    private spreadOptions: any[];    style = {        width: '800px',        height: '600px'    };    // indicate all options    @Input() allowUserResize: boolean;    @Input() allowUserZoom: boolean;    @Input() allowUserEditFormula: boolean;    @Input() allowUserDragFill: boolean;    @Input() allowUserDragDrop: boolean;    @Input() highlightInvalidData: boolean;    @Input() newTabVisible: boolean;    @Input() tabStripVisible: boolean;    @Input() tabEditable: boolean;    @Input() autoFitType: number;    @Input() referenceStyle: number;    @Input() backColor: string;    @Input() grayAreaBackColor: string;    @Input() showVerticalScrollbar: boolean;    @Input() showHorizontalScrollbar: boolean;    @Input() hostStyle: any; // used for get styles form parent host DIV    @Input() hostClass: string;    @Input() name: string;    @Input() backgroundImage: string;    @Input() backgroundImageLayout: number;    @Input() showScrollTip: number;    @Input() showResizeTip: number;    @Input() showDragDropTip: boolean;    @Input() showDragFillTip: boolean;    //outputs events    @Output() workbookInitialized = new EventEmitter<any>();    @Output() validationError = new EventEmitter<any>();    @Output() cellClick = new EventEmitter<any>();    @Output() cellDoubleClick = new EventEmitter<any>();    @Output() enterCell = new EventEmitter<any>();    @Output() leaveCell = new EventEmitter<any>();    @Output() valueChanged = new EventEmitter<any>();    @Output() topRowChanged = new EventEmitter<any>();    @Output() leftColumnChanged = new EventEmitter<any>();    @Output() invalidOperation = new EventEmitter<any>();    @Output() rangeFiltering = new EventEmitter<any>();    @Output() rangeFiltered = new EventEmitter<any>();    @Output() tableFiltering = new EventEmitter<any>();    @Output() tableFiltered = new EventEmitter<any>();    @Output() rangeSorting = new EventEmitter<any>();    @Output() rangeSorted = new EventEmitter<any>();    @Output() clipboardChanging = new EventEmitter<any>();    @Output() clipboardChanged = new EventEmitter<any>();    @Output() clipboardPasting = new EventEmitter<any>();    @Output() clipboardPasted = new EventEmitter<any>();    @Output() columnWidthChanging = new EventEmitter<any>();    @Output() columnWidthChanged = new EventEmitter<any>();    @Output() rowHeightChanging = new EventEmitter<any>();    @Output() rowHeightChanged = new EventEmitter<any>();    @Output() dragDropBlock = new EventEmitter<any>();    @Output() dragDropBlockCompleted = new EventEmitter<any>();    @Output() dragFillBlock = new EventEmitter<any>();    @Output() dragFillBlockCompleted = new EventEmitter<any>();    @Output() editStarting = new EventEmitter<any>();    @Output() editChange = new EventEmitter<any>();    @Output() editEnding = new EventEmitter<any>();    @Output() editEnd = new EventEmitter<any>();    @Output() editEnded = new EventEmitter<any>();    @Output() rangeGroupStateChanging = new EventEmitter<any>();    @Output() rangeGroupStateChanged = new EventEmitter<any>();    @Output() selectionChanging = new EventEmitter<any>();    @Output() selectionChanged = new EventEmitter<any>();    @Output() sheetTabClick = new EventEmitter<any>();    @Output() sheetTabDoubleClick = new EventEmitter<any>();    @Output() sheetNameChanging = new EventEmitter<any>();    @Output() sheetNameChanged = new EventEmitter<any>();    @Output() userZooming = new EventEmitter<any>();    @Output() userFormulaEntered = new EventEmitter<any>();    @Output() cellChanged = new EventEmitter<any>();    @Output() columnChanged = new EventEmitter<any>();    @Output() rowChanged = new EventEmitter<any>();    @Output() activeSheetChanging = new EventEmitter<any>();    @Output() activeSheetChanged = new EventEmitter<any>();    @Output() sparklineChanged = new EventEmitter<any>();    @Output() rangeChanged = new EventEmitter<any>();    @Output() buttonClicked = new EventEmitter<any>();    @Output() editorStatusChanged = new EventEmitter<any>();    @Output() floatingObjectChanged = new EventEmitter<any>();    @Output() floatingObjectSelectionChanged = new EventEmitter<any>();    @Output() pictureChanged = new EventEmitter<any>();    @Output() floatingObjectRemoving = new EventEmitter<any>();    @Output() floatingObjectRemoved = new EventEmitter<any>();    @Output() pictureSelectionChanged = new EventEmitter<any>();    @Output() floatingObjectLoaded = new EventEmitter<any>();    @Output() touchToolStripOpening = new EventEmitter<any>();    @Output() commentChanged = new EventEmitter<any>();    @Output() commentRemoving = new EventEmitter<any>();    @Output() commentRemoved = new EventEmitter<any>();    @Output() slicerChanged = new EventEmitter<any>();    @ContentChildren(WorksheetComponent)    sheets: QueryList<WorksheetComponent>;    constructor(@Inject(ElementRef) elRef: ElementRef) {        this.elRef = elRef;    }    ngAfterViewInit() {        let elRef = this.elRef;        let dom = <HTMLElement>elRef.nativeElement;        let hostElement = dom.querySelector('div');        this.spread = new GC.Spread.Sheets.Workbook(hostElement, { sheetCount: 0 });        this.setSpreadOptions();        this.initSheets();        this.sheets.changes.subscribe((changes) => { this.onSheetsChanged(changes) }) // may change sheets using bingidng.        this.bindCustomEvent(this.spread);        this.workbookInitialized.emit({ spread: this.spread });    }    private onSheetsChanged(sheetComponents: QueryList<WorksheetComponent>) {        let spread = this.spread;        spread.suspendPaint();        if (sheetComponents) {            sheetComponents.forEach((sheetComponent: WorksheetComponent, index: number) => {                let sheet = sheetComponent.getSheet();                if (sheet && !sheet.getParent()) {                    spread.addSheet(index, sheetComponent.getSheet());                    sheetComponent.onAttached();                }            });        }        spread.resumePaint();    }    private initSheets() {        let sheets = this.sheets;        let spread = this.spread;        spread.clearSheets();        sheets.forEach((sheetComponent, index) => {            spread.addSheet(index, sheetComponent.getSheet());            sheetComponent.onAttached();        });        // when there is no sheet, add default sheet to spread        if (sheets.length === 0) {            this.spread.addSheet(0, new GC.Spread.Sheets.Worksheet(""));        }    }    private bindCustomEvent(spread: GC.Spread.Sheets.Workbook) {        let customEventNameSpace = '.ng';        let events = ['ValidationError', 'CellClick', 'CellDoubleClick', 'EnterCell',            'LeaveCell', 'ValueChanged', 'TopRowChanged', 'LeftColumnChanged',            'InvalidOperation', 'RangeFiltering', 'RangeFiltered', 'TableFiltering',            'TableFiltered', 'RangeSorting', 'RangeSorted', 'ClipboardChanging',            'ClipboardChanged', 'ClipboardPasting', 'ClipboardPasted', 'ColumnWidthChanging',            'ColumnWidthChanged', 'RowHeightChanging', 'RowHeightChanged', 'DragDropBlock',            'DragDropBlockCompleted', 'DragFillBlock', 'DragFillBlockCompleted', 'EditStarting',            'EditChange', 'EditEnding', 'EditEnd', 'EditEnded', 'RangeGroupStateChanging',            'RangeGroupStateChanged', 'SelectionChanging', 'SelectionChanged', 'SheetTabClick',            'SheetTabDoubleClick', 'SheetNameChanging', 'SheetNameChanged',            'UserZooming', 'UserFormulaEntered', 'CellChanged', 'ColumnChanged',            'RowChanged', 'ActiveSheetChanging', 'ActiveSheetChanged',            'SparklineChanged',            'RangeChanged', 'ButtonClicked', 'EditorStatusChanged',            'FloatingObjectChanged', 'FloatingObjectSelectionChanged', 'PictureChanged', 'FloatingObjectRemoving', 'FloatingObjectRemoved', 'PictureSelectionChanged',            'FloatingObjectLoaded', 'TouchToolStripOpening', 'CommentChanged', 'CommentRemoving', 'CommentRemoved', 'SlicerChanged'];        events.forEach((event) => {            spread.bind(event + customEventNameSpace, (event: any, data: any) => {                let eventType = event.type;                let camelCaseEvent = eventType[0].toLowerCase() + eventType.substr(1);                this[camelCaseEvent].emit(data);            });        });    }    setSpreadOptions() {        let spread = this.spread;        if (!this.spread) {            return;        }        spread.suspendEvent();        spread.suspendPaint();        let options = this.spreadOptions;        options && options.forEach((option) => {            if (option.name === 'name') {                spread.name = option.value;            } else {                spread.options[option.name] = option.value;            }        });        spread.resumePaint();        spread.resumeEvent();    }    ngOnChanges(changes: SimpleChanges) {        let options = [];        for (let changeName in changes) {            let newValue = changes[changeName].currentValue;            if (newValue !== null && newValue !== void 0) {                switch (changeName) {                    case 'hostStyle':                        this.style = newValue;                        break;                    case 'hostClass':                        break;                    default:                        options.push({ name: changeName, value: newValue });                }            }        }        this.spreadOptions = options;        this.setSpreadOptions();    }    ngOnDestroy() {        this.spread.destroy();    }}@NgModule({    imports: [CommonModule],    declarations: [SpreadSheetsComponent, WorksheetComponent, ColumnComponent],    exports: [SpreadSheetsComponent, WorksheetComponent, ColumnComponent]})export class SpreadSheetsModule {}
 |