/********************************************************************************
 * Copyright (C) 2020 EclipseSource 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 { ContributionProvider , MaybePromise , Prioritizeable } from '@theia/core' ; import { inject , injectable , named , postConstruct } from '@theia/core/shared/inversify' ; import { PropertyDataService } from './property-data-service' ; import { PropertyViewContentWidget } from './property-view-content-widget' ; export const PropertyViewWidgetProvider = Symbol ( 'PropertyViewWidgetProvider' ) ; export interface PropertyViewWidgetProvider { /**
     * A unique id for this provider.
     */ id : string ; /**
     * A human-readable name for this provider.
     */ label ? : string ; param selection returns canHandle ( selection ) : MaybePromise < number > ; param selection returns provideWidget ( selection ) : Promise < PropertyViewContentWidget > ; param selection returns updateContentWidget ( selection ) : void ; } /**
 * `DefaultPropertyViewWidgetProvider` should be extended to provide a new content property view widget for the given selection.
 */ @ injectable ( ) export abstract class DefaultPropertyViewWidgetProvider implements PropertyViewWidgetProvider { @ inject ( ContributionProvider ) @ named ( PropertyDataService ) protected readonly contributions : ContributionProvider < PropertyDataService > ; protected propertyDataServices : PropertyDataService [ ] = [ ] ; id = 'default' ; label = 'DefaultPropertyViewWidgetProvider' ; @ postConstruct ( ) init ( ) { this . propertyDataServices = this . propertyDataServices . concat ( this . contributions . getContributions ( ) ) ; } canHandle ( selection ) { return 0 ; } provideWidget ( selection ) { throw new Error ( 'not implemented' ) ; } updateContentWidget ( selection ) { } protected async getPropertyDataService ( selection ) { const dataService = await this . prioritize ( selection ) ; return dataService ?? this . propertyDataServices [ 0 ] ; } protected async prioritize ( selection ) { const prioritized = await Prioritizeable . prioritizeAll ( this . propertyDataServices , async ( service ) => { try { return service . canHandleSelection ( selection ) ; } catch { return 0 ; } } ) ; return prioritized . length !== 0 ? prioritized [ 0 ] . value : undefined ; } }