package org.activityinfo.ui.client.component.report.editor.map;
/*
* #%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.event.BaseEvent;
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.ContentPanel;
import com.extjs.gxt.ui.client.widget.layout.AbsoluteData;
import com.extjs.gxt.ui.client.widget.layout.AbsoluteLayout;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.user.client.Element;
import com.google.inject.Inject;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.client.AsyncMonitor;
import org.activityinfo.legacy.client.Dispatcher;
import org.activityinfo.legacy.client.monitor.MaskingAsyncMonitor;
import org.activityinfo.legacy.shared.command.RenderElement.Format;
import org.activityinfo.legacy.shared.reports.model.MapReportElement;
import org.activityinfo.legacy.shared.reports.model.layers.MapLayer;
import org.activityinfo.ui.client.EventBus;
import org.activityinfo.ui.client.component.report.editor.map.layerOptions.LayerOptionsPanel;
import org.activityinfo.ui.client.page.report.ReportEventBus;
import org.activityinfo.ui.client.page.report.editor.ReportElementEditor;
import java.util.Arrays;
import java.util.List;
public class MapEditor extends ContentPanel implements ReportElementEditor<MapReportElement> {
private static final int CONTROL_TOP_MARGIN = 10;
private static final int ZOOM_CONTROL_LEFT_MARGIN = 10;
private final Dispatcher dispatcher;
private final ReportEventBus reportEventBus;
private final EventBus eventBus;
// Contained widgets
private MapEditorMapView mapPanel;
private LayersWidget layersWidget;
private LayerOptionsPanel optionsPanel;
private MapReportElement mapReportElement = new MapReportElement();
private AbsoluteLayout layout;
@Inject
public MapEditor(Dispatcher dispatcher, EventBus eventBus) {
this.dispatcher = dispatcher;
this.eventBus = eventBus;
this.reportEventBus = new ReportEventBus(eventBus, this);
MapResources.INSTANCE.style().ensureInjected();
initializeComponent();
createMap();
createLayersOptionsPanel();
createLayersWidget();
}
protected void initializeComponent() {
setHeaderVisible(false);
layout = new AbsoluteLayout();
setLayout(layout);
}
protected void createLayersOptionsPanel() {
optionsPanel = new LayerOptionsPanel(dispatcher);
optionsPanel.setVisible(false);
optionsPanel.addListener(Events.Hide, new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
mapPanel.setZoomControlOffsetX(ZOOM_CONTROL_LEFT_MARGIN);
}
});
optionsPanel.addListener(Events.Show, new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
mapPanel.setZoomControlOffsetX(LayerOptionsPanel.WIDTH + ZOOM_CONTROL_LEFT_MARGIN);
}
});
optionsPanel.addValueChangeHandler(new ValueChangeHandler<MapLayer>() {
@Override
public void onValueChange(ValueChangeEvent<MapLayer> event) {
reportEventBus.fireChange();
}
});
add(optionsPanel, new AbsoluteData(0, CONTROL_TOP_MARGIN));
}
protected void createLayersWidget() {
layersWidget = new LayersWidget(dispatcher, eventBus, optionsPanel);
// positioning is actually only set when setSize() is called below
add(layersWidget, new AbsoluteData());
}
protected void createMap() {
mapPanel = new MapEditorMapView(dispatcher, eventBus);
mapPanel.setHeadingText(I18N.CONSTANTS.preview());
mapPanel.setZoomControlOffsetX(ZOOM_CONTROL_LEFT_MARGIN);
AbsoluteData layout = new AbsoluteData();
layout.setLeft(0);
layout.setTop(0);
layout.setAnchorSpec("100% 100%");
add(mapPanel, layout);
}
public AsyncMonitor getMapLoadingMonitor() {
return new MaskingAsyncMonitor(mapPanel, I18N.CONSTANTS.loading());
}
@Override
protected void onRender(Element parent, int pos) {
super.onRender(parent, pos);
}
@Override
public void setSize(int width, int height) {
// right align side bar
layout.setPosition(layersWidget, width - LayersWidget.WIDTH, CONTROL_TOP_MARGIN);
super.setSize(width, height);
}
@Override
public void bind(MapReportElement model) {
this.mapReportElement = model;
layersWidget.bind(model);
mapPanel.bind(model);
}
@Override
public void disconnect() {
reportEventBus.disconnect();
layersWidget.disconnect();
mapPanel.disconnect();
}
@Override
public MapReportElement getModel() {
return mapReportElement;
}
@Override
public Component getWidget() {
return this;
}
@Override
public List<Format> getExportFormats() {
return Arrays.asList(Format.PowerPoint, Format.Word, Format.PDF, Format.PNG);
}
}