@scion/workbench 18.0.0-beta.9 → 19.0.0-beta.1
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.
- package/design/_workbench-view-global-styles.scss +0 -1
- package/fesm2022/scion-workbench.mjs +8556 -8622
- package/fesm2022/scion-workbench.mjs.map +1 -1
- package/lib/common/css-class.util.d.ts +5 -0
- package/lib/common/math.util.d.ts +7 -0
- package/lib/common/objects.util.d.ts +1 -1
- package/lib/dialog/workbench-dialog.component.d.ts +1 -2
- package/lib/layout/migration/model/workbench-layout-migration-v6.model.d.ts +35 -0
- package/lib/layout/migration/workbench-layout-migration-v6.service.d.ts +12 -0
- package/lib/layout/workbench-layout.model.d.ts +0 -1
- package/lib/layout/workbench-layout.service.d.ts +10 -12
- package/lib/layout/workench-layout-serializer.service.d.ts +1 -2
- package/lib/part/part-action-bar/part-action-bar.component.d.ts +2 -6
- package/lib/part/part-bar/part-bar.component.d.ts +66 -48
- package/lib/part/view-tab/view-tab.component.d.ts +3 -3
- package/lib/public_api.d.ts +0 -2
- package/lib/routing/routing.util.d.ts +2 -2
- package/lib/view/view-move-handler.service.d.ts +16 -14
- package/lib/view/view.component.d.ts +1 -2
- package/lib/view//311/265workbench-view.model.d.ts +1 -9
- package/lib/view-dnd/grid-drop-targets.util.d.ts +1 -1
- package/lib/view-dnd/view-drag.service.d.ts +72 -49
- package/lib/view-dnd/view-tab-drag-image-renderer.service.d.ts +11 -36
- package/package.json +8 -10
- package/esm2022/lib/activation-instant.provider.mjs +0 -29
- package/esm2022/lib/common/animation-frame.observable.mjs +0 -37
- package/esm2022/lib/common/asserts.util.mjs +0 -31
- package/esm2022/lib/common/class-list.mjs +0 -99
- package/esm2022/lib/common/coerce-observable.pipe.mjs +0 -28
- package/esm2022/lib/common/disposable.mjs +0 -11
- package/esm2022/lib/common/dom.util.mjs +0 -100
- package/esm2022/lib/common/grid-element-if-visible.pipe.mjs +0 -32
- package/esm2022/lib/common/instanceof.pipe.mjs +0 -26
- package/esm2022/lib/common/map-coerce.pipe.mjs +0 -28
- package/esm2022/lib/common/null-if-empty.pipe.mjs +0 -38
- package/esm2022/lib/common/objects.util.mjs +0 -40
- package/esm2022/lib/common/observables.mjs +0 -72
- package/esm2022/lib/common/operators.mjs +0 -27
- package/esm2022/lib/common/public_api.mjs +0 -11
- package/esm2022/lib/common/stringify-error.util.mjs +0 -19
- package/esm2022/lib/common/throw-error.util.mjs +0 -16
- package/esm2022/lib/common/typeof.pipe.mjs +0 -26
- package/esm2022/lib/common/uid.util.mjs +0 -22
- package/esm2022/lib/common//311/265destroy-ref.mjs +0 -36
- package/esm2022/lib/communication/workbench-broadcast-channel.mjs +0 -38
- package/esm2022/lib/content-projection/content-as-overlay.component.mjs +0 -114
- package/esm2022/lib/content-projection/workbench-element-references.mjs +0 -32
- package/esm2022/lib/dialog/dialog-footer/dialog-action-filter.pipe.mjs +0 -26
- package/esm2022/lib/dialog/dialog-footer/dialog-footer.component.mjs +0 -34
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-action.directive.mjs +0 -51
- package/esm2022/lib/dialog/dialog-footer/workbench-dialog-footer.directive.mjs +0 -46
- package/esm2022/lib/dialog/dialog-header/dialog-header.component.mjs +0 -33
- package/esm2022/lib/dialog/dialog-header/workbench-dialog-header.directive.mjs +0 -46
- package/esm2022/lib/dialog/movable.directive.mjs +0 -126
- package/esm2022/lib/dialog/public_api.mjs +0 -15
- package/esm2022/lib/dialog/resizable.directive.mjs +0 -392
- package/esm2022/lib/dialog/workbench-dialog.component.mjs +0 -250
- package/esm2022/lib/dialog/workbench-dialog.mjs +0 -79
- package/esm2022/lib/dialog/workbench-dialog.options.mjs +0 -11
- package/esm2022/lib/dialog/workbench-dialog.registry.mjs +0 -73
- package/esm2022/lib/dialog/workbench-dialog.service.mjs +0 -96
- package/esm2022/lib/dialog//311/265workbench-dialog.mjs +0 -310
- package/esm2022/lib/dialog//311/265workbench-dialog.service.mjs +0 -98
- package/esm2022/lib/executor/latest-task-executor.mjs +0 -55
- package/esm2022/lib/executor/single-task-executor.mjs +0 -72
- package/esm2022/lib/filter-field/filter-field.component.mjs +0 -130
- package/esm2022/lib/glass-pane/blockable.mjs +0 -11
- package/esm2022/lib/glass-pane/blocking.mjs +0 -11
- package/esm2022/lib/glass-pane/glass-pane.directive.mjs +0 -120
- package/esm2022/lib/layout/grid-element/grid-element.component.mjs +0 -111
- package/esm2022/lib/layout/main-area-layout/main-area-layout.component.mjs +0 -97
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v2.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v3.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v4.model.mjs +0 -11
- package/esm2022/lib/layout/migration/model/workbench-layout-migration-v5.model.mjs +0 -11
- package/esm2022/lib/layout/migration/workbench-layout-migration-v3.service.mjs +0 -117
- package/esm2022/lib/layout/migration/workbench-layout-migration-v4.service.mjs +0 -57
- package/esm2022/lib/layout/migration/workbench-layout-migration-v5.service.mjs +0 -67
- package/esm2022/lib/layout/public_api.mjs +0 -12
- package/esm2022/lib/layout/stringifier.mjs +0 -70
- package/esm2022/lib/layout/workbench-layout.component.mjs +0 -90
- package/esm2022/lib/layout/workbench-layout.factory.mjs +0 -24
- package/esm2022/lib/layout/workbench-layout.mjs +0 -16
- package/esm2022/lib/layout/workbench-layout.model.mjs +0 -62
- package/esm2022/lib/layout/workbench-layout.service.mjs +0 -68
- package/esm2022/lib/layout/workbench-layouts.util.mjs +0 -58
- package/esm2022/lib/layout/workench-layout-serializer.service.mjs +0 -109
- package/esm2022/lib/layout//311/265workbench-layout.factory.mjs +0 -54
- package/esm2022/lib/layout//311/265workbench-layout.mjs +0 -876
- package/esm2022/lib/logging/console-appender.service.mjs +0 -46
- package/esm2022/lib/logging/index.mjs +0 -15
- package/esm2022/lib/logging/logger-names.mjs +0 -32
- package/esm2022/lib/logging/logger.mjs +0 -36
- package/esm2022/lib/logging/logging-support.mjs +0 -26
- package/esm2022/lib/logging/logging.model.mjs +0 -45
- package/esm2022/lib/logging/public_api.mjs +0 -12
- package/esm2022/lib/logging//311/265logger.mjs +0 -73
- package/esm2022/lib/message-box/message-box-footer/message-box-footer.component.mjs +0 -69
- package/esm2022/lib/message-box/message-box-header/message-box-header.component.mjs +0 -28
- package/esm2022/lib/message-box/public_api.mjs +0 -11
- package/esm2022/lib/message-box/workbench-message-box.component.mjs +0 -102
- package/esm2022/lib/message-box/workbench-message-box.options.mjs +0 -2
- package/esm2022/lib/message-box/workbench-message-box.service.mjs +0 -39
- package/esm2022/lib/message-box//311/265workbench-message-box.service.mjs +0 -45
- package/esm2022/lib/microfrontend-platform/common/microfrontend.util.mjs +0 -71
- package/esm2022/lib/microfrontend-platform/initialization/microfrontend-platform-initializer.service.mjs +0 -126
- package/esm2022/lib/microfrontend-platform/initialization/ng-zone-observable-decorator.mjs +0 -36
- package/esm2022/lib/microfrontend-platform/initialization/workbench-host-manifest-interceptor.service.mjs +0 -84
- package/esm2022/lib/microfrontend-platform/manifest-object-cache.service.mjs +0 -63
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-capability-validator.interceptor.mjs +0 -54
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog-intent-handler.interceptor.mjs +0 -85
- package/esm2022/lib/microfrontend-platform/microfrontend-dialog/microfrontend-dialog.component.mjs +0 -140
- package/esm2022/lib/microfrontend-platform/microfrontend-host-dialog/microfrontend-host-dialog.component.mjs +0 -133
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/microfrontend-host-message-box.component.mjs +0 -113
- package/esm2022/lib/microfrontend-platform/microfrontend-host-message-box/text-message/text-message.component.mjs +0 -43
- package/esm2022/lib/microfrontend-platform/microfrontend-host-popup/microfrontend-host-popup.component.mjs +0 -101
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-capability-validator.interceptor.mjs +0 -35
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-intent-handler.interceptor.mjs +0 -88
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box-legacy-intent-translator.interceptor.mjs +0 -32
- package/esm2022/lib/microfrontend-platform/microfrontend-message-box/microfrontend-message-box.component.mjs +0 -121
- package/esm2022/lib/microfrontend-platform/microfrontend-notification/microfrontend-notification-intent-handler.service.mjs +0 -45
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-capability-validator.interceptor.mjs +0 -39
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-installer.service.mjs +0 -120
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/microfrontend-perspective-intent-handler.interceptor.mjs +0 -55
- package/esm2022/lib/microfrontend-platform/microfrontend-perspective/workbench-perspective-data.mjs +0 -19
- package/esm2022/lib/microfrontend-platform/microfrontend-platform-config-loader.mjs +0 -13
- package/esm2022/lib/microfrontend-platform/microfrontend-platform.config.mjs +0 -11
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-capability-validator.interceptor.mjs +0 -31
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup-intent-handler.interceptor.mjs +0 -132
- package/esm2022/lib/microfrontend-platform/microfrontend-popup/microfrontend-popup.component.mjs +0 -115
- package/esm2022/lib/microfrontend-platform/microfrontend-splash/microfrontend-splash.component.mjs +0 -21
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view-command-handler.service.mjs +0 -112
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-view.component.mjs +0 -313
- package/esm2022/lib/microfrontend-platform/microfrontend-view/microfrontend-workbench-view.model.mjs +0 -23
- package/esm2022/lib/microfrontend-platform/public_api.mjs +0 -13
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-capability-validator.interceptor.mjs +0 -31
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-intent-handler.interceptor.mjs +0 -127
- package/esm2022/lib/microfrontend-platform/routing/microfrontend-view-routes.mjs +0 -125
- package/esm2022/lib/microfrontend-platform/stable-capability-id-assigner.interceptor.mjs +0 -32
- package/esm2022/lib/microfrontend-platform/workbench-microfrontend-support.mjs +0 -191
- package/esm2022/lib/migration/workbench-migration.mjs +0 -11
- package/esm2022/lib/migration/workbench-migrator.mjs +0 -38
- package/esm2022/lib/notification/notification-css-classes.pipe.mjs +0 -24
- package/esm2022/lib/notification/notification-list.component.mjs +0 -51
- package/esm2022/lib/notification/notification.component.mjs +0 -109
- package/esm2022/lib/notification/notification.config.mjs +0 -11
- package/esm2022/lib/notification/notification.mjs +0 -19
- package/esm2022/lib/notification/notification.service.mjs +0 -134
- package/esm2022/lib/notification/public_api.mjs +0 -12
- package/esm2022/lib/notification/text-notification.component.mjs +0 -23
- package/esm2022/lib/notification//311/265notification.mjs +0 -42
- package/esm2022/lib/page-not-found/page-not-found.component.mjs +0 -26
- package/esm2022/lib/part/part-action-bar/part-action-bar.component.mjs +0 -31
- package/esm2022/lib/part/part-action-bar/part-action.directive.mjs +0 -77
- package/esm2022/lib/part/part-bar/part-bar.component.mjs +0 -444
- package/esm2022/lib/part/part-portal.pipe.mjs +0 -35
- package/esm2022/lib/part/part.component.mjs +0 -135
- package/esm2022/lib/part/public_api.mjs +0 -13
- package/esm2022/lib/part/view-context-menu/accelerator-format.pipe.mjs +0 -31
- package/esm2022/lib/part/view-context-menu/text.component.mjs +0 -38
- package/esm2022/lib/part/view-context-menu/view-menu.component.mjs +0 -89
- package/esm2022/lib/part/view-context-menu/view-menu.directive.mjs +0 -76
- package/esm2022/lib/part/view-context-menu/view-menu.service.mjs +0 -340
- package/esm2022/lib/part/view-list/view-list.component.mjs +0 -117
- package/esm2022/lib/part/view-list-button/view-list-button.component.mjs +0 -82
- package/esm2022/lib/part/view-list-item/view-list-item.component.mjs +0 -60
- package/esm2022/lib/part/view-tab/view-tab.component.mjs +0 -218
- package/esm2022/lib/part/view-tab-content/view-tab-content.component.mjs +0 -29
- package/esm2022/lib/part/view-tab-drag-image/view-tab-drag-image.component.mjs +0 -81
- package/esm2022/lib/part/workbench-part-action.registry.mjs +0 -23
- package/esm2022/lib/part/workbench-part.model.mjs +0 -19
- package/esm2022/lib/part/workbench-part.registry.mjs +0 -23
- package/esm2022/lib/part//311/265workbench-part.model.mjs +0 -146
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v1.model.mjs +0 -11
- package/esm2022/lib/perspective/migration/model/workbench-perspective-migration-v2.model.mjs +0 -11
- package/esm2022/lib/perspective/migration/workbench-perspective-migration-v2.service.mjs +0 -57
- package/esm2022/lib/perspective/public_api.mjs +0 -11
- package/esm2022/lib/perspective/workbench-grid-merger.service.mjs +0 -39
- package/esm2022/lib/perspective/workbench-perspective-storage.service.mjs +0 -72
- package/esm2022/lib/perspective/workbench-perspective-view-conflict-resolver.service.mjs +0 -50
- package/esm2022/lib/perspective/workbench-perspective.model.mjs +0 -2
- package/esm2022/lib/perspective/workbench-perspective.registry.mjs +0 -23
- package/esm2022/lib/perspective/workbench-perspective.service.mjs +0 -180
- package/esm2022/lib/perspective/workench-perspective-serializer.service.mjs +0 -62
- package/esm2022/lib/perspective//311/265workbench-perspective.model.mjs +0 -210
- package/esm2022/lib/popup/popup.component.mjs +0 -124
- package/esm2022/lib/popup/popup.config.mjs +0 -100
- package/esm2022/lib/popup/popup.origin.mjs +0 -11
- package/esm2022/lib/popup/popup.service.mjs +0 -339
- package/esm2022/lib/popup/public_api.mjs +0 -12
- package/esm2022/lib/portal/wb-component-portal.mjs +0 -130
- package/esm2022/lib/portal/workbench-portal-outlet.directive.mjs +0 -68
- package/esm2022/lib/public_api.mjs +0 -32
- package/esm2022/lib/registry/workbench-object-registry.mjs +0 -104
- package/esm2022/lib/routing/empty-outlet/empty-outlet.component.mjs +0 -31
- package/esm2022/lib/routing/public_api.mjs +0 -14
- package/esm2022/lib/routing/routing.model.mjs +0 -11
- package/esm2022/lib/routing/routing.util.mjs +0 -215
- package/esm2022/lib/routing/url-segment-matcher.mjs +0 -46
- package/esm2022/lib/routing/workbench-auxiliary-route-installer.service.mjs +0 -110
- package/esm2022/lib/routing/workbench-dialog-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-layout-differ.mjs +0 -61
- package/esm2022/lib/routing/workbench-message-box-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-navigational-states.mjs +0 -33
- package/esm2022/lib/routing/workbench-popup-differ.mjs +0 -51
- package/esm2022/lib/routing/workbench-route-data.mjs +0 -39
- package/esm2022/lib/routing/workbench-route-guards.mjs +0 -57
- package/esm2022/lib/routing/workbench-router-link.directive.mjs +0 -124
- package/esm2022/lib/routing/workbench-router.service.mjs +0 -19
- package/esm2022/lib/routing/workbench-url-observer.service.mjs +0 -305
- package/esm2022/lib/routing/workbench-view-outlet-differ.mjs +0 -58
- package/esm2022/lib/routing//311/265location.mjs +0 -70
- package/esm2022/lib/routing//311/265workbench-router.service.mjs +0 -359
- package/esm2022/lib/startup/public_api.mjs +0 -12
- package/esm2022/lib/startup/splash/splash.component.mjs +0 -24
- package/esm2022/lib/startup/workbench-initializer.mjs +0 -96
- package/esm2022/lib/startup/workbench-launcher.service.mjs +0 -173
- package/esm2022/lib/storage/public_api.mjs +0 -11
- package/esm2022/lib/storage/workbench-storage.mjs +0 -37
- package/esm2022/lib/testing/public_api.mjs +0 -12
- package/esm2022/lib/testing/workbench-testing.module.mjs +0 -49
- package/esm2022/lib/testing/workbench.provider.mjs +0 -60
- package/esm2022/lib/theme/workbench-theme-switcher.service.mjs +0 -72
- package/esm2022/lib/view/public_api.mjs +0 -11
- package/esm2022/lib/view/view-context-provider.mjs +0 -31
- package/esm2022/lib/view/view-move-handler.service.mjs +0 -145
- package/esm2022/lib/view/view-portal.pipe.mjs +0 -33
- package/esm2022/lib/view/view.component.mjs +0 -128
- package/esm2022/lib/view/workbench-view.model.mjs +0 -12
- package/esm2022/lib/view/workbench-view.registry.mjs +0 -23
- package/esm2022/lib/view//311/265workbench-view.model.mjs +0 -375
- package/esm2022/lib/view-dnd/grid-drop-targets.util.mjs +0 -49
- package/esm2022/lib/view-dnd/requires-drop-zone.pipe.mjs +0 -58
- package/esm2022/lib/view-dnd/view-drag.service.mjs +0 -213
- package/esm2022/lib/view-dnd/view-drop-placeholder-renderer.service.mjs +0 -89
- package/esm2022/lib/view-dnd/view-drop-zone.directive.mjs +0 -183
- package/esm2022/lib/view-dnd/view-tab-drag-image-renderer.service.mjs +0 -224
- package/esm2022/lib/workbench-config.mjs +0 -15
- package/esm2022/lib/workbench-id.mjs +0 -21
- package/esm2022/lib/workbench.component.mjs +0 -146
- package/esm2022/lib/workbench.constants.mjs +0 -41
- package/esm2022/lib/workbench.model.mjs +0 -11
- package/esm2022/lib/workbench.module.mjs +0 -101
- package/esm2022/lib/workbench.provider.mjs +0 -111
- package/esm2022/lib/workbench.service.mjs +0 -29
- package/esm2022/lib//311/265workbench.service.mjs +0 -102
- package/esm2022/public-api.mjs +0 -14
- package/esm2022/scion-workbench.mjs +0 -5
- package/lib/common/animation-frame.observable.d.ts +0 -10
- package/lib/testing/public_api.d.ts +0 -2
- package/lib/testing/workbench-testing.module.d.ts +0 -40
- package/lib/testing/workbench.provider.d.ts +0 -31
- package/lib/workbench.module.d.ts +0 -65
|
@@ -1,444 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2024 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { Component, computed, effect, ElementRef, HostListener, inject, Inject, NgZone, untracked, viewChild, viewChildren } from '@angular/core';
|
|
11
|
-
import { ViewTabComponent } from '../view-tab/view-tab.component';
|
|
12
|
-
import { first, map, mergeMap, take, takeUntil } from 'rxjs/operators';
|
|
13
|
-
import { animationFrameScheduler, firstValueFrom, from, fromEvent, Subject } from 'rxjs';
|
|
14
|
-
import { ViewDragImageRect } from '../../view-dnd/view-tab-drag-image-renderer.service';
|
|
15
|
-
import { getCssTranslation, setCssClass, setCssVariable, unsetCssClass, unsetCssVariable } from '../../common/dom.util';
|
|
16
|
-
import { filterArray, subscribeIn } from '@scion/toolkit/operators';
|
|
17
|
-
import { SciViewportComponent } from '@scion/components/viewport';
|
|
18
|
-
import { dimension } from '@scion/components/dimension';
|
|
19
|
-
import { AsyncPipe } from '@angular/common';
|
|
20
|
-
import { PartActionBarComponent } from '../part-action-bar/part-action-bar.component';
|
|
21
|
-
import { ViewListButtonComponent } from '../view-list-button/view-list-button.component';
|
|
22
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
23
|
-
import { WORKBENCH_ID } from '../../workbench-id';
|
|
24
|
-
import { onEveryAnimationFrame$ } from '../../common/animation-frame.observable';
|
|
25
|
-
import * as i0 from "@angular/core";
|
|
26
|
-
import * as i1 from "../\u0275workbench-part.model";
|
|
27
|
-
import * as i2 from "../../layout/workbench-layout.service";
|
|
28
|
-
import * as i3 from "../../routing/\u0275workbench-router.service";
|
|
29
|
-
import * as i4 from "../../view-dnd/view-tab-drag-image-renderer.service";
|
|
30
|
-
import * as i5 from "../../view-dnd/view-drag.service";
|
|
31
|
-
/**
|
|
32
|
-
* Renders view tabs and actions of a {@link WorkbenchPart}.
|
|
33
|
-
*
|
|
34
|
-
* Tabs are added to a viewport, which the user can scroll if not enough space. The viewport grows with its tabs,
|
|
35
|
-
* allowing actions to be placed directly after the last tab or on the right side.
|
|
36
|
-
*
|
|
37
|
-
* ## Drag Events
|
|
38
|
-
* We use native drag and drop to support dragging views to other windows.
|
|
39
|
-
*
|
|
40
|
-
* By listening to drag events, the tabbar visualizes tabs during a drag operation. The drag operation is initiated in {@link ViewTabComponent}.
|
|
41
|
-
* - `dragstart` and `dragend` events are fired in the tabbar where the drag operation was initiated.
|
|
42
|
-
* - `dragenter` event is fired when a tab enters the tabbar.
|
|
43
|
-
* - `dragover` events are fired when dragging a tab over the tabbar.
|
|
44
|
-
* - `dragleave` event is fired when a tab leaves the tabbar.
|
|
45
|
-
* - `drop` event is fired when the user drops a tab in the tabbar.
|
|
46
|
-
* - Note that `dragleave` event is not fired on drop action. Therefore, always handle both events, `dragleave` and `drop` events, respectively.
|
|
47
|
-
*
|
|
48
|
-
* ## Terminology
|
|
49
|
-
* - Drag source: Tab that is being dragged.
|
|
50
|
-
* - Drop target: Tab before which to insert the drag source on drop, or `end` if dropping it after the last tab.
|
|
51
|
-
* - Drag image: Image for the tab to be dragged. We do not use the native drag image support to control drag image position and size,
|
|
52
|
-
* e.g., to snap the drag image to the tabbar when dragging near it.
|
|
53
|
-
*/
|
|
54
|
-
export class PartBarComponent {
|
|
55
|
-
constructor(host, _workbenchId, part, _workbenchLayoutService, _router, _viewTabDragImageRenderer, _viewDragService, _destroyRef) {
|
|
56
|
-
this._workbenchId = _workbenchId;
|
|
57
|
-
this.part = part;
|
|
58
|
-
this._workbenchLayoutService = _workbenchLayoutService;
|
|
59
|
-
this._router = _router;
|
|
60
|
-
this._viewTabDragImageRenderer = _viewTabDragImageRenderer;
|
|
61
|
-
this._viewDragService = _viewDragService;
|
|
62
|
-
this._destroyRef = _destroyRef;
|
|
63
|
-
this._viewportChange$ = new Subject();
|
|
64
|
-
this._viewTabs = viewChildren(ViewTabComponent);
|
|
65
|
-
this._dragenter$ = new Subject();
|
|
66
|
-
this._dragleave$ = new Subject();
|
|
67
|
-
this._dragend$ = new Subject();
|
|
68
|
-
this._viewportComponent = viewChild.required(SciViewportComponent);
|
|
69
|
-
this._viewportComponentElement = viewChild.required(SciViewportComponent, { read: (ElementRef) });
|
|
70
|
-
this._tabCornerRadiusElement = viewChild.required('tab_corner_radius', { read: (ElementRef) });
|
|
71
|
-
this._paddingInlineElement = viewChild.required('padding_inline', { read: (ElementRef) });
|
|
72
|
-
/**
|
|
73
|
-
* Reference to the tab before which to insert the drag source on drop, or `end` if dropping it after the last tab.
|
|
74
|
-
*/
|
|
75
|
-
this.dropTargetViewTab = null;
|
|
76
|
-
/**
|
|
77
|
-
* Reference to the tab where the drag operation was started.
|
|
78
|
-
* This reference is only set if the drag operation started on a tab of this tabbar.
|
|
79
|
-
*/
|
|
80
|
-
this.dragSourceViewTab = null;
|
|
81
|
-
/**
|
|
82
|
-
* Transfer data of the tab being dragged over this tabbar.
|
|
83
|
-
*/
|
|
84
|
-
this._dragData = null;
|
|
85
|
-
/**
|
|
86
|
-
* Function for snapping the drag image to the tabbar when dragging near it.
|
|
87
|
-
*/
|
|
88
|
-
this._constrainFn = null;
|
|
89
|
-
/**
|
|
90
|
-
* Tabbar indents where to display the rounded bottom corners of the first and last view tab.
|
|
91
|
-
*/
|
|
92
|
-
this._tabbarIndent = {
|
|
93
|
-
left: 0,
|
|
94
|
-
right: 0,
|
|
95
|
-
};
|
|
96
|
-
/**
|
|
97
|
-
* Notifies when the drag animation has finished, i.e., tabs have transitioned to their final position.
|
|
98
|
-
*/
|
|
99
|
-
this._dragAnimationStable$ = onEveryAnimationFrame$().pipe(first(() => this.isDragAnimationStable()));
|
|
100
|
-
this._host = host.nativeElement;
|
|
101
|
-
this.dragover$ = this._viewDragService.tabbarDragOver$.pipe(map(partId => partId === this.part.id));
|
|
102
|
-
this.installActiveViewScroller();
|
|
103
|
-
this.installScrolledIntoViewUpdater();
|
|
104
|
-
this.installViewDragListener();
|
|
105
|
-
this.installTabbarIndentSizeTracker();
|
|
106
|
-
this.installViewportChangeTracker();
|
|
107
|
-
}
|
|
108
|
-
onDoubleClick(event) {
|
|
109
|
-
if (this.part.isInMainArea) {
|
|
110
|
-
this._router.navigate(layout => layout.toggleMaximized()).then();
|
|
111
|
-
}
|
|
112
|
-
event.stopPropagation();
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Method invoked when the user starts dragging a tab of this tabbar.
|
|
116
|
-
*/
|
|
117
|
-
onViewDragStart(event) {
|
|
118
|
-
if (!this._viewDragService.isViewDragEvent(event)) {
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
const dragData = this._viewDragService.viewDragData;
|
|
122
|
-
const dragSourceIndex = this._viewTabs().findIndex(viewTab => viewTab.viewId === dragData.viewId);
|
|
123
|
-
const dragSourceViewTab = this._viewTabs()[dragSourceIndex];
|
|
124
|
-
const dropTargetViewTab = this._viewTabs()[dragSourceIndex + 1] ?? 'end';
|
|
125
|
-
// Constrain function for snapping the drag image to the tabbar when dragging near it.
|
|
126
|
-
this._constrainFn = this.createDragImageConstrainFn();
|
|
127
|
-
this._viewTabDragImageRenderer.setConstrainDragImageRectFn(this._constrainFn);
|
|
128
|
-
this._viewDragService.setTabbarDragover(this.part.id);
|
|
129
|
-
// When start dragging a view tab, we remove it from the tabbar by setting its `display` to `none` and render its drag image in `ViewTabDragImageRenderer` instead.
|
|
130
|
-
// However, do not unset the `display` of the drag source during `dragstart`. Otherwise, the native drag operation would be corrupted in Chrome and Edge (but not in Firefox).
|
|
131
|
-
animationFrameScheduler.schedule(() => {
|
|
132
|
-
this.dragSourceViewTab = dragSourceViewTab;
|
|
133
|
-
this.dropTargetViewTab = dropTargetViewTab; // Set drop target to avoid tab animation.
|
|
134
|
-
setCssVariable(this._host, {
|
|
135
|
-
'--ɵpart-bar-drag-source-width': `${dragData.viewTabWidth}px`,
|
|
136
|
-
'--ɵpart-bar-drag-image-placeholder-width': `${dragData.viewTabWidth}px`,
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
// When dragging a tab very quickly out of this tabbar, only the `dragstart` event gets fired, but not the `dragenter` event.
|
|
140
|
-
// Therefore, we subscribe to global `dragenter` events and manually invoke `onTabbarDragLeave` to correctly display the tabs and the active view.
|
|
141
|
-
this._viewDragService.viewDrag$(window, { eventType: ['dragenter'] })
|
|
142
|
-
.pipe(take(1), takeUntil(this._dragend$), takeUntilDestroyed(this._destroyRef))
|
|
143
|
-
.subscribe(event => {
|
|
144
|
-
// Check if the user continues dragging over this tabbar.
|
|
145
|
-
// If not, the user has quickly dragged the tab out of the tabbar and we manually call `onTabbarDragLeave`.
|
|
146
|
-
if ((this._host.compareDocumentPosition(event.target) & Node.DOCUMENT_POSITION_CONTAINED_BY) === 0) {
|
|
147
|
-
this.onTabbarDragLeave();
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Method invoked when the user ends dragging a tab of this tabbar.
|
|
153
|
-
*
|
|
154
|
-
* Invoked only in the tabbar where the drag operation started, regardless of whether the drag operation was completed or canceled.
|
|
155
|
-
*/
|
|
156
|
-
onViewDragEnd() {
|
|
157
|
-
this._dragend$.next();
|
|
158
|
-
this.unsetDragState();
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* Method invoked when the user drags a tab into this tabbar.
|
|
162
|
-
*/
|
|
163
|
-
onTabbarDragEnter(event) {
|
|
164
|
-
this._dragenter$.next();
|
|
165
|
-
this._viewDragService.setTabbarDragover(this.part.id);
|
|
166
|
-
this._dragData = this._viewDragService.viewDragData;
|
|
167
|
-
// Constrain function for snapping the drag image to the tabbar when dragging near it.
|
|
168
|
-
if (!this._constrainFn) {
|
|
169
|
-
this._constrainFn = this.createDragImageConstrainFn();
|
|
170
|
-
this._viewTabDragImageRenderer.setConstrainDragImageRectFn(this._constrainFn);
|
|
171
|
-
}
|
|
172
|
-
// Locate drop target to have a nice animation for the drag source placeholder.
|
|
173
|
-
this.dropTargetViewTab = this.computeDropTarget(event);
|
|
174
|
-
// Set the CSS class 'drag-enter' to indicate entering the tabbar.
|
|
175
|
-
setCssClass(this._host, 'drag-enter', 'drag-over');
|
|
176
|
-
this._dragAnimationStable$
|
|
177
|
-
.pipe(take(1), takeUntil(this._dragenter$), takeUntilDestroyed(this._destroyRef))
|
|
178
|
-
.subscribe({ complete: () => unsetCssClass(this._host, 'drag-enter') });
|
|
179
|
-
setCssVariable(this._host, {
|
|
180
|
-
'--ɵpart-bar-drag-source-width': `${this._dragData.viewTabWidth}px`,
|
|
181
|
-
'--ɵpart-bar-drag-image-placeholder-width': `${this._dragData.viewTabWidth}px`,
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* Method invoked when the user drags a tab out of this tabbar.
|
|
186
|
-
*/
|
|
187
|
-
onTabbarDragLeave() {
|
|
188
|
-
this._dragleave$.next();
|
|
189
|
-
// Set the CSS class 'drag-leave' to indicate leaving the tabbar.
|
|
190
|
-
setCssClass(this._host, 'drag-leave');
|
|
191
|
-
this._dragAnimationStable$
|
|
192
|
-
.pipe(take(1), takeUntil(this._dragleave$), takeUntilDestroyed(this._destroyRef))
|
|
193
|
-
.subscribe({ complete: () => unsetCssClass(this._host, 'drag-leave') });
|
|
194
|
-
this.unsetDragState({ unsetDragSource: false });
|
|
195
|
-
// Activate the view next to the view being dragged out of this tabbar. But, do not push the navigation into browsing history stack.
|
|
196
|
-
if (this.dragSourceViewTab && this.dragSourceViewTab.active) {
|
|
197
|
-
this._router.navigate(layout => layout.activateAdjacentView(this.dragSourceViewTab.viewId), { skipLocationChange: true }).then();
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
/**
|
|
201
|
-
* Method invoked while the user is dragging a tab over this tabbar.
|
|
202
|
-
*/
|
|
203
|
-
onTabbarDragOver(event) {
|
|
204
|
-
event.preventDefault(); // allow view drop
|
|
205
|
-
// Locate the tab over which the user is dragging the tab, but only after pending transitions have ended to prevent tabs from sliding back and forth.
|
|
206
|
-
if (this.isDragAnimationStable()) {
|
|
207
|
-
this.dropTargetViewTab = this.computeDropTarget(event);
|
|
208
|
-
// Synchronize the width of the drag source placeholder with the drag pointer position to move actions along with the pointer.
|
|
209
|
-
setCssVariable(this._host, { '--ɵpart-bar-drag-image-placeholder-width': `${this.calculateDragImagePlaceholderWidth(event)}px` });
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Method invoked when the user drops a tab in this tabbar.
|
|
214
|
-
*/
|
|
215
|
-
onTabbarDrop() {
|
|
216
|
-
this._viewDragService.dispatchViewMoveEvent({
|
|
217
|
-
source: {
|
|
218
|
-
workbenchId: this._dragData.workbenchId,
|
|
219
|
-
partId: this._dragData.partId,
|
|
220
|
-
viewId: this._dragData.viewId,
|
|
221
|
-
alternativeViewId: this._dragData.alternativeViewId,
|
|
222
|
-
viewUrlSegments: this._dragData.viewUrlSegments,
|
|
223
|
-
navigationHint: this._dragData.navigationHint,
|
|
224
|
-
navigationData: this._dragData.navigationData,
|
|
225
|
-
classList: this._dragData.classList,
|
|
226
|
-
},
|
|
227
|
-
target: {
|
|
228
|
-
workbenchId: this._workbenchId,
|
|
229
|
-
position: this.dropTargetViewTab === 'end' ? 'end' : this._viewTabs().indexOf(this.dropTargetViewTab),
|
|
230
|
-
elementId: this.part.id,
|
|
231
|
-
},
|
|
232
|
-
});
|
|
233
|
-
// Wait undoing the drag state until flushed tab changes to the DOM, i.e., after the layout routing cycle completes.
|
|
234
|
-
// If we were to undo the drag state immediately during the course of the drop event, the tab layout would temporarily
|
|
235
|
-
// revert to the state before the drag operation, resulting in an ugly flicker.
|
|
236
|
-
firstValueFrom(this._workbenchLayoutService.onLayoutChange$).then(() => {
|
|
237
|
-
this.unsetDragState();
|
|
238
|
-
});
|
|
239
|
-
}
|
|
240
|
-
/**
|
|
241
|
-
* Locates the tab before which the dragged tab is to be inserted when it is dropped. Dragging beyond the last tab returns `end`.
|
|
242
|
-
*/
|
|
243
|
-
computeDropTarget(event) {
|
|
244
|
-
const viewDragImageRect = this._viewTabDragImageRenderer.calculateDragImageRect(this._dragData, event);
|
|
245
|
-
const viewTabs = this._viewTabs().filter(viewTab => viewTab !== this.dragSourceViewTab);
|
|
246
|
-
for (const viewTab of viewTabs) {
|
|
247
|
-
const viewTabRect = viewTab.host.getBoundingClientRect();
|
|
248
|
-
const viewTabMiddle = viewTabRect.left + (viewTabRect.width / 2);
|
|
249
|
-
if (viewDragImageRect.left < viewTabMiddle && (viewTab !== this.dropTargetViewTab || viewDragImageRect.right < viewTabMiddle)) {
|
|
250
|
-
return viewTab;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
return 'end';
|
|
254
|
-
}
|
|
255
|
-
/**
|
|
256
|
-
* Creates the function for snapping the drag image to the tabbar when dragging near it.
|
|
257
|
-
*/
|
|
258
|
-
createDragImageConstrainFn() {
|
|
259
|
-
const hostLeft = this._host.getBoundingClientRect().left;
|
|
260
|
-
const maxViewportWidth = this.calculateMaxViewportWidth();
|
|
261
|
-
return (rect) => {
|
|
262
|
-
const viewportBoundingBox = this._viewportComponentElement().nativeElement.getBoundingClientRect();
|
|
263
|
-
return new ViewDragImageRect({
|
|
264
|
-
x: Math.min(Math.max(hostLeft + this._tabbarIndent.left, rect.x), hostLeft + maxViewportWidth - rect.width - this._tabbarIndent.right),
|
|
265
|
-
y: viewportBoundingBox.top,
|
|
266
|
-
width: rect.width,
|
|
267
|
-
height: viewportBoundingBox.height, // fit into tabbar, e.g., when dragging a tab into a tabbar of a different height
|
|
268
|
-
});
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
/**
|
|
272
|
-
* Calculates the maximum width of the tabbar viewport before an overflow would occur, which can then be used to constrain the drag image.
|
|
273
|
-
*
|
|
274
|
-
* To calculate the effective width, we need to simulate an overflow in the DOM. Therefore, call this method only from `dragstart` and not
|
|
275
|
-
* from `dragover` and disable animations.
|
|
276
|
-
*/
|
|
277
|
-
calculateMaxViewportWidth() {
|
|
278
|
-
const currentWidth = this._host.style.getPropertyValue('--ɵpart-bar-drag-image-placeholder-width');
|
|
279
|
-
// Disable animations during calculation and force the viewport to overflow.
|
|
280
|
-
setCssClass(this._host, 'calculating-max-viewport-width');
|
|
281
|
-
setCssVariable(this._host, { '--ɵpart-bar-drag-image-placeholder-width': `${this._host.clientWidth}px` });
|
|
282
|
-
try {
|
|
283
|
-
return this._viewportComponentElement().nativeElement.getBoundingClientRect().width;
|
|
284
|
-
}
|
|
285
|
-
finally {
|
|
286
|
-
setCssVariable(this._host, { '--ɵpart-bar-drag-image-placeholder-width': currentWidth || null });
|
|
287
|
-
unsetCssClass(this._host, 'calculating-max-viewport-width');
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
/**
|
|
291
|
-
* Calculates the width for the drag image placeholder.
|
|
292
|
-
*
|
|
293
|
-
* - When dragging over tabs, the width is equal to the width of the drag source.
|
|
294
|
-
* - When dragging to the right of the last tab, the width of the placeholder is calculated as the distance between the
|
|
295
|
-
* last tab and the position of the dragover event. Applying this width will resize the viewport, moving part actions along
|
|
296
|
-
* with the dragover event.
|
|
297
|
-
*/
|
|
298
|
-
calculateDragImagePlaceholderWidth(event) {
|
|
299
|
-
const viewDragImageRect = this._viewTabDragImageRenderer.calculateDragImageRect(this._dragData, event);
|
|
300
|
-
const lastViewTab = this._viewTabs().filter(viewTab => viewTab !== this.dragSourceViewTab).at(-1);
|
|
301
|
-
const lastViewTabRight = lastViewTab?.host.getBoundingClientRect().right ?? this._host.getBoundingClientRect().left + this._tabbarIndent.left;
|
|
302
|
-
return Math.max(lastViewTabRight + viewDragImageRect.width, viewDragImageRect.right) - lastViewTabRight;
|
|
303
|
-
}
|
|
304
|
-
/**
|
|
305
|
-
* Indicates whether CSS animations have finished when dragging a tab over the tabbar.
|
|
306
|
-
* The animation is considered stable when all tabs have moved to their final position.
|
|
307
|
-
*/
|
|
308
|
-
isDragAnimationStable() {
|
|
309
|
-
if (!this.dropTargetViewTab) {
|
|
310
|
-
return this._viewTabs().every(viewTab => getCssTranslation(viewTab.host).translateX === 'none');
|
|
311
|
-
}
|
|
312
|
-
const viewTabs = this._viewTabs().filter(viewTab => viewTab !== this.dragSourceViewTab);
|
|
313
|
-
const dropTargetIndex = this.dropTargetViewTab === 'end' ? viewTabs.length : viewTabs.indexOf(this.dropTargetViewTab);
|
|
314
|
-
const dragSourceWidth = this._dragData.viewTabWidth;
|
|
315
|
-
return viewTabs.every((viewTab, i) => {
|
|
316
|
-
const viewTabTranslateX = getCssTranslation(viewTab.host).translateX;
|
|
317
|
-
// Expect tabs preceding the drop target not to be shifted to the right.
|
|
318
|
-
if (i < dropTargetIndex && viewTabTranslateX !== 'none') {
|
|
319
|
-
return false;
|
|
320
|
-
}
|
|
321
|
-
// Expect drop target and tabs following the drop target to be shifted to the right.
|
|
322
|
-
if (i >= dropTargetIndex && Math.floor(Number(viewTabTranslateX)) !== Math.floor(dragSourceWidth)) { // compare floored numbers because `translateX` is not precise
|
|
323
|
-
return false;
|
|
324
|
-
}
|
|
325
|
-
return true;
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
unsetDragState(options) {
|
|
329
|
-
if (options?.unsetDragSource ?? true) {
|
|
330
|
-
this.dragSourceViewTab = null;
|
|
331
|
-
}
|
|
332
|
-
this.dropTargetViewTab = null;
|
|
333
|
-
this._dragData = null;
|
|
334
|
-
this._viewTabDragImageRenderer.unsetConstrainDragImageRectFn(this._constrainFn);
|
|
335
|
-
this._constrainFn = null;
|
|
336
|
-
unsetCssClass(this._host, 'drag-over');
|
|
337
|
-
unsetCssVariable(this._host, '--ɵpart-bar-drag-source-width', '--ɵpart-bar-drag-image-placeholder-width');
|
|
338
|
-
this._viewDragService.unsetTabbarDragover(this.part.id);
|
|
339
|
-
}
|
|
340
|
-
/**
|
|
341
|
-
* Scrolls the tab of the active view into view.
|
|
342
|
-
*/
|
|
343
|
-
installActiveViewScroller() {
|
|
344
|
-
effect(() => {
|
|
345
|
-
const viewportComponent = this._viewportComponent();
|
|
346
|
-
const activeViewId = this.part.activeViewId();
|
|
347
|
-
// There may be no active view in the tabbar, e.g., when dragging the last view out of the tabbar.
|
|
348
|
-
const activeViewTab = this._viewTabs().find(viewTab => viewTab.viewId === activeViewId);
|
|
349
|
-
if (activeViewTab && !viewportComponent.isElementInView(activeViewTab.host, 'full')) {
|
|
350
|
-
untracked(() => viewportComponent.scrollIntoView(activeViewTab.host));
|
|
351
|
-
}
|
|
352
|
-
});
|
|
353
|
-
}
|
|
354
|
-
/**
|
|
355
|
-
* Updates {@link ɵWorkbenchView} when its tab is scrolled into view.
|
|
356
|
-
*/
|
|
357
|
-
installScrolledIntoViewUpdater() {
|
|
358
|
-
this._viewportChange$
|
|
359
|
-
.pipe(map(() => this._viewTabs()), filterArray(viewTab => viewTab !== this.dragSourceViewTab), // skip drag source as always scrolled out of view
|
|
360
|
-
mergeMap(viewTabs => from(viewTabs)), takeUntilDestroyed())
|
|
361
|
-
.subscribe(viewTab => {
|
|
362
|
-
viewTab.view().scrolledIntoView = this._viewportComponent().isElementInView(viewTab.host, 'full');
|
|
363
|
-
});
|
|
364
|
-
}
|
|
365
|
-
installViewDragListener() {
|
|
366
|
-
this._viewDragService.viewDrag$(this._host)
|
|
367
|
-
.pipe(takeUntilDestroyed())
|
|
368
|
-
.subscribe((event) => {
|
|
369
|
-
switch (event.type) {
|
|
370
|
-
case 'dragenter':
|
|
371
|
-
this.onTabbarDragEnter(event);
|
|
372
|
-
break;
|
|
373
|
-
case 'dragover':
|
|
374
|
-
this.onTabbarDragOver(event);
|
|
375
|
-
break;
|
|
376
|
-
case 'dragleave':
|
|
377
|
-
this.onTabbarDragLeave();
|
|
378
|
-
break;
|
|
379
|
-
case 'drop':
|
|
380
|
-
this.onTabbarDrop();
|
|
381
|
-
break;
|
|
382
|
-
}
|
|
383
|
-
});
|
|
384
|
-
}
|
|
385
|
-
installViewportChangeTracker() {
|
|
386
|
-
const viewportSize = dimension(computed(() => this._viewportComponentElement().nativeElement));
|
|
387
|
-
const viewportClientSize = dimension(computed(() => this._viewportComponent().viewportClientElement));
|
|
388
|
-
const zone = inject(NgZone);
|
|
389
|
-
// Detect resizing.
|
|
390
|
-
effect(() => {
|
|
391
|
-
// Track viewport and viewport client sizes.
|
|
392
|
-
viewportSize();
|
|
393
|
-
viewportClientSize();
|
|
394
|
-
untracked(() => this._viewportChange$.next());
|
|
395
|
-
});
|
|
396
|
-
// Detect scrolling.
|
|
397
|
-
effect(onCleanup => {
|
|
398
|
-
const viewport = this._viewportComponent().viewportElement;
|
|
399
|
-
untracked(() => {
|
|
400
|
-
const subscription = fromEvent(viewport, 'scroll')
|
|
401
|
-
.pipe(subscribeIn(fn => zone.runOutsideAngular(fn)))
|
|
402
|
-
.subscribe(() => this._viewportChange$.next());
|
|
403
|
-
onCleanup(() => subscription.unsubscribe());
|
|
404
|
-
});
|
|
405
|
-
});
|
|
406
|
-
}
|
|
407
|
-
installTabbarIndentSizeTracker() {
|
|
408
|
-
const tabCornerRadiusDimension = dimension(this._tabCornerRadiusElement);
|
|
409
|
-
const paddingInlineDimension = dimension(this._paddingInlineElement);
|
|
410
|
-
effect(() => {
|
|
411
|
-
const indent = tabCornerRadiusDimension().clientWidth + paddingInlineDimension().clientWidth;
|
|
412
|
-
this._tabbarIndent = { left: indent, right: indent };
|
|
413
|
-
setCssVariable(this._host, {
|
|
414
|
-
'--ɵpart-bar-indent-left': `${this._tabbarIndent.left}px`,
|
|
415
|
-
'--ɵpart-bar-indent-right': `${this._tabbarIndent.right}px`,
|
|
416
|
-
});
|
|
417
|
-
});
|
|
418
|
-
}
|
|
419
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartBarComponent, deps: [{ token: i0.ElementRef }, { token: WORKBENCH_ID }, { token: i1.ɵWorkbenchPart }, { token: i2.WorkbenchLayoutService }, { token: i3.ɵWorkbenchRouter }, { token: i4.ViewTabDragImageRenderer }, { token: i5.ViewDragService }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
420
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.2", type: PartBarComponent, isStandalone: true, selector: "wb-part-bar", host: { listeners: { "dblclick": "onDoubleClick($event)", "dragstart": "onViewDragStart($event)", "dragend": "onViewDragEnd()" } }, viewQueries: [{ propertyName: "_viewTabs", predicate: ViewTabComponent, descendants: true, isSignal: true }, { propertyName: "_viewportComponent", first: true, predicate: SciViewportComponent, descendants: true, isSignal: true }, { propertyName: "_viewportComponentElement", first: true, predicate: SciViewportComponent, descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_tabCornerRadiusElement", first: true, predicate: ["tab_corner_radius"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "_paddingInlineElement", first: true, predicate: ["padding_inline"], descendants: true, read: ElementRef, isSignal: true }], ngImport: i0, template: "<sci-viewport class=\"tabbar\" scrollbarStyle=\"hidden\" [class.dragover]=\"dragover$ | async\">\n @for (viewId of part.viewIds(); track viewId) {\n @if (viewtab === dropTargetViewTab) {\n <div class=\"divider\"></div>\n }\n <wb-view-tab #viewtab\n [viewId]=\"viewId\"\n [class.drag-source]=\"viewtab === dragSourceViewTab\"\n [class.drop-target]=\"viewtab === dropTargetViewTab\"/>\n <div class=\"divider\"></div>\n }\n\n <!-- Placeholder element to grow the viewport to fit the drag image. -->\n <div class=\"drag-image-placeholder\"></div>\n</sci-viewport>\n<wb-part-action-bar/>\n<wb-view-list-button/>\n\n<!-- Element for injecting the corner radius into the component. -->\n<div class=\"tab-corner-radius\" #tab_corner_radius></div>\n<!-- Element for injecting the tabbar padding into the component. -->\n<div class=\"padding-inline\" #padding_inline></div>\n", styles: ["@charset \"UTF-8\";:host{--\\275part-bar-indent-left: 0;--\\275part-bar-indent-right: 0;--\\275part-bar-drag-source-width: 0;--\\275part-bar-drag-image-placeholder-width: 0;display:flex;color:var(--sci-workbench-tab-text-color);background-color:var(--sci-workbench-part-bar-background-color);border-top:var(--sci-workbench-part-bar-padding-top) solid transparent;background-clip:border-box;height:var(--sci-workbench-tab-height);box-sizing:content-box;position:relative;container-name:viewtab;container-type:size}wb-workbench:has(wb-main-area-layout) wb-part:not(.main-area) :host{background-color:var(--sci-workbench-part-peripheral-bar-background-color)}:host>sci-viewport.tabbar{flex:initial}:host>sci-viewport.tabbar::part(content){display:flex;padding-left:var(--\\275part-bar-indent-left);padding-right:var(--\\275part-bar-indent-right)}:host>sci-viewport.tabbar:not(.dragover):not(:has(wb-view-tab:not(.drag-source)))::part(content){padding-right:0}:host>sci-viewport.tabbar>wb-view-tab{flex:none}:host>sci-viewport.tabbar>wb-view-tab.drag-source{display:none}:host>sci-viewport.tabbar>div.divider{flex:none;display:flex;position:relative;width:0}:host>sci-viewport.tabbar>div.divider:after{flex:none;align-self:center;content:\"\";position:absolute;width:1px;left:-1px;height:65%;background-color:var(--sci-workbench-part-bar-divider-color)}:host>sci-viewport.tabbar>div.drag-image-placeholder{flex:none;width:var(--\\275part-bar-drag-image-placeholder-width)}:host>sci-viewport.tabbar>wb-view-tab.drop-target,:host>sci-viewport.tabbar wb-view-tab.drop-target~:is(wb-view-tab,div.divider),:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.drop-target){transform:translate(var(--\\275part-bar-drag-source-width))}:host>sci-viewport.tabbar>wb-view-tab:is(.active,.drag-source)+div.divider{display:none}:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.active:not(.drag-source)){display:none}:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.drag-source:not(.active)){display:none}:host>wb-part-action-bar{flex:auto}:host>wb-view-list-button{flex:none}:host:before{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background-color:var(--sci-workbench-tab-border-color)}:host>div.tab-corner-radius{position:absolute;visibility:hidden;width:var(--sci-workbench-tab-border-radius)}:host>div.padding-inline{position:absolute;visibility:hidden;width:var(--sci-workbench-part-bar-padding-inline)}:host:not(.calculating-max-viewport-width).drag-enter wb-view-tab,:host:not(.calculating-max-viewport-width).drag-enter div.divider,:host:not(.calculating-max-viewport-width).drag-over wb-view-tab,:host:not(.calculating-max-viewport-width).drag-over div.divider,:host:not(.calculating-max-viewport-width).drag-leave wb-view-tab,:host:not(.calculating-max-viewport-width).drag-leave div.divider{transition:transform 175ms cubic-bezier(0,0,.2,1)}:host:not(.calculating-max-viewport-width).drag-enter div.drag-image-placeholder,:host:not(.calculating-max-viewport-width).drag-leave div.drag-image-placeholder{transition:width 175ms cubic-bezier(0,0,.2,1)}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: SciViewportComponent, selector: "sci-viewport", inputs: ["scrollbarStyle"], outputs: ["scroll"] }, { kind: "component", type: ViewTabComponent, selector: "wb-view-tab", inputs: ["viewId"] }, { kind: "component", type: PartActionBarComponent, selector: "wb-part-action-bar" }, { kind: "component", type: ViewListButtonComponent, selector: "wb-view-list-button" }] }); }
|
|
421
|
-
}
|
|
422
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartBarComponent, decorators: [{
|
|
423
|
-
type: Component,
|
|
424
|
-
args: [{ selector: 'wb-part-bar', standalone: true, imports: [
|
|
425
|
-
AsyncPipe,
|
|
426
|
-
SciViewportComponent,
|
|
427
|
-
ViewTabComponent,
|
|
428
|
-
PartActionBarComponent,
|
|
429
|
-
ViewListButtonComponent,
|
|
430
|
-
], template: "<sci-viewport class=\"tabbar\" scrollbarStyle=\"hidden\" [class.dragover]=\"dragover$ | async\">\n @for (viewId of part.viewIds(); track viewId) {\n @if (viewtab === dropTargetViewTab) {\n <div class=\"divider\"></div>\n }\n <wb-view-tab #viewtab\n [viewId]=\"viewId\"\n [class.drag-source]=\"viewtab === dragSourceViewTab\"\n [class.drop-target]=\"viewtab === dropTargetViewTab\"/>\n <div class=\"divider\"></div>\n }\n\n <!-- Placeholder element to grow the viewport to fit the drag image. -->\n <div class=\"drag-image-placeholder\"></div>\n</sci-viewport>\n<wb-part-action-bar/>\n<wb-view-list-button/>\n\n<!-- Element for injecting the corner radius into the component. -->\n<div class=\"tab-corner-radius\" #tab_corner_radius></div>\n<!-- Element for injecting the tabbar padding into the component. -->\n<div class=\"padding-inline\" #padding_inline></div>\n", styles: ["@charset \"UTF-8\";:host{--\\275part-bar-indent-left: 0;--\\275part-bar-indent-right: 0;--\\275part-bar-drag-source-width: 0;--\\275part-bar-drag-image-placeholder-width: 0;display:flex;color:var(--sci-workbench-tab-text-color);background-color:var(--sci-workbench-part-bar-background-color);border-top:var(--sci-workbench-part-bar-padding-top) solid transparent;background-clip:border-box;height:var(--sci-workbench-tab-height);box-sizing:content-box;position:relative;container-name:viewtab;container-type:size}wb-workbench:has(wb-main-area-layout) wb-part:not(.main-area) :host{background-color:var(--sci-workbench-part-peripheral-bar-background-color)}:host>sci-viewport.tabbar{flex:initial}:host>sci-viewport.tabbar::part(content){display:flex;padding-left:var(--\\275part-bar-indent-left);padding-right:var(--\\275part-bar-indent-right)}:host>sci-viewport.tabbar:not(.dragover):not(:has(wb-view-tab:not(.drag-source)))::part(content){padding-right:0}:host>sci-viewport.tabbar>wb-view-tab{flex:none}:host>sci-viewport.tabbar>wb-view-tab.drag-source{display:none}:host>sci-viewport.tabbar>div.divider{flex:none;display:flex;position:relative;width:0}:host>sci-viewport.tabbar>div.divider:after{flex:none;align-self:center;content:\"\";position:absolute;width:1px;left:-1px;height:65%;background-color:var(--sci-workbench-part-bar-divider-color)}:host>sci-viewport.tabbar>div.drag-image-placeholder{flex:none;width:var(--\\275part-bar-drag-image-placeholder-width)}:host>sci-viewport.tabbar>wb-view-tab.drop-target,:host>sci-viewport.tabbar wb-view-tab.drop-target~:is(wb-view-tab,div.divider),:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.drop-target){transform:translate(var(--\\275part-bar-drag-source-width))}:host>sci-viewport.tabbar>wb-view-tab:is(.active,.drag-source)+div.divider{display:none}:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.active:not(.drag-source)){display:none}:host>sci-viewport.tabbar>div.divider:has(+wb-view-tab.drag-source:not(.active)){display:none}:host>wb-part-action-bar{flex:auto}:host>wb-view-list-button{flex:none}:host:before{content:\"\";position:absolute;bottom:0;left:0;right:0;height:1px;background-color:var(--sci-workbench-tab-border-color)}:host>div.tab-corner-radius{position:absolute;visibility:hidden;width:var(--sci-workbench-tab-border-radius)}:host>div.padding-inline{position:absolute;visibility:hidden;width:var(--sci-workbench-part-bar-padding-inline)}:host:not(.calculating-max-viewport-width).drag-enter wb-view-tab,:host:not(.calculating-max-viewport-width).drag-enter div.divider,:host:not(.calculating-max-viewport-width).drag-over wb-view-tab,:host:not(.calculating-max-viewport-width).drag-over div.divider,:host:not(.calculating-max-viewport-width).drag-leave wb-view-tab,:host:not(.calculating-max-viewport-width).drag-leave div.divider{transition:transform 175ms cubic-bezier(0,0,.2,1)}:host:not(.calculating-max-viewport-width).drag-enter div.drag-image-placeholder,:host:not(.calculating-max-viewport-width).drag-leave div.drag-image-placeholder{transition:width 175ms cubic-bezier(0,0,.2,1)}\n"] }]
|
|
431
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: undefined, decorators: [{
|
|
432
|
-
type: Inject,
|
|
433
|
-
args: [WORKBENCH_ID]
|
|
434
|
-
}] }, { type: i1.ɵWorkbenchPart }, { type: i2.WorkbenchLayoutService }, { type: i3.ɵWorkbenchRouter }, { type: i4.ViewTabDragImageRenderer }, { type: i5.ViewDragService }, { type: i0.DestroyRef }], propDecorators: { onDoubleClick: [{
|
|
435
|
-
type: HostListener,
|
|
436
|
-
args: ['dblclick', ['$event']]
|
|
437
|
-
}], onViewDragStart: [{
|
|
438
|
-
type: HostListener,
|
|
439
|
-
args: ['dragstart', ['$event']]
|
|
440
|
-
}], onViewDragEnd: [{
|
|
441
|
-
type: HostListener,
|
|
442
|
-
args: ['dragend']
|
|
443
|
-
}] } });
|
|
444
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydC1iYXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2Npb24vd29ya2JlbmNoL3NyYy9saWIvcGFydC9wYXJ0LWJhci9wYXJ0LWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zY2lvbi93b3JrYmVuY2gvc3JjL2xpYi9wYXJ0L3BhcnQtYmFyL3BhcnQtYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQWMsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFaEUsT0FBTyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQWMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25HLE9BQU8sRUFBYyxpQkFBaUIsRUFBMkIsTUFBTSxxREFBcUQsQ0FBQztBQUU3SCxPQUFPLEVBQUMsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0SCxPQUFPLEVBQUMsV0FBVyxFQUFFLFdBQVcsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRWhFLE9BQU8sRUFBQyxTQUFT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VSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVk3QixlQUFlO3NCQURyQixZQUFZO3VCQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkE4QzlCLGFBQWE7c0JBRG5CLFlBQVk7dUJBQUMsU0FBUyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyNCBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIEhvc3RMaXN0ZW5lciwgaW5qZWN0LCBJbmplY3QsIE5nWm9uZSwgdW50cmFja2VkLCB2aWV3Q2hpbGQsIHZpZXdDaGlsZHJlbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1ZpZXdUYWJDb21wb25lbnR9IGZyb20gJy4uL3ZpZXctdGFiL3ZpZXctdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQge1dvcmtiZW5jaExheW91dFNlcnZpY2V9IGZyb20gJy4uLy4uL2xheW91dC93b3JrYmVuY2gtbGF5b3V0LnNlcnZpY2UnO1xuaW1wb3J0IHtmaXJzdCwgbWFwLCBtZXJnZU1hcCwgdGFrZSwgdGFrZVVudGlsfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge2FuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCBmaXJzdFZhbHVlRnJvbSwgZnJvbSwgZnJvbUV2ZW50LCBPYnNlcnZhYmxlLCBTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q29uc3RyYWluRm4sIFZpZXdEcmFnSW1hZ2VSZWN0LCBWaWV3VGFiRHJhZ0ltYWdlUmVuZGVyZXJ9IGZyb20gJy4uLy4uL3ZpZXctZG5kL3ZpZXctdGFiLWRyYWctaW1hZ2UtcmVuZGVyZXIuc2VydmljZSc7XG5pbXBvcnQge1ZpZXdEcmFnRGF0YSwgVmlld0RyYWdTZXJ2aWNlfSBmcm9tICcuLi8uLi92aWV3LWRuZC92aWV3LWRyYWcuc2VydmljZSc7XG5pbXBvcnQge2dldENzc1RyYW5zbGF0aW9uLCBzZXRDc3NDbGFzcywgc2V0Q3NzVmFyaWFibGUsIHVuc2V0Q3NzQ2xhc3MsIHVuc2V0Q3NzVmFyaWFibGV9IGZyb20gJy4uLy4uL2NvbW1vbi9kb20udXRpbCc7XG5pbXBvcnQge8m1V29ya2JlbmNoUGFydH0gZnJvbSAnLi4vybV3b3JrYmVuY2gtcGFydC5tb2RlbCc7XG5pbXBvcnQge2ZpbHRlckFycmF5LCBzdWJzY3JpYmVJbn0gZnJvbSAnQHNjaW9uL3Rvb2xraXQvb3BlcmF0b3JzJztcbmltcG9ydCB7U2NpVmlld3BvcnRDb21wb25lbnR9IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL3ZpZXdwb3J0JztcbmltcG9ydCB7ybVXb3JrYmVuY2hSb3V0ZXJ9IGZyb20gJy4uLy4uL3JvdXRpbmcvybV3b3JrYmVuY2gtcm91dGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtkaW1lbnNpb259IGZyb20gJ0BzY2lvbi9jb21wb25lbnRzL2RpbWVuc2lvbic7XG5pbXBvcnQge0FzeW5jUGlwZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7UGFydEFjdGlvbkJhckNvbXBvbmVudH0gZnJvbSAnLi4vcGFydC1hY3Rpb24tYmFyL3BhcnQtYWN0aW9uLWJhci5jb21wb25lbnQnO1xuaW1wb3J0IHtWaWV3TGlzdEJ1dHRvbkNvbXBvbmVudH0gZnJvbSAnLi4vdmlldy1saXN0LWJ1dHRvbi92aWV3LWxpc3QtYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQge3Rha2VVbnRpbERlc3Ryb3llZH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHtXT1JLQkVOQ0hfSUR9IGZyb20gJy4uLy4uL3dvcmtiZW5jaC1pZCc7XG5pbXBvcnQge29uRXZlcnlBbmltYXRpb25GcmFtZSR9IGZyb20gJy4uLy4uL2NvbW1vbi9hbmltYXRpb24tZnJhbWUub2JzZXJ2YWJsZSc7XG5cbi8qKlxuICogUmVuZGVycyB2aWV3IHRhYnMgYW5kIGFjdGlvbnMgb2YgYSB7QGxpbmsgV29ya2JlbmNoUGFydH0uXG4gKlxuICogVGFicyBhcmUgYWRkZWQgdG8gYSB2aWV3cG9ydCwgd2hpY2ggdGhlIHVzZXIgY2FuIHNjcm9sbCBpZiBub3QgZW5vdWdoIHNwYWNlLiBUaGUgdmlld3BvcnQgZ3Jvd3Mgd2l0aCBpdHMgdGFicyxcbiAqIGFsbG93aW5nIGFjdGlvbnMgdG8gYmUgcGxhY2VkIGRpcmVjdGx5IGFmdGVyIHRoZSBsYXN0IHRhYiBvciBvbiB0aGUgcmlnaHQgc2lkZS5cbiAqXG4gKiAjIyBEcmFnIEV2ZW50c1xuICogV2UgdXNlIG5hdGl2ZSBkcmFnIGFuZCBkcm9wIHRvIHN1cHBvcnQgZHJhZ2dpbmcgdmlld3MgdG8gb3RoZXIgd2luZG93cy5cbiAqXG4gKiBCeSBsaXN0ZW5pbmcgdG8gZHJhZyBldmVudHMsIHRoZSB0YWJiYXIgdmlzdWFsaXplcyB0YWJzIGR1cmluZyBhIGRyYWcgb3BlcmF0aW9uLiBUaGUgZHJhZyBvcGVyYXRpb24gaXMgaW5pdGlhdGVkIGluIHtAbGluayBWaWV3VGFiQ29tcG9uZW50fS5cbiAqIC0gYGRyYWdzdGFydGAgYW5kIGBkcmFnZW5kYCBldmVudHMgYXJlIGZpcmVkIGluIHRoZSB0YWJiYXIgd2hlcmUgdGhlIGRyYWcgb3BlcmF0aW9uIHdhcyBpbml0aWF0ZWQuXG4gKiAtIGBkcmFnZW50ZXJgIGV2ZW50IGlzIGZpcmVkIHdoZW4gYSB0YWIgZW50ZXJzIHRoZSB0YWJiYXIuXG4gKiAtIGBkcmFnb3ZlcmAgZXZlbnRzIGFyZSBmaXJlZCB3aGVuIGRyYWdnaW5nIGEgdGFiIG92ZXIgdGhlIHRhYmJhci5cbiAqIC0gYGRyYWdsZWF2ZWAgZXZlbnQgaXMgZmlyZWQgd2hlbiBhIHRhYiBsZWF2ZXMgdGhlIHRhYmJhci5cbiAqIC0gYGRyb3BgIGV2ZW50IGlzIGZpcmVkIHdoZW4gdGhlIHVzZXIgZHJvcHMgYSB0YWIgaW4gdGhlIHRhYmJhci5cbiAqIC0gTm90ZSB0aGF0IGBkcmFnbGVhdmVgIGV2ZW50IGlzIG5vdCBmaXJlZCBvbiBkcm9wIGFjdGlvbi4gVGhlcmVmb3JlLCBhbHdheXMgaGFuZGxlIGJvdGggZXZlbnRzLCBgZHJhZ2xlYXZlYCBhbmQgYGRyb3BgIGV2ZW50cywgcmVzcGVjdGl2ZWx5LlxuICpcbiAqICMjIFRlcm1pbm9sb2d5XG4gKiAtIERyYWcgc291cmNlOiBUYWIgdGhhdCBpcyBiZWluZyBkcmFnZ2VkLlxuICogLSBEcm9wIHRhcmdldDogVGFiIGJlZm9yZSB3aGljaCB0byBpbnNlcnQgdGhlIGRyYWcgc291cmNlIG9uIGRyb3AsIG9yIGBlbmRgIGlmIGRyb3BwaW5nIGl0IGFmdGVyIHRoZSBsYXN0IHRhYi5cbiAqIC0gRHJhZyBpbWFnZTogIEltYWdlIGZvciB0aGUgdGFiIHRvIGJlIGRyYWdnZWQuIFdlIGRvIG5vdCB1c2UgdGhlIG5hdGl2ZSBkcmFnIGltYWdlIHN1cHBvcnQgdG8gY29udHJvbCBkcmFnIGltYWdlIHBvc2l0aW9uIGFuZCBzaXplLFxuICogICAgICAgICAgICAgICAgZS5nLiwgdG8gc25hcCB0aGUgZHJhZyBpbWFnZSB0byB0aGUgdGFiYmFyIHdoZW4gZHJhZ2dpbmcgbmVhciBpdC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnd2ItcGFydC1iYXInLFxuICB0ZW1wbGF0ZVVybDogJy4vcGFydC1iYXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wYXJ0LWJhci5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQXN5bmNQaXBlLFxuICAgIFNjaVZpZXdwb3J0Q29tcG9uZW50LFxuICAgIFZpZXdUYWJDb21wb25lbnQsXG4gICAgUGFydEFjdGlvbkJhckNvbXBvbmVudCxcbiAgICBWaWV3TGlzdEJ1dHRvbkNvbXBvbmVudCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgUGFydEJhckNvbXBvbmVudCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfaG9zdDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0Q2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdUYWJzID0gdmlld0NoaWxkcmVuKFZpZXdUYWJDb21wb25lbnQpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kcmFnZW50ZXIkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZHJhZ2xlYXZlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RyYWdlbmQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGRyYWdvdmVyJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcblxuICBwcml2YXRlIHJlYWRvbmx5IF92aWV3cG9ydENvbXBvbmVudCA9IHZpZXdDaGlsZC5yZXF1aXJlZChTY2lWaWV3cG9ydENvbXBvbmVudCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3ZpZXdwb3J0Q29tcG9uZW50RWxlbWVudCA9IHZpZXdDaGlsZC5yZXF1aXJlZChTY2lWaWV3cG9ydENvbXBvbmVudCwge3JlYWQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+fSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3RhYkNvcm5lclJhZGl1c0VsZW1lbnQgPSB2aWV3Q2hpbGQucmVxdWlyZWQoJ3RhYl9jb3JuZXJfcmFkaXVzJywge3JlYWQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+fSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhZGRpbmdJbmxpbmVFbGVtZW50ID0gdmlld0NoaWxkLnJlcXVpcmVkKCdwYWRkaW5nX2lubGluZScsIHtyZWFkOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50Pn0pO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIHRhYiBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0IHRoZSBkcmFnIHNvdXJjZSBvbiBkcm9wLCBvciBgZW5kYCBpZiBkcm9wcGluZyBpdCBhZnRlciB0aGUgbGFzdCB0YWIuXG4gICAqL1xuICBwdWJsaWMgZHJvcFRhcmdldFZpZXdUYWI6IFZpZXdUYWJDb21wb25lbnQgfCAnZW5kJyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBSZWZlcmVuY2UgdG8gdGhlIHRhYiB3aGVyZSB0aGUgZHJhZyBvcGVyYXRpb24gd2FzIHN0YXJ0ZWQuXG4gICAqIFRoaXMgcmVmZXJlbmNlIGlzIG9ubHkgc2V0IGlmIHRoZSBkcmFnIG9wZXJhdGlvbiBzdGFydGVkIG9uIGEgdGFiIG9mIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgcHVibGljIGRyYWdTb3VyY2VWaWV3VGFiOiBWaWV3VGFiQ29tcG9uZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIFRyYW5zZmVyIGRhdGEgb2YgdGhlIHRhYiBiZWluZyBkcmFnZ2VkIG92ZXIgdGhpcyB0YWJiYXIuXG4gICAqL1xuICBwcml2YXRlIF9kcmFnRGF0YTogVmlld0RyYWdEYXRhIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGZvciBzbmFwcGluZyB0aGUgZHJhZyBpbWFnZSB0byB0aGUgdGFiYmFyIHdoZW4gZHJhZ2dpbmcgbmVhciBpdC5cbiAgICovXG4gIHByaXZhdGUgX2NvbnN0cmFpbkZuOiBDb25zdHJhaW5GbiB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUYWJiYXIgaW5kZW50cyB3aGVyZSB0byBkaXNwbGF5IHRoZSByb3VuZGVkIGJvdHRvbSBjb3JuZXJzIG9mIHRoZSBmaXJzdCBhbmQgbGFzdCB2aWV3IHRhYi5cbiAgICovXG4gIHByaXZhdGUgX3RhYmJhckluZGVudCA9IHtcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiAwLFxuICB9O1xuXG4gIC8qKlxuICAgKiBOb3RpZmllcyB3aGVuIHRoZSBkcmFnIGFuaW1hdGlvbiBoYXMgZmluaXNoZWQsIGkuZS4sIHRhYnMgaGF2ZSB0cmFuc2l0aW9uZWQgdG8gdGhlaXIgZmluYWwgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIF9kcmFnQW5pbWF0aW9uU3RhYmxlJCA9IG9uRXZlcnlBbmltYXRpb25GcmFtZSQoKS5waXBlKGZpcnN0KCgpID0+IHRoaXMuaXNEcmFnQW5pbWF0aW9uU3RhYmxlKCkpKTtcblxuICBjb25zdHJ1Y3Rvcihob3N0OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICAgICAgICAgICAgQEluamVjdChXT1JLQkVOQ0hfSUQpIHByaXZhdGUgX3dvcmtiZW5jaElkOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHByb3RlY3RlZCBwYXJ0OiDJtVdvcmtiZW5jaFBhcnQsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3dvcmtiZW5jaExheW91dFNlcnZpY2U6IFdvcmtiZW5jaExheW91dFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JvdXRlcjogybVXb3JrYmVuY2hSb3V0ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlcjogVmlld1RhYkRyYWdJbWFnZVJlbmRlcmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3RHJhZ1NlcnZpY2U6IFZpZXdEcmFnU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZGVzdHJveVJlZjogRGVzdHJveVJlZikge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5kcmFnb3ZlciQgPSB0aGlzLl92aWV3RHJhZ1NlcnZpY2UudGFiYmFyRHJhZ092ZXIkLnBpcGUobWFwKHBhcnRJZCA9PiBwYXJ0SWQgPT09IHRoaXMucGFydC5pZCkpO1xuICAgIHRoaXMuaW5zdGFsbEFjdGl2ZVZpZXdTY3JvbGxlcigpO1xuICAgIHRoaXMuaW5zdGFsbFNjcm9sbGVkSW50b1ZpZXdVcGRhdGVyKCk7XG4gICAgdGhpcy5pbnN0YWxsVmlld0RyYWdMaXN0ZW5lcigpO1xuICAgIHRoaXMuaW5zdGFsbFRhYmJhckluZGVudFNpemVUcmFja2VyKCk7XG4gICAgdGhpcy5pbnN0YWxsVmlld3BvcnRDaGFuZ2VUcmFja2VyKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkYmxjbGljaycsIFsnJGV2ZW50J10pXG4gIHB1YmxpYyBvbkRvdWJsZUNsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFydC5pc0luTWFpbkFyZWEpIHtcbiAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZShsYXlvdXQgPT4gbGF5b3V0LnRvZ2dsZU1heGltaXplZCgpKS50aGVuKCk7XG4gICAgfVxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpbnZva2VkIHdoZW4gdGhlIHVzZXIgc3RhcnRzIGRyYWdnaW5nIGEgdGFiIG9mIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ3N0YXJ0JywgWyckZXZlbnQnXSlcbiAgcHVibGljIG9uVmlld0RyYWdTdGFydChldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl92aWV3RHJhZ1NlcnZpY2UuaXNWaWV3RHJhZ0V2ZW50KGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGRyYWdEYXRhID0gdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnZpZXdEcmFnRGF0YSE7XG4gICAgY29uc3QgZHJhZ1NvdXJjZUluZGV4ID0gdGhpcy5fdmlld1RhYnMoKS5maW5kSW5kZXgodmlld1RhYiA9PiB2aWV3VGFiLnZpZXdJZCA9PT0gZHJhZ0RhdGEudmlld0lkKTtcbiAgICBjb25zdCBkcmFnU291cmNlVmlld1RhYiA9IHRoaXMuX3ZpZXdUYWJzKClbZHJhZ1NvdXJjZUluZGV4XTtcbiAgICBjb25zdCBkcm9wVGFyZ2V0Vmlld1RhYiA9IHRoaXMuX3ZpZXdUYWJzKClbZHJhZ1NvdXJjZUluZGV4ICsgMV0gPz8gJ2VuZCc7XG5cbiAgICAvLyBDb25zdHJhaW4gZnVuY3Rpb24gZm9yIHNuYXBwaW5nIHRoZSBkcmFnIGltYWdlIHRvIHRoZSB0YWJiYXIgd2hlbiBkcmFnZ2luZyBuZWFyIGl0LlxuICAgIHRoaXMuX2NvbnN0cmFpbkZuID0gdGhpcy5jcmVhdGVEcmFnSW1hZ2VDb25zdHJhaW5GbigpO1xuICAgIHRoaXMuX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlci5zZXRDb25zdHJhaW5EcmFnSW1hZ2VSZWN0Rm4odGhpcy5fY29uc3RyYWluRm4pO1xuICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS5zZXRUYWJiYXJEcmFnb3Zlcih0aGlzLnBhcnQuaWQpO1xuXG4gICAgLy8gV2hlbiBzdGFydCBkcmFnZ2luZyBhIHZpZXcgdGFiLCB3ZSByZW1vdmUgaXQgZnJvbSB0aGUgdGFiYmFyIGJ5IHNldHRpbmcgaXRzIGBkaXNwbGF5YCB0byBgbm9uZWAgYW5kIHJlbmRlciBpdHMgZHJhZyBpbWFnZSBpbiBgVmlld1RhYkRyYWdJbWFnZVJlbmRlcmVyYCBpbnN0ZWFkLlxuICAgIC8vIEhvd2V2ZXIsIGRvIG5vdCB1bnNldCB0aGUgYGRpc3BsYXlgIG9mIHRoZSBkcmFnIHNvdXJjZSBkdXJpbmcgYGRyYWdzdGFydGAuIE90aGVyd2lzZSwgdGhlIG5hdGl2ZSBkcmFnIG9wZXJhdGlvbiB3b3VsZCBiZSBjb3JydXB0ZWQgaW4gQ2hyb21lIGFuZCBFZGdlIChidXQgbm90IGluIEZpcmVmb3gpLlxuICAgIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHtcbiAgICAgIHRoaXMuZHJhZ1NvdXJjZVZpZXdUYWIgPSBkcmFnU291cmNlVmlld1RhYjtcbiAgICAgIHRoaXMuZHJvcFRhcmdldFZpZXdUYWIgPSBkcm9wVGFyZ2V0Vmlld1RhYjsgLy8gU2V0IGRyb3AgdGFyZ2V0IHRvIGF2b2lkIHRhYiBhbmltYXRpb24uXG4gICAgICBzZXRDc3NWYXJpYWJsZSh0aGlzLl9ob3N0LCB7XG4gICAgICAgICctLcm1cGFydC1iYXItZHJhZy1zb3VyY2Utd2lkdGgnOiBgJHtkcmFnRGF0YS52aWV3VGFiV2lkdGh9cHhgLFxuICAgICAgICAnLS3JtXBhcnQtYmFyLWRyYWctaW1hZ2UtcGxhY2Vob2xkZXItd2lkdGgnOiBgJHtkcmFnRGF0YS52aWV3VGFiV2lkdGh9cHhgLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyBXaGVuIGRyYWdnaW5nIGEgdGFiIHZlcnkgcXVpY2tseSBvdXQgb2YgdGhpcyB0YWJiYXIsIG9ubHkgdGhlIGBkcmFnc3RhcnRgIGV2ZW50IGdldHMgZmlyZWQsIGJ1dCBub3QgdGhlIGBkcmFnZW50ZXJgIGV2ZW50LlxuICAgIC8vIFRoZXJlZm9yZSwgd2Ugc3Vic2NyaWJlIHRvIGdsb2JhbCBgZHJhZ2VudGVyYCBldmVudHMgYW5kIG1hbnVhbGx5IGludm9rZSBgb25UYWJiYXJEcmFnTGVhdmVgIHRvIGNvcnJlY3RseSBkaXNwbGF5IHRoZSB0YWJzIGFuZCB0aGUgYWN0aXZlIHZpZXcuXG4gICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnZpZXdEcmFnJCh3aW5kb3csIHtldmVudFR5cGU6IFsnZHJhZ2VudGVyJ119KVxuICAgICAgLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuX2RyYWdlbmQkKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZShldmVudCA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSB1c2VyIGNvbnRpbnVlcyBkcmFnZ2luZyBvdmVyIHRoaXMgdGFiYmFyLlxuICAgICAgICAvLyBJZiBub3QsIHRoZSB1c2VyIGhhcyBxdWlja2x5IGRyYWdnZWQgdGhlIHRhYiBvdXQgb2YgdGhlIHRhYmJhciBhbmQgd2UgIG1hbnVhbGx5IGNhbGwgYG9uVGFiYmFyRHJhZ0xlYXZlYC5cbiAgICAgICAgaWYgKCh0aGlzLl9ob3N0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGV2ZW50LnRhcmdldCBhcyBFbGVtZW50KSAmIE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSA9PT0gMCkge1xuICAgICAgICAgIHRoaXMub25UYWJiYXJEcmFnTGVhdmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGludm9rZWQgd2hlbiB0aGUgdXNlciBlbmRzIGRyYWdnaW5nIGEgdGFiIG9mIHRoaXMgdGFiYmFyLlxuICAgKlxuICAgKiBJbnZva2VkIG9ubHkgaW4gdGhlIHRhYmJhciB3aGVyZSB0aGUgZHJhZyBvcGVyYXRpb24gc3RhcnRlZCwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkcmFnIG9wZXJhdGlvbiB3YXMgY29tcGxldGVkIG9yIGNhbmNlbGVkLlxuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZHJhZ2VuZCcpXG4gIHB1YmxpYyBvblZpZXdEcmFnRW5kKCk6IHZvaWQge1xuICAgIHRoaXMuX2RyYWdlbmQkLm5leHQoKTtcbiAgICB0aGlzLnVuc2V0RHJhZ1N0YXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGludm9rZWQgd2hlbiB0aGUgdXNlciBkcmFncyBhIHRhYiBpbnRvIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgcHJpdmF0ZSBvblRhYmJhckRyYWdFbnRlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5fZHJhZ2VudGVyJC5uZXh0KCk7XG4gICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLnNldFRhYmJhckRyYWdvdmVyKHRoaXMucGFydC5pZCk7XG4gICAgdGhpcy5fZHJhZ0RhdGEgPSB0aGlzLl92aWV3RHJhZ1NlcnZpY2Uudmlld0RyYWdEYXRhITtcblxuICAgIC8vIENvbnN0cmFpbiBmdW5jdGlvbiBmb3Igc25hcHBpbmcgdGhlIGRyYWcgaW1hZ2UgdG8gdGhlIHRhYmJhciB3aGVuIGRyYWdnaW5nIG5lYXIgaXQuXG4gICAgaWYgKCF0aGlzLl9jb25zdHJhaW5Gbikge1xuICAgICAgdGhpcy5fY29uc3RyYWluRm4gPSB0aGlzLmNyZWF0ZURyYWdJbWFnZUNvbnN0cmFpbkZuKCk7XG4gICAgICB0aGlzLl92aWV3VGFiRHJhZ0ltYWdlUmVuZGVyZXIuc2V0Q29uc3RyYWluRHJhZ0ltYWdlUmVjdEZuKHRoaXMuX2NvbnN0cmFpbkZuKTtcbiAgICB9XG5cbiAgICAvLyBMb2NhdGUgZHJvcCB0YXJnZXQgdG8gaGF2ZSBhIG5pY2UgYW5pbWF0aW9uIGZvciB0aGUgZHJhZyBzb3VyY2UgcGxhY2Vob2xkZXIuXG4gICAgdGhpcy5kcm9wVGFyZ2V0Vmlld1RhYiA9IHRoaXMuY29tcHV0ZURyb3BUYXJnZXQoZXZlbnQpO1xuXG4gICAgLy8gU2V0IHRoZSBDU1MgY2xhc3MgJ2RyYWctZW50ZXInIHRvIGluZGljYXRlIGVudGVyaW5nIHRoZSB0YWJiYXIuXG4gICAgc2V0Q3NzQ2xhc3ModGhpcy5faG9zdCwgJ2RyYWctZW50ZXInLCAnZHJhZy1vdmVyJyk7XG4gICAgdGhpcy5fZHJhZ0FuaW1hdGlvblN0YWJsZSRcbiAgICAgIC5waXBlKHRha2UoMSksIHRha2VVbnRpbCh0aGlzLl9kcmFnZW50ZXIkKSwgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuX2Rlc3Ryb3lSZWYpKVxuICAgICAgLnN1YnNjcmliZSh7Y29tcGxldGU6ICgpID0+IHVuc2V0Q3NzQ2xhc3ModGhpcy5faG9zdCwgJ2RyYWctZW50ZXInKX0pO1xuXG4gICAgc2V0Q3NzVmFyaWFibGUodGhpcy5faG9zdCwge1xuICAgICAgJy0tybVwYXJ0LWJhci1kcmFnLXNvdXJjZS13aWR0aCc6IGAke3RoaXMuX2RyYWdEYXRhLnZpZXdUYWJXaWR0aH1weGAsXG4gICAgICAnLS3JtXBhcnQtYmFyLWRyYWctaW1hZ2UtcGxhY2Vob2xkZXItd2lkdGgnOiBgJHt0aGlzLl9kcmFnRGF0YS52aWV3VGFiV2lkdGh9cHhgLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCBpbnZva2VkIHdoZW4gdGhlIHVzZXIgZHJhZ3MgYSB0YWIgb3V0IG9mIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgcHJpdmF0ZSBvblRhYmJhckRyYWdMZWF2ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9kcmFnbGVhdmUkLm5leHQoKTtcblxuICAgIC8vIFNldCB0aGUgQ1NTIGNsYXNzICdkcmFnLWxlYXZlJyB0byBpbmRpY2F0ZSBsZWF2aW5nIHRoZSB0YWJiYXIuXG4gICAgc2V0Q3NzQ2xhc3ModGhpcy5faG9zdCwgJ2RyYWctbGVhdmUnKTtcbiAgICB0aGlzLl9kcmFnQW5pbWF0aW9uU3RhYmxlJFxuICAgICAgLnBpcGUodGFrZSgxKSwgdGFrZVVudGlsKHRoaXMuX2RyYWdsZWF2ZSQpLCB0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5fZGVzdHJveVJlZikpXG4gICAgICAuc3Vic2NyaWJlKHtjb21wbGV0ZTogKCkgPT4gdW5zZXRDc3NDbGFzcyh0aGlzLl9ob3N0LCAnZHJhZy1sZWF2ZScpfSk7XG5cbiAgICB0aGlzLnVuc2V0RHJhZ1N0YXRlKHt1bnNldERyYWdTb3VyY2U6IGZhbHNlfSk7XG5cbiAgICAvLyBBY3RpdmF0ZSB0aGUgdmlldyBuZXh0IHRvIHRoZSB2aWV3IGJlaW5nIGRyYWdnZWQgb3V0IG9mIHRoaXMgdGFiYmFyLiBCdXQsIGRvIG5vdCBwdXNoIHRoZSBuYXZpZ2F0aW9uIGludG8gYnJvd3NpbmcgaGlzdG9yeSBzdGFjay5cbiAgICBpZiAodGhpcy5kcmFnU291cmNlVmlld1RhYiAmJiB0aGlzLmRyYWdTb3VyY2VWaWV3VGFiLmFjdGl2ZSkge1xuICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKGxheW91dCA9PiBsYXlvdXQuYWN0aXZhdGVBZGphY2VudFZpZXcodGhpcy5kcmFnU291cmNlVmlld1RhYiEudmlld0lkKSwge3NraXBMb2NhdGlvbkNoYW5nZTogdHJ1ZX0pLnRoZW4oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIGludm9rZWQgd2hpbGUgdGhlIHVzZXIgaXMgZHJhZ2dpbmcgYSB0YWIgb3ZlciB0aGlzIHRhYmJhci5cbiAgICovXG4gIHByaXZhdGUgb25UYWJiYXJEcmFnT3ZlcihldmVudDogRHJhZ0V2ZW50KTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gYWxsb3cgdmlldyBkcm9wXG5cbiAgICAvLyBMb2NhdGUgdGhlIHRhYiBvdmVyIHdoaWNoIHRoZSB1c2VyIGlzIGRyYWdnaW5nIHRoZSB0YWIsIGJ1dCBvbmx5IGFmdGVyIHBlbmRpbmcgdHJhbnNpdGlvbnMgaGF2ZSBlbmRlZCB0byBwcmV2ZW50IHRhYnMgZnJvbSBzbGlkaW5nIGJhY2sgYW5kIGZvcnRoLlxuICAgIGlmICh0aGlzLmlzRHJhZ0FuaW1hdGlvblN0YWJsZSgpKSB7XG4gICAgICB0aGlzLmRyb3BUYXJnZXRWaWV3VGFiID0gdGhpcy5jb21wdXRlRHJvcFRhcmdldChldmVudCk7XG4gICAgICAvLyBTeW5jaHJvbml6ZSB0aGUgd2lkdGggb2YgdGhlIGRyYWcgc291cmNlIHBsYWNlaG9sZGVyIHdpdGggdGhlIGRyYWcgcG9pbnRlciBwb3NpdGlvbiB0byBtb3ZlIGFjdGlvbnMgYWxvbmcgd2l0aCB0aGUgcG9pbnRlci5cbiAgICAgIHNldENzc1ZhcmlhYmxlKHRoaXMuX2hvc3QsIHsnLS3JtXBhcnQtYmFyLWRyYWctaW1hZ2UtcGxhY2Vob2xkZXItd2lkdGgnOiBgJHt0aGlzLmNhbGN1bGF0ZURyYWdJbWFnZVBsYWNlaG9sZGVyV2lkdGgoZXZlbnQpfXB4YH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgaW52b2tlZCB3aGVuIHRoZSB1c2VyIGRyb3BzIGEgdGFiIGluIHRoaXMgdGFiYmFyLlxuICAgKi9cbiAgcHJpdmF0ZSBvblRhYmJhckRyb3AoKTogdm9pZCB7XG4gICAgdGhpcy5fdmlld0RyYWdTZXJ2aWNlLmRpc3BhdGNoVmlld01vdmVFdmVudCh7XG4gICAgICBzb3VyY2U6IHtcbiAgICAgICAgd29ya2JlbmNoSWQ6IHRoaXMuX2RyYWdEYXRhIS53b3JrYmVuY2hJZCxcbiAgICAgICAgcGFydElkOiB0aGlzLl9kcmFnRGF0YSEucGFydElkLFxuICAgICAgICB2aWV3SWQ6IHRoaXMuX2RyYWdEYXRhIS52aWV3SWQsXG4gICAgICAgIGFsdGVybmF0aXZlVmlld0lkOiB0aGlzLl9kcmFnRGF0YSEuYWx0ZXJuYXRpdmVWaWV3SWQsXG4gICAgICAgIHZpZXdVcmxTZWdtZW50czogdGhpcy5fZHJhZ0RhdGEhLnZpZXdVcmxTZWdtZW50cyxcbiAgICAgICAgbmF2aWdhdGlvbkhpbnQ6IHRoaXMuX2RyYWdEYXRhIS5uYXZpZ2F0aW9uSGludCxcbiAgICAgICAgbmF2aWdhdGlvbkRhdGE6IHRoaXMuX2RyYWdEYXRhIS5uYXZpZ2F0aW9uRGF0YSxcbiAgICAgICAgY2xhc3NMaXN0OiB0aGlzLl9kcmFnRGF0YSEuY2xhc3NMaXN0LFxuICAgICAgfSxcbiAgICAgIHRhcmdldDoge1xuICAgICAgICB3b3JrYmVuY2hJZDogdGhpcy5fd29ya2JlbmNoSWQsXG4gICAgICAgIHBvc2l0aW9uOiB0aGlzLmRyb3BUYXJnZXRWaWV3VGFiID09PSAnZW5kJyA/ICdlbmQnIDogdGhpcy5fdmlld1RhYnMoKS5pbmRleE9mKHRoaXMuZHJvcFRhcmdldFZpZXdUYWIhKSxcbiAgICAgICAgZWxlbWVudElkOiB0aGlzLnBhcnQuaWQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gV2FpdCB1bmRvaW5nIHRoZSBkcmFnIHN0YXRlIHVudGlsIGZsdXNoZWQgdGFiIGNoYW5nZXMgdG8gdGhlIERPTSwgaS5lLiwgYWZ0ZXIgdGhlIGxheW91dCByb3V0aW5nIGN5Y2xlIGNvbXBsZXRlcy5cbiAgICAvLyBJZiB3ZSB3ZXJlIHRvIHVuZG8gdGhlIGRyYWcgc3RhdGUgaW1tZWRpYXRlbHkgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgdGhlIGRyb3AgZXZlbnQsIHRoZSB0YWIgbGF5b3V0IHdvdWxkIHRlbXBvcmFyaWx5XG4gICAgLy8gcmV2ZXJ0IHRvIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIGRyYWcgb3BlcmF0aW9uLCByZXN1bHRpbmcgaW4gYW4gdWdseSBmbGlja2VyLlxuICAgIGZpcnN0VmFsdWVGcm9tKHRoaXMuX3dvcmtiZW5jaExheW91dFNlcnZpY2Uub25MYXlvdXRDaGFuZ2UkKS50aGVuKCgpID0+IHtcbiAgICAgIHRoaXMudW5zZXREcmFnU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2NhdGVzIHRoZSB0YWIgYmVmb3JlIHdoaWNoIHRoZSBkcmFnZ2VkIHRhYiBpcyB0byBiZSBpbnNlcnRlZCB3aGVuIGl0IGlzIGRyb3BwZWQuIERyYWdnaW5nIGJleW9uZCB0aGUgbGFzdCB0YWIgcmV0dXJucyBgZW5kYC5cbiAgICovXG4gIHB1YmxpYyBjb21wdXRlRHJvcFRhcmdldChldmVudDogRHJhZ0V2ZW50KTogVmlld1RhYkNvbXBvbmVudCB8ICdlbmQnIHtcbiAgICBjb25zdCB2aWV3RHJhZ0ltYWdlUmVjdCA9IHRoaXMuX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlci5jYWxjdWxhdGVEcmFnSW1hZ2VSZWN0KHRoaXMuX2RyYWdEYXRhISwgZXZlbnQpO1xuICAgIGNvbnN0IHZpZXdUYWJzID0gdGhpcy5fdmlld1RhYnMoKS5maWx0ZXIodmlld1RhYiA9PiB2aWV3VGFiICE9PSB0aGlzLmRyYWdTb3VyY2VWaWV3VGFiKTtcblxuICAgIGZvciAoY29uc3Qgdmlld1RhYiBvZiB2aWV3VGFicykge1xuICAgICAgY29uc3Qgdmlld1RhYlJlY3QgPSB2aWV3VGFiLmhvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB2aWV3VGFiTWlkZGxlID0gdmlld1RhYlJlY3QubGVmdCArICh2aWV3VGFiUmVjdC53aWR0aCAvIDIpO1xuICAgICAgaWYgKHZpZXdEcmFnSW1hZ2VSZWN0LmxlZnQgPCB2aWV3VGFiTWlkZGxlICYmICh2aWV3VGFiICE9PSB0aGlzLmRyb3BUYXJnZXRWaWV3VGFiIHx8IHZpZXdEcmFnSW1hZ2VSZWN0LnJpZ2h0IDwgdmlld1RhYk1pZGRsZSkpIHtcbiAgICAgICAgcmV0dXJuIHZpZXdUYWI7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiAnZW5kJztcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBmdW5jdGlvbiBmb3Igc25hcHBpbmcgdGhlIGRyYWcgaW1hZ2UgdG8gdGhlIHRhYmJhciB3aGVuIGRyYWdnaW5nIG5lYXIgaXQuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZURyYWdJbWFnZUNvbnN0cmFpbkZuKCk6IENvbnN0cmFpbkZuIHtcbiAgICBjb25zdCBob3N0TGVmdCA9IHRoaXMuX2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcbiAgICBjb25zdCBtYXhWaWV3cG9ydFdpZHRoID0gdGhpcy5jYWxjdWxhdGVNYXhWaWV3cG9ydFdpZHRoKCk7XG4gICAgcmV0dXJuIChyZWN0OiBWaWV3RHJhZ0ltYWdlUmVjdCk6IFZpZXdEcmFnSW1hZ2VSZWN0ID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0Qm91bmRpbmdCb3ggPSB0aGlzLl92aWV3cG9ydENvbXBvbmVudEVsZW1lbnQoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgcmV0dXJuIG5ldyBWaWV3RHJhZ0ltYWdlUmVjdCh7XG4gICAgICAgIHg6IE1hdGgubWluKE1hdGgubWF4KGhvc3RMZWZ0ICsgdGhpcy5fdGFiYmFySW5kZW50LmxlZnQsIHJlY3QueCksIGhvc3RMZWZ0ICsgbWF4Vmlld3BvcnRXaWR0aCAtIHJlY3Qud2lkdGggLSB0aGlzLl90YWJiYXJJbmRlbnQucmlnaHQpLFxuICAgICAgICB5OiB2aWV3cG9ydEJvdW5kaW5nQm94LnRvcCxcbiAgICAgICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgICAgIGhlaWdodDogdmlld3BvcnRCb3VuZGluZ0JveC5oZWlnaHQsIC8vIGZpdCBpbnRvIHRhYmJhciwgZS5nLiwgd2hlbiBkcmFnZ2luZyBhIHRhYiBpbnRvIGEgdGFiYmFyIG9mIGEgZGlmZmVyZW50IGhlaWdodFxuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxjdWxhdGVzIHRoZSBtYXhpbXVtIHdpZHRoIG9mIHRoZSB0YWJiYXIgdmlld3BvcnQgYmVmb3JlIGFuIG92ZXJmbG93IHdvdWxkIG9jY3VyLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgZHJhZyBpbWFnZS5cbiAgICpcbiAgICogVG8gY2FsY3VsYXRlIHRoZSBlZmZlY3RpdmUgd2lkdGgsIHdlIG5lZWQgdG8gc2ltdWxhdGUgYW4gb3ZlcmZsb3cgaW4gdGhlIERPTS4gVGhlcmVmb3JlLCBjYWxsIHRoaXMgbWV0aG9kIG9ubHkgZnJvbSBgZHJhZ3N0YXJ0YCBhbmQgbm90XG4gICAqIGZyb20gYGRyYWdvdmVyYCBhbmQgZGlzYWJsZSBhbmltYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBjYWxjdWxhdGVNYXhWaWV3cG9ydFdpZHRoKCk6IG51bWJlciB7XG4gICAgY29uc3QgY3VycmVudFdpZHRoID0gdGhpcy5faG9zdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCctLcm1cGFydC1iYXItZHJhZy1pbWFnZS1wbGFjZWhvbGRlci13aWR0aCcpO1xuXG4gICAgLy8gRGlzYWJsZSBhbmltYXRpb25zIGR1cmluZyBjYWxjdWxhdGlvbiBhbmQgZm9yY2UgdGhlIHZpZXdwb3J0IHRvIG92ZXJmbG93LlxuICAgIHNldENzc0NsYXNzKHRoaXMuX2hvc3QsICdjYWxjdWxhdGluZy1tYXgtdmlld3BvcnQtd2lkdGgnKTtcbiAgICBzZXRDc3NWYXJpYWJsZSh0aGlzLl9ob3N0LCB7Jy0tybVwYXJ0LWJhci1kcmFnLWltYWdlLXBsYWNlaG9sZGVyLXdpZHRoJzogYCR7dGhpcy5faG9zdC5jbGllbnRXaWR0aH1weGB9KTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q29tcG9uZW50RWxlbWVudCgpLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgc2V0Q3NzVmFyaWFibGUodGhpcy5faG9zdCwgeyctLcm1cGFydC1iYXItZHJhZy1pbWFnZS1wbGFjZWhvbGRlci13aWR0aCc6IGN1cnJlbnRXaWR0aCB8fCBudWxsfSk7XG4gICAgICB1bnNldENzc0NsYXNzKHRoaXMuX2hvc3QsICdjYWxjdWxhdGluZy1tYXgtdmlld3BvcnQtd2lkdGgnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyB0aGUgd2lkdGggZm9yIHRoZSBkcmFnIGltYWdlIHBsYWNlaG9sZGVyLlxuICAgKlxuICAgKiAtIFdoZW4gZHJhZ2dpbmcgb3ZlciB0YWJzLCB0aGUgd2lkdGggaXMgZXF1YWwgdG8gdGhlIHdpZHRoIG9mIHRoZSBkcmFnIHNvdXJjZS5cbiAgICogLSBXaGVuIGRyYWdnaW5nIHRvIHRoZSByaWdodCBvZiB0aGUgbGFzdCB0YWIsIHRoZSB3aWR0aCBvZiB0aGUgcGxhY2Vob2xkZXIgaXMgY2FsY3VsYXRlZCBhcyB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGVcbiAgICogICBsYXN0IHRhYiBhbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBkcmFnb3ZlciBldmVudC4gQXBwbHlpbmcgdGhpcyB3aWR0aCB3aWxsIHJlc2l6ZSB0aGUgdmlld3BvcnQsIG1vdmluZyBwYXJ0IGFjdGlvbnMgYWxvbmdcbiAgICogICB3aXRoIHRoZSBkcmFnb3ZlciBldmVudC5cbiAgICovXG4gIHByaXZhdGUgY2FsY3VsYXRlRHJhZ0ltYWdlUGxhY2Vob2xkZXJXaWR0aChldmVudDogRHJhZ0V2ZW50KTogbnVtYmVyIHtcbiAgICBjb25zdCB2aWV3RHJhZ0ltYWdlUmVjdCA9IHRoaXMuX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlci5jYWxjdWxhdGVEcmFnSW1hZ2VSZWN0KHRoaXMuX2RyYWdEYXRhISwgZXZlbnQpO1xuICAgIGNvbnN0IGxhc3RWaWV3VGFiID0gdGhpcy5fdmlld1RhYnMoKS5maWx0ZXIodmlld1RhYiA9PiB2aWV3VGFiICE9PSB0aGlzLmRyYWdTb3VyY2VWaWV3VGFiKS5hdCgtMSk7XG4gICAgY29uc3QgbGFzdFZpZXdUYWJSaWdodCA9IGxhc3RWaWV3VGFiPy5ob3N0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0ID8/IHRoaXMuX2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCArIHRoaXMuX3RhYmJhckluZGVudC5sZWZ0O1xuICAgIHJldHVybiBNYXRoLm1heChsYXN0Vmlld1RhYlJpZ2h0ICsgdmlld0RyYWdJbWFnZVJlY3Qud2lkdGgsIHZpZXdEcmFnSW1hZ2VSZWN0LnJpZ2h0KSAtIGxhc3RWaWV3VGFiUmlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgQ1NTIGFuaW1hdGlvbnMgaGF2ZSBmaW5pc2hlZCB3aGVuIGRyYWdnaW5nIGEgdGFiIG92ZXIgdGhlIHRhYmJhci5cbiAgICogVGhlIGFuaW1hdGlvbiBpcyBjb25zaWRlcmVkIHN0YWJsZSB3aGVuIGFsbCB0YWJzIGhhdmUgbW92ZWQgdG8gdGhlaXIgZmluYWwgcG9zaXRpb24uXG4gICAqL1xuICBwcml2YXRlIGlzRHJhZ0FuaW1hdGlvblN0YWJsZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZHJvcFRhcmdldFZpZXdUYWIpIHtcbiAgICAgIHJldHVybiB0aGlzLl92aWV3VGFicygpLmV2ZXJ5KHZpZXdUYWIgPT4gZ2V0Q3NzVHJhbnNsYXRpb24odmlld1RhYi5ob3N0KS50cmFuc2xhdGVYID09PSAnbm9uZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHZpZXdUYWJzID0gdGhpcy5fdmlld1RhYnMoKS5maWx0ZXIodmlld1RhYiA9PiB2aWV3VGFiICE9PSB0aGlzLmRyYWdTb3VyY2VWaWV3VGFiKTtcbiAgICBjb25zdCBkcm9wVGFyZ2V0SW5kZXggPSB0aGlzLmRyb3BUYXJnZXRWaWV3VGFiID09PSAnZW5kJyA/IHZpZXdUYWJzLmxlbmd0aCA6IHZpZXdUYWJzLmluZGV4T2YodGhpcy5kcm9wVGFyZ2V0Vmlld1RhYiEpO1xuICAgIGNvbnN0IGRyYWdTb3VyY2VXaWR0aCA9IHRoaXMuX2RyYWdEYXRhIS52aWV3VGFiV2lkdGg7XG5cbiAgICByZXR1cm4gdmlld1RhYnMuZXZlcnkoKHZpZXdUYWIsIGkpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdUYWJUcmFuc2xhdGVYID0gZ2V0Q3NzVHJhbnNsYXRpb24odmlld1RhYi5ob3N0KS50cmFuc2xhdGVYO1xuICAgICAgLy8gRXhwZWN0IHRhYnMgcHJlY2VkaW5nIHRoZSBkcm9wIHRhcmdldCBub3QgdG8gYmUgc2hpZnRlZCB0byB0aGUgcmlnaHQuXG4gICAgICBpZiAoaSA8IGRyb3BUYXJnZXRJbmRleCAmJiB2aWV3VGFiVHJhbnNsYXRlWCAhPT0gJ25vbmUnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIEV4cGVjdCBkcm9wIHRhcmdldCBhbmQgdGFicyBmb2xsb3dpbmcgdGhlIGRyb3AgdGFyZ2V0IHRvIGJlIHNoaWZ0ZWQgdG8gdGhlIHJpZ2h0LlxuICAgICAgaWYgKGkgPj0gZHJvcFRhcmdldEluZGV4ICYmIE1hdGguZmxvb3IoTnVtYmVyKHZpZXdUYWJUcmFuc2xhdGVYKSkgIT09IE1hdGguZmxvb3IoZHJhZ1NvdXJjZVdpZHRoKSkgeyAvLyBjb21wYXJlIGZsb29yZWQgbnVtYmVycyBiZWNhdXNlIGB0cmFuc2xhdGVYYCBpcyBub3QgcHJlY2lzZVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdW5zZXREcmFnU3RhdGUob3B0aW9ucz86IHt1bnNldERyYWdTb3VyY2U/OiBib29sZWFufSk6IHZvaWQge1xuICAgIGlmIChvcHRpb25zPy51bnNldERyYWdTb3VyY2UgPz8gdHJ1ZSkge1xuICAgICAgdGhpcy5kcmFnU291cmNlVmlld1RhYiA9IG51bGw7XG4gICAgfVxuXG4gICAgdGhpcy5kcm9wVGFyZ2V0Vmlld1RhYiA9IG51bGw7XG4gICAgdGhpcy5fZHJhZ0RhdGEgPSBudWxsO1xuICAgIHRoaXMuX3ZpZXdUYWJEcmFnSW1hZ2VSZW5kZXJlci51bnNldENvbnN0cmFpbkRyYWdJbWFnZVJlY3RGbih0aGlzLl9jb25zdHJhaW5GbiEpO1xuICAgIHRoaXMuX2NvbnN0cmFpbkZuID0gbnVsbDtcblxuICAgIHVuc2V0Q3NzQ2xhc3ModGhpcy5faG9zdCwgJ2RyYWctb3ZlcicpO1xuICAgIHVuc2V0Q3NzVmFyaWFibGUodGhpcy5faG9zdCwgJy0tybVwYXJ0LWJhci1kcmFnLXNvdXJjZS13aWR0aCcsICctLcm1cGFydC1iYXItZHJhZy1pbWFnZS1wbGFjZWhvbGRlci13aWR0aCcpO1xuICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS51bnNldFRhYmJhckRyYWdvdmVyKHRoaXMucGFydC5pZCk7XG4gIH1cblxuICAvKipcbiAgICogU2Nyb2xscyB0aGUgdGFiIG9mIHRoZSBhY3RpdmUgdmlldyBpbnRvIHZpZXcuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxBY3RpdmVWaWV3U2Nyb2xsZXIoKTogdm9pZCB7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHZpZXdwb3J0Q29tcG9uZW50ID0gdGhpcy5fdmlld3BvcnRDb21wb25lbnQoKTtcbiAgICAgIGNvbnN0IGFjdGl2ZVZpZXdJZCA9IHRoaXMucGFydC5hY3RpdmVWaWV3SWQoKTtcblxuICAgICAgLy8gVGhlcmUgbWF5IGJlIG5vIGFjdGl2ZSB2aWV3IGluIHRoZSB0YWJiYXIsIGUuZy4sIHdoZW4gZHJhZ2dpbmcgdGhlIGxhc3QgdmlldyBvdXQgb2YgdGhlIHRhYmJhci5cbiAgICAgIGNvbnN0IGFjdGl2ZVZpZXdUYWIgPSB0aGlzLl92aWV3VGFicygpLmZpbmQodmlld1RhYiA9PiB2aWV3VGFiLnZpZXdJZCA9PT0gYWN0aXZlVmlld0lkKTtcbiAgICAgIGlmIChhY3RpdmVWaWV3VGFiICYmICF2aWV3cG9ydENvbXBvbmVudC5pc0VsZW1lbnRJblZpZXcoYWN0aXZlVmlld1RhYi5ob3N0LCAnZnVsbCcpKSB7XG4gICAgICAgIHVudHJhY2tlZCgoKSA9PiB2aWV3cG9ydENvbXBvbmVudC5zY3JvbGxJbnRvVmlldyhhY3RpdmVWaWV3VGFiLmhvc3QpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIHtAbGluayDJtVdvcmtiZW5jaFZpZXd9IHdoZW4gaXRzIHRhYiBpcyBzY3JvbGxlZCBpbnRvIHZpZXcuXG4gICAqL1xuICBwcml2YXRlIGluc3RhbGxTY3JvbGxlZEludG9WaWV3VXBkYXRlcigpOiB2b2lkIHtcbiAgICB0aGlzLl92aWV3cG9ydENoYW5nZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKCkgPT4gdGhpcy5fdmlld1RhYnMoKSksXG4gICAgICAgIGZpbHRlckFycmF5KHZpZXdUYWIgPT4gdmlld1RhYiAhPT0gdGhpcy5kcmFnU291cmNlVmlld1RhYiksIC8vIHNraXAgZHJhZyBzb3VyY2UgYXMgYWx3YXlzIHNjcm9sbGVkIG91dCBvZiB2aWV3XG4gICAgICAgIG1lcmdlTWFwKHZpZXdUYWJzID0+IGZyb20odmlld1RhYnMpKSxcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKHZpZXdUYWIgPT4ge1xuICAgICAgICB2aWV3VGFiLnZpZXcoKS5zY3JvbGxlZEludG9WaWV3ID0gdGhpcy5fdmlld3BvcnRDb21wb25lbnQoKS5pc0VsZW1lbnRJblZpZXcodmlld1RhYi5ob3N0LCAnZnVsbCcpO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGluc3RhbGxWaWV3RHJhZ0xpc3RlbmVyKCk6IHZvaWQge1xuICAgIHRoaXMuX3ZpZXdEcmFnU2VydmljZS52aWV3RHJhZyQodGhpcy5faG9zdClcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCgpKVxuICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IERyYWdFdmVudCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdkcmFnZW50ZXInOlxuICAgICAgICAgICAgdGhpcy5vblRhYmJhckRyYWdFbnRlcihldmVudCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBjYXNlICdkcmFnb3Zlcic6XG4gICAgICAgICAgICB0aGlzLm9uVGFiYmFyRHJhZ092ZXIoZXZlbnQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnZHJhZ2xlYXZlJzpcbiAgICAgICAgICAgIHRoaXMub25UYWJiYXJEcmFnTGVhdmUoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgICAgICAgdGhpcy5vblRhYmJhckRyb3AoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbFZpZXdwb3J0Q2hhbmdlVHJhY2tlcigpOiB2b2lkIHtcbiAgICBjb25zdCB2aWV3cG9ydFNpemUgPSBkaW1lbnNpb24oY29tcHV0ZWQoKCkgPT4gdGhpcy5fdmlld3BvcnRDb21wb25lbnRFbGVtZW50KCkubmF0aXZlRWxlbWVudCkpO1xuICAgIGNvbnN0IHZpZXdwb3J0Q2xpZW50U2l6ZSA9IGRpbWVuc2lvbihjb21wdXRlZCgoKSA9PiB0aGlzLl92aWV3cG9ydENvbXBvbmVudCgpLnZpZXdwb3J0Q2xpZW50RWxlbWVudCkpO1xuICAgIGNvbnN0IHpvbmUgPSBpbmplY3QoTmdab25lKTtcblxuICAgIC8vIERldGVjdCByZXNpemluZy5cbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgLy8gVHJhY2sgdmlld3BvcnQgYW5kIHZpZXdwb3J0IGNsaWVudCBzaXplcy5cbiAgICAgIHZpZXdwb3J0U2l6ZSgpO1xuICAgICAgdmlld3BvcnRDbGllbnRTaXplKCk7XG4gICAgICB1bnRyYWNrZWQoKCkgPT4gdGhpcy5fdmlld3BvcnRDaGFuZ2UkLm5leHQoKSk7XG4gICAgfSk7XG5cbiAgICAvLyBEZXRlY3Qgc2Nyb2xsaW5nLlxuICAgIGVmZmVjdChvbkNsZWFudXAgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnQgPSB0aGlzLl92aWV3cG9ydENvbXBvbmVudCgpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgIHVudHJhY2tlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IGZyb21FdmVudCh2aWV3cG9ydCwgJ3Njcm9sbCcpXG4gICAgICAgICAgLnBpcGUoc3Vic2NyaWJlSW4oZm4gPT4gem9uZS5ydW5PdXRzaWRlQW5ndWxhcihmbikpKVxuICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5fdmlld3BvcnRDaGFuZ2UkLm5leHQoKSk7XG4gICAgICAgIG9uQ2xlYW51cCgoKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zdGFsbFRhYmJhckluZGVudFNpemVUcmFja2VyKCk6IHZvaWQge1xuICAgIGNvbnN0IHRhYkNvcm5lclJhZGl1c0RpbWVuc2lvbiA9IGRpbWVuc2lvbih0aGlzLl90YWJDb3JuZXJSYWRpdXNFbGVtZW50KTtcbiAgICBjb25zdCBwYWRkaW5nSW5saW5lRGltZW5zaW9uID0gZGltZW5zaW9uKHRoaXMuX3BhZGRpbmdJbmxpbmVFbGVtZW50KTtcblxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBpbmRlbnQgPSB0YWJDb3JuZXJSYWRpdXNEaW1lbnNpb24oKS5jbGllbnRXaWR0aCArIHBhZGRpbmdJbmxpbmVEaW1lbnNpb24oKS5jbGllbnRXaWR0aDtcbiAgICAgIHRoaXMuX3RhYmJhckluZGVudCA9IHtsZWZ0OiBpbmRlbnQsIHJpZ2h0OiBpbmRlbnR9O1xuICAgICAgc2V0Q3NzVmFyaWFibGUodGhpcy5faG9zdCwge1xuICAgICAgICAnLS3JtXBhcnQtYmFyLWluZGVudC1sZWZ0JzogYCR7dGhpcy5fdGFiYmFySW5kZW50LmxlZnR9cHhgLFxuICAgICAgICAnLS3JtXBhcnQtYmFyLWluZGVudC1yaWdodCc6IGAke3RoaXMuX3RhYmJhckluZGVudC5yaWdodH1weGAsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiPHNjaS12aWV3cG9ydCBjbGFzcz1cInRhYmJhclwiIHNjcm9sbGJhclN0eWxlPVwiaGlkZGVuXCIgW2NsYXNzLmRyYWdvdmVyXT1cImRyYWdvdmVyJCB8IGFzeW5jXCI+XG4gIEBmb3IgKHZpZXdJZCBvZiBwYXJ0LnZpZXdJZHMoKTsgdHJhY2sgdmlld0lkKSB7XG4gICAgQGlmICh2aWV3dGFiID09PSBkcm9wVGFyZ2V0Vmlld1RhYikge1xuICAgICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICB9XG4gICAgPHdiLXZpZXctdGFiICN2aWV3dGFiXG4gICAgICAgICAgICAgICAgIFt2aWV3SWRdPVwidmlld0lkXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmRyYWctc291cmNlXT1cInZpZXd0YWIgPT09IGRyYWdTb3VyY2VWaWV3VGFiXCJcbiAgICAgICAgICAgICAgICAgW2NsYXNzLmRyb3AtdGFyZ2V0XT1cInZpZXd0YWIgPT09IGRyb3BUYXJnZXRWaWV3VGFiXCIvPlxuICAgIDxkaXYgY2xhc3M9XCJkaXZpZGVyXCI+PC9kaXY+XG4gIH1cblxuICA8IS0tIFBsYWNlaG9sZGVyIGVsZW1lbnQgdG8gZ3JvdyB0aGUgdmlld3BvcnQgdG8gZml0IHRoZSBkcmFnIGltYWdlLiAtLT5cbiAgPGRpdiBjbGFzcz1cImRyYWctaW1hZ2UtcGxhY2Vob2xkZXJcIj48L2Rpdj5cbjwvc2NpLXZpZXdwb3J0PlxuPHdiLXBhcnQtYWN0aW9uLWJhci8+XG48d2Itdmlldy1saXN0LWJ1dHRvbi8+XG5cbjwhLS0gRWxlbWVudCBmb3IgaW5qZWN0aW5nIHRoZSBjb3JuZXIgcmFkaXVzIGludG8gdGhlIGNvbXBvbmVudC4gLS0+XG48ZGl2IGNsYXNzPVwidGFiLWNvcm5lci1yYWRpdXNcIiAjdGFiX2Nvcm5lcl9yYWRpdXM+PC9kaXY+XG48IS0tIEVsZW1lbnQgZm9yIGluamVjdGluZyB0aGUgdGFiYmFyIHBhZGRpbmcgaW50byB0aGUgY29tcG9uZW50LiAtLT5cbjxkaXYgY2xhc3M9XCJwYWRkaW5nLWlubGluZVwiICNwYWRkaW5nX2lubGluZT48L2Rpdj5cbiJdfQ==
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Copyright (c) 2018-2023 Swiss Federal Railways
|
|
3
|
-
*
|
|
4
|
-
* This program and the accompanying materials are made
|
|
5
|
-
* available under the terms of the Eclipse Public License 2.0
|
|
6
|
-
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
7
|
-
*
|
|
8
|
-
* SPDX-License-Identifier: EPL-2.0
|
|
9
|
-
*/
|
|
10
|
-
import { inject, Injector, Pipe } from '@angular/core';
|
|
11
|
-
import { WORKBENCH_PART_REGISTRY } from './workbench-part.registry';
|
|
12
|
-
import * as i0 from "@angular/core";
|
|
13
|
-
/**
|
|
14
|
-
* Constructs the portal for the given part in the calling injection context,
|
|
15
|
-
* or throws an error if the part is not registered.
|
|
16
|
-
*/
|
|
17
|
-
export class PartPortalPipe {
|
|
18
|
-
constructor() {
|
|
19
|
-
this._partRegistry = inject(WORKBENCH_PART_REGISTRY);
|
|
20
|
-
this._injector = inject(Injector);
|
|
21
|
-
}
|
|
22
|
-
transform(partId) {
|
|
23
|
-
if (!partId) {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
return this._partRegistry.get(partId).createPortalFromInjectionContext(this._injector);
|
|
27
|
-
}
|
|
28
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartPortalPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
29
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.0.2", ngImport: i0, type: PartPortalPipe, isStandalone: true, name: "wbPartPortal" }); }
|
|
30
|
-
}
|
|
31
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: PartPortalPipe, decorators: [{
|
|
32
|
-
type: Pipe,
|
|
33
|
-
args: [{ name: 'wbPartPortal', standalone: true }]
|
|
34
|
-
}] });
|
|
35
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFydC1wb3J0YWwucGlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjaW9uL3dvcmtiZW5jaC9zcmMvbGliL3BhcnQvcGFydC1wb3J0YWwucGlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBZ0IsTUFBTSxlQUFlLENBQUM7QUFDcEUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7O0FBS2xFOzs7R0FHRztBQUVILE1BQU0sT0FBTyxjQUFjO0lBRDNCO1FBR21CLGtCQUFhLEdBQUcsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUM7UUFDaEQsY0FBUyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztLQVMvQztJQVBRLFNBQVMsQ0FBQyxNQUFxQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGdDQUFnQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN6RixDQUFDOzhHQVhVLGNBQWM7NEdBQWQsY0FBYzs7MkZBQWQsY0FBYztrQkFEMUIsSUFBSTttQkFBQyxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtMjAyMyBTd2lzcyBGZWRlcmFsIFJhaWx3YXlzXG4gKlxuICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZVxuICogYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAyLjBcbiAqIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wL1xuICpcbiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuaW1wb3J0IHtpbmplY3QsIEluamVjdG9yLCBQaXBlLCBQaXBlVHJhbnNmb3JtfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7V09SS0JFTkNIX1BBUlRfUkVHSVNUUll9IGZyb20gJy4vd29ya2JlbmNoLXBhcnQucmVnaXN0cnknO1xuaW1wb3J0IHR5cGUge1BhcnRDb21wb25lbnR9IGZyb20gJy4vcGFydC5jb21wb25lbnQnO1xuaW1wb3J0IHR5cGUge01haW5BcmVhTGF5b3V0Q29tcG9uZW50fSBmcm9tICcuLi9sYXlvdXQvbWFpbi1hcmVhLWxheW91dC9tYWluLWFyZWEtbGF5b3V0LmNvbXBvbmVudCc7XG5pbXBvcnQge0NvbXBvbmVudFBvcnRhbH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BvcnRhbCc7XG5cbi8qKlxuICogQ29uc3RydWN0cyB0aGUgcG9ydGFsIGZvciB0aGUgZ2l2ZW4gcGFydCBpbiB0aGUgY2FsbGluZyBpbmplY3Rpb24gY29udGV4dCxcbiAqIG9yIHRocm93cyBhbiBlcnJvciBpZiB0aGUgcGFydCBpcyBub3QgcmVnaXN0ZXJlZC5cbiAqL1xuQFBpcGUoe25hbWU6ICd3YlBhcnRQb3J0YWwnLCBzdGFuZGFsb25lOiB0cnVlfSlcbmV4cG9ydCBjbGFzcyBQYXJ0UG9ydGFsUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3BhcnRSZWdpc3RyeSA9IGluamVjdChXT1JLQkVOQ0hfUEFSVF9SRUdJU1RSWSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2luamVjdG9yID0gaW5qZWN0KEluamVjdG9yKTtcblxuICBwdWJsaWMgdHJhbnNmb3JtKHBhcnRJZDogc3RyaW5nIHwgbnVsbCk6IENvbXBvbmVudFBvcnRhbDxQYXJ0Q29tcG9uZW50IHwgTWFpbkFyZWFMYXlvdXRDb21wb25lbnQ+IHwgbnVsbCB7XG4gICAgaWYgKCFwYXJ0SWQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9wYXJ0UmVnaXN0cnkuZ2V0KHBhcnRJZCkuY3JlYXRlUG9ydGFsRnJvbUluamVjdGlvbkNvbnRleHQodGhpcy5faW5qZWN0b3IpO1xuICB9XG59XG4iXX0=
|