Package org.eclipse.ui.internal

Source Code of org.eclipse.ui.internal.WorkbenchLayoutSettingsTransfer

/*******************************************************************************
* 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.IPerspectiveDescriptor;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IViewReference;
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.presentations.PresentationFactoryUtil;
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);

    IViewReference[] refs = page.getViewReferences();

    for (int i = 0; i < refs.length; i++) {
      IViewReference viewReference = refs[i];
      String tagId = ViewFactory.getKey(viewReference);
      if (tagId != null) {
        IMemento childMem = viewMem
            .createChild(IWorkbenchConstants.TAG_VIEW);
        childMem.putString(IWorkbenchConstants.TAG_ID, tagId);
        String name = viewReference.getPartName();
        if (name != null) {
          childMem.putString(IWorkbenchConstants.TAG_PART_NAME, name);
        }
      }
    }

    // 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) {
        IViewReference ref = (IViewReference) page.getReference(page
            .getActivePart());
        if (ref != null) {
          perspectiveMemento.putString(
              IWorkbenchConstants.TAG_ACTIVE_PART, ViewFactory
                  .getKey(ref));
        }
      } else {
        perspectiveMemento.putString(
            IWorkbenchConstants.TAG_ACTIVE_PART, page
                .getActivePart().getSite().getId());
      }
    }

    // Save each perspective in opened order
    IPerspectiveDescriptor[] perspectives = page.getOpenPerspectives();

    for (int i = 0; i < perspectives.length; i++) {
      IPerspectiveDescriptor perspectiveDescriptor = perspectives[i];
      IMemento gChildMem = perspectiveMemento
          .createChild(IWorkbenchConstants.TAG_PERSPECTIVE);
      Perspective perspective = page
          .findPerspective(perspectiveDescriptor);
      perspective.saveState(gChildMem);
    }

    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);
    editorArea.putString(IWorkbenchConstants.TAG_ACTIVE_WORKBOOK,
        EditorSashContainer.DEFAULT_WORKBOOK_ID);
    IMemento info = editorArea.createChild(IWorkbenchConstants.TAG_INFO);
    info.putString(IWorkbenchConstants.TAG_PART,
        EditorSashContainer.DEFAULT_WORKBOOK_ID);
    IMemento folder = info.createChild(IWorkbenchConstants.TAG_FOLDER);
    folder.putInteger(IWorkbenchConstants.TAG_APPEARANCE,
        PresentationFactoryUtil.ROLE_EDITOR);
    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;
  }

}
TOP

Related Classes of org.eclipse.ui.internal.WorkbenchLayoutSettingsTransfer

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.