001: /*
002: * The Unified Mapping Platform (JUMP) is an extensible, interactive GUI
003: * for visualizing and manipulating spatial features with geometry and attributes.
004: *
005: * Copyright (C) 2003 Vivid Solutions
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: *
021: * For more information, contact:
022: *
023: * Vivid Solutions
024: * Suite #1A
025: * 2328 Government Street
026: * Victoria BC V8T 5G5
027: * Canada
028: *
029: * (250)385-6040
030: * www.vividsolutions.com
031: */
032:
033: package com.vividsolutions.jump.workbench.ui.plugin.scalebar;
034:
035: import java.awt.*;
036: import java.awt.BasicStroke;
037: import java.awt.Color;
038: import java.awt.Font;
039: import java.awt.Graphics2D;
040: import java.awt.font.TextLayout;
041: import java.awt.geom.Rectangle2D;
042:
043: import com.vividsolutions.jump.util.MathUtil;
044: import com.vividsolutions.jump.workbench.ui.LayerViewPanel;
045: import com.vividsolutions.jump.workbench.ui.renderer.SimpleRenderer;
046:
047: public class ScaleBarRenderer extends SimpleRenderer {
048: public final static String CONTENT_ID = "SCALE_BAR";
049: /**
050: * Height of the increment boxes, in view-space units.
051: */
052: private final static int BAR_HEIGHT = 10;
053: private final static Color FILL2 = new Color(255, 204, 204);
054: private final static Color FILL1 = Color.white;
055:
056: /**
057: * Distance from the right edge, in view-space units.
058: */
059: private final static int HORIZONTAL_MARGIN = 3;
060:
061: /**
062: * In view-space units; the actual increment may be a bit larger or smaller
063: * than this amount.
064: */
065: private final static int IDEAL_INCREMENT = 75;
066: private final static Color LINE_COLOR = Color.black;
067: private final static int TEXT_BOTTOM_MARGIN = 1;
068: private final static int UNIT_TEXT_BOTTOM_MARGIN = 1;
069: private final static Color TEXT_COLOR = Color.black;
070: private final static Color UNIT_TEXT_COLOR = Color.blue;
071:
072: /**
073: * Distance from the bottom edge, in view-space units.
074: */
075: private final static int VERTICAL_MARGIN = 3;
076: private final static String ENABLED_KEY = ScaleBarRenderer.class
077: + " - ENABLED";
078: private final static int INCREMENT_COUNT = 5;
079: private Font FONT = new Font("Dialog", Font.PLAIN, 10);
080: private Font UNIT_FONT = new Font("Dialog", Font.BOLD, 11);
081:
082: public ScaleBarRenderer(LayerViewPanel panel) {
083: super (CONTENT_ID, panel);
084: }
085:
086: public static boolean isEnabled(LayerViewPanel panel) {
087: return panel.getBlackboard().get(ENABLED_KEY, false);
088: }
089:
090: public static void setEnabled(boolean enabled, LayerViewPanel panel) {
091: panel.getBlackboard().put(ENABLED_KEY, enabled);
092: }
093:
094: private Stroke stroke = new BasicStroke();
095:
096: protected void paint(Graphics2D g) {
097: paint(g, panel.getViewport().getScale());
098: }
099:
100: public void paint(Graphics2D g, double scale) {
101: if (!isEnabled(panel)) {
102: return;
103: }
104: //Override dashes set in GridRenderer [Jon Aquino]
105: g.setStroke(stroke);
106:
107: RoundQuantity increment = new IncrementChooser()
108: .chooseGoodIncrement(new MetricSystem(1).createUnits(),
109: IDEAL_INCREMENT / scale);
110: paintIncrements(increment, INCREMENT_COUNT, g, scale);
111: }
112:
113: private int barBottom() {
114: return panel.getHeight() - VERTICAL_MARGIN;
115: }
116:
117: private int barTop() {
118: return barBottom() - BAR_HEIGHT;
119: }
120:
121: private TextLayout createTextLayout(String text, Font font,
122: Graphics2D g) {
123: return new TextLayout(text, font, g.getFontRenderContext());
124: }
125:
126: private void paintIncrement(int i, RoundQuantity increment,
127: int incrementCount, Graphics2D g, double scale) {
128: Rectangle2D.Double shape = new Rectangle2D.Double(x(i,
129: increment, incrementCount, scale), barTop(), x(i + 1,
130: increment, incrementCount, scale)
131: - x(i, increment, incrementCount, scale), barBottom()
132: - barTop());
133: g.setColor(((i % 2) == 0) ? FILL1 : FILL2);
134: g.fill(shape);
135: g.setColor(LINE_COLOR);
136: g.draw(shape);
137: }
138:
139: private void paintIncrements(RoundQuantity increment,
140: int incrementCount, Graphics2D g, double scale) {
141: for (int i = 0; i < incrementCount; i++) {
142: paintIncrement(i, increment, incrementCount, g, scale);
143: paintLabel(i, increment, incrementCount, g, scale);
144: }
145: }
146:
147: private void paintLabel(int i, RoundQuantity increment,
148: int incrementCount, Graphics2D g, double scale) {
149: String text = new RoundQuantity(increment.getMantissa()
150: * (i + 1), increment.getExponent(), increment.getUnit())
151: .getAmountString();
152: Font font = FONT;
153: g.setColor(TEXT_COLOR);
154:
155: int textBottomMargin = TEXT_BOTTOM_MARGIN;
156:
157: if (i == (incrementCount - 1)) {
158: text = increment.getUnit().getName();
159: font = UNIT_FONT;
160: g.setColor(UNIT_TEXT_COLOR);
161: textBottomMargin = UNIT_TEXT_BOTTOM_MARGIN;
162: }
163:
164: TextLayout layout = createTextLayout(text, font, g);
165: double center = MathUtil.avg(x(i, increment, incrementCount,
166: scale), x(i + 1, increment, incrementCount, scale));
167: layout.draw(g, (float) (center - (layout.getAdvance() / 2)),
168: (float) (barBottom() - textBottomMargin));
169: }
170:
171: private double x(int i, RoundQuantity increment,
172: int incrementCount, double scale) {
173: return HORIZONTAL_MARGIN
174: + (i * increment.getModelValue() * scale);
175: }
176: }
|