001: /*******************************************************************************
002: * Copyright (c) 2004, 2007 IBM Corporation and others.
003: * All rights reserved. This program and the accompanying materials
004: * are made available under the terms of the Eclipse Public License v1.0
005: * which accompanies this distribution, and is available at
006: * http://www.eclipse.org/legal/epl-v10.html
007: *
008: * Contributors:
009: * IBM Corporation - initial API and implementation
010: *******************************************************************************/package org.eclipse.ui.internal.presentations;
011:
012: import org.eclipse.jface.action.Action;
013: import org.eclipse.ui.IEditorPart;
014: import org.eclipse.ui.IPersistableEditor;
015: import org.eclipse.ui.IWorkbenchPage;
016: import org.eclipse.ui.IWorkbenchWindow;
017: import org.eclipse.ui.PartInitException;
018: import org.eclipse.ui.PlatformUI;
019: import org.eclipse.ui.XMLMemento;
020: import org.eclipse.ui.internal.IWorkbenchConstants;
021: import org.eclipse.ui.internal.WorkbenchMessages;
022: import org.eclipse.ui.internal.WorkbenchPage;
023: import org.eclipse.ui.internal.dialogs.DialogUtil;
024: import org.eclipse.ui.presentations.IPresentablePart;
025: import org.eclipse.ui.presentations.IStackPresentationSite;
026:
027: /**
028: * This convenience class provides a "New Editor" system menu item that
029: * opens another editor of the same type as the current editor, on the same input.
030: * Presentations can use this to add a "New Editor" item to their system menu.
031: *
032: * @since 3.1
033: */
034: public final class SystemMenuNewEditor extends Action implements
035: ISelfUpdatingAction {
036:
037: private IStackPresentationSite site;
038: private IPresentablePart part;
039:
040: /**
041: * Creates a new instance of the action
042: *
043: * @param site the presentation site
044: */
045: public SystemMenuNewEditor(IStackPresentationSite site) {
046: this .site = site;
047: setText(WorkbenchMessages.PartPane_newEditor);
048: }
049:
050: /**
051: * Disposes the action.
052: */
053: public void dispose() {
054: site = null;
055: }
056:
057: public void run() {
058: if (part != null) {
059: // the site doesn't give access to the page or the active editor,
060: // so we need to reach
061: IWorkbenchWindow window = PlatformUI.getWorkbench()
062: .getActiveWorkbenchWindow();
063: if (window != null) {
064: IWorkbenchPage page = window.getActivePage();
065: if (page != null) {
066: IEditorPart editor = page == null ? null : page
067: .getActiveEditor();
068: if (editor != null) {
069: String editorId = editor.getSite().getId();
070: if (editorId != null) {
071: try {
072: if (editor instanceof IPersistableEditor) {
073: XMLMemento editorState = XMLMemento
074: .createWriteRoot(IWorkbenchConstants.TAG_EDITOR_STATE);
075: ((IPersistableEditor) editor)
076: .saveState(editorState);
077: ((WorkbenchPage) page).openEditor(
078: editor.getEditorInput(),
079: editorId, true,
080: IWorkbenchPage.MATCH_NONE,
081: editorState);
082: } else {
083: page.openEditor(editor
084: .getEditorInput(),
085: editorId, true,
086: IWorkbenchPage.MATCH_NONE);
087: }
088: } catch (PartInitException e) {
089: DialogUtil.openError(page
090: .getWorkbenchWindow()
091: .getShell(),
092: WorkbenchMessages.Error, e
093: .getMessage(), e);
094: }
095: }
096: }
097: }
098: }
099: }
100: }
101:
102: /**
103: * Sets the target of this action to the given part.
104: *
105: * @param presentablePart
106: * the target part for this action, or <code>null</code> if
107: * there is no appopriate target part
108: */
109: public void setTarget(IPresentablePart presentablePart) {
110: this .part = presentablePart;
111: setEnabled(presentablePart != null);
112: }
113:
114: /* (non-Javadoc)
115: * @see org.eclipse.ui.internal.presentations.ISelfUpdatingAction#update()
116: */
117: public void update() {
118: setTarget(site.getSelectedPart());
119: }
120:
121: /* (non-Javadoc)
122: * @see org.eclipse.ui.internal.presentations.ISelfUpdatingAction#shouldBeVisible()
123: */
124: public boolean shouldBeVisible() {
125: return true;
126: }
127: }
|