package org.sigmah.client.ui.view.project.treegrid;
/*
* #%L
* Sigmah
* %%
* Copyright (C) 2010 - 2016 URD
* %%
* 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/gpl-3.0.html>.
* #L%
*/
import java.util.Date;
import java.util.List;
import org.sigmah.client.i18n.I18N;
import org.sigmah.client.ui.notif.N10N;
import org.sigmah.shared.dto.ProjectDTO;
import com.extjs.gxt.ui.client.data.FilterConfig;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MenuEvent;
import com.extjs.gxt.ui.client.widget.grid.filters.Filter;
import com.extjs.gxt.ui.client.widget.menu.CheckMenuItem;
import com.extjs.gxt.ui.client.widget.menu.DateMenu;
import com.extjs.gxt.ui.client.widget.menu.Menu;
import com.google.gwt.user.datepicker.client.CalendarUtil;
/**
* Closed filter implementation.
*
* @author Denis Colliot (dcolliot@ideia.fr)
* @see com.extjs.gxt.ui.client.widget.grid.filters.Filter
*/
final class ClosedFilter extends Filter {
private static final String RADIOS_GROUP_NAME = "radios";
private final CheckMenuItem noneFilter;
private final CheckMenuItem sixMonthsFilter;
private final CheckMenuItem twelveMonthsFilter;
private final CheckMenuItem customFilter;
private final DateMenu dateMenu;
private CheckMenuItem currentItem;
/**
* Selection listener implementation.
*/
private final Listener<MenuEvent> handler = new Listener<MenuEvent>() {
@Override
public void handleEvent(final MenuEvent be) {
currentItem = (CheckMenuItem) be.getItem();
fireUpdate();
}
};
/**
* Menu listener implementation.
*/
private final Listener<MenuEvent> menuListener = new Listener<MenuEvent>() {
@Override
public void handleEvent(final MenuEvent be) {
if (be.getType() == Events.Select) {
onMenuSelect(be);
}
}
};
public ClosedFilter(String dataIndex) {
super(dataIndex);
menu = new Menu();
noneFilter = new CheckMenuItem(I18N.CONSTANTS.noneFilter());
noneFilter.setGroup(RADIOS_GROUP_NAME);
noneFilter.setChecked(true);
menu.add(noneFilter);
sixMonthsFilter = new CheckMenuItem(I18N.CONSTANTS.sixMonthsFilter());
sixMonthsFilter.setGroup(RADIOS_GROUP_NAME);
menu.add(sixMonthsFilter);
twelveMonthsFilter = new CheckMenuItem(I18N.CONSTANTS.twelveMonthsFilter());
twelveMonthsFilter.setGroup(RADIOS_GROUP_NAME);
menu.add(twelveMonthsFilter);
customFilter = new CheckMenuItem(I18N.CONSTANTS.customFilter());
customFilter.setGroup(RADIOS_GROUP_NAME);
menu.add(customFilter);
dateMenu = new DateMenu();
dateMenu.setDate(new Date());
dateMenu.addListener(Events.Select, menuListener);
customFilter.setSubMenu(dateMenu);
customFilter.addListener(Events.Select, handler);
sixMonthsFilter.addListener(Events.Select, handler);
twelveMonthsFilter.addListener(Events.Select, handler);
noneFilter.addListener(Events.Select, handler);
currentItem = noneFilter;
}
/**
* Method called on menu selection event.
*
* @param be
* The menu event.
*/
protected void onMenuSelect(final MenuEvent be) {
if (currentItem != null) {
currentItem.setChecked(false, true);
} else {
N10N.warn("Null", "current item null");
}
currentItem = customFilter;
customFilter.setChecked(true, true);
if (be.getMenu() == dateMenu) {
final DateMenu dateMenu = (DateMenu) be.getMenu();
dateMenu.hide(true);
fireUpdate();
}
}
/**
* {@inheritDoc}
*/
@Override
public List<FilterConfig> getSerialArgs() {
// No need for implementation.
return null;
}
/**
* {@inheritDoc}
*/
@Override
public Object getValue() {
// No need for implementation.
return null;
}
/**
* {@inheritDoc}
*/
@Override
public void setValue(Object value) {
// No need for implementation.
}
/**
* {@inheritDoc}
*/
@Override
public boolean isActivatable() {
return true;
}
/**
* {@inheritDoc}
*/
@Override
public boolean validateModel(final ModelData model) {
final Date closeDate = model.get(ProjectDTO.CLOSE_DATE);
if (closeDate == null) {
return true;
}
if (currentItem == customFilter) {
return !closeDate.before(dateMenu.getDate());
}
if (currentItem == sixMonthsFilter) {
final Date dateTemp = new Date();
CalendarUtil.addMonthsToDate(dateTemp, -6);
return !closeDate.before(dateTemp);
}
if (currentItem == noneFilter) {
return false;
}
if (currentItem == twelveMonthsFilter) {
final Date dateTemp = new Date();
CalendarUtil.addMonthsToDate(dateTemp, -12);
return !closeDate.before(dateTemp);
}
return false;
}
}