/*
* 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 com.allen_sauer.gwt.log.client.Log;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.HasHorizontalAlignment.HorizontalAlignmentConstant;
/**
* Picker that includes a LongRangePicker for easier picking of dates in
* the past.
*
* @author Jeff Dwyer
*
*/
public class HDatePicker extends SimpleDatePicker implements
DatePickerInterface {
private static final int WIDTH = 530;
private LongRangePicker longRangePicker;
private HorizontalAlignmentConstant align;
public HDatePicker(HorizontalAlignmentConstant constant) {
super();
this.align = constant;
}
protected void init() {
this.setWidth(80 + "px");
this.setStyleName("txtbox");
addClickListener(this);
addKeyboardListener(this);
longRangePicker = new LongRangePicker(this);
}
protected void addCalendar(DatePicker datePicker) {
vertPanel.setHorizontalAlignment(VerticalPanel.ALIGN_CENTER);
vertPanel.add(calendarTraversalPanel);
vertPanel.add(calendarPanel);
vertPanel.add(todayPanel);
vertPanel.add(longRangePicker);
// calendarPopup.addStyleName("date_DisplayPanel");
vertPanel.setStyleName("date_DisplayPanel");
calendarPopup.add(vertPanel);
}
// @Override
public void redrawCalendar() {
// Log.debug("H Date Picker redraw "+getSelectedDate());
this.calendarPanel.redrawCalendar();
this.calendarTraversalPanel.drawTitle();
longRangePicker.redraw(getCurrentDate());
}
// @Override
protected void showCalendar() {
calendarPopup.show();
if (align == HorizontalPanel.ALIGN_RIGHT) {
// getAbsoluteLeft() is broken in FF for things in our
// gadgetDisplayer
// seems to be a known problem, but no good fix. Even FireBug
// says that the
// left position is 450px, which is totally wrong.
//
// found native method below on forum, but it returns the same
// thing
//
// int left = this.getAbsoluteLeft() - WIDTH;
int left = Window.getClientWidth() - WIDTH;
// make sure it doesn't go too low
int top = this.getAbsoluteTop() + this.getOffsetHeight() + 4;
top = (Window.getClientHeight() - top > 400) ? top : Window
.getClientHeight() - 400;
calendarPopup.setPopupPosition(left, top);
Log
.debug("SHOW RIGHT "
+ (this.getAbsoluteLeft() - WIDTH)
+ " "
+ (this.getAbsoluteTop()
+ this.getOffsetHeight() + 4));
// Logger.log("SHOW RIGHT "+getAbsoluteLeft(getElement())+"
// FIX "+getAbsoluteLeftFix(getElement()));
calendarPopup.setHeight(120 + "px");
calendarPopup.setWidth(165 + "px");
calendarPopup.setStyleName("date_popupPanel");
} else {
calendarPopup.setPopupPosition(this.getAbsoluteLeft(), this
.getAbsoluteTop()
+ this.getOffsetHeight() + 4);
calendarPopup.setHeight(120 + "px");
calendarPopup.setWidth(165 + "px");
calendarPopup.setStyleName("date_popupPanel");
}
}
// public native int getAbsoluteLeft(Element elem) /*-{
// var left = 0;
// while (elem) {
// left += elem.offsetLeft - elem.scrollLeft;
// elem = elem.offsetParent;
// }
// return left + $doc.body.scrollLeft;
// }-*/;
// public native int getAbsoluteLeftFix(Element elem) /*-{
// var left = 0, parent;
// while (elem) {
// left += elem.offsetLeft - elem.scrollLeft;
// parent =
// @com.google.gwt.user.client.DOM::getParent(Lcom/google/gwt/user/client/Element;)(elem);
// elem = elem.offsetParent;
// while (parent != elem) {
// left -= parent.scrollLeft;
// parent =
// @com.google.gwt.user.client.DOM::getParent(Lcom/google/gwt/user/client/Element;)(parent);
// }
// }
// return left + $doc.body.scrollLeft;
// }-*/;
public Widget getWidget() {
return this;
}
}