package org.sigmah.client.ui.view.contact;
/*
* #%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.google.gwt.event.logical.shared.ResizeEvent;
import com.google.gwt.event.logical.shared.ResizeHandler;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.Image;
import com.extjs.gxt.ui.client.Style;
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.store.ListStore;
import com.extjs.gxt.ui.client.util.Padding;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.extjs.gxt.ui.client.widget.layout.VBoxLayout;
import java.util.Arrays;
import java.util.List;
import org.sigmah.client.i18n.I18N;
import org.sigmah.client.ui.presenter.contact.ContactHistoryPresenter;
import org.sigmah.client.ui.view.base.AbstractView;
import org.sigmah.client.ui.widget.layout.Layouts;
import org.sigmah.client.ui.widget.panel.Panels;
import org.sigmah.client.util.ImageProvider;
import org.sigmah.offline.sync.SuccessCallback;
import org.sigmah.shared.command.result.ContactHistory;
public class ContactHistoryView extends AbstractView implements ContactHistoryPresenter.View {
private static final int RESIZE_DELAY = 200;
private static final int PADDING = 10;
private LayoutContainer container;
private Grid<ContactHistory> contactHistoryGrid;
private ImageProvider imageProvider;
@Override
public void initialize() {
contactHistoryGrid = new Grid<ContactHistory>(new ListStore<ContactHistory>(), buildColumnModel());
contactHistoryGrid.getView().setForceFit(true);
contactHistoryGrid.setAutoHeight(true);
contactHistoryGrid.addListener(Events.ViewReady, new Listener<BaseEvent>() {
@Override
public void handleEvent(BaseEvent be) {
resizeGrid(contactHistoryGrid, container, true);
}
});
Window.addResizeHandler(new ResizeHandler() {
@Override
public void onResize(ResizeEvent event) {
resizeGrid(contactHistoryGrid, container, true);
}
});
container = Panels.content(null, false, Layouts.vBoxLayout(VBoxLayout.VBoxLayoutAlign.STRETCH, new Layouts.LayoutOptions(new Padding(10))), "x-border-layout-ct");
container.setScrollMode(Style.Scroll.AUTOY);
container.add(contactHistoryGrid);
add(container);
}
@Override
public void updateGridData(List<ContactHistory> contactHistories) {
contactHistoryGrid.getStore().removeAll();
contactHistoryGrid.getStore().add(contactHistories);
resizeGrid(contactHistoryGrid, container, true);
}
@Override
public void setImageProvider(ImageProvider imageProvider) {
this.imageProvider = imageProvider;
}
private ColumnModel buildColumnModel() {
ColumnConfig dateColumn = new ColumnConfig(ContactHistory.UPDATED_AT, 120);
dateColumn.setRenderer(new GridCellRenderer<ContactHistory>() {
@Override
public Object render(ContactHistory contactHistory, String property, ColumnData config, int rowIndex, int colIndex, ListStore store, Grid grid) {
return DateTimeFormat.getFormat(DateTimeFormat.PredefinedFormat.DATE_TIME_SHORT).format(contactHistory.getUpdatedAt());
}
});
dateColumn.setHeaderText(I18N.CONSTANTS.contactHistoryUpdatedAtHeader());
ColumnConfig userColumn = new ColumnConfig(ContactHistory.USER_FULL_NAME, I18N.CONSTANTS.contactHistoryUserHeader(), 150);
ColumnConfig changeTypeColumn = new ColumnConfig(ContactHistory.FORMATTED_CHANGE_TYPE, I18N.CONSTANTS.contactHistoryChangeTypeHeader(), 150);
ColumnConfig subjectColumn = new ColumnConfig(ContactHistory.SUBJECT, I18N.CONSTANTS.contactHistorySubjectHeader(), 150);
ColumnConfig valueColumn = new ColumnConfig(ContactHistory.FORMATTED_VALUE, 150);
valueColumn.setRenderer(new GridCellRenderer<ContactHistory>() {
@Override
public Object render(ContactHistory contactHistory, String property, ColumnData config, int rowIndex, int colIndex, ListStore<ContactHistory> store, Grid<ContactHistory> grid) {
if (contactHistory.getValueType() == ContactHistory.ValueType.STRING) {
return contactHistory.getFormattedValue();
}
final Image image = new Image();
image.setWidth("100px");
imageProvider.provideDataUrl(contactHistory.getFormattedValue(), new SuccessCallback<String>() {
@Override
public void onSuccess(String dataUrl) {
image.setUrl(dataUrl);
}
});
return image;
}
});
valueColumn.setHeaderText(I18N.CONSTANTS.contactHistoryValueHeader());
ColumnConfig commentColumn = new ColumnConfig(ContactHistory.COMMENT, I18N.CONSTANTS.contactHistoryCommentHeader(), 150);
return new ColumnModel(Arrays.asList(dateColumn, userColumn, changeTypeColumn, subjectColumn, valueColumn, commentColumn));
}
private void resizeGrid(final Grid grid, final LayoutContainer container, final boolean canBeDelayed) {
new Timer() {
@Override
public void run() {
if (!grid.isVisible()) {
if (canBeDelayed) {
this.schedule(RESIZE_DELAY);
}
return;
}
grid.setAutoHeight(false);
int height;
int maxHeight = container.getHeight() - PADDING * 2;
int unwrappedGridHeight = grid.getView().getScroller().firstChild().getHeight() + grid.getView().getHeader().getHeight();
if (unwrappedGridHeight < maxHeight) {
height = unwrappedGridHeight;
} else {
height = maxHeight;
}
grid.setHeight(height);
grid.getView().layout();
}
}.schedule(RESIZE_DELAY);
}
}