package com.mobilesorcery.sdk.ui.internal.help; import java.net.URL; import java.net.URLEncoder; import java.text.MessageFormat; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.help.IContextProvider; import org.eclipse.jface.fieldassist.TextContentAdapter; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.util.Policy; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.SWT; import org.eclipse.swt.events.PaintEvent; import org.eclipse.swt.events.PaintListener; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.graphics.GC; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.ISelectionListener; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.menus.WorkbenchWindowControlContribution; import com.mobilesorcery.sdk.core.Util; import com.mobilesorcery.sdk.ui.MosyncUIPlugin; import com.mobilesorcery.sdk.ui.UIUtils; public class SearchBox extends WorkbenchWindowControlContribution implements ISelectionListener { private String pendingQuery = null; private boolean usePendingQuery = true; public SearchBox() { } public SearchBox(String id) { super(id); } public void dispose() { getWorkbenchWindow().getSelectionService().removePostSelectionListener(this); } @Override protected Control createControl(Composite parent) { Composite main = new Composite(parent, SWT.NONE); main.setLayout(UIUtils.newPrefsLayout(1)); getWorkbenchWindow().getSelectionService().addPostSelectionListener(this); final Text searchText = new Text(main, SWT.SINGLE | SWT.BORDER | SWT.SEARCH | SWT.CANCEL); searchText.setLayoutData(new GridData(4 * UIUtils.getDefaultFieldSize() / 5, SWT.DEFAULT)); TextContentAdapter adapter = new TextContentAdapter(); final Rectangle iconBounds = adapter.getInsertionBounds(searchText); final Image searchIcon = MosyncUIPlugin.resize(MosyncUIPlugin.getDefault().getImageRegistry().get(MosyncUIPlugin.IMG_LOOKUP), SWT.DEFAULT, iconBounds.height, false, true); searchText.addPaintListener(new PaintListener() { @Override public void paintControl(PaintEvent e) { GC gc = e.gc; if (searchText.getText().isEmpty() && !searchText.isFocusControl()) { String text = "Search Online Docs"; Point extent = gc.textExtent(text); int textX = e.x + (e.width - extent.x) / 2; int textY = e.y + (e.height - extent.y) / 2; if (searchIcon != null) { int iconX = e.x + e.width - iconBounds.width - 20; int iconY = e.y + iconBounds.y; textX = (e.x + iconX - extent.x) / 2; gc.drawImage(searchIcon, iconX, iconY); } Color oldColor = gc.getForeground(); gc.setForeground(e.display.getSystemColor(SWT.COLOR_GRAY)); e.gc.drawText(text, textX, textY); gc.setForeground(oldColor); } } }); searchText.addListener(SWT.KeyUp, new Listener() { @Override public void handleEvent(Event event) { if (event.keyCode == SWT.CR && !searchText.getText().isEmpty()) { usePendingQuery = true; pendingQuery = null; URL url = createSearchURL(searchText.getText()); if (url != null) { try { PlatformUI.getWorkbench().getBrowserSupport().getExternalBrowser().openURL(url); } catch (PartInitException e) { Policy.getStatusHandler().show(new Status(IStatus.ERROR, MosyncUIPlugin.PLUGIN_ID, "Cannot load browser"), "Cannot load browser"); } } } } }); searchText.addListener(SWT.FocusIn, new Listener() { @Override public void handleEvent(Event event) { if (!Util.isEmpty(pendingQuery) && usePendingQuery) { searchText.setText(pendingQuery); event.display.asyncExec(new Runnable() { @Override public void run() { // Bah. This will be called after mouseup searchText.selectAll(); } }); } } }); searchText.addListener(SWT.MouseUp, new Listener() { @Override public void handleEvent(Event event) { if (pendingQuery != null && usePendingQuery) { pendingQuery = null; searchText.selectAll(); } } }); searchText.addListener(SWT.KeyDown, new Listener() { @Override public void handleEvent(Event event) { usePendingQuery = !searchText.getText().isEmpty(); } }); return main; } protected URL createSearchURL(String searchQuery) { try { return new URL(MessageFormat.format("http://www.mosync.com/content/search-mosync?as_q={0}&src=ide", URLEncoder.encode(searchQuery, "UTF-8"))); } catch (Exception e) { return null; } } @Override public void selectionChanged(IWorkbenchPart part, ISelection selection) { IContextProvider ctx = (IContextProvider) part.getAdapter(IContextProvider.class); if (ctx != null) { pendingQuery = ctx.getSearchExpression(selection); } else { if (selection instanceof ITextSelection) { pendingQuery = ((ITextSelection) selection).getText(); } } } }