@wcardinal/wcardinal-ui 0.166.0 → 0.169.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist/types/wcardinal/ui/d-button-select.d.ts +4 -3
  2. package/dist/types/wcardinal/ui/d-command-flag.d.ts +5 -1
  3. package/dist/types/wcardinal/ui/d-controller-default-command.d.ts +7 -0
  4. package/dist/types/wcardinal/ui/d-dialog.d.ts +18 -5
  5. package/dist/types/wcardinal/ui/d-table-column.d.ts +2 -2
  6. package/dist/wcardinal/ui/d-button-select.js +1 -1
  7. package/dist/wcardinal/ui/d-button-select.js.map +1 -1
  8. package/dist/wcardinal/ui/d-command-flag.js +6 -2
  9. package/dist/wcardinal/ui/d-command-flag.js.map +1 -1
  10. package/dist/wcardinal/ui/d-controller-default-command.js +117 -80
  11. package/dist/wcardinal/ui/d-controller-default-command.js.map +1 -1
  12. package/dist/wcardinal/ui/d-dialog.js +71 -23
  13. package/dist/wcardinal/ui/d-dialog.js.map +1 -1
  14. package/dist/wcardinal/ui/d-table-column.js.map +1 -1
  15. package/dist/wcardinal/ui/theme/dark/d-theme-dark-dialog.js +1 -7
  16. package/dist/wcardinal/ui/theme/dark/d-theme-dark-dialog.js.map +1 -1
  17. package/dist/wcardinal/ui/theme/white/d-theme-white-dialog.js +1 -7
  18. package/dist/wcardinal/ui/theme/white/d-theme-white-dialog.js.map +1 -1
  19. package/dist/wcardinal-ui-theme-dark.js +2 -8
  20. package/dist/wcardinal-ui-theme-dark.min.js +2 -2
  21. package/dist/wcardinal-ui-theme-dark.min.js.map +1 -1
  22. package/dist/wcardinal-ui-theme-white.js +2 -8
  23. package/dist/wcardinal-ui-theme-white.min.js +2 -2
  24. package/dist/wcardinal-ui-theme-white.min.js.map +1 -1
  25. package/dist/wcardinal-ui.cjs.js +3074 -2998
  26. package/dist/wcardinal-ui.js +19102 -19014
  27. package/dist/wcardinal-ui.min.js +2 -2
  28. package/dist/wcardinal-ui.min.js.map +1 -1
  29. package/package.json +1 -1
@@ -1,5 +1,6 @@
1
1
  import { interaction } from "pixi.js";
2
2
  import { DButton, DButtonEvents, DButtonOptions, DThemeButton } from "./d-button";
3
+ import { DDialogOpener } from "./d-dialog";
3
4
  import { DDialogSelectOptions } from "./d-dialog-select";
4
5
  import { DOnOptions } from "./d-on-options";
5
6
  /**
@@ -7,7 +8,7 @@ import { DOnOptions } from "./d-on-options";
7
8
  */
8
9
  export interface DButtonSelectDialog<VALUE> {
9
10
  readonly value: VALUE | null;
10
- open(): Promise<unknown>;
11
+ open(opener?: DDialogOpener): Promise<unknown>;
11
12
  }
12
13
  /**
13
14
  * A function to retrieve a selected value from a dialog.
@@ -39,7 +40,7 @@ export interface DButtonSelectOnOptions<VALUE, EMITTER> extends Partial<DButtonS
39
40
  /**
40
41
  * {@link DButtonSelect} options.
41
42
  */
