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