/* * 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.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 { private static ArchiveViewUiBinder uiBinder = GWT.create(ArchiveViewUiBinder.class); interface ArchiveViewUiBinder extends UiBinder { } 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 deviceStore; @UiField DateField fromDate; @UiField TimeField fromTime; @UiField DateField toDate; @UiField TimeField toTime; @UiField(provided = true) ComboBox deviceCombo; @UiField(provided = true) ColumnModel columnModel; @UiField(provided = true) ListStore positionStore; @UiField Grid grid; public ArchiveView(ArchiveHandler archiveHandler, ListStore positionStore, ListStore deviceStore) { this.archiveHandler = archiveHandler; this.positionStore = positionStore; deviceStore.addStoreHandlers(deviceStoreHandlers); this.deviceStore = deviceStore; DeviceProperties deviceProperties = GWT.create(DeviceProperties.class); deviceCombo = new ComboBox(deviceStore, deviceProperties.label()); PositionProperties positionProperties = GWT.create(PositionProperties.class); List> columnConfigList = new LinkedList>(); columnConfigList.add(new ColumnConfig(positionProperties.valid(), 0, "Valid")); ColumnConfig columnConfig = new ColumnConfig(positionProperties.time(), 0, "Time"); columnConfig.setCell(new DateCell(ApplicationContext.getInstance().getFormatterUtil().getTimeFormat())); columnConfigList.add(columnConfig); columnConfigList.add(new ColumnConfig(positionProperties.latitude(), 0, "Latitude")); columnConfigList.add(new ColumnConfig(positionProperties.longitude(), 0, "Longitude")); columnConfigList.add(new ColumnConfig(positionProperties.altitude(), 0, "Altitude")); columnConfigList.add(new ColumnConfig(positionProperties.speed(), 0, "Speed")); columnConfigList.add(new ColumnConfig(positionProperties.course(), 0, "Course")); columnConfigList.add(new ColumnConfig(positionProperties.power(), 0, "Power")); columnModel = new ColumnModel(columnConfigList); uiBinder.createAndBindUi(this); grid.getSelectionModel().addSelectionChangedHandler(this); grid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); // Initialize with current time Date now = new Date(); Date from = new Date(now.getTime() - 60 * 60 * 1000); fromDate.setValue(from); fromTime.setValue(from); toDate.setValue(now); toTime.setValue(now); } @Override public void onSelectionChanged(SelectionChangedEvent 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 deviceStoreHandlers = new BaseStoreHandlers() { @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); } }