content: package com.googlecode.android.widgets.DateSlider.labeler;
  
  import java.util.Calendar;
  
  import android.content.Context;
  
  import com.googlecode.android.widgets.DateSlider.TimeObject;
  import com.googlecode.android.widgets.DateSlider.timeview.TimeTextView;
  import com.googlecode.android.widgets.DateSlider.timeview.TimeView;
  
  /**
   * This is an abstract class whose job is create TimeViews that can be used
   * to populate a ScrollLayout, and to generate TimeObjects from times that
   * can be used to populate the TimeViews.
   */
  public abstract class Labeler {
      /**
       * The default width of views that this labeler generates, in dp
       */
      private final int viewWidthDP;
      /**
       * The default height of views that this labeler generates, in dp
       */
      private final int viewHeightDP;
      
      protected int minuteInterval=1;
  
      /**
       * @param viewWidthDB The default width of views labeled by this labeler in dp
       * @param viewHeightDB The default height of views labeled by this labeler in dp
       */
      public Labeler(int viewWidthDP, int viewHeightDP) {
          this.viewWidthDP = viewWidthDP;
          this.viewHeightDP = viewHeightDP;
      }
  
      /**
       * Converts from a time to a TimeObject according to the rules of this labeler.
       *
       * @param time The time to display
       * @return the TimeObject representing "time" suitable for populating TimeViews
       * returned from {@link #createView(Context, boolean)}
       */
      public TimeObject getElem(long time) {
          Calendar c = Calendar.getInstance();
          c.setTimeInMillis(time);
          return timeObjectfromCalendar(c);
      }
  
      /**
       * Returns a new TimeView instance appropriate for population using TimeObjects
       * retrieved from {@link #getElem(long)}.
       *
       * @param context
       * @param isCenterView is true when the view is the central view
       * @return The new unpopulated TimeView object
       */
      public TimeView createView(Context context, boolean isCenterView) {
          return new TimeTextView(context, isCenterView, 25);
      }
  
      /**
       * This method adds "val" time units (where a time unit is the amount of time that
       * separates one TimeView generated by this labeler from the next -- e.g. if this
       * labeler is producing TimeViews each representing a day, then a time unit would
       * be a single day) to the specified time and returns a TimeObject representing
       * the result.
       *
       * This method will be called constantly, whenever new date information is required.
       *
       * @param time The time
       * @param val The number of units to add to the time
       * @return The resulting TimeObject
       */
      public abstract TimeObject add(long time, int val);
      /**
       * This method converts from a calendar to a TimeObject -- it does the actual
       * work of turning a point time into the range and display string that componse
       * a TimeObject.
       *
       * @param c The time to convert
       * @return The resulting TimeObject
       */
      protected abstract TimeObject timeObjectfromCalendar(Calendar c);
  
      /**
       * This method return the preferred width of TimeViews labeled by this labeler.
       *
       * @param context
       * @return The preferred width, in pixels
       */
      public int getPreferredViewWidth(Context context) {
          return (int)(viewWidthDP * context.getResources().getDisplayMetrics().density);
      }
  
      /**
       * This method return the preferred width of TimeViews labeled by this labeler.
       *
       * @param context
       * @return The preferred width, in pixels
       */
      public int getPreferredViewHeight(Context context) {
          return (int)(viewHeightDP * context.getResources().getDisplayMetrics().density);
      }
      
      /**
       * This method sets a minute interval to only show multiples of this number in any
       * minute slider 
       * 
       * @param minInterval
       */
      public void setMinuteInterval(int minInterval) {
      	this.minuteInterval = minInterval;
      }
  }