// ********************************************************************** // // <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/omGraphics/GraphicAttributes.java,v $ // $RCSfile: GraphicAttributes.java,v $ // $Revision: 1.12 $ // $Date: 2008/01/29 22:04:13 $ // $Author: dietrick $ // // ********************************************************************** package com.bbn.openmap.omGraphics; /* Java Core */ import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.Serializable; import java.util.Properties; import javax.swing.ButtonGroup; import javax.swing.JMenu; import javax.swing.JPopupMenu; import javax.swing.JRadioButtonMenuItem; import com.bbn.openmap.Environment; import com.bbn.openmap.I18n; import com.bbn.openmap.omGraphics.geom.NonRegional; import com.bbn.openmap.proj.LineType; import com.bbn.openmap.util.PropUtils; /** * The GraphicAttributes provides an extension to DrawingAttributes by * provideing a mechanism for loading and managing different graphic attributes * that may be used, such as line type (LINETYPE_STRAIGHT, LINETYPE_GREATCIRCLE, * LINETYPE_RHUMB, or LINETYPE_UNKNOWN), or render type (RENDERTYPE_XY, * RENDERTYPE_LATLON, RENDERTYPE_OFFSET, or RENDERTYPE_UNKNOWN). The * DrawingAttributes class fishes out the applicable properties for you, creates * the objects needed, and then lets you get those objects when needed. */ public class GraphicAttributes extends DrawingAttributes implements ActionListener, Serializable, OMGraphicConstants { /** * The name of the property that holds the line type of the graphic. */ public final static String lineTypeProperty = "lineType"; /** * The name of the property that holds the render type of the graphic. */ public final static String renderTypeProperty = "renderType"; /** The line type of a graphic, defaults to LINETYPE_STRAIGHT. */ protected int lineType = LINETYPE_STRAIGHT; /** The rendertype of a graphic. Default is RENDERTYPE_XY. */ protected int renderType = RENDERTYPE_XY; /** Flag to disable choice of line type, from an external source. */ protected boolean enableLineTypeChoice = true; public final static GraphicAttributes DEFAULT = new GraphicAttributes(); private I18n i18n = Environment.getI18n(); /** * Create a GraphicAttributes with the default settings - clear fill paint * and pattern, sold black edge line of width 1. */ public GraphicAttributes() { super(); } /** * Create the GraphicAttributes and call init without a prefix for the * properties. Call init without a prefix for the properties. * * @param props the Properties to look in. */ public GraphicAttributes(Properties props) { super(props); } /** * Create the GraphicAttributes and call init with a prefix for the * properties. * * @param prefix the prefix marker to use for a property, like * prefix.propertyName. The period is added in this function. * @param props the Properties to look in. */ public GraphicAttributes(String prefix, Properties props) { super(prefix, props); } /** * If you want to get a DEFAULT DrawingAttributes object that you may * modify, get your own copy. */ public static GraphicAttributes getGADefaultClone() { return (GraphicAttributes) DEFAULT.clone(); } /** * PropertyConsumer method. */ public void setProperties(String prefix, Properties props) { super.setProperties(prefix, props); prefix = PropUtils.getScopedPropertyPrefix(prefix); if (props == null) { return; } // Set up the Graphic attributes. lineType = PropUtils.intFromProperties(props, prefix + lineTypeProperty, lineType); renderType = PropUtils.intFromProperties(props, prefix + renderTypeProperty, renderType); } public Object clone() { GraphicAttributes clone = new GraphicAttributes(); setTo(clone); return clone; } public void setTo(GraphicAttributes clone) { super.setTo(clone); clone.renderType = renderType; clone.lineType = lineType; clone.enableLineTypeChoice = enableLineTypeChoice; } /** * Get the lineType. */ public int getLineType() { return lineType; } /** * Set the line type. If it isn't straight, great circle or rhumb, it's set * to unknown. */ public void setLineType(int lt) { int oldLineType = lineType; if (lt == LINETYPE_STRAIGHT || lt == LINETYPE_GREATCIRCLE || lt == LINETYPE_RHUMB) { lineType = lt; } else { lineType = LINETYPE_UNKNOWN; } propertyChangeSupport.firePropertyChange("lineType", oldLineType, lineType); } /** * Get the renderType. */ public int getRenderType() { return renderType; } /** * Set the render type. If it isn't xy, lat/lon, or lat/lon with offset, * it's set to unknown. */ public void setRenderType(int rt) { int oldRenderType = renderType; if (rt == RENDERTYPE_XY || rt == RENDERTYPE_LATLON || rt == RENDERTYPE_OFFSET) { renderType = rt; } else { renderType = RENDERTYPE_UNKNOWN; } propertyChangeSupport.firePropertyChange("renderType", oldRenderType, renderType); } /** * Set the GraphicAttributes parameters based on the current settings of an * OMGraphic. */ public void setFrom(OMGraphic graphic) { setFrom(graphic, false); } /** * Set the GraphicAttributes parameters based on the current settings of an * OMGraphic. * * @param graphic OMGraphic to gather settings from. * @param resetGUI flag to cause GraphicAttribute GUI reset. */ public void setFrom(OMGraphic graphic, boolean resetGUI) { if (graphic == null) return; super.setFrom(graphic, false); lineType = graphic.getLineType(); renderType = graphic.getRenderType(); enableLineTypeChoice = graphic.hasLineTypeChoice(); if (resetGUI) { resetGUI(); } } /** * Set all the attributes for the graphic that are contained within this * GraphicAttributes class. * * @param graphic OMGraphic. */ public void setTo(OMGraphic graphic) { setTo(graphic, false); } /** * Set all the attributes for the graphic that are contained within this * GraphicAttributes class. * * @param graphic OMGraphic. * @param resetGUI reset the GraphicAttributes GUI if desired. */ public void setTo(OMGraphic graphic, boolean resetGUI) { if (graphic == null) return; super.setTo(graphic, false); graphic.setLineType(lineType); // Render type is dictated by coordinate settings. Changing this messes // with fundamental rendering location. Only set it if the graphic rendertype is unknown. if (graphic.getRenderType() == RENDERTYPE_UNKNOWN && renderType != RENDERTYPE_UNKNOWN) { graphic.setRenderType(renderType); } if (resetGUI) { // The GraphicAttribute might be rendering options for this graphic, // needs to know if line type choices are available. enableLineTypeChoice = graphic.hasLineTypeChoice(); enableFillPaintChoice = !(graphic instanceof NonRegional); resetGUI(); } } /** * Method should be called on this GraphicAttributes object if the OMGraphic * type doesn't support line types to disable the choice from the line menu. * Circles, range rings, points, etc. are all examples of shapes that * disable linetype choice. */ public void setEnableLineTypeChoice(boolean value) { enableLineTypeChoice = value; } public boolean getEnableLineTypeChoice() { return enableLineTypeChoice; } protected void setPreStrokeMenuOptions(JPopupMenu popup) { super.setPreStrokeMenuOptions(popup); JMenu ltm = getLineTypeMenu(); if (ltm != null) { popup.add(ltm); } } public JMenu getLineTypeMenu() { JMenu lineTypeMenu = null; if (renderType == RENDERTYPE_LATLON && enableLineTypeChoice) { lineTypeMenu = new JMenu(i18n.get(GraphicAttributes.class, "Line_Type", "Line Type")); ActionListener listener = new ActionListener() { public void actionPerformed(ActionEvent ae) { String command = ae.getActionCommand(); try { setLineType(Integer.parseInt(command)); } catch (NumberFormatException e) { } } }; ButtonGroup group = new ButtonGroup(); JRadioButtonMenuItem button = new JRadioButtonMenuItem(i18n.get(DrawingAttributes.class, "Great_Circle", "Great Circle"), lineType == LineType.GreatCircle); button.setActionCommand(String.valueOf(LineType.GreatCircle)); button.addActionListener(listener); lineTypeMenu.add(button); button = new JRadioButtonMenuItem(i18n.get(GraphicAttributes.class, "Rhumb", "Rhumb"), lineType == LineType.Rhumb); button.setActionCommand(String.valueOf(LineType.Rhumb)); group.add(button); button.addActionListener(listener); lineTypeMenu.add(button); button = new JRadioButtonMenuItem(i18n.get(GraphicAttributes.class, "Straight", "Straight"), lineType == LineType.Straight); button.setActionCommand(String.valueOf(LineType.Straight)); group.add(button); button.addActionListener(listener); lineTypeMenu.add(button); } return lineTypeMenu; } }