/*
* Copyright (C) 2000-2012 InfoChamp System Corporation
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.gk.ui.client.com.form;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.gk.ui.client.com.i18n.Msg;
import org.gk.ui.client.com.utils.DateTimeUtils;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.EventType;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.form.AdapterField;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.layout.TableLayout;
public class gkDateRangeField extends AdapterField {
private Label label = new Label();
private gkDateField dateFrom;
private gkDateField dateTo;
private gkTimeField timeFrom;
private gkTimeField timeTo;
public enum DateRangeType {
DATES("dates"), DATETIMES("datesTimes"), DATESTIMES("datesTimes");
private String value;
private DateRangeType(String value) {
this.value = value;
}
public String value() {
return value;
}
}
// 這邊是生成只有日期起迄的
public gkDateRangeField(String fieldLabel, String beginDateKey,
String endDateKey, boolean isSeparate) {
this(fieldLabel, beginDateKey, endDateKey, "", isSeparate);
}
// 這邊也是只有日期起迄的,但是可以設定日期的格式
public gkDateRangeField(String fieldLabel, String beginDateKey,
String endDateKey, String dateFormat, boolean isSeparate) {
super(null);
LayoutContainer lc = new LayoutContainer();
setFieldLabel(fieldLabel);
dateFrom = new gkDateField();
dateFrom.setFormat(dateFormat);
dateTo = new gkDateField();
dateTo.setFormat(dateFormat);
dateFrom.setId(beginDateKey);
dateTo.setId(endDateKey);
TableLayout tl;
label.setText(Msg.get.to());
label.setWidth("50%");
if (isSeparate) {
tl = new TableLayout(2);
} else {
tl = new TableLayout(3);
}
lc.setLayout(tl);
lc.add(dateFrom);
lc.add(label);
lc.add(dateTo);
widget = lc;
setLabelSeparator("");
componentListen();
setRequires();
}
// 這邊是有2日期+2時間起迄的
public gkDateRangeField(String fieldLabel, String beginDateKey,
String beginTimeKey, String endDateKey, String endTimeKey,
boolean isSeparate) {
this(fieldLabel, beginDateKey, beginTimeKey, endDateKey, endTimeKey,
"", isSeparate);
}
// 這邊是有2日期+2時間起迄的,而且還可以設定日期的格式
public gkDateRangeField(String fieldLabel, String beginDateKey,
String beginTimeKey, String endDateKey, String endTimeKey,
String dateFormat, boolean isSeparate) {
super(null);
LayoutContainer lc = new LayoutContainer();
setFieldLabel(fieldLabel);
dateFrom = new gkDateField();
dateFrom.setFormat(dateFormat);
dateTo = new gkDateField();
dateTo.setFormat(dateFormat);
timeFrom = new gkTimeField();
timeTo = new gkTimeField();
dateFrom.setId(beginDateKey);
dateTo.setId(endDateKey);
timeFrom.setId(beginTimeKey);
timeTo.setId(endTimeKey);
TableLayout tl;
label.setText(Msg.get.to());
label.setWidth("50%");
if (isSeparate) {
tl = new TableLayout(3);
} else {
tl = new TableLayout(5);
}
lc.setLayout(tl);
lc.add(dateFrom);
lc.add(timeFrom);
lc.add(label);
lc.add(dateTo);
lc.add(timeTo);
widget = lc;
setLabelSeparator("");
componentListen();
setRequires();
}
// 這邊是有1日期+2時間起迄的
public gkDateRangeField(String fieldLabel, String beginDateKey,
String beginTimeKey, String endTimeKey) {
this(fieldLabel, beginDateKey, beginTimeKey, endTimeKey, "");
}
// 這邊是有1日期+2時間起迄的,且可設定日期格式
public gkDateRangeField(String fieldLabel, String beginDateKey,
String beginTimeKey, String endTimeKey, String dateFormat) {
super(null);
LayoutContainer lc = new LayoutContainer();
setFieldLabel(fieldLabel);
dateFrom = new gkDateField();
dateFrom.setFormat(dateFormat);
timeFrom = new gkTimeField();
timeTo = new gkTimeField();
dateFrom.setId(beginDateKey);
timeFrom.setId(beginTimeKey);
timeTo.setId(endTimeKey);
TableLayout tl = new TableLayout(4);
label.setText(Msg.get.to());
label.setWidth("50%");
lc.setLayout(tl);
lc.add(dateFrom);
lc.add(timeFrom);
lc.add(label);
lc.add(timeTo);
widget = lc;
setLabelSeparator("");
componentListen();
setRequires();
}
@Override
protected boolean validateValue(String value) {
boolean rtn = true;
// 當兩個的 rawValue都不是空值的時候再檢查
if ((!"".equals(dateFrom.getRawValue()))
&& (!"".equals(dateTo.getRawValue()))) {
// 日期的時候就錯了
String value1 = DateTimeUtils.getValue(dateFrom);
String value2 = DateTimeUtils.getValue(dateTo);
if (value1.compareTo(value2) > 0) {
dateTo.markInvalid(Msg.get.dateError());
rtn = false;
}
// 這邊表示是同一天,那就要檢查時間有沒有錯
else if (value1.compareTo(value2) == 0) {
if ((!"".equals(timeFrom.getRawValue()))
&& (!"".equals(timeTo.getRawValue()))) {
if (timeFrom.getTimeValue()
.compareTo(timeTo.getTimeValue()) > 0) {
timeTo.markInvalid(Msg.get.timeError());
rtn = false;
}
}
}
}
return rtn;
}
// 檢查後面的時間是不是大於前面的
private void checkTime() {
if (timeTo == null) {
return;
}
if (dateTo != null) {
if (dateTo.getRawValue().equals(dateFrom.getRawValue())) {
if (timeFrom.getTimeValue().compareTo(timeTo.getTimeValue()) > 0) {
timeTo.markInvalid(Msg.get.timeError());
}
}
} else {
if (timeFrom.getTimeValue().compareTo(timeTo.getTimeValue()) > 0) {
timeTo.markInvalid(Msg.get.timeError());
}
}
}
// 判斷開始日期與結束日期在同一日,若是開始時間23:00,
// 時間區間為30,則結束時間可選擇23:00、23:30,若不在同一日則無限制
private void setTimeTo() {
if ((timeFrom == null) || ("".equals(timeFrom.getRawValue()))) {
return;
}
if (timeTo == null) {
return;
}
List l = timeFrom.getStore().getModels();
String nowTime = timeFrom.getValue().get("timeValue");
timeTo.getStore().removeAll();
if (dateTo == null
|| dateFrom.getRawValue().equals(dateTo.getRawValue())) {
for (int i = 0; i < l.size(); i++) {
ModelData data = (ModelData) l.get(i);
String setTime = data.get("timeValue");
if (setTime.compareTo(nowTime) >= 0) {
timeTo.getStore().add(data);
}
}
} else {
timeTo.getStore().add(l);
}
}
// 就…專為了兩個日期+兩個時間判斷的驗證
private void isValidate() {
// 當兩個的 rawValue都不是空值的時候再檢查
// if((!"".equals(dateFrom.getRawValue()))&&(!"".equals(dateTo.getRawValue()))){
boolean chkNull = dateFrom != null && dateTo != null;
boolean chkBlank = false;
// 要判断是否为null,否则在只有dateFrom 或 dateTo的时候就会抛出NullPointException
if (chkNull) {
chkBlank = !"".equals(dateFrom.getRawValue())
&& !"".equals(dateTo.getRawValue());
}
if (chkNull && chkBlank) {
// 日期的時候就錯了
String value1 = DateTimeUtils.getValue(dateFrom);
String value2 = DateTimeUtils.getValue(dateTo);
if (value1.compareTo(value2) > 0) {
dateTo.markInvalid(Msg.get.dateError());
}
// 這邊表示是同一天,那就要檢查時間有沒有錯
else if (value1.compareTo(value2) == 0) {
checkTime();
}
}
}
// 所有的監聽事件都寫在這
private void componentListen() {
if (dateFrom != null) {
dateFrom.addListener(Events.OnBlur, new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
isValidate();
setTimeTo();
}
});
}
if (dateTo != null) {
dateTo.addListener(Events.OnBlur, new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
isValidate();
setTimeTo();
}
});
}
if (timeFrom != null) {
timeFrom.addListener(Events.OnBlur, new Listener() {
@Override
public void handleEvent(BaseEvent be) {
checkTime();
setTimeTo();
}
});
}
if (timeTo != null) {
timeTo.addListener(Events.OnBlur, new Listener() {
@Override
public void handleEvent(BaseEvent be) {
checkTime();
}
});
}
}
// 日期預設為本日時間
public void initDate() {
Date date = new Date();
if (dateFrom != null) {
dateFrom.setValue(date);
}
if (dateTo != null) {
dateTo.setValue(date);
}
}
public void setShowInnerLabel(boolean visible) {
label.setVisible(visible);
}
public void setDefaultDateRange(String beginDate, String endDate) {
if (dateFrom != null) {
DateTimeUtils.setValue(dateFrom, beginDate);
}
if (dateTo != null) {
DateTimeUtils.setValue(dateTo, endDate);
}
}
/**
* return 兩日期用","隔開
*/
public String getDefaultDateRange() {
return (dateFrom != null && dateTo != null) ? DateTimeUtils
.getValue(dateFrom) + "," + DateTimeUtils.getValue(dateTo) : "";
}
public void setDefaultBeginDate(String beginDate) {
if (dateFrom != null) {
DateTimeUtils.setValue(dateFrom, beginDate);
}
}
public String getDefaultBeginDate() {
return dateFrom != null ? DateTimeUtils.getValue(dateFrom) : "";
}
public void setDefaultEndDate(String endDate) {
if (dateTo != null) {
DateTimeUtils.setValue(dateTo, endDate);
}
}
public String getDefaultEndDate() {
return dateTo != null ? DateTimeUtils.getValue(dateTo) : "";
}
public void setDefaultTimeRange(String beginTime, String endTime) {
if ((timeFrom != null) && (timeTo != null)) {
timeFrom.setTimeValue(beginTime);
timeTo.setTimeValue(endTime);
}
}
/**
* return 兩時間用","隔開
*/
public String getDefaultTimeRange() {
return (timeFrom != null && timeTo != null) ? timeFrom.getTimeValue()
+ "," + timeTo.getTimeValue() : "";
}
public void setDefaultBeginTime(String beginTime) {
if (timeFrom != null) {
timeFrom.setTimeValue(beginTime);
}
}
public String getDefaultBeginTime() {
return timeFrom != null ? timeFrom.getTimeValue() : "";
}
public void setDefaultEndTime(String endTime) {
if (timeTo != null) {
timeTo.setTimeValue(endTime);
}
}
public String getDefaultEndTime() {
return timeTo != null ? timeTo.getTimeValue() : "";
}
public void setTimeIncrement15() {
if ((timeFrom != null) && (timeTo != null)) {
timeFrom.set15MinPeriod();
timeTo.set15MinPeriod();
}
}
public void setDateFieldSize(int width, int height) {
if (dateFrom != null) {
dateFrom.setSize(width, height);
}
if (dateTo != null) {
dateTo.setSize(width, height);
}
}
public void setDateFieldWidth(String width) {
if (dateFrom != null) {
dateFrom.setWidth(width);
}
if (dateTo != null) {
dateTo.setWidth(width);
}
}
public void setTimeFieldWidth(String width) {
if (timeFrom != null) {
timeFrom.setWidth(width);
}
if (timeTo != null) {
timeTo.setWidth(width);
}
}
public void setInnerLabel(String labelText) {
this.label.setText(labelText);
}
@Override
public void setReadOnly(boolean readOnly) {
super.setReadOnly(readOnly);
if (dateFrom != null) {
dateFrom.setReadOnly(readOnly);
}
if (dateTo != null) {
dateTo.setReadOnly(readOnly);
}
if (timeFrom != null) {
timeFrom.setReadOnly(readOnly);
}
if (timeTo != null) {
timeTo.setReadOnly(readOnly);
}
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);
if (widget instanceof LayoutContainer) {
LayoutContainer lc = (LayoutContainer) widget;
for (Iterator<Component> it = lc.iterator(); it.hasNext();) {
it.next().setEnabled(enabled);
}
}
}
@Override
public void setVisible(boolean visible) {
super.setVisible(visible);
if (widget instanceof LayoutContainer) {
LayoutContainer lc = (LayoutContainer) widget;
for (Iterator<Component> it = lc.iterator(); it.hasNext();) {
it.next().setVisible(visible);
}
}
}
private void setRequires() {
if (getFieldLabel() != null && getFieldLabel().length() > 0
&& getFieldLabel().endsWith("*")) {
String fieldLabel = getFieldLabel().substring(0,
getFieldLabel().length() - 1);
setFieldLabel(fieldLabel);
if (dateFrom != null) {
dateFrom.setFieldLabel("*");
}
if (dateTo != null) {
dateTo.setAllowBlank(false);
}
if (timeFrom != null) {
timeFrom.setAllowBlank(false);
}
if (timeTo != null) {
timeTo.setAllowBlank(false);
}
}
}
public void setEditable(boolean editable) {
if (dateFrom != null) {
dateFrom.setEditable(editable);
}
if (dateTo != null) {
dateTo.setEditable(editable);
}
if (timeFrom != null) {
timeFrom.setEditable(editable);
}
if (timeTo != null) {
timeTo.setEditable(editable);
}
}
@Override
public boolean fireEvent(EventType type) {
boolean result = super.fireEvent(type);
LayoutContainer lc = (LayoutContainer) widget;
for (Component com : lc.getItems()) {
result &= com.fireEvent(type);
}
return result;
}
@Override
public void clear() {
super.clear();
LayoutContainer lc = (LayoutContainer) widget;
for (Component com : lc.getItems()) {
if (com instanceof Field) {
((Field) com).clear();
}
}
}
@Override
public void reset() {
super.reset();
LayoutContainer lc = (LayoutContainer) widget;
for (Component com : lc.getItems()) {
if (com instanceof Field) {
((Field) com).reset();
}
}
}
}