/* * Copyright (C) 2011 Daniel Berndt - Codeus Ltd - DateSlider * * This interface represents Views that are put onto the ScrollLayout * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.catglo.widgets; import java.util.Calendar; import com.catglo.widgets.DateSlider.TimeObject; import android.content.Context; import android.graphics.Typeface; import android.util.TypedValue; import android.view.Gravity; import android.widget.LinearLayout; import android.widget.TextView; /** * This interface represents the views that will settle the ScrollLayout. Each element has to deal * with its label via the setText method and needs to contain the start and end time of the element. * Moreover this interface contains three implementations one simple TextView, A two-row * LinearLayout and a LinearLayout which colors Sundays red. * */ public interface TimeView { public void setVals(TimeObject to); public void setVals(TimeView other); public String getTimeText(); public long getStartTime(); public long getEndTime(); /** * This is a simple implementation of a TimeView which realised through a TextView. * */ public static class TimeTextView extends TextView implements TimeView { private long endTime, startTime; /** * constructor * @param context * @param isCenterView true if the element is the centered view in the ScrollLayout * @param textSize text size in dps */ public TimeTextView(Context context, boolean isCenterView, int textSize) { super(context); setupView(isCenterView, textSize); } /** * this method should be overwritten by inheriting classes to define its own look and feel * @param isCenterView true if the element is in the center of the scrollLayout * @param textSize textSize in dps */ protected void setupView(boolean isCenterView, int textSize) { setGravity(Gravity.CENTER); setTextSize(TypedValue.COMPLEX_UNIT_DIP, textSize); if (isCenterView) { setTypeface(Typeface.DEFAULT_BOLD); setTextColor(0xFF333333); } else { setTextColor(0xFF666666); } } public void setVals(DateSlider.TimeObject to) { setText(to.text); this.startTime = to.startTime; this.endTime = to.endTime; } public void setVals(TimeView other) { setText(other.getTimeText()); startTime = other.getStartTime(); endTime = other.getEndTime(); } public long getStartTime() { return this.startTime; } public long getEndTime() { return this.endTime; } public String getTimeText() { return getText().toString(); } } /** * This is a more complex implementation of the TimeView consisting of a LinearLayout with * two TimeViews. * */ public static class TimeLayoutView extends LinearLayout implements TimeView { protected long endTime, startTime; protected String text; protected boolean isCenter=false; protected TextView topView, bottomView; /** * constructor * * @param context * @param isCenterView true if the element is the centered view in the ScrollLayout * @param topTextSize text size of the top TextView in dps * @param bottomTextSize text size of the bottom TextView in dps * @param lineHeight LineHeight of the top TextView */ public TimeLayoutView(Context context, boolean isCenterView, int topTextSize, int bottomTextSize, float lineHeight) { super(context); setupView(context, isCenterView, topTextSize, bottomTextSize, lineHeight); } /** * Setting up the top TextView and bottom TextVew * @param context * @param isCenterView true if the element is the centered view in the ScrollLayout * @param topTextSize text size of the top TextView in dps * @param bottomTextSize text size of the bottom TextView in dps * @param lineHeight LineHeight of the top TextView */ protected void setupView(Context context, boolean isCenterView, int topTextSize, int bottomTextSize, float lineHeight) { setOrientation(VERTICAL); topView = new TextView(context); topView.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.BOTTOM); topView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, topTextSize); bottomView = new TextView(context); bottomView.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.TOP); bottomView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, bottomTextSize); topView.setLineSpacing(0, lineHeight); if (isCenterView) { isCenter = true; topView.setTypeface(Typeface.DEFAULT_BOLD); topView.setTextColor(0xFF333333); bottomView.setTypeface(Typeface.DEFAULT_BOLD); bottomView.setTextColor(0xFF444444); topView.setPadding(0, 5-(int)(topTextSize/15.0), 0, 0); } else { topView.setPadding(0, 5, 0, 0); topView.setTextColor(0xFF666666); bottomView.setTextColor(0xFF666666); } addView(topView);addView(bottomView); } public void setVals(TimeObject to) { text = to.text.toString(); setText(); this.startTime = to.startTime; this.endTime = to.endTime; } public void setVals(TimeView other) { text = other.getTimeText().toString(); setText(); startTime = other.getStartTime(); endTime = other.getEndTime(); } /** * sets the TextView texts by splitting the text into two */ protected void setText() { String[] splitTime = text.split(" "); topView.setText(splitTime[0]); bottomView.setText(splitTime[1]); } public String getTimeText() { return text; } public long getStartTime() { return startTime; } public long getEndTime() { return endTime; } } /** * More complex implementation of the TimeView which is based on the TimeLayoutView. * Sundays are colored red in here. * */ public static class DayTimeLayoutView extends TimeLayoutView { protected boolean isSunday=false; /** * Constructor * @param context * @param isCenterView true if the element is the centered view in the ScrollLayout * @param topTextSize text size of the top TextView in dps * @param bottomTextSize text size of the bottom TextView in dps * @param lineHeight LineHeight of the top TextView */ public DayTimeLayoutView(Context context, boolean isCenterView, int topTextSize, int bottomTextSize, float lineHeight) { super(context, isCenterView, topTextSize, bottomTextSize, lineHeight); } public void setVals(TimeObject to) { super.setVals(to); Calendar c = Calendar.getInstance(); c.setTimeInMillis(to.endTime); if (c.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY && !isSunday) { isSunday=true; colorMeSunday(); } else if (isSunday && c.get(Calendar.DAY_OF_WEEK)!=Calendar.SUNDAY) { isSunday=false; colorMeWorkday(); } } /** * this method is called when the current View takes a Sunday as time unit */ protected void colorMeSunday() { if (isCenter) { bottomView.setTextColor(0xFF773333); topView.setTextColor(0xFF553333); } else { bottomView.setTextColor(0xFF442222); topView.setTextColor(0xFF553333); } } /** * this method is called when the current View takes no Sunday as time unit */ protected void colorMeWorkday() { if (isCenter) { topView.setTextColor(0xFF333333); bottomView.setTextColor(0xFF444444); } else { topView.setTextColor(0xFF666666); bottomView.setTextColor(0xFF666666); } } public void setVals(TimeView other) { super.setVals(other); DayTimeLayoutView otherDay = (DayTimeLayoutView) other; if (otherDay.isSunday && !isSunday) { isSunday = true; colorMeSunday(); } else if (isSunday && !otherDay.isSunday) { isSunday = false; colorMeWorkday(); } } } }