summaryrefslogtreecommitdiff
path: root/src/plugins/snippets/src/com/motorola/studio/android/codesnippets/AndroidSnippetsStartup.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/snippets/src/com/motorola/studio/android/codesnippets/AndroidSnippetsStartup.java')
-rw-r--r--src/plugins/snippets/src/com/motorola/studio/android/codesnippets/AndroidSnippetsStartup.java338
1 files changed, 338 insertions, 0 deletions
diff --git a/src/plugins/snippets/src/com/motorola/studio/android/codesnippets/AndroidSnippetsStartup.java b/src/plugins/snippets/src/com/motorola/studio/android/codesnippets/AndroidSnippetsStartup.java
new file mode 100644
index 0000000..e555654
--- /dev/null
+++ b/src/plugins/snippets/src/com/motorola/studio/android/codesnippets/AndroidSnippetsStartup.java
@@ -0,0 +1,338 @@
+/*
+* Copyright (C) 2012 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.motorola.studio.android.codesnippets;
+
+import org.eclipse.gef.ui.palette.PaletteViewer;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.swt.events.DragDetectEvent;
+import org.eclipse.swt.events.DragDetectListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.IPerspectiveListener;
+import org.eclipse.ui.IStartup;
+import org.eclipse.ui.IViewReference;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchPartReference;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PerspectiveAdapter;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
+import org.eclipse.wst.common.snippets.internal.ui.SnippetsView;
+
+import com.motorola.studio.android.common.utilities.EclipseUtils;
+
+/**
+ * This class register listeners in the Snippets View to monitor changes on its
+ * selection. This way, MOTODEV Studio for Android displays the snippet preview
+ * when appropriate
+ *
+ */
+@SuppressWarnings("restriction")
+public class AndroidSnippetsStartup implements IStartup
+{
+
+ public final static String SNIPPETS_VIEW_ID =
+ "org.eclipse.wst.common.snippets.internal.ui.SnippetsView";
+
+ private static SnippetsViewContributionItem searchContributionItem;
+
+ private static TooltipDisplayConfigContriutionItem tooltipDisplayConfigcontributionItem;
+
+ /*
+ * The tool tip being displayed
+ */
+ private AndroidSnippetsTooltip tooltip = null;
+
+ private static void addSearchBar(final SnippetsView view)
+ {
+ if (searchContributionItem == null)
+ {
+ ToolBarManager tbManager =
+ (ToolBarManager) view.getViewSite().getActionBars().getToolBarManager();
+
+ // the item which searches for words within snippets titles, descriptions and codes
+ searchContributionItem = new SnippetsViewContributionItem(view);
+
+ tbManager.add(searchContributionItem);
+ tbManager.update(true);
+ view.getViewSite().getActionBars().updateActionBars();
+ }
+
+ if (tooltipDisplayConfigcontributionItem == null)
+ {
+ ToolBarManager tbManager =
+ (ToolBarManager) view.getViewSite().getActionBars().getToolBarManager();
+
+ // the item which configures the display of the tool tip
+ tooltipDisplayConfigcontributionItem = new TooltipDisplayConfigContriutionItem();
+
+ tbManager.add(tooltipDisplayConfigcontributionItem);
+ tbManager.update(true);
+ view.getViewSite().getActionBars().updateActionBars();
+ }
+ }
+
+ /**
+ * Add a mouse listener to Snippets View
+ * Open the snippet preview tooltip when the user clicks on a
+ * snippet item.
+ * Close it when he clicks again in the same item
+ *
+ * @see org.eclipse.ui.IStartup#earlyStartup()
+ */
+ public void earlyStartup()
+ {
+
+ /*
+ * This is the listener responsible for monitoring mouse clicks
+ * on snippet items. When the user clicks on an item, it triggers
+ * the action to display the snippet preview
+ */
+ final MouseListener snippetsMouseListener = new MouseListener()
+ {
+ /**
+ * Do nothing
+ *
+ * @see org.eclipse.swt.events.MouseListener#mouseUp(org.eclipse.swt.events.MouseEvent)
+ */
+ public void mouseUp(MouseEvent e)
+ {
+ // nothing
+ }
+
+ /**
+ * Open/Toogle tooltip
+ *
+ * @see org.eclipse.swt.events.MouseListener#mouseDown(org.eclipse.swt.events.MouseEvent)
+ */
+ public void mouseDown(MouseEvent e)
+ {
+
+ // get the Snippets View
+ SnippetsView snippetsView =
+ (SnippetsView) EclipseUtils.getActiveView(SNIPPETS_VIEW_ID);
+
+ // get the selected snippet
+ ISnippetsEntry snippetEntry = snippetsView.getSelectedEntry();
+
+ // check the tooltip is already being displayed
+ // open it if it's not and its config allows so, close it otherwise
+ if ((snippetEntry instanceof ISnippetItem)
+ && ((tooltip == null) || (!tooltip.getItem().equals(snippetEntry)))
+ && tooltipDisplayConfigcontributionItem.isTooltipDisplayed())
+ {
+ Control snippetsControl = snippetsView.getViewer().getControl();
+ tooltip =
+ new AndroidSnippetsTooltip((ISnippetItem) snippetEntry, snippetsControl);
+ tooltip.setPopupDelay(250);
+ tooltip.show(new Point(snippetsControl.getBounds().width, 0));
+
+ }
+ else
+ {
+ if (tooltip != null)
+ {
+ tooltip.hide();
+ }
+ tooltip = null;
+ }
+ }
+
+ /**
+ * Hide tooltip
+ *
+ * @see org.eclipse.swt.events.MouseListener#mouseDoubleClick(org.eclipse.swt.events.MouseEvent)
+ */
+ public void mouseDoubleClick(MouseEvent e)
+ {
+ if (tooltip != null)
+ {
+ tooltip.hide();
+ }
+ tooltip = null;
+ }
+ };
+
+ /**
+ * this listener is called when the mouse is dragged. It simply
+ * hides the tool tip when this action occurs.
+ */
+ final DragDetectListener snippetsMouseDragListener = new DragDetectListener()
+ {
+
+ /**
+ * Hide the tool tip.
+ */
+ public void dragDetected(DragDetectEvent e)
+ {
+ // simply hide the tool tip
+ if (tooltip != null)
+ {
+ tooltip.hide();
+ }
+ }
+ };
+
+ /*
+ * This is the listener that is attached to the workspace and monitor
+ * perspectives activation, as well as changes in the views being displayed
+ * (for example: view opened/closed). It intends to attach the snippetsMouseListener
+ * listener declared above in the Snippets View being used by Eclipse
+ */
+ final IPerspectiveListener perspectiveListener = new PerspectiveAdapter()
+ {
+ // Set if it has already been executed
+ // If so, it doesn't need to be executed again
+ boolean executed = false;
+
+ /**
+ * This action is called when the user goes to another perspective (it's not called for the first perspective
+ * displayed when he opens Eclipse)
+ *
+ * @see org.eclipse.ui.PerspectiveAdapter#perspectiveActivated(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor)
+ */
+ @Override
+ public void perspectiveActivated(IWorkbenchPage page, IPerspectiveDescriptor perspective)
+ {
+ IViewReference[] viewReferences = page.getViewReferences();
+ for (IViewReference viewReference : viewReferences)
+ {
+ if (SNIPPETS_VIEW_ID.equals(viewReference.getId()))
+ {
+ SnippetsView snippetsView = (SnippetsView) viewReference.getView(true);
+ if (snippetsView != null)
+ {
+ addSearchBar(snippetsView);
+ PaletteViewer palleteViewer = snippetsView.getViewer();
+ if (palleteViewer != null)
+ {
+ Control control = palleteViewer.getControl();
+ if (control != null)
+ {
+ control.removeMouseListener(snippetsMouseListener); // remove mouse listener just to ensure we never have two listeners registered
+ control.removeDragDetectListener(snippetsMouseDragListener); // remove mouse draggable listener just to ensure we never have two listeners registered
+ control.addMouseListener(snippetsMouseListener);
+ control.addDragDetectListener(snippetsMouseDragListener);
+ executed = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * This is called when something in the perspective have changed.
+ * For example: when a view is opened or closed
+ *
+ * @see org.eclipse.ui.PerspectiveAdapter#perspectiveChanged(org.eclipse.ui.IWorkbenchPage, org.eclipse.ui.IPerspectiveDescriptor, org.eclipse.ui.IWorkbenchPartReference, java.lang.String)
+ */
+ @Override
+ public void perspectiveChanged(IWorkbenchPage page, IPerspectiveDescriptor perspective,
+ IWorkbenchPartReference partRef, String changeId)
+ {
+ // check if it's the Snippet View
+ if (SNIPPETS_VIEW_ID.equals(partRef.getId()))
+ {
+ // if it's the Snippet View and it's being OPENED
+ if (IWorkbenchPage.CHANGE_VIEW_SHOW.equals(changeId))
+ {
+ if (!executed)
+ {
+ SnippetsView snippetsView = (SnippetsView) partRef.getPart(false);
+ addSearchBar(snippetsView);
+ snippetsView.getViewer().getControl()
+ .removeMouseListener(snippetsMouseListener); // remove mouse listener just to ensure we never have two listeners registered
+ snippetsView.getViewer().getControl()
+ .removeDragDetectListener(snippetsMouseDragListener); // remove mouse draggable listener just to ensure we never have two liseteners registered
+ snippetsView.getViewer().getControl()
+ .addMouseListener(snippetsMouseListener);
+ snippetsView.getViewer().getControl()
+ .addDragDetectListener(snippetsMouseDragListener);
+ // it doesn't need to add the mouse listener to the Snippets View in further opportunities
+ executed = true;
+ }
+ }
+ // if it's the Snippet View and it's being CLOSED
+ else if (IWorkbenchPage.CHANGE_VIEW_HIDE.equals(changeId))
+ {
+ // it must add the mouse listener to the Snippets View again next time the view is opened
+ if (searchContributionItem != null)
+ {
+ searchContributionItem.clean();
+ searchContributionItem.getParent().remove(searchContributionItem);
+ }
+
+ if (tooltipDisplayConfigcontributionItem != null) {
+ tooltipDisplayConfigcontributionItem.getParent().remove(tooltipDisplayConfigcontributionItem);
+ }
+
+ searchContributionItem = null;
+ tooltipDisplayConfigcontributionItem = null;
+
+ executed = false;
+ }
+ }
+
+ }
+
+ };
+
+ /*
+ * Attach the perspectiveListener declared above into the active window
+ * Also try to add the snippetsMouseListener listener to the Snippet View,
+ * if it's already being displayed
+ */
+ PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
+ {
+
+ public void run()
+ {
+ /*
+ * Add mouse listener to Snippet View
+ */
+ final IWorkbenchWindow activeWindow =
+ PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+
+ activeWindow.addPerspectiveListener(perspectiveListener);
+
+ IViewReference viewReference =
+ activeWindow.getActivePage().findViewReference(SNIPPETS_VIEW_ID);
+
+ if (viewReference != null)
+ {
+ final SnippetsView snippetsView = (SnippetsView) viewReference.getView(true);
+ if (snippetsView != null)
+ {
+ addSearchBar(snippetsView);
+ snippetsView.getViewer().getControl()
+ .addMouseListener(snippetsMouseListener);
+ snippetsView.getViewer().getControl()
+ .addDragDetectListener(snippetsMouseDragListener);
+ }
+
+ }
+
+ }
+
+ });
+
+ }
+} \ No newline at end of file