/*******************************************************************************
* Copyright (c) 2009 Remy Chi Jian Suen 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:
* Remy Chi Jian Suen <remy.suen@gmail.com> - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.internal.sync.ui.resources;
import org.eclipse.core.filebuffers.ISynchronizationContext;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.datashare.IChannelContainerAdapter;
import org.eclipse.ecf.docshare2.DocShare;
import org.eclipse.ecf.docshare2.messages.StartMessage;
import org.eclipse.ecf.docshare2.messages.StopMessage;
import org.eclipse.ecf.sync.ui.resources.decorators.RemotelyOpenedEditorsDecorator;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.widgets.Control;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.ide.ResourceUtil;
import org.eclipse.ui.progress.WorkbenchJob;
public class WorkbenchAwareDocShare extends DocShare {
private Job decoratorJob;
public WorkbenchAwareDocShare(IChannelContainerAdapter adapter)
throws ECFException {
super(adapter);
decoratorJob = new DecoratorJob();
decoratorJob.setPriority(Job.DECORATE);
}
protected void handleStartMessage(StartMessage message)
throws CoreException {
super.handleStartMessage(message);
// starting to share a given file, request a decoration update
RemotelyOpenedEditorsDecorator.set.add(message.getPath());
decoratorJob.schedule();
}
protected void handleStopMessage(StopMessage message) {
super.handleStopMessage(message);
// no longer sharing a given file, request a decoration update
RemotelyOpenedEditorsDecorator.set.remove(message.getPath());
decoratorJob.schedule();
}
protected ISynchronizationContext getSynchronizationContext(String path) {
// if an editor is open for the specified file at the given path, we
// want to run code within a UI context
if (editorIsOpen(path)) {
return UI_CONTEXT;
}
return super.getSynchronizationContext(path);
}
protected void documentAboutToBeChanged(String path) {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(
new Path(path));
if (file.exists()) {
IEditorPart editor = findEditor(file);
if (editor != null) {
final StyledText control = (StyledText) editor
.getAdapter(Control.class);
if (control != null && !control.isDisposed()) {
PlatformUI.getWorkbench().getDisplay().syncExec(
new Runnable() {
public void run() {
control.setEditable(false);
}
});
}
}
}
}
protected void documentChanged(String path) {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(
new Path(path));
if (file.exists()) {
IEditorPart editor = findEditor(file);
if (editor != null) {
final StyledText control = (StyledText) editor
.getAdapter(Control.class);
if (control != null && !control.isDisposed()) {
PlatformUI.getWorkbench().getDisplay().syncExec(
new Runnable() {
public void run() {
control.setEditable(true);
}
});
}
}
}
}
private IEditorPart findEditor(final IFile file) {
final IEditorPart[] editors = { null };
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
public void run() {
IWorkbenchWindow[] workbenchWindows = PlatformUI.getWorkbench()
.getWorkbenchWindows();
for (int i = 0; i < workbenchWindows.length; i++) {
IWorkbenchPage page = workbenchWindows[i].getActivePage();
if (page != null) {
IEditorPart editor = ResourceUtil
.findEditor(page, file);
if (editor != null) {
editors[0] = editor;
return;
}
}
}
}
});
return editors[0];
}
private boolean editorIsOpen(String path) {
IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(
new Path(path));
return file.exists() && findEditor(file) != null;
}
private static ISynchronizationContext UI_CONTEXT = new ISynchronizationContext() {
public void run(Runnable runnable) {
PlatformUI.getWorkbench().getDisplay().syncExec(runnable);
}
};
private static class DecoratorJob extends WorkbenchJob {
public DecoratorJob() {
super(PlatformUI.getWorkbench().getDisplay(), "Decoration job");
}
public IStatus runInUIThread(IProgressMonitor monitor) {
try {
PlatformUI.getWorkbench().getDecoratorManager().update(
RemotelyOpenedEditorsDecorator.DECORATOR_ID);
return Status.OK_STATUS;
} finally {
monitor.done();
}
}
}
}