42
- export interface DButtonSelectOptions<VALUE extends unknown = unknown, DIALOG_VALUE extends unknown = unknown, DIALOG extends DButtonSelectDialog<DIALOG_VALUE> = DButtonSelectDialog<DIALOG_VALUE>, THEME extends DThemeButtonSelect<VALUE> = DThemeButtonSelect<VALUE>, EMITTER = any> extends DButtonOptions<VALUE | null, THEME, EMITTER> {
43
+ export interface DButtonSelectOptions<VALUE = unknown, DIALOG_VALUE = unknown, DIALOG extends DButtonSelectDialog<DIALOG_VALUE> = DButtonSelectDialog<DIALOG_VALUE>, THEME extends DThemeButtonSelect<VALUE> = DThemeButtonSelect<VALUE>, EMITTER = any> extends DButtonOptions<VALUE | null, THEME, EMITTER> {
43
44
  /**
44
45
  * A function to retrieve a selected value from a dialog.
45
46
  */
@@ -60,7 +61,7 @@ export interface DButtonSelectOptions<VALUE extends unknown = unknown, DIALOG_VA
60
61
  */
61
62
  export interface DThemeButtonSelect<VALUE = unknown> extends DThemeButton<VALUE | null> {
62
63
  }
63
- export declare class DButtonSelect<VALUE extends unknown = unknown, DIALOG_VALUE extends unknown = unknown, DIALOG extends DButtonSelectDialog<DIALOG_VALUE> = DButtonSelectDialog<DIALOG_VALUE>, THEME extends DThemeButtonSelect<VALUE> = DThemeButtonSelect<VALUE>, OPTIONS extends DButtonSelectOptions<VALUE, DIALOG_VALUE, DIALOG, THEME> = DButtonSelectOptions<VALUE, DIALOG_VALUE, DIALOG, THEME>> extends DButton<VALUE | null, THEME, OPTIONS> {
64
+ export declare class DButtonSelect<VALUE = unknown, DIALOG_VALUE = unknown, DIALOG extends DButtonSelectDialog<DIALOG_VALUE> = DButtonSelectDialog<DIALOG_VALUE>, THEME extends DThemeButtonSelect<VALUE> = DThemeButtonSelect<VALUE>, OPTIONS extends DButtonSelectOptions<VALUE, DIALOG_VALUE, DIALOG, THEME> = DButtonSelectOptions<VALUE, DIALOG_VALUE, DIALOG, THEME>> extends DButton<VALUE | null, THEME, OPTIONS> {
64
65
  protected _dialog?: DIALOG;
65
66
  protected _dialogGetter: DButtonSelectGetter<VALUE, DIALOG>;
66
67
  protected _dialogSetter: DButtonSelectSetter<VALUE, DIALOG>;
@@ -5,8 +5,12 @@ export declare const DCommandFlag: {
5
5
  */
6
6
  readonly UNSTORABLE: 1;
7
7
  /**
8
- * Commands with a `CLEAR` flag clears the command queue.
8
+ * Commands with a `CLEAR` flag clear the command queue.
9
9
  */
10
10
  readonly CLEAR: 2;
11
+ /**
12
+ * Commands with a `CLEAN` flag are not considered as modifications to documents
13
+ */
14
+ readonly CLEAN: 4;
11
15
  };
12
16
  export declare type DCommandFlag = number;
@@ -1,5 +1,7 @@
1
1
  import { utils } from "pixi.js";
2
2
  import { DCommand } from "./d-command";
3
+ import { DCommandRedo } from "./d-command-redo";
4
+ import { DCommandUndo } from "./d-command-undo";
3
5
  import { DControllerCommand } from "./d-controller-command";
4
6
  export declare class DControllerDefaultCommand extends utils.EventEmitter implements DControllerCommand {
5
7
  protected _position: number;
@@ -10,9 +12,14 @@ export declare class DControllerDefaultCommand extends utils.EventEmitter implem
10
12
  last(): DCommand | null;
11
13
  push(command: DCommand): void;
12
14
  next(): void;
15
+ protected executeUndo(command: DCommandUndo): void;
16
+ protected executeRedo(command: DCommandRedo): void;
17
+ protected execute(command: DCommand): void;
13
18
  protected cleanup(): void;
14
19
  protected remove(size: number): boolean;
15
20
  protected onSuccess(command: DCommand): void;
21
+ protected onSuccessUndo(undoed: DCommand): void;
22
+ protected onSuccessRedo(redoed: DCommand): void;
16
23
  protected onFail(command: DCommand): void;
17
24
  size(): number;
18
25
  clear(): void;
@@ -37,7 +37,7 @@ export interface DDialogOnOptions<EMITTER> extends Partial<DDialogEvents<EMITTER
37
37
  * {@link DDialog} options.
38
38
  */
39
39
  export interface DDialogOptions<THEME extends DThemeDialog = DThemeDialog, EMITTER = any> extends DBaseOptions<THEME> {
40
- closeOn?: DDialogCloseOn;
40
+ closeOn?: DDialogCloseOn | Array<keyof typeof DDialogCloseOn> | keyof typeof DDialogCloseOn;
41
41
  animation?: DAnimation<DBase>;
42
42
  /**
43
43
  * A dialog mode.
@@ -45,7 +45,7 @@ export interface DDialogOptions<THEME extends DThemeDialog = DThemeDialog, EMITT
45
45
  mode?: DDialogMode | keyof typeof DDialogMode;
46
46
  sticky?: boolean;
47
47
  gesture?: boolean | DDialogGestureOptions;
48
- align?: DDialogAlign | null;
48
+ align?: DDialogAlign | null | keyof typeof DDialogAlign;
49
49
  /**
50
50
  * Mappings of event names and handlers.
51
51
  */
@@ -65,7 +65,7 @@ export interface DThemeDialog extends DThemeBase {
65
65
  getAlign(mode: DDialogMode): DDialogAlign | null;
66
66
  newAnimation(mode: DDialogMode): DAnimation<DBase> | null;
67
67
  }
68
- export interface DDialogOwner {
68
+ export interface DDialogOpener {
69
69
  getBounds(skipUpdate: boolean, result: Rectangle): Rectangle;
70
70
  }
71
71
  /**
@@ -89,18 +89,31 @@ export declare class DDialog<VALUE = void, THEME extends DThemeDialog = DThemeDi
89
89
  protected _sticky: boolean;
90
90
  protected _onPrerenderBound: () => void;
91
91
  protected _align: DDialogAlign | null;
92
- protected _owner?: DDialogOwner | null;
92
+ protected _opener?: DDialogOpener | null;
93
93
  protected _gesture: DDialogGesture<this>;
94
94
  protected _layer: DApplicationLayerLike | null;
95
95
  protected init(options?: OPTIONS): void;
96
+ protected toCloseOn(mode: DDialogMode, theme: THEME, options?: OPTIONS): DDialogCloseOn;
97
+ protected toAlign(mode: DDialogMode, theme: THEME, options?: OPTIONS): DDialogAlign | null;
96
98
  get mode(): DDialogMode;
99
+ get align(): DDialogAlign | null;
100
+ set algin(align: DDialogAlign | null);
97
101
  get gesture(): DDialogGesture<this>;
98
102
  get layer(): DApplicationLayerLike | null;
99
103
  protected toGestureOptions(mode: DDialogMode, theme: THEME, options?: OPTIONS): DDialogGestureOptions;
100
104
  onParentResize(parentWidth: number, parentHeight: number, parentPadding: DPadding): void;
101
105
  protected getAnimation(): DAnimation | null;
102
106
  protected onAnimationEnd(isReverse: boolean): void;
103
- open(owner?: DDialogOwner): Promise<VALUE>;
107
+ /**
108
+ * Opens a dialog.
109
+ *
110
+ * @param opener An opener of a dialog.
111
+ * The dialog position is determined based on a position and a size of the opener.
112
+ * If the opener is undefined, the dialog is placed at the center of the screen.
113
+ *
114
+ * @returns a value of this dialog
115
+ */
116
+ open(opener?: DDialogOpener): Promise<VALUE>;
104
117
  protected onPrerender(): void;
105
118
  protected onOpen(): void;
106
119
  isOpened(): boolean;
@@ -1,5 +1,5 @@
1
1
  import { DAlignHorizontal } from "./d-align-horizontal";
2
- import { DDialogOwner } from "./d-dialog";
2
+ import { DDialogOpener } from "./d-dialog";
3
3
  import { DDialogSelectOptions } from "./d-dialog-select";
4
4
  import { DMenu, DMenuOptions } from "./d-menu";
5
5
  import { DTableBodyCellButtonOptions } from "./d-table-body-cell-button";
@@ -72,7 +72,7 @@ export interface DTableColumnSorting<ROW_VALUE> {
72
72
  }
73
73
  export interface DTableColumnSelectingDialog<DIALOG_VALUE> {
74
74
  readonly value: DIALOG_VALUE;
75
- open(owner?: DDialogOwner): Promise<DIALOG_VALUE>;
75
+ open(owner?: DDialogOpener): Promise<DIALOG_VALUE>;
76
76
  }
77
77
  export interface DTableColumnSelectingOptions<CELL_VALUE, DIALOG_VALUE, DIALOG extends DTableColumnSelectingDialog<DIALOG_VALUE>> {
78
78
  getter?: DTableSelectingGetter<CELL_VALUE, DIALOG>;
@@ -64,7 +64,7 @@ var DButtonSelect = /** @class */ (function (_super) {
64
64
  var dialog = this.dialog;
65
65
  var oldValue = (_a = this._textValueComputed) !== null && _a !== void 0 ? _a : null;
66
66
  this._dialogSetter(dialog, oldValue);
67
- dialog.open().then(function () {
67
+ dialog.open(this).then(function () {
68
68
  var newValue = _this._dialogGetter(dialog);
69
69
  if (newValue !== oldValue) {
70
70
  _this.text = newValue;
@@ -1 +1 @@
1
- {"version":3,"file":"d-button-select.js","sourceRoot":"","sources":["../../../src/main/typescript/wcardinal/ui/d-button-select.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAGH,OAAO,EAAE,OAAO,EAA+C,MAAM,YAAY,CAAC;AAClF,OAAO,EAAE,aAAa,EAAwB,MAAM,mBAAmB,CAAC;AA6ExE,IAAM,aAAa,GAAG,UAAC,MAAgC;IACtD,qCAAqC;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC;AACrB,CAAC,CAAC;AAEF,IAAM,aAAa,GAAG;IACrB,aAAa;AACd,CAAC,CAAC;AAEF,IAAM,SAAS,GAAG,UACjB,OAAiB;;IAEjB,IAAI,OAAO,EAAE;QACZ,oEAAoE;QACpE,IAAM,SAAS,GAAG,MAAA,OAAO,CAAC,IAAI,0CAAE,SAAS,CAAC;QAC1C,IAAI,SAAS,KAAK,SAAS,EAAE;YAC5B,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC5B,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE;gBAClC,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;gBACtB,IAAM,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC/C,IAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;gBAC3C,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;oBACjC,8EAA8E;oBAC9E,IAAI,CAAC,SAAS,GAAG,SAAgB,CAAC;iBAClC;aACD;SACD;aAAM;YACN,2DAA2D;YAC3D,IAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM,IAAI,MAAM,CAAC,EAAE;gBAClC,IAAM,eAAe,GAAG,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,IAAI,0CAAE,IAAI,0CAAE,SAAS,CAAC;gBACtD,IAAI,eAAe,KAAK,SAAS,EAAE;oBAClC,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;oBAChC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;oBACpB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;wBACjC,6EAA6E;wBAC7E,IAAI,CAAC,SAAS,GAAG,eAAsB,CAAC;qBACxC;iBACD;aACD;SACD;KACD;IACD,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC;AAEF;IAWU,iCAAqC;IAK9C,uBAAY,OAAiB;QAA7B,iBAIC;;gBAHA,kBAAM,SAAS,CAAC,OAAO,CAAC,CAAC;QACzB,KAAI,CAAC,aAAa,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,aAAa,CAAC;QACtD,KAAI,CAAC,aAAa,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,mCAAI,aAAa,CAAC;;IACvD,CAAC;IAES,kCAAU,GAApB,UACC,CAA0E;QAD3E,iBAcC;;QAXA,iBAAM,UAAU,YAAC,CAAC,CAAC,CAAC;QACpB,IAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAM,QAAQ,GAAG,MAAA,IAAI,CAAC,kBAAkB,mCAAI,IAAI,CAAC;QACjD,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;YAClB,IAAM,QAAQ,GAAG,KAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,QAAQ,KAAK,QAAQ,EAAE;gBAC1B,KAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACrB,KAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAI,CAAC,CAAC;aAC9C;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAED,sBAAI,iCAAM;aAAV;;YACC,IAAI,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;YAC1B,IAAI,MAAM,IAAI,IAAI,EAAE;gBACnB,IAAM,OAAO,GAAG,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,CAAC;gBACtC,IAAI,OAAO,IAAI,MAAM,IAAI,OAAO,EAAE;oBACjC,MAAM,GAAG,OAAO,CAAC;iBACjB;qBAAM;oBACN,kDAAkD;oBAClD,MAAM,GAAG,IAAI,aAAa,CAAe,OAAO,CAAkB,CAAC;iBACnE;gBACD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;aACtB;YACD,OAAO,MAAM,CAAC;QACf,CAAC;;;OAAA;IAED,sBAAI,gCAAK;aAAT;;YACC,OAAO,MAAA,IAAI,CAAC,kBAAkB,mCAAI,IAAI,CAAC;QACxC,CAAC;aAED,UAAU,KAAmB;YAC5B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QACnB,CAAC;;;OAJA;IAMS,+BAAO,GAAjB;QACC,OAAO,eAAe,CAAC;IACxB,CAAC;IACF,oBAAC;AAAD,CAAC,AAhED,CAWU,OAAO,GAqDhB","sourcesContent":["/*\n * Copyright (C) 2019 Toshiba Corporation\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { interaction } from \"pixi.js\";\nimport { DButton, DButtonEvents, DButtonOptions, DThemeButton } from \"./d-button\";\nimport { DDialogSelect, DDialogSelectOptions } from \"./d-dialog-select\";\nimport { DOnOptions } from \"./d-on-options\";\n\n/**\n * A dialog to select values.\n */\nexport interface DButtonSelectDialog<VALUE> {\n\treadonly value: VALUE | null;\n\topen(): Promise<unknown>;\n}\n\n/**\n * A function to retrieve a selected value from a dialog.\n */\nexport type DButtonSelectGetter<VALUE, DIALOG> = (dialog: DIALOG) => VALUE | null;\n\n/**\n * A function to set a selecte value to a dialog.\n * Called before opening a dialog.\n */\nexport type DButtonSelectSetter<VALUE, DIALOG> = (dialog: DIALOG, value: VALUE | null) => void;\n\n/**\n * {@link DButtonSelect} events.\n */\nexport interface DButtonSelectEvents<VALUE, EMITTER> extends DButtonEvents<VALUE, EMITTER> {\n\t/**\n\t * Triggered when a selection is changed.\n\t *\n\t * @param newValue a newly selected value\n\t * @param oldValue a previously selected value\n\t * @param emitter an emitter\n\t */\n\tchange(newValue: VALUE | null, oldValue: VALUE | null, emitter: EMITTER): void;\n}\n\n/**\n * {@link DButtonSelect} \"on\" options.\n */\nexport interface DButtonSelectOnOptions<VALUE, EMITTER>\n\textends Partial<DButtonSelectEvents<VALUE, EMITTER>>,\n\t\tDOnOptions {}\n\n/**\n * {@link DButtonSelect} options.\n */\nexport interface DButtonSelectOptions<\n\tVALUE extends unknown = unknown,\n\tDIALOG_VALUE extends unknown = unknown,\n\tDIALOG extends DButtonSelectDialog<DIALOG_VALUE> = DButtonSelectDialog<DIALOG_VALUE>,\n\tTHEME extends DThemeButtonSelect<VALUE> = DThemeButtonSelect<VALUE>,\n\tEMITTER = any\n> extends DButtonOptions<VALUE | null, THEME, EMITTER> {\n\t/**\n\t * A function to retrieve a selected value from a dialog.\n\t */\n\tgetter?: DButtonSelectGetter<VALUE, DIALOG>;\n\n\t/**\n\t * A function to set a selected value to a dialog.\n\t * Called before opening a dialog.\n\t */\n\tsetter?: DButtonSelectSetter<VALUE, DIALOG>;\n\n\t/**\n\t * A dialog to select values.\n\t */\n\tdialog?: DDialogSelectOptions<DIALOG_VALUE> | DIALOG;\n\n\ton?: DButtonSelectOnOptions<VALUE, EMITTER>;\n}\n\n/**\n * {@link DButtonSelect} theme.\n */\nexport interface DThemeButtonSelect<VALUE = unknown> extends DThemeButton<VALUE | null> {}\n\nconst defaultGetter = (dialog: DButtonSelectDialog<any>): any => {\n\t// Assumes the dialog.value is VALUE.\n\treturn dialog.value;\n};\n\nconst defaultSetter = (): void => {\n\t// DO NOTHING\n};\n\nconst toOptions = <OPTIONS extends DButtonSelectOptions<any, any, any, any>>(\n\toptions?: OPTIONS\n): OPTIONS | undefined => {\n\tif (options) {\n\t\t// Try to copy text.formatter to dialog.item.text.formatter at first\n\t\tconst formatter = options.text?.formatter;\n\t\tif (formatter !== undefined) {\n\t\t\tlet dialog = options.dialog;\n\t\t\tif (!(dialog && \"open\" in dialog)) {\n\t\t\t\tdialog = dialog || {};\n\t\t\t\tconst item = (dialog.item = dialog.item || {});\n\t\t\t\tconst text = (item.text = item.text || {});\n\t\t\t\tif (text.formatter === undefined) {\n\t\t\t\t\t// Assumes formatter is ( value: DIALOG_VALUE | null, caller: any ) => string.\n\t\t\t\t\ttext.formatter = formatter as any;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Try to copy dialog.item.text.formatter to text.formatter\n\t\t\tconst dialog = options.dialog;\n\t\t\tif (!(dialog && \"open\" in dialog)) {\n\t\t\t\tconst dialogFormatter = dialog?.item?.text?.formatter;\n\t\t\t\tif (dialogFormatter !== undefined) {\n\t\t\t\t\tconst text = options.text || {};\n\t\t\t\t\toptions.text = text;\n\t\t\t\t\tif (text.formatter === undefined) {\n\t\t\t\t\t\t// Assumes dialogFormatter is ( value: VALUE | null, caller: any ) => string.\n\t\t\t\t\t\ttext.formatter = dialogFormatter as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn options;\n};\n\nexport class DButtonSelect<\n\tVALUE extends unknown = unknown,\n\tDIALOG_VALUE extends unknown = unknown,\n\tDIALOG extends DButtonSelectDialog<DIALOG_VALUE> = DButtonSelectDialog<DIALOG_VALUE>,\n\tTHEME extends DThemeButtonSelect<VALUE> = DThemeButtonSelect<VALUE>,\n\tOPTIONS extends DButtonSelectOptions<VALUE, DIALOG_VALUE, DIALOG, THEME> = DButtonSelectOptions<\n\t\tVALUE,\n\t\tDIALOG_VALUE,\n\t\tDIALOG,\n\t\tTHEME\n\t>\n> extends DButton<VALUE | null, THEME, OPTIONS> {\n\tprotected _dialog?: DIALOG;\n\tprotected _dialogGetter: DButtonSelectGetter<VALUE, DIALOG>;\n\tprotected _dialogSetter: DButtonSelectSetter<VALUE, DIALOG>;\n\n\tconstructor(options?: OPTIONS) {\n\t\tsuper(toOptions(options));\n\t\tthis._dialogGetter = options?.getter ?? defaultGetter;\n\t\tthis._dialogSetter = options?.setter ?? defaultSetter;\n\t}\n\n\tprotected onActivate(\n\t\te?: interaction.InteractionEvent | KeyboardEvent | MouseEvent | TouchEvent\n\t): void {\n\t\tsuper.onActivate(e);\n\t\tconst dialog = this.dialog;\n\t\tconst oldValue = this._textValueComputed ?? null;\n\t\tthis._dialogSetter(dialog, oldValue);\n\t\tdialog.open().then((): void => {\n\t\t\tconst newValue = this._dialogGetter(dialog);\n\t\t\tif (newValue !== oldValue) {\n\t\t\t\tthis.text = newValue;\n\t\t\t\tthis.emit(\"change\", newValue, oldValue, this);\n\t\t\t}\n\t\t});\n\t}\n\n\tget dialog(): DIALOG {\n\t\tlet dialog = this._dialog;\n\t\tif (dialog == null) {\n\t\t\tconst options = this._options?.dialog;\n\t\t\tif (options && \"open\" in options) {\n\t\t\t\tdialog = options;\n\t\t\t} else {\n\t\t\t\t// Assumes DIALOG === DDialogSelect<DIALOG_VALUE>.\n\t\t\t\tdialog = new DDialogSelect<DIALOG_VALUE>(options) as any as DIALOG;\n\t\t\t}\n\t\t\tthis._dialog = dialog;\n\t\t}\n\t\treturn dialog;\n\t}\n\n\tget value(): VALUE | null {\n\t\treturn this._textValueComputed ?? null;\n\t}\n\n\tset value(value: VALUE | null) {\n\t\tthis.text = value;\n\t}\n\n\tprotected getType(): string {\n\t\treturn \"DButtonSelect\";\n\t}\n}\n"]}
1
+ {"version":3,"file":"d-button-select.js","sourceRoot":"","sources":["../../../src/main/typescript/wcardinal/ui/d-button-select.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (C) 2019 Toshiba Corporation\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { interaction } from \"pixi.js\";\nimport { DButton, DButtonEvents, DButtonOptions, DThemeButton } from \"./d-button\";\nimport { DDialogOpener } from \"./d-dialog\";\nimport { DDialogSelect, DDialogSelectOptions } from \"./d-dialog-select\";\nimport { DOnOptions } from \"./d-on-options\";\n\n/**\n * A dialog to select values.\n */\nexport interface DButtonSelectDialog<VALUE> {\n\treadonly value: VALUE | null;\n\topen(opener?: DDialogOpener): Promise<unknown>;\n}\n\n/**\n * A function to retrieve a selected value from a dialog.\n */\nexport type DButtonSelectGetter<VALUE, DIALOG> = (dialog: DIALOG) => VALUE | null;\n\n/**\n * A function to set a selecte value to a dialog.\n * Called before opening a dialog.\n */\nexport type DButtonSelectSetter<VALUE, DIALOG> = (dialog: DIALOG, value: VALUE | null) => void;\n\n/**\n * {@link DButtonSelect} events.\n */\nexport interface DButtonSelectEvents<VALUE, EMITTER> extends DButtonEvents<VALUE, EMITTER> {\n\t/**\n\t * Triggered when a selection is changed.\n\t *\n\t * @param newValue a newly selected value\n\t * @param oldValue a previously selected value\n\t * @param emitter an emitter\n\t */\n\tchange(newValue: VALUE | null, oldValue: VALUE | null, emitter: EMITTER): void;\n}\n\n/**\n * {@link DButtonSelect} \"on\" options.\n */\nexport interface DButtonSelectOnOptions<VALUE, EMITTER>\n\textends Partial<DButtonSelectEvents<VALUE, EMITTER>>,\n\t\tDOnOptions {}\n\n/**\n * {@link DButtonSelect} options.\n */\nexport interface DButtonSelectOptions<\n\tVALUE = unknown,\n\tDIALOG_VALUE = unknown,\n\tDIALOG extends DButtonSelectDialog<DIALOG_VALUE> = DButtonSelectDialog<DIALOG_VALUE>,\n\tTHEME extends DThemeButtonSelect<VALUE> = DThemeButtonSelect<VALUE>,\n\tEMITTER = any\n> extends DButtonOptions<VALUE | null, THEME, EMITTER> {\n\t/**\n\t * A function to retrieve a selected value from a dialog.\n\t */\n\tgetter?: DButtonSelectGetter<VALUE, DIALOG>;\n\n\t/**\n\t * A function to set a selected value to a dialog.\n\t * Called before opening a dialog.\n\t */\n\tsetter?: DButtonSelectSetter<VALUE, DIALOG>;\n\n\t/**\n\t * A dialog to select values.\n\t */\n\tdialog?: DDialogSelectOptions<DIALOG_VALUE> | DIALOG;\n\n\ton?: DButtonSelectOnOptions<VALUE, EMITTER>;\n}\n\n/**\n * {@link DButtonSelect} theme.\n */\nexport interface DThemeButtonSelect<VALUE = unknown> extends DThemeButton<VALUE | null> {}\n\nconst defaultGetter = (dialog: DButtonSelectDialog<any>): any => {\n\t// Assumes the dialog.value is VALUE.\n\treturn dialog.value;\n};\n\nconst defaultSetter = (): void => {\n\t// DO NOTHING\n};\n\nconst toOptions = <OPTIONS extends DButtonSelectOptions<any, any, any, any>>(\n\toptions?: OPTIONS\n): OPTIONS | undefined => {\n\tif (options) {\n\t\t// Try to copy text.formatter to dialog.item.text.formatter at first\n\t\tconst formatter = options.text?.formatter;\n\t\tif (formatter !== undefined) {\n\t\t\tlet dialog = options.dialog;\n\t\t\tif (!(dialog && \"open\" in dialog)) {\n\t\t\t\tdialog = dialog || {};\n\t\t\t\tconst item = (dialog.item = dialog.item || {});\n\t\t\t\tconst text = (item.text = item.text || {});\n\t\t\t\tif (text.formatter === undefined) {\n\t\t\t\t\t// Assumes formatter is ( value: DIALOG_VALUE | null, caller: any ) => string.\n\t\t\t\t\ttext.formatter = formatter as any;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// Try to copy dialog.item.text.formatter to text.formatter\n\t\t\tconst dialog = options.dialog;\n\t\t\tif (!(dialog && \"open\" in dialog)) {\n\t\t\t\tconst dialogFormatter = dialog?.item?.text?.formatter;\n\t\t\t\tif (dialogFormatter !== undefined) {\n\t\t\t\t\tconst text = options.text || {};\n\t\t\t\t\toptions.text = text;\n\t\t\t\t\tif (text.formatter === undefined) {\n\t\t\t\t\t\t// Assumes dialogFormatter is ( value: VALUE | null, caller: any ) => string.\n\t\t\t\t\t\ttext.formatter = dialogFormatter as any;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn options;\n};\n\nexport class DButtonSelect<\n\tVALUE = unknown,\n\tDIALOG_VALUE = unknown,\n\tDIALOG extends DButtonSelectDialog<DIALOG_VALUE> = DButtonSelectDialog<DIALOG_VALUE>,\n\tTHEME extends DThemeButtonSelect<VALUE> = DThemeButtonSelect<VALUE>,\n\tOPTIONS extends DButtonSelectOptions<VALUE, DIALOG_VALUE, DIALOG, THEME> = DButtonSelectOptions<\n\t\tVALUE,\n\t\tDIALOG_VALUE,\n\t\tDIALOG,\n\t\tTHEME\n\t>\n> extends DButton<VALUE | null, THEME, OPTIONS> {\n\tprotected _dialog?: DIALOG;\n\tprotected _dialogGetter: DButtonSelectGetter<VALUE, DIALOG>;\n\tprotected _dialogSetter: DButtonSelectSetter<VALUE, DIALOG>;\n\n\tconstructor(options?: OPTIONS) {\n\t\tsuper(toOptions(options));\n\t\tthis._dialogGetter = options?.getter ?? defaultGetter;\n\t\tthis._dialogSetter = options?.setter ?? defaultSetter;\n\t}\n\n\tprotected onActivate(\n\t\te?: interaction.InteractionEvent | KeyboardEvent | MouseEvent | TouchEvent\n\t): void {\n\t\tsuper.onActivate(e);\n\t\tconst dialog = this.dialog;\n\t\tconst oldValue = this._textValueComputed ?? null;\n\t\tthis._dialogSetter(dialog, oldValue);\n\t\tdialog.open(this).then((): void => {\n\t\t\tconst newValue = this._dialogGetter(dialog);\n\t\t\tif (newValue !== oldValue) {\n\t\t\t\tthis.text = newValue;\n\t\t\t\tthis.emit(\"change\", newValue, oldValue, this);\n\t\t\t}\n\t\t});\n\t}\n\n\tget dialog(): DIALOG {\n\t\tlet dialog = this._dialog;\n\t\tif (dialog == null) {\n\t\t\tconst options = this._options?.dialog;\n\t\t\tif (options && \"open\" in options) {\n\t\t\t\tdialog = options;\n\t\t\t} else {\n\t\t\t\t// Assumes DIALOG === DDialogSelect<DIALOG_VALUE>.\n\t\t\t\tdialog = new DDialogSelect<DIALOG_VALUE>(options) as any as DIALOG;\n\t\t\t}\n\t\t\tthis._dialog = dialog;\n\t\t}\n\t\treturn dialog;\n\t}\n\n\tget value(): VALUE | null {\n\t\treturn this._textValueComputed ?? null;\n\t}\n\n\tset value(value: VALUE | null) {\n\t\tthis.text = value;\n\t}\n\n\tprotected getType(): string {\n\t\treturn \"DButtonSelect\";\n\t}\n}\n"]}
@@ -9,8 +9,12 @@ export var DCommandFlag = {
9
9
  */
10
10
  UNSTORABLE: 1,
11
11
  /**
12
- * Commands with a `CLEAR` flag clears the command queue.
12
+ * Commands with a `CLEAR` flag clear the command queue.
13
13
  */
14
- CLEAR: 2
14
+ CLEAR: 2,
15
+ /**
16
+ * Commands with a `CLEAN` flag are not considered as modifications to documents
17
+ */
18
+ CLEAN: 4
15
19
  };
16
20
  //# sourceMappingURL=d-command-flag.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"d-command-flag.js","sourceRoot":"","sources":["../../../src/main/typescript/wcardinal/ui/d-command-flag.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,IAAM,YAAY,GAAG;IAC3B,IAAI,EAAE,CAAC;IAEP;;OAEG;IACH,UAAU,EAAE,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,CAAC;CACC,CAAC","sourcesContent":["/*\n * Copyright (C) 2019 Toshiba Corporation\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const DCommandFlag = {\n\tNONE: 0,\n\n\t/**\n\t * Commands with a `UNSTORABLE` flag will not be queued to the `done` queue.\n\t */\n\tUNSTORABLE: 1,\n\n\t/**\n\t * Commands with a `CLEAR` flag clears the command queue.\n\t */\n\tCLEAR: 2\n} as const;\n\nexport type DCommandFlag = number;\n"]}
1
+ {"version":3,"file":"d-command-flag.js","sourceRoot":"","sources":["../../../src/main/typescript/wcardinal/ui/d-command-flag.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,IAAM,YAAY,GAAG;IAC3B,IAAI,EAAE,CAAC;IAEP;;OAEG;IACH,UAAU,EAAE,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,CAAC;IAER;;OAEG;IACH,KAAK,EAAE,CAAC;CACC,CAAC","sourcesContent":["/*\n * Copyright (C) 2019 Toshiba Corporation\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport const DCommandFlag = {\n\tNONE: 0,\n\n\t/**\n\t * Commands with a `UNSTORABLE` flag will not be queued to the `done` queue.\n\t */\n\tUNSTORABLE: 1,\n\n\t/**\n\t * Commands with a `CLEAR` flag clear the command queue.\n\t */\n\tCLEAR: 2,\n\n\t/**\n\t * Commands with a `CLEAN` flag are not considered as modifications to documents\n\t */\n\tCLEAN: 4\n} as const;\n\nexport type DCommandFlag = number;\n"]}
@@ -14,6 +14,9 @@ var isCommandStorable = function (command) {
14
14
  var isCommandClear = function (command) {
15
15
  return !!(command.getFlag() & DCommandFlag.CLEAR);
16
16
  };
17
+ var isCommandClean = function (command) {
18
+ return !!(command.getFlag() & DCommandFlag.CLEAN);
19
+ };
17
20
  var DControllerDefaultCommand = /** @class */ (function (_super) {
18
21
  __extends(DControllerDefaultCommand, _super);
19
22
  function DControllerDefaultCommand() {
@@ -40,90 +43,109 @@ var DControllerDefaultCommand = /** @class */ (function (_super) {
40
43
  }
41
44
  };
42
45
  DControllerDefaultCommand.prototype.push = function (command) {
43
- var waiting = this._waiting;
44
- waiting.push(command);
46
+ this._waiting.push(command);
45
47
  this.next();
46
48
  };
47
49
  DControllerDefaultCommand.prototype.next = function () {
50
+ if (this._executing != null) {
51
+ // Still executing a command.
52
+ // So do nothing.
53
+ return;
54
+ }
55
+ var waiting = this._waiting;
56
+ if (waiting.length <= 0) {
57
+ // There is no waiting commands.
58
+ // So do nothing.
59
+ return;
60
+ }
61
+ var command = waiting.shift();
62
+ if (command == null) {
63
+ // There is no waiting commands.
64
+ // So do nothing.
65
+ return;
66
+ }
67
+ if (command instanceof DCommandUndo) {
68
+ this.executeUndo(command);
69
+ }
70
+ else if (command instanceof DCommandRedo) {
71
+ this.executeRedo(command);
72
+ }
73
+ else {
74
+ this.execute(command);
75
+ }
76
+ };
77
+ DControllerDefaultCommand.prototype.executeUndo = function (command) {
48
78
  var _this = this;
49
- if (this._executing == null) {
50
- var waiting = this._waiting;
51
- if (0 < waiting.length) {
52
- var command_1 = waiting.shift();
53
- if (command_1 != null) {
54
- if (command_1 instanceof DCommandUndo) {
55
- var done = this._done;
56
- if (this._position < done.length) {
57
- var current = done[done.length - 1 - this._position];
58
- this._position += 1;
59
- this.emit("change", this);
60
- var result = current.undo();
61
- if (result === true) {
62
- this.onSuccess(command_1);
63
- }
64
- else if (result === false) {
65
- this.onFail(command_1);
66
- }
67
- else {
68
- this._executing = result.then(function () {
69
- _this.onSuccess(command_1);
70
- }, function () {
71
- _this.onFail(command_1);
72
- });
73
- }
74
- }
75
- }
76
- else if (command_1 instanceof DCommandRedo) {
77
- var done = this._done;
78
- if (0 < this._position) {
79
- var current = done[done.length - this._position];
80
- this._position -= 1;
81
- this.emit("change", this);
82
- var result = current.redo();
83
- if (result === true) {
84
- this.onSuccess(command_1);
85
- }
86
- else if (result === false) {
87
- this.onFail(command_1);
88
- }
89
- else {
90
- this._executing = result.then(function () {
91
- _this.onSuccess(command_1);
92
- }, function () {
93
- _this.onFail(command_1);
94
- });
95
- }
96
- }
97
- }
98
- else {
99
- var isClear = isCommandClear(command_1);
100
- var isStorable = isCommandStorable(command_1);
101
- if (isClear || isStorable) {
102
- var size = isClear ? this._done.length : this._position;
103
- if (0 < size) {
104
- this.remove(size);
105
- this._position = 0;
106
- this.emit("change", this);
107
- }
108
- this.cleanup();
109
- }
110
- var result = command_1.execute();
111
- if (result === true) {
112
- this.onSuccess(command_1);
113
- }
114
- else if (result === false) {
115
- this.onFail(command_1);
116
- }
117
- else {
118
- this._executing = result.then(function () {
119
- _this.onSuccess(command_1);
120
- }, function () {
121
- _this.onFail(command_1);
122
- });
123
- }
124
- }
125
- }
79
+ var done = this._done;
80
+ if (this._position < done.length) {
81
+ var current_1 = done[done.length - 1 - this._position];
82
+ this._position += 1;
83
+ this.emit("change", this);
84
+ var result = current_1.undo();
85
+ if (result === true) {
86
+ this.onSuccessUndo(current_1);
87
+ }
88
+ else if (result === false) {
89
+ this.onFail(command);
90
+ }
91
+ else {
92
+ this._executing = result.then(function () {
93
+ _this.onSuccessUndo(current_1);
94
+ }, function () {
95
+ _this.onFail(command);
96
+ });
97
+ }
98
+ }
99
+ };
100
+ DControllerDefaultCommand.prototype.executeRedo = function (command) {
101
+ var _this = this;
102
+ var done = this._done;
103
+ if (0 < this._position) {
104
+ var current_2 = done[done.length - this._position];
105
+ this._position -= 1;
106
+ this.emit("change", this);
107
+ var result = current_2.redo();
108
+ if (result === true) {
109
+ this.onSuccessRedo(current_2);
126
110
  }
111
+ else if (result === false) {
112
+ this.onFail(command);
113
+ }
114
+ else {
115
+ this._executing = result.then(function () {
116
+ _this.onSuccessRedo(current_2);
117
+ }, function () {
118
+ _this.onFail(command);
119
+ });
120
+ }
121
+ }
122
+ };
123
+ DControllerDefaultCommand.prototype.execute = function (command) {
124
+ var _this = this;
125
+ var isClear = isCommandClear(command);
126
+ var isStorable = isCommandStorable(command);
127
+ if (isClear || isStorable) {
128
+ var size = isClear ? this._done.length : this._position;
129
+ if (0 < size) {
130
+ this.remove(size);
131
+ this._position = 0;
132
+ this.emit("change", this);
133
+ }
134
+ this.cleanup();
135
+ }
136
+ var result = command.execute();
137
+ if (result === true) {
138
+ this.onSuccess(command);
139
+ }
140
+ else if (result === false) {
141
+ this.onFail(command);
142
+ }
143
+ else {
144
+ this._executing = result.then(function () {
145
+ _this.onSuccess(command);
146
+ }, function () {
147
+ _this.onFail(command);
148
+ });
127
149
  }
128
150
  };
129
151
  DControllerDefaultCommand.prototype.cleanup = function () {
@@ -155,9 +177,24 @@ var DControllerDefaultCommand = /** @class */ (function (_super) {
155
177
  this._executing = null;
156
178
  if (isCommandStorable(command)) {
157
179
  this._done.push(command);
180
+ if (!isCommandClean(command)) {
181
+ this.emit("dirty", this);
182
+ }
183
+ }
184
+ this.emit("change", this);
185
+ this.next();
186
+ };
187
+ DControllerDefaultCommand.prototype.onSuccessUndo = function (undoed) {
188
+ this._executing = null;
189
+ if (!isCommandClean(undoed)) {
158
190
  this.emit("dirty", this);
159
191
  }
160
- else if (command instanceof DCommandUndo || command instanceof DCommandRedo) {
192
+ this.emit("change", this);
193
+ this.next();
194
+ };
195
+ DControllerDefaultCommand.prototype.onSuccessRedo = function (redoed) {
196
+ this._executing = null;
197
+ if (!isCommandClean(redoed)) {
161
198
  this.emit("dirty", this);
162
199
  }
163
200
  this.emit("change", this);
@@ -1 +1 @@
1
- {"version":3,"file":"d-controller-default-command.js","sourceRoot":"","sources":["../../../src/main/typescript/wcardinal/ui/d-controller-default-command.ts"],"names":[],"mappings":"AAAA;;;GAGG;;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGhD,IAAM,iBAAiB,GAAG,UAAC,OAAiB;IAC3C,OAAO,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;AACvD,CAAC,CAAC;AAEF,IAAM,cAAc,GAAG,UAAC,OAAiB;IACxC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;AACnD,CAAC,CAAC;AAEF;IAA+C,6CAAkB;IAMhE;QAAA,YACC,iBAAO,SAMP;QAJA,KAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,KAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,KAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,KAAI,CAAC,UAAU,GAAG,IAAI,CAAC;;IACxB,CAAC;IAED,wCAAI,GAAJ;QACC,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAE9B,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,EAAE;YACxB,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE;gBACpB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;aAC7B;iBAAM;gBACN,OAAO,IAAI,CAAC;aACZ;SACD;aAAM;YACN,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;SACnC;IACF,CAAC;IAED,wCAAI,GAAJ,UAAK,OAAiB;QACrB,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAED,wCAAI,GAAJ;QAAA,iBAiFC;QAhFA,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE;YAC5B,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC9B,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE;gBACvB,IAAM,SAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;gBAChC,IAAI,SAAO,IAAI,IAAI,EAAE;oBACpB,IAAI,SAAO,YAAY,YAAY,EAAE;wBACpC,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;wBACxB,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE;4BACjC,IAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;4BACvD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;4BACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;4BAC1B,IAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;4BAC9B,IAAI,MAAM,KAAK,IAAI,EAAE;gCACpB,IAAI,CAAC,SAAS,CAAC,SAAO,CAAC,CAAC;6BACxB;iCAAM,IAAI,MAAM,KAAK,KAAK,EAAE;gCAC5B,IAAI,CAAC,MAAM,CAAC,SAAO,CAAC,CAAC;6BACrB;iCAAM;gCACN,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAC5B;oCACC,KAAI,CAAC,SAAS,CAAC,SAAO,CAAC,CAAC;gCACzB,CAAC,EACD;oCACC,KAAI,CAAC,MAAM,CAAC,SAAO,CAAC,CAAC;gCACtB,CAAC,CACD,CAAC;6BACF;yBACD;qBACD;yBAAM,IAAI,SAAO,YAAY,YAAY,EAAE;wBAC3C,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;wBACxB,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,EAAE;4BACvB,IAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;4BACnD,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;4BACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;4BAC1B,IAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;4BAC9B,IAAI,MAAM,KAAK,IAAI,EAAE;gCACpB,IAAI,CAAC,SAAS,CAAC,SAAO,CAAC,CAAC;6BACxB;iCAAM,IAAI,MAAM,KAAK,KAAK,EAAE;gCAC5B,IAAI,CAAC,MAAM,CAAC,SAAO,CAAC,CAAC;6BACrB;iCAAM;gCACN,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAC5B;oCACC,KAAI,CAAC,SAAS,CAAC,SAAO,CAAC,CAAC;gCACzB,CAAC,EACD;oCACC,KAAI,CAAC,MAAM,CAAC,SAAO,CAAC,CAAC;gCACtB,CAAC,CACD,CAAC;6BACF;yBACD;qBACD;yBAAM;wBACN,IAAM,OAAO,GAAG,cAAc,CAAC,SAAO,CAAC,CAAC;wBACxC,IAAM,UAAU,GAAG,iBAAiB,CAAC,SAAO,CAAC,CAAC;wBAC9C,IAAI,OAAO,IAAI,UAAU,EAAE;4BAC1B,IAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC;4BAC1D,IAAI,CAAC,GAAG,IAAI,EAAE;gCACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gCAClB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;gCACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;6BAC1B;4BACD,IAAI,CAAC,OAAO,EAAE,CAAC;yBACf;wBACD,IAAM,MAAM,GAAG,SAAO,CAAC,OAAO,EAAE,CAAC;wBACjC,IAAI,MAAM,KAAK,IAAI,EAAE;4BACpB,IAAI,CAAC,SAAS,CAAC,SAAO,CAAC,CAAC;yBACxB;6BAAM,IAAI,MAAM,KAAK,KAAK,EAAE;4BAC5B,IAAI,CAAC,MAAM,CAAC,SAAO,CAAC,CAAC;yBACrB;6BAAM;4BACN,IAAI,CAAC,UAAU,GAAG,MAAM,CAAC,IAAI,CAC5B;gCACC,KAAI,CAAC,SAAS,CAAC,SAAO,CAAC,CAAC;4BACzB,CAAC,EACD;gCACC,KAAI,CAAC,MAAM,CAAC,SAAO,CAAC,CAAC;4BACtB,CAAC,CACD,CAAC;yBACF;qBACD;iBACD;aACD;SACD;IACF,CAAC;IAES,2CAAO,GAAjB;QACC,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;QAC/B,IAAI,CAAC,GAAG,IAAI,EAAE;YACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE;gBAC9B,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,KAAK,EAAE,CAAC;aACb;SACD;IACF,CAAC;IAES,0CAAM,GAAhB,UAAiB,IAAY;QAC5B,IAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,GAAG,IAAI,EAAE;YACb,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;YAC9C,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YAC3B,IAAI,CAAC,GAAG,IAAI,EAAE;gBACb,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE;oBACtD,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;iBAClB;gBAED,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;gBACxC,OAAO,IAAI,CAAC;aACZ;SACD;QACD,OAAO,KAAK,CAAC;IACd,CAAC;IAES,6CAAS,GAAnB,UAAoB,OAAiB;QACpC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,iBAAiB,CAAC,OAAO,CAAC,EAAE;YAC/B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACzB;aAAM,IAAI,OAAO,YAAY,YAAY,IAAI,OAAO,YAAY,YAAY,EAAE;YAC9E,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SACzB;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAES,0CAAM,GAAhB,UAAiB,OAAiB;QACjC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,OAAO,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,EAAE;YACrD,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;SACrB;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,wCAAI,GAAJ;QACC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,yCAAK,GAAL;QACC,IAAI,CAAC,IAAI,CAAC,IAAI,aAAa,EAAE,CAAC,CAAC;IAChC,CAAC;IAED,wCAAI,GAAJ;QACC,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;SACZ;IACF,CAAC;IAED,wCAAI,GAAJ;QACC,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE;YACtB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;YACvC,IAAI,CAAC,IAAI,EAAE,CAAC;SACZ;IACF,CAAC;IAED,8CAAU,GAAV;QACC,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,8CAAU,GAAV;QACC,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC;IACtE,CAAC;IACF,gCAAC;AAAD,CAAC,AAvMD,CAA+C,KAAK,CAAC,YAAY,GAuMhE","sourcesContent":["/*\n * Copyright (C) 2019 Toshiba Corporation\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { utils } from \"pixi.js\";\nimport { DCommand } from \"./d-command\";\nimport { DCommandClear } from \"./d-command-clear\";\nimport { DCommandFlag } from \"./d-command-flag\";\nimport { DCommandRedo } from \"./d-command-redo\";\nimport { DCommandUndo } from \"./d-command-undo\";\nimport { DControllerCommand } from \"./d-controller-command\";\n\nconst isCommandStorable = (command: DCommand): boolean => {\n\treturn !(command.getFlag() & DCommandFlag.UNSTORABLE);\n};\n\nconst isCommandClear = (command: DCommand): boolean => {\n\treturn !!(command.getFlag() & DCommandFlag.CLEAR);\n};\n\nexport class DControllerDefaultCommand extends utils.EventEmitter implements DControllerCommand {\n\tprotected _position: number;\n\tprotected _done: DCommand[];\n\tprotected _waiting: DCommand[];\n\tprotected _executing: Promise<void> | null;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._position = 0;\n\t\tthis._done = [];\n\t\tthis._waiting = [];\n\t\tthis._executing = null;\n\t}\n\n\tlast(): DCommand | null {\n\t\tconst done = this._done;\n\t\tconst waiting = this._waiting;\n\n\t\tif (waiting.length <= 0) {\n\t\t\tif (0 < done.length) {\n\t\t\t\treturn done[done.length - 1];\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else {\n\t\t\treturn waiting[waiting.length - 1];\n\t\t}\n\t}\n\n\tpush(command: DCommand): void {\n\t\tconst waiting = this._waiting;\n\t\twaiting.push(command);\n\t\tthis.next();\n\t}\n\n\tnext(): void {\n\t\tif (this._executing == null) {\n\t\t\tconst waiting = this._waiting;\n\t\t\tif (0 < waiting.length) {\n\t\t\t\tconst command = waiting.shift();\n\t\t\t\tif (command != null) {\n\t\t\t\t\tif (command instanceof DCommandUndo) {\n\t\t\t\t\t\tconst done = this._done;\n\t\t\t\t\t\tif (this._position < done.length) {\n\t\t\t\t\t\t\tconst current = done[done.length - 1 - this._position];\n\t\t\t\t\t\t\tthis._position += 1;\n\t\t\t\t\t\t\tthis.emit(\"change\", this);\n\t\t\t\t\t\t\tconst result = current.undo();\n\t\t\t\t\t\t\tif (result === true) {\n\t\t\t\t\t\t\t\tthis.onSuccess(command);\n\t\t\t\t\t\t\t} else if (result === false) {\n\t\t\t\t\t\t\t\tthis.onFail(command);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._executing = result.then(\n\t\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\t\tthis.onSuccess(command);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\t\tthis.onFail(command);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (command instanceof DCommandRedo) {\n\t\t\t\t\t\tconst done = this._done;\n\t\t\t\t\t\tif (0 < this._position) {\n\t\t\t\t\t\t\tconst current = done[done.length - this._position];\n\t\t\t\t\t\t\tthis._position -= 1;\n\t\t\t\t\t\t\tthis.emit(\"change\", this);\n\t\t\t\t\t\t\tconst result = current.redo();\n\t\t\t\t\t\t\tif (result === true) {\n\t\t\t\t\t\t\t\tthis.onSuccess(command);\n\t\t\t\t\t\t\t} else if (result === false) {\n\t\t\t\t\t\t\t\tthis.onFail(command);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis._executing = result.then(\n\t\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\t\tthis.onSuccess(command);\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\t\tthis.onFail(command);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst isClear = isCommandClear(command);\n\t\t\t\t\t\tconst isStorable = isCommandStorable(command);\n\t\t\t\t\t\tif (isClear || isStorable) {\n\t\t\t\t\t\t\tconst size = isClear ? this._done.length : this._position;\n\t\t\t\t\t\t\tif (0 < size) {\n\t\t\t\t\t\t\t\tthis.remove(size);\n\t\t\t\t\t\t\t\tthis._position = 0;\n\t\t\t\t\t\t\t\tthis.emit(\"change\", this);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tthis.cleanup();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tconst result = command.execute();\n\t\t\t\t\t\tif (result === true) {\n\t\t\t\t\t\t\tthis.onSuccess(command);\n\t\t\t\t\t\t} else if (result === false) {\n\t\t\t\t\t\t\tthis.onFail(command);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._executing = result.then(\n\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\tthis.onSuccess(command);\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\t\t\tthis.onFail(command);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected cleanup(): void {\n\t\tconst done = this._done;\n\t\tconst size = done.length - 100;\n\t\tif (0 < size) {\n\t\t\tfor (let i = 0; i < size; ++i) {\n\t\t\t\tdone[i].destroy();\n\t\t\t\tdone.shift();\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected remove(size: number): boolean {\n\t\tconst done = this._done;\n\t\tif (0 < size) {\n\t\t\tconst ifrom = Math.max(0, done.length - size);\n\t\t\tsize = done.length - ifrom;\n\t\t\tif (0 < size) {\n\t\t\t\tfor (let i = ifrom, imax = done.length; i < imax; ++i) {\n\t\t\t\t\tdone[i].destroy();\n\t\t\t\t}\n\n\t\t\t\tdone.splice(ifrom, done.length - ifrom);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprotected onSuccess(command: DCommand): void {\n\t\tthis._executing = null;\n\t\tif (isCommandStorable(command)) {\n\t\t\tthis._done.push(command);\n\t\t\tthis.emit(\"dirty\", this);\n\t\t} else if (command instanceof DCommandUndo || command instanceof DCommandRedo) {\n\t\t\tthis.emit(\"dirty\", this);\n\t\t}\n\t\tthis.emit(\"change\", this);\n\t\tthis.next();\n\t}\n\n\tprotected onFail(command: DCommand): void {\n\t\tthis._executing = null;\n\t\tconst waiting = this._waiting;\n\t\tcommand.destroy();\n\t\tfor (let i = 0, imax = waiting.length; i < imax; ++i) {\n\t\t\twaiting[i].destroy();\n\t\t}\n\t\twaiting.length = 0;\n\t\tthis.emit(\"change\", this);\n\t}\n\n\tsize(): number {\n\t\treturn this._done.length;\n\t}\n\n\tclear(): void {\n\t\tthis.push(new DCommandClear());\n\t}\n\n\tredo(): void {\n\t\tif (this.isRedoable()) {\n\t\t\tthis._waiting.push(new DCommandRedo());\n\t\t\tthis.next();\n\t\t}\n\t}\n\n\tundo(): void {\n\t\tif (this.isUndoable()) {\n\t\t\tthis._waiting.push(new DCommandUndo());\n\t\t\tthis.next();\n\t\t}\n\t}\n\n\tisRedoable(): boolean {\n\t\treturn 0 < this._position && this._executing == null;\n\t}\n\n\tisUndoable(): boolean {\n\t\treturn this._position < this._done.length && this._executing == null;\n\t}\n}\n"]}
1
+ {"version":3,"file":"d-controller-default-command.js","sourceRoot":"","sources":["../../../src/main/typescript/wcardinal/ui/d-controller-default-command.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * Copyright (C) 2019 Toshiba Corporation\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { utils } from \"pixi.js\";\nimport { DCommand } from \"./d-command\";\nimport { DCommandClear } from \"./d-command-clear\";\nimport { DCommandFlag } from \"./d-command-flag\";\nimport { DCommandRedo } from \"./d-command-redo\";\nimport { DCommandUndo } from \"./d-command-undo\";\nimport { DControllerCommand } from \"./d-controller-command\";\n\nconst isCommandStorable = (command: DCommand): boolean => {\n\treturn !(command.getFlag() & DCommandFlag.UNSTORABLE);\n};\n\nconst isCommandClear = (command: DCommand): boolean => {\n\treturn !!(command.getFlag() & DCommandFlag.CLEAR);\n};\n\nconst isCommandClean = (command: DCommand): boolean => {\n\treturn !!(command.getFlag() & DCommandFlag.CLEAN);\n};\n\nexport class DControllerDefaultCommand extends utils.EventEmitter implements DControllerCommand {\n\tprotected _position: number;\n\tprotected _done: DCommand[];\n\tprotected _waiting: DCommand[];\n\tprotected _executing: Promise<void> | null;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis._position = 0;\n\t\tthis._done = [];\n\t\tthis._waiting = [];\n\t\tthis._executing = null;\n\t}\n\n\tlast(): DCommand | null {\n\t\tconst done = this._done;\n\t\tconst waiting = this._waiting;\n\n\t\tif (waiting.length <= 0) {\n\t\t\tif (0 < done.length) {\n\t\t\t\treturn done[done.length - 1];\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t} else {\n\t\t\treturn waiting[waiting.length - 1];\n\t\t}\n\t}\n\n\tpush(command: DCommand): void {\n\t\tthis._waiting.push(command);\n\t\tthis.next();\n\t}\n\n\tnext(): void {\n\t\tif (this._executing != null) {\n\t\t\t// Still executing a command.\n\t\t\t// So do nothing.\n\t\t\treturn;\n\t\t}\n\n\t\tconst waiting = this._waiting;\n\t\tif (waiting.length <= 0) {\n\t\t\t// There is no waiting commands.\n\t\t\t// So do nothing.\n\t\t\treturn;\n\t\t}\n\n\t\tconst command = waiting.shift();\n\t\tif (command == null) {\n\t\t\t// There is no waiting commands.\n\t\t\t// So do nothing.\n\t\t\treturn;\n\t\t}\n\n\t\tif (command instanceof DCommandUndo) {\n\t\t\tthis.executeUndo(command);\n\t\t} else if (command instanceof DCommandRedo) {\n\t\t\tthis.executeRedo(command);\n\t\t} else {\n\t\t\tthis.execute(command);\n\t\t}\n\t}\n\n\tprotected executeUndo(command: DCommandUndo): void {\n\t\tconst done = this._done;\n\t\tif (this._position < done.length) {\n\t\t\tconst current = done[done.length - 1 - this._position];\n\t\t\tthis._position += 1;\n\t\t\tthis.emit(\"change\", this);\n\t\t\tconst result = current.undo();\n\t\t\tif (result === true) {\n\t\t\t\tthis.onSuccessUndo(current);\n\t\t\t} else if (result === false) {\n\t\t\t\tthis.onFail(command);\n\t\t\t} else {\n\t\t\t\tthis._executing = result.then(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.onSuccessUndo(current);\n\t\t\t\t\t},\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.onFail(command);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected executeRedo(command: DCommandRedo): void {\n\t\tconst done = this._done;\n\t\tif (0 < this._position) {\n\t\t\tconst current = done[done.length - this._position];\n\t\t\tthis._position -= 1;\n\t\t\tthis.emit(\"change\", this);\n\t\t\tconst result = current.redo();\n\t\t\tif (result === true) {\n\t\t\t\tthis.onSuccessRedo(current);\n\t\t\t} else if (result === false) {\n\t\t\t\tthis.onFail(command);\n\t\t\t} else {\n\t\t\t\tthis._executing = result.then(\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.onSuccessRedo(current);\n\t\t\t\t\t},\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.onFail(command);\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected execute(command: DCommand): void {\n\t\tconst isClear = isCommandClear(command);\n\t\tconst isStorable = isCommandStorable(command);\n\t\tif (isClear || isStorable) {\n\t\t\tconst size = isClear ? this._done.length : this._position;\n\t\t\tif (0 < size) {\n\t\t\t\tthis.remove(size);\n\t\t\t\tthis._position = 0;\n\t\t\t\tthis.emit(\"change\", this);\n\t\t\t}\n\t\t\tthis.cleanup();\n\t\t}\n\t\tconst result = command.execute();\n\t\tif (result === true) {\n\t\t\tthis.onSuccess(command);\n\t\t} else if (result === false) {\n\t\t\tthis.onFail(command);\n\t\t} else {\n\t\t\tthis._executing = result.then(\n\t\t\t\t() => {\n\t\t\t\t\tthis.onSuccess(command);\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tthis.onFail(command);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\tprotected cleanup(): void {\n\t\tconst done = this._done;\n\t\tconst size = done.length - 100;\n\t\tif (0 < size) {\n\t\t\tfor (let i = 0; i < size; ++i) {\n\t\t\t\tdone[i].destroy();\n\t\t\t\tdone.shift();\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected remove(size: number): boolean {\n\t\tconst done = this._done;\n\t\tif (0 < size) {\n\t\t\tconst ifrom = Math.max(0, done.length - size);\n\t\t\tsize = done.length - ifrom;\n\t\t\tif (0 < size) {\n\t\t\t\tfor (let i = ifrom, imax = done.length; i < imax; ++i) {\n\t\t\t\t\tdone[i].destroy();\n\t\t\t\t}\n\n\t\t\t\tdone.splice(ifrom, done.length - ifrom);\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\tprotected onSuccess(command: DCommand): void {\n\t\tthis._executing = null;\n\t\tif (isCommandStorable(command)) {\n\t\t\tthis._done.push(command);\n\t\t\tif (!isCommandClean(command)) {\n\t\t\t\tthis.emit(\"dirty\", this);\n\t\t\t}\n\t\t}\n\t\tthis.emit(\"change\", this);\n\t\tthis.next();\n\t}\n\n\tprotected onSuccessUndo(undoed: DCommand): void {\n\t\tthis._executing = null;\n\t\tif (!isCommandClean(undoed)) {\n\t\t\tthis.emit(\"dirty\", this);\n\t\t}\n\t\tthis.emit(\"change\", this);\n\t\tthis.next();\n\t}\n\n\tprotected onSuccessRedo(redoed: DCommand): void {\n\t\tthis._executing = null;\n\t\tif (!isCommandClean(redoed)) {\n\t\t\tthis.emit(\"dirty\", this);\n\t\t}\n\t\tthis.emit(\"change\", this);\n\t\tthis.next();\n\t}\n\n\tprotected onFail(command: DCommand): void {\n\t\tthis._executing = null;\n\t\tconst waiting = this._waiting;\n\t\tcommand.destroy();\n\t\tfor (let i = 0, imax = waiting.length; i < imax; ++i) {\n\t\t\twaiting[i].destroy();\n\t\t}\n\t\twaiting.length = 0;\n\t\tthis.emit(\"change\", this);\n\t}\n\n\tsize(): number {\n\t\treturn this._done.length;\n\t}\n\n\tclear(): void {\n\t\tthis.push(new DCommandClear());\n\t}\n\n\tredo(): void {\n\t\tif (this.isRedoable()) {\n\t\t\tthis._waiting.push(new DCommandRedo());\n\t\t\tthis.next();\n\t\t}\n\t}\n\n\tundo(): void {\n\t\tif (this.isUndoable()) {\n\t\t\tthis._waiting.push(new DCommandUndo());\n\t\t\tthis.next();\n\t\t}\n\t}\n\n\tisRedoable(): boolean {\n\t\treturn 0 < this._position && this._executing == null;\n\t}\n\n\tisUndoable(): boolean {\n\t\treturn this._position < this._done.length && this._executing == null;\n\t}\n}\n"]}