Browse Source

implemented a new service type: ProjectService and moved the UnloadProject event out of the ResourceService and into that. Also modified TypescriptLanguageService to implement both resource types and register with both types of registries.`

Shaddock Heath 10 years ago
parent
commit
4017fb13b4

+ 50 - 17
Script/AtomicEditor/extensionServices/EditorExtensionServices.ts

@@ -33,11 +33,15 @@ export interface EditorService {
 export interface ResourceService extends EditorService {
     save?(ev: EditorEvents.SaveResourceEvent);
     canSave?(ev: EditorEvents.SaveResourceEvent);
-    projectUnloaded?();
     canDelete?(ev: EditorEvents.DeleteResourceEvent);
     delete?(ev: EditorEvents.DeleteResourceEvent);
 }
 
+export interface ProjectService extends EditorService {
+    projectUnloaded?();
+    projectLoaded?(ev: EditorEvents.LoadProjectEvent);
+}
+
 /**
  * Generic registry for storing Editor Extension Services
  */
@@ -54,20 +58,23 @@ class ServiceRegistry<T extends EditorService> {
 }
 
 /**
- * Registry for service extensions that are concerned about Resources
+ * Registry for service extensions that are concerned about project events
  */
-class ResourceServiceRegistry extends ServiceRegistry<ResourceService> {
+class ProjectServiceRegistry extends ServiceRegistry<ProjectService> {
     constructor() {
         super();
     }
 
-    saveResource(ev: EditorEvents.SaveResourceEvent) {
-        // run through and find any services that can handle this.
+    /**
+     * Called when the project is unloaded
+     * @param  {[type]} data Event info from the project unloaded event
+     */
+    projectUnloaded(data) {
         this.registeredServices.forEach((service) => {
             // Verify that the service contains the appropriate methods and that it can save
-            if (service.canSave && service.save && service.canSave(ev)) {
+            if (service.projectUnloaded) {
                 try {
-                    service.save(ev);
+                    service.projectUnloaded();
                 } catch (e) {
                     EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n ${e}\n ${e.stack}`);
                 }
@@ -76,15 +83,38 @@ class ResourceServiceRegistry extends ServiceRegistry<ResourceService> {
     }
 
     /**
-     * Called when a resource is being deleted
-     * @return {[type]} [description]
+     * Called when the project is loaded
+     * @param  {[type]} data Event info from the project unloaded event
      */
