// ********************************************************************** // // <copyright> // // BBN Technologies // 10 Moulton Street // Cambridge, MA 02138 // (617) 873-8000 // // Copyright (C) BBNT Solutions LLC. All rights reserved. // // </copyright> // ********************************************************************** // // $Source: /cvs/distapps/openmap/src/openmap/com/bbn/openmap/layer/rpf/RpfViewAttributes.java,v $ // $RCSfile: RpfViewAttributes.java,v $ // $Revision: 1.9 $ // $Date: 2005/08/09 19:25:47 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.layer.rpf; import com.bbn.openmap.Environment; import com.bbn.openmap.I18n; import com.bbn.openmap.PropertyConsumer; import com.bbn.openmap.omGraphics.OMRasterObject; import com.bbn.openmap.util.PropUtils; import com.bbn.openmap.util.propertyEditor.OptionPropertyEditor; import java.io.Serializable; import java.util.Properties; /** * This class contains information to pass through the RpfCacheManager and RpfCacheHandlers to describe limitations and * parameters desired for data view. It contains information about the numbers of colors to use, how opaque to make the * images, the chart series to retrieve, etc. */ public class RpfViewAttributes implements RpfConstants, PropertyConsumer, Serializable { public final static String ANY = "ANY"; public final static String ALL = "ALL"; public final static String COLORMODEL_DIRECT_STRING = "direct"; public final static String COLORMODEL_INDEXED_STRING = "indexed"; protected String propertyPrefix = null; /** * Number of colors to use - 16, 32, 216 */ public int numberOfColors; /** * The opaqueness of the image (transparency) 0-255: 0 is clear, 255 is opaque. */ public int opaqueness; /** * The image colormodel to use, indexed or colortable, for the OMRasters. */ public int colorModel; /** * Flag to use to scale images or not. This will cause the caches to scale the images to match the map scale, * instead of requiring the map to be at the same scale as the desired image. */ public boolean scaleImages; /** * The limiting factor for image scaling. Make this too big, and you will run out of memory. */ public float imageScaleFactor; /** * The data series two-letter code to limit responses to. If you want any data that is the closest match for the * current map, use ANY (default). If you want all of the RpfCoverageBoxes that have some coverage, use ALL. */ public String chartSeries; /** * Flag to set if the CADRG projection is required. Might not be, if we start warping images. */ public boolean requireProjection; /** * Flag to display images. */ public boolean showMaps; /** * Flag to display attribute information about the subframes. */ public boolean showInfo; /** * Flag to tell TOC handler to use scale over percent coverage when choosing the best coverage box. If false, you'll * get the best match with the most coverage, rather than coverage most appropriate for the map scale. The * traditional behavior is true, as is the default setting. However, when the layer is used for creating tiles, you * get better background results by setting this to false, and the gaps are filled in with different level coverage. */ protected boolean scaleMoreImportantThanCoverage = true; /** * Autofetch the subframe attributes from the FrameProvider. Use only if you are interested in background * information about the images. */ public boolean autofetchAttributes; protected transient I18n i18n = Environment.getI18n(); public RpfViewAttributes() { setDefaults(); } public void setDefaults() { numberOfColors = RpfColortable.CADRG_COLORS; opaqueness = RpfColortable.DEFAULT_OPAQUENESS; scaleImages = true; imageScaleFactor = 4.0f; colorModel = OMRasterObject.COLORMODEL_DIRECT; chartSeries = ANY; requireProjection = true; showMaps = true; showInfo = false; autofetchAttributes = false; scaleMoreImportantThanCoverage = true; } /** * * @return true of scale is used as a determining factor over coverage percentage when choosing best entry. */ public boolean isScaleMoreImportantThanCoverage() { return scaleMoreImportantThanCoverage; } /** * Set whether scale is more of a determining factor over percent coverage when choosing best entry for a map * projection. * * @param scaleMoreImportantThanCoverage */ public void setScaleMoreImportantThanCoverage(boolean scaleMoreImportantThanCoverage) { this.scaleMoreImportantThanCoverage = scaleMoreImportantThanCoverage; } // ======================================== // PropertyConsumer interface // ======================================== /** * Sets the properties. This particular method assumes that the marker name is not needed, because all of the * contents of this Properties object are to be used for this object, and scoping the properties with a prefix is * unnecessary. * * @param props the <code>Properties</code> object. */ public void setProperties(java.util.Properties props) { setProperties(null, props); } /** */ public void setProperties(String prefix, java.util.Properties props) { propertyPrefix = prefix; prefix = PropUtils.getScopedPropertyPrefix(prefix); opaqueness = PropUtils.intFromProperties(props, prefix + OpaquenessProperty, opaqueness); numberOfColors = PropUtils.intFromProperties(props, prefix + NumColorsProperty, numberOfColors); showMaps = PropUtils.booleanFromProperties(props, prefix + ShowMapsProperty, showMaps); showInfo = PropUtils.booleanFromProperties(props, prefix + ShowInfoProperty, showInfo); scaleImages = PropUtils.booleanFromProperties(props, prefix + ScaleImagesProperty, scaleImages); chartSeries = props.getProperty(prefix + ChartSeriesProperty); autofetchAttributes = PropUtils.booleanFromProperties(props, prefix + AutoFetchAttributeProperty, autofetchAttributes); imageScaleFactor = PropUtils.floatFromProperties(props, prefix + ImageScaleFactorProperty, imageScaleFactor); this.scaleMoreImportantThanCoverage = PropUtils.booleanFromProperties(props, prefix + ScaleOverCoverageProperty, scaleMoreImportantThanCoverage); String colormodel = props.getProperty(prefix + ColormodelProperty); if (colormodel != null && colormodel.equalsIgnoreCase(COLORMODEL_INDEXED_STRING)) { colorModel = OMRasterObject.COLORMODEL_INDEXED; } else { colorModel = OMRasterObject.COLORMODEL_DIRECT; } } /** * PropertyConsumer method, to fill in a Properties object, reflecting the current values of the layer. If the layer * has a propertyPrefix set, the property keys should have that prefix plus a separating '.' prepended to each * property key it uses for configuration. * * @param props a Properties object to load the PropertyConsumer properties into. If props equals null, then a new * Properties object should be created. * @return Properties object containing PropertyConsumer property values. If getList was not null, this should equal * getList. Otherwise, it should be the Properties object created by the PropertyConsumer. */ public Properties getProperties(Properties props) { if (props == null) { props = new Properties(); } String prefix = PropUtils.getScopedPropertyPrefix(propertyPrefix); props.put(prefix + OpaquenessProperty, Integer.toString(opaqueness)); props.put(prefix + NumColorsProperty, Integer.toString(numberOfColors)); props.put(prefix + ShowMapsProperty, Boolean.toString(showMaps)); props.put(prefix + ShowInfoProperty, Boolean.toString(showInfo)); props.put(prefix + ScaleImagesProperty, Boolean.toString(scaleImages)); props.put(prefix + ChartSeriesProperty, chartSeries); props.put(prefix + AutoFetchAttributeProperty, Boolean.toString(autofetchAttributes)); props.put(prefix + ImageScaleFactorProperty, Float.toString(imageScaleFactor)); props.put(prefix + ScaleOverCoverageProperty, Boolean.toString(scaleMoreImportantThanCoverage)); if (colorModel == OMRasterObject.COLORMODEL_INDEXED) { props.put(prefix + ColormodelProperty, COLORMODEL_INDEXED_STRING); } else { props.put(prefix + ColormodelProperty, COLORMODEL_DIRECT_STRING); } return props; } /** * Method to fill in a Properties object with values reflecting the properties able to be set on this * PropertyConsumer. The key for each property should be the raw property name (without a prefix) with a value that * is a String that describes what the property key represents, along with any other information about the property * that would be helpful (range, default value, etc.). For Layer, this method should at least return the * 'prettyName' property. * * @param list a Properties object to load the PropertyConsumer properties into. If getList equals null, then a new * Properties object should be created. * @return Properties object containing PropertyConsumer property values. If getList was not null, this should equal * getList. Otherwise, it should be the Properties object created by the PropertyConsumer. */ public Properties getPropertyInfo(Properties list) { if (list == null) { list = new Properties(); } String interString; interString = i18n.get(RpfLayer.class, OpaquenessProperty, I18n.TOOLTIP, "Integer representing opaqueness level (0-255, 0 is clear)."); list.put(OpaquenessProperty, interString); interString = i18n.get(RpfLayer.class, OpaquenessProperty, "Opaqueness"); list.put(OpaquenessProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, NumColorsProperty, I18n.TOOLTIP, "Number of colors to use for the map images."); list.put(NumColorsProperty, interString); list.put(NumColorsProperty + ScopedEditorProperty, "com.bbn.openmap.util.propertyEditor.ComboBoxPropertyEditor"); list.put(NumColorsProperty + OptionPropertyEditor.ScopedOptionsProperty, "sixteen thirtytwo twosixteen"); list.put(NumColorsProperty + ".sixteen", "16"); list.put(NumColorsProperty + ".thirtytwo", "32"); list.put(NumColorsProperty + ".twosixteen", "216"); interString = i18n.get(RpfLayer.class, NumColorsProperty, "Number of Colors"); list.put(NumColorsProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, ShowMapsProperty, I18n.TOOLTIP, "Flag to display map images."); list.put(ShowMapsProperty, interString); list.put(ShowMapsProperty + ScopedEditorProperty, "com.bbn.openmap.util.propertyEditor.OnOffPropertyEditor"); interString = i18n.get(RpfLayer.class, ShowMapsProperty, "Display Images"); list.put(ShowMapsProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, ShowInfoProperty, I18n.TOOLTIP, "Flag to show data attributes."); list.put(ShowInfoProperty, interString); list.put(ShowInfoProperty + ScopedEditorProperty, "com.bbn.openmap.util.propertyEditor.OnOffPropertyEditor"); interString = i18n.get(RpfLayer.class, ShowInfoProperty, "Display Attributes"); list.put(ShowInfoProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, ScaleImagesProperty, I18n.TOOLTIP, "Flag to scale the images to fit the map scale. If false, images appear when map scale fits the chart scale."); list.put(ScaleImagesProperty, interString); list.put(ScaleImagesProperty + ScopedEditorProperty, "com.bbn.openmap.util.propertyEditor.OnOffPropertyEditor"); interString = i18n.get(RpfLayer.class, ScaleImagesProperty, "Scale Images"); list.put(ScaleImagesProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, ScaleOverCoverageProperty, I18n.TOOLTIP, "Flag to consider matching map scale over percent coverage, when choosing which maps to display."); list.put(ScaleOverCoverageProperty, interString); list.put(ScaleOverCoverageProperty + ScopedEditorProperty, "com.bbn.openmap.util.propertyEditor.OnOffPropertyEditor"); interString = i18n.get(RpfLayer.class, ScaleOverCoverageProperty, "Scale Images"); list.put(ScaleOverCoverageProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, ChartSeriesProperty, I18n.TOOLTIP, "The two-letter chart code to display. ANY is default."); list.put(ChartSeriesProperty, interString); interString = i18n.get(RpfLayer.class, ChartSeriesProperty, "Chart Series Code"); list.put(ChartSeriesProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, AutoFetchAttributeProperty, I18n.TOOLTIP, "Flag to tell the layer to automatically fetch the attribute data for the images."); list.put(AutoFetchAttributeProperty, interString); list.put(AutoFetchAttributeProperty + ScopedEditorProperty, "com.bbn.openmap.util.propertyEditor.OnOffPropertyEditor"); interString = i18n.get(RpfLayer.class, AutoFetchAttributeProperty, "Auto-fetch Attributes"); list.put(AutoFetchAttributeProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, ImageScaleFactorProperty, I18n.TOOLTIP, "Multiplier to limit the scale differential that a given chart will be displayed for a map (4.0 is the default)."); list.put(ImageScaleFactorProperty, interString); interString = i18n.get(RpfLayer.class, ImageScaleFactorProperty, "Image Scaling Factor"); list.put(ImageScaleFactorProperty + LabelEditorProperty, interString); interString = i18n.get(RpfLayer.class, ColormodelProperty, I18n.TOOLTIP, "If 'indexed', the images will be built using a colortable. This is not the default."); list.put(ColormodelProperty, interString); list .put(ColormodelProperty + ScopedEditorProperty, "com.bbn.openmap.util.propertyEditor.ComboBoxPropertyEditor"); list.put(ColormodelProperty + OptionPropertyEditor.ScopedOptionsProperty, "dir ind"); list.put(ColormodelProperty + ".dir", COLORMODEL_DIRECT_STRING); list.put(ColormodelProperty + ".ind", COLORMODEL_INDEXED_STRING); interString = i18n.get(RpfLayer.class, ColormodelProperty, "Image Colormodel Type"); list.put(ColormodelProperty + LabelEditorProperty, interString); return list; } /** * Specify what order properties should be presented in an editor. */ public String getInitPropertiesOrder() { return " " + ShowMapsProperty + " " + ShowInfoProperty + " " + ScaleImagesProperty + " " + ImageScaleFactorProperty + " " + OpaquenessProperty + " " + NumColorsProperty + " " + ChartSeriesProperty + " " + AutoFetchAttributeProperty + " " + ColormodelProperty; } /** * Set the property key prefix that should be used by the PropertyConsumer. The prefix, along with a '.', should be * prepended to the property keys known by the PropertyConsumer. * * @param prefix the prefix String. */ public void setPropertyPrefix(String prefix) { propertyPrefix = prefix; } /** * Get the property key prefix that is being used to prepend to the property keys for Properties lookups. * * @return the property prefix */ public String getPropertyPrefix() { return propertyPrefix; } }