/*******************************************************************************
* Copyright (c) 2012 Dmitry Tikhomirov.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Public License v3.0
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/gpl.html
*
* Contributors:
* Dmitry Tikhomirov - initial API and implementation
******************************************************************************/
package org.opensheet.client.widges.admin.windows;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.opensheet.client.services.HolidayService;
import org.opensheet.client.services.HolidayServiceAsync;
import com.extjs.gxt.ui.client.data.BaseListLoader;
import com.extjs.gxt.ui.client.data.BaseModel;
import com.extjs.gxt.ui.client.data.BaseModelData;
import com.extjs.gxt.ui.client.data.ListLoadResult;
import com.extjs.gxt.ui.client.data.ListLoader;
import com.extjs.gxt.ui.client.data.RpcProxy;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.Window;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.grid.CellEditor;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.EditorGrid;
import com.extjs.gxt.ui.client.widget.grid.EditorGrid.ClicksToEdit;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.rpc.AsyncCallback;
public class HolidayPanel extends Window{
private HolidayServiceAsync holidayService = GWT.create(HolidayService.class);
private ListStore<BaseModelData> store = new ListStore<BaseModelData>();
private EditorGrid<BaseModelData> grid;
private Date date;
private Button thisMonthButton;
@SuppressWarnings({ "deprecation"})
public HolidayPanel(){
date = new Date();
setHeadingHtml("Set Holiday");
setWidth("140");
setHeight("220");
setResizable(false);
ToolBar toolBar = new ToolBar();
toolBar.setWidth(180);
thisMonthButton = new Button();
thisMonthButton.setWidth(90);
thisMonthButton.setText((date.getMonth()+1) + " " + (date.getYear()+1900));
thisMonthButton.addListener(Events.Select, new Listener<BaseEvent>(){
@Override public void handleEvent(BaseEvent be) {
date = new Date();
thisMonthButton.setText((date.getMonth()+1) + " " + (date.getYear()+1900));
loadHoliday();
}
});
Button privMonthButton = new Button();
privMonthButton.setWidth(30);
privMonthButton.setIconStyle("privMonthButton");
privMonthButton.addListener(Events.Select, new Listener<BaseEvent>(){
@Override public void handleEvent(BaseEvent be) {
date.setMonth(date.getMonth()-1);
thisMonthButton.setText((date.getMonth()+1) + " " + (date.getYear()+1900));
loadHoliday();
}
});
Button nextMonthButton = new Button();
nextMonthButton.setWidth(30);
nextMonthButton.setIconStyle("nextMonthButton");
nextMonthButton.addListener(Events.Select, new Listener<BaseEvent>(){
@Override public void handleEvent(BaseEvent be) {
date.setMonth(date.getMonth()+1);
thisMonthButton.setText((date.getMonth()+1) + " " + (date.getYear()+1900));
loadHoliday();
}
});
toolBar.add(privMonthButton);
toolBar.add(thisMonthButton);
toolBar.add(nextMonthButton);
add(toolBar);
RpcProxy<List<BaseModelData>> proxy = new RpcProxy<List<BaseModelData>>() {
@Override
protected void load(Object loadConfig, AsyncCallback<List<BaseModelData>> callback) {
holidayService.getHolidays(date, callback);
}
};
ListLoader<?> loader = new BaseListLoader<ListLoadResult<BaseModel>>(proxy);
store = new ListStore<BaseModelData>(loader);
store.setMonitorChanges(true);
store.getLoader().load();
List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
ColumnConfig day1ColumnConfig = new ColumnConfig();
day1ColumnConfig.setDataIndex("day_1");
day1ColumnConfig.setHeaderHtml("1");
day1ColumnConfig.setWidth(25);
day1ColumnConfig.setId("day1ColumnConfigId");
day1ColumnConfig.setMenuDisabled(true);
day1ColumnConfig.setSortable(false);
day1ColumnConfig.setEditor(new CellEditor(new NumberField()));
day1ColumnConfig.setRenderer(new GridCellRenderer<BaseModelData>() {
@Override public Object render(BaseModelData model, String property,
ColumnData config, int rowIndex, int colIndex,
ListStore<BaseModelData> store, Grid<BaseModelData> grid) {
config.css = "";
if(!model.get("day_1").equals(0)){
if(model.get("status_1").equals(true))
config.css = "x-treegrid-column-holiday";
return model.get("day_1");
}
return "<span> </span>";
}
});
columns.add(day1ColumnConfig);
ColumnConfig day2ColumnConfig = new ColumnConfig();
day2ColumnConfig.setDataIndex("day_2");
day2ColumnConfig.setId("day2ColumnConfigId");
day2ColumnConfig.setHeaderHtml("2");
day2ColumnConfig.setWidth(25);
day2ColumnConfig.setMenuDisabled(true);
day2ColumnConfig.setSortable(false);
day2ColumnConfig.setEditor(new CellEditor(new NumberField()));
day2ColumnConfig.setRenderer(new GridCellRenderer<BaseModelData>() {
@Override public Object render(BaseModelData model, String property,
ColumnData config, int rowIndex, int colIndex,
ListStore<BaseModelData> store, Grid<BaseModelData> grid) {
config.css = "";
if(!model.get("day_2").equals(0)){
if(model.get("status_2").equals(true))
config.css = "x-treegrid-column-holiday";
return model.get("day_2");
}
return "<span> </span>";
}
});
columns.add(day2ColumnConfig);
ColumnConfig day3ColumnConfig = new ColumnConfig();
day3ColumnConfig.setDataIndex("day_3");
day3ColumnConfig.setId("day3ColumnConfigId");
day3ColumnConfig.setHeaderHtml("3");
day3ColumnConfig.setWidth(25);
day3ColumnConfig.setMenuDisabled(true);
day3ColumnConfig.setSortable(false);
day3ColumnConfig.setEditor(new CellEditor(new NumberField()));
day3ColumnConfig.setRenderer(new GridCellRenderer<BaseModelData>() {
@Override public Object render(BaseModelData model, String property,
ColumnData config, int rowIndex, int colIndex,
ListStore<BaseModelData> store, Grid<BaseModelData> grid) {
config.css = "";
if(!model.get("day_3").equals(0)){
if(model.get("status_3").equals(true))
config.css = "x-treegrid-column-holiday";
return model.get("day_3");
}
return "<span> </span>";
}
});
columns.add(day3ColumnConfig);
ColumnConfig day4ColumnConfig = new ColumnConfig();
day4ColumnConfig.setDataIndex("day_4");
day4ColumnConfig.setId("day4ColumnConfigId");
day4ColumnConfig.setHeaderHtml("4");
day4ColumnConfig.setWidth(25);
day4ColumnConfig.setMenuDisabled(true);
day4ColumnConfig.setSortable(false);
day4ColumnConfig.setEditor(new CellEditor(new NumberField()));
day4ColumnConfig.setRenderer(new GridCellRenderer<BaseModelData>() {
@Override public Object render(BaseModelData model, String property,
ColumnData config, int rowIndex, int colIndex,
ListStore<BaseModelData> store, Grid<BaseModelData> grid) {
config.css = "";
if(!model.get("day_4").equals(0)){
if(model.get("status_4").equals(true))
config.css = "x-treegrid-column-holiday";
return model.get("day_4");
}
return "<span> </span>";
}
});
columns.add(day4ColumnConfig);
ColumnConfig day5ColumnConfig = new ColumnConfig();
day5ColumnConfig.setDataIndex("day_5");
day5ColumnConfig.setHeaderHtml("5");
day5ColumnConfig.setId("day5ColumnConfigId");
day5ColumnConfig.setWidth(25);
day5ColumnConfig.setMenuDisabled(true);
day5ColumnConfig.setSortable(false);
day5ColumnConfig.setEditor(new CellEditor(new NumberField()));
day5ColumnConfig.setRenderer(new GridCellRenderer<BaseModelData>() {
@Override public Object render(BaseModelData model, String property,
ColumnData config, int rowIndex, int colIndex,
ListStore<BaseModelData> store, Grid<BaseModelData> grid) {
config.css = "";
if(!model.get("day_5").equals(0)){
if(model.get("status_5").equals(true))
config.css = "x-treegrid-column-holiday";
return model.get("day_5");
}
return "<span> </span>";
}
});
columns.add(day5ColumnConfig);
ColumnConfig day6ColumnConfig = new ColumnConfig();
day6ColumnConfig.setDataIndex("day_6");
day6ColumnConfig.setHeaderHtml("6");
day6ColumnConfig.setId("day6ColumnConfigId");
day6ColumnConfig.setWidth(25);
day6ColumnConfig.setMenuDisabled(true);
day6ColumnConfig.setSortable(false);
day6ColumnConfig.setEditor(new CellEditor(new NumberField()));
day6ColumnConfig.setRenderer(new GridCellRenderer<BaseModelData>() {
@Override public Object render(BaseModelData model, String property,
ColumnData config, int rowIndex, int colIndex,
ListStore<BaseModelData> store, Grid<BaseModelData> grid) {
config.css = "";
if(!model.get("day_6").equals(0)){
if(model.get("status_6").equals(true))
config.css = "x-treegrid-column-holiday";
return model.get("day_6");
}
return "<span> </span>";
}
});
columns.add(day6ColumnConfig);
ColumnConfig day7ColumnConfig = new ColumnConfig();
day7ColumnConfig.setDataIndex("day_7");
day7ColumnConfig.setHeaderHtml("7");
day7ColumnConfig.setId("day7ColumnConfigId");
day7ColumnConfig.setWidth(25);
day7ColumnConfig.setMenuDisabled(true);
day7ColumnConfig.setSortable(false);
day7ColumnConfig.setEditor(new CellEditor(new NumberField()));
day7ColumnConfig.setRenderer(new GridCellRenderer<BaseModelData>() {
@Override public Object render(BaseModelData model, String property,
ColumnData config, int rowIndex, int colIndex,
ListStore<BaseModelData> store, Grid<BaseModelData> grid) {
config.css = "";
if(!model.get("day_7").equals(0)){
if(model.get("status_7").equals(true))
config.css = "x-treegrid-column-holiday";
return model.get("day_7");
}
return "<span> </span>";
}
});
columns.add(day7ColumnConfig);
ColumnModel cm = new ColumnModel(columns);
grid = new EditorGrid<BaseModelData>(store, cm);
grid.setLoadMask(true);
grid.setWidth(180);
grid.setHeight(160);
// grid.setAutoExpandColumn("day1ColumnConfigId");
grid.setBorders(true);
grid.setColumnLines(true);
grid.addStyleName(".my-table-style");
grid.setBorders(true);
grid.setClicksToEdit(ClicksToEdit.ONE);
grid.getView().setEmptyText("no data");
grid.setId("myHolidayId");
grid.addListener(Events.BeforeEdit,new Listener<GridEvent<BaseModelData>>(){
@Override public void handleEvent(GridEvent<BaseModelData> be) {
be.setCancelled(true);
if(!be.getValue().equals(0)){
Boolean status;
Date day = new Date();
day.setYear(date.getYear());
day.setMonth(date.getMonth());
day.setDate((Integer) be.getValue());
Integer column = (Integer) be.getColIndex();
column++;
if(be.getRecord().get("status_"+column).equals(true)){
status = false;
}else{
status = true;
}
holidayService.setAndUpdateHolidays(day, status, new AsyncCallback<List<BaseModelData>>(){
@Override public void onFailure(Throwable caught) { }
@Override public void onSuccess(List<BaseModelData> result) {
grid.getStore().getLoader().load();
}
});
}
}
});
add(grid);
show();
}
private void loadHoliday(){
holidayService.getHolidays(date, new AsyncCallback<List<BaseModelData>>(){
@Override public void onFailure(Throwable caught) { }
@Override public void onSuccess(List<BaseModelData> result) {
grid.getStore().getLoader().load();
}
});
}
}