/ftr-gwt-library-date/src/main/java/eu/future/earth/gwt/client/date/MultiView.java
http://ftr-gwt-library.googlecode.com/ · Java · 501 lines · 384 code · 95 blank · 22 comment · 71 complexity · d99e6e4f77c2b637c85fa759737688b7 MD5 · raw file
- /*
- * Copyright 2007 Future Earth, info@future-earth.eu
- *
- * 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 eu.future.earth.gwt.client.date;
- import java.util.ArrayList;
- import java.util.Date;
- import java.util.List;
- import org.cobogw.gwt.user.client.CSS;
- import org.cobogw.gwt.user.client.ui.Button;
- import com.google.gwt.event.dom.client.ClickEvent;
- import com.google.gwt.event.dom.client.ClickHandler;
- import com.google.gwt.event.shared.HandlerRegistration;
- import com.google.gwt.user.client.ui.HTML;
- import com.google.gwt.user.client.ui.HasHorizontalAlignment;
- import com.google.gwt.user.client.ui.HorizontalPanel;
- import com.google.gwt.user.client.ui.Image;
- import com.google.gwt.user.client.ui.Label;
- import com.google.gwt.user.client.ui.SimplePanel;
- import com.google.gwt.user.client.ui.ToggleButton;
- import com.google.gwt.user.client.ui.VerticalPanel;
- import com.google.gwt.user.client.ui.Widget;
- import eu.future.earth.gwt.client.FtrGwtDateCss;
- import eu.future.earth.gwt.client.date.list.EventListPanel;
- import eu.future.earth.gwt.client.date.month.MonthPanel;
- import eu.future.earth.gwt.client.date.week.WeekPanel;
- import eu.future.earth.gwt.client.date.weeklist.WeekListPanel;
- public class MultiView<T> extends VerticalPanel implements ClickHandler, DateEventListener<T>, HasDateEventHandlers<T> {
- private HorizontalPanel viewType = new HorizontalPanel();
- private PanelType type = null;
- private ToggleButton day = new ToggleButton(FtrGwtResources.TEXTS.day());
- private WeekPanel<T> dayPanel = null;
- private ToggleButton week = new ToggleButton(FtrGwtResources.TEXTS.week());
- private WeekPanel<T> weekPanel = null;
- private ToggleButton month = new ToggleButton(FtrGwtResources.TEXTS.month());
- private MonthPanel<T> monthPanel = null;
- private EventListPanel<T> listPanel = null;
- private ToggleButton list = new ToggleButton(FtrGwtResources.TEXTS.list());
- private WeekListPanel<T> weekListPanel = null;
- private ToggleButton weekList = new ToggleButton(FtrGwtResources.TEXTS.weekList());
- // private RoundedPanel body = new RoundedPanel(RoundedPanel.ALL, 3);
- private SimplePanel body = new SimplePanel();
- private DatePanel<T> currentView = null;
- private HorizontalPanel topPanel = new HorizontalPanel();
- private HorizontalPanel navi = new HorizontalPanel();
- private List<ToggleButton> tabLabels = new ArrayList<ToggleButton>();
- private Image prev = new Image(FtrGwtResources.IMAGES.btn_prev());
- private Image next = new Image(FtrGwtResources.IMAGES.btn_next());
- private Image prevMore = new Image(FtrGwtResources.IMAGES.btn_prev_2());
- private Image nextMore = new Image(FtrGwtResources.IMAGES.btn_next_2());
- private Button today = new Button(FtrGwtResources.TEXTS.today());
- private Label dayInfo = new Label();
- private Date centerDate = new Date();
- // private EventController<T> controller = null;
- private DateRenderer<T> renderer = null;
- public MultiView(DateRenderer<T> newRenderer) {
- this(newRenderer, PanelType.WEEK);
- }
- public MultiView(DateRenderer<T> newRenderer, PanelType defaultType) {
- this(newRenderer, defaultType, false, true);
- }
- public HandlerRegistration addDateEventHandler(DateEventListener<? extends T> handler) {
- return addHandler(handler, DateEvent.getType());
- }
- public void setNaviVisible(boolean newState) {
- navi.setVisible(newState);
- }
- public MultiView(DateRenderer<T> newRenderer, PanelType defaultType, boolean alignNaviCenter, boolean displayTodayButton) {
- super();
- renderer = newRenderer;
- topPanel.setSpacing(0);
- today.addClickHandler(this);
- // topPanel.setP
- super.setSpacing(0);
- super.setStyleName(FtrGwtDateCss.TAB_SELECTED_BODY);
- topPanel.setStyleName(FtrGwtDateCss.TAB_SELECTED_BODY);
- topPanel.setBorderWidth(0);
- if (alignNaviCenter) {
- topPanel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
- }
- this.setStyleName(FtrGwtDateCss.TAB_SELECTED_BODY);
- today.setSize(90);
- next.addClickHandler(this);
- CSS.setProperty(next, CSS.A.CURSOR, CSS.V.CURSOR.POINTER);
- prev.addClickHandler(this);
- CSS.setProperty(prev, CSS.A.CURSOR, CSS.V.CURSOR.POINTER);
- nextMore.addClickHandler(this);
- CSS.setProperty(nextMore, CSS.A.CURSOR, CSS.V.CURSOR.POINTER);
- prevMore.addClickHandler(this);
- CSS.setProperty(prevMore, CSS.A.CURSOR, CSS.V.CURSOR.POINTER);
- // topPanel.setPixelSize();
- if (alignNaviCenter) {
- navi.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER);
- }
- navi.setVerticalAlignment(ALIGN_MIDDLE);
- navi.setSpacing(0);
- if (renderer.useShowMore()) {
- navi.add(prevMore);
- navi.setCellVerticalAlignment(prevMore, ALIGN_MIDDLE);
- navi.add(new HTML(" "));
- }
- navi.add(prev);
- navi.setCellVerticalAlignment(prev, ALIGN_MIDDLE);
- navi.add(new HTML(" "));
- navi.add(dayInfo);
- navi.setCellVerticalAlignment(dayInfo, ALIGN_MIDDLE);
- navi.add(new HTML(" "));
- navi.add(next);
- navi.setCellVerticalAlignment(next, ALIGN_MIDDLE);
- navi.add(new HTML(" "));
- if (renderer.useShowMore()) {
- navi.add(nextMore);
- navi.setCellVerticalAlignment(nextMore, ALIGN_MIDDLE);
- navi.add(new HTML(" "));
- }
- if (displayTodayButton) {
- navi.add(today);
- navi.setCellVerticalAlignment(today, ALIGN_MIDDLE);
- navi.add(new HTML(" "));
- }
- topPanel.add(navi);
- super.setSpacing(0);
- // super.setS
- topPanel.add(viewType);
- topPanel.setCellVerticalAlignment(viewType, HorizontalPanel.ALIGN_BOTTOM);
- topPanel.setWidth("100%");
- topPanel.setCellHorizontalAlignment(viewType, HorizontalPanel.ALIGN_RIGHT);
- super.add(topPanel);
- super.setCellHeight(topPanel, "15px");
- viewType.setBorderWidth(0);
- viewType.setStyleName(FtrGwtDateCss.TAB_SELECTED_BODY);
- // viewType.set
- viewType.setSpacing(0);
- int tabCount = 0;
- if (renderer.supportDayView()) {
- tabCount++;
- }
- if (renderer.supportWeekView()) {
- tabCount++;
- }
- if (renderer.supportMonthView()) {
- tabCount++;
- }
- if (renderer.supportListView()) {
- tabCount++;
- }
- if (renderer.supportWeekListView()) {
- tabCount++;
- }
- if (tabCount > 1) {
- if (renderer.supportDayView()) {
- addTab(day);
- }
- if (renderer.supportWeekView()) {
- addTab(week);
- }
- if (renderer.supportMonthView()) {
- addTab(month);
- }
- if (renderer.supportListView()) {
- addTab(list);
- }
- if (renderer.supportWeekListView()) {
- addTab(weekList);
- }
- viewType.add(new HTML(" "));
- viewType.add(new HTML(" "));
- }
- super.add(body);
- super.setCellVerticalAlignment(body, VerticalPanel.ALIGN_TOP);
- super.add(spa);
- spa.setHeight("10px");
- setType(defaultType);
- }
- private HTML spa = new HTML(" ");
- public DateRenderer<T> getRenderer() {
- return renderer;
- }
- protected void onAttach() {
- super.onAttach();
- scrollToHour(renderer.getScrollHour());
- }
- public void addWidgetToNivigationBar(Widget newWidget) {
- navi.add(newWidget);
- navi.setCellVerticalAlignment(newWidget, ALIGN_MIDDLE);
- navi.add(new HTML(" "));
- }
- private void addTab(ToggleButton button) {
- tabLabels.add(button);
- button.addClickHandler(this);
- viewType.add(button);
- }
- private int height = 300;
- private int witdh = 400;
- public void setPixelSize(int newWidth, int newHeight) {
- super.setPixelSize(newWidth, newHeight);
- height = newHeight;
- witdh = newWidth;
- if (currentView != null) {
- currentView.setPixelSize(witdh, height - topPanel.getOffsetHeight() - spa.getOffsetHeight());
- }
- }
- public int getHeight() {
- return height;
- }
- public void rebuildPanel() {
- if (weekPanel != null) {
- weekPanel.buildPanel();
- }
- if (dayPanel != null) {
- dayPanel.buildPanel();
- }
- }
- public void scrollToHour(int hour) {
- DatePanel<T> current = getCurrent();
- if (current instanceof WeekPanel<?>) {
- WeekPanel<T> real = (WeekPanel<T>) current;
- real.scrollToHour(hour);
- }
- }
- private void showCurrent(DatePanel<T> newShows) {
- if (currentView != null) {
- Widget real = (Widget) currentView;
- body.remove(real);
- }
- Widget newReal = (Widget) newShows;
- currentView = newShows;
- body.setWidget(newReal);
- newReal.setWidth("100%");
- setPixelSize(witdh, height);
- setDate(centerDate);
- }
- public void setSelected(ToggleButton button) {
- for (int i = 0; i < tabLabels.size(); i++) {
- final ToggleButton wi = tabLabels.get(i);
- if (wi == button) {
- wi.setDown(true);
- } else {
- wi.setDown(false);
- }
- }
- }
- public void setType(PanelType newType) {
- if (!newType.equals(type)) {
- type = newType;
- switch (type) {
- case MONTH: {
- if (monthPanel == null) {
- monthPanel = new MonthPanel<T>(renderer);
- monthPanel.addDateEventHandler(this);
- }
- showCurrent(monthPanel);
- setSelected(month);
- break;
- }
- case WEEK: {
- if (weekPanel == null) {
- weekPanel = new WeekPanel<T>(DateUtils.countDays(renderer), renderer);
- weekPanel.addDateEventHandler(this);
- }
- showCurrent(weekPanel);
- setSelected(week);
- break;
- }
- case DAY: {
- if (dayPanel == null) {
- dayPanel = new WeekPanel<T>(1, renderer);
- dayPanel.addDateEventHandler(this);
- }
- showCurrent(dayPanel);
- setSelected(day);
- break;
- }
- case LIST: {
- if (listPanel == null) {
- listPanel = new EventListPanel<T>(renderer);
- listPanel.addDateEventHandler(this);
- }
- showCurrent(listPanel);
- setSelected(list);
- break;
- }
- case WEEK_LIST: {
- if (weekListPanel == null) {
- weekListPanel = new WeekListPanel<T>(renderer);
- weekListPanel.addDateEventHandler(this);
- }
- showCurrent(weekListPanel);
- setSelected(weekList);
- break;
- }
- }
- scrollToHour(renderer.getScrollHour());
- }
- }
- public void setDate(Date newCenterDate) {
- setDate(newCenterDate, true);
- }
- public void setDate(Date newCenterDate, boolean setDatapanelDate) {
- setDate(newCenterDate, setDatapanelDate, true);
- }
- // add a reloadData argument so that the controller can handle if it uses cached data or make a RPC call.
- public void setDate(Date newCenterDate, boolean setDatapanelDate, boolean reloadData) {
- centerDate = newCenterDate;
- if (setDatapanelDate) {
- currentView.setDate(centerDate);
- }
- currentView.loadData();
- dayInfo.setText(renderer.getTitleDisplayText(currentView));
- }
- public void clearData() {
- currentView.clearData();
- }
- public void setEvents(T[] events) {
- currentView.clearData();
- addEvents(events);
- }
- public void addEvents(T[] events) {
- if (events != null) {
- for (int i = 0; i < events.length; i++) {
- currentView.addEventData(events[i]);
- }
- }
- }
- public void setEventsByList(List<? extends T> events) {
- currentView.clearData();
- addEventsList(events);
- }
- public void addEventsList(List<? extends T> events) {
- if (events != null) {
- currentView.addEventsByList(events);
- }
- }
- public void setEventsByArrayList(List<T> events) {
- currentView.clearData();
- currentView.addEventsByList(events);
- }
- public void reloadData() {
- setDate(centerDate, true, true);
- }
- public void repaintData() {
- setDate(centerDate, true, false);
- }
- public DatePanel<T> getCurrent() {
- return currentView;
- }
- public void handleDateEvent(DateEvent<T> newEvent) {
- switch (newEvent.getCommand()) {
- case GO_TO_DAY_VIEW:
- if (renderer.supportDayView()) {
- setType(PanelType.DAY);
- } else {
- if (renderer.supportWeekView()) {
- setType(PanelType.WEEK);
- }
- }
- break;
- default:
- break;
- }
- DateEvent.fire(this, newEvent);
- }
- public void onClick(ClickEvent event) {
- if (event.getSource() == day) {
- setType(PanelType.DAY);
- }
- if (event.getSource() == week) {
- setType(PanelType.WEEK);
- }
- if (event.getSource() == month) {
- setType(PanelType.MONTH);
- }
- if (event.getSource() == list) {
- setType(PanelType.LIST);
- }
- if (event.getSource() == weekList) {
- setType(PanelType.WEEK_LIST);
- }
- if (event.getSource() == prev) {
- setDate(currentView.prev(), false);
- }
- if (event.getSource() == next) {
- setDate(currentView.next(), false);
- }
- if (event.getSource() == prevMore) {
- setDate(currentView.prevMore(), false);
- }
- if (event.getSource() == nextMore) {
- setDate(currentView.nextMore(), false);
- }
- if (event.getSource() == today) {
- setDate(new Date());
- }
- }
- }