package org.activityinfo.ui.client.page.report.editor; /* * #%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.Scroll; import com.extjs.gxt.ui.client.event.Listener; import com.extjs.gxt.ui.client.event.MessageBoxEvent; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.Dialog; import com.extjs.gxt.ui.client.widget.LayoutContainer; import com.extjs.gxt.ui.client.widget.MessageBox; import com.google.inject.Inject; import com.google.inject.Provider; import org.activityinfo.i18n.shared.I18N; import org.activityinfo.legacy.shared.command.RenderElement.Format; import org.activityinfo.legacy.shared.reports.model.Report; import org.activityinfo.legacy.shared.reports.model.ReportElement; import org.activityinfo.ui.client.EventBus; import org.activityinfo.ui.client.page.report.ReportEventBus; import org.activityinfo.ui.client.page.report.editor.AddElementPanel.AddCallback; import org.activityinfo.ui.client.page.report.resources.ReportResources; import java.util.Arrays; import java.util.List; public class CompositeEditor2 extends LayoutContainer implements ReportElementEditor<Report>, AddCallback, ElementWidget.EventHandler { private final Provider<ElementWidget> elementWidgetProvider; private Report model; private LayoutContainer page; private AddElementPanel addPanel; private ReportEventBus reportEventBus; @Inject public CompositeEditor2(EventBus eventBus, AddElementPanel addPanel, Provider<ElementWidget> elementWidgetProvider) { this.elementWidgetProvider = elementWidgetProvider; page = new LayoutContainer(); page.addStyleName(ReportResources.INSTANCE.style().page()); add(page); this.addPanel = addPanel; this.addPanel.setCallback(this); page.add(addPanel); ReportResources.INSTANCE.style().ensureInjected(); setLayout(new CompositeEditorLayout()); setScrollMode(Scroll.AUTOY); setMonitorWindowResize(true); this.reportEventBus = new ReportEventBus(eventBus, this); } @Override protected void onWindowResize(int width, int height) { layout(true); } @Override public void bind(Report model) { this.model = model; for (Component child : page.getItems()) { if (child != addPanel) { page.remove(child); } } for (ReportElement element : model.getElements()) { addElementWidget(element); } page.layout(); } private void addElementWidget(ReportElement element) { ElementWidget widget = elementWidgetProvider.get(); widget.bindHandler(this); widget.bind(element); page.insert(widget, page.getItemCount() - 1); } @Override public Report getModel() { return this.model; } @Override public Component getWidget() { return this; } @Override public List<Format> getExportFormats() { return Arrays.asList(Format.Word, Format.PDF); } @Override public void onAdd(ReportElement element) { model.addElement(element); addElementWidget(element); page.layout(); } @Override public void disconnect() { } @Override public void onElementRemoveClicked(final ElementWidget widget) { MessageBox.confirm(I18N.CONSTANTS.deleteElementTitle(), I18N.CONSTANTS.deleteElementMessage(), new Listener<MessageBoxEvent>() { @Override public void handleEvent(MessageBoxEvent event) { if (event.getButtonClicked().getItemId().equals(Dialog.YES)) { model.getElements().remove(widget.getModel()); page.remove(widget); page.layout(); reportEventBus.fireChange(); } } }); } @Override public void onElementChanged(ElementWidget widget) { reportEventBus.fireChange(); } }