package sk.stuba.fiit.perconik.activity.listeners.ui;
import org.eclipse.ui.IPerspectiveDescriptor;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.ui.IWorkbenchWindow;
import sk.stuba.fiit.perconik.activity.events.LocalEvent;
import sk.stuba.fiit.perconik.activity.listeners.ActivityListener;
import sk.stuba.fiit.perconik.activity.serializers.ui.PageSerializer;
import sk.stuba.fiit.perconik.activity.serializers.ui.PerspectiveDescriptorSerializer;
import sk.stuba.fiit.perconik.core.annotations.Version;
import sk.stuba.fiit.perconik.data.content.StructuredContent;
import sk.stuba.fiit.perconik.data.events.Event;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PerspectiveListener.Action.ACTIVATE;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PerspectiveListener.Action.CLOSE;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PerspectiveListener.Action.DEACTIVATE;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PerspectiveListener.Action.OPEN;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PerspectiveListener.Action.SAVE;
import static sk.stuba.fiit.perconik.activity.serializers.ConfigurableSerializer.StandardOption.TREE;
import static sk.stuba.fiit.perconik.activity.serializers.Serializations.identifyObject;
import static sk.stuba.fiit.perconik.activity.serializers.Serializers.asDisplayTask;
import static sk.stuba.fiit.perconik.data.content.StructuredContents.key;
/**
* TODO
*
* @author Pavol Zbell
* @since 1.0
*/
@Version("0.0.5.alpha")
public final class PerspectiveListener extends ActivityListener implements sk.stuba.fiit.perconik.core.listeners.PerspectiveListener {
// TODO document lifecycle: click eclipse start, click open perspective B, deactivate(A),
// activate(B), open(B), click close B, deactivate(B), activate(A), close(B)
// TODO SAVE does not work, even for debug listener
public PerspectiveListener() {}
enum Action implements ActivityListener.Action {
OPEN,
CLOSE,
ACTIVATE,
DEACTIVATE,
SAVE;
private final String name;
private final String path;
private Action() {
this.name = actionName("eclipse", "perspective", this);
this.path = actionPath(this.name);
}
public String getName() {
return this.name;
}
public String getPath() {
return this.path;
}
}
private void put(final StructuredContent content, final IWorkbenchPage page) {
IWorkbenchWindow window = page.getWorkbenchWindow();
IWorkbench workbench = window.getWorkbench();
content.put(key("page"), this.execute(asDisplayTask(new PageSerializer(TREE), page)));
content.put(key("page", "window"), identifyObject(window));
content.put(key("page", "window", "workbench"), identifyObject(workbench));
IPerspectiveDescriptor descriptor = page.getPerspective();
content.put(key("page", "perspective"), identifyObject(descriptor));
}
Event build(final long time, final Action action, final IWorkbenchPage page, final IPerspectiveDescriptor descriptor) {
Event data = LocalEvent.of(time, action.getName());
data.put(key("perspective"), new PerspectiveDescriptorSerializer().serialize(descriptor));
this.put(data, page);
return data;
}
Event build(final long time, final Action action, final IWorkbenchPage page, final IPerspectiveDescriptor before, final IPerspectiveDescriptor after) {
Event data = LocalEvent.of(time, action.getName());
PerspectiveDescriptorSerializer serializer = new PerspectiveDescriptorSerializer();
data.put(key("perspective", "before"), serializer.serialize(before));
data.put(key("perspective", "after"), serializer.serialize(after));
this.put(data, page);
return data;
}
void process(final long time, final Action action, final IWorkbenchPage page, final IPerspectiveDescriptor descriptor) {
this.send(action.getPath(), build(time, action, page, descriptor));
}
void process(final long time, final Action action, final IWorkbenchPage page, final IPerspectiveDescriptor before, final IPerspectiveDescriptor after) {
this.send(action.getPath(), build(time, action, page, before, after));
}
void execute(final long time, final Action action, final IWorkbenchPage page, final IPerspectiveDescriptor descriptor) {
this.execute(new Runnable() {
public void run() {
process(time, action, page, descriptor);
}
});
}
void execute(final long time, final Action action, final IWorkbenchPage page, final IPerspectiveDescriptor before, final IPerspectiveDescriptor after) {
this.execute(new Runnable() {
public void run() {
process(time, action, page, before, after);
}
});
}
public void perspectiveOpened(final IWorkbenchPage page, final IPerspectiveDescriptor descriptor) {
final long time = this.currentTime();
this.execute(time, OPEN, page, descriptor);
}
public void perspectiveClosed(final IWorkbenchPage page, final IPerspectiveDescriptor descriptor) {
final long time = this.currentTime();
this.execute(time, CLOSE, page, descriptor);
}
public void perspectiveActivated(final IWorkbenchPage page, final IPerspectiveDescriptor descriptor) {
final long time = this.currentTime();
this.execute(time, ACTIVATE, page, descriptor);
}
public void perspectiveDeactivated(final IWorkbenchPage page, final IPerspectiveDescriptor descriptor) {
final long time = this.currentTime();
this.execute(time, DEACTIVATE, page, descriptor);
}
public void perspectivePreDeactivate(final IWorkbenchPage page, final IPerspectiveDescriptor descriptor) {
// ignore
}
public void perspectiveChanged(final IWorkbenchPage page, final IPerspectiveDescriptor descriptor, final String change) {
// ignore
}
public void perspectiveChanged(final IWorkbenchPage page, final IPerspectiveDescriptor descriptor, final IWorkbenchPartReference reference, final String change) {
// ignore
}
public void perspectiveSavedAs(final IWorkbenchPage page, final IPerspectiveDescriptor before, final IPerspectiveDescriptor after) {
final long time = this.currentTime();
this.execute(time, SAVE, page, before, after);
}
}