/*
* Copyright 2013 Anton Tananaev (anton.tananaev@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.traccar.web.client.view;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import org.traccar.web.client.ApplicationContext;
import org.traccar.web.client.model.BaseStoreHandlers;
import org.traccar.web.client.model.DeviceProperties;
import org.traccar.web.client.model.PositionProperties;
import org.traccar.web.shared.model.Device;
import org.traccar.web.shared.model.Position;
import com.google.gwt.cell.client.DateCell;
import com.google.gwt.core.client.GWT;
import com.google.gwt.uibinder.client.UiBinder;
import com.google.gwt.uibinder.client.UiField;
import com.google.gwt.uibinder.client.UiHandler;
import com.google.gwt.user.client.ui.Widget;
import com.sencha.gxt.cell.core.client.NumberCell;
import com.sencha.gxt.core.client.Style.SelectionMode;
import com.sencha.gxt.data.shared.ListStore;
import com.sencha.gxt.data.shared.event.StoreHandlers;
import com.sencha.gxt.widget.core.client.ContentPanel;
import com.sencha.gxt.widget.core.client.event.SelectEvent;
import com.sencha.gxt.widget.core.client.form.ComboBox;
import com.sencha.gxt.widget.core.client.form.DateField;
import com.sencha.gxt.widget.core.client.form.TimeField;
import com.sencha.gxt.widget.core.client.grid.ColumnConfig;
import com.sencha.gxt.widget.core.client.grid.ColumnModel;
import com.sencha.gxt.widget.core.client.grid.Grid;
import com.sencha.gxt.widget.core.client.selection.SelectionChangedEvent;
public class ArchiveView implements SelectionChangedEvent.SelectionChangedHandler<Position> {
private static ArchiveViewUiBinder uiBinder = GWT.create(ArchiveViewUiBinder.class);
interface ArchiveViewUiBinder extends UiBinder<Widget, ArchiveView> {
}
public interface ArchiveHandler {
public void onSelected(Position position);
public void onLoad(Device device, Date from, Date to);
public void onClear();
}
private ArchiveHandler archiveHandler;
@UiField
ContentPanel contentPanel;
public ContentPanel getView() {
return contentPanel;
}
ListStore<Device> deviceStore;
@UiField
DateField fromDate;
@UiField
TimeField fromTime;
@UiField
DateField toDate;
@UiField
TimeField toTime;
@UiField(provided = true)
ComboBox<Device> deviceCombo;
@UiField(provided = true)
ColumnModel<Position> columnModel;
@UiField(provided = true)
ListStore<Position> positionStore;
@UiField
Grid<Position> grid;
public ArchiveView(ArchiveHandler archiveHandler, ListStore<Position> positionStore, ListStore<Device> deviceStore) {
this.archiveHandler = archiveHandler;
this.positionStore = positionStore;
deviceStore.addStoreHandlers(deviceStoreHandlers);
this.deviceStore = deviceStore;
DeviceProperties deviceProperties = GWT.create(DeviceProperties.class);
deviceCombo = new ComboBox<Device>(deviceStore, deviceProperties.label());
PositionProperties positionProperties = GWT.create(PositionProperties.class);
List<ColumnConfig<Position, ?>> columnConfigList = new LinkedList<ColumnConfig<Position, ?>>();
columnConfigList.add(new ColumnConfig<Position, Boolean>(positionProperties.valid(), 0, "Valid"));
ColumnConfig<Position, Date> columnConfigDate = new ColumnConfig<Position, Date>(positionProperties.time(), 0, "Time");
columnConfigDate.setCell(new DateCell(ApplicationContext.getInstance().getFormatterUtil().getTimeFormat()));
columnConfigList.add(columnConfigDate);
columnConfigList.add(new ColumnConfig<Position, Double>(positionProperties.latitude(), 0, "Latitude"));
columnConfigList.add(new ColumnConfig<Position, Double>(positionProperties.longitude(), 0, "Longitude"));
columnConfigList.add(new ColumnConfig<Position, Double>(positionProperties.altitude(), 0, "Altitude"));
ColumnConfig<Position, Double> columnConfigDouble = new ColumnConfig<Position, Double>(positionProperties.speed(), 0, "Speed");
columnConfigDouble.setCell(new NumberCell<Double>(ApplicationContext.getInstance().getFormatterUtil().getSpeedFormat()));
columnConfigList.add(columnConfigDouble);
columnConfigList.add(new ColumnConfig<Position, Double>(positionProperties.course(), 0, "Course"));
columnConfigList.add(new ColumnConfig<Position, Double>(positionProperties.power(), 0, "Power"));
columnModel = new ColumnModel<Position>(columnConfigList);
uiBinder.createAndBindUi(this);
grid.getSelectionModel().addSelectionChangedHandler(this);
grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
// Initialize with current time
long min = 60 * 1000;
Date now = new Date();
Date to = new Date(((now.getTime() + 15 * min) / (15 * min)) * 15 * min);
Date from = new Date(to.getTime() - 60 * min);
fromDate.setValue(from);
fromTime.setValue(from);
toDate.setValue(to);
toTime.setValue(to);
}
@Override
public void onSelectionChanged(SelectionChangedEvent<Position> event) {
if (event.getSelection().isEmpty()) {
archiveHandler.onSelected(null);
} else {
archiveHandler.onSelected(event.getSelection().get(0));
}
}
@SuppressWarnings("deprecation")
private static Date getCombineDate(DateField dateField, TimeField timeField) {
Date result = null;
Date date = dateField.getValue();
Date time = timeField.getValue();
if (date != null && time != null) {
result = new Date(
date.getYear(), date.getMonth(), date.getDate(),
time.getHours(), time.getMinutes(), time.getSeconds());
}
return result;
}
@UiHandler("loadButton")
public void onLoadClicked(SelectEvent event) {
archiveHandler.onLoad(
deviceCombo.getValue(),
getCombineDate(fromDate, fromTime),
getCombineDate(toDate, toTime));
}
@UiHandler("clearButton")
public void onClearClicked(SelectEvent event) {
archiveHandler.onClear();
}
private StoreHandlers<Device> deviceStoreHandlers = new BaseStoreHandlers<Device>() {
@Override
public void onAnything() {
Device oldDevice = deviceCombo.getValue();
if (oldDevice != null) {
deviceCombo.setValue(deviceStore.findModel(oldDevice));
}
}
};
public void selectPosition(Position position) {
grid.getSelectionModel().select(positionStore.findModel(position), false);
}
}