001: /***********************************************************************************************
002: * File Info: $Id: TextProcessor.java,v 1.1 2003/05/17 16:57:50 nathaniel_auvil Exp $
003: * Copyright (C) 2002
004: * Author: Nathaniel G. Auvil
005: * Contributor(s):
006: *
007: * Copyright 2002 (C) Nathaniel G. Auvil. All Rights Reserved.
008: *
009: * Redistribution and use of this software and associated documentation ("Software"), with or
010: * without modification, are permitted provided that the following conditions are met:
011: *
012: * 1. Redistributions of source code must retain copyright statements and notices.
013: * Redistributions must also contain a copy of this document.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
016: * conditions and the following disclaimer in the documentation and/or other materials
017: * provided with the distribution.
018: *
019: * 3. The name "jCharts" or "Nathaniel G. Auvil" must not be used to endorse or promote
020: * products derived from this Software without prior written permission of Nathaniel G.
021: * Auvil. For written permission, please contact nathaniel_auvil@users.sourceforge.net
022: *
023: * 4. Products derived from this Software may not be called "jCharts" nor may "jCharts" appear
024: * in their names without prior written permission of Nathaniel G. Auvil. jCharts is a
025: * registered trademark of Nathaniel G. Auvil.
026: *
027: * 5. Due credit should be given to the jCharts Project (http://jcharts.sourceforge.net/).
028: *
029: * THIS SOFTWARE IS PROVIDED BY Nathaniel G. Auvil AND CONTRIBUTORS ``AS IS'' AND ANY
030: * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
031: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
032: * jCharts OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
033: * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
034: * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
035: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,STRICT LIABILITY, OR TORT
036: * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
037: * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
038: ************************************************************************************************/package org.krysalis.jcharts.chartData.processors;
039:
040: import org.krysalis.jcharts.chartText.TextTag;
041:
042: import java.awt.*;
043: import java.awt.font.FontRenderContext;
044: import java.util.ArrayList;
045:
046: /*******************************************************************************************
047: *
048: *
049: *******************************************************************************************/
050: public class TextProcessor {
051: private float widestLabel = Float.MIN_VALUE;
052: private float tallestLabel = Float.MIN_VALUE;
053: private float totalLabelWidths = 0.0f;
054:
055: private ArrayList textTags;
056:
057: /******************************************************************************************
058: * Constructor
059: *
060: *******************************************************************************************/
061: public TextProcessor() {
062: this .textTags = new ArrayList(30);
063: }
064:
065: /******************************************************************************************
066: *
067: * @param label
068: * @param font
069: * @param fontRenderContext
070: *******************************************************************************************/
071: public void addLabel(String label, Font font,
072: FontRenderContext fontRenderContext) {
073: TextTag textTag = new TextTag(label, font, fontRenderContext);
074: this .textTags.add(textTag);
075:
076: this .widestLabel = Math.max(textTag.getWidth(),
077: this .widestLabel);
078: this .totalLabelWidths += textTag.getWidth();
079:
080: this .tallestLabel = Math.max(textTag.getHeight(),
081: this .tallestLabel);
082: }
083:
084: /******************************************************************************************
085: * Returns the number of labels
086: *
087: * @return int
088: ******************************************************************************************/
089: public int size() {
090: return this .textTags.size();
091: }
092:
093: /******************************************************************************************
094: * Calculates the width and height needed by the passed String when rendered
095: *
096: // * @param iDataSeries
097: / * @param font
098: // * @param fontRenderContext
099: *******************************************************************************************
100: public void processLabels( IDataSeries iDataSeries) {
101: //LOOP
102: for( int i = 0; i < iDataSeries.getNumberOfXAxisLabels(); i++ )
103: {
104: this.axisLabelProcessor.processLabel( iDataSeries.getXAxisLabel( i ), axisLabelFont, fontRenderContext );
105: }
106:
107:
108: TextLayout textLayout = new TextLayout( label, font, fontRenderContext );
109:
110: //---WIDTH
111: this.labelWidths[ counter ] = textLayout.getAdvance();
112: this.widestLabel = Math.max( this.labelWidths[ counter ], this.widestLabel );
113: this.totalLabelWidths += this.labelWidths[ counter ];
114:
115: //---HEIGHT
116: this.labelHeights[ counter ] = textLayout.getAscent() + textLayout.getDescent();
117: this.tallestLabel = Math.max( this.labelHeights[ counter ], this.tallestLabel );
118:
119: //---need this to offset font rendering, as rendering is at the baseline not bottom or top,
120: this.fontDescent = textLayout.getDescent();
121:
122: this.counter++;
123: }
124:
125:
126: /******************************************************************************************
127: *
128: *
129: ******************************************************************************************/
130: public float getWidestLabel() {
131: return this .widestLabel;
132: }
133:
134: /******************************************************************************************
135: *
136: *
137: ******************************************************************************************/
138: public float getTallestLabel() {
139: return this .tallestLabel;
140: }
141:
142: /******************************************************************************************
143: *
144: *
145: ******************************************************************************************/
146: public float getTotalLabelWidths() {
147: return this .totalLabelWidths;
148: }
149:
150: /******************************************************************************************
151: *
152: * @param index
153: * @return TextTag
154: ******************************************************************************************/
155: public TextTag getTextTag(int index) {
156: return (TextTag) this.textTags.get(index);
157: }
158: }
|