blob: aaf1d45e200a46f18b055d5f94012ae7587e8644 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 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
*******************************************************************************/
package org.eclipse.ui.internal;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.IMemento;
import org.eclipse.ui.IPersistableElement;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPreferenceConstants;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.XMLMemento;
import org.eclipse.ui.internal.intro.IIntroConstants;
import org.eclipse.ui.internal.preferences.WorkbenchSettingsTransfer;
import org.eclipse.ui.internal.util.PrefUtil;
import org.eclipse.ui.internal.util.Util;
import org.eclipse.ui.presentations.AbstractPresentationFactory;
import org.eclipse.ui.presentations.IStackPresentationSite;
/**
* The WorkbenchSettings handles the recording and restoring of workbench
* settings.
*
* @since 3.3
*
*/
public class WorkbenchLayoutSettingsTransfer extends WorkbenchSettingsTransfer {
// private static final String WORKBENCH_LAYOUT_PATH =
// ".metadata/.plugins/org.eclipse.ui.workbench/workbench.xml";
// //$NON-NLS-1$
/**
* Create a new instance of the receiver.
*/
public WorkbenchLayoutSettingsTransfer() {
super();
}
/**
* Record the sharable workbench state in a document.
*
* @return {@link XMLMemento}
*/
public XMLMemento recordSharableWorkbenchState() {
XMLMemento memento = XMLMemento
.createWriteRoot(IWorkbenchConstants.TAG_WORKBENCH);
IStatus status = saveSettings(memento);
if (status.getSeverity() != IStatus.OK) {
// don't use newWindow as parent because it has not yet been opened
// (bug 76724)
ErrorDialog.openError(null,
WorkbenchMessages.Workbench_problemsSaving,
WorkbenchMessages.Workbench_problemsSavingMsg, status);
}
return memento;
}
/**
* Save the settings to the memento.
*
* @param memento
* @return IStatus
*/
private IStatus saveSettings(XMLMemento memento) {
MultiStatus result = new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.OK,
WorkbenchMessages.Workbench_problemsSaving, null);
// Save the version number.
memento.putString(IWorkbenchConstants.TAG_VERSION,
Workbench.VERSION_STRING[1]);
// Save the workbench windows.
IWorkbenchWindow[] windows = PlatformUI.getWorkbench()
.getWorkbenchWindows();
for (int nX = 0; nX < windows.length; nX++) {
WorkbenchWindow window = (WorkbenchWindow) windows[nX];
IMemento childMem = memento
.createChild(IWorkbenchConstants.TAG_WINDOW);
result.merge(saveState(window, childMem));
}
return result;
}
/**
* Save the workbench window state.
*
* @param window
* @param memento
* @return IStatus
*/
private IStatus saveState(WorkbenchWindow window, IMemento memento) {
MultiStatus result = new MultiStatus(PlatformUI.PLUGIN_ID, IStatus.OK,
WorkbenchMessages.WorkbenchWindow_problemsSavingWindow, null);
IWorkbenchPage activePage = window.getActivePage();
if (activePage != null
&& activePage.findView(IIntroConstants.INTRO_VIEW_ID) != null) {
IMemento introMem = memento
.createChild(IWorkbenchConstants.TAG_INTRO);
boolean isStandby = getWorkbench()
.getIntroManager()
.isIntroStandby(getWorkbench().getIntroManager().getIntro());
introMem.putString(IWorkbenchConstants.TAG_STANDBY, String
.valueOf(isStandby));
}
// Save each page.
IWorkbenchPage[] pages = window.getPages();
for (int i = 0; i < pages.length; i++) {
IWorkbenchPage page = pages[i];
// Save perspective.
IMemento pageMem = memento
.createChild(IWorkbenchConstants.TAG_PAGE);
pageMem.putString(IWorkbenchConstants.TAG_LABEL, page.getLabel());
result.add(saveState((WorkbenchPage) page, pageMem));
if (page == window.getActivePage()) {
pageMem.putString(IWorkbenchConstants.TAG_FOCUS, "true"); //$NON-NLS-1$
}
// Get the input.
IAdaptable input = page.getInput();
if (input != null) {
IPersistableElement persistable = (IPersistableElement) Util
.getAdapter(input, IPersistableElement.class);
if (persistable == null) {
WorkbenchPlugin
.log("Unable to save page input: " //$NON-NLS-1$
+ input
+ ", because it does not adapt to IPersistableElement"); //$NON-NLS-1$
} else {
// Save input.
IMemento inputMem = pageMem
.createChild(IWorkbenchConstants.TAG_INPUT);
inputMem.putString(IWorkbenchConstants.TAG_FACTORY_ID,
persistable.getFactoryId());
persistable.saveState(inputMem);
}
}
}
return result;
}
/**
* Save the state of the workbench page.
*
* @param page
* @param pageMem
* @return IStatus
*/
private IStatus saveState(WorkbenchPage page, IMemento memento) {
MultiStatus result = new MultiStatus(
PlatformUI.PLUGIN_ID,
IStatus.OK,
NLS
.bind(
WorkbenchMessages.WorkbenchPage_unableToSavePerspective,
page.getLabel()), null);
saveEditorState( memento);
// IMemento viewMem =
// memento.createChild(IWorkbenchConstants.TAG_VIEWS);
// Create persp block.
IMemento perspectiveMemento = memento
.createChild(IWorkbenchConstants.TAG_PERSPECTIVES);
if (page.getPerspective() != null) {
perspectiveMemento.putString(
IWorkbenchConstants.TAG_ACTIVE_PERSPECTIVE, page
.getPerspective().getId());
}
if (page.getActivePart() != null) {
if (page.getActivePart() instanceof IViewPart) {
} else {
perspectiveMemento.putString(
IWorkbenchConstants.TAG_ACTIVE_PART, page
.getActivePart().getSite().getId());
}
}
// Save each perspective in opened order
return result;
}
/**
* Save the editor state. Set it to be the defaults.
*
* @param memento
*/
private void saveEditorState(IMemento memento) {
IMemento editorsMemento = memento
.createChild(IWorkbenchConstants.TAG_EDITORS);
IMemento editorArea = editorsMemento
.createChild(IWorkbenchConstants.TAG_AREA);
IMemento info = editorArea.createChild(IWorkbenchConstants.TAG_INFO);
IMemento folder = info.createChild(IWorkbenchConstants.TAG_FOLDER);
folder.putInteger(IWorkbenchConstants.TAG_EXPANDED,
IStackPresentationSite.STATE_RESTORED);
IMemento presentation = folder
.createChild(IWorkbenchConstants.TAG_PRESENTATION);
presentation.putString(IWorkbenchConstants.TAG_ID,
getCurrentPresentationClassName());
}
/**
* Get the name of the current presentation class name.
*
* @return String
*/
private String getCurrentPresentationClassName() {
// update the current selection (used to look for changes on apply)
String currentPresentationFactoryId = PrefUtil.getAPIPreferenceStore()
.getString(
IWorkbenchPreferenceConstants.PRESENTATION_FACTORY_ID);
// Workbench.getInstance().getPresentationId();
AbstractPresentationFactory factory = WorkbenchPlugin.getDefault()
.getPresentationFactory(currentPresentationFactoryId);
if (factory == null)
factory = WorkbenchPlugin.getDefault().getPresentationFactory(
IWorkbenchConstants.DEFAULT_PRESENTATION_ID);
return factory.getClass().getName();
}
/**
* Return the workbench we are using.
*
* @return IWorkbench
*/
private IWorkbench getWorkbench() {
return PlatformUI.getWorkbench();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.preferences.SettingsTransfer#transferSettings(org.eclipse.core.runtime.IPath)
*/
public IStatus transferSettings(IPath newWorkspaceRoot) {
try {
File workspaceFile = createFileAndDirectories(newWorkspaceRoot);
if (workspaceFile == null)
return new Status(
IStatus.ERROR,
WorkbenchPlugin.PI_WORKBENCH,
WorkbenchMessages.WorkbenchSettings_CouldNotCreateDirectories);
FileOutputStream stream = new FileOutputStream(workspaceFile);
OutputStreamWriter writer = new OutputStreamWriter(stream, "utf-8"); //$NON-NLS-1$
XMLMemento memento = XMLMemento
.createWriteRoot(IWorkbenchConstants.TAG_WORKBENCH);
IStatus status = saveSettings(memento);
if (status.getSeverity() != IStatus.OK)
return status;
memento.save(writer);
writer.close();
} catch (IOException e) {
return new Status(IStatus.ERROR, WorkbenchPlugin.PI_WORKBENCH,
WorkbenchMessages.Workbench_problemsSavingMsg, e);
}
return Status.OK_STATUS;
}
/**
* Create the parent directories for the workbench layout file and then
* return the File.
*
* @param newWorkspaceRoot
* @return File the new layout file. Return <code>null</code> if the file
* cannot be created.
*/
private File createFileAndDirectories(IPath newWorkspaceRoot) {
IPath newWorkspaceLocation = getNewWorkbenchStateLocation(
newWorkspaceRoot).append(
Workbench.DEFAULT_WORKBENCH_STATE_FILENAME);
File workspaceFile = new File(newWorkspaceLocation.toOSString());
File parent = workspaceFile.getParentFile();
if (!parent.exists()) {
if (!parent.mkdirs())
return null;
}
return workspaceFile;
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.preferences.SettingsTransfer#getName()
*/
public String getName() {
return WorkbenchMessages.WorkbenchLayoutSettings_Name;
}
}