X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.workbench%2Fsrc%2Forg%2Fsimantics%2Fworkbench%2Finternal%2FDelayedEventsProcessor.java;fp=bundles%2Forg.simantics.workbench%2Fsrc%2Forg%2Fsimantics%2Fworkbench%2Finternal%2FDelayedEventsProcessor.java;h=1ec446c168e33d4d68cead2277c7e7a5c92f8518;hb=969bd23cab98a79ca9101af33334000879fb60c5;hp=0000000000000000000000000000000000000000;hpb=866dba5cd5a3929bbeae85991796acb212338a08;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.workbench/src/org/simantics/workbench/internal/DelayedEventsProcessor.java b/bundles/org.simantics.workbench/src/org/simantics/workbench/internal/DelayedEventsProcessor.java new file mode 100644 index 000000000..1ec446c16 --- /dev/null +++ b/bundles/org.simantics.workbench/src/org/simantics/workbench/internal/DelayedEventsProcessor.java @@ -0,0 +1,121 @@ +package org.simantics.workbench.internal; + +import java.util.ArrayList; + +import org.eclipse.core.filesystem.EFS; +import org.eclipse.core.filesystem.IFileInfo; +import org.eclipse.core.filesystem.IFileStore; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.core.runtime.Path; +import org.eclipse.core.runtime.Status; +import org.eclipse.jface.dialogs.MessageDialog; +import org.eclipse.osgi.util.NLS; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.IWorkbenchPage; +import org.eclipse.ui.IWorkbenchWindow; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.ide.IDE; +import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; +import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; + +/** + * Helper class used to process delayed events. + * Events currently supported: + * + * @since 3.3 + */ +public class DelayedEventsProcessor implements Listener { + + private ArrayList filesToOpen = new ArrayList(1); + + /** + * Constructor. + * @param display display used as a source of event + */ + public DelayedEventsProcessor(Display display) { + display.addListener(SWT.OpenDocument, this); + } + + /* (non-Javadoc) + * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) + */ + public void handleEvent(Event event) { + final String path = event.text; + if (path == null) + return; + // If we start supporting events that can arrive on a non-UI thread, the following + // line will need to be in a "synchronized" block: + filesToOpen.add(path); + } + + /** + * Process delayed events. + * @param display display associated with the workbench + */ + public void catchUp(Display display) { + if (filesToOpen.isEmpty()) + return; + + // If we start supporting events that can arrive on a non-UI thread, the following + // lines will need to be in a "synchronized" block: + String[] filePaths = new String[filesToOpen.size()]; + filesToOpen.toArray(filePaths); + filesToOpen.clear(); + + for(int i = 0; i < filePaths.length; i++) { + openFile(display, filePaths[i]); + } + } + + private void openFile(Display display, final String path) { + display.asyncExec(new Runnable() { + public void run() { + IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); + if (window == null) + return; + IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(path)); + IFileInfo fetchInfo = fileStore.fetchInfo(); + if (!fetchInfo.isDirectory() && fetchInfo.exists()) { + IWorkbenchPage page = window.getActivePage(); + if (page == null) { + String msg = NLS.bind(IDEWorkbenchMessages.OpenDelayedFileAction_message_noWindow, path); + MessageDialog.open(MessageDialog.ERROR, window.getShell(), + IDEWorkbenchMessages.OpenDelayedFileAction_title, + msg, SWT.SHEET); + } + try { + IDE.openInternalEditorOnFileStore(page, fileStore); + Shell shell = window.getShell(); + if (shell != null) { + if (shell.getMinimized()) + shell.setMinimized(false); + shell.forceActive(); + } + } catch (PartInitException e) { + String msg = NLS.bind(IDEWorkbenchMessages.OpenDelayedFileAction_message_errorOnOpen, + fileStore.getName()); + CoreException eLog = new PartInitException(e.getMessage()); + IDEWorkbenchPlugin.log(msg, new Status(IStatus.ERROR, Activator.PLUGIN_ID, msg, eLog)); + MessageDialog.open(MessageDialog.ERROR, window.getShell(), + IDEWorkbenchMessages.OpenDelayedFileAction_title, + msg, SWT.SHEET); + } + } else { + String msg = NLS.bind(IDEWorkbenchMessages.OpenDelayedFileAction_message_fileNotFound, path); + MessageDialog.open(MessageDialog.ERROR, window.getShell(), + IDEWorkbenchMessages.OpenDelayedFileAction_title, + msg, SWT.SHEET); + } + } + }); + } + +}