diff -r 000000000000 -r 522a326673b6 sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/SmmResourceChangeListener.java --- /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); + } + } + } +}