package org.sigmah.client.ui.view.project.indicator;
/*
* #%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 com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.FieldEvent;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.Field;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.toolbar.LabelToolItem;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.dom.client.Style;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import java.util.ArrayList;
import java.util.List;
import org.sigmah.client.i18n.I18N;
import org.sigmah.client.ui.presenter.project.indicator.EditSitePresenter;
import org.sigmah.client.ui.res.icon.IconImageBundle;
import org.sigmah.client.ui.view.base.AbstractPopupView;
import org.sigmah.client.ui.widget.button.Button;
import org.sigmah.client.ui.widget.form.CoordinateField;
import org.sigmah.client.ui.widget.form.FormPanel;
import org.sigmah.client.ui.widget.form.Forms;
import org.sigmah.client.ui.widget.map.Pin;
import org.sigmah.client.ui.widget.map.WorldMap;
import org.sigmah.client.ui.widget.map.WorldMapFactory;
import org.sigmah.client.ui.widget.panel.Panels;
import org.sigmah.client.ui.widget.popup.PopupWidget;
import org.sigmah.shared.dto.AdminEntityDTO;
import org.sigmah.shared.dto.AdminLevelDTO;
import org.sigmah.shared.dto.BoundingBoxDTO;
import org.sigmah.shared.dto.SiteDTO;
import org.sigmah.shared.dto.country.CountryDTO;
/**
* Site edition popup.
*
* @author sherzod (v1.3)
*/
public class EditSiteView extends AbstractPopupView<PopupWidget> implements EditSitePresenter.View {
private FormPanel form;
private FieldSet locationFieldSet;
private ContentPanel mapPanel;
private Field<String> locationNameField;
private Field<String> locationAxeField;
private WorldMap worldMap;
private Pin pin;
private Field<Double> latitudeField;
private Field<Double> longitudeField;
private ComboBox<AdminEntityDTO> topLevelComboBox;
private List<ComboBox<AdminEntityDTO>> adminLevelBoxes;
private Button saveButton;
private Button cancelButton;
public EditSiteView() {
super(new PopupWidget(true), 800);
}
@Override
public void initialize() {
form = Forms.panel(130);
// Location name field.
locationNameField = Forms.text(I18N.CONSTANTS.location(), true);
locationNameField.setName(SiteDTO.LOCATION_NAME);
// Location axe field.
locationAxeField = Forms.text(I18N.CONSTANTS.axeFieldLabel(), false);
locationAxeField.setName(SiteDTO.LOCATION_AXE);
// Admin levels.
adminLevelBoxes = new ArrayList<ComboBox<AdminEntityDTO>>();
// Map.
mapPanel = Panels.content(null, new FitLayout());
latitudeField = new CoordinateField(CoordinateField.Axis.LATITUDE);
longitudeField = new CoordinateField(CoordinateField.Axis.LONGITUDE);
worldMap = WorldMapFactory.createInstance();
worldMap.setSize("100%", "300px");
pin = new Pin(true);
worldMap.addPin(pin);
final ToolBar coordinateBar = new ToolBar();
coordinateBar.add(new LabelToolItem(I18N.CONSTANTS.lat()));
coordinateBar.add(latitudeField);
coordinateBar.add(new LabelToolItem(I18N.CONSTANTS.lng()));
coordinateBar.add(longitudeField);
mapPanel.add(worldMap.asWidget());
mapPanel.setBottomComponent(coordinateBar);
// Save button.
saveButton = Forms.button(I18N.CONSTANTS.save(), IconImageBundle.ICONS.save());
// Cancel button.
cancelButton = Forms.button(I18N.CONSTANTS.cancel(), IconImageBundle.ICONS.cancel());
// Building form
form.add(locationNameField, Forms.data());
form.add(locationAxeField, Forms.data());
final Grid mainContainer = new Grid(2, 2);
mainContainer.setWidth("100%");
mainContainer.getElement().getStyle().setTableLayout(Style.TableLayout.FIXED);
mainContainer.getColumnFormatter().getElement(0).getStyle().setProperty("width", "50%");
mainContainer.getColumnFormatter().getElement(1).getStyle().setProperty("width", "50%");
mainContainer.getRowFormatter().setVerticalAlign(1, HasVerticalAlignment.ALIGN_TOP);
mainContainer.setWidget(0, 0, Forms.label(I18N.CONSTANTS.locationTitle()));
mainContainer.setWidget(0, 1, Forms.label(I18N.CONSTANTS.geoPosition()));
mainContainer.setWidget(1, 0, form);
mainContainer.setWidget(1, 1, mapPanel);
getPopup().addButton(cancelButton);
getPopup().addButton(saveButton);
initPopup(mainContainer);
}
@Override
public void setCountry(CountryDTO country, Listener<FieldEvent> selectionListener) {
topLevelComboBox = null;
for(final ComboBox<?> box : adminLevelBoxes) {
box.removeAllListeners();
form.remove(box);
}
adminLevelBoxes.clear();
if(country != null) {
ComboBox<AdminEntityDTO> parentComboBox = null;
int row = 2;
for(final AdminLevelDTO level : country.getAdminLevels()) {
final ComboBox<AdminEntityDTO> comboBox = Forms.combobox(level.getName(), false, AdminEntityDTO.ID, AdminEntityDTO.NAME);
comboBox.setName(AdminEntityDTO.getPropertyName(level.getId()));
comboBox.setEnabled(false);
comboBox.setTriggerAction(ComboBox.TriggerAction.ALL);
comboBox.setData("level", level);
if(parentComboBox != null) {
comboBox.setData("parent", parentComboBox);
parentComboBox.setData("child", comboBox);
} else {
topLevelComboBox = comboBox;
}
comboBox.addListener(Events.Select, selectionListener);
comboBox.addListener(Events.KeyUp, selectionListener);
parentComboBox = comboBox;
adminLevelBoxes.add(comboBox);
form.insert(comboBox, row++, Forms.data());
}
form.layout();
}
}
@Override
public FormPanel getForm() {
return form;
}
@Override
public ComboBox<AdminEntityDTO> getTopLevelComboBox() {
return topLevelComboBox;
}
@Override
public FieldSet getLocationFieldSet() {
return locationFieldSet;
}
@Override
public Field<Double> getLatitudeField() {
return latitudeField;
}
@Override
public Field<Double> getLongitudeField() {
return longitudeField;
}
@Override
public Pin getPin() {
return pin;
}
@Override
public Button getSaveButton() {
return saveButton;
}
@Override
public Button getCancelButton() {
return cancelButton;
}
@Override
public BoundingBoxDTO getMapBounds() {
return worldMap.getBounds();
}
@Override
public void setMapBounds(final BoundingBoxDTO bounds) {
worldMap.setBounds(bounds);
}
@Override
public void panTo(double latitude, double longitude) {
worldMap.panTo(latitude, longitude);
}
@Override
public void setPinPosition(double latitude, double longitude) {
pin.setPosition(latitude, longitude);
}
}