Hi.
since some of my users want a red cross in the center of the map (don't ask why...) I implemented the class attached below. It is realized like the ScalebarMapGraphic and published via the extension point "net.refractions.udig.mapgraphic.mapgraphic".
The application gets a reference to the layer like done in AbstractToggleMapGraphicAction using the MapGraphicService.
The user can toggle on/off the scalebar and the cross with a checkbox in a viewpart. Each has its own checkbox. If the state of the checkbox changes, the visibility of the layer is set to the appropriate state and the layer is refreshed:
crossLayer.setVisible(checkboxState);
crossLayer.refresh(null);
If only one of both layers is visible it works fine. But if both are active I get the following behaviour:
scalebarLayer visible, crossLayer not visible -> visible: works (I can see both)
scalebarLayer visible, crossLayer visible -> not visible: nothing happens (the cross is still visible)
if I deactivate the scalebar both disappear. if I activate the scalebar again both appear (which is wrong) and then (after a second) the cross disappears.
the same happens if both are activated and I remove the scalebar:
crossLayer visible, scalebarLayer visible -> not visible: nothing happens (the scalebar is still visible)
if I deactivate the cross both disappear
In MapGraphic is the hint to check the clip area of the Viewportgraphics object to determine what area needs to be refreshed. I cannot find a passage in ScalebarMapGraphic where this is done.
Can someone help me with this?
thanks,
tony roth
package foo.bar;
import java.awt.Color;
import java.awt.geom.GeneralPath;
import net.refractions.udig.mapgraphic.MapGraphic;
import net.refractions.udig.mapgraphic.MapGraphicContext;
import net.refractions.udig.ui.graphics.ViewportGraphics;
/**
* Decorator object
*
*/
public class CenterCrossMapGraphic implements MapGraphic {
public void draw(MapGraphicContext context) {
int displayWidth = context.getRenderManagerInternal().getMapDisplay().getWidth();
int displayHeight = context.getRenderManagerInternal().getMapDisplay().getHeight();
ViewportGraphics graphics = context.getGraphics();
GeneralPath path = new GeneralPath();
path.moveTo(displayWidth/2, displayHeight/2-10);
path.lineTo(displayWidth/2, displayHeight/2+10);
path.moveTo(displayWidth/2-10, displayHeight/2);
path.lineTo(displayWidth/2+10, displayHeight/2);
Color halo = new Color(255,255,255,128);
graphics.setColor(halo);
graphics.setStroke(ViewportGraphics.LINE_SOLID, 3);
graphics.draw(path);
graphics.setColor(Color.RED);
graphics.setStroke(ViewportGraphics.LINE_SOLID, 1);
graphics.draw(path);
}
}