Issue #697 Fixed session closing issues and null pointer in gfe

Change-Id: Id12a3a15616299aaff4bc6fec72b615f1d79ef10

Former-commit-id: 0adccb8b12 [formerly 7d5d086fe1] [formerly 0adccb8b12 [formerly 7d5d086fe1] [formerly 6a0ed72e5e [formerly 695134c3139868d6e9ace9dca7757368e0bfa5ec]]]
Former-commit-id: 6a0ed72e5e
Former-commit-id: 57af7d8bdc [formerly 70461db99f]
Former-commit-id: 0eb6e89fb3
This commit is contained in:
Max Schenkelberg 2012-06-07 09:44:40 -05:00
parent 6b5e48d697
commit f3e91d1717
8 changed files with 149 additions and 102 deletions

View file

@ -30,10 +30,10 @@ import org.eclipse.ui.IWorkbenchPart;
import com.raytheon.uf.common.status.UFStatus.Priority;
import com.raytheon.uf.viz.collaboration.comm.identity.ISharedDisplaySession;
import com.raytheon.uf.viz.collaboration.ui.Activator;
import com.raytheon.uf.viz.collaboration.ui.telestrator.CollaborationDrawingResource;
import com.raytheon.uf.viz.collaboration.ui.telestrator.CollaborationDrawingResourceData;
import com.raytheon.uf.viz.core.IDisplayPane;
import com.raytheon.uf.viz.core.drawables.IDescriptor;
import com.raytheon.uf.viz.core.drawables.IRenderableDisplay;
import com.raytheon.uf.viz.core.drawables.ResourcePair;
import com.raytheon.uf.viz.core.exception.VizException;
import com.raytheon.uf.viz.core.rsc.AbstractVizResource;
@ -85,11 +85,10 @@ public abstract class AbstractRoleEventController implements
// Orphaned tellestrators, not sure what to do yet about clear
for (AbstractEditor editor : resourceEditors) {
partClosed(editor);
deactivateResources(editor);
}
for (ResourcePair rp : resourcesAdded) {
CollaborationDrawingResource resource = (CollaborationDrawingResource) rp
.getResource();
AbstractVizResource<?, ?> resource = rp.getResource();
if (resource != null) {
resource.getDescriptor().getResourceList()
.removePostRemoveListener(this);
@ -102,27 +101,30 @@ public abstract class AbstractRoleEventController implements
protected void activateResources(AbstractEditor editor) {
for (IDisplayPane pane : editor.getDisplayPanes()) {
try {
IDescriptor descriptor = pane.getDescriptor();
for (ResourcePair resource : getResourcesToAdd()) {
if (resource.getResource() == null) {
resource.setResource(resource.getResourceData()
.construct(resource.getLoadProperties(),
descriptor));
}
descriptor.getResourceList().add(resource);
descriptor.getResourceList().addPostRemoveListener(this);
resourcesAdded.add(resource);
}
} catch (VizException e) {
Activator.statusHandler.handle(Priority.PROBLEM,
"Error adding drawing resource to pane", e);
}
activateResources(pane.getRenderableDisplay());
}
resourceEditors.add(editor);
editor.getSite().getPage().addPartListener(this);
}
protected void activateResources(IRenderableDisplay display) {
try {
IDescriptor descriptor = display.getDescriptor();
for (ResourcePair resource : getResourcesToAdd()) {
if (resource.getResource() == null) {
resource.setResource(resource.getResourceData().construct(
resource.getLoadProperties(), descriptor));
}
descriptor.getResourceList().add(resource);
descriptor.getResourceList().addPostRemoveListener(this);
resourcesAdded.add(resource);
}
} catch (VizException e) {
Activator.statusHandler.handle(Priority.PROBLEM,
"Error adding drawing resource to pane", e);
}
}
protected void deactivateResources(AbstractEditor editor) {
partClosed(editor);
editor.getSite().getPage().removePartListener(this);

View file

@ -102,7 +102,10 @@ public class DataProviderEventController extends AbstractRoleEventController
try {
CollaborationDispatcher dispatcher = new CollaborationDispatcher(
session, display);
dispatchers.add(dispatcher);
synchronized (dispatchers) {
dispatchers.add(dispatcher);
dispatcher.setActiveDisplay(activeDisplay);
}
return dispatcher;
} catch (CollaborationException e) {
throw new InstantiationException(
@ -114,6 +117,8 @@ public class DataProviderEventController extends AbstractRoleEventController
private List<CollaborationDispatcher> dispatchers = new LinkedList<CollaborationDispatcher>();
private IRenderableDisplay activeDisplay;
public DataProviderEventController(ISharedDisplaySession session) {
super(session);
}
@ -280,8 +285,11 @@ public class DataProviderEventController extends AbstractRoleEventController
}
private void setActiveDisplay(IRenderableDisplay display) {
for (CollaborationDispatcher dispatcher : dispatchers) {
dispatcher.setActiveDisplay(display);
synchronized (dispatchers) {
this.activeDisplay = display;
for (CollaborationDispatcher dispatcher : dispatchers) {
dispatcher.setActiveDisplay(display);
}
}
ReprojectEditor event = new ReprojectEditor();
event.setTargetGeometry(display.getDescriptor().getGridGeometry());
@ -295,7 +303,22 @@ public class DataProviderEventController extends AbstractRoleEventController
}
}
private void handleNewDisplay(IDisplayPane pane) {
/**
* Handles a new display pane
*
* @param pane
* @return true if the pane is not currently being handled by the controller
*/
private boolean handleNewDisplay(IDisplayPane pane) {
boolean newDisplay = false;
synchronized (dispatchers) {
for (CollaborationDispatcher dispatcher : dispatchers) {
if (dispatcher.getDisplay() == pane.getRenderableDisplay()) {
// We already have a dispatcher for this display
return false;
}
}
}
try {
if (DispatchingGraphicsFactory.injectRemoteFunctionality(pane,
factory)) {
@ -306,10 +329,12 @@ public class DataProviderEventController extends AbstractRoleEventController
}
list.addPreAddListener(wrappingListener);
list.addPostRemoveListener(wrappingListener);
newDisplay = true;
}
} catch (InstantiationException e) {
statusHandler.handle(Priority.PROBLEM, e.getLocalizedMessage(), e);
}
return newDisplay;
}
/*
@ -407,7 +432,6 @@ public class DataProviderEventController extends AbstractRoleEventController
.getSessionContainer(session.getSessionId());
if (sc != null) {
for (AbstractEditor editor : sc.getSharedEditors()) {
super.deactivateResources(editor);
for (IDisplayPane pane : editor.getDisplayPanes()) {
ResourceList list = pane.getDescriptor().getResourceList();
for (ResourcePair rp : list) {
@ -416,12 +440,16 @@ public class DataProviderEventController extends AbstractRoleEventController
list.removePreAddListener(wrappingListener);
list.removePostRemoveListener(wrappingListener);
}
editor.removeRenderableDisplayChangedListener(this);
}
}
// Dispatchers created are responsible for display extraction
for (CollaborationDispatcher dispatcher : dispatchers) {
dispatcher.dispose();
synchronized (dispatchers) {
// Dispatchers created are responsible for display extraction
for (CollaborationDispatcher dispatcher : dispatchers) {
dispatcher.dispose();
}
dispatchers.clear();
}
}
@ -457,8 +485,19 @@ public class DataProviderEventController extends AbstractRoleEventController
public void renderableDisplayChanged(IDisplayPane pane,
IRenderableDisplay newRenderableDisplay, DisplayChangeType type) {
if (type == DisplayChangeType.ADD) {
handleNewDisplay(pane);
setActiveDisplay(newRenderableDisplay);
if (handleNewDisplay(pane)) {
activateResources(newRenderableDisplay);
}
if (newRenderableDisplay.getGraphicsAdapter() instanceof DispatchingGraphicsFactory) {
synchronized (dispatchers) {
for (CollaborationDispatcher dispatcher : dispatchers) {
if (dispatcher.getDisplay() == newRenderableDisplay) {
setActiveDisplay(newRenderableDisplay);
break;
}
}
}
}
}
}
}

View file

@ -113,35 +113,15 @@ public class CollaborationSessionView extends SessionView implements
private ISharedDisplaySession session;
private DrawingToolLayer layer;
private CollaborationDrawingResource resource;
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.collaboration.ui.session.SessionView#createPartControl
* (org.eclipse.swt.widgets.Composite)
*/
@Override
public void createPartControl(Composite parent) {
super.createPartControl(parent);
assignLayer();
}
public boolean assignLayer() {
private CollaborationDrawingResource getCurrentResource() {
SessionContainer sc = SharedDisplaySessionMgr
.getSessionContainer(sessionId);
ResourceList toSearch = null;
IEditorPart part = null;
if (sc.getCollaborationEditor() == null) {
// if the editor has not been started in the participant yet
if (sc.getSharedEditors() == null) {
return false;
}
for (AbstractEditor editor : sc.getSharedEditors()) {
part = editor;
break;
}
} else {
part = SharedDisplaySessionMgr.getSessionContainer(sessionId)
@ -151,24 +131,21 @@ public class CollaborationSessionView extends SessionView implements
AbstractEditor editor = (AbstractEditor) part;
for (IDisplayPane pane : editor.getDisplayPanes()) {
toSearch = pane.getDescriptor().getResourceList();
resource = (CollaborationDrawingResource) toSearch
.getResourcesByTypeAsType(
CollaborationDrawingResource.class).get(0);
layer = resource.getDrawingLayerFor(resource.getMyUser());
return true;
for (CollaborationDrawingResource rsc : toSearch
.getResourcesByTypeAsType(CollaborationDrawingResource.class)) {
return rsc;
}
}
}
return false;
return null;
}
public void drawingLayerUpdate() {
boolean assigned = true;
if (layer == null) {
assigned = assignLayer();
}
if (assigned) {
updateToolItems();
private DrawingToolLayer getCurrentLayer() {
CollaborationDrawingResource resource = getCurrentResource();
if (resource != null) {
return resource.getDrawingLayerFor(resource.getMyUser());
}
return null;
}
/*
@ -219,6 +196,7 @@ public class CollaborationSessionView extends SessionView implements
drawAction = new ActionContributionItem(new Action("Draw", SWT.TOGGLE) {
@Override
public void run() {
DrawingToolLayer layer = getCurrentLayer();
if (layer.getDrawMode() == DrawMode.DRAW) {
layer.setDrawMode(DrawMode.NONE);
} else {
@ -235,7 +213,10 @@ public class CollaborationSessionView extends SessionView implements
undoAction = new ActionContributionItem(new Action("Undo") {
@Override
public void run() {
layer.undo();
DrawingToolLayer layer = getCurrentLayer();
if (layer != null) {
layer.undo();
}
updateToolItems();
}
});
@ -247,7 +228,10 @@ public class CollaborationSessionView extends SessionView implements
redoAction = new ActionContributionItem(new Action("Redo") {
@Override
public void run() {
layer.redo();
DrawingToolLayer layer = getCurrentLayer();
if (layer != null) {
layer.redo();
}
updateToolItems();
}
});
@ -260,10 +244,13 @@ public class CollaborationSessionView extends SessionView implements
new Action("Erase", SWT.TOGGLE) {
@Override
public void run() {
if (layer.getDrawMode() == DrawMode.ERASE) {
layer.setDrawMode(DrawMode.NONE);
} else {
layer.setDrawMode(DrawMode.ERASE);
DrawingToolLayer layer = getCurrentLayer();
if (layer != null) {
if (layer.getDrawMode() == DrawMode.ERASE) {
layer.setDrawMode(DrawMode.NONE);
} else {
layer.setDrawMode(DrawMode.ERASE);
}
}
updateToolItems();
}
@ -275,7 +262,10 @@ public class CollaborationSessionView extends SessionView implements
clearAction = new ActionContributionItem(new Action("Clear") {
public void run() {
layer.clear();
DrawingToolLayer layer = getCurrentLayer();
if (layer != null) {
layer.clear();
}
updateToolItems();
};
});
@ -287,9 +277,12 @@ public class CollaborationSessionView extends SessionView implements
lockAction = new ActionContributionItem(new Action(
"Lock Collaborators", SWT.TOGGLE) {
public void run() {
resource.setLockingDrawing(((ToolItem) lockAction.getWidget())
.getSelection());
updateToolItems();
CollaborationDrawingResource resource = getCurrentResource();
if (resource != null) {
resource.setLockingDrawing(((ToolItem) lockAction
.getWidget()).getSelection());
updateToolItems();
}
};
});
lockAction.getAction().setImageDescriptor(
@ -308,11 +301,8 @@ public class CollaborationSessionView extends SessionView implements
}
public void updateToolItems() {
boolean assigned = true;
if (layer == null) {
assigned = assignLayer();
}
if (assigned) {
DrawingToolLayer layer = getCurrentLayer();
if (layer != null) {
drawAction.getAction().setEnabled(true);
undoAction.getAction().setEnabled(layer.canUndo());
redoAction.getAction().setEnabled(layer.canRedo());
@ -332,7 +322,8 @@ public class CollaborationSessionView extends SessionView implements
eraseAction.getAction().setChecked(false);
break;
}
if (!resource.isSessionLeader()) {
CollaborationDrawingResource resource = getCurrentResource();
if (resource != null && !resource.isSessionLeader()) {
lockAction.getAction().setEnabled(false);
}
}
@ -437,7 +428,8 @@ public class CollaborationSessionView extends SessionView implements
@Subscribe
public void receiveLocking(CollaborationDrawingEvent event) {
if (event.getType() == CollaborationEventType.TOGGLE_LOCK) {
if (!resource.isSessionLeader()) {
CollaborationDrawingResource resource = getCurrentResource();
if (resource != null && !resource.isSessionLeader()) {
if (drawAction.getAction().isEnabled()) {
drawAction.getAction().setEnabled(false);
undoAction.getAction().setEnabled(false);
@ -487,6 +479,8 @@ public class CollaborationSessionView extends SessionView implements
getSite().getPage().removePartListener(this);
}
// =================== Context activation code ===================
/*
* (non-Javadoc)
*

View file

@ -130,6 +130,11 @@ public class CollaborationDrawingResource extends
ColorableCapability colorable = getCapability(ColorableCapability.class);
colorable.setSuppressingMenuItems(true);
CollaborationDrawingEvent event = new CollaborationDrawingEvent();
event.setUserName(myUser);
event.setType(CollaborationEventType.CLEAR_ALL);
sendEvent(event);
}
manager = new CollaborationDrawingUIManager(this);
@ -176,9 +181,7 @@ public class CollaborationDrawingResource extends
*/
@Override
protected void disposeInternal() {
for (DrawingToolLayer layer : layerMap.values()) {
layer.dispose();
}
disposeLayers();
layerMap.clear();
layerMap = null;
@ -186,6 +189,12 @@ public class CollaborationDrawingResource extends
container.getSession().unRegisterEventHandler(this);
}
private void disposeLayers() {
for (DrawingToolLayer layer : layerMap.values()) {
layer.dispose();
}
}
/**
* @return the myUser
*/
@ -346,6 +355,9 @@ public class CollaborationDrawingResource extends
case UNDO:
layer.undo();
break;
case CLEAR_ALL:
disposeLayers();
break;
}
}
issueRefresh();

View file

@ -63,7 +63,7 @@ public class CollaborationDrawingUIManager extends DrawingToolUIManager {
view = (CollaborationSessionView) page.findViewReference(
CollaborationSessionView.ID,
resource.getContainer().getSessionId()).getPart(false);
view.drawingLayerUpdate();
view.updateToolItems();
}
});
}
@ -81,16 +81,11 @@ public class CollaborationDrawingUIManager extends DrawingToolUIManager {
/*
* (non-Javadoc)
*
* @see
* com.raytheon.uf.viz.drawing.DrawingToolUIManager#handleMouseDown(int,
* int, int)
* @see com.raytheon.uf.viz.drawing.DrawingToolUIManager#canTellestrate(int)
*/
@Override
public boolean handleMouseDown(int x, int y, int mouseButton) {
if (resource.canTellestrate() == false) {
return false;
}
return super.handleMouseDown(x, y, mouseButton);
protected boolean canTellestrate(int mouseButton) {
return super.canTellestrate(mouseButton) && resource.canTellestrate();
}
/*
@ -103,7 +98,7 @@ public class CollaborationDrawingUIManager extends DrawingToolUIManager {
public boolean handleMouseUp(int x, int y, int mouseButton) {
boolean rval = super.handleMouseUp(x, y, mouseButton);
if (rval) {
view.drawingLayerUpdate();
view.updateToolItems();
}
return rval;
}

View file

@ -47,7 +47,7 @@ import com.vividsolutions.jts.geom.Coordinate;
public class CollaborationDrawingEvent {
public static enum CollaborationEventType {
DRAW, ERASE, REDO, UNDO, CLEAR, TOGGLE_LOCK;
DRAW, ERASE, REDO, UNDO, CLEAR, TOGGLE_LOCK, CLEAR_ALL;
}
@DynamicSerializeElement

View file

@ -110,7 +110,7 @@ public class DrawingToolUIManager extends InputAdapter {
*/
@Override
public boolean handleMouseExit(Event event) {
if (!handlingInput) {
if (canTellestrate(event.button)) {
if (currentShell != null) {
currentShell.setCursor(normal);
}
@ -127,7 +127,7 @@ public class DrawingToolUIManager extends InputAdapter {
*/
@Override
public boolean handleMouseEnter(Event event) {
if (handlingInput == false) {
if (canTellestrate(event.button)) {
currentShell = ((Control) event.widget).getShell();
switch (drawingLayer.getDrawMode()) {
case DRAW:
@ -151,8 +151,7 @@ public class DrawingToolUIManager extends InputAdapter {
*/
@Override
public boolean handleMouseDown(int x, int y, int mouseButton) {
if (mouseButton != 1 || drawingLayer.getDrawMode() == DrawMode.NONE
|| handlingInput) {
if (!canTellestrate(mouseButton)) {
return false;
}
handlingInput = true;
@ -200,4 +199,8 @@ public class DrawingToolUIManager extends InputAdapter {
return true;
}
protected boolean canTellestrate(int mouseButton) {
return handlingInput == false && mouseButton == 1
&& drawingLayer.getDrawMode() != DrawMode.NONE;
}
}

View file

@ -93,8 +93,10 @@ public class GFEMapRenderableDisplay extends PlainMapRenderableDisplay
@Override
public void dispose() {
Message.unregisterInterest(this, ShowQuickViewDataMsg.class);
dataMgr.getSpatialDisplayManager()
.removeSpatialEditorTimeChangedListener(this);
if (dataMgr != null) {
dataMgr.getSpatialDisplayManager()
.removeSpatialEditorTimeChangedListener(this);
}
super.dispose();
}