diff --git a/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/DbMapResource.java b/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/DbMapResource.java index 4c4c7bc88e..1791fc58b4 100644 --- a/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/DbMapResource.java +++ b/cave/com.raytheon.uf.viz.core.maps/src/com/raytheon/uf/viz/core/maps/rsc/DbMapResource.java @@ -662,7 +662,9 @@ public class DbMapResource extends float alpha = paintProps.getAlpha(); if (shadedShape != null && shadedShape.isDrawable() && isShaded) { - aTarget.drawShadedShape(shadedShape, alpha); + float opacity = getCapability(ShadeableCapability.class) + .getOpacity(); + aTarget.drawShadedShape(shadedShape, alpha * opacity); } if (outlineShape != null && outlineShape.isDrawable() @@ -670,7 +672,8 @@ public class DbMapResource extends aTarget.drawWireframeShape(outlineShape, getCapability(ColorableCapability.class).getColor(), getCapability(OutlineCapability.class).getOutlineWidth(), - getCapability(OutlineCapability.class).getLineStyle()); + getCapability(OutlineCapability.class).getLineStyle(), + alpha); } else if (outlineShape == null && getCapability(OutlineCapability.class).isOutlineOn()) { issueRefresh(); diff --git a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/capabilities/ShadeableCapability.java b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/capabilities/ShadeableCapability.java index 66af3e6d96..8dd4969739 100644 --- a/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/capabilities/ShadeableCapability.java +++ b/cave/com.raytheon.uf.viz.core/src/com/raytheon/uf/viz/core/rsc/capabilities/ShadeableCapability.java @@ -44,6 +44,9 @@ public class ShadeableCapability extends AbstractCapability { @XmlAttribute(required = false) private String shadingField; + @XmlAttribute(required = false) + private float opacity = 1.0f; + private String[] availableShadingFields; public String[] getAvailableShadingFields() { @@ -74,10 +77,23 @@ public class ShadeableCapability extends AbstractCapability { } } + public float getOpacity() { + return opacity; + } + + public void setOpacity(float opacity) { + this.opacity = opacity; + if (this.opacity != opacity) { + this.opacity = opacity; + this.capabilityChanged(); + } + } + @Override public AbstractCapability clone() { ShadeableCapability sc = new ShadeableCapability(); sc.shadingField = shadingField; + sc.opacity = opacity; sc.availableShadingFields = availableShadingFields; return sc; } diff --git a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/ui/zoneselector/ZoneSelectorResource.java b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/ui/zoneselector/ZoneSelectorResource.java index 9a4d8adcbc..63fbe54c77 100644 --- a/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/ui/zoneselector/ZoneSelectorResource.java +++ b/cave/com.raytheon.viz.gfe/src/com/raytheon/viz/gfe/ui/zoneselector/ZoneSelectorResource.java @@ -587,6 +587,13 @@ public class ZoneSelectorResource extends DbMapResource { } } + @Override + protected void initInternal(IGraphicsTarget target) throws VizException { + super.initInternal(target); + getCapabilities().removeCapability(ShadeableCapability.class); + getCapabilities().removeCapability(LabelableCapability.class); + } + /** * @param zoneName * @param groupLabel @@ -742,15 +749,9 @@ public class ZoneSelectorResource extends DbMapResource { .getWidth() / paintProps.getCanvasBounds().width; - double offsetX = getCapability(LabelableCapability.class) - .getxOffset() * screenToWorldRatio; - double offsetY = getCapability(LabelableCapability.class) - .getyOffset() * screenToWorldRatio; IExtent extent = paintProps.getView().getExtent(); List strings = new ArrayList( labels.size()); - // List extents = new ArrayList(); - // String lastLabel = null; List alreadyDrawn = new ArrayList( labels.size()); for (LabelNode node : labels) { @@ -780,8 +781,8 @@ public class ZoneSelectorResource extends DbMapResource { } DrawableString ds = new DrawableString(text, RGBColors.getRGBColor("white")); - ds.setCoordinates(node.getLocation()[0] + offsetX, - node.getLocation()[1] - offsetY); + ds.setCoordinates(node.getLocation()[0], + node.getLocation()[1]); ds.font = font; ds.horizontalAlignment = HorizontalAlignment.CENTER; ds.verticallAlignment = VerticalAlignment.MIDDLE; @@ -834,22 +835,6 @@ public class ZoneSelectorResource extends DbMapResource { } } - // add the label field - String labelField = getCapability(LabelableCapability.class) - .getLabelField(); - if (labelField != null && !additionalColumns.contains(labelField)) { - query.append(", "); - query.append(labelField); - } - - // add the shading field - String shadingField = getCapability(ShadeableCapability.class) - .getShadingField(); - if (shadingField != null && !additionalColumns.contains(shadingField)) { - query.append(", "); - query.append(shadingField); - } - // add the geometry table query.append(" FROM "); query.append(resourceData.getTable()); diff --git a/cave/com.raytheon.viz.shapefile/src/com/raytheon/viz/shapefile/rsc/ShapefileResource.java b/cave/com.raytheon.viz.shapefile/src/com/raytheon/viz/shapefile/rsc/ShapefileResource.java index e22cf462e8..039495e6db 100644 --- a/cave/com.raytheon.viz.shapefile/src/com/raytheon/viz/shapefile/rsc/ShapefileResource.java +++ b/cave/com.raytheon.viz.shapefile/src/com/raytheon/viz/shapefile/rsc/ShapefileResource.java @@ -261,7 +261,9 @@ public class ShapefileResource extends if (isShadedCalculated && getCapability(ShadeableCapability.class).getShadingField() != null && shadedShape != null && shadedShape.isDrawable()) { - aTarget.drawShadedShape(shadedShape, alpha); + float opacity = getCapability(ShadeableCapability.class) + .getOpacity(); + aTarget.drawShadedShape(shadedShape, alpha * opacity); } if (getCapability(OutlineCapability.class).isOutlineOn() @@ -269,7 +271,8 @@ public class ShapefileResource extends aTarget.drawWireframeShape(outlineShape, getCapability(ColorableCapability.class).getColor(), getCapability(OutlineCapability.class).getOutlineWidth(), - getCapability(OutlineCapability.class).getLineStyle()); + getCapability(OutlineCapability.class).getLineStyle(), + alpha); } if (getCapability(LabelableCapability.class).getLabelField() != null diff --git a/cave/com.raytheon.viz.shapefile/src/com/raytheon/viz/shapefile/rsc/ShapefileResourceData.java b/cave/com.raytheon.viz.shapefile/src/com/raytheon/viz/shapefile/rsc/ShapefileResourceData.java index 63dd1f4dc7..5a912510b5 100644 --- a/cave/com.raytheon.viz.shapefile/src/com/raytheon/viz/shapefile/rsc/ShapefileResourceData.java +++ b/cave/com.raytheon.viz.shapefile/src/com/raytheon/viz/shapefile/rsc/ShapefileResourceData.java @@ -28,10 +28,6 @@ import javax.xml.bind.annotation.XmlElement; import org.eclipse.swt.graphics.RGB; -import com.raytheon.uf.common.localization.LocalizationFile; -import com.raytheon.uf.common.localization.PathManagerFactory; -import com.raytheon.uf.common.util.FileUtil; -import com.raytheon.uf.viz.core.VizApp; import com.raytheon.uf.viz.core.drawables.IDescriptor; import com.raytheon.uf.viz.core.exception.VizException; import com.raytheon.uf.viz.core.rsc.AbstractNameGenerator; @@ -107,25 +103,6 @@ public class ShapefileResourceData extends AbstractResourceData { public ShapefileResource construct(LoadProperties loadProperties, IDescriptor descriptor) throws VizException { shapeFile = new File(filename); - if (!shapeFile.isAbsolute()) { - shapeFile = PathManagerFactory.getPathManager().getStaticFile( - FileUtil.join(VizApp.getMapsDir(), filename)); - if (shapeFile != null) { - // Get rid of shp - String name = filename.substring(0, filename.length() - 3); - // Get all corresponding shapefile files in directory - String path = shapeFile.getParentFile().getAbsolutePath(); - int idx = path.indexOf(VizApp.getMapsDir()); - String searchPath = path.substring(idx); - LocalizationFile[] files = PathManagerFactory.getPathManager() - .listStaticFiles(searchPath, null, false, true); - for (LocalizationFile f : files) { - if (shapeFile.getName().contains(name)) { - f.getFile(); - } - } - } - } if (shapeFile == null || shapeFile.exists() == false) { throw new VizException("Could not find shapefile", new FileNotFoundException(String.valueOf(shapeFile))); diff --git a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/cmenu/ShadedAction.java b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/cmenu/ShadedAction.java index 524f2f18e3..3710659d52 100644 --- a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/cmenu/ShadedAction.java +++ b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/cmenu/ShadedAction.java @@ -22,11 +22,16 @@ package com.raytheon.viz.ui.cmenu; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.ActionContributionItem; import org.eclipse.jface.action.IMenuCreator; +import org.eclipse.jface.action.Separator; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Menu; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.ui.PlatformUI; +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; import com.raytheon.uf.viz.core.rsc.capabilities.ShadeableCapability; +import com.raytheon.viz.ui.dialogs.SetOpacityDialog; /** * Action to set the shading field for a resource @@ -133,6 +138,10 @@ public class ShadedAction extends AbstractRightClickAction implements aci.fill(menu, -1); } } + new Separator().fill(menu, -1); + + aci = new ActionContributionItem(new SetAlphaInternalAction()); + aci.fill(menu, -1); } private class SetShadingInternalAction extends Action { @@ -161,9 +170,9 @@ public class ShadedAction extends AbstractRightClickAction implements */ @Override public void run() { - getTopMostSelectedResource().getCapability( - ShadeableCapability.class).setShadingField(field); - getContainer().refresh(); + AbstractVizResource rsc = getTopMostSelectedResource(); + rsc.getCapability(ShadeableCapability.class).setShadingField(field); + rsc.issueRefresh(); } /* @@ -185,4 +194,34 @@ public class ShadedAction extends AbstractRightClickAction implements } } + + private class SetAlphaInternalAction extends Action { + + public SetAlphaInternalAction() { + super("Set Opacity", Action.AS_PUSH_BUTTON); + String currentField = getTopMostSelectedResource().getCapability( + ShadeableCapability.class).getShadingField(); + } + + @Override + public String getText() { + int opacity = (int) (getTopMostSelectedResource().getCapability( + ShadeableCapability.class).getOpacity() * 100); + return String.format("Set Opacity (%d%%)", opacity); + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.jface.action.Action#run() + */ + @Override + public void run() { + AbstractVizResource rsc = getTopMostSelectedResource(); + Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow() + .getShell(); + SetOpacityDialog dlg = new SetOpacityDialog(shell, rsc); + dlg.open(); + } + } } diff --git a/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/SetOpacityDialog.java b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/SetOpacityDialog.java new file mode 100644 index 0000000000..e987334535 --- /dev/null +++ b/cave/com.raytheon.viz.ui/src/com/raytheon/viz/ui/dialogs/SetOpacityDialog.java @@ -0,0 +1,170 @@ +/** + * This software was developed and / or modified by Raytheon Company, + * pursuant to Contract DG133W-05-CQ-1067 with the US Government. + * + * U.S. EXPORT CONTROLLED TECHNICAL DATA + * This software product contains export-restricted data whose + * export/transfer/disclosure is restricted by U.S. law. Dissemination + * to non-U.S. persons whether in the United States or abroad requires + * an export license or other authorization. + * + * Contractor Name: Raytheon Company + * Contractor Address: 6825 Pine Street, Suite 340 + * Mail Stop B8 + * Omaha, NE 68106 + * 402.291.0100 + * + * See the AWIPS II Master Rights File ("Master Rights File.pdf") for + * further licensing information. + **/ +package com.raytheon.viz.ui.dialogs; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.PaintEvent; +import org.eclipse.swt.events.PaintListener; +import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; +import org.eclipse.swt.graphics.Color; +import org.eclipse.swt.graphics.GC; +import org.eclipse.swt.graphics.RGB; +import org.eclipse.swt.graphics.Rectangle; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Canvas; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Scale; +import org.eclipse.swt.widgets.Shell; + +import com.raytheon.uf.viz.core.rsc.AbstractVizResource; +import com.raytheon.uf.viz.core.rsc.capabilities.ColorableCapability; +import com.raytheon.uf.viz.core.rsc.capabilities.ShadeableCapability; + +/** + * TODO Add Description + * + *
+ * 
+ * SOFTWARE HISTORY
+ * 
+ * Date         Ticket#    Engineer    Description
+ * ------------ ---------- ----------- --------------------------
+ * Dec 4, 2012            randerso     Initial creation
+ * 
+ * 
+ * + * @author randerso + * @version 1.0 + */ + +public class SetOpacityDialog extends CaveJFACEDialog { + + private AbstractVizResource resource; + + private float originalOpacity; + + private float opacity; + + public SetOpacityDialog(Shell parentShell, AbstractVizResource rsc) { + super(parentShell); + this.resource = rsc; + } + + @Override + protected void configureShell(Shell newShell) { + super.configureShell(newShell); + newShell.setText("Set Opacity"); + } + + @Override + protected Control createDialogArea(Composite parent) { + Composite comp = (Composite) super.createDialogArea(parent); + GridLayout layout = (GridLayout) comp.getLayout(); + layout.numColumns = 1; + layout.makeColumnsEqualWidth = false; + + final Canvas canvas = new Canvas(comp, SWT.BORDER); + GridData layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + layoutData.heightHint = 50; + canvas.setLayoutData(layoutData); + canvas.addPaintListener(new PaintListener() { + + @Override + public void paintControl(PaintEvent e) { + repaintCanvas(e); + } + + }); + + Scale scale = new Scale(comp, SWT.HORIZONTAL); + layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + layoutData.widthHint = 200; + scale.setLayoutData(layoutData); + scale.setMinimum(0); + scale.setMaximum(100); + opacity = originalOpacity = resource.getCapability( + ShadeableCapability.class).getOpacity(); + + scale.setSelection((int) (originalOpacity * 100)); + + final Label label = new Label(comp, SWT.CENTER); + layoutData = new GridData(SWT.FILL, SWT.DEFAULT, true, false); + GC gc = new GC(label.getDisplay()); + gc.setFont(label.getFont()); + layoutData.widthHint = gc.stringExtent("100%").x; + gc.dispose(); + label.setLayoutData(layoutData); + label.setText(scale.getSelection() + "%"); + + scale.addSelectionListener(new SelectionAdapter() { + + @Override + public void widgetSelected(SelectionEvent e) { + Scale scale = (Scale) e.widget; + label.setText(scale.getSelection() + "%"); + opacity = scale.getSelection() / 100.0f; + resource.getCapability(ShadeableCapability.class).setOpacity( + opacity); + resource.issueRefresh(); + canvas.redraw(); + } + }); + + return comp; + } + + private void repaintCanvas(PaintEvent e) { + Canvas canvas = (Canvas) e.widget; + GC gc = e.gc; + Rectangle rect1 = canvas.getClientArea(); + gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_BLACK)); + gc.fillRectangle(rect1); + + Rectangle rect2 = new Rectangle(rect1.x + rect1.width / 2, rect1.y, + rect1.width / 2, rect1.height); + gc.setBackground(gc.getDevice().getSystemColor(SWT.COLOR_WHITE)); + gc.fillRectangle(rect2); + + RGB rgb; + if (resource.hasCapability(ColorableCapability.class)) { + rgb = resource.getCapability(ColorableCapability.class).getColor(); + } else { + rgb = new RGB(0, 255, 255); + } + + Color color = new Color(gc.getDevice(), rgb); + gc.setBackground(color); + gc.setAlpha((int) (opacity * 255)); + gc.fillRectangle(rect1); + color.dispose(); + } + + @Override + protected void cancelPressed() { + resource.getCapability(ShadeableCapability.class).setOpacity( + originalOpacity); + resource.issueRefresh(); + super.cancelPressed(); + } +}