diff -r 000000000000 -r 522a326673b6 sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/SmmPartListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/sysmodelmgr/com.symbian.smt.gui/src/com/symbian/smt/gui/SmmPartListener.java Thu Mar 11 19:08:43 2010 +0200 @@ -0,0 +1,198 @@ +// 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: +// + +package com.symbian.smt.gui; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.eclipse.core.resources.IFile; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.ui.IEditorInput; +import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.IFileEditorInput; +import org.eclipse.ui.IPartListener; +import org.eclipse.ui.IPropertyListener; +import org.eclipse.ui.IWorkbenchPart; +import org.eclipse.ui.PlatformUI; + +import com.symbian.smt.gui.nature.Nature; + +final class SmmPartListener implements IPartListener { + + private final class PropertyChangeListener implements IPropertyListener { + + public void propertyChanged(Object source, int propId) { + if (propId == IEditorPart.PROP_DIRTY) { + if (source instanceof IEditorPart) { + IEditorPart editorPart = (IEditorPart) source; + IEditorInput input = editorPart.getEditorInput(); + + if (input instanceof IFileEditorInput) { + boolean isEditorDirty = editorPart.isDirty(); + String dirty = String.valueOf(isEditorDirty); + IFile file = ((IFileEditorInput) input).getFile(); + + // If user has saved and if it is a resource file or a + // sys def file, + // need to validate the file and mark it in error + // if it is invalid. + if (!isEditorDirty) { + // save but do not build if validation fails. + if (ManageResources.isResourceFile(file)) { + // TODO:BRS:Remove the if test below when + // Shapes.xsd is available. + if (!file.getParent().getName() + .equals("Shapes")) { + FileValidationHelper + .validateResourceFile(file); + } + } else if (ManageResources + .isSystemDefinitionFile(file)) { + FileValidationHelper.validateSysDefFile(file); + } + } + + if (!items.containsKey(file.getProject().getName())) { + String entry[] = { file.getName(), dirty }; + ArrayList entries = new ArrayList(); + entries.add(entry); + items.put(file.getProject().getName(), entries); + } else { + ArrayList projectFiles = items.get(file + .getProject().getName()); + + Boolean alreadyExists = false; + + for (String[] anEntry : projectFiles) { + if (anEntry[0].equalsIgnoreCase(file.getName())) { + anEntry[1] = dirty; + alreadyExists = true; + } + } + + if (!alreadyExists) { + String entry[] = { file.getName(), dirty }; + items.get(file.getProject().getName()).add( + entry); + } + } + } + } + + // Tell it to do any decorating + PlatformUI.getWorkbench().getDecoratorManager().update( + "com.symbian.smt.gui.outofsyncdecorator"); + } + } + } + + private PropertyChangeListener listener; + + private static HashMap> items = new HashMap>(); + + public SmmPartListener() { + listener = new PropertyChangeListener(); + } + + private void addListener(IWorkbenchPart part) { + if (part instanceof IEditorPart) { + try { + IEditorInput input = ((IEditorPart) part).getEditorInput(); + if (input instanceof IFileEditorInput) { + IFile file = ((IFileEditorInput) input).getFile(); + + if (file.getProject().isOpen()) { + boolean ourProject = file.getProject().hasNature( + Nature.ID); + if (ourProject && !file.isDerived()) { + part.addPropertyListener(listener); + } + } + } + } catch (CoreException e) { + Logger.log(e.getMessage(), e); + } + } + } + + public boolean isInSync(String project) { + // Get the files for this project + ArrayList projectFiles = items.get(project); + + // Iterate over the resources + if (projectFiles != null) { + for (String[] anEntry : projectFiles) { + if (Boolean.valueOf(anEntry[1])) { + // A file is out of sync, so the project it dirty + return false; + } + } + } + + // No sync information exists for the project or all are in sync - + // return true + return true; + } + + public void partActivated(IWorkbenchPart part) { + addListener(part); + + // if (part instanceof IViewPart) { + // String partId = ((IViewPart) part).getViewSite().getId(); + // + // if (partId.equals("org.eclipse.ui.navigator.ProjectExplorer")) { + // FileValidationHelper.showProblemsViewIfNeeded(); + // } + // } + } + + public void partBroughtToTop(IWorkbenchPart part) { + addListener(part); + } + + public void partClosed(IWorkbenchPart part) { + part.removePropertyListener(listener); + + if (part instanceof IEditorPart) { + IEditorInput input = ((IEditorPart) part).getEditorInput(); + if (input instanceof IFileEditorInput) { + IFile file = ((IFileEditorInput) input).getFile(); + + if (items.containsKey(file.getProject().getName())) { + ArrayList projectFiles = items.get(file + .getProject().getName()); + + for (String[] anEntry : projectFiles) { + if (anEntry[0].equalsIgnoreCase(file.getName())) { + projectFiles.remove(anEntry); + break; + } + } + } + } + + PlatformUI.getWorkbench().getDecoratorManager().update( + "com.symbian.smt.gui.outofsyncdecorator"); + } + } + + public void partDeactivated(IWorkbenchPart part) { + } + + public void partOpened(IWorkbenchPart part) { + addListener(part); + } +}