package at.biooffice.osgi.service.gis.impl;

import org.eclipse.ui.ISelectionListener;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;

import at.biooffice.osgi.service.gis.GISService;

public class RegisterAtWorkbench implements Runnable {

	GISService service;
	ISelectionListener selectionListener;
	boolean unregister;
	boolean jobDone = false;

	public RegisterAtWorkbench(GISService _service,
			ISelectionListener _selectionListener, boolean _unregister) {
		this.service = _service;
		this.selectionListener = _selectionListener;
		this.unregister = _unregister;
	}

	public RegisterAtWorkbench(GISService _service,
			ISelectionListener _selectionListener) {
		this(_service, _selectionListener, true);
	}

	@Override
	public void run() {

		while (!jobDone) {
			try {
				if (this.selectionListener != null) {
					synchronized (this) {
						if (unregister) {
							final IWorkbench workbench = PlatformUI
									.getWorkbench();
							workbench.getDisplay().syncExec(new Runnable() {
								public void run() {
									IWorkbenchWindow window = workbench
											.getActiveWorkbenchWindow();
									if (window != null) {
										// do something
										window.getSelectionService()
												.removePostSelectionListener(
														RegisterAtWorkbench.this.selectionListener);
										RegisterAtWorkbench.this.selectionListener = null;
										RegisterAtWorkbench.this.jobDone = true; // successfully
																					// unregistered
										System.err
												.println("successfully unregistered");
									}
								}
							});
						} else {
							final IWorkbench workbench = PlatformUI
									.getWorkbench();
							workbench.getDisplay().syncExec(new Runnable() {
								public void run() {
									IWorkbenchWindow window = workbench
											.getActiveWorkbenchWindow();
									if (window != null) {
										// do something
										window.getSelectionService()
												.addPostSelectionListener(
														RegisterAtWorkbench.this.selectionListener);
										RegisterAtWorkbench.this.selectionListener = null;
										RegisterAtWorkbench.this.jobDone = true; // successfully
																					// registered
										System.err
												.println("successfully registered");
									}
								}
							});
						}
					}
				}
			} catch (Exception e) {
				try {
					System.err
							.println("registering selectionService failed, retrying...");
					e.printStackTrace();
					Thread.currentThread().sleep(1000);
				} catch (InterruptedException e2) {
					System.err.println("failed to sleep with this thread");
				}
			}
		}
	}
}