blob: eb67b1fcc408a8c116d42ecbc418681fea1df14a [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 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.tweaklets;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.osgi.util.NLS;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IEditorReference;
import org.eclipse.ui.IReusableEditor;
import org.eclipse.ui.internal.EditorAreaHelper;
import org.eclipse.ui.internal.EditorManager;
import org.eclipse.ui.internal.EditorReference;
import org.eclipse.ui.internal.EditorSite;
import org.eclipse.ui.internal.IPreferenceConstants;
import org.eclipse.ui.internal.Workbench;
import org.eclipse.ui.internal.WorkbenchMessages;
import org.eclipse.ui.internal.WorkbenchPage;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.internal.progress.ProgressMonitorJobsDialog;
import org.eclipse.ui.internal.registry.EditorDescriptor;
/**
* @since 3.3
*
*/
public class TabBehaviourMRU extends TabBehaviour {
public boolean alwaysShowPinAction() {
return false;
}
public IEditorReference findReusableEditor(WorkbenchPage page) {
boolean reuse = WorkbenchPlugin.getDefault().getPreferenceStore()
.getBoolean(IPreferenceConstants.REUSE_EDITORS_BOOLEAN);
if (!reuse) {
return null;
}
IEditorReference editors[] = page.getSortedEditors();
if (editors.length < page.getEditorReuseThreshold()) {
return null;
}
IEditorReference dirtyEditor = null;
// Find a editor to be reused
for (int i = 0; i < editors.length; i++) {
IEditorReference editor = editors[i];
// if(editor == activePart)
// continue;
if (editor.isPinned()) {
continue;
}
if (editor.isDirty()) {
if (dirtyEditor == null) {
dirtyEditor = editor;
}
continue;
}
return editor;
}
if (dirtyEditor == null) {
return null;
}
/* fix for 11122 */
boolean reuseDirty = WorkbenchPlugin.getDefault().getPreferenceStore()
.getBoolean(IPreferenceConstants.REUSE_DIRTY_EDITORS);
if (!reuseDirty) {
return null;
}
MessageDialog dialog = new MessageDialog(page.getWorkbenchWindow()
.getShell(),
WorkbenchMessages.EditorManager_reuseEditorDialogTitle,
null, // accept the default window icon
NLS.bind(WorkbenchMessages.EditorManager_saveChangesQuestion,
dirtyEditor.getName()), MessageDialog.QUESTION,
new String[] { IDialogConstants.YES_LABEL,
IDialogConstants.NO_LABEL,
WorkbenchMessages.EditorManager_openNewEditorLabel }, 0);
int result = dialog.open();
if (result == 0) { // YES
ProgressMonitorDialog pmd = new ProgressMonitorJobsDialog(dialog
.getShell());
pmd.open();
dirtyEditor.getEditor(true).doSave(pmd.getProgressMonitor());
pmd.close();
} else if ((result == 2) || (result == -1)) {
return null;
}
return dirtyEditor;
}
public IEditorReference reuseInternalEditor(WorkbenchPage page,
EditorManager manager, EditorAreaHelper editorPresentation,
EditorDescriptor desc, IEditorInput input,
IEditorReference reusableEditorRef) {
IEditorPart reusableEditor = reusableEditorRef.getEditor(false);
if (reusableEditor == null) {
IEditorReference result = new EditorReference(manager, input, desc);
page.closeEditor(reusableEditorRef, false);
return result;
}
EditorSite site = (EditorSite) reusableEditor.getEditorSite();
EditorDescriptor oldDesc = site.getEditorDescriptor();
if ((desc.getId().equals(oldDesc.getId()))
&& (reusableEditor instanceof IReusableEditor)) {
Workbench wb = (Workbench) page.getWorkbenchWindow().getWorkbench();
editorPresentation.moveEditor(reusableEditor, -1);
wb.getEditorHistory().add(reusableEditor.getEditorInput(),
site.getEditorDescriptor());
page.reuseEditor((IReusableEditor) reusableEditor, input);
return reusableEditorRef;
}
// findReusableEditor(...) checks pinned and saves editor if
// necessary, so it's OK to close "reusableEditor"
IEditorReference ref = new EditorReference(manager, input, desc);
reusableEditor.getEditorSite().getPage().closeEditor(reusableEditor,
false);
return ref;
}
}