blob: 547ce717e01e82a9267eb0fb02dce5b1b469e4bc (
plain) (
tree)
|
|
/*******************************************************************************
* Copyright (c) 2000, 2007 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems)
*******************************************************************************/
package org.eclipse.cdt.internal.ui;
import java.io.File;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.ui.IElementFactory;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
/**
* The PersistableCElementFactory is used to save and recreate an ICElement object.
* As such, it implements the IPersistableElement interface for storage
* and the IElementFactory interface for recreation.
*
* @see IMemento
* @see IPersistableElement
* @see IElementFactory
*/
public class PersistableCElementFactory implements IElementFactory, IPersistableElement {
// These persistence constants are stored in XML. Do not
// change them.
private static final String TAG_PATH = "path";//$NON-NLS-1$
private static final String TAG_TYPE = "type";//$NON-NLS-1$
private static final String FACTORY_ID = "org.eclipse.cdt.ui.PersistableCElementFactory";//$NON-NLS-1$
// IPersistable data.
private ICElement fCElement;
/**
* Create a PersistableCElementFactory. This constructor is typically used
* for our IElementFactory side.
*/
public PersistableCElementFactory() {
}
/**
* Create a PersistableCElementFactory. This constructor is typically used
* for our IPersistableElement side.
*/
public PersistableCElementFactory(ICElement input) {
fCElement = input;
}
/**
* @see IElementFactory
*/
public IAdaptable createElement(IMemento memento) {
// Get the file name.
String fileName = memento.getString(TAG_PATH);
if (fileName == null) {
return null;
}
IPath elementPath= new Path(fileName);
fCElement = CoreModel.getDefault().create(elementPath);
if (fCElement != null && fCElement.getResource() != null) {
IResource resource= fCElement.getResource();
if (!resource.isAccessible()) {
return resource;
}
}
if (fCElement != null) {
return fCElement;
}
final IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
Integer elementType= memento.getInteger(TAG_TYPE);
if (elementType == null) {
if (elementPath.segmentCount() == 1) {
return root.getProject(fileName);
}
IFolder folder= root.getFolder(elementPath);
File osFile= folder.getLocation().toFile();
if (osFile.isDirectory()) {
return folder;
}
return root.getFile(elementPath);
}
switch (elementType.intValue()) {
case IResource.ROOT:
return root;
case IResource.PROJECT:
return root.getProject(fileName);
case IResource.FOLDER:
return root.getFolder(elementPath);
case IResource.FILE:
return root.getFile(elementPath);
}
return null;
}
/**
* @see IPersistableElement
*/
public String getFactoryId() {
return FACTORY_ID;
}
/**
* @see IPersistableElement
*/
public void saveState(IMemento memento) {
if (fCElement.getResource() != null) {
memento.putString(TAG_PATH, fCElement.getResource().getFullPath().toString());
memento.putInteger(TAG_TYPE, fCElement.getResource().getType());
}
}
}
|