OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / sdk / sdkmanager / libs / sdkuilib / src / com / android / sdkuilib / internal / widgets / AvdDetailsDialog.java
diff --git a/sdk/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdDetailsDialog.java b/sdk/sdkmanager/libs/sdkuilib/src/com/android/sdkuilib/internal/widgets/AvdDetailsDialog.java
new file mode 100644 (file)
index 0000000..409c25d
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * 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<<$
+}