16224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala/*
26224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala * Copyright 2012 AndroidPlot.com
36224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
46224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    Licensed under the Apache License, Version 2.0 (the "License");
56224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    you may not use this file except in compliance with the License.
66224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    You may obtain a copy of the License at
76224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
86224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *        http://www.apache.org/licenses/LICENSE-2.0
96224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *
106224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    Unless required by applicable law or agreed to in writing, software
116224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    distributed under the License is distributed on an "AS IS" BASIS,
126224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    See the License for the specific language governing permissions and
146224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala *    limitations under the License.
156224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala */
166224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
176224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalapackage com.androidplot.ui.widget;
186224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
196224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport android.graphics.*;
206224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport android.util.Log;
216224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport com.androidplot.ui.*;
226224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalaimport com.androidplot.util.FontUtils;
236224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
246224eda509d436a575f801942337da92a6c18767Eino-Ville Talvalapublic class TextLabelWidget extends Widget {
256224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private static final String TAG = TextLabelWidget.class.getName();
266224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
276224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private String text;
286224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private Paint labelPaint;
296224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
306224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private TextOrientationType orientation;
316224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
326224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    private boolean autoPackEnabled = true;
336224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
346224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    {
356224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        labelPaint = new Paint();
366224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        labelPaint.setColor(Color.WHITE);
376224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        labelPaint.setAntiAlias(true);
386224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        labelPaint.setTextAlign(Paint.Align.CENTER);
396224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
406224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
416224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public TextLabelWidget(LayoutManager layoutManager, SizeMetrics sizeMetrics) {
426224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this(layoutManager, sizeMetrics, TextOrientationType.HORIZONTAL);
436224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
446224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
456224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public TextLabelWidget(LayoutManager layoutManager, String title, SizeMetrics sizeMetrics, TextOrientationType orientation) {
466224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this(layoutManager, sizeMetrics, orientation);
476224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        setText(title);
486224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
496224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
506224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public TextLabelWidget(LayoutManager layoutManager, SizeMetrics sizeMetrics, TextOrientationType orientation) {
516224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        super(layoutManager, new SizeMetrics(0, SizeLayoutType.ABSOLUTE, 0, SizeLayoutType.ABSOLUTE));
526224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        //this.plot = plot;
536224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        //this.setWidth(labelPaint.measureText(plot.getTitle()));
546224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        //this.setHeight(labelPaint.getFontMetrics().top);
556224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        setSize(sizeMetrics);
566224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this.orientation = orientation;
576224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
586224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
596224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
606224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    protected void onMetricsChanged(SizeMetrics olds, SizeMetrics news) {
616224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(autoPackEnabled) {
626224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            pack();
636224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
646224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
656224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
666224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
676224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void onPostInit() {
686224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala       if(autoPackEnabled) {
696224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala           pack();
706224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala       }
716224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
726224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
736224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    //protected abstract String getText();
746224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
756224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
766224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Sets the dimensions of the widget to exactly contain the text contents
776224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
786224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void pack() {
796224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        Log.d(TAG, "Packing...");
806224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        Rect size = FontUtils.getStringDimensions(text, getLabelPaint());
816224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(size == null) {
826224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            Log.w(TAG, "Attempt to pack empty text.");
836224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            return;
846224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
856224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        switch(orientation) {
866224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            case HORIZONTAL:
876224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                setSize(new SizeMetrics(size.height(), SizeLayoutType.ABSOLUTE, size.width()+2, SizeLayoutType.ABSOLUTE));
886224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                break;
896224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            case VERTICAL_ASCENDING:
906224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            case VERTICAL_DESCENDING:
916224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                setSize(new SizeMetrics(size.width(), SizeLayoutType.ABSOLUTE, size.height()+2, SizeLayoutType.ABSOLUTE));
926224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                break;
936224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
946224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        refreshLayout();
956224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
966224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
976224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
986224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    /**
996224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * Do not call this method directly.  It is indirectly invoked every time a plot is
1006224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * redrawn.
1016224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param canvas The Canvas to draw onto
1026224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     * @param widgetRect the size and coordinates of this widget
1036224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala     */
1046224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    @Override
1056224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void doOnDraw(Canvas canvas, RectF widgetRect) {
1066224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(text == null || text.length() == 0) {
1076224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            return;
1086224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1096224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        //FontUtils.getStringDimensions(text, labelPaint);
1106224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        float vOffset = labelPaint.getFontMetrics().descent;
1116224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        PointF start = getAnchorCoordinates(widgetRect,
1126224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                AnchorPosition.CENTER);
1136224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1146224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        // BEGIN ROTATION CALCULATION
1156224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        //int canvasState = canvas.save(Canvas.ALL_SAVE_FLAG);
1166224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1176224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        try {
1186224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            canvas.save(Canvas.ALL_SAVE_FLAG);
1196224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            canvas.translate(start.x, start.y);
1206224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            switch (orientation) {
1216224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                case HORIZONTAL:
1226224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    break;
1236224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                case VERTICAL_ASCENDING:
1246224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    canvas.rotate(-90);
1256224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    break;
1266224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                case VERTICAL_DESCENDING:
1276224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    canvas.rotate(90);
1286224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    break;
1296224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                default:
1306224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1316224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala                    throw new UnsupportedOperationException("Orientation " + orientation + " not yet implemented for TextLabelWidget.");
1326224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            }
1336224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            canvas.drawText(text, 0, vOffset, labelPaint);
1346224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        } finally {
1356224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            //canvas.restoreToCount(canvasState);
1366224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            canvas.restore();
1376224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1386224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1396224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        // END ROTATION CALCULATION
1406224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1416224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1426224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public Paint getLabelPaint() {
1436224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        return labelPaint;
1446224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1456224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1466224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setLabelPaint(Paint labelPaint) {
1476224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this.labelPaint = labelPaint;
1486224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1496224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        // when paint changes, packing params change too so check
1506224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        // to see if we need to resize:
1516224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(autoPackEnabled) {
1526224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            pack();
1536224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1546224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1556224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1566224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public TextOrientationType getOrientation() {
1576224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        return orientation;
1586224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1596224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1606224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setOrientation(TextOrientationType orientation) {
1616224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this.orientation = orientation;
1626224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(autoPackEnabled) {
1636224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            pack();
1646224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1656224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1666224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1676224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public boolean isAutoPackEnabled() {
1686224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        return autoPackEnabled;
1696224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1706224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1716224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setAutoPackEnabled(boolean autoPackEnabled) {
1726224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this.autoPackEnabled = autoPackEnabled;
1736224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(autoPackEnabled) {
1746224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            pack();
1756224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1766224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1776224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1786224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public void setText(String text) {
1796224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        Log.d(TAG, "Setting textLabel to: " + text);
1806224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        this.text = text;
1816224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        if(autoPackEnabled) {
1826224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala            pack();
1836224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        }
1846224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1856224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala
1866224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    public String getText() {
1876224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala        return text;
1886224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala    }
1896224eda509d436a575f801942337da92a6c18767Eino-Ville Talvala}
190