123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245 |
- package com.vaadin.tests.themes.valo;
-
- import java.text.DateFormatSymbols;
- import java.util.Date;
- import java.util.GregorianCalendar;
- import java.util.Locale;
- import java.util.TimeZone;
-
- import com.vaadin.annotations.Theme;
- import com.vaadin.data.Item;
- import com.vaadin.data.Property;
- import com.vaadin.data.Property.ValueChangeEvent;
- import com.vaadin.data.Property.ValueChangeListener;
- import com.vaadin.data.fieldgroup.FieldGroup;
- import com.vaadin.data.fieldgroup.FieldGroup.CommitException;
- import com.vaadin.data.util.BeanItem;
- import com.vaadin.navigator.View;
- import com.vaadin.navigator.ViewChangeListener.ViewChangeEvent;
- import com.vaadin.shared.ui.combobox.FilteringMode;
- import com.vaadin.shared.ui.datefield.Resolution;
- import com.vaadin.tests.components.calendar.CalendarTestEvent;
- import com.vaadin.ui.Alignment;
- import com.vaadin.ui.Button;
- import com.vaadin.ui.Button.ClickEvent;
- import com.vaadin.ui.Button.ClickListener;
- import com.vaadin.ui.Calendar;
- import com.vaadin.ui.Calendar.TimeFormat;
- import com.vaadin.ui.CheckBox;
- import com.vaadin.ui.ComboBox;
- import com.vaadin.ui.CssLayout;
- import com.vaadin.ui.DateField;
- import com.vaadin.ui.FormLayout;
- import com.vaadin.ui.GridLayout;
- import com.vaadin.ui.HorizontalLayout;
- import com.vaadin.ui.Label;
- import com.vaadin.ui.Layout;
- import com.vaadin.ui.TextArea;
- import com.vaadin.ui.TextField;
- import com.vaadin.ui.VerticalLayout;
- import com.vaadin.ui.Window;
- import com.vaadin.ui.components.calendar.CalendarComponentEvents.DateClickEvent;
- import com.vaadin.ui.components.calendar.CalendarComponentEvents.EventClick;
- import com.vaadin.ui.components.calendar.CalendarComponentEvents.EventClickHandler;
- import com.vaadin.ui.components.calendar.CalendarComponentEvents.RangeSelectEvent;
- import com.vaadin.ui.components.calendar.CalendarComponentEvents.RangeSelectHandler;
- import com.vaadin.ui.components.calendar.CalendarComponentEvents.WeekClick;
- import com.vaadin.ui.components.calendar.CalendarComponentEvents.WeekClickHandler;
- import com.vaadin.ui.components.calendar.event.BasicEvent;
- import com.vaadin.ui.components.calendar.event.BasicEventProvider;
- import com.vaadin.ui.components.calendar.event.CalendarEvent;
- import com.vaadin.ui.components.calendar.handler.BasicDateClickHandler;
- import com.vaadin.ui.components.calendar.handler.BasicWeekClickHandler;
- import com.vaadin.ui.themes.ValoTheme;
-
- /** Calendar component test application */
- @Theme("valo-test")
- public class CalendarTest extends GridLayout implements View {
-
- private static final long serialVersionUID = -5436777475398410597L;
-
- private static final String DEFAULT_ITEMID = "DEFAULT";
-
- private enum Mode {
- MONTH, WEEK, DAY;
- }
-
- /**
- * This Gregorian calendar is used to control dates and time inside of this
- * test application.
- */
- private GregorianCalendar calendar;
-
- /** Target calendar component that this test application is made for. */
- private Calendar calendarComponent;
-
- private Date currentMonthsFirstDate;
-
- private final Label captionLabel = new Label("");
-
- private Button monthButton;
-
- private Button weekButton;
-
- private Button dayButton;
-
- private Button nextButton;
-
- private Button prevButton;
-
- private ComboBox timeZoneSelect;
-
- private ComboBox formatSelect;
-
- private ComboBox localeSelect;
-
- private CheckBox hideWeekendsButton;
-
- private CheckBox readOnlyButton;
-
- private TextField captionField;
-
- private Window scheduleEventPopup;
-
- private final FormLayout scheduleEventFieldLayout = new FormLayout();
- private FieldGroup scheduleEventFieldGroup = new FieldGroup();
-
- private Button deleteEventButton;
-
- private Button applyEventButton;
-
- private Mode viewMode = Mode.WEEK;
-
- private BasicEventProvider dataSource;
-
- private Button addNewEvent;
-
- /*
- * When testBench is set to true, CalendarTest will have static content that
- * is more suitable for Vaadin TestBench testing. Calendar will use a static
- * date Mon 10 Jan 2000. Enable by starting the application with a
- * "testBench" parameter in the URL.
- */
- private boolean testBench = false;
-
- private String calendarHeight = null;
-
- private String calendarWidth = null;
-
- private CheckBox disabledButton;
-
- private Integer firstHour;
-
- private Integer lastHour;
-
- private Integer firstDay;
-
- private Integer lastDay;
-
- private Locale defaultLocale = Locale.US;
-
- private boolean showWeeklyView;
-
- private boolean useSecondResolution;
-
- private DateField startDateField;
- private DateField endDateField;
-
- public CalendarTest() {
- setSizeFull();
- setHeight("1000px");
- setMargin(true);
- setSpacing(true);
-
- // handleURLParams(request.getParameterMap());
- testBench = ValoThemeUI.isTestMode();
-
- initContent();
- }
-
- public void initContent() {
- // Set default Locale for this application
- if (testBench) {
- setLocale(defaultLocale);
-
- } else {
- setLocale(Locale.getDefault());
- }
-
- // Initialize locale, timezone and timeformat selects.
- localeSelect = createLocaleSelect();
- timeZoneSelect = createTimeZoneSelect();
- formatSelect = createCalendarFormatSelect();
-
- initCalendar();
- initLayoutContent();
- addInitialEvents();
- }
-
- private Date resolveFirstDateOfWeek(Date today,
- java.util.Calendar currentCalendar) {
- int firstDayOfWeek = currentCalendar.getFirstDayOfWeek();
- currentCalendar.setTime(today);
- while (firstDayOfWeek != currentCalendar
- .get(java.util.Calendar.DAY_OF_WEEK)) {
- currentCalendar.add(java.util.Calendar.DATE, -1);
- }
- return currentCalendar.getTime();
- }
-
- private Date resolveLastDateOfWeek(Date today,
- java.util.Calendar currentCalendar) {
- currentCalendar.setTime(today);
- currentCalendar.add(java.util.Calendar.DATE, 1);
- int firstDayOfWeek = currentCalendar.getFirstDayOfWeek();
- // Roll to weeks last day using firstdayofweek. Roll until FDofW is
- // found and then roll back one day.
- while (firstDayOfWeek != currentCalendar
- .get(java.util.Calendar.DAY_OF_WEEK)) {
- currentCalendar.add(java.util.Calendar.DATE, 1);
- }
- currentCalendar.add(java.util.Calendar.DATE, -1);
- return currentCalendar.getTime();
- }
-
- private void addInitialEvents() {
- Date originalDate = calendar.getTime();
- Date today = getToday();
-
- // Add a event that last a whole week
-
- Date start = resolveFirstDateOfWeek(today, calendar);
- Date end = resolveLastDateOfWeek(today, calendar);
- CalendarTestEvent event = getNewEvent("Whole week event", start, end);
- event.setAllDay(true);
- event.setStyleName("color4");
- event.setDescription("Description for the whole week event.");
- dataSource.addEvent(event);
-
- // Add a allday event
- calendar.setTime(start);
- calendar.add(GregorianCalendar.DATE, 3);
- start = calendar.getTime();
- end = start;
- event = getNewEvent("All-day event", start, end);
- event.setAllDay(true);
- event.setDescription("Some description.");
- event.setStyleName("color3");
- dataSource.addEvent(event);
-
- // Add a second allday event
- calendar.add(GregorianCalendar.DATE, 1);
- start = calendar.getTime();
- end = start;
- event = getNewEvent("Second all-day event", start, end);
- event.setAllDay(true);
- event.setDescription("Some description.");
- event.setStyleName("color2");
- dataSource.addEvent(event);
-
- calendar.add(GregorianCalendar.DATE, -3);
- calendar.set(GregorianCalendar.HOUR_OF_DAY, 9);
- calendar.set(GregorianCalendar.MINUTE, 30);
- start = calendar.getTime();
- calendar.add(GregorianCalendar.HOUR_OF_DAY, 5);
- calendar.set(GregorianCalendar.MINUTE, 0);
- end = calendar.getTime();
- event = getNewEvent("Appointment", start, end);
- event.setWhere("Office");
- event.setStyleName("color1");
- event.setDescription("A longer description, which should display correctly.");
- dataSource.addEvent(event);
-
- calendar.add(GregorianCalendar.DATE, 1);
- calendar.set(GregorianCalendar.HOUR_OF_DAY, 11);
- calendar.set(GregorianCalendar.MINUTE, 0);
- start = calendar.getTime();
- calendar.add(GregorianCalendar.HOUR_OF_DAY, 8);
- end = calendar.getTime();
- event = getNewEvent("Training", start, end);
- event.setStyleName("color2");
- dataSource.addEvent(event);
-
- calendar.add(GregorianCalendar.DATE, 4);
- calendar.set(GregorianCalendar.HOUR_OF_DAY, 9);
- calendar.set(GregorianCalendar.MINUTE, 0);
- start = calendar.getTime();
- calendar.add(GregorianCalendar.HOUR_OF_DAY, 9);
- end = calendar.getTime();
- event = getNewEvent("Free time", start, end);
- dataSource.addEvent(event);
-
- calendar.setTime(originalDate);
- }
-
- private void initLayoutContent() {
- initNavigationButtons();
- initHideWeekEndButton();
- initReadOnlyButton();
- initDisabledButton();
- initAddNewEventButton();
-
- HorizontalLayout hl = new HorizontalLayout();
- hl.setWidth("100%");
- hl.setSpacing(true);
- hl.addComponent(prevButton);
- hl.addComponent(captionLabel);
-
- CssLayout group = new CssLayout();
- group.addStyleName("v-component-group");
- group.addComponent(dayButton);
- group.addComponent(weekButton);
- group.addComponent(monthButton);
- hl.addComponent(group);
-
- hl.addComponent(nextButton);
- hl.setComponentAlignment(prevButton, Alignment.MIDDLE_LEFT);
- hl.setComponentAlignment(captionLabel, Alignment.MIDDLE_CENTER);
- hl.setComponentAlignment(group, Alignment.MIDDLE_CENTER);
- hl.setComponentAlignment(nextButton, Alignment.MIDDLE_RIGHT);
-
- // monthButton.setVisible(viewMode == Mode.WEEK);
- // weekButton.setVisible(viewMode == Mode.DAY);
-
- HorizontalLayout controlPanel = new HorizontalLayout();
- controlPanel.setSpacing(true);
- controlPanel.setWidth("100%");
- controlPanel.addComponent(localeSelect);
- controlPanel.addComponent(timeZoneSelect);
- controlPanel.addComponent(formatSelect);
- controlPanel.addComponent(hideWeekendsButton);
- controlPanel.addComponent(readOnlyButton);
- controlPanel.addComponent(disabledButton);
- controlPanel.addComponent(addNewEvent);
-
- controlPanel.setComponentAlignment(timeZoneSelect,
- Alignment.MIDDLE_LEFT);
- controlPanel.setComponentAlignment(formatSelect, Alignment.MIDDLE_LEFT);
- controlPanel.setComponentAlignment(localeSelect, Alignment.MIDDLE_LEFT);
- controlPanel.setComponentAlignment(hideWeekendsButton,
- Alignment.MIDDLE_LEFT);
- controlPanel.setComponentAlignment(readOnlyButton,
- Alignment.MIDDLE_LEFT);
- controlPanel.setComponentAlignment(disabledButton,
- Alignment.MIDDLE_LEFT);
- controlPanel.setComponentAlignment(addNewEvent, Alignment.MIDDLE_LEFT);
-
- Label viewCaption = new Label("Calendar");
- viewCaption.setStyleName(ValoTheme.LABEL_H1);
- addComponent(viewCaption);
- addComponent(controlPanel);
- addComponent(hl);
- addComponent(calendarComponent);
- setRowExpandRatio(getRows() - 1, 1.0f);
- }
-
- private void initNavigationButtons() {
- monthButton = new Button("Month", new ClickListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- switchToMonthView();
- }
- });
-
- weekButton = new Button("Week", new ClickListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- // simulate week click
- WeekClickHandler handler = (WeekClickHandler) calendarComponent
- .getHandler(WeekClick.EVENT_ID);
- handler.weekClick(new WeekClick(calendarComponent, calendar
- .get(GregorianCalendar.WEEK_OF_YEAR), calendar
- .get(GregorianCalendar.YEAR)));
- }
- });
-
- dayButton = new Button("Day", new ClickListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- // simulate day click
- BasicDateClickHandler handler = (BasicDateClickHandler) calendarComponent
- .getHandler(DateClickEvent.EVENT_ID);
- handler.dateClick(new DateClickEvent(calendarComponent,
- calendar.getTime()));
- }
- });
-
- nextButton = new Button("Next", new Button.ClickListener() {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- handleNextButtonClick();
- }
- });
-
- prevButton = new Button("Prev", new Button.ClickListener() {
- private static final long serialVersionUID = 1L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- handlePreviousButtonClick();
- }
- });
- }
-
- private void initHideWeekEndButton() {
- hideWeekendsButton = new CheckBox("Hide weekends");
- hideWeekendsButton.setImmediate(true);
- hideWeekendsButton
- .addValueChangeListener(new Property.ValueChangeListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void valueChange(ValueChangeEvent event) {
- setWeekendsHidden(hideWeekendsButton.getValue());
- }
- });
- }
-
- private void setWeekendsHidden(boolean weekendsHidden) {
- if (weekendsHidden) {
- int firstToShow = (GregorianCalendar.MONDAY - calendar
- .getFirstDayOfWeek()) % 7;
- calendarComponent.setFirstVisibleDayOfWeek(firstToShow + 1);
- calendarComponent.setLastVisibleDayOfWeek(firstToShow + 5);
- } else {
- calendarComponent.setFirstVisibleDayOfWeek(1);
- calendarComponent.setLastVisibleDayOfWeek(7);
- }
-
- }
-
- private void initReadOnlyButton() {
- readOnlyButton = new CheckBox("Read-only mode");
- readOnlyButton.setImmediate(true);
- readOnlyButton
- .addValueChangeListener(new Property.ValueChangeListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void valueChange(ValueChangeEvent event) {
- calendarComponent.setReadOnly(readOnlyButton.getValue());
- }
- });
- }
-
- private void initDisabledButton() {
- disabledButton = new CheckBox("Disabled");
- disabledButton.setImmediate(true);
- disabledButton
- .addValueChangeListener(new Property.ValueChangeListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void valueChange(ValueChangeEvent event) {
- calendarComponent.setEnabled(!disabledButton.getValue());
- }
- });
- }
-
- public void initAddNewEventButton() {
- addNewEvent = new Button("Add new event");
- addNewEvent.addClickListener(new Button.ClickListener() {
-
- private static final long serialVersionUID = -8307244759142541067L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- Date start = getToday();
- start.setHours(0);
- start.setMinutes(0);
- start.setSeconds(0);
-
- Date end = getEndOfDay(calendar, start);
-
- showEventPopup(createNewEvent(start, end), true);
- }
- });
- }
-
- private void initFormFields(Layout formLayout,
- Class<? extends CalendarEvent> eventClass) {
-
- startDateField = createDateField("Start date");
- endDateField = createDateField("End date");
-
- final CheckBox allDayField = createCheckBox("All-day");
- allDayField.addValueChangeListener(new Property.ValueChangeListener() {
-
- private static final long serialVersionUID = -7104996493482558021L;
-
- @Override
- public void valueChange(ValueChangeEvent event) {
- Object value = event.getProperty().getValue();
- if (value instanceof Boolean && Boolean.TRUE.equals(value)) {
- setFormDateResolution(Resolution.DAY);
-
- } else {
- setFormDateResolution(Resolution.MINUTE);
- }
- }
-
- });
-
- captionField = createTextField("Caption");
- captionField.setInputPrompt("Event name");
- captionField.setRequired(true);
- final TextField whereField = createTextField("Where");
- whereField.setInputPrompt("Address or location");
- final TextArea descriptionField = createTextArea("Description");
- descriptionField.setInputPrompt("Describe the event");
- descriptionField.setRows(3);
- // descriptionField.setRequired(true);
-
- final ComboBox styleNameField = createStyleNameComboBox();
- styleNameField.setInputPrompt("Choose calendar");
- styleNameField.setTextInputAllowed(false);
-
- formLayout.addComponent(startDateField);
- // startDateField.setRequired(true);
- formLayout.addComponent(endDateField);
- formLayout.addComponent(allDayField);
- formLayout.addComponent(captionField);
- // captionField.setComponentError(new UserError("Testing error"));
- if (eventClass == CalendarTestEvent.class) {
- formLayout.addComponent(whereField);
- }
- formLayout.addComponent(descriptionField);
- formLayout.addComponent(styleNameField);
-
- scheduleEventFieldGroup.bind(startDateField, "start");
- scheduleEventFieldGroup.bind(endDateField, "end");
- scheduleEventFieldGroup.bind(captionField, "caption");
- scheduleEventFieldGroup.bind(descriptionField, "description");
- if (eventClass == CalendarTestEvent.class) {
- scheduleEventFieldGroup.bind(whereField, "where");
- }
- scheduleEventFieldGroup.bind(styleNameField, "styleName");
- scheduleEventFieldGroup.bind(allDayField, "allDay");
- }
-
- private CheckBox createCheckBox(String caption) {
- CheckBox cb = new CheckBox(caption);
- cb.setImmediate(true);
- return cb;
- }
-
- private TextField createTextField(String caption) {
- TextField f = new TextField(caption);
- f.setNullRepresentation("");
- return f;
- }
-
- private TextArea createTextArea(String caption) {
- TextArea f = new TextArea(caption);
- f.setNullRepresentation("");
- return f;
- }
-
- private DateField createDateField(String caption) {
- DateField f = new DateField(caption);
- if (useSecondResolution) {
- f.setResolution(Resolution.SECOND);
- } else {
- f.setResolution(Resolution.MINUTE);
- }
- return f;
- }
-
- private ComboBox createStyleNameComboBox() {
- ComboBox s = new ComboBox("Calendar");
- s.addContainerProperty("c", String.class, "");
- s.setItemCaptionPropertyId("c");
- Item i = s.addItem("color1");
- i.getItemProperty("c").setValue("Work");
- i = s.addItem("color2");
- i.getItemProperty("c").setValue("Personal");
- i = s.addItem("color3");
- i.getItemProperty("c").setValue("Family");
- i = s.addItem("color4");
- i.getItemProperty("c").setValue("Hobbies");
- return s;
- }
-
- private void initCalendar() {
- dataSource = new BasicEventProvider();
-
- calendarComponent = new Calendar(dataSource);
- calendarComponent.setLocale(getLocale());
- calendarComponent.setImmediate(true);
-
- if (calendarWidth != null || calendarHeight != null) {
- if (calendarHeight != null) {
- calendarComponent.setHeight(calendarHeight);
- }
- if (calendarWidth != null) {
- calendarComponent.setWidth(calendarWidth);
- }
- } else {
- calendarComponent.setSizeFull();
- }
-
- if (firstHour != null && lastHour != null) {
- calendarComponent.setFirstVisibleHourOfDay(firstHour);
- calendarComponent.setLastVisibleHourOfDay(lastHour);
- }
-
- if (firstDay != null && lastDay != null) {
- calendarComponent.setFirstVisibleDayOfWeek(firstDay);
- calendarComponent.setLastVisibleDayOfWeek(lastDay);
- }
-
- Date today = getToday();
- calendar = new GregorianCalendar(getLocale());
- calendar.setTime(today);
- calendarComponent.getInternalCalendar().setTime(today);
-
- // Calendar getStartDate (and getEndDate) has some strange logic which
- // returns Monday of the current internal time if no start date has been
- // set
- calendarComponent.setStartDate(calendarComponent.getStartDate());
- calendarComponent.setEndDate(calendarComponent.getEndDate());
- int rollAmount = calendar.get(GregorianCalendar.DAY_OF_MONTH) - 1;
- calendar.add(GregorianCalendar.DAY_OF_MONTH, -rollAmount);
- currentMonthsFirstDate = calendar.getTime();
-
- updateCaptionLabel();
-
- if (!showWeeklyView) {
- // resetTime(false);
- // currentMonthsFirstDate = calendar.getTime();
- // calendarComponent.setStartDate(currentMonthsFirstDate);
- // calendar.add(GregorianCalendar.MONTH, 1);
- // calendar.add(GregorianCalendar.DATE, -1);
- // calendarComponent.setEndDate(calendar.getTime());
- }
-
- addCalendarEventListeners();
- }
-
- private Date getToday() {
- if (testBench) {
- GregorianCalendar testDate = new GregorianCalendar();
- testDate.set(GregorianCalendar.YEAR, 2000);
- testDate.set(GregorianCalendar.MONTH, 0);
- testDate.set(GregorianCalendar.DATE, 10);
- testDate.set(GregorianCalendar.HOUR_OF_DAY, 0);
- testDate.set(GregorianCalendar.MINUTE, 0);
- testDate.set(GregorianCalendar.SECOND, 0);
- testDate.set(GregorianCalendar.MILLISECOND, 0);
- return testDate.getTime();
- }
- return new Date();
- }
-
- @SuppressWarnings("serial")
- private void addCalendarEventListeners() {
- // Register week clicks by changing the schedules start and end dates.
- calendarComponent.setHandler(new BasicWeekClickHandler() {
-
- @Override
- public void weekClick(WeekClick event) {
- // let BasicWeekClickHandler handle calendar dates, and update
- // only the other parts of UI here
- super.weekClick(event);
- updateCaptionLabel();
- switchToWeekView();
- }
- });
-
- calendarComponent.setHandler(new EventClickHandler() {
-
- @Override
- public void eventClick(EventClick event) {
- showEventPopup(event.getCalendarEvent(), false);
- }
- });
-
- calendarComponent.setHandler(new BasicDateClickHandler() {
-
- @Override
- public void dateClick(DateClickEvent event) {
- // let BasicDateClickHandler handle calendar dates, and update
- // only the other parts of UI here
- super.dateClick(event);
- switchToDayView();
- }
- });
-
- calendarComponent.setHandler(new RangeSelectHandler() {
-
- @Override
- public void rangeSelect(RangeSelectEvent event) {
- handleRangeSelect(event);
- }
- });
- }
-
- private ComboBox createTimeZoneSelect() {
- ComboBox s = new ComboBox("Timezone");
- s.addContainerProperty("caption", String.class, "");
- s.setItemCaptionPropertyId("caption");
- s.setFilteringMode(FilteringMode.CONTAINS);
-
- Item i = s.addItem(DEFAULT_ITEMID);
- i.getItemProperty("caption").setValue(
- "Default (" + TimeZone.getDefault().getID() + ")");
- for (String id : TimeZone.getAvailableIDs()) {
- if (!s.containsId(id)) {
- i = s.addItem(id);
- i.getItemProperty("caption").setValue(id);
- }
- }
-
- if (testBench) {
- s.select("America/New_York");
- } else {
- s.select(DEFAULT_ITEMID);
- }
- s.setImmediate(true);
- s.addValueChangeListener(new ValueChangeListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void valueChange(ValueChangeEvent event) {
-
- updateCalendarTimeZone(event.getProperty().getValue());
- }
- });
-
- return s;
- }
-
- private ComboBox createCalendarFormatSelect() {
- ComboBox s = new ComboBox("Calendar format");
- s.addContainerProperty("caption", String.class, "");
- s.setItemCaptionPropertyId("caption");
-
- Item i = s.addItem(DEFAULT_ITEMID);
- i.getItemProperty("caption").setValue("Default by locale");
- i = s.addItem(TimeFormat.Format12H);
- i.getItemProperty("caption").setValue("12H");
- i = s.addItem(TimeFormat.Format24H);
- i.getItemProperty("caption").setValue("24H");
-
- s.select(DEFAULT_ITEMID);
- s.setImmediate(true);
- s.addValueChangeListener(new ValueChangeListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void valueChange(ValueChangeEvent event) {
- updateCalendarFormat(event.getProperty().getValue());
- }
- });
-
- return s;
- }
-
- private ComboBox createLocaleSelect() {
- ComboBox s = new ComboBox("Locale");
- s.addContainerProperty("caption", String.class, "");
- s.setItemCaptionPropertyId("caption");
- s.setFilteringMode(FilteringMode.CONTAINS);
-
- for (Locale l : Locale.getAvailableLocales()) {
- if (!s.containsId(l)) {
- Item i = s.addItem(l);
- i.getItemProperty("caption").setValue(getLocaleItemCaption(l));
- }
- }
-
- s.select(getLocale());
- s.setImmediate(true);
- s.addValueChangeListener(new ValueChangeListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void valueChange(ValueChangeEvent event) {
- updateCalendarLocale((Locale) event.getProperty().getValue());
- }
- });
-
- return s;
- }
-
- private void updateCalendarTimeZone(Object timezoneId) {
- TimeZone tz = null;
- if (!DEFAULT_ITEMID.equals(timezoneId)) {
- tz = TimeZone.getTimeZone((String) timezoneId);
- }
-
- // remember the week that was showing, so we can re-set it later
- Date startDate = calendarComponent.getStartDate();
- calendar.setTime(startDate);
- int weekNumber = calendar.get(java.util.Calendar.WEEK_OF_YEAR);
- calendarComponent.setTimeZone(tz);
- calendar.setTimeZone(calendarComponent.getTimeZone());
-
- if (viewMode == Mode.WEEK) {
- calendar.set(java.util.Calendar.WEEK_OF_YEAR, weekNumber);
- calendar.set(java.util.Calendar.DAY_OF_WEEK,
- calendar.getFirstDayOfWeek());
-
- calendarComponent.setStartDate(calendar.getTime());
- calendar.add(java.util.Calendar.DATE, 6);
- calendarComponent.setEndDate(calendar.getTime());
- }
- }
-
- private void updateCalendarFormat(Object format) {
- TimeFormat calFormat = null;
- if (format instanceof TimeFormat) {
- calFormat = (TimeFormat) format;
- }
-
- calendarComponent.setTimeFormat(calFormat);
- }
-
- private String getLocaleItemCaption(Locale l) {
- String country = l.getDisplayCountry(getLocale());
- String language = l.getDisplayLanguage(getLocale());
- StringBuilder caption = new StringBuilder(country);
- if (caption.length() != 0) {
- caption.append(", ");
- }
- caption.append(language);
- return caption.toString();
- }
-
- private void updateCalendarLocale(Locale l) {
- int oldFirstDayOfWeek = calendar.getFirstDayOfWeek();
- setLocale(l);
- calendarComponent.setLocale(l);
- calendar = new GregorianCalendar(l);
- int newFirstDayOfWeek = calendar.getFirstDayOfWeek();
-
- // we are showing 1 week, and the first day of the week has changed
- // update start and end dates so that the same week is showing
- if (viewMode == Mode.WEEK && oldFirstDayOfWeek != newFirstDayOfWeek) {
- calendar.setTime(calendarComponent.getStartDate());
- calendar.add(java.util.Calendar.DAY_OF_WEEK, 2);
- // starting at the beginning of the week
- calendar.set(GregorianCalendar.DAY_OF_WEEK, newFirstDayOfWeek);
- Date start = calendar.getTime();
-
- // ending at the end of the week
- calendar.add(GregorianCalendar.DATE, 6);
- Date end = calendar.getTime();
-
- calendarComponent.setStartDate(start);
- calendarComponent.setEndDate(end);
-
- // Week days depend on locale so this must be refreshed
- setWeekendsHidden(hideWeekendsButton.getValue());
- }
-
- }
-
- private void handleNextButtonClick() {
- switch (viewMode) {
- case MONTH:
- nextMonth();
- break;
- case WEEK:
- nextWeek();
- break;
- case DAY:
- nextDay();
- break;
- }
- }
-
- private void handlePreviousButtonClick() {
- switch (viewMode) {
- case MONTH:
- previousMonth();
- break;
- case WEEK:
- previousWeek();
- break;
- case DAY:
- previousDay();
- break;
- }
- }
-
- private void handleRangeSelect(RangeSelectEvent event) {
- Date start = event.getStart();
- Date end = event.getEnd();
-
- /*
- * If a range of dates is selected in monthly mode, we want it to end at
- * the end of the last day.
- */
- if (event.isMonthlyMode()) {
- end = getEndOfDay(calendar, end);
- }
-
- showEventPopup(createNewEvent(start, end), true);
- }
-
- private void showEventPopup(CalendarEvent event, boolean newEvent) {
- if (event == null) {
- return;
- }
-
- updateCalendarEventPopup(newEvent);
- updateCalendarEventForm(event);
- // TODO this only works the first time
- captionField.focus();
-
- if (!getUI().getWindows().contains(scheduleEventPopup)) {
- getUI().addWindow(scheduleEventPopup);
- }
-
- }
-
- /* Initializes a modal window to edit schedule event. */
- private void createCalendarEventPopup() {
- VerticalLayout layout = new VerticalLayout();
- // layout.setMargin(true);
- layout.setSpacing(true);
-
- scheduleEventPopup = new Window(null, layout);
- scheduleEventPopup.setWidth("300px");
- scheduleEventPopup.setModal(true);
- scheduleEventPopup.center();
-
- scheduleEventFieldLayout.addStyleName("light");
- scheduleEventFieldLayout.setMargin(false);
- layout.addComponent(scheduleEventFieldLayout);
-
- applyEventButton = new Button("Apply", new ClickListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- try {
- commitCalendarEvent();
- } catch (CommitException e) {
- e.printStackTrace();
- }
- }
- });
- applyEventButton.addStyleName("primary");
- Button cancel = new Button("Cancel", new ClickListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- discardCalendarEvent();
- }
- });
- deleteEventButton = new Button("Delete", new ClickListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void buttonClick(ClickEvent event) {
- deleteCalendarEvent();
- }
- });
- deleteEventButton.addStyleName("borderless");
- scheduleEventPopup.addCloseListener(new Window.CloseListener() {
-
- private static final long serialVersionUID = 1L;
-
- @Override
- public void windowClose(Window.CloseEvent e) {
- discardCalendarEvent();
- }
- });
-
- HorizontalLayout buttons = new HorizontalLayout();
- buttons.addStyleName("v-window-bottom-toolbar");
- buttons.setWidth("100%");
- buttons.setSpacing(true);
- buttons.addComponent(deleteEventButton);
- buttons.addComponent(applyEventButton);
- buttons.setExpandRatio(applyEventButton, 1);
- buttons.setComponentAlignment(applyEventButton, Alignment.TOP_RIGHT);
- buttons.addComponent(cancel);
- layout.addComponent(buttons);
-
- }
-
- private void updateCalendarEventPopup(boolean newEvent) {
- if (scheduleEventPopup == null) {
- createCalendarEventPopup();
- }
-
- if (newEvent) {
- scheduleEventPopup.setCaption("New event");
- } else {
- scheduleEventPopup.setCaption("Edit event");
- }
-
- deleteEventButton.setVisible(!newEvent);
- deleteEventButton.setEnabled(!calendarComponent.isReadOnly());
- applyEventButton.setEnabled(!calendarComponent.isReadOnly());
- }
-
- private void updateCalendarEventForm(CalendarEvent event) {
- BeanItem<CalendarEvent> item = new BeanItem<CalendarEvent>(event);
- scheduleEventFieldLayout.removeAllComponents();
- scheduleEventFieldGroup = new FieldGroup();
- initFormFields(scheduleEventFieldLayout, event.getClass());
- scheduleEventFieldGroup.setBuffered(true);
- scheduleEventFieldGroup.setItemDataSource(item);
- }
-
- private void setFormDateResolution(Resolution resolution) {
- if (startDateField != null && endDateField != null) {
- startDateField.setResolution(resolution);
- endDateField.setResolution(resolution);
- }
- }
-
- private CalendarEvent createNewEvent(Date startDate, Date endDate) {
- BasicEvent event = new BasicEvent();
- event.setCaption("");
- event.setStart(startDate);
- event.setEnd(endDate);
- event.setStyleName("color1");
- return event;
- }
-
- /* Removes the event from the data source and fires change event. */
- private void deleteCalendarEvent() {
- BasicEvent event = getFormCalendarEvent();
- if (dataSource.containsEvent(event)) {
- dataSource.removeEvent(event);
- }
- getUI().removeWindow(scheduleEventPopup);
- }
-
- /* Adds/updates the event in the data source and fires change event. */
- private void commitCalendarEvent() throws CommitException {
- scheduleEventFieldGroup.commit();
- BasicEvent event = getFormCalendarEvent();
- if (event.getEnd() == null) {
- event.setEnd(event.getStart());
- }
- if (!dataSource.containsEvent(event)) {
- dataSource.addEvent(event);
- }
-
- getUI().removeWindow(scheduleEventPopup);
- }
-
- private void discardCalendarEvent() {
- scheduleEventFieldGroup.discard();
- getUI().removeWindow(scheduleEventPopup);
- }
-
- @SuppressWarnings("unchecked")
- private BasicEvent getFormCalendarEvent() {
- BeanItem<CalendarEvent> item = (BeanItem<CalendarEvent>) scheduleEventFieldGroup
- .getItemDataSource();
- CalendarEvent event = item.getBean();
- return (BasicEvent) event;
- }
-
- private void nextMonth() {
- rollMonth(1);
- }
-
- private void previousMonth() {
- rollMonth(-1);
- }
-
- private void nextWeek() {
- rollWeek(1);
- }
-
- private void previousWeek() {
- rollWeek(-1);
- }
-
- private void nextDay() {
- rollDate(1);
- }
-
- private void previousDay() {
- rollDate(-1);
- }
-
- private void rollMonth(int direction) {
- calendar.setTime(currentMonthsFirstDate);
- calendar.add(GregorianCalendar.MONTH, direction);
- resetTime(false);
- currentMonthsFirstDate = calendar.getTime();
- calendarComponent.setStartDate(currentMonthsFirstDate);
-
- updateCaptionLabel();
-
- calendar.add(GregorianCalendar.MONTH, 1);
- calendar.add(GregorianCalendar.DATE, -1);
- resetCalendarTime(true);
- }
-
- private void rollWeek(int direction) {
- calendar.add(GregorianCalendar.WEEK_OF_YEAR, direction);
- calendar.set(GregorianCalendar.DAY_OF_WEEK,
- calendar.getFirstDayOfWeek());
- resetCalendarTime(false);
- resetTime(true);
- calendar.add(GregorianCalendar.DATE, 6);
- calendarComponent.setEndDate(calendar.getTime());
- }
-
- private void rollDate(int direction) {
- calendar.add(GregorianCalendar.DATE, direction);
- resetCalendarTime(false);
- resetCalendarTime(true);
- }
-
- private void updateCaptionLabel() {
- DateFormatSymbols s = new DateFormatSymbols(getLocale());
- String month = s.getShortMonths()[calendar.get(GregorianCalendar.MONTH)];
- captionLabel.setValue(month + " "
- + calendar.get(GregorianCalendar.YEAR));
- }
-
- private CalendarTestEvent getNewEvent(String caption, Date start, Date end) {
- CalendarTestEvent event = new CalendarTestEvent();
- event.setCaption(caption);
- event.setStart(start);
- event.setEnd(end);
-
- return event;
- }
-
- /*
- * Switch the view to week view.
- */
- public void switchToWeekView() {
- viewMode = Mode.WEEK;
- // weekButton.setVisible(false);
- // monthButton.setVisible(true);
- }
-
- /*
- * Switch the Calendar component's start and end date range to the target
- * month only. (sample range: 01.01.2010 00:00.000 - 31.01.2010 23:59.999)
- */
- public void switchToMonthView() {
- viewMode = Mode.MONTH;
- // monthButton.setVisible(false);
- // weekButton.setVisible(false);
-
- int rollAmount = calendar.get(GregorianCalendar.DAY_OF_MONTH) - 1;
- calendar.add(GregorianCalendar.DAY_OF_MONTH, -rollAmount);
-
- calendarComponent.setStartDate(calendar.getTime());
-
- updateCaptionLabel();
-
- calendar.add(GregorianCalendar.MONTH, 1);
- calendar.add(GregorianCalendar.DATE, -1);
-
- calendarComponent.setEndDate(calendar.getTime());
-
- calendar.setTime(getToday());
- // resetCalendarTime(true);
- }
-
- /*
- * Switch to day view (week view with a single day visible).
- */
- public void switchToDayView() {
- viewMode = Mode.DAY;
- // monthButton.setVisible(true);
- // weekButton.setVisible(true);
- }
-
- private void resetCalendarTime(boolean resetEndTime) {
- resetTime(resetEndTime);
- if (resetEndTime) {
- calendarComponent.setEndDate(calendar.getTime());
- } else {
- calendarComponent.setStartDate(calendar.getTime());
- updateCaptionLabel();
- }
- }
-
- /*
- * Resets the calendar time (hour, minute second and millisecond) either to
- * zero or maximum value.
- */
- private void resetTime(boolean max) {
- if (max) {
- calendar.set(GregorianCalendar.HOUR_OF_DAY,
- calendar.getMaximum(GregorianCalendar.HOUR_OF_DAY));
- calendar.set(GregorianCalendar.MINUTE,
- calendar.getMaximum(GregorianCalendar.MINUTE));
- calendar.set(GregorianCalendar.SECOND,
- calendar.getMaximum(GregorianCalendar.SECOND));
- calendar.set(GregorianCalendar.MILLISECOND,
- calendar.getMaximum(GregorianCalendar.MILLISECOND));
- } else {
- calendar.set(GregorianCalendar.HOUR_OF_DAY, 0);
- calendar.set(GregorianCalendar.MINUTE, 0);
- calendar.set(GregorianCalendar.SECOND, 0);
- calendar.set(GregorianCalendar.MILLISECOND, 0);
- }
- }
-
- private static Date getEndOfDay(java.util.Calendar calendar, Date date) {
- java.util.Calendar calendarClone = (java.util.Calendar) calendar
- .clone();
-
- calendarClone.setTime(date);
- calendarClone.set(java.util.Calendar.MILLISECOND,
- calendarClone.getActualMaximum(java.util.Calendar.MILLISECOND));
- calendarClone.set(java.util.Calendar.SECOND,
- calendarClone.getActualMaximum(java.util.Calendar.SECOND));
- calendarClone.set(java.util.Calendar.MINUTE,
- calendarClone.getActualMaximum(java.util.Calendar.MINUTE));
- calendarClone.set(java.util.Calendar.HOUR,
- calendarClone.getActualMaximum(java.util.Calendar.HOUR));
- calendarClone.set(java.util.Calendar.HOUR_OF_DAY,
- calendarClone.getActualMaximum(java.util.Calendar.HOUR_OF_DAY));
-
- return calendarClone.getTime();
- }
-
- private static Date getStartOfDay(java.util.Calendar calendar, Date date) {
- java.util.Calendar calendarClone = (java.util.Calendar) calendar
- .clone();
-
- calendarClone.setTime(date);
- calendarClone.set(java.util.Calendar.MILLISECOND, 0);
- calendarClone.set(java.util.Calendar.SECOND, 0);
- calendarClone.set(java.util.Calendar.MINUTE, 0);
- calendarClone.set(java.util.Calendar.HOUR, 0);
- calendarClone.set(java.util.Calendar.HOUR_OF_DAY, 0);
-
- return calendarClone.getTime();
- }
-
- @Override
- public void enter(ViewChangeEvent event) {
- // TODO Auto-generated method stub
-
- }
- }
|