blob: 27dfd9f692517f7c5d27e1814135e982c3d4f6af [file] [log] [blame]
/**********************************************************************
Copyright (c) 2000, 2002 IBM Corp. and others.
All rights reserved. This program and the accompanying materials
are made available under the terms of the Common Public License v1.0
which accompanies this distribution, and is available at
http://www.eclipse.org/legal/cpl-v10.html
Contributors:
IBM Corporation - Initial implementation
**********************************************************************/
package org.eclipse.ui.internal;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.ui.IEditorDescriptor;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorRegistry;
import org.eclipse.ui.IElementFactory;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.internal.misc.Assert;
/**
* An item in the editor history.
*/
public class EditorHistoryItem {
private IEditorInput input;
private IEditorDescriptor descriptor;
private IMemento memento;
/**
* Constructs a new item.
*/
public EditorHistoryItem(IEditorInput input, IEditorDescriptor descriptor) {
this.input = input;
this.descriptor = descriptor;
}
/**
* Constructs a new item from a memento.
*/
public EditorHistoryItem(IMemento memento) {
this.memento = memento;
}
/**
* Returns the editor descriptor.
*
* @return the editor descriptor.
*/
public IEditorDescriptor getDescriptor() {
return descriptor;
}
/**
* Returns the editor input.
*
* @return the editor input.
*/
public IEditorInput getInput() {
return input;
}
/**
* Returns whether this item has been restored from the memento.
*/
public boolean isRestored() {
return memento == null;
}
/**
* Returns the name of this item, either from the input if restored,
* otherwise from the memento.
*/
public String getName() {
if (isRestored() && getInput() != null) {
return getInput().getName();
}
else if (memento != null) {
String name = memento.getString(IWorkbenchConstants.TAG_NAME);
if (name != null) {
return name;
}
}
return ""; //$NON-NLS-1$
}
/**
* Returns the tooltip text of this item, either from the input if restored,
* otherwise from the memento.
*/
public String getToolTipText() {
if (isRestored() && getInput() != null) {
return getInput().getToolTipText();
}
else if (memento != null) {
String name = memento.getString(IWorkbenchConstants.TAG_TOOLTIP);
if (name != null) {
return name;
}
}
return ""; //$NON-NLS-1$
}
/**
* Returns whether this item matches the given editor input.
*/
public boolean matches(IEditorInput input) {
if (isRestored())
return input.equals(getInput());
// if not restored, compare name, tool tip text and factory id,
// avoiding as much work as possible
if (!getName().equals(input.getName()))
return false;
if (!getToolTipText().equals(input.getToolTipText()))
return false;
IPersistableElement persistable = input.getPersistable();
String inputId = persistable == null ? null : persistable.getFactoryId();
String myId = getFactoryId();
return myId == null ? inputId == null : myId.equals(inputId);
}
/**
* Returns the factory id of this item, either from the input if restored,
* otherwise from the memento.
* Returns <code>null</code> if there is no factory id.
*/
public String getFactoryId() {
if (isRestored()) {
if (input != null) {
IPersistableElement persistable = input.getPersistable();
if (persistable != null) {
return persistable.getFactoryId();
}
}
}
else if (memento != null) {
return memento.getString(IWorkbenchConstants.TAG_FACTORY_ID);
}
return null;
}
/**
* Restores the object state from the memento.
*/
public IStatus restoreState() {
Assert.isTrue(!isRestored());
Status result = new Status(IStatus.OK,PlatformUI.PLUGIN_ID,0,"",null); //$NON-NLS-1$
IMemento memento = this.memento;
this.memento = null;
String factoryId = memento.getString(IWorkbenchConstants.TAG_FACTORY_ID);
if (factoryId == null) {
WorkbenchPlugin.log("Unable to restore mru list - no input factory ID.");//$NON-NLS-1$
return result;
}
IElementFactory factory = WorkbenchPlugin.getDefault().getElementFactory(factoryId);
if (factory == null) {
return result;
}
IMemento persistableMemento = memento.getChild(IWorkbenchConstants.TAG_PERSISTABLE);
if (persistableMemento == null) {
WorkbenchPlugin.log("Unable to restore mru list - no input element state: " + factoryId);//$NON-NLS-1$
return result;
}
IAdaptable adaptable = factory.createElement(persistableMemento);
if (adaptable == null || (adaptable instanceof IEditorInput) == false) {
return result;
}
input = (IEditorInput) adaptable;
// Get the editor descriptor.
String editorId = memento.getString(IWorkbenchConstants.TAG_ID);
if (editorId != null) {
IEditorRegistry registry = WorkbenchPlugin.getDefault().getEditorRegistry();
descriptor = registry.findEditor(editorId);
}
return result;
}
/**
* Returns whether this history item can be saved.
*/
public boolean canSave() {
return !isRestored()
|| (getInput() != null && getInput().getPersistable() != null);
}
/**
* Saves the object state in the given memento.
*
* @param memento the memento to save the object state in
*/
public IStatus saveState(IMemento memento) {
if (!isRestored()) {
memento.putMemento(this.memento);
}
else if (input != null) {
IPersistableElement persistable = input.getPersistable();
if (persistable != null) {
/*
* Store IPersistable of the IEditorInput in a separate section
* since it could potentially use a tag already used in the parent
* memento and thus overwrite data.
*/
IMemento persistableMemento = memento.createChild(IWorkbenchConstants.TAG_PERSISTABLE);
persistable.saveState(persistableMemento);
memento.putString(IWorkbenchConstants.TAG_FACTORY_ID, persistable.getFactoryId());
if (descriptor != null && descriptor.getId() != null) {
memento.putString(IWorkbenchConstants.TAG_ID, descriptor.getId());
}
// save the name and tooltip separately so they can be restored
// without having to instantiate the input, which can activate plugins
memento.putString(IWorkbenchConstants.TAG_NAME, input.getName());
memento.putString(IWorkbenchConstants.TAG_TOOLTIP, input.getToolTipText());
}
}
return new Status(IStatus.OK,PlatformUI.PLUGIN_ID,0,"",null); //$NON-NLS-1$
}
}