/********************************************************************************
 * Copyright (C) 2018 Ericsson and others.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0.
 *
 * This Source Code may also be made available under the following Secondary
 * Licenses when the conditions for such availability set forth in the Eclipse
 * Public License v. 2.0 are satisfied: GNU General Public License, version 2
 * with the GNU Classpath Exception which is available at
 * https://www.gnu.org/software/classpath/license.html.
 *
 * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
 ********************************************************************************/ import { SelectionService } from '../common/selection-service' ; import { UriSelection } from '../common/selection' ; import { CommandHandler } from './command' ; import { MaybeArray } from '.' ; import URI from './uri' ; export interface UriCommandHandler < T extends MaybeArray < URI > > extends CommandHandler { execute ( uri , ... args ) : any ; isEnabled ? ( uri , ... args ) : boolean ; isVisible ? ( uri , ... args ) : boolean ; } /**
 * Handler for a single URI-based selection.
 */ export interface SingleUriCommandHandler extends UriCommandHandler < URI > { } /**
 * Handler for multiple URIs.
 */ export interface MultiUriCommandHandler extends UriCommandHandler < URI [ ] > { } export class UriAwareCommandHandler < T extends MaybeArray < URI > > implements UriCommandHandler < T > { deprecated constructor ( protected readonly selectionService , protected readonly handler , protected readonly options ? ) { } protected getUri ( ... args ) { const [ maybeUriArray ] = args ; const firstArgIsOK = this . isMulti ( ) ? Array . isArray ( maybeUriArray ) && maybeUriArray . every ( uri => uri instanceof URI ) : maybeUriArray instanceof URI ; if ( firstArgIsOK ) { return maybeUriArray ; } const { selection } = this . selectionService ; const uriOrUris = this . isMulti ( ) ? UriSelection . getUris ( selection ) : UriSelection . getUri ( selection ) ; return uriOrUris as T ; } protected getArgsWithUri ( ... args ) { const uri = this . getUri ( ... args ) ; const [ maybeUri , ... others ] = args ; if ( uri === maybeUri ) { return [ maybeUri , ... others ] ; } return [ uri , ... args ] ; } execute ( ... args ) { const [ uri , ... others ] = this . getArgsWithUri ( ... args ) ; return uri ? this . handler . execute ( uri , ... others ) : undefined ; } isVisible ( ... args ) { const [ uri , ... others ] = this . getArgsWithUri ( ... args ) ; if ( uri ) { if ( this . handler . isVisible ) { return this . handler . isVisible ( uri , ... others ) ; } return true ; } return false ; } isEnabled ( ... args ) { const [ uri , ... others ] = this . getArgsWithUri ( ... args ) ; if ( uri ) { if ( this . handler . isEnabled ) { return this . handler . isEnabled ( uri , ... others ) ; } return true ; } return false ; } protected isMulti ( ) { return this . options && ! ! this . options . multi ; } } export namespace UriAwareCommandHandler { /**
     * Further options for the URI aware command handler instantiation.
     */ export interface Options { /**
         * `true` if the handler supports multiple selection. Otherwise, `false`. Defaults to `false`.
         */ readonly multi ? : boolean ; } returns export function MonoSelect ( selectionService , handler ) { return new UriAwareCommandHandler < URI > ( selectionService , handler , { multi : false } ) ; } returns export function MultiSelect ( selectionService , handler ) { return new UriAwareCommandHandler < URI [ ] > ( selectionService , handler , { multi : true } ) ; } }