Getting the default DateBox() picker to advance year at a time

2,936 views
Skip to first unread message

Rob Tanner

unread,
Jun 2, 2010, 12:24:24 PM6/2/10
to Google Web Toolkit
Hi,

I'm using a DateBox() widget for users to enter their date of birth.
When the picker is displayed, on either side of the month/year
displayed in the center top of the picker are the greater than and
less than arrows for moving forward or backward, month at a time. I
have not figured out anyway to add year at a time as well (25 or more
years of moths is a lot of clicks). Is there anyway to accomplish
that?

Thanks,
Rob

Jim Douglas

unread,
Jun 2, 2010, 2:31:26 PM6/2/10
to Google Web Toolkit
No, it's not possible, short of writing a custom DatePicker. You
might want to vote for this open issue:

http://code.google.com/p/google-web-toolkit/issues/detail?id=3520

Danny Goovaerts

unread,
Jun 2, 2010, 3:46:03 PM6/2/10
to Google Web Toolkit
It's not necessary to write a custom DatePicker. It suffices to create
a DatePicker with a custom MonthSelector.
Here is my implementation
//
package eu.oobikwe.gwt.ui;

import com.google.gwt.user.datepicker.client.CalendarModel;
import com.google.gwt.user.datepicker.client.DatePicker;
import com.google.gwt.user.datepicker.client.DefaultCalendarView;

public class DatePickerWithYearSelector extends DatePicker {

public DatePickerWithYearSelector() {
super(new MonthAndYearSelector(),new DefaultCalendarView(),new
CalendarModel()) ;
MonthAndYearSelector monthSelector = (MonthAndYearSelector)
this.getMonthSelector() ;
monthSelector.setPicker(this) ;
monthSelector.setModel(this.getModel()) ;
}

public void refreshComponents() {
super.refreshAll() ;
}

}

//
package eu.oobikwe.gwt.ui;

import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.PushButton;
import com.google.gwt.user.client.ui.HTMLTable.CellFormatter;
import com.google.gwt.user.datepicker.client.CalendarModel;
import com.google.gwt.user.datepicker.client.MonthSelector;

/**
* A simple {@link MonthSelector} used for the default date picker.
Not
* extensible as we wish to evolve it freely over time.
*/

public class MonthAndYearSelector extends MonthSelector {

private static String BASE_NAME = "datePicker" ;

private PushButton backwards;
private PushButton forwards;
private PushButton backwardsYear;
private PushButton forwardsYear;
private Grid grid;
private int previousYearColumn = 0;
private int previousMonthColumn = 1 ;
private int monthColumn = 2 ;
private int nextMonthColumn = 3;
private int nextYearColumn = 4 ;
private CalendarModel model ;
private DatePickerWithYearSelector picker ;


public void setModel(CalendarModel model) {
this.model = model;
}



public void setPicker(DatePickerWithYearSelector picker) {
this.picker = picker;
}



@Override
protected void refresh() {
String formattedMonth = getModel().formatCurrentMonth();
grid.setText(0, monthColumn, formattedMonth);
}

@Override
protected void setup() {
// Set up backwards.
backwards = new PushButton();
backwards.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
addMonths(-1);
}
});

backwards.getUpFace().setHTML("‹");
backwards.setStyleName(BASE_NAME + "PreviousButton");

forwards = new PushButton();
forwards.getUpFace().setHTML("›");
forwards.setStyleName(BASE_NAME + "NextButton");
forwards.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
addMonths(+1);
}
});


// Set up backwards year
backwardsYear = new PushButton();
backwardsYear.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
addMonths(-12);
}
});

backwardsYear.getUpFace().setHTML("«");
backwardsYear.setStyleName(BASE_NAME + "PreviousButton");

forwardsYear = new PushButton();
forwardsYear.getUpFace().setHTML("»");
forwardsYear.setStyleName(BASE_NAME + "NextButton");
forwardsYear.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event) {
addMonths(+12);
}
});

// Set up grid.
grid = new Grid(1, 5);
grid.setWidget(0, previousYearColumn, backwardsYear);
grid.setWidget(0, previousMonthColumn, backwards);
grid.setWidget(0, nextMonthColumn, forwards);
grid.setWidget(0, nextYearColumn, forwardsYear);

CellFormatter formatter = grid.getCellFormatter();
formatter.setStyleName(0, monthColumn, BASE_NAME + "Month");
formatter.setWidth(0, previousYearColumn, "1");
formatter.setWidth(0, previousMonthColumn, "1");
formatter.setWidth(0, monthColumn, "100%");
formatter.setWidth(0, nextMonthColumn, "1");
formatter.setWidth(0, nextYearColumn, "1");
grid.setStyleName(BASE_NAME + "MonthSelector");
initWidget(grid);
}

public void addMonths(int numMonths) {
model.shiftCurrentMonth(numMonths);
picker.refreshComponents();
}

}

Danny
Message has been deleted

Pete

unread,
Aug 21, 2012, 5:11:46 AM8/21/12
to google-we...@googlegroups.com
Thank you very much, Danny!! You have saved me countless hours!

It would be great to have this code inside GWT. Steering Committee, what do you say?

Nataraj Patil C.V.

unread,
Sep 10, 2013, 10:09:12 AM9/10/13
to google-we...@googlegroups.com
Thanks , I am using this in my app

Danilo Reinert

unread,
Sep 13, 2013, 4:37:27 PM9/13/13
to google-we...@googlegroups.com
There is a patch going on by Julien Dramaix.


--
D. Reinert

Sumit Mane

unread,
Aug 20, 2014, 5:15:01 AM8/20/14
to google-we...@googlegroups.com
Thanks buddy, going to use this into my app. 
Just little contribution:
String formattedMonth = getModel().formatCurrentMonth();
change to:
String formattedMonth = getModel().formatCurrentMonthAndYear();
Reply all
Reply to author
Forward
0 new messages