📄 oleeditor.java
字号:
if (saveFile(source)) {
try {
resource.refreshLocal(IResource.DEPTH_ZERO, monitor);
} catch (CoreException ex) {
//Do nothing on a failed refresh
}
} else
displayErrorDialog(SAVE_ERROR_TITLE, SAVE_ERROR_MESSAGE
+ source.getName());
}
});
}
/**
* Save the viewer's contents into the provided resource.
*/
public void doSaveAs() {
if (clientSite == null)
return;
WorkspaceModifyOperation op = saveNewFileOperation();
Shell shell = clientSite.getShell();
try {
new ProgressMonitorDialog(shell).run(false, true, op);
} catch (InterruptedException interrupt) {
//Nothing to reset so do nothing
} catch (InvocationTargetException invocationException) {
MessageDialog.openError(shell, RENAME_ERROR_TITLE,
invocationException.getTargetException().getMessage());
}
}
/**
* Answer self's client site
*
* @return org.eclipse.swt.ole.win32.OleClientSite
*/
public OleClientSite getClientSite() {
return clientSite;
}
/**
* Answer the file system representation of self's input element
*
* @return java.io.File
*/
public File getSourceFile() {
return source;
}
private void handleWord() {
OleAutomation dispInterface = new OleAutomation(clientSite);
// Get Application
int[] appId = dispInterface
.getIDsOfNames(new String[] { "Application" }); //$NON-NLS-1$
if (appId != null) {
Variant pVarResult = dispInterface.getProperty(appId[0]);
if (pVarResult != null) {
OleAutomation application = pVarResult.getAutomation();
int[] dispid = application
.getIDsOfNames(new String[] { "DisplayScrollBars" }); //$NON-NLS-1$
if (dispid != null) {
Variant rgvarg = new Variant(true);
application.setProperty(dispid[0], rgvarg);
}
application.dispose();
}
}
dispInterface.dispose();
}
/* (non-Javadoc)
* Initializes the editor when created from scratch.
*
* This method is called soon after part construction and marks
* the start of the extension lifecycle. At the end of the
* extension lifecycle <code>shutdown</code> will be invoked
* to terminate the lifecycle.
*
* @param container an interface for communication with the part container
* @param input The initial input element for the editor. In most cases
* it is an <code>IFile</code> but other types are acceptable.
* @see IWorkbenchPart#shutdown
*/
public void init(IEditorSite site, IEditorInput input)
throws PartInitException {
// Check input.
if (!(input instanceof IFileEditorInput))
throw new PartInitException(OleMessages.format(
"OleEditor.invalidInput", new Object[] { input })); //$NON-NLS-1$
IFile file = (((IFileEditorInput) input).getFile());
//Cannot create this with a file and no physical location
if (file.getLocation() == null
|| !(new File(file.getLocation().toOSString()).exists()))
throw new PartInitException(
OleMessages
.format(
"OleEditor.noFileInput", new Object[] { file.getLocation() })); //$NON-NLS-1$
// Save input.
setSite(site);
setInput(input);
// Update titles.
setTitle(input.getName());
setTitleToolTip(input.getToolTipText());
ImageDescriptor desc = input.getImageDescriptor();
if (desc != null) {
oleTitleImage = desc.createImage();
setTitleImage(oleTitleImage);
}
// Listen for part activation.
site.getPage().addPartListener(partListener);
}
/**
* Initialize the workbench menus for proper merging
*/
protected void initializeWorkbenchMenus() {
//If there was an OLE Error or nothing has been created yet
if (clientFrame == null || clientFrame.isDisposed())
return;
// Get the browser menubar. If one does not exist then
// create it.
Shell shell = clientFrame.getShell();
Menu menuBar = shell.getMenuBar();
if (menuBar == null) {
menuBar = new Menu(shell, SWT.BAR);
shell.setMenuBar(menuBar);
}
// Swap the file and window menus.
MenuItem[] windowMenu = new MenuItem[1];
MenuItem[] fileMenu = new MenuItem[1];
Vector containerItems = new Vector();
IWorkbenchWindow window = getSite().getWorkbenchWindow();
for (int i = 0; i < menuBar.getItemCount(); i++) {
MenuItem item = menuBar.getItem(i);
String id = ""; //$NON-NLS-1$
if (item.getData() instanceof IMenuManager)
id = ((IMenuManager) item.getData()).getId();
if (id.equals(IWorkbenchActionConstants.M_FILE))
fileMenu[0] = item;
else if (id.equals(IWorkbenchActionConstants.M_WINDOW))
windowMenu[0] = item;
else {
if (window.isApplicationMenu(id)) {
containerItems.addElement(item);
}
}
}
MenuItem[] containerMenu = new MenuItem[containerItems.size()];
containerItems.copyInto(containerMenu);
clientFrame.setFileMenus(fileMenu);
clientFrame.setContainerMenus(containerMenu);
clientFrame.setWindowMenus(windowMenu);
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.ISaveablePart#isDirty()
*/
public boolean isDirty() {
/*Return only if we have a clientSite which is dirty
as this can be asked before anything is opened*/
return this.clientSite != null;
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.ISaveablePart#isSaveAsAllowed()
*/
public boolean isSaveAsAllowed() {
return true;
}
/**
*Since we don't know when a change has been made, always answer true
* @return <code>false</code> if it was not opened and <code>true</code>
* only if it is dirty
*/
public boolean isSaveNeeded() {
return getClientSite() != null && isDirty();
}
/**
* Save the supplied file using the SWT API.
* @param file java.io.File
* @return <code>true</code> if the save was successful
*/
private boolean saveFile(File file) {
File tempFile = new File(file.getAbsolutePath() + ".tmp"); //$NON-NLS-1$
file.renameTo(tempFile);
boolean saved = false;
if (OLE.isOleFile(file) || usesStorageFiles(clientSite.getProgramID())) {
saved = clientSite.save(file, true);
} else {
saved = clientSite.save(file, false);
}
if (saved) {
// save was successful so discard the backup
tempFile.delete();
return true;
}
// save failed so restore the backup
tempFile.renameTo(file);
return false;
}
/**
* Save the new File using the client site.
* @return WorkspaceModifyOperation
*/
private WorkspaceModifyOperation saveNewFileOperation() {
return new WorkspaceModifyOperation() {
public void execute(final IProgressMonitor monitor)
throws CoreException {
SaveAsDialog dialog = new SaveAsDialog(clientFrame.getShell());
IFileEditorInput input = (IFileEditorInput) getEditorInput();
IFile sFile = input.getFile();
dialog.setOriginalFile(sFile);
dialog.open();
IPath newPath = dialog.getResult();
if (newPath == null)
return;
if (dialog.getReturnCode() == Window.OK) {
String projectName = newPath.segment(0);
newPath = newPath.removeFirstSegments(1);
IProject project = resource.getWorkspace().getRoot()
.getProject(projectName);
newPath = project.getLocation().append(newPath);
File newFile = newPath.toFile();
if (saveFile(newFile)) {
IFile newResource = resource.getWorkspace().getRoot()
.getFileForLocation(newPath);
if (newResource != null) {
sourceChanged(newResource);
newResource.refreshLocal(IResource.DEPTH_ZERO,
monitor);
}
} else {
displayErrorDialog(SAVE_ERROR_TITLE, SAVE_ERROR_MESSAGE
+ newFile.getName());
return;
}
}
}
};
}
/*
* (non-Javadoc)
* @see org.eclipse.ui.IWorkbenchPart#setFocus()
*/
public void setFocus() {
//Do not take focus
}
/**
* Make ole active so that the controls are rendered.
*/
private void oleActivate() {
//If there was an OLE Error or nothing has been created yet
if (clientSite == null || clientFrame == null
|| clientFrame.isDisposed())
return;
if (!oleActivated) {
clientSite.doVerb(OLE.OLEIVERB_SHOW);
oleActivated = true;
String progId = clientSite.getProgramID();
if (progId != null && progId.startsWith("Word.Document")) { //$NON-NLS-1$
handleWord();
}
}
}
/**
* Set the file resource that this object is displaying
* @param file
*/
protected void setResource(IFile file) {
resource = file;
source = new File(file.getLocation().toOSString());
}
/**
* See if it is one of the known types that use OLE Storage.
* @param progID the type to test
* @return <code>true</code> if it is one of the known types
*/
private static boolean usesStorageFiles(String progID) {
return (progID != null && (progID.startsWith("Word.", 0) //$NON-NLS-1$
|| progID.startsWith("MSGraph", 0) //$NON-NLS-1$
|| progID.startsWith("PowerPoint", 0) //$NON-NLS-1$
|| progID.startsWith("Excel", 0))); //$NON-NLS-1$
}
/**
* The source has changed to the newFile. Update
* editors and set any required flags
* @param newFile The file to get the new contents from.
*/
private void sourceChanged(IFile newFile) {
FileEditorInput newInput = new FileEditorInput(newFile);
setInput(newInput);
setResource(newFile);
sourceChanged = true;
setTitle(newInput.getName());
}
/*
* See IEditorPart.isSaveOnCloseNeeded()
*/
public boolean isSaveOnCloseNeeded() {
return !sourceDeleted && super.isSaveOnCloseNeeded();
}
/**
* Posts the update code "behind" the running operation.
*
* @param runnable the update code
*/
private void update(Runnable runnable) {
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
if (windows != null && windows.length > 0) {
Display display = windows[0].getShell().getDisplay();
display.asyncExec(runnable);
} else
runnable.run();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -