Bug 551324 - Allow to hide text in Find Actions
tool contribution

The text for the Find Action but can now be configured based on the user
request. This follows the same pattern as the perspective switch.

The
ability to hide this toolitem has been removed, if that is required (the
other toolitems also don't have this) we could implement this later. The
correct place to implement this would IMHO be the Customize Perspective
dialog.

Change-Id: Ic5bcb9cae10af56555b23564053f9ac94afdc24a
Signed-off-by: Lars Vogel <Lars.Vogel@vogella.com>
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/IWorkbenchPreferenceConstants.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/IWorkbenchPreferenceConstants.java
index e77141a..17ede05 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/IWorkbenchPreferenceConstants.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/IWorkbenchPreferenceConstants.java
@@ -277,6 +277,22 @@
 	String SHOW_TEXT_ON_PERSPECTIVE_BAR = "SHOW_TEXT_ON_PERSPECTIVE_BAR"; //$NON-NLS-1$
 
 	/**
+	 * A named preference for whether the workbench should show text on the find
+	 * actions bar.
+	 *
+	 * Boolean-valued: <code>true</code>, if the application should show text on the
+	 * find action bar, <code>false</code> otherwise.
+	 * <p>
+	 * The default value for this preference is: <code>false</code> (do not show
+	 * text on the find actions bar)
+	 * </p>
+	 *
+	 * @since 3.117
+	 */
+
+	String SHOW_TEXT_ON_QUICK_ACCESS = "SHOW_TEXT_ON_QUICK_ACCESS"; //$NON-NLS-1$
+
+	/**
 	 * A named preference for whether the workbench should show the "open
 	 * perspective" button on the perspective bar.
 	 *
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/SearchField.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/SearchField.java
index 9ae8c1e..585882a 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/SearchField.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/quickaccess/SearchField.java
@@ -19,6 +19,9 @@
  ******************************************************************************/
 package org.eclipse.ui.internal.quickaccess;
 
+import static org.eclipse.swt.events.MenuListener.menuHiddenAdapter;
+import static org.eclipse.swt.events.SelectionListener.widgetSelectedAdapter;
+
 import java.util.Arrays;
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
@@ -33,23 +36,31 @@
 import org.eclipse.jface.bindings.Binding;
 import org.eclipse.jface.bindings.TriggerSequence;
 import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.RowLayout;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.ToolBar;
 import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.IWorkbenchPreferenceConstants;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.commands.ICommandImageService;
 import org.eclipse.ui.contexts.IContextService;
-import org.eclipse.ui.internal.WorkbenchPlugin;
+import org.eclipse.ui.internal.IPreferenceConstants;
+import org.eclipse.ui.internal.WorkbenchMessages;
+import org.eclipse.ui.internal.util.PrefUtil;
 import org.eclipse.ui.keys.IBindingService;
 
 public class SearchField {
@@ -133,26 +144,65 @@
 
 		ToolItem quickAccessToolItem = new ToolItem(toolbar, SWT.PUSH);
 
-		try {
-			quickAccessToolItem.setText(quickAccessCommand.getName());
-		} catch (NotDefinedException e) {
-			WorkbenchPlugin.log(e);
+		if (PrefUtil.getAPIPreferenceStore().getBoolean(IWorkbenchPreferenceConstants.SHOW_TEXT_ON_QUICK_ACCESS)) {
+				changeShowText(true, quickAccessToolItem);
 		}
+
 		ImageDescriptor imageDescriptor = commandImageService.getImageDescriptor(quickAccessCommand.getId());
 		if (imageDescriptor != null) {
 			Image image = imageDescriptor.createImage();
 			quickAccessToolItem.setImage(image);
 			quickAccessToolItem.addDisposeListener(e -> image.dispose());
 		}
-		toolbar.addMenuDetectListener(e -> {
-			if (toolbar.getMenu() == null) {
-				toolbar.setMenu(parent.getMenu());
-				e.doit = true;
-			}
+		toolbar.addMenuDetectListener(event -> {
+			openMenuFor(toolbar, quickAccessToolItem);
 		});
 		return quickAccessToolItem;
 	}
 
+	private void openMenuFor(ToolBar toolBar, ToolItem quickAccessToolItem) {
+		Menu menu = new Menu(toolBar);
+
+		new MenuItem(menu, SWT.SEPARATOR);
+		addShowTextItem(menu, quickAccessToolItem);
+
+		Rectangle bounds = toolBar.getBounds();
+		Point point = toolBar.toDisplay(bounds.x, bounds.y + bounds.height);
+		menu.setLocation(point.x, point.y);
+		menu.setVisible(true);
+		menu.addMenuListener(menuHiddenAdapter(e -> toolBar.getDisplay().asyncExec(menu::dispose)));
+	}
+
+	private void addShowTextItem(Menu menu, ToolItem quickAccessToolItem) {
+		MenuItem showtextMenuItem = new MenuItem(menu, SWT.CHECK);
+		showtextMenuItem.setText(WorkbenchMessages.PerspectiveBar_showText);
+		IPreferenceStore apiPreferenceStore = PrefUtil.getAPIPreferenceStore();
+		showtextMenuItem.addSelectionListener(widgetSelectedAdapter(e -> {
+			boolean preference = showtextMenuItem.getSelection();
+			if (preference != apiPreferenceStore
+					.getDefaultBoolean(IWorkbenchPreferenceConstants.SHOW_TEXT_ON_QUICK_ACCESS)) {
+				PrefUtil.getInternalPreferenceStore().setValue(IPreferenceConstants.OVERRIDE_PRESENTATION, true);
+			}
+			apiPreferenceStore.setValue(IWorkbenchPreferenceConstants.SHOW_TEXT_ON_QUICK_ACCESS, preference);
+			changeShowText(preference, quickAccessToolItem);
+		}));
+		showtextMenuItem
+				.setSelection(apiPreferenceStore.getBoolean(IWorkbenchPreferenceConstants.SHOW_TEXT_ON_QUICK_ACCESS));
+	}
+
+	private void changeShowText(boolean showText, ToolItem quickAccessToolItem) {
+		if (showText) {
+			try {
+				quickAccessToolItem.setText(quickAccessCommand.getName());
+			} catch (NotDefinedException e) {
+				e.printStackTrace();
+			}
+		} else {
+			quickAccessToolItem.setText(""); //$NON-NLS-1$
+		}
+		quickAccessButton.getParent().requestLayout();
+	}
+
 	private void updateQuickAccessText() {
 		if (quickAccessButton == null || quickAccessButton.isDisposed()) {
 			return;
diff --git a/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPreferenceInitializer.java b/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPreferenceInitializer.java
index 1b56469..e0196fe 100644
--- a/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPreferenceInitializer.java
+++ b/bundles/org.eclipse.ui/src/org/eclipse/ui/internal/UIPreferenceInitializer.java
@@ -78,6 +78,8 @@
 				IWorkbenchPreferenceConstants.SHOW_TEXT_ON_PERSPECTIVE_BAR,
 				false);
 		node.putBoolean(
+				IWorkbenchPreferenceConstants.SHOW_TEXT_ON_QUICK_ACCESS, false);
+		node.putBoolean(
 				IWorkbenchPreferenceConstants.SHOW_OTHER_IN_PERSPECTIVE_MENU,
 				true);
 		node.putBoolean(