📄 oleeditor.java
字号:
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation 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 API and implementation
*******************************************************************************/
package org.eclipse.ui.internal.editorsupport.win32;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import java.util.Vector;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.dialogs.ProgressMonitorDialog;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.resource.JFaceColors;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.IEditorSite;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.IPartListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchActionConstants;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.dialogs.SaveAsDialog;
import org.eclipse.ui.internal.WorkbenchPlugin;
import org.eclipse.ui.part.EditorPart;
import org.eclipse.ui.part.FileEditorInput;
/**
*/
public class OleEditor extends EditorPart {
/**
* The resource listener updates the receiver when
* a change has occured.
*/
private IResourceChangeListener resourceListener = new IResourceChangeListener() {
/*
* @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
*/
public void resourceChanged(IResourceChangeEvent event) {
IResourceDelta mainDelta = event.getDelta();
if (mainDelta == null)
return;
IResourceDelta affectedElement = mainDelta.findMember(resource
.getFullPath());
if (affectedElement != null)
processDelta(affectedElement);
}
/*
* Process the delta for the receiver
*/
private boolean processDelta(final IResourceDelta delta) {
Runnable changeRunnable = null;
switch (delta.getKind()) {
case IResourceDelta.REMOVED:
if ((IResourceDelta.MOVED_TO & delta.getFlags()) != 0) {
changeRunnable = new Runnable() {
public void run() {
IPath path = delta.getMovedToPath();
IFile newFile = delta.getResource().getWorkspace()
.getRoot().getFile(path);
if (newFile != null) {
sourceChanged(newFile);
}
}
};
} else {
changeRunnable = new Runnable() {
public void run() {
sourceDeleted = true;
getSite().getPage().closeEditor(OleEditor.this,
true);
}
};
}
break;
}
if (changeRunnable != null)
update(changeRunnable);
return true; // because we are sitting on files anyway
}
};
private OleFrame clientFrame;
private OleClientSite clientSite;
private File source;
private IFile resource;
private Image oleTitleImage;
//The sourceDeleted flag makes sure that the receiver is not
//dirty when shutting down
boolean sourceDeleted = false;
//The sourceChanged flag indicates whether or not the save from the ole component
//can be used or if the input changed
boolean sourceChanged = false;
/**
* Keep track of whether we have an active client so we do not
* deactivate multiple times
*/
private boolean clientActive = false;
/**
* Keep track of whether we have activated OLE or not as some applications
* will only allow single activations.
*/
private boolean oleActivated = false;
private IPartListener partListener = new IPartListener() {
public void partActivated(IWorkbenchPart part) {
activateClient(part);
}
public void partBroughtToTop(IWorkbenchPart part) {
}
public void partClosed(IWorkbenchPart part) {
}
public void partOpened(IWorkbenchPart part) {
}
public void partDeactivated(IWorkbenchPart part) {
deactivateClient(part);
}
};
private static final String RENAME_ERROR_TITLE = OleMessages
.getString("OleEditor.errorSaving"); //$NON-NLS-1$
private static final String OLE_EXCEPTION_TITLE = OleMessages
.getString("OleEditor.oleExceptionTitle"); //$NON-NLS-1$
private static final String OLE_EXCEPTION_MESSAGE = OleMessages
.getString("OleEditor.oleExceptionMessage"); //$NON-NLS-1$
private static final String OLE_CREATE_EXCEPTION_MESSAGE = OleMessages
.getString("OleEditor.oleCreationExceptionMessage"); //$NON-NLS-1$
private static final String SAVE_ERROR_TITLE = OleMessages
.getString("OleEditor.savingTitle"); //$NON-NLS-1$
private static final String SAVE_ERROR_MESSAGE = OleMessages
.getString("OleEditor.savingMessage"); //$NON-NLS-1$
/**
* Return a new ole editor.
*/
public OleEditor() {
//Do nothing
}
private void activateClient(IWorkbenchPart part) {
if (part == this) {
oleActivate();
this.clientActive = true;
}
}
/**
* createPartControl method comment.
*/
public void createPartControl(Composite parent) {
// Create a frame.
clientFrame = new OleFrame(parent, SWT.CLIP_CHILDREN);
clientFrame.setBackground(JFaceColors.getBannerBackground(clientFrame
.getDisplay()));
initializeWorkbenchMenus();
// Set the input file.
IEditorInput input = getEditorInput();
if (input instanceof IFileEditorInput) {
setResource(((IFileEditorInput) input).getFile());
resource.getWorkspace().addResourceChangeListener(resourceListener);
}
createClientSite();
}
/**
* Create the client site for the reciever
*/
private void createClientSite() {
//If there was an OLE Error or nothing has been created yet
if (clientFrame == null || clientFrame.isDisposed())
return;
// Create a OLE client site.
try {
clientSite = new OleClientSite(clientFrame, SWT.NONE, source);
} catch (SWTException exception) {
IStatus errorStatus = new Status(IStatus.ERROR,
WorkbenchPlugin.PI_WORKBENCH, IStatus.ERROR,
OLE_CREATE_EXCEPTION_MESSAGE, exception);
ErrorDialog.openError(null, OLE_EXCEPTION_TITLE, errorStatus
.getMessage(), errorStatus);
return;
}
clientSite.setBackground(JFaceColors.getBannerBackground(clientFrame
.getDisplay()));
}
private void deactivateClient(IWorkbenchPart part) {
//Check the client active flag. Set it to false when we have deactivated
//to prevent multiple deactivations.
if (part == this && clientActive) {
if (clientSite != null)
clientSite.deactivateInPlaceClient();
this.clientActive = false;
this.oleActivated = false;
}
}
/**
* Display an error dialog with the supplied title and message.
* @param title
* @param message
*/
private void displayErrorDialog(String title, String message) {
Shell parent = null;
if (getClientSite() != null)
parent = getClientSite().getShell();
MessageDialog.openError(parent, title, message);
}
/**
* @see IWorkbenchPart#dispose
*/
public void dispose() {
if (resource != null)
resource.getWorkspace().removeResourceChangeListener(
resourceListener);
//can dispose the title image because it was created in init
if (oleTitleImage != null) {
oleTitleImage.dispose();
oleTitleImage = null;
}
if (getSite() != null && getSite().getPage() != null)
getSite().getPage().removePartListener(partListener);
}
/**
* Print this object's contents
*/
public void doPrint() {
if (clientSite == null)
return;
BusyIndicator.showWhile(clientSite.getDisplay(), new Runnable() {
public void run() {
clientSite.exec(OLE.OLECMDID_PRINT,
OLE.OLECMDEXECOPT_PROMPTUSER, null, null);
// note: to check for success: above == SWTOLE.S_OK
}
});
}
/**
* Save the viewer's contents to the source file system file
*/
public void doSave(final IProgressMonitor monitor) {
if (clientSite == null)
return;
BusyIndicator.showWhile(clientSite.getDisplay(), new Runnable() {
/*
* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
public void run() {
//Do not try and use the component provided save if the source has
//changed in Eclipse
if (!sourceChanged) {
int result = clientSite.queryStatus(OLE.OLECMDID_SAVE);
if ((result & OLE.OLECMDF_ENABLED) != 0) {
result = clientSite.exec(OLE.OLECMDID_SAVE,
OLE.OLECMDEXECOPT_PROMPTUSER, null, null);
if (result == OLE.S_OK) {
try {
resource.refreshLocal(IResource.DEPTH_ZERO,
monitor);
} catch (CoreException ex) {
//Do nothing on a failed refresh
}
return;
}
displayErrorDialog(OLE_EXCEPTION_TITLE,
OLE_EXCEPTION_MESSAGE + String.valueOf(result));
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -