Browse Source

refactored client extensions pattern and naming conventions to match host extensions patterns

Shaddock Heath 9 years ago
parent
commit
fc83321284

+ 42 - 2
Script/AtomicWebViewEditor/clientExtensions/ClientExtensionServices.ts

@@ -21,6 +21,7 @@
 //
 //
 
 
 import ClientExtensionEventNames from "./ClientExtensionEventNames";
 import ClientExtensionEventNames from "./ClientExtensionEventNames";
+import HostInteropType from "../interop";
 
 
 // Entry point for web view extensions -- extensions that live inside the web view
 // Entry point for web view extensions -- extensions that live inside the web view
 interface EventSubscription {
 interface EventSubscription {
@@ -54,7 +55,7 @@ export class EventDispatcher implements Editor.Extensions.EventDispatcher {
 /**
 /**
  * Generic registry for storing Editor Extension Services
  * Generic registry for storing Editor Extension Services
  */
  */
-class ServiceRegistry<T extends Editor.Extensions.ServiceEventListener> implements Editor.Extensions.ServicesProvider<T> {
+class ServicesProvider<T extends Editor.Extensions.ServiceEventListener> implements Editor.Extensions.ServicesProvider<T> {
     registeredServices: T[] = [];
     registeredServices: T[] = [];
 
 
     /**
     /**
@@ -73,7 +74,18 @@ class ServiceRegistry<T extends Editor.Extensions.ServiceEventListener> implemen
     }
     }
 }
 }
 
 
-export class ExtensionServiceRegistry extends ServiceRegistry<Editor.ClientExtensions.WebViewService> {
+export class WebViewServicesProvider extends ServicesProvider<Editor.ClientExtensions.WebViewServiceEventListener> {
+
+    private userPreferences = {};
+
+    /**
+     * Sets the preferences for the service locator
+     * @param  {any} prefs
+     * @return {[type]}
+     */
+    setPreferences(prefs : any) {
+        this.userPreferences = prefs;
+    }
 
 
     /**
     /**
      * Allow this service registry to subscribe to events that it is interested in
      * Allow this service registry to subscribe to events that it is interested in
@@ -208,5 +220,33 @@ export class ExtensionServiceRegistry extends ServiceRegistry<Editor.ClientExten
         });
         });
     }
     }
 
 
+    /**
+     * Returns the Host Interop module
+     * @return {Editor.ClientExtensions.HostInterop}
+     */
+    getHostInterop(): Editor.ClientExtensions.HostInterop {
+        return HostInteropType.getInstance();
+    }
+
+
+    /**
+     * Return a preference value or the provided default from the user settings file
+     * @param  {string} extensionName name of the extension the preference lives under
+     * @param  {string} preferenceName name of the preference to retrieve
+     * @param  {number | boolean | string} defaultValue value to return if pref doesn't exist
+     * @return {number|boolean|string}
+     */
+    getUserPreference(extensionName: string, preferenceName: string, defaultValue?: number | boolean | string): number | boolean | string {
+        if (this.userPreferences) {
+            let extensionPrefs = this.userPreferences["extensions"];
+            if (extensionPrefs && extensionPrefs[extensionName]) {
+                return extensionPrefs[extensionName][preferenceName] || defaultValue;
+            }
+        }
+
+        // if all else fails
+        return defaultValue;
+    }
+
 
 
 }
 }

+ 3 - 44
Script/AtomicWebViewEditor/clientExtensions/ServiceLocator.ts

@@ -19,7 +19,6 @@
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 // THE SOFTWARE.
 // THE SOFTWARE.
 //
 //
-import HostInteropType from "../interop";
 import * as ClientExtensionServices from "./ClientExtensionServices";
 import * as ClientExtensionServices from "./ClientExtensionServices";
 
 
 // Initialize and configure the extensions
 // Initialize and configure the extensions
@@ -34,26 +33,15 @@ import tbExtension from "./languageExtensions/turbobadger/TurboBadgerLanguageExt
 export class ClientServiceLocatorType implements Editor.ClientExtensions.ClientServiceLocator {
 export class ClientServiceLocatorType implements Editor.ClientExtensions.ClientServiceLocator {
 
 
     constructor() {
     constructor() {
-        this.services = new ClientExtensionServices.ExtensionServiceRegistry();
-        this.services.subscribeToEvents(this);
+        this.clientServices = new ClientExtensionServices.WebViewServicesProvider();
+        this.clientServices.subscribeToEvents(this);
     }
     }
 
 
-    private services: ClientExtensionServices.ExtensionServiceRegistry;
     private eventDispatcher: Editor.Extensions.EventDispatcher = new ClientExtensionServices.EventDispatcher();
     private eventDispatcher: Editor.Extensions.EventDispatcher = new ClientExtensionServices.EventDispatcher();
-    private userPreferences = {};
-    
-    /**
-     * Sets the preferences for the service locator
-     * @param  {any} prefs
-     * @return {[type]}
-     */
-    setPreferences(prefs : any) {
-        this.userPreferences = prefs;
-    }
 
 
+    clientServices: ClientExtensionServices.WebViewServicesProvider;
     loadService(service: Editor.ClientExtensions.ClientEditorService) {
     loadService(service: Editor.ClientExtensions.ClientEditorService) {
         try {
         try {
-            this.services.register(service);
             service.initialize(this);
             service.initialize(this);
         } catch (e) {
         } catch (e) {
             alert(`Extension Error:\n Error detected in extension ${service.name}\n \n ${e.stack}`);
             alert(`Extension Error:\n Error detected in extension ${service.name}\n \n ${e.stack}`);
@@ -82,35 +70,6 @@ export class ClientServiceLocatorType implements Editor.ClientExtensions.ClientS
         }
         }
     }
     }
 
 
-    /** Methods available to extensions **/
-
-    /**
-     * Returns the Host Interop module
-     * @return {Editor.ClientExtensions.HostInterop}
-     */
-    getHostInterop(): Editor.ClientExtensions.HostInterop {
-        return HostInteropType.getInstance();
-    }
-
-
-    /**
-     * Return a preference value or the provided default from the user settings file
-     * @param  {string} extensionName name of the extension the preference lives under
-     * @param  {string} preferenceName name of the preference to retrieve
-     * @param  {number | boolean | string} defaultValue value to return if pref doesn't exist
-     * @return {number|boolean|string}
-     */
-    getUserPreference(extensionName: string, preferenceName: string, defaultValue?: number | boolean | string): number | boolean | string {
-        if (this.userPreferences) {
-            let extensionPrefs = this.userPreferences["extensions"];
-            if (extensionPrefs && extensionPrefs[extensionName]) {
-                return extensionPrefs[extensionName][preferenceName] || defaultValue;
-            }
-        }
-
-        // if all else fails
-        return defaultValue;
-    }
 }
 }
 
 
 // Singleton service locator that can be referenced
 // Singleton service locator that can be referenced

+ 2 - 1
Script/AtomicWebViewEditor/clientExtensions/languageExtensions/javascript/JavascriptLanguageExtension.ts

@@ -23,7 +23,7 @@
 /**
 /**
  * Resource extension that handles configuring the editor for Javascript
  * Resource extension that handles configuring the editor for Javascript
  */
  */
-export default class JavascriptLanguageExtension implements Editor.ClientExtensions.WebViewService {
+export default class JavascriptLanguageExtension implements Editor.ClientExtensions.WebViewServiceEventListener {
     name: string = "ClientJavascriptLanguageExtension";
     name: string = "ClientJavascriptLanguageExtension";
     description: string = "Javascript language services for the editor.";
     description: string = "Javascript language services for the editor.";
 
 
@@ -36,6 +36,7 @@ export default class JavascriptLanguageExtension implements Editor.ClientExtensi
     initialize(serviceLocator: Editor.ClientExtensions.ClientServiceLocator) {
     initialize(serviceLocator: Editor.ClientExtensions.ClientServiceLocator) {
         // initialize the language service
         // initialize the language service
         this.serviceLocator = serviceLocator;
         this.serviceLocator = serviceLocator;
+        serviceLocator.clientServices.register(this);
     }
     }
 
 
     /**
     /**

+ 2 - 1
Script/AtomicWebViewEditor/clientExtensions/languageExtensions/turbobadger/TurboBadgerLanguageExtension.ts

@@ -23,7 +23,7 @@
 /**
 /**
  * Resource extension that handles configuring the editor for Javascript
  * Resource extension that handles configuring the editor for Javascript
  */
  */
-export default class TurboBadgerLanguageExtension implements Editor.ClientExtensions.WebViewService {
+export default class TurboBadgerLanguageExtension implements Editor.ClientExtensions.WebViewServiceEventListener {
     name: string = "ClientTurboBadgerLanguageExtension";
     name: string = "ClientTurboBadgerLanguageExtension";
     description: string = "TurboBadger language services for the editor.";
     description: string = "TurboBadger language services for the editor.";
 
 
@@ -36,6 +36,7 @@ export default class TurboBadgerLanguageExtension implements Editor.ClientExtens
     initialize(serviceLocator: Editor.ClientExtensions.ClientServiceLocator) {
     initialize(serviceLocator: Editor.ClientExtensions.ClientServiceLocator) {
         // initialize the language service
         // initialize the language service
         this.serviceLocator = serviceLocator;
         this.serviceLocator = serviceLocator;
+        serviceLocator.clientServices.register(this);
     }
     }
 
 
     /**
     /**

+ 4 - 2
Script/AtomicWebViewEditor/clientExtensions/languageExtensions/typescript/TypescriptLanguageExtension.ts

@@ -28,7 +28,7 @@ import ClientExtensionEventNames from "../../ClientExtensionEventNames";
 /**
 /**
  * Resource extension that handles compiling or transpling typescript on file save.
  * Resource extension that handles compiling or transpling typescript on file save.
  */
  */
-export default class TypescriptLanguageExtension implements Editor.ClientExtensions.WebViewService {
+export default class TypescriptLanguageExtension implements Editor.ClientExtensions.WebViewServiceEventListener {
     name: string = "ClientTypescriptLanguageExtension";
     name: string = "ClientTypescriptLanguageExtension";
     description: string = "This extension handles typescript language features such as completion, compilation, etc.";
     description: string = "This extension handles typescript language features such as completion, compilation, etc.";
 
 
@@ -57,6 +57,7 @@ export default class TypescriptLanguageExtension implements Editor.ClientExtensi
     initialize(serviceLocator: Editor.ClientExtensions.ClientServiceLocator) {
     initialize(serviceLocator: Editor.ClientExtensions.ClientServiceLocator) {
         // initialize the language service
         // initialize the language service
         this.serviceLocator = serviceLocator;
         this.serviceLocator = serviceLocator;
+        serviceLocator.clientServices.register(this);
     }
     }
 
 
     /**
     /**
@@ -306,6 +307,7 @@ export default class TypescriptLanguageExtension implements Editor.ClientExtensi
      * @return {[type]}
      * @return {[type]}
      */
      */
     preferencesChanged() {
     preferencesChanged() {
-        // nothing to do yet
+        // Stub function for now
+        this.serviceLocator.clientServices.getUserPreference("TypescriptLanguageExtension", "CompileOnSave", true);
     }
     }
 }
 }

+ 1 - 1
Script/AtomicWebViewEditor/editor/editorCommands.ts

@@ -129,6 +129,6 @@ export function codeSaved(path: string, fileExt: string, contents: string) {
  * @param  {any} prefs
  * @param  {any} prefs
  */
  */
 export function loadPreferences(prefs: any) {
 export function loadPreferences(prefs: any) {
-    serviceLocator.setPreferences(prefs);
+    serviceLocator.clientServices.setPreferences(prefs);
     serviceLocator.sendEvent(ClientExtensionEventNames.PreferencesChangedEvent, null);
     serviceLocator.sendEvent(ClientExtensionEventNames.PreferencesChangedEvent, null);
 }
 }

+ 25 - 9
Script/TypeScript/EditorWork.d.ts

@@ -318,16 +318,11 @@ declare module Editor.ClientExtensions {
      * or by the editor itself.
      * or by the editor itself.
      */
      */
     export interface ClientServiceLocator extends Editor.Extensions.ServiceLoader {
     export interface ClientServiceLocator extends Editor.Extensions.ServiceLoader {
-        getHostInterop(): HostInterop;
-
         /**
         /**
-         * Return a preference value or the provided default from the user settings file
-         * @param  {string} extensionName name of the extension the preference lives under
-         * @param  {string} preferenceName name of the preference to retrieve
-         * @param  {number | boolean | string} defaultValue value to return if pref doesn't exist
-         * @return {number|boolean|string}
+         * Exposed services
+         * @type {WebViewServicesProvider}
          */
          */
-        getUserPreference(extensionName: string, preferenceName: string, defaultValue?: number | boolean | string): number | boolean | string;
+        clientServices: WebViewServicesProvider;
     }
     }
 
 
     export interface ClientEditorService extends Editor.Extensions.EditorServiceExtension {
     export interface ClientEditorService extends Editor.Extensions.EditorServiceExtension {
@@ -337,7 +332,7 @@ declare module Editor.ClientExtensions {
         initialize(serviceLocator: ClientServiceLocator);
         initialize(serviceLocator: ClientServiceLocator);
     }
     }
 
 
-    export interface WebViewService extends Editor.Extensions.EditorServiceExtension {
+    export interface WebViewServiceEventListener extends Editor.Extensions.EditorServiceExtension {
         configureEditor?(ev: EditorEvents.EditorFileEvent);
         configureEditor?(ev: EditorEvents.EditorFileEvent);
         codeLoaded?(ev: EditorEvents.CodeLoadedEvent);
         codeLoaded?(ev: EditorEvents.CodeLoadedEvent);
         save?(ev: EditorEvents.CodeSavedEvent);
         save?(ev: EditorEvents.CodeSavedEvent);
@@ -347,6 +342,27 @@ declare module Editor.ClientExtensions {
         preferencesChanged?();
         preferencesChanged?();
     }
     }
 
 
+    /**
+     * Available methods exposed to client services
+     */
+    export interface WebViewServicesProvider extends Editor.Extensions.ServicesProvider<WebViewServiceEventListener> {
+
+        /**
+         * Get a reference to the interop to talk to the host
+         * @return {HostInterop}
+         */
+        getHostInterop(): HostInterop;
+
+        /**
+         * Return a preference value or the provided default from the user settings file
+         * @param  {string} extensionName name of the extension the preference lives under
+         * @param  {string} preferenceName name of the preference to retrieve
+         * @param  {number | boolean | string} defaultValue value to return if pref doesn't exist
+         * @return {number|boolean|string}
+         */
+        getUserPreference(extensionName: string, preferenceName: string, defaultValue?: number | boolean | string): number | boolean | string;
+    }
+
     export interface AtomicErrorMessage {
     export interface AtomicErrorMessage {
         error_code: number;
         error_code: number;
         error_message: string;
         error_message: string;