OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / sdk / eclipse / plugins / com.android.ide.eclipse.adt / src / com / android / ide / eclipse / adt / internal / editors / layout / gle2 / PropertySheetPage.java
diff --git a/sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PropertySheetPage.java b/sdk/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/PropertySheetPage.java
new file mode 100644 (file)
index 0000000..d33fffc
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * Copyright (C) 2010 The Android Open Source Project
+ *
+ * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php
+ *
+ * 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.ide.eclipse.adt.internal.editors.layout.gle2;
+
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.MouseAdapter;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.graphics.Color;
+import org.eclipse.swt.graphics.GC;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.graphics.Region;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Tree;
+import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.ui.IActionBars;
+import org.eclipse.ui.views.properties.IPropertySheetEntry;
+import org.eclipse.ui.views.properties.PropertySheetEntry;
+
+/**
+ * A customized property sheet page for the graphical layout editor v2.
+ * <p/>
+ * Currently it just provides a custom tooltip to display attributes javadocs.
+ * <p/>
+ * The property sheet is linked to the current site's selection service.
+ * <p/>
+ * Note: this is an exact copy of GLE1's UiPropertySheetPage implementation.
+ * The idea is that eventually GLE1 will go away and we'll upgrade this to be
+ * a more robust property editor (it currently lacks on so many levels, it's not
+ * even worth listing the flaws.)
+ *
+ * @since GLE2
+ */
+public class PropertySheetPage extends org.eclipse.ui.views.properties.PropertySheetPage {
+
+    public PropertySheetPage() {
+        super();
+    }
+
+    @Override
+    public void createControl(Composite parent) {
+        super.createControl(parent);
+
+        setupTooltip();
+
+        // Override parent class' "set status message" behavior. The parent will set
+        // the status message to the property's "getDescription()" field. That field
+        // may contain newlines, which means the text gets cut off. We want to instead
+        // show ALL the text, fit on a single line, and since we don't get to subclass
+        // the viewer we will just replace the status message with our own, which works
+        // since our mouse listener is registered later so runs later.
+        final Tree tree = (Tree) getControl();
+        tree.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseDown(MouseEvent event) {
+                Point pt = new Point(event.x, event.y);
+                TreeItem item = tree.getItem(pt);
+                if (item != null) {
+                    Object object = item.getData();
+                    if (object instanceof IPropertySheetEntry) {
+                        IPropertySheetEntry entry = (IPropertySheetEntry) object;
+                        String help = entry.getDescription();
+                        if (help != null) {
+                            // Strip out newlines to make this a single line entry
+                            help = help.replace('\n', ' ');
+                            // Remove repeated spaces in case there were trailing spaces
+                            help = help.replaceAll("  ", " "); //$NON-NLS-1$ //$NON-NLS-2$
+                            IActionBars actionBars = getSite().getActionBars();
+                            IStatusLineManager status = actionBars.getStatusLineManager();
+                            status.setMessage(help);
+                        }
+                    }
+                }
+            }
+        });
+
+        // Fix the selection background. In Eclipse 3.5 and 3.6, the selection color
+        // is white, painted on top of a white or light blue background (table striping),
+        // which is practically unreadable.  This is fixed in 3.7M3, but we need a workaround
+        // for earlier releases. The following code performs custom painting of this region,
+        // and is based on the snippet "draw a custom gradient selection for tree" (snippet 226)
+        // from http://www.eclipse.org/swt/snippets/ .
+        tree.addListener(SWT.EraseItem, new Listener() {
+            public void handleEvent(Event event) {
+                if ((event.detail & SWT.SELECTED) != 0) {
+                    GC gc = event.gc;
+                    Rectangle area = tree.getClientArea();
+                    int columnCount = tree.getColumnCount();
+                    if (event.index == columnCount - 1 || columnCount == 0) {
+                        int width = area.x + area.width - event.x;
+                        if (width > 0) {
+                            Region region = new Region();
+                            gc.getClipping(region);
+                            region.add(event.x, event.y, width, event.height);
+                            gc.setClipping(region);
+                            region.dispose();
+                        }
+                    }
+                    gc.setAdvanced(true);
+                    if (gc.getAdvanced()) {
+                        gc.setAlpha(127);
+                    }
+                    Rectangle rect = event.getBounds();
+                    Color foreground = gc.getForeground();
+                    Color background = gc.getBackground();
+                    Display display = tree.getDisplay();
+                    gc.setForeground(display.getSystemColor(SWT.COLOR_LIST_SELECTION));
+                    gc.setBackground(display.getSystemColor(SWT.COLOR_LIST_BACKGROUND));
+                    gc.fillGradientRectangle(0, rect.y, 500, rect.height, false);
+                    gc.setForeground(foreground);
+                    gc.setBackground(background);
+                    event.detail &= ~SWT.SELECTED;
+                }
+            }
+        });
+    }
+
+    /**
+     * Sets up a custom tooltip when hovering over tree items.
+     * <p/>
+     * The tooltip will display the element's javadoc, if any, or the item's getText otherwise.
+     */
+    private void setupTooltip() {
+        final Tree tree = (Tree) getControl();
+
+        /*
+         * Reference:
+         * http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet125.java?view=markup
+         */
+
+        final Listener listener = new Listener() {
+            Shell tip = null;
+            Label label  = null;
+
+            public void handleEvent(Event event) {
+                switch(event.type) {
+                case SWT.Dispose:
+                case SWT.KeyDown:
+                case SWT.MouseExit:
+                case SWT.MouseDown:
+                case SWT.MouseMove:
+                    if (tip != null) {
+                        tip.dispose();
+                        tip = null;
+                        label = null;
+                    }
+                    break;
+                case SWT.MouseHover:
+                    if (tip != null) {
+                        tip.dispose();
+                        tip = null;
+                        label = null;
+                    }
+
+                    String tooltip = null;
+
+                    TreeItem item = tree.getItem(new Point(event.x, event.y));
+                    if (item != null) {
+                        Object data = item.getData();
+                        if (data instanceof PropertySheetEntry) {
+                            tooltip = ((PropertySheetEntry) data).getDescription();
+                        }
+
+                        if (tooltip == null) {
+                            tooltip = item.getText();
+                        } else {
+                            tooltip = item.getText() + ":\r" + tooltip;
+                        }
+
+                        if (tooltip != null) {
+                            Shell shell = tree.getShell();
+                            Display display = tree.getDisplay();
+
+                            tip = new Shell(shell, SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
+                            tip.setBackground(display .getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+                            FillLayout layout = new FillLayout();
+                            layout.marginWidth = 2;
+                            tip.setLayout(layout);
+                            label = new Label(tip, SWT.NONE);
+                            label.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+                            label.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+                            label.setData("_TABLEITEM", item);
+                            label.setText(tooltip);
+                            label.addListener(SWT.MouseExit, this);
+                            label.addListener(SWT.MouseDown, this);
+                            Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+                            Rectangle rect = item.getBounds(0);
+                            // Display the tooltip on the same line as the property,
+                            // but offset to the right of wherever the mouse cursor was,
+                            // such that it does not obscure the list of properties.
+                            Point pt = tree.toDisplay(event.x + 15, rect.y);
+                            tip.setBounds(pt.x, pt.y, size.x, size.y);
+                            tip.setVisible(true);
+                        }
+                    }
+                }
+            }
+        };
+
+        tree.addListener(SWT.Dispose, listener);
+        tree.addListener(SWT.KeyDown, listener);
+        tree.addListener(SWT.MouseMove, listener);
+        tree.addListener(SWT.MouseHover, listener);
+
+    }
+
+}