-    deleteResource(ev: EditorEvents.DeleteResourceEvent) {
+    projectLoaded(ev:EditorEvents.LoadProjectEvent) {
         this.registeredServices.forEach((service) => {
             // Verify that the service contains the appropriate methods and that it can save
-            if (service.canDelete && service.delete && service.canDelete(ev)) {
+            if (service.projectLoaded) {
                 try {
-                    service.delete(ev);
+                    service.projectLoaded(ev);
+                } catch (e) {
+                    EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n ${e}\n ${e.stack}`);
+                }
+            }
+        });
+    }
+}
+
+/**
+ * Registry for service extensions that are concerned about Resources
+ */
+class ResourceServiceRegistry extends ServiceRegistry<ResourceService> {
+    constructor() {
+        super();
+    }
+
+    saveResource(ev: EditorEvents.SaveResourceEvent) {
+        // run through and find any services that can handle this.
+        this.registeredServices.forEach((service) => {
+            // Verify that the service contains the appropriate methods and that it can save
+            if (service.canSave && service.save && service.canSave(ev)) {
+                try {
+                    service.save(ev);
                 } catch (e) {
                     EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n ${e}\n ${e.stack}`);
                 }
@@ -93,21 +123,22 @@ class ResourceServiceRegistry extends ServiceRegistry<ResourceService> {
     }
 
     /**
-     * Called when the project is unloaded
-     * @param  {[type]} data Event info from the project unloaded event
+     * Called when a resource is being deleted
+     * @return {[type]} [description]
      */
-    projectUnloaded(data) {
+    deleteResource(ev: EditorEvents.DeleteResourceEvent) {
         this.registeredServices.forEach((service) => {
             // Verify that the service contains the appropriate methods and that it can save
-            if (service.projectUnloaded) {
+            if (service.canDelete && service.delete && service.canDelete(ev)) {
                 try {
-                    service.projectUnloaded();
+                    service.delete(ev);
                 } catch (e) {
                     EditorUI.showModalError("Extension Error", `Error detected in extension ${service.name}\n ${e}\n ${e.stack}`);
                 }
             }
         });
     }
+
 }
 
 /**
@@ -118,9 +149,11 @@ export class ServiceLocatorType {
 
     constructor() {
         this.resourceServices = new ResourceServiceRegistry();
+        this.projectServices = new ProjectServiceRegistry();
     }
 
     resourceServices: ResourceServiceRegistry;
+    projectServices: ProjectServiceRegistry;
 
     loadService(service: EditorService) {
         service.initialize(this);

+ 29 - 10
Script/AtomicEditor/extensionServices/resourceServices/TypescriptLanguageService.ts

@@ -13,7 +13,7 @@ import * as ts from "modules/typescript";
 /**
  * Resource extension that handles compiling or transpling typescript on file save.
  */
-export default class TypescriptLanguageService implements ExtensionServices.ResourceService {
+export default class TypescriptLanguageService implements ExtensionServices.ResourceService, ExtensionServices.ProjectService {
     name: string = "TypeScriptResourceService";
     description: string = "This service transpiles TypeScript into JavaScript on save.";
 
@@ -257,9 +257,13 @@ export default class TypescriptLanguageService implements ExtensionServices.Reso
      * @return {[type]}             True if successful
      */
     initialize(serviceRegistry: ExtensionServices.ServiceLocatorType) {
+        // We care about both resource events as well as project events
         serviceRegistry.resourceServices.register(this);
+        serviceRegistry.projectServices.register(this);
     }
 
+    /*** ResourceService implementation ****/
+
     /**
      * Called once a resource has been saved
      * @param  {EditorEvents.SaveResourceEvent} ev
@@ -285,15 +289,6 @@ export default class TypescriptLanguageService implements ExtensionServices.Reso
         }
     }
 
-    /**
-     * Called when the project is being unloaded to allow the typscript language service to reset
-     */
-    projectUnloaded() {
-        // got an unload, we need to reset the language service
-        console.log(`${this.name}: received a project unloaded event`);
-        this.resetLanguageService();
-    }
-
     /**
      * Can this service extension handle the save event for the resource?
      * @param  {EditorEvents.SaveResourceEvent} ev the
@@ -343,4 +338,28 @@ export default class TypescriptLanguageService implements ExtensionServices.Reso
             ToolCore.assetDatabase.deleteAsset(jsFileAsset);
         }
     }
+
+    /*** ProjectService implementation ****/
+
+    /**
+     * Called when the project is being unloaded to allow the typscript language service to reset
+     */
+    projectUnloaded() {
+        // got an unload, we need to reset the language service
+        console.log(`${this.name}: received a project unloaded event`);
+        this.resetLanguageService();
+    }
+
+    /**
+     * Called when the project is being loaded to allow the typscript language service to reset and
+     * possibly compile
+     */
+    projectLoaded(ev: EditorEvents.LoadProjectEvent) {
+        // got a load, we need to reset the language service
+        console.log(`${this.name}: received a project loaded event for project at ${ev.path}`);
+        this.resetLanguageService();
+
+        //TODO: do we want to run through and compile at this point?
+    }
+
 }

+ 5 - 1
Script/AtomicEditor/ui/frames/ProjectFrame.ts

@@ -107,7 +107,7 @@ class ProjectFrame extends ScriptWidget {
 
     /**
      * Called when the user deletes a resource
-     * @param  {EditorEvents.DeleteResourceEvent} ev 
+     * @param  {EditorEvents.DeleteResourceEvent} ev
      */
     handleDeleteResource(ev: EditorEvents.DeleteResourceEvent) {
         var db = ToolCore.getAssetDatabase();
@@ -410,6 +410,8 @@ class ProjectFrame extends ScriptWidget {
         this.folderList.setExpanded(this.resourcesID, true);
         this.refreshContent(this.resourceFolder);
 
+        // tell extensions that the project has been unloaded
+        ServiceLocator.projectServices.projectLoaded(data);
     }
 
     handleProjectUnloaded(data) {
@@ -420,6 +422,8 @@ class ProjectFrame extends ScriptWidget {
         var container: Atomic.UILayout = <Atomic.UILayout>this.getWidget("contentcontainer");
         container.deleteAllChildren();
 
+        // tell extensions that the project has been loaded
+        ServiceLocator.projectServices.projectUnloaded(data);
     }
 
     // Shows referenced file in projectframe

+ 0 - 3
Script/AtomicEditor/ui/frames/ResourceFrame.ts

@@ -258,9 +258,6 @@ class ResourceFrame extends ScriptWidget {
           this.editors[i].close();
       }
 
-      // tell extensions that the project has been unloaded
-      ServiceLocator.resourceServices.projectUnloaded(data);
-
     }
 
     constructor(parent: Atomic.UIWidget) {