Skip to content
Snippets Groups Projects
Commit 676b6cb5 authored by Lukas Ladenberger's avatar Lukas Ladenberger
Browse files

improved and fixed some minor bugs in adding/removing/editing observer

parent 77a53d2a
No related branches found
No related tags found
No related merge requests found
...@@ -14,10 +14,10 @@ import org.eclipse.gef.ui.actions.SelectionAction; ...@@ -14,10 +14,10 @@ import org.eclipse.gef.ui.actions.SelectionAction;
import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.jface.wizard.WizardDialog;
import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPart;
import de.bmotionstudio.gef.editor.AttributeConstants;
import de.bmotionstudio.gef.editor.BMotionEditorPlugin; import de.bmotionstudio.gef.editor.BMotionEditorPlugin;
import de.bmotionstudio.gef.editor.BMotionStudioImage; import de.bmotionstudio.gef.editor.BMotionStudioImage;
import de.bmotionstudio.gef.editor.command.ObserverCommand; import de.bmotionstudio.gef.editor.command.RemoveObserverCommand;
import de.bmotionstudio.gef.editor.command.SetObserverCommand;
import de.bmotionstudio.gef.editor.model.BControl; import de.bmotionstudio.gef.editor.model.BControl;
import de.bmotionstudio.gef.editor.observer.Observer; import de.bmotionstudio.gef.editor.observer.Observer;
import de.bmotionstudio.gef.editor.observer.ObserverWizard; import de.bmotionstudio.gef.editor.observer.ObserverWizard;
...@@ -26,9 +26,10 @@ import de.prob.logging.Logger; ...@@ -26,9 +26,10 @@ import de.prob.logging.Logger;
public class OpenObserverAction extends SelectionAction { public class OpenObserverAction extends SelectionAction {
private String className; private String className;
private Observer clonedObserver;
private Observer newObserver; // private Observer oldObserver;
private BControl actionControl; // private Observer currentObserver;
// private BControl actionControl;
public OpenObserverAction(IWorkbenchPart part) { public OpenObserverAction(IWorkbenchPart part) {
super(part); super(part);
...@@ -48,35 +49,35 @@ public class OpenObserverAction extends SelectionAction { ...@@ -48,35 +49,35 @@ public class OpenObserverAction extends SelectionAction {
@Override @Override
public void run() { public void run() {
clonedObserver = null; BControl actionControl = getControl();
actionControl = getControl();
if (actionControl != null) { if (actionControl != null) {
newObserver = getControl().getObserver(getClassName()); Observer oldObserver = null;
Observer observer = getControl().getObserver(getClassName());
// Add Observer // If an observer does not exist, add one
if (newObserver == null) { if (observer == null) {
try { try {
newObserver = (Observer) BMotionEditorPlugin observer = (Observer) BMotionEditorPlugin
.getObserverExtension(getClassName()) .getObserverExtension(getClassName())
.createExecutableExtension("class"); .createExecutableExtension("class");
} catch (CoreException e) { } catch (CoreException e) {
} }
} else { // Edit Observer } else { // else edit the current observer
// Clone Observer // therefore, clone the current observer, if the user aborts
// editing the current observer
try { try {
clonedObserver = newObserver.clone(); oldObserver = observer.clone();
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
} }
} }
ObserverWizard wizard = newObserver.getWizard(getControl()); ObserverWizard wizard = observer.getWizard(actionControl);
if (wizard != null) { if (wizard != null) {
...@@ -84,65 +85,75 @@ public class OpenObserverAction extends SelectionAction { ...@@ -84,65 +85,75 @@ public class OpenObserverAction extends SelectionAction {
getWorkbenchPart(), wizard); getWorkbenchPart(), wizard);
dialog.create(); dialog.create();
dialog.getShell().setSize(wizard.getSize()); dialog.getShell().setSize(wizard.getSize());
String title = "Observer: " String title = "Observer: " + observer.getName()
+ newObserver.getName() + " Control: " + getControl().getID();
+ " Control: "
+ getControl().getAttributeValue(
AttributeConstants.ATTRIBUTE_ID);
wizard.setWindowTitle("BMotion Studio Observer Wizard"); wizard.setWindowTitle("BMotion Studio Observer Wizard");
dialog.setTitle(title); dialog.setTitle(title);
dialog.setMessage(newObserver.getDescription()); dialog.setMessage(observer.getDescription());
dialog.setTitleImage(BMotionStudioImage dialog.setTitleImage(BMotionStudioImage
.getImage(BMotionStudioImage.IMG_LOGO_BMOTION64)); .getImage(BMotionStudioImage.IMG_LOGO_BMOTION64));
int status = dialog.open(); int status = dialog.open();
// The user clicked on the "OK" button in order to confirm his
// changes on the observer
if (status == WizardDialog.OK) { if (status == WizardDialog.OK) {
ObserverCommand observerCommand = createObserverCommandCommand(); // If the observer delete flag is set to true, delete the
observerCommand.setNewObserver(newObserver); // observer anyway
if (wizard.isObserverDelete()) { if (wizard.isObserverDelete()) {
RemoveObserverCommand cmd = createRemoveObserverCommand(
RemoveObserverAction action = new RemoveObserverAction( observer, actionControl);
getWorkbenchPart()); execute(cmd);
action.setControl(getControl());
action.setObserver(newObserver);
action.run();
} else { } else {
if (clonedObserver != null) { SetObserverCommand cmd = createObserverSetCommand(
observerCommand.setClonedObserver(clonedObserver); actionControl, observer, oldObserver);
} execute(cmd);
execute(observerCommand);
} }
// else the user canceled his changes on the observer
} else if (status == WizardDialog.CANCEL) { } else if (status == WizardDialog.CANCEL) {
if (clonedObserver != null) // Reset observer without using a command!
actionControl.addObserver(clonedObserver); if (oldObserver != null)
actionControl.addObserver(oldObserver);
// else the user clicked on the delete button in order to
// delete the observer
} else if (status == BMotionObserverWizardDialog.DELETE) { } else if (status == BMotionObserverWizardDialog.DELETE) {
RemoveObserverAction action = new RemoveObserverAction( RemoveObserverCommand cmd = createRemoveObserverCommand(
getWorkbenchPart()); observer, actionControl);
action.setControl(getControl()); execute(cmd);
action.setObserver(newObserver);
action.run();
} }
} else { } else {
Logger.notifyUserWithoutBugreport("The Observer \"" Logger.notifyUserWithoutBugreport("The Observer \""
+ newObserver.getName() + observer.getName()
+ "\" does not support a wizard."); + "\" does not support a wizard.");
} }
} }
} }
public ObserverCommand createObserverCommandCommand() { private RemoveObserverCommand createRemoveObserverCommand(
ObserverCommand command = new ObserverCommand(); Observer observer, BControl control) {
command.setClassName(getClassName()); RemoveObserverCommand cmd = new RemoveObserverCommand();
command.setControl(actionControl); cmd.setControl(control);
return command; cmd.setObserver(observer);
return cmd;
}
public SetObserverCommand createObserverSetCommand(BControl control,
Observer newObserver, Observer oldObserver) {
SetObserverCommand cmd = new SetObserverCommand();
cmd.setNewObserver(newObserver);
cmd.setOldObserver(oldObserver);
cmd.setControl(control);
return cmd;
}
public SetObserverCommand createObserverSetCommand(BControl control,
Observer newObserver) {
return createObserverSetCommand(control, newObserver, null);
} }
public void setClassName(String className) { public void setClassName(String className) {
......
...@@ -11,53 +11,46 @@ import org.eclipse.gef.commands.Command; ...@@ -11,53 +11,46 @@ import org.eclipse.gef.commands.Command;
import de.bmotionstudio.gef.editor.model.BControl; import de.bmotionstudio.gef.editor.model.BControl;
import de.bmotionstudio.gef.editor.observer.Observer; import de.bmotionstudio.gef.editor.observer.Observer;
public class ObserverCommand extends Command { public class SetObserverCommand extends Command {
private String className; private Observer oldObserver;
private Observer clonedObserver;
private Observer newObserver; private Observer newObserver;
private Observer clonedNewObserver; private Observer clonedNewObserver;
private BControl control; private BControl control;
public void execute() { public void execute() {
// Clone the new observer
try { try {
clonedNewObserver = newObserver.clone(); clonedNewObserver = newObserver.clone();
} catch (CloneNotSupportedException e) { } catch (CloneNotSupportedException e) {
e.printStackTrace(); e.printStackTrace();
} }
// Set the new observer
control.addObserver(newObserver); control.addObserver(newObserver);
} }
public boolean canExecute() { public boolean canExecute() {
if (newObserver == null || control == null)
return false;
return true; return true;
} }
public void undo() { public void undo() {
// If we had an old observer, set the old one
// Remove completely new Observer if (oldObserver != null) {
if (clonedObserver == null) { control.addObserver(oldObserver);
control.removeObserver(getClassName()); // else remove the observer
} else { // Reset Observer } else {
control.addObserver(clonedObserver); control.removeObserver(newObserver);
} }
} }
public void redo() { public void redo() {
// Redo method adds the cloned observer, since the observer could be
// changed during set and redo action
control.addObserver(clonedNewObserver); control.addObserver(clonedNewObserver);
} }
public void setClassName(String className) {
this.className = className;
}
public String getClassName() {
return className;
}
public void setControl(BControl control) { public void setControl(BControl control) {
this.control = control; this.control = control;
} }
...@@ -66,12 +59,12 @@ public class ObserverCommand extends Command { ...@@ -66,12 +59,12 @@ public class ObserverCommand extends Command {
return this.control; return this.control;
} }
public Observer getClonedObserver() { public Observer getOldObserver() {
return clonedObserver; return oldObserver;
} }
public void setClonedObserver(Observer clonedObserver) { public void setOldObserver(Observer oldObserver) {
this.clonedObserver = clonedObserver; this.oldObserver = oldObserver;
} }
public Observer getNewObserver() { public Observer getNewObserver() {
......
...@@ -462,6 +462,10 @@ public abstract class BControl implements IAdaptable, Cloneable { ...@@ -462,6 +462,10 @@ public abstract class BControl implements IAdaptable, Cloneable {
} }
} }
public void removeObserver(Observer observer) {
removeObserver(observer.getID());
}
public void removeObserver(String observerID) { public void removeObserver(String observerID) {
if (hasObserver(observerID)) if (hasObserver(observerID))
observers.get(observerID).beforeDelete(this); observers.get(observerID).beforeDelete(this);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment