/* * Copyright 2008 Jeff Dwyer * * 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.apress.progwt.client.widget.datepicker; import java.util.ArrayList; import java.util.Date; import java.util.Iterator; import java.util.List; import com.google.gwt.user.client.ui.ClickListener; import com.google.gwt.user.client.ui.Composite; import com.google.gwt.user.client.ui.FlexTable; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.SourcesTableEvents; import com.google.gwt.user.client.ui.TableListener; import com.google.gwt.user.client.ui.Widget; /** * Make an easier way to pick dates in the distant past * * @author Jeff Dwyer * */ public class LongRangePicker extends Composite implements TableListener { private static final String SELECTED = "selectedDate"; private static final int MONTH_ROW = 0; private static final int YEAR_ROW = 1; private static final int DECADE_ROW = 2; private static final int CENTURY_ROW = 3; private DatePicker datePicker; private FlexTable range = new FlexTable(); private List ranges; private Date currentDate; public LongRangePicker(DatePicker datePicker) { this.datePicker = datePicker; currentDate = new Date(); ranges = new ArrayList(); for (int i = 0; i < 12; i++) { RangeLabel r = new MonthLabel(i); ranges.add(r); range.setWidget(MONTH_ROW, i, r); } doYearRow(YEAR_ROW, 10); doYearRow(DECADE_ROW, 100); doYearRow(CENTURY_ROW, 1000); range.addTableListener(this); range.setStyleName("longRange"); // setAllTo(new Date()); initWidget(range); addStyleName("longRange"); } private void doYearRow(int row, int span) { range.setWidget(row, 0, new Clicker("<", -span)); for (int i = 0; i < 10; i++) { RangeLabel r = new YearLabel(i, span); ranges.add(r); range.setWidget(row, i + 1, r); } range.setWidget(row, 11, new Clicker(">", span)); } public void redraw(Date date) { setAllTo(date); } private void setAllTo(Date date) { for (Iterator iter = ranges.iterator(); iter.hasNext();) { RangeLabel label = (RangeLabel) iter.next(); label.setToDate(date); } } private void userPicks(Date date) { datePicker.setCurrentDate(date); datePicker.redrawCalendar(); } public void onCellClicked(SourcesTableEvents sender, int row, int col) { // Date currentDate = datePicker.getCurrentDate(); // // Date newDate = new Date( currentDate.getYear(), // currentDate.getMonth(), // 1900); if (range.getWidget(row, col) instanceof Clicker) { } else { RangeLabel rangeL = (RangeLabel) range.getWidget(row, col); userPicks(rangeL.getDate()); } // Integer.parseInt(this.calPanel.cellValues[row][col]) // datePicker.setSelectedDate(newDate); // datePicker.hide(); } private int getYear(Date d) { return d.getYear() + 1900; } private abstract class RangeLabel extends Label { protected int i; public RangeLabel(int i) { this.i = i; } abstract public void setToDate(Date d); abstract public Date getDate(); } private class MonthLabel extends RangeLabel { public MonthLabel(int i) { super(i); setText(DateConstants.MONTHS[i]); } public void setToDate(Date d) { if (d.getMonth() == i) { addStyleName(SELECTED); } else { removeStyleName(SELECTED); } } public Date getDate() { currentDate.setMonth(i); return currentDate; } } private class YearLabel extends RangeLabel { private int span; private int skew; private int myValue; public YearLabel(int i, int span) { this(i, span, 0); } public YearLabel(int i, int span, int skew) { super(i); this.span = span; this.skew = skew; } public void setToDate(Date d) { int intervalStart = (getYear(d) / span) * span;// int // division // floors int selected = (getYear(d) / (span / 10)) * (span / 10); // Log.debug("getYear(d) "+getYear(d)+" ints "+intervalStart+" // sel "+selected); myValue = (intervalStart + i * (span / 10)) + skew; setText("" + myValue); if (selected == myValue) { addStyleName(SELECTED); } else { removeStyleName(SELECTED); } } public Date getDate() { currentDate.setYear(myValue - 1900); return currentDate; } } private class Clicker extends Label implements ClickListener { private int span; public Clicker(String string, int span) { super(string); this.span = span; addClickListener(this); } /** * move the range down one section. don't just subtract though, or * 2000 - 10 = 1900 we'd prefer 2000 - 10 to be 1990. */ public void onClick(Widget sender) { int intervalStart = (getYear(currentDate) / span) * span; if (span > 1) { currentDate.setYear(intervalStart + span - 1900); } else { // ie for decade, span == -100 // so for 1950, interval start == 1900, then + (-100/10) = // 1890 currentDate.setYear(intervalStart + (span / 10) - 1900); } userPicks(currentDate); } } }