package org.activityinfo.ui.client.page.config;
/*
* #%L
* ActivityInfo Server
* %%
* Copyright (C) 2009 - 2013 UNICEF
* %%
* 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 com.extjs.gxt.ui.client.Style;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.data.ModelIconProvider;
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.store.Store;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.*;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.treegrid.EditorTreeGrid;
import com.extjs.gxt.ui.client.widget.treegrid.TreeGridCellRenderer;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
import com.google.inject.Inject;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.client.Dispatcher;
import org.activityinfo.legacy.shared.model.IsActivityDTO;
import org.activityinfo.legacy.shared.model.TargetValueDTO;
import org.activityinfo.legacy.shared.model.UserDatabaseDTO;
import org.activityinfo.ui.client.page.common.grid.AbstractEditorTreeGridView;
import org.activityinfo.ui.client.page.common.grid.ImprovedCellTreeGridSelectionModel;
import org.activityinfo.ui.client.page.common.nav.Link;
import org.activityinfo.ui.client.style.legacy.icon.IconImageBundle;
import java.util.ArrayList;
import java.util.List;
/**
* @author Muhammad Abid
*/
public class TargetIndicatorView extends AbstractEditorTreeGridView<ModelData, TargetIndicatorPresenter> implements
TargetIndicatorPresenter.View {
private final Dispatcher service;
private EditorTreeGrid<ModelData> tree;
private TargetIndicatorPresenter presenter;
private UserDatabaseDTO db;
@Inject
public TargetIndicatorView(Dispatcher service) {
this.service = service;
}
@Override
public void init(TargetIndicatorPresenter presenter, UserDatabaseDTO db, TreeStore store) {
this.db = db;
this.presenter = presenter;
super.init(presenter, store);
setBorders(false);
setHeaderVisible(false);
setFrame(false);
setLayout(new FitLayout());
}
@Override
protected Grid<ModelData> createGridAndAddToContainer(Store store) {
final TreeStore treeStore = (TreeStore) store;
tree = new EditorTreeGrid<ModelData>(treeStore, createColumnModel());
tree.setAutoExpandColumn("name");
tree.setSelectionModel(new ImprovedCellTreeGridSelectionModel<ModelData>());
tree.setClicksToEdit(EditorGrid.ClicksToEdit.ONE);
tree.setLoadMask(true);
tree.setStateId("TargetValueGrid" + db.getId());
tree.setIconProvider(new ModelIconProvider<ModelData>() {
@Override
public AbstractImagePrototype getIcon(ModelData model) {
if (model instanceof IsActivityDTO) {
return IconImageBundle.ICONS.activity();
} else if (model instanceof TargetValueDTO) {
return IconImageBundle.ICONS.indicator();
} else if (model instanceof Link) {
return IconImageBundle.ICONS.folder();
} else {
return null;
}
}
});
addBeforeEditListener();
addAfterEditListener();
add(tree, new BorderLayoutData(Style.LayoutRegion.CENTER));
return tree;
}
private void addBeforeEditListener() {
tree.addListener(Events.BeforeEdit, new Listener<GridEvent>() {
@Override
public void handleEvent(GridEvent be) {
if (!(be.getModel() instanceof TargetValueDTO)) {
be.setCancelled(true);
}
}
});
}
private void addAfterEditListener() {
tree.addListener(Events.AfterEdit, new Listener<GridEvent>() {
@Override
public void handleEvent(GridEvent be) {
if (be.getModel() instanceof TargetValueDTO) {
if (be.getRecord().getChanges().size() > 0) {
presenter.updateTargetValue();
}
}
}
});
}
@Override
public void expandAll() {
tree.expandAll();
}
@Override
protected void initToolBar() {
}
private ColumnModel createColumnModel() {
List<ColumnConfig> columns = new ArrayList<ColumnConfig>();
ColumnConfig nameColumn = new ColumnConfig("name", I18N.CONSTANTS.indicator(), 250);
nameColumn.setRenderer(new TreeGridCellRenderer());
columns.add(nameColumn);
TextField<String> valueField = new TextField<String>();
valueField.setAllowBlank(true);
ColumnConfig valueColumn = new ColumnConfig("value", I18N.CONSTANTS.targetValue(), 150);
valueColumn.setEditor(new CellEditor(valueField));
valueColumn.setRenderer(new TargetValueCellRenderer());
columns.add(valueColumn);
return new ColumnModel(columns);
}
private class TargetValueCellRenderer implements GridCellRenderer<ModelData> {
public TargetValueCellRenderer() {
}
@Override
public Object render(ModelData model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore store,
Grid grid) {
if (model instanceof TargetValueDTO && model.get("value") == null) {
config.style = "color:gray;font-style:italic;";
return I18N.CONSTANTS.noTarget();
} else if (model.get("value") != null) {
return model.get("value");
}
return "";
}
}
}