/* * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.sdkuilib.internal.widgets; import com.android.sdklib.AndroidVersion; import com.android.sdklib.IAndroidTarget; import com.android.sdklib.internal.avd.AvdManager; import com.android.sdklib.internal.avd.AvdManager.AvdInfo; import com.android.sdklib.internal.avd.AvdManager.AvdInfo.AvdStatus; import org.eclipse.swt.SWT; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Dialog; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Dialog displaying the details of an AVD. */ final class AvdDetailsDialog extends Dialog { /** Last dialog size for this session. */ private static Point sLastSize; private Shell mDialogShell; private final AvdInfo mAvdInfo; private Composite mRootComposite; public AvdDetailsDialog(Shell shell, AvdInfo avdInfo) { super(shell, SWT.APPLICATION_MODAL); mAvdInfo = avdInfo; setText("AVD details"); } /** * Open the dialog and blocks till it gets closed */ public void open() { createContents(); positionShell(); //$hide$ (hide from SWT designer) mDialogShell.open(); mDialogShell.layout(); Display display = getParent().getDisplay(); while (!mDialogShell.isDisposed()) { if (!display.readAndDispatch()) { display.sleep(); } } if (!mDialogShell.isDisposed()) { sLastSize = mDialogShell.getSize(); mDialogShell.close(); } } /** * Create contents of the dialog. */ private void createContents() { mDialogShell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.RESIZE); mDialogShell.setLayout(new GridLayout(1, false)); mDialogShell.setSize(450, 300); mDialogShell.setText(getText()); mRootComposite = new Composite(mDialogShell, SWT.NONE); mRootComposite.setLayout(new GridLayout(2, false)); mRootComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); GridLayout gl; Composite c = new Composite(mRootComposite, SWT.NONE); c.setLayout(gl = new GridLayout(2, false)); gl.marginHeight = gl.marginWidth = 0; c.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); if (mAvdInfo != null) { displayValue(c, "Name:", mAvdInfo.getName()); displayValue(c, "Path:", mAvdInfo.getPath()); if (mAvdInfo.getStatus() != AvdStatus.OK) { displayValue(c, "Error:", mAvdInfo.getErrorMessage()); } else { IAndroidTarget target = mAvdInfo.getTarget(); AndroidVersion version = target.getVersion(); displayValue(c, "Target:", String.format("%s (API level %s)", target.getName(), version.getApiString())); // display some extra values. Map<String, String> properties = mAvdInfo.getProperties(); if (properties != null) { String skin = properties.get(AvdManager.AVD_INI_SKIN_NAME); if (skin != null) { displayValue(c, "Skin:", skin); } String sdcard = properties.get(AvdManager.AVD_INI_SDCARD_SIZE); if (sdcard == null) { sdcard = properties.get(AvdManager.AVD_INI_SDCARD_PATH); } if (sdcard != null) { displayValue(c, "SD Card:", sdcard); } String snapshot = properties.get(AvdManager.AVD_INI_SNAPSHOT_PRESENT); if (snapshot != null) { displayValue(c, "Snapshot:", snapshot); } // display other hardware HashMap<String, String> copy = new HashMap<String, String>(properties); // remove stuff we already displayed (or that we don't want to display) copy.remove(AvdManager.AVD_INI_SKIN_NAME); copy.remove(AvdManager.AVD_INI_SKIN_PATH); copy.remove(AvdManager.AVD_INI_SDCARD_SIZE); copy.remove(AvdManager.AVD_INI_SDCARD_PATH); copy.remove(AvdManager.AVD_INI_IMAGES_1); copy.remove(AvdManager.AVD_INI_IMAGES_2); if (copy.size() > 0) { Label l = new Label(mRootComposite, SWT.SEPARATOR | SWT.HORIZONTAL); l.setLayoutData(new GridData( GridData.FILL, GridData.CENTER, false, false, 2, 1)); c = new Composite(mRootComposite, SWT.NONE); c.setLayout(gl = new GridLayout(2, false)); gl.marginHeight = gl.marginWidth = 0; c.setLayoutData(new GridData(GridData.FILL_BOTH)); Set<String> keys = copy.keySet(); for (String key : keys) { displayValue(c, key + ":", copy.get(key)); } } } } } } // -- Start of internal part ---------- // Hide everything down-below from SWT designer //$hide>>$ /** * Displays a value with a label. * * @param parent the parent Composite in which to display the value. This Composite must use a * {@link GridLayout} with 2 columns. * @param label the label of the value to display. * @param value the string value to display. */ private void displayValue(Composite parent, String label, String value) { Label l = new Label(parent, SWT.NONE); l.setText(label); l.setLayoutData(new GridData(GridData.END, GridData.CENTER, false, false)); l = new Label(parent, SWT.NONE); l.setText(value); l.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false)); } /** * Centers the dialog in its parent shell. */ private void positionShell() { // Centers the dialog in its parent shell Shell child = mDialogShell; Shell parent = getParent(); if (child != null && parent != null) { // get the parent client area with a location relative to the display Rectangle parentArea = parent.getClientArea(); Point parentLoc = parent.getLocation(); int px = parentLoc.x; int py = parentLoc.y; int pw = parentArea.width; int ph = parentArea.height; // Reuse the last size if there's one, otherwise use the default Point childSize = sLastSize != null ? sLastSize : child.getSize(); int cw = childSize.x; int ch = childSize.y; child.setLocation(px + (pw - cw) / 2, py + (ph - ch) / 2); child.setSize(cw, ch); } } // End of hiding from SWT Designer //$hide<<$ }