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.PartReferenceSerializer;
import sk.stuba.fiit.perconik.core.annotations.Version;
import sk.stuba.fiit.perconik.data.events.Event;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PartListener.Action.ACTIVATE;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PartListener.Action.BRING_TO_TOP;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PartListener.Action.CHANGE_INPUT;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PartListener.Action.CLOSE;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PartListener.Action.DEACTIVATE;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PartListener.Action.HIDE;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PartListener.Action.OPEN;
import static sk.stuba.fiit.perconik.activity.listeners.ui.PartListener.Action.SHOW;
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;
import static sk.stuba.fiit.perconik.utilities.MoreStrings.toLowerCase;
/**
* TODO
*
* @author Pavol Zbell
* @since 1.0
*/
@Version("0.0.5.alpha")
public final class PartListener extends ActivityListener implements sk.stuba.fiit.perconik.core.listeners.PartListener {
public PartListener() {}
enum Action implements ActivityListener.Action {
OPEN,
CLOSE,
ACTIVATE,
DEACTIVATE,
SHOW,
HIDE,
BRING_TO_TOP,
CHANGE_INPUT;
private final String name;
private final String path;
private Action() {
this.name = actionName("eclipse", "part", this);
this.path = actionPath(this.name);
}
public String getName() {
return this.name;
}
public String getPath() {
return this.path;
}
}
Event build(final long time, final Action action, final IWorkbenchPartReference reference) {
Event data = LocalEvent.of(time, action.getName());
data.put(key("reference"), this.execute(asDisplayTask(new PartReferenceSerializer(TREE), reference)));
IWorkbenchPage page = reference.getPage();
IWorkbenchWindow window = page.getWorkbenchWindow();
IWorkbench workbench = window.getWorkbench();
data.put(key("reference", "page"), identifyObject(page));
data.put(key("reference", "page", "window"), identifyObject(window));
data.put(key("reference", "page", "window", "workbench"), identifyObject(workbench));
IPerspectiveDescriptor descriptor = page.getPerspective();
data.put(key("reference", "page", "perspective"), identifyObject(descriptor));
return data;
}
void process(final long time, final Action action, final IWorkbenchPartReference reference) {
this.send(action.getPath(), this.build(time, action, reference));
}
void execute(final long time, final Action action, final IWorkbenchPartReference reference) {
IWorkbench workbench = reference.getPage().getWorkbenchWindow().getWorkbench();
if (workbench.isClosing() && (action == CLOSE || action == DEACTIVATE || action == HIDE)) {
if (this.log.isEnabled()) {
this.log.print("%s: workbench is closing, %1$s %s event not processed", "part", toLowerCase(action));
}
return;
}
this.execute(new Runnable() {
public void run() {
process(time, action, reference);
}
});
}
public void partOpened(final IWorkbenchPartReference reference) {
final long time = this.currentTime();
this.execute(time, OPEN, reference);
}
public void partClosed(final IWorkbenchPartReference reference) {
final long time = this.currentTime();
this.execute(time, CLOSE, reference);
}
public void partActivated(final IWorkbenchPartReference reference) {
final long time = this.currentTime();
this.execute(time, ACTIVATE, reference);
}
public void partDeactivated(final IWorkbenchPartReference reference) {
final long time = this.currentTime();
this.execute(time, DEACTIVATE, reference);
}
public void partVisible(final IWorkbenchPartReference reference) {
final long time = this.currentTime();
this.execute(time, SHOW, reference);
}
public void partHidden(final IWorkbenchPartReference reference) {
final long time = this.currentTime();
this.execute(time, HIDE, reference);
}
public void partBroughtToTop(final IWorkbenchPartReference reference) {
final long time = this.currentTime();
this.execute(time, BRING_TO_TOP, reference);
}
public void partInputChanged(final IWorkbenchPartReference reference) {
final long time = this.currentTime();
this.execute(time, CHANGE_INPUT, reference);
}
}