155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/*
255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * you may not use this file except in compliance with the License.
655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * You may obtain a copy of the License at
755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project *
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * See the License for the specific language governing permissions and
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * limitations under the License.
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectpackage com.android.ddmuilib;
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmlib.EmulatorConsole;
2055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmlib.EmulatorConsole.GsmMode;
2155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmlib.EmulatorConsole.GsmStatus;
2255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmlib.EmulatorConsole.NetworkStatus;
23ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbyeimport com.android.ddmlib.IDevice;
2455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.CoordinateControls;
2555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.GpxParser;
26ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbyeimport com.android.ddmuilib.location.GpxParser.Track;
2755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.KmlParser;
2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.TrackContentProvider;
2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.TrackLabelProvider;
3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.TrackPoint;
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.WayPoint;
3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.WayPointContentProvider;
3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport com.android.ddmuilib.location.WayPointLabelProvider;
3455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.dialogs.MessageDialog;
3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.preference.IPreferenceStore;
3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.viewers.ISelection;
3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.viewers.ISelectionChangedListener;
3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.viewers.IStructuredSelection;
4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.viewers.SelectionChangedEvent;
4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.jface.viewers.TableViewer;
4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.SWT;
4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.SWTException;
4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.custom.ScrolledComposite;
4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.custom.StackLayout;
4655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.ControlAdapter;
4755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.ControlEvent;
4855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.ModifyEvent;
4955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.ModifyListener;
5055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.SelectionAdapter;
5155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.events.SelectionEvent;
5255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.graphics.Image;
5355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.graphics.Rectangle;
5455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.FillLayout;
5555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.GridData;
5655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.layout.GridLayout;
5755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Button;
5855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Combo;
5955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Composite;
6055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Control;
6155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Display;
6255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.FileDialog;
6355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Group;
6455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Label;
6555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.TabFolder;
6655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.TabItem;
6755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Table;
6855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectimport org.eclipse.swt.widgets.Text;
6955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
7055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project/**
7155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project * Panel to control the emulator using EmulatorConsole objects.
7255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project */
7355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectpublic class EmulatorControlPanel extends SelectionDependentPanel {
7455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
7555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // default location: Patio outside Charlie's
7655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static double DEFAULT_LONGITUDE = -122.084095;
7755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static double DEFAULT_LATITUDE = 37.422006;
785542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
7955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String SPEED_FORMAT = "Speed: %1$dX";
8055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
8255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
8355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Map between the display gsm mode and the internal tag used by the display.
8455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
8555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String[][] GSM_MODES = new String[][] {
8655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        { "unregistered", GsmMode.UNREGISTERED.getTag() },
8755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        { "home", GsmMode.HOME.getTag() },
8855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        { "roaming", GsmMode.ROAMING.getTag() },
8955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        { "searching", GsmMode.SEARCHING.getTag() },
9055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        { "denied", GsmMode.DENIED.getTag() },
9155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    };
9255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
9355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String[] NETWORK_SPEEDS = new String[] {
9455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "Full",
9555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "GSM",
9655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "HSCSD",
9755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "GPRS",
9855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "EDGE",
9955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "UMTS",
10055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "HSDPA",
10155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    };
10255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
10355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String[] NETWORK_LATENCIES = new String[] {
10455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "None",
10555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "GPRS",
10655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "EDGE",
10755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        "UMTS",
10855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    };
1095542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
11055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static int[] PLAY_SPEEDS = new int[] { 1, 2, 5, 10, 20, 50 };
11155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
11255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String RE_PHONE_NUMBER = "^[+#0-9]+$"; //$NON-NLS-1$
11355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_WAYPOINT_COL_NAME = "emulatorControl.waypoint.name"; //$NON-NLS-1$
11455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_WAYPOINT_COL_LONGITUDE = "emulatorControl.waypoint.longitude"; //$NON-NLS-1$
11555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_WAYPOINT_COL_LATITUDE = "emulatorControl.waypoint.latitude"; //$NON-NLS-1$
11655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_WAYPOINT_COL_ELEVATION = "emulatorControl.waypoint.elevation"; //$NON-NLS-1$
11755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_WAYPOINT_COL_DESCRIPTION = "emulatorControl.waypoint.desc"; //$NON-NLS-1$
11855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_TRACK_COL_NAME = "emulatorControl.track.name"; //$NON-NLS-1$
11955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_TRACK_COL_COUNT = "emulatorControl.track.count"; //$NON-NLS-1$
12055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_TRACK_COL_FIRST = "emulatorControl.track.first"; //$NON-NLS-1$
12155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_TRACK_COL_LAST = "emulatorControl.track.last"; //$NON-NLS-1$
12255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final static String PREFS_TRACK_COL_COMMENT = "emulatorControl.track.comment"; //$NON-NLS-1$
12355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private EmulatorConsole mEmulatorConsole;
12555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Composite mParent;
12755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
12855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Label mVoiceLabel;
12955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Combo mVoiceMode;
13055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Label mDataLabel;
13155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Combo mDataMode;
13255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Label mSpeedLabel;
13355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Combo mNetworkSpeed;
13455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Label mLatencyLabel;
13555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Combo mNetworkLatency;
13655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
13755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Label mNumberLabel;
13855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Text mPhoneNumber;
13955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mVoiceButton;
14155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mSmsButton;
14255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Label mMessageLabel;
14455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Text mSmsMessage;
14555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mCallButton;
14755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mCancelButton;
14855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
14955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private TabFolder mLocationFolders;
1505542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
15155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mDecimalButton;
15255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mSexagesimalButton;
15355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private CoordinateControls mLongitudeControls;
15455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private CoordinateControls mLatitudeControls;
15555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mGpxUploadButton;
15655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Table mGpxWayPointTable;
15755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Table mGpxTrackTable;
15855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mKmlUploadButton;
15955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Table mKmlWayPointTable;
16055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
16155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mPlayGpxButton;
16255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mGpxBackwardButton;
16355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mGpxForwardButton;
16455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mGpxSpeedButton;
16555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mPlayKmlButton;
16655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mKmlBackwardButton;
16755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mKmlForwardButton;
16855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Button mKmlSpeedButton;
16955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
17055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Image mPlayImage;
17155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Image mPauseImage;
17255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
17355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Thread mPlayingThread;
17455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private boolean mPlayingTrack;
17555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private int mPlayDirection = 1;
17655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private int mSpeed;
17755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private int mSpeedIndex;
1785542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
17955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final SelectionAdapter mDirectionButtonAdapter = new SelectionAdapter() {
18055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @Override
18155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public void widgetSelected(SelectionEvent e) {
18255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            Button b = (Button)e.getSource();
18355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (b.getSelection() == false) {
18455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // basically the button was unselected, which we don't allow.
18555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // so we reselect it.
18655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                b.setSelection(true);
18755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return;
18855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
1895542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
19055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // now handle selection change.
19155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (b == mGpxForwardButton || b == mKmlForwardButton) {
19255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mGpxBackwardButton.setSelection(false);
19355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mGpxForwardButton.setSelection(true);
19455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mKmlBackwardButton.setSelection(false);
19555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mKmlForwardButton.setSelection(true);
19655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mPlayDirection = 1;
1975542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
19855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } else {
19955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mGpxBackwardButton.setSelection(true);
20055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mGpxForwardButton.setSelection(false);
20155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mKmlBackwardButton.setSelection(true);
20255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mKmlForwardButton.setSelection(false);
20355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mPlayDirection = -1;
20455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
20555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
20655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    };
2075542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
20855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private final SelectionAdapter mSpeedButtonAdapter = new SelectionAdapter() {
20955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        @Override
21055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        public void widgetSelected(SelectionEvent e) {
21155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mSpeedIndex = (mSpeedIndex+1) % PLAY_SPEEDS.length;
21255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mSpeed = PLAY_SPEEDS[mSpeedIndex];
2135542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
21455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mGpxSpeedButton.setText(String.format(SPEED_FORMAT, mSpeed));
21555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mGpxPlayControls.pack();
21655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mKmlSpeedButton.setText(String.format(SPEED_FORMAT, mSpeed));
21755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mKmlPlayControls.pack();
2185542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
21955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mPlayingThread != null) {
22055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mPlayingThread.interrupt();
22155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
2225542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet        }
22355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     };
22455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Composite mKmlPlayControls;
22555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private Composite mGpxPlayControls;
22655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
2275542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
228e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet    public EmulatorControlPanel() {
22955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
23055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
23155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
23255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Sent when a new device is selected. The new device can be accessed
23355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * with {@link #getCurrentDevice()}
23455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
23555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
23655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void deviceSelected() {
23755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        handleNewDevice(getCurrentDevice());
23855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
23955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
24055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
24155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Sent when a new client is selected. The new client can be accessed
24255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * with {@link #getCurrentClient()}
24355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
24455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
24555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void clientSelected() {
24655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // pass
24755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
24855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
24955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
25055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Creates a control capable of displaying some information.  This is
25155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * called once, when the application is initializing, from the UI thread.
25255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
25355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
25455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    protected Control createControl(Composite parent) {
25555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mParent = parent;
25655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
25755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final ScrolledComposite scollingParent = new ScrolledComposite(parent, SWT.V_SCROLL);
25855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        scollingParent.setExpandVertical(true);
25955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        scollingParent.setExpandHorizontal(true);
26055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        scollingParent.setLayoutData(new GridData(GridData.FILL_BOTH));
26155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
26255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final Composite top = new Composite(scollingParent, SWT.NONE);
26355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        scollingParent.setContent(top);
26455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        top.setLayout(new GridLayout(1, false));
26555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
26655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // set the resize for the scrolling to work (why isn't that done automatically?!?)
26755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        scollingParent.addControlListener(new ControlAdapter() {
26855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
26955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void controlResized(ControlEvent e) {
27055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                Rectangle r = scollingParent.getClientArea();
27155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                scollingParent.setMinSize(top.computeSize(r.width, SWT.DEFAULT));
27255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
27355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
2745542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
27555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createRadioControls(top);
27655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
27755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createCallControls(top);
2785542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
27955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createLocationControls(top);
28055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
28155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        doEnable(false);
28255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
28355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        top.layout();
28455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Rectangle r = scollingParent.getClientArea();
28555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        scollingParent.setMinSize(top.computeSize(r.width, SWT.DEFAULT));
28655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
28755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return scollingParent;
28855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
28955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
29055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
29155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Create Radio (on/off/roaming, for voice/data) controls.
29255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param top
29355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
29455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createRadioControls(final Composite top) {
29555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Group g1 = new Group(top, SWT.NONE);
29655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        g1.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
29755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        g1.setLayout(new GridLayout(2, false));
29855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        g1.setText("Telephony Status");
29955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
30055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // the inside of the group is 2 composite so that all the column of the controls (mainly
30155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // combos) have the same width, while not taking the whole screen width
30255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite insideGroup = new Composite(g1, SWT.NONE);
30355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        GridLayout gl = new GridLayout(4, false);
30455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl.marginBottom = gl.marginHeight = gl.marginLeft = gl.marginRight = 0;
30555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        insideGroup.setLayout(gl);
30655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
30755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceLabel = new Label(insideGroup, SWT.NONE);
30855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceLabel.setText("Voice:");
30955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceLabel.setAlignment(SWT.RIGHT);
31055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
31155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceMode = new Combo(insideGroup, SWT.READ_ONLY);
31255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceMode.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
31355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (String[] mode : GSM_MODES) {
31455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mVoiceMode.add(mode[0]);
31555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
31655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceMode.addSelectionListener(new SelectionAdapter() {
31755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // called when selection changes
31855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
31955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
32055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                setVoiceMode(mVoiceMode.getSelectionIndex());
32155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
32255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
32355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
32455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSpeedLabel = new Label(insideGroup, SWT.NONE);
32555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSpeedLabel.setText("Speed:");
32655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSpeedLabel.setAlignment(SWT.RIGHT);
32755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
32855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNetworkSpeed = new Combo(insideGroup, SWT.READ_ONLY);
32955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNetworkSpeed.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
33055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (String mode : NETWORK_SPEEDS) {
33155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mNetworkSpeed.add(mode);
33255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
33355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNetworkSpeed.addSelectionListener(new SelectionAdapter() {
33455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // called when selection changes
33555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
33655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
33755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                setNetworkSpeed(mNetworkSpeed.getSelectionIndex());
33855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
33955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
34055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
34155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDataLabel = new Label(insideGroup, SWT.NONE);
34255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDataLabel.setText("Data:");
34355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDataLabel.setAlignment(SWT.RIGHT);
34455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
34555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDataMode = new Combo(insideGroup, SWT.READ_ONLY);
34655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDataMode.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
34755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (String[] mode : GSM_MODES) {
34855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mDataMode.add(mode[0]);
34955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
35055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDataMode.addSelectionListener(new SelectionAdapter() {
35155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // called when selection changes
35255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
35355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
35455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                setDataMode(mDataMode.getSelectionIndex());
35555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
35655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
35755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
35855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatencyLabel = new Label(insideGroup, SWT.NONE);
35955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatencyLabel.setText("Latency:");
36055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatencyLabel.setAlignment(SWT.RIGHT);
36155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
36255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNetworkLatency = new Combo(insideGroup, SWT.READ_ONLY);
36355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNetworkLatency.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
36455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (String mode : NETWORK_LATENCIES) {
36555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mNetworkLatency.add(mode);
36655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
36755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNetworkLatency.addSelectionListener(new SelectionAdapter() {
36855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // called when selection changes
36955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
37055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
37155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                setNetworkLatency(mNetworkLatency.getSelectionIndex());
37255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
37355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
37455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
37555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // now an empty label to take the rest of the width of the group
37655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Label l = new Label(g1, SWT.NONE);
37755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
37855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
3795542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
38055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
38155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Create Voice/SMS call/hang up controls
38255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param top
38355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
38455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createCallControls(final Composite top) {
38555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        GridLayout gl;
38655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Group g2 = new Group(top, SWT.NONE);
38755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        g2.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
38855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        g2.setLayout(new GridLayout(1, false));
38955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        g2.setText("Telephony Actions");
39055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
39155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // horizontal composite for label + text field
39255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite phoneComp = new Composite(g2, SWT.NONE);
39355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        phoneComp.setLayoutData(new GridData(GridData.FILL_BOTH));
39455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl = new GridLayout(2, false);
39555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl.marginBottom = gl.marginHeight = gl.marginLeft = gl.marginRight = 0;
39655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        phoneComp.setLayout(gl);
39755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
39855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNumberLabel = new Label(phoneComp, SWT.NONE);
39955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNumberLabel.setText("Incoming number:");
40055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
40155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPhoneNumber = new Text(phoneComp, SWT.BORDER | SWT.LEFT | SWT.SINGLE);
40255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPhoneNumber.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
40355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPhoneNumber.addModifyListener(new ModifyListener() {
404ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
40555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void modifyText(ModifyEvent e) {
40655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // Reenable the widgets based on the content of the text.
40755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // doEnable checks the validity of the phone number to enable/disable some
40855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // widgets.
40955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // Looks like we're getting a callback at creation time, so we can't
41055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // suppose that we are enabled when the text is modified...
41155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                doEnable(mEmulatorConsole != null);
41255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
41355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
41455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
41555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceButton = new Button(phoneComp, SWT.RADIO);
41655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        GridData gd = new GridData();
41755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.horizontalSpan = 2;
41855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceButton.setText("Voice");
41955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceButton.setLayoutData(gd);
42055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceButton.setEnabled(false);
42155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceButton.setSelection(true);
42255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceButton.addSelectionListener(new SelectionAdapter() {
42355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // called when selection changes
42455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
42555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
42655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                doEnable(true);
42755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
42855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (mVoiceButton.getSelection()) {
42955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mCallButton.setText("Call");
43055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                } else {
43155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mCallButton.setText("Send");
43255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
43355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
43455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
43555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
43655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSmsButton = new Button(phoneComp, SWT.RADIO);
43755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSmsButton.setText("SMS");
43855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd = new GridData();
43955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.horizontalSpan = 2;
44055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSmsButton.setLayoutData(gd);
44155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSmsButton.setEnabled(false);
44255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Since there are only 2 radio buttons, we can put a listener on only one (they
44355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // are both called on select and unselect event.
44455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
44555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mMessageLabel = new Label(phoneComp, SWT.NONE);
44655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd = new GridData();
44755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.verticalAlignment = SWT.TOP;
44855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mMessageLabel.setLayoutData(gd);
44955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mMessageLabel.setText("Message:");
45055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mMessageLabel.setEnabled(false);
45155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
45255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSmsMessage = new Text(phoneComp, SWT.BORDER | SWT.LEFT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
45355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSmsMessage.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
45455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.heightHint = 70;
45555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSmsMessage.setEnabled(false);
45655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
45755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // composite to put the 2 buttons horizontally
45855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite g2ButtonComp = new Composite(g2, SWT.NONE);
45955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        g2ButtonComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
46055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl = new GridLayout(2, false);
46155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl.marginWidth = gl.marginHeight = 0;
46255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        g2ButtonComp.setLayout(gl);
46355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
46455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // now a button below the phone number
46555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCallButton = new Button(g2ButtonComp, SWT.PUSH);
46655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCallButton.setText("Call");
46755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCallButton.setEnabled(false);
46855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCallButton.addSelectionListener(new SelectionAdapter() {
46955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
47055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
47155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (mEmulatorConsole != null) {
47255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (mVoiceButton.getSelection()) {
47355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        processCommandResult(mEmulatorConsole.call(mPhoneNumber.getText().trim()));
47455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    } else {
47555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // we need to encode the message. We need to replace the carriage return
47655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // character by the 2 character string \n.
47755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // Because of this the \ character needs to be escaped as well.
47855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // ReplaceAll() expects regexp so \ char are escaped twice.
47955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        String message = mSmsMessage.getText();
48055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        message = message.replaceAll("\\\\", //$NON-NLS-1$
48155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                "\\\\\\\\"); //$NON-NLS-1$
48255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
48355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // While the normal line delimiter is returned by Text.getLineDelimiter()
48455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // it seems copy pasting text coming from somewhere else could have another
48555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // delimited. For this reason, we'll replace is several steps
48655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
48755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // replace the dual CR-LF
488ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                        message = message.replaceAll("\r\n", "\\\\n"); //$NON-NLS-1$ //$NON-NLS-2$
48955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
49055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // replace remaining stand alone \n
491ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                        message = message.replaceAll("\n", "\\\\n"); //$NON-NLS-1$ //$NON-NLS-2$
49255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
49355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // replace remaining stand alone \r
494ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                        message = message.replaceAll("\r", "\\\\n"); //$NON-NLS-1$ //$NON-NLS-2$
49555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
49655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        processCommandResult(mEmulatorConsole.sendSms(mPhoneNumber.getText().trim(),
49755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                message));
49855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
49955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
50055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
50155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
50255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
50355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCancelButton = new Button(g2ButtonComp, SWT.PUSH);
50455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCancelButton.setText("Hang Up");
50555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCancelButton.setEnabled(false);
50655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCancelButton.addSelectionListener(new SelectionAdapter() {
50755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
50855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
50955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (mEmulatorConsole != null) {
51055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (mVoiceButton.getSelection()) {
51155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        processCommandResult(mEmulatorConsole.cancelCall(
51255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                mPhoneNumber.getText().trim()));
51355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
51455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
51555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
51655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
51755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
5185542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
51955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
52055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Create Location controls.
52155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param top
52255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
52355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createLocationControls(final Composite top) {
52455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Label l = new Label(top, SWT.NONE);
52555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        l.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
52655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        l.setText("Location Controls");
5275542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
52855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLocationFolders = new TabFolder(top, SWT.NONE);
52955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLocationFolders.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
5305542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
53155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite manualLocationComp = new Composite(mLocationFolders, SWT.NONE);
53255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TabItem item = new TabItem(mLocationFolders, SWT.NONE);
53355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setText("Manual");
53455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setControl(manualLocationComp);
5355542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
53655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createManualLocationControl(manualLocationComp);
53755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
538e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        ImageLoader loader = ImageLoader.getDdmUiLibLoader();
53923da069e4f407df1b06e7db2324e3247496abe3dTor Norbye        mPlayImage = loader.loadImage("play.png", mParent.getDisplay()); //$NON-NLS-1$
54023da069e4f407df1b06e7db2324e3247496abe3dTor Norbye        mPauseImage = loader.loadImage("pause.png", mParent.getDisplay()); //$NON-NLS-1$
54155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
54255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite gpxLocationComp = new Composite(mLocationFolders, SWT.NONE);
54355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item = new TabItem(mLocationFolders, SWT.NONE);
54455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setText("GPX");
54555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setControl(gpxLocationComp);
5465542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
54755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createGpxLocationControl(gpxLocationComp);
54855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
54955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Composite kmlLocationComp = new Composite(mLocationFolders, SWT.NONE);
55055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        kmlLocationComp.setLayout(new FillLayout());
55155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item = new TabItem(mLocationFolders, SWT.NONE);
55255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setText("KML");
55355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        item.setControl(kmlLocationComp);
5545542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
55555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        createKmlLocationControl(kmlLocationComp);
55655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
55755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
55855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createManualLocationControl(Composite manualLocationComp) {
55955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final StackLayout sl;
56055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        GridLayout gl;
56155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Label label;
56255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
56355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        manualLocationComp.setLayout(new GridLayout(1, false));
56455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDecimalButton = new Button(manualLocationComp, SWT.RADIO);
56555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDecimalButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
56655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDecimalButton.setText("Decimal");
56755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSexagesimalButton = new Button(manualLocationComp, SWT.RADIO);
56855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSexagesimalButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
56955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSexagesimalButton.setText("Sexagesimal");
57055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
57155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // composite to hold and switching between the 2 modes.
57255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final Composite content = new Composite(manualLocationComp, SWT.NONE);
57355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        content.setLayout(sl = new StackLayout());
5745542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
57555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // decimal display
57655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final Composite decimalContent = new Composite(content, SWT.NONE);
57755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        decimalContent.setLayout(gl = new GridLayout(2, false));
57855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl.marginHeight = gl.marginWidth = 0;
5795542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
58055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLongitudeControls = new CoordinateControls();
58155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatitudeControls = new CoordinateControls();
5825542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
58355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(decimalContent, SWT.NONE);
58455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("Longitude");
5855542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
58655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLongitudeControls.createDecimalText(decimalContent);
5875542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
58855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(decimalContent, SWT.NONE);
58955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("Latitude");
5905542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
59155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatitudeControls.createDecimalText(decimalContent);
59255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
59355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // sexagesimal content
59455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final Composite sexagesimalContent = new Composite(content, SWT.NONE);
59555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sexagesimalContent.setLayout(gl = new GridLayout(7, false));
59655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl.marginHeight = gl.marginWidth = 0;
5975542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
59855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(sexagesimalContent, SWT.NONE);
59955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("Longitude");
6005542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
60155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLongitudeControls.createSexagesimalDegreeText(sexagesimalContent);
6025542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
60355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(sexagesimalContent, SWT.NONE);
60455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("\u00B0"); // degree character
6055542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
60655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLongitudeControls.createSexagesimalMinuteText(sexagesimalContent);
6075542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
60855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(sexagesimalContent, SWT.NONE);
60955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("'");
61055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
61155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLongitudeControls.createSexagesimalSecondText(sexagesimalContent);
6125542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
61355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(sexagesimalContent, SWT.NONE);
61455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("\"");
61555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
61655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(sexagesimalContent, SWT.NONE);
61755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("Latitude");
6185542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
61955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatitudeControls.createSexagesimalDegreeText(sexagesimalContent);
6205542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
62155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(sexagesimalContent, SWT.NONE);
62255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("\u00B0");
6235542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
62455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatitudeControls.createSexagesimalMinuteText(sexagesimalContent);
6255542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
62655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(sexagesimalContent, SWT.NONE);
62755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("'");
62855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
62955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatitudeControls.createSexagesimalSecondText(sexagesimalContent);
6305542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
63155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label = new Label(sexagesimalContent, SWT.NONE);
63255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        label.setText("\"");
63355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
63455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // set the default display to decimal
63555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sl.topControl = decimalContent;
63655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDecimalButton.setSelection(true);
63755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
63855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDecimalButton.addSelectionListener(new SelectionAdapter() {
63955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
64055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
64155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (mDecimalButton.getSelection()) {
64255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    sl.topControl = decimalContent;
64355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                } else {
64455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    sl.topControl = sexagesimalContent;
64555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
64655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                content.layout();
64755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
64855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
6495542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
65055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Button sendButton = new Button(manualLocationComp, SWT.PUSH);
65155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sendButton.setText("Send");
65255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        sendButton.addSelectionListener(new SelectionAdapter() {
65355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
65455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
65555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (mEmulatorConsole != null) {
65655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    processCommandResult(mEmulatorConsole.sendLocation(
65755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            mLongitudeControls.getValue(), mLatitudeControls.getValue(), 0));
65855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
65955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
66055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
6615542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
66255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLongitudeControls.setValue(DEFAULT_LONGITUDE);
66355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatitudeControls.setValue(DEFAULT_LATITUDE);
66455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
66555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
66655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createGpxLocationControl(Composite gpxLocationComp) {
66755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        GridData gd;
66855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
66955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        IPreferenceStore store = DdmUiPreferences.getStore();
67055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
67155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gpxLocationComp.setLayout(new GridLayout(1, false));
67255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
67355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxUploadButton = new Button(gpxLocationComp, SWT.PUSH);
67455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxUploadButton.setText("Load GPX...");
67555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
67655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Table for way point
67755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxWayPointTable = new Table(gpxLocationComp,
67855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
67955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxWayPointTable.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
68055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.heightHint = 100;
68155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxWayPointTable.setHeaderVisible(true);
68255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxWayPointTable.setLinesVisible(true);
6835542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
68455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxWayPointTable, "Name", SWT.LEFT,
68555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "Some Name",
68655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_NAME, store);
68755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxWayPointTable, "Longitude", SWT.LEFT,
68855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "-199.999999",
68955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_LONGITUDE, store);
69055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxWayPointTable, "Latitude", SWT.LEFT,
69155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "-199.999999",
69255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_LATITUDE, store);
69355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxWayPointTable, "Elevation", SWT.LEFT,
69455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "99999.9",
69555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_ELEVATION, store);
69655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxWayPointTable, "Description", SWT.LEFT,
69755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "Some Description",
69855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_DESCRIPTION, store);
69955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
70055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final TableViewer gpxWayPointViewer = new TableViewer(mGpxWayPointTable);
70155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gpxWayPointViewer.setContentProvider(new WayPointContentProvider());
70255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gpxWayPointViewer.setLabelProvider(new WayPointLabelProvider());
7035542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
70455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gpxWayPointViewer.addSelectionChangedListener(new ISelectionChangedListener() {
705ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
70655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void selectionChanged(SelectionChangedEvent event) {
70755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                ISelection selection = event.getSelection();
70855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (selection instanceof IStructuredSelection) {
70955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    IStructuredSelection structuredSelection = (IStructuredSelection)selection;
71055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    Object selectedObject = structuredSelection.getFirstElement();
71155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (selectedObject instanceof WayPoint) {
71255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        WayPoint wayPoint = (WayPoint)selectedObject;
7135542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
71455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (mEmulatorConsole != null && mPlayingTrack == false) {
71555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            processCommandResult(mEmulatorConsole.sendLocation(
71655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    wayPoint.getLongitude(), wayPoint.getLatitude(),
71755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    wayPoint.getElevation()));
71855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
71955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
72055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
72155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
72255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
72355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
72455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // table for tracks.
72555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxTrackTable = new Table(gpxLocationComp,
72655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
72755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxTrackTable.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
72855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.heightHint = 100;
72955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxTrackTable.setHeaderVisible(true);
73055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxTrackTable.setLinesVisible(true);
73155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
73255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxTrackTable, "Name", SWT.LEFT,
73355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "Some very long name",
73455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_TRACK_COL_NAME, store);
73555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxTrackTable, "Point Count", SWT.RIGHT,
73655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "9999",
73755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_TRACK_COL_COUNT, store);
73855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxTrackTable, "First Point Time", SWT.LEFT,
73955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "999-99-99T99:99:99Z",
74055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_TRACK_COL_FIRST, store);
74155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxTrackTable, "Last Point Time", SWT.LEFT,
74255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "999-99-99T99:99:99Z",
74355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_TRACK_COL_LAST, store);
74455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mGpxTrackTable, "Comment", SWT.LEFT,
74555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "-199.999999",
74655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_TRACK_COL_COMMENT, store);
74755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
74855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final TableViewer gpxTrackViewer = new TableViewer(mGpxTrackTable);
74955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gpxTrackViewer.setContentProvider(new TrackContentProvider());
75055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gpxTrackViewer.setLabelProvider(new TrackLabelProvider());
7515542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
75255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gpxTrackViewer.addSelectionChangedListener(new ISelectionChangedListener() {
753ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
75455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void selectionChanged(SelectionChangedEvent event) {
75555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                ISelection selection = event.getSelection();
75655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (selection instanceof IStructuredSelection) {
75755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    IStructuredSelection structuredSelection = (IStructuredSelection)selection;
75855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    Object selectedObject = structuredSelection.getFirstElement();
75955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (selectedObject instanceof Track) {
76055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        Track track = (Track)selectedObject;
7615542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
76255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (mEmulatorConsole != null && mPlayingTrack == false) {
76355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            TrackPoint[] points = track.getPoints();
76455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            processCommandResult(mEmulatorConsole.sendLocation(
76555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    points[0].getLongitude(), points[0].getLatitude(),
76655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    points[0].getElevation()));
76755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
7685542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
76955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mPlayGpxButton.setEnabled(true);
77055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mGpxBackwardButton.setEnabled(true);
77155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mGpxForwardButton.setEnabled(true);
77255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mGpxSpeedButton.setEnabled(true);
7735542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
77455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        return;
77555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
77655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
77755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
77855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mPlayGpxButton.setEnabled(false);
77955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mGpxBackwardButton.setEnabled(false);
78055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mGpxForwardButton.setEnabled(false);
78155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mGpxSpeedButton.setEnabled(false);
78255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
78355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
7845542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
78555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxUploadButton.addSelectionListener(new SelectionAdapter() {
78655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
78755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
78855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                FileDialog fileDialog = new FileDialog(mParent.getShell(), SWT.OPEN);
78955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
79055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                fileDialog.setText("Load GPX File");
79155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                fileDialog.setFilterExtensions(new String[] { "*.gpx" } );
79255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
79355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                String fileName = fileDialog.open();
79455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (fileName != null) {
79555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    GpxParser parser = new GpxParser(fileName);
79655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (parser.parse()) {
79755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        gpxWayPointViewer.setInput(parser.getWayPoints());
79855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        gpxTrackViewer.setInput(parser.getTracks());
79955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
80055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
80155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
80255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
8035542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
80455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxPlayControls = new Composite(gpxLocationComp, SWT.NONE);
80555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        GridLayout gl;
80655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxPlayControls.setLayout(gl = new GridLayout(5, false));
80755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl.marginHeight = gl.marginWidth = 0;
80855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxPlayControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
80955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
81055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPlayGpxButton = new Button(mGpxPlayControls, SWT.PUSH | SWT.FLAT);
81155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPlayGpxButton.setImage(mPlayImage);
81255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPlayGpxButton.addSelectionListener(new SelectionAdapter() {
81355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project           @Override
81455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
81555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project               if (mPlayingTrack == false) {
81655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   ISelection selection = gpxTrackViewer.getSelection();
81755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   if (selection.isEmpty() == false && selection instanceof IStructuredSelection) {
81855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                       IStructuredSelection structuredSelection = (IStructuredSelection)selection;
81955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                       Object selectedObject = structuredSelection.getFirstElement();
82055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                       if (selectedObject instanceof Track) {
82155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                           Track track = (Track)selectedObject;
82255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                           playTrack(track);
82355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                       }
82455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   }
82555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project               } else {
82655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   // if we're playing, then we pause
82755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   mPlayingTrack = false;
82855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   if (mPlayingThread != null) {
82955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                       mPlayingThread.interrupt();
83055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   }
83155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project               }
8325542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet            }
83355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
8345542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
83555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Label separator = new Label(mGpxPlayControls, SWT.SEPARATOR | SWT.VERTICAL);
83655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        separator.setLayoutData(gd = new GridData(
83755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL));
83855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.heightHint = 0;
8395542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
840e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        ImageLoader loader = ImageLoader.getDdmUiLibLoader();
84155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxBackwardButton = new Button(mGpxPlayControls, SWT.TOGGLE | SWT.FLAT);
84223da069e4f407df1b06e7db2324e3247496abe3dTor Norbye        mGpxBackwardButton.setImage(loader.loadImage("backward.png", mParent.getDisplay())); //$NON-NLS-1$
84355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxBackwardButton.setSelection(false);
84455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxBackwardButton.addSelectionListener(mDirectionButtonAdapter);
84555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxForwardButton = new Button(mGpxPlayControls, SWT.TOGGLE | SWT.FLAT);
84623da069e4f407df1b06e7db2324e3247496abe3dTor Norbye        mGpxForwardButton.setImage(loader.loadImage("forward.png", mParent.getDisplay())); //$NON-NLS-1$
84755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxForwardButton.setSelection(true);
84855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxForwardButton.addSelectionListener(mDirectionButtonAdapter);
84955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
85055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxSpeedButton = new Button(mGpxPlayControls, SWT.PUSH | SWT.FLAT);
85155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
85255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSpeedIndex = 0;
85355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSpeed = PLAY_SPEEDS[mSpeedIndex];
85455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
85555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxSpeedButton.setText(String.format(SPEED_FORMAT, mSpeed));
85655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxSpeedButton.addSelectionListener(mSpeedButtonAdapter);
8575542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
85855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPlayGpxButton.setEnabled(false);
85955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxBackwardButton.setEnabled(false);
86055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxForwardButton.setEnabled(false);
86155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxSpeedButton.setEnabled(false);
86255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
86355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
86455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
86555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void createKmlLocationControl(Composite kmlLocationComp) {
86655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        GridData gd;
86755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
86855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        IPreferenceStore store = DdmUiPreferences.getStore();
86955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
87055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        kmlLocationComp.setLayout(new GridLayout(1, false));
87155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
87255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlUploadButton = new Button(kmlLocationComp, SWT.PUSH);
87355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlUploadButton.setText("Load KML...");
87455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
87555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Table for way point
87655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlWayPointTable = new Table(kmlLocationComp,
87755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                SWT.V_SCROLL | SWT.H_SCROLL | SWT.FULL_SELECTION);
87855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlWayPointTable.setLayoutData(gd = new GridData(GridData.FILL_HORIZONTAL));
87955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.heightHint = 200;
88055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlWayPointTable.setHeaderVisible(true);
88155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlWayPointTable.setLinesVisible(true);
8825542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
88355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mKmlWayPointTable, "Name", SWT.LEFT,
88455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "Some Name",
88555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_NAME, store);
88655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mKmlWayPointTable, "Longitude", SWT.LEFT,
88755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "-199.999999",
88855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_LONGITUDE, store);
88955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mKmlWayPointTable, "Latitude", SWT.LEFT,
89055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "-199.999999",
89155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_LATITUDE, store);
89255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mKmlWayPointTable, "Elevation", SWT.LEFT,
89355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "99999.9",
89455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_ELEVATION, store);
89555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        TableHelper.createTableColumn(mKmlWayPointTable, "Description", SWT.LEFT,
89655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                "Some Description",
89755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                PREFS_WAYPOINT_COL_DESCRIPTION, store);
89855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
89955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        final TableViewer kmlWayPointViewer = new TableViewer(mKmlWayPointTable);
90055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        kmlWayPointViewer.setContentProvider(new WayPointContentProvider());
90155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        kmlWayPointViewer.setLabelProvider(new WayPointLabelProvider());
90255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
90355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlUploadButton.addSelectionListener(new SelectionAdapter() {
90455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            @Override
90555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
90655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                FileDialog fileDialog = new FileDialog(mParent.getShell(), SWT.OPEN);
90755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
90855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                fileDialog.setText("Load KML File");
90955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                fileDialog.setFilterExtensions(new String[] { "*.kml" } );
91055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
91155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                String fileName = fileDialog.open();
91255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (fileName != null) {
91355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    KmlParser parser = new KmlParser(fileName);
91455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (parser.parse()) {
91555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        kmlWayPointViewer.setInput(parser.getWayPoints());
9165542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
91755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mPlayKmlButton.setEnabled(true);
91855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mKmlBackwardButton.setEnabled(true);
91955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mKmlForwardButton.setEnabled(true);
92055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mKmlSpeedButton.setEnabled(true);
92155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
92255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
92355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
92455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
9255542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
92655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        kmlWayPointViewer.addSelectionChangedListener(new ISelectionChangedListener() {
927ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye            @Override
92855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void selectionChanged(SelectionChangedEvent event) {
92955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                ISelection selection = event.getSelection();
93055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (selection instanceof IStructuredSelection) {
93155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    IStructuredSelection structuredSelection = (IStructuredSelection)selection;
93255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    Object selectedObject = structuredSelection.getFirstElement();
93355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (selectedObject instanceof WayPoint) {
93455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        WayPoint wayPoint = (WayPoint)selectedObject;
9355542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
93655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (mEmulatorConsole != null && mPlayingTrack == false) {
93755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            processCommandResult(mEmulatorConsole.sendLocation(
93855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    wayPoint.getLongitude(), wayPoint.getLatitude(),
93955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    wayPoint.getElevation()));
94055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
94155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
94255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
94355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
94455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
9455542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
9465542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
9475542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
94855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlPlayControls = new Composite(kmlLocationComp, SWT.NONE);
94955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        GridLayout gl;
95055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlPlayControls.setLayout(gl = new GridLayout(5, false));
95155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gl.marginHeight = gl.marginWidth = 0;
95255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlPlayControls.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
95355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
95455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPlayKmlButton = new Button(mKmlPlayControls, SWT.PUSH | SWT.FLAT);
95555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPlayKmlButton.setImage(mPlayImage);
95655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPlayKmlButton.addSelectionListener(new SelectionAdapter() {
95755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project           @Override
95855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            public void widgetSelected(SelectionEvent e) {
95955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project               if (mPlayingTrack == false) {
96055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   Object input = kmlWayPointViewer.getInput();
96155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   if (input instanceof WayPoint[]) {
96255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                       playKml((WayPoint[])input);
96355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   }
96455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project               } else {
96555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   // if we're playing, then we pause
96655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   mPlayingTrack = false;
96755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   if (mPlayingThread != null) {
96855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                       mPlayingThread.interrupt();
96955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   }
97055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project               }
9715542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet            }
97255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        });
9735542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
97455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Label separator = new Label(mKmlPlayControls, SWT.SEPARATOR | SWT.VERTICAL);
97555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        separator.setLayoutData(gd = new GridData(
97655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                GridData.VERTICAL_ALIGN_FILL | GridData.GRAB_VERTICAL));
97755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        gd.heightHint = 0;
9785542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
979e312b2800018fcfe7fad0b1c883127f1364a17d0Xavier Ducrohet        ImageLoader loader = ImageLoader.getDdmUiLibLoader();
98055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlBackwardButton = new Button(mKmlPlayControls, SWT.TOGGLE | SWT.FLAT);
98123da069e4f407df1b06e7db2324e3247496abe3dTor Norbye        mKmlBackwardButton.setImage(loader.loadImage("backward.png", mParent.getDisplay())); //$NON-NLS-1$
98255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlBackwardButton.setSelection(false);
98355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlBackwardButton.addSelectionListener(mDirectionButtonAdapter);
98455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlForwardButton = new Button(mKmlPlayControls, SWT.TOGGLE | SWT.FLAT);
98523da069e4f407df1b06e7db2324e3247496abe3dTor Norbye        mKmlForwardButton.setImage(loader.loadImage("forward.png", mParent.getDisplay())); //$NON-NLS-1$
98655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlForwardButton.setSelection(true);
98755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlForwardButton.addSelectionListener(mDirectionButtonAdapter);
98855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
98955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlSpeedButton = new Button(mKmlPlayControls, SWT.PUSH | SWT.FLAT);
99055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
99155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSpeedIndex = 0;
99255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSpeed = PLAY_SPEEDS[mSpeedIndex];
99355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
99455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlSpeedButton.setText(String.format(SPEED_FORMAT, mSpeed));
99555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlSpeedButton.addSelectionListener(mSpeedButtonAdapter);
9965542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
99755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mPlayKmlButton.setEnabled(false);
99855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlBackwardButton.setEnabled(false);
99955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlForwardButton.setEnabled(false);
100055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlSpeedButton.setEnabled(false);
100155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
100255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
100355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
100455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Sets the focus to the proper control inside the panel.
100555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
100655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
100755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    public void setFocus() {
100855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
100955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
101055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    @Override
101155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    protected void postCreation() {
101255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // pass
101355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
101455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
101555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private synchronized void setDataMode(int selectionIndex) {
101655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mEmulatorConsole != null) {
101755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            processCommandResult(mEmulatorConsole.setGsmDataMode(
101855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    GsmMode.getEnum(GSM_MODES[selectionIndex][1])));
101955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
102055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
102155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
102255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private synchronized void setVoiceMode(int selectionIndex) {
102355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mEmulatorConsole != null) {
102455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            processCommandResult(mEmulatorConsole.setGsmVoiceMode(
102555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    GsmMode.getEnum(GSM_MODES[selectionIndex][1])));
102655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
102755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
102855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
102955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private synchronized void setNetworkLatency(int selectionIndex) {
103055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mEmulatorConsole != null) {
103155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            processCommandResult(mEmulatorConsole.setNetworkLatency(selectionIndex));
103255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
103355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
103455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
103555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private synchronized void setNetworkSpeed(int selectionIndex) {
103655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mEmulatorConsole != null) {
103755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            processCommandResult(mEmulatorConsole.setNetworkSpeed(selectionIndex));
103855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
103955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
104055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
104155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
104255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
104355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Callback on device selection change.
104455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param device the new selected device
104555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
10465542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet    public void handleNewDevice(IDevice device) {
104755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mParent.isDisposed()) {
104855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return;
104955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
105055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // unlink to previous console.
105155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        synchronized (this) {
105255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mEmulatorConsole = null;
105355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
105455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
105555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        try {
105655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // get the emulator console for this device
105755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // First we need the device itself
105855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (device != null) {
105955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                GsmStatus gsm = null;
106055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                NetworkStatus netstatus = null;
106155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
106255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                synchronized (this) {
106355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    mEmulatorConsole = EmulatorConsole.getConsole(device);
106455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (mEmulatorConsole != null) {
106555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // get the gsm status
106655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        gsm = mEmulatorConsole.getGsmStatus();
106755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        netstatus = mEmulatorConsole.getNetworkStatus();
10685542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
106955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (gsm == null || netstatus == null) {
107055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            mEmulatorConsole = null;
107155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
107255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
107355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
107455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
107555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                if (gsm != null && netstatus != null) {
107655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    Display d = mParent.getDisplay();
107755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (d.isDisposed() == false) {
107855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        final GsmStatus f_gsm = gsm;
107955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        final NetworkStatus f_netstatus = netstatus;
10805542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
108155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        d.asyncExec(new Runnable() {
1082ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                            @Override
108355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            public void run() {
108455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                if (f_gsm.voice != GsmMode.UNKNOWN) {
108555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    mVoiceMode.select(getGsmComboIndex(f_gsm.voice));
108655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                } else {
108755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    mVoiceMode.clearSelection();
108855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
108955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                if (f_gsm.data != GsmMode.UNKNOWN) {
109055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    mDataMode.select(getGsmComboIndex(f_gsm.data));
109155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                } else {
109255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    mDataMode.clearSelection();
109355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
109455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
109555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                if (f_netstatus.speed != -1) {
109655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    mNetworkSpeed.select(f_netstatus.speed);
109755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                } else {
109855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    mNetworkSpeed.clearSelection();
109955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
110055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
110155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                if (f_netstatus.latency != -1) {
110255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    mNetworkLatency.select(f_netstatus.latency);
110355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                } else {
110455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    mNetworkLatency.clearSelection();
110555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
110655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            }
110755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        });
110855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
110955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
111055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
111155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } finally {
111255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // enable/disable the ui
111355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            boolean enable = false;
111455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            synchronized (this) {
111555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                enable = mEmulatorConsole != null;
111655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
11175542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
111855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            enable(enable);
111955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
112055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
112155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
112255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
112355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Enable or disable the ui. Can be called from non ui threads.
112455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param enabled
112555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
112655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void enable(final boolean enabled) {
112755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        try {
112855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            Display d = mParent.getDisplay();
112955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            d.asyncExec(new Runnable() {
1130ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                @Override
113155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void run() {
113255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    if (mParent.isDisposed() == false) {
113355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        doEnable(enabled);
113455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
113555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
113655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            });
113755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        } catch (SWTException e) {
113855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            // disposed. do nothing
113955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
114055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
114155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
114255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private boolean isValidPhoneNumber() {
114355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        String number = mPhoneNumber.getText().trim();
114455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
114555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return number.matches(RE_PHONE_NUMBER);
114655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
114755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
114855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
114955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Enable or disable the ui. Cannot be called from non ui threads.
115055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param enabled
115155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
115255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    protected void doEnable(boolean enabled) {
115355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceLabel.setEnabled(enabled);
115455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceMode.setEnabled(enabled);
115555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
115655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDataLabel.setEnabled(enabled);
115755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDataMode.setEnabled(enabled);
115855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
115955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSpeedLabel.setEnabled(enabled);
116055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNetworkSpeed.setEnabled(enabled);
116155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
116255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatencyLabel.setEnabled(enabled);
116355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mNetworkLatency.setEnabled(enabled);
116455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
116555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Calling setEnabled on a text field will trigger a modifyText event, so we don't do it
116655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // if we don't need to.
116755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mPhoneNumber.isEnabled() != enabled) {
116855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mNumberLabel.setEnabled(enabled);
116955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPhoneNumber.setEnabled(enabled);
117055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
117155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
117255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        boolean valid = isValidPhoneNumber();
117355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
117455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mVoiceButton.setEnabled(enabled && valid);
117555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSmsButton.setEnabled(enabled && valid);
117655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
117755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        boolean smsValid = enabled && valid && mSmsButton.getSelection();
117855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
117955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // Calling setEnabled on a text field will trigger a modifyText event, so we don't do it
118055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // if we don't need to.
118155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mSmsMessage.isEnabled() != smsValid) {
118255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mMessageLabel.setEnabled(smsValid);
118355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mSmsMessage.setEnabled(smsValid);
118455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
118555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (enabled == false) {
118655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mSmsMessage.setText(""); //$NON-NLs-1$
118755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
118855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
118955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCallButton.setEnabled(enabled && valid);
119055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mCancelButton.setEnabled(enabled && valid && mVoiceButton.getSelection());
119155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
119255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (enabled == false) {
119355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mVoiceMode.clearSelection();
119455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mDataMode.clearSelection();
119555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mNetworkSpeed.clearSelection();
119655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mNetworkLatency.clearSelection();
119755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mPhoneNumber.getText().length() > 0) {
119855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mPhoneNumber.setText(""); //$NON-NLS-1$
119955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
120055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
120155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
120255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // location controls
120355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLocationFolders.setEnabled(enabled);
120455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
120555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mDecimalButton.setEnabled(enabled);
120655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mSexagesimalButton.setEnabled(enabled);
120755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLongitudeControls.setEnabled(enabled);
120855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mLatitudeControls.setEnabled(enabled);
120955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
121055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxUploadButton.setEnabled(enabled);
121155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxWayPointTable.setEnabled(enabled);
121255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mGpxTrackTable.setEnabled(enabled);
121355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlUploadButton.setEnabled(enabled);
121455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        mKmlWayPointTable.setEnabled(enabled);
121555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
121655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
121755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
121855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Returns the index of the combo item matching a specific GsmMode.
121955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param mode
122055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
122155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private int getGsmComboIndex(GsmMode mode) {
122255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (int i = 0 ; i < GSM_MODES.length; i++) {
122355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            String[] modes = GSM_MODES[i];
122455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            if (mode.getTag().equals(modes[1])) {
122555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                return i;
122655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
122755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
122855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return -1;
122955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
123055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
123155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
123255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * Processes the result of a command sent to the console.
123355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param result the result of the command.
123455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
123555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private boolean processCommandResult(final String result) {
123655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (result != EmulatorConsole.RESULT_OK) {
123755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            try {
123855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                mParent.getDisplay().asyncExec(new Runnable() {
1239ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                    @Override
124055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    public void run() {
124155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (mParent.isDisposed() == false) {
124255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            MessageDialog.openError(mParent.getShell(), "Emulator Console",
124355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    result);
124455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
124555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
124655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                });
124755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            } catch (SWTException e) {
124855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                // we're quitting, just ignore
124955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            }
12505542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
125155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            return false;
125255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
12535542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
125455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        return true;
125555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
125655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
125755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    /**
125855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     * @param track
125955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project     */
126055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void playTrack(final Track track) {
126155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // no need to synchronize this check, the worst that can happen, is we start the thread
126255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // for nothing.
126355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mEmulatorConsole != null) {
126455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayGpxButton.setImage(mPauseImage);
126555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayKmlButton.setImage(mPauseImage);
126655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayingTrack = true;
126755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
126855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayingThread = new Thread() {
126955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                @Override
127055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void run() {
127155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    try {
127255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        TrackPoint[] trackPoints = track.getPoints();
127355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        int count = trackPoints.length;
12745542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
127555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // get the start index.
127655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        int start = 0;
127755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (mPlayDirection == -1) {
127855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            start = count - 1;
127955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
12805542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
128155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        for (int p = start; p >= 0 && p < count; p += mPlayDirection) {
128255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            if (mPlayingTrack == false) {
128355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                return;
128455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            }
128555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
128655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // get the current point and send its location to
128755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // the emulator.
128855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            final TrackPoint trackPoint = trackPoints[p];
128955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
129055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            synchronized (EmulatorControlPanel.this) {
129155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                if (mEmulatorConsole == null ||
129255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        processCommandResult(mEmulatorConsole.sendLocation(
129355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                trackPoint.getLongitude(), trackPoint.getLatitude(),
129455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                trackPoint.getElevation())) == false) {
129555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    return;
129655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
129755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            }
129855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
129955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // if this is not the final point, then get the next one and
130055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // compute the delta time
130155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            int nextIndex = p + mPlayDirection;
130255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            if (nextIndex >=0 && nextIndex < count) {
130355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                TrackPoint nextPoint = trackPoints[nextIndex];
130455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
130555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                long delta = nextPoint.getTime() - trackPoint.getTime();
130655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                if (delta < 0) {
130755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    delta = -delta;
130855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
13095542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
131055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                long startTime = System.currentTimeMillis();
131155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
131255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                try {
131355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    sleep(delta / mSpeed);
131455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                } catch (InterruptedException e) {
131555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    if (mPlayingTrack == false) {
131655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        return;
131755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    }
13185542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
131955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    // we got interrupted, lets make sure we can play
132055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    do {
132155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        long waited = System.currentTimeMillis() - startTime;
132255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        long needToWait = delta / mSpeed;
132355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        if (waited < needToWait) {
132455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                            try {
132555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                sleep(needToWait - waited);
132655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                            } catch (InterruptedException e1) {
132755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                // we'll just loop and wait again if needed.
132855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                // unless we're supposed to stop
132955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                if (mPlayingTrack == false) {
133055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                    return;
133155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                }
133255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                            }
133355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        } else {
133455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                            break;
133555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        }
133655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    } while (true);
133755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
133855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            }
133955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
134055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    } finally {
134155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mPlayingTrack = false;
134255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        try {
134355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            mParent.getDisplay().asyncExec(new Runnable() {
1344ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                                @Override
134555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                public void run() {
134655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    if (mPlayGpxButton.isDisposed() == false) {
134755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        mPlayGpxButton.setImage(mPlayImage);
134855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        mPlayKmlButton.setImage(mPlayImage);
134955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    }
135055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
135155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            });
135255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        } catch (SWTException e) {
135355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // we're quitting, just ignore
135455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
135555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
135655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
135755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            };
135855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
135955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayingThread.start();
136055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
136155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
13625542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
136355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    private void playKml(final WayPoint[] trackPoints) {
136455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // no need to synchronize this check, the worst that can happen, is we start the thread
136555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        // for nothing.
136655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (mEmulatorConsole != null) {
136755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayGpxButton.setImage(mPauseImage);
136855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayKmlButton.setImage(mPauseImage);
136955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayingTrack = true;
137055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
137155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayingThread = new Thread() {
137255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                @Override
137355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                public void run() {
137455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    try {
137555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        int count = trackPoints.length;
13765542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
137755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        // get the start index.
137855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        int start = 0;
137955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        if (mPlayDirection == -1) {
138055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            start = count - 1;
138155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
13825542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
138355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        for (int p = start; p >= 0 && p < count; p += mPlayDirection) {
138455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            if (mPlayingTrack == false) {
138555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                return;
138655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            }
138755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
138855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // get the current point and send its location to
138955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // the emulator.
139055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            WayPoint trackPoint = trackPoints[p];
139155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
139255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            synchronized (EmulatorControlPanel.this) {
139355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                if (mEmulatorConsole == null ||
139455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        processCommandResult(mEmulatorConsole.sendLocation(
139555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                trackPoint.getLongitude(), trackPoint.getLatitude(),
139655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                trackPoint.getElevation())) == false) {
139755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    return;
139855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
139955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            }
140055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
140155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // if this is not the final point, then get the next one and
140255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // compute the delta time
140355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            int nextIndex = p + mPlayDirection;
140455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            if (nextIndex >=0 && nextIndex < count) {
140555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
140655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                long delta = 1000; // 1 second
140755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                if (delta < 0) {
140855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    delta = -delta;
140955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
14105542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
141155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                long startTime = System.currentTimeMillis();
141255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
141355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                try {
141455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    sleep(delta / mSpeed);
141555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                } catch (InterruptedException e) {
141655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    if (mPlayingTrack == false) {
141755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        return;
141855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    }
14195542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet
142055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    // we got interrupted, lets make sure we can play
142155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    do {
142255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        long waited = System.currentTimeMillis() - startTime;
142355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        long needToWait = delta / mSpeed;
142455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        if (waited < needToWait) {
142555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                            try {
142655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                sleep(needToWait - waited);
142755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                            } catch (InterruptedException e1) {
142855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                // we'll just loop and wait again if needed.
142955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                // unless we're supposed to stop
143055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                if (mPlayingTrack == false) {
143155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                    return;
143255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                                }
143355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                            }
143455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        } else {
143555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                            break;
143655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        }
143755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    } while (true);
143855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
143955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            }
144055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
144155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    } finally {
144255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        mPlayingTrack = false;
144355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        try {
144455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            mParent.getDisplay().asyncExec(new Runnable() {
1445ab36f4e7488358dea4ab6b54ee2b7bef3da0232bTor Norbye                                @Override
144655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                public void run() {
144755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    if (mPlayGpxButton.isDisposed() == false) {
144855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        mPlayGpxButton.setImage(mPlayImage);
144955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                        mPlayKmlButton.setImage(mPlayImage);
145055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                    }
145155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                                }
145255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            });
145355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        } catch (SWTException e) {
145455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                            // we're quitting, just ignore
145555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                        }
145655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                    }
145755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                }
145855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            };
145955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
146055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            mPlayingThread.start();
14615542fe492293223a81e604a49aa6fa55b1719847Xavier Ducrohet        }
146255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
146355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
1464