/******************************************************************************* * Copyright (c) 2009 EclipseSource Inc. and others. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 and Eclipse Distribution License v1.0 * which accompanies this distribution. The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html and the Eclipse Distribution License * is available at http://www.eclipse.org/org/documents/edl-v10.php. * * Contributors: * EclipseSource Inc. - initial API and implementation *******************************************************************************/ package org.eclipse.examples.toast.backend.rap; import java.io.IOException; import java.io.InputStream; import java.net.URI; import org.eclipse.examples.toast.backend.data.IAddress; import org.eclipse.examples.toast.backend.data.IDriver; import org.eclipse.examples.toast.backend.data.ITrackedLocation; import org.eclipse.examples.toast.backend.data.IVehicle; import org.eclipse.examples.toast.backend.data.internal.Driver; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.InputDialog; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.rwt.graphics.Graphics; import org.eclipse.rwt.lifecycle.WidgetUtil; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.RowLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.ISelectionService; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.part.ViewPart; public class VehicleView extends ViewPart { public static final String ID = "org.eclipse.examples.toast.backend.rap.vehicleView"; //$NON-NLS-1$ private static final Image DEFAULT_IMAGE = Graphics.getImage("/icons/default_user.png", VehicleView.class.getClassLoader()); //$NON-NLS-1$ private IVehicle vehicle; private Composite parent; private Label photoLabel; private Label nameLabel; private Label addressLabel; private Label vidLabel; private Label packagesLabel; private Label locationLabel; private Label headingLabel; private Button editProfileButton; public void createPartControl(final Composite parent) { this.parent = parent; parent.setLayout(LayoutUtil.createGridLayout(2, true, 10, 10)); Control driverGroup = createDriverGroup(parent); driverGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); Control vehicleGroup = createVehicleGroup(parent); vehicleGroup.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false)); Control leftButtons = createLeftButtons(parent); GridData leftButtonsData = new GridData(SWT.LEFT, SWT.TOP, false, false); leftButtons.setLayoutData(leftButtonsData); Control rightButtons = createRightButtons(parent); GridData rightButtonsData = new GridData(SWT.RIGHT, SWT.TOP, false, false); rightButtons.setLayoutData(rightButtonsData); createSelectionListener(); } public void setFocus() { // TODO Auto-generated method stub } private Control createDriverGroup(final Composite parent) { Group group = new Group(parent, SWT.NONE); group.setText("Driver"); group.setLayout(LayoutUtil.createGridLayout(2, false, 10, 10)); photoLabel = new Label(group, SWT.BORDER); photoLabel.setImage(DEFAULT_IMAGE); Composite comp = new Composite(group, SWT.NONE); comp.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); comp.setLayout(LayoutUtil.createGridLayout(1, false, 0, 5)); nameLabel = createFormElement(comp, "Name", ""); addressLabel = createFormElement(comp, "Address", ""); return group; } private Control createVehicleGroup(final Composite parent) { Group group = new Group(parent, SWT.NONE); group.setText("Vehicle"); group.setLayout(LayoutUtil.createGridLayout(1, false, 10, 5)); vidLabel = createFormElement(group, "Id", ""); packagesLabel = createFormElement(group, "Packages", ""); locationLabel = createFormElement(group, "Location", ""); headingLabel = createFormElement(group, "Heading", ""); return group; } private Label createFormElement(final Composite parent, final String key, final String value) { Composite composite = new Composite(parent, SWT.NONE); composite.setLayout(LayoutUtil.createGridLayout(1, false, 0, 0)); Label keyLabel = new Label(composite, SWT.NONE); keyLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false)); keyLabel.setData(WidgetUtil.CUSTOM_VARIANT, "formKey"); keyLabel.setText(key + ":"); Label valueLabel = new Label(composite, SWT.NONE); valueLabel.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false)); valueLabel.setData(WidgetUtil.CUSTOM_VARIANT, "formValue"); valueLabel.setText(value); return valueLabel; } private Control createLeftButtons(final Composite parent) { Composite composite = new Composite(parent, SWT.NONE); RowLayout rowLayout = new RowLayout(); rowLayout.marginRight = 0; rowLayout.marginTop = 0; composite.setLayout(rowLayout); // Dummy button Button showDetailsButton = new Button(composite, SWT.CHECK); showDetailsButton.setText("Show Details"); return composite; } private Control createRightButtons(final Composite parent) { Composite composite = new Composite(parent, SWT.NONE); RowLayout rowLayout = new RowLayout(); rowLayout.marginRight = 0; rowLayout.marginTop = 0; composite.setLayout(rowLayout); editProfileButton = new Button(composite, SWT.PUSH | SWT.BORDER); editProfileButton.setText("Edit Profile"); editProfileButton.setEnabled(false); editProfileButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { editProfile(vehicle); } }); return composite; } protected void editProfile(final IVehicle vehicle) { InputDialog dialog = new InputDialog(parent.getShell(), "Driver Name", "Enter a new driver name", vehicle.getDriver().getFirstName(), null); if (dialog.open() == Dialog.CANCEL) return; String name = dialog.getValue(); if (name != null) ((Driver) vehicle.getDriver()).setFirstName(name); } private void createSelectionListener() { IWorkbenchWindow window = getSite().getWorkbenchWindow(); ISelectionService selectionService = window.getSelectionService(); selectionService.addSelectionListener(new ISelectionListener() { public void selectionChanged(final IWorkbenchPart part, final ISelection selection) { if (!(part instanceof SearchView)) return; if (selection != null) { IStructuredSelection sselection = (IStructuredSelection) selection; IVehicle vehicle = (IVehicle) sselection.getFirstElement(); if (vehicle != null) { setVehicle(vehicle); } } } }); } private void setVehicle(final IVehicle value) { vehicle = value; IDriver driver = vehicle.getDriver(); if (driver != null) { Image image = getDriverImage(driver.getImage()); photoLabel.setImage(image == null ? DEFAULT_IMAGE : image); nameLabel.setText(driver == null ? "" : driver.getFirstName() + " " + driver.getLastName()); IAddress address = driver.getAddress(); addressLabel.setText(address.getCity()); } else { photoLabel.setImage(DEFAULT_IMAGE); nameLabel.setText(""); addressLabel.setText(""); } vidLabel.setText(vehicle.getName() + (vehicle.isOnline() ? " ONLINE" : "")); packagesLabel.setText(String.valueOf(vehicle.getPackages().size())); ITrackedLocation location = vehicle.getCurrentLocation(); if (location != null) { String lonStr = String.valueOf(location.getLongitude() / 100000.0); String latStr = String.valueOf(location.getLatitude() / 100000.0); locationLabel.setText(latStr + ", " + lonStr); //$NON-NLS-1$ headingLabel.setText(getDirection(location.getHeading()) + " at " + location.getSpeed() + " mph"); } else { locationLabel.setText(""); headingLabel.setText(""); } editProfileButton.setEnabled(vehicle != null); photoLabel.getParent().layout(); parent.layout(); } private Image getDriverImage(URI imageUrl) { if (imageUrl == null) return null; InputStream in = null; // TODO need to update this to cache the images try { try { in = imageUrl.toURL().openStream(); return Graphics.getImage(imageUrl.toASCIIString(), in); } finally { if (in != null) in.close(); } } catch (IOException e) { // TODO log here } return null; } private static String getDirection(final int heading) { String result = null; int direction = (heading + 45) % 360; if (direction < 90) { result = "North"; } else if (direction < 180) { result = "East"; } else if (direction < 270) { result = "South"; } else { result = "West"; } return result; } }