sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/SmmResourceChangeListener.java
changeset 0 522a326673b6
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/SmmResourceChangeListener.java	Thu Mar 11 19:08:43 2010 +0200
@@ -0,0 +1,220 @@
+// Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// SmmResourceChaneListener.java
+// 
+//
+
+package com.symbian.smt.gui;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceDescription;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.resources.ProjectScope;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.FileEditorInput;
+
+import com.symbian.smt.gui.nature.Nature;
+
+public class SmmResourceChangeListener implements IResourceChangeListener {
+
+	public void resourceChanged(final IResourceChangeEvent event) {
+		if (event.getType() == IResourceChangeEvent.PRE_BUILD) {
+			IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			IWorkspaceDescription description = workspace.getDescription();
+
+			IWorkspaceRoot workspaceRoot = workspace.getRoot();
+			IResourceDelta delta = event.getDelta();
+
+			if (delta.getFullPath().equals(Path.ROOT)) {
+				IResourceDelta[] children = delta
+						.getAffectedChildren(IResourceDelta.CHANGED);
+
+				if (children.length == 0) {
+					return;
+				}
+
+				for (IResourceDelta child : children) {
+					if (child.getKind() == IResourceDelta.CHANGED) {
+						for (IProject aProject : workspaceRoot.getProjects()) {
+							try {
+								if (aProject.isOpen()
+										&& aProject.hasNature(Nature.ID)
+										&& aProject.getFullPath().equals(
+												child.getFullPath())) {
+
+									if (child.getFlags() == IResourceDelta.OPEN) {
+										final IProject theProject = aProject;
+
+										try {
+											theProject.refreshLocal(
+													IResource.DEPTH_INFINITE,
+													null);
+
+											IScopeContext projectScope = new ProjectScope(
+													theProject);
+											PersistentDataStore store = new PersistentDataStore(
+													projectScope
+															.getNode(Activator.PLUGIN_ID));
+
+											Boolean needsShortcutsRefreshing = true;
+
+											for (IResource resource : theProject
+													.members()) {
+												if (resource.isLinked()) {
+													needsShortcutsRefreshing = false;
+													break;
+												}
+											}
+
+											if (needsShortcutsRefreshing == true) {
+												// We also need to get the
+												// shortcut to appear, as it
+												// does not always happen
+												// automatically
+												ManageResources
+														.updateSystemDefinitionFiles(
+																theProject,
+																store
+																		.getSystemDefinitionFiles(),
+																true);
+											}
+										} catch (CoreException e) {
+											Logger.log(e.getMessage(), e);
+										}
+									}
+
+									if (!description.isAutoBuilding()) {
+										final IProject theProject = aProject;
+										Job j = new Job("Building workspace") {
+											@Override
+											protected IStatus run(
+													IProgressMonitor monitor) {
+												try {
+													if (event.getBuildKind() == IncrementalProjectBuilder.AUTO_BUILD) { // 9
+														theProject
+																.build(
+																		IncrementalProjectBuilder.INCREMENTAL_BUILD,
+																		monitor);
+													}
+												} catch (CoreException e) {
+													Logger.log(e.getMessage(),
+															e);
+												}
+												return new Status(
+														IStatus.OK,
+														Activator.PLUGIN_ID,
+														IStatus.OK,
+														"updating properties succeeded",
+														null);
+											}
+										};
+										j.schedule();
+									}
+								}
+							} catch (CoreException e) {
+								Logger.log(e.getMessage(), e);
+							}
+						}
+					}
+				}
+			}
+		} else if (event.getType() == IResourceChangeEvent.PRE_DELETE) {
+			// If it is a delete event then the resource is an IProject
+			IProject project = (IProject) event.getResource();
+
+			IScopeContext projectScope = new ProjectScope(project);
+			PersistentDataStore store = new PersistentDataStore(projectScope
+					.getNode(Activator.PLUGIN_ID));
+
+			final IFile oldProjectFile = project.getFile(store
+					.getOutputFilename());
+
+			ChangeManager manager = new ChangeManager();
+			manager.remove(project);
+			
+			Display.getDefault().asyncExec(new Runnable() {
+				public void run() {
+					IWorkbenchPage page = PlatformUI.getWorkbench()
+							.getActiveWorkbenchWindow().getActivePage();
+					IEditorPart oldEditor = page
+							.findEditor(new FileEditorInput(oldProjectFile));
+					page.closeEditor(oldEditor, false);
+				}
+			});
+		} else {
+			IResourceDelta delta = event.getDelta();
+
+			if (event.getType() == IResourceChangeEvent.POST_CHANGE
+					&& delta.getKind() == IResourceDelta.CHANGED) {
+				IWorkspace workspace = ResourcesPlugin.getWorkspace();
+				IWorkspaceRoot workspaceRoot = workspace.getRoot();
+				IProject project = null;
+
+				IPath fullPath = delta.getFullPath();
+
+				if (delta.getFullPath().equals(Path.ROOT)) {
+					IResourceDelta[] children = delta
+							.getAffectedChildren(IResourceDelta.CHANGED);
+
+					if (children.length == 0) {
+						return;
+					}
+
+					for (IResourceDelta child : children) {
+						if (child.getKind() == IResourceDelta.CHANGED) {
+							fullPath = child.getFullPath();
+						}
+					}
+				}
+				for (IProject aProject : workspaceRoot.getProjects()) {
+					try {
+						if (aProject.isOpen() && aProject.hasNature(Nature.ID)
+								&& aProject.getFullPath().equals(fullPath)) {
+							project = aProject;
+							break;
+						}
+					} catch (CoreException e) {
+						Logger.log(e.getMessage(), e);
+					}
+				}
+
+				if (project == null) {
+					return;
+				}
+
+				ChangeManager manager = new ChangeManager();
+				manager.handleDelta(delta, project);
+			}
+		}
+	}
+}