Index: editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/omni/OmniBoxControlContribution.java |
=================================================================== |
--- editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/omni/OmniBoxControlContribution.java (revision 2354) |
+++ editor/tools/plugins/com.google.dart.tools.ui/src/com/google/dart/tools/ui/omni/OmniBoxControlContribution.java (working copy) |
@@ -34,6 +34,8 @@ |
import org.eclipse.swt.widgets.Menu; |
import org.eclipse.swt.widgets.Text; |
import org.eclipse.ui.IWorkbenchWindow; |
+import org.eclipse.ui.PlatformUI; |
+import org.eclipse.ui.keys.IBindingService; |
import org.eclipse.ui.menus.WorkbenchWindowControlContribution; |
import java.util.HashMap; |
@@ -98,7 +100,7 @@ |
if (contrib == null) { |
return new Point(0, 0); |
} |
- return locationRelativeToControl(contrib.control); |
+ return locationRelativeToControl(contrib.textControl); |
} |
private static Point locationRelativeToControl(Text control) { |
@@ -106,7 +108,7 @@ |
+ POPUP_PIXEL_VERT_NUDGE); |
} |
- private Text control; |
+ private Text textControl; |
private boolean inControl; |
@@ -138,42 +140,28 @@ |
} |
public void giveFocus() { |
- cacheFocusControl(control.getDisplay().getFocusControl()); |
- control.setFocus(); |
+ cacheFocusControl(textControl.getDisplay().getFocusControl()); |
+ textControl.setFocus(); |
clearWatermark(); |
} |
@Override |
protected Control createControl(Composite parent) { |
- control = createTextControl(parent); |
+ textControl = createTextControl(parent); |
setWatermarkText(); |
hookupListeners(); |
CONTROL_MAP.put(getWorkbenchWindow(), this); |
- return control; |
+ return textControl; |
} |
protected void defocus() { |
if (previousFocusControl != null && !previousFocusControl.isDisposed()) { |
previousFocusControl.setFocus(); |
} else { |
- control.getParent().setFocus(); |
+ textControl.getParent().setFocus(); |
} |
} |
- protected void handleMouseEnter() { |
- inControl = true; |
- //cache on mouse enter to ensure we can restore focus after an invocation initiated by a mouse click |
- cacheFocusControl(control.getDisplay().getFocusControl()); |
- } |
- |
- protected void handleMouseExit() { |
- inControl = false; |
- } |
- |
- protected void handleSelection() { |
- clearWatermark(); |
- } |
- |
protected void refreshPopup() { |
if (popup != null && !popup.isDisposed()) { |
popup.refresh(getFilterText()); |
@@ -183,18 +171,18 @@ |
private void cacheFocusControl(Control focusControl) { |
//since the point of caching the control is to restore focus away from us, |
//ignore any sets to "self" |
- if (focusControl != control) { |
+ if (focusControl != textControl) { |
previousFocusControl = focusControl; |
} |
} |
private void clearWatermark() { |
//ensure watermark (or valid text) does not get re-cleared |
- if (control.getForeground().equals(OmniBoxColors.SEARCHBOX_TEXT_COLOR)) { |
+ if (textControl.getForeground().equals(OmniBoxColors.SEARCHBOX_TEXT_COLOR)) { |
return; |
} |
silentSetControlText(""); //$NON-NLS-1$ |
- control.setForeground(OmniBoxColors.SEARCHBOX_TEXT_COLOR); |
+ textControl.setForeground(OmniBoxColors.SEARCHBOX_TEXT_COLOR); |
} |
private Text createTextControl(Composite parent) { |
@@ -206,20 +194,111 @@ |
} |
private String getFilterText() { |
- return control.getText().toLowerCase(); |
+ return textControl.getText().toLowerCase(); |
} |
+ private void handleFocusGained() { |
+ //disable global keybinding handlers so we can trap copy/paste/etc |
+ ((IBindingService) PlatformUI.getWorkbench().getService(IBindingService.class)).setKeyFilterEnabled(false); |
+ clearWatermark(); |
+ } |
+ |
+ private void handleFocusLost() { |
+ //re-enable global keybinding handlers |
+ ((IBindingService) PlatformUI.getWorkbench().getService(IBindingService.class)).setKeyFilterEnabled(true); |
+ |
+ //GTK linux requires special casing to handle the case where a click |
+ //outside the search box (or popup) should cause the popup to close |
+ //We identify this case by keying off focus changes --- if focus |
+ //is transfered to another control we trigger a close |
+ if (Util.isLinux()) { |
+ //Exec async to ensure that it occurs after the focus change |
+ Display.getDefault().asyncExec(new Runnable() { |
+ @Override |
+ public void run() { |
+ Control focusControl = Display.getDefault().getFocusControl(); |
+ if (focusControl != textControl && popup != null && focusControl != popup.table) { |
+ popup.close(); |
+ } |
+ } |
+ }); |
+ } |
+ if (popupClosed()) { |
+ setWatermarkText(); |
+ } |
+ } |
+ |
+ private void handleKeyPressed(KeyEvent e) { |
+ if (SWT.ARROW_DOWN == e.keyCode) { |
+ if (popupClosed()) { |
+ openPopup(); |
+ refreshPopup(); |
+ } |
+ |
+ } |
+ |
+ if (popupClosed()) { |
+ //have escape defocus |
+ if (SWT.ESC == e.character) { |
+ defocus(); |
+ return; |
+ } |
+ //and don't let other control characters invoke the popup |
+ if (Character.isISOControl(e.character)) { |
+ return; |
+ } |
+ openPopup(); |
+ } |
+ |
+ if (popup != null && !popup.isDisposed()) { |
+ popup.sendKeyPress(e); |
+ } |
+ } |
+ |
+ private void handleModifyText() { |
+ if (!listenForTextModify) { |
+ return; |
+ } |
+ String filterText = getFilterText(); |
+ if (filterText.length() > 0) { |
+ if (popupClosed()) { |
+ openPopup(); |
+ } |
+ refreshPopup(); |
+ } else { |
+ popup.close(); |
+ } |
+ } |
+ |
+ private void handleMouseEnter() { |
+ inControl = true; |
+ //cache on mouse enter to ensure we can restore focus after an invocation initiated by a mouse click |
+ cacheFocusControl(textControl.getDisplay().getFocusControl()); |
+ } |
+ |
+ private void handleMouseExit() { |
+ inControl = false; |
+ } |
+ |
+ private void handleMouseUp() { |
+ if (inControl) { |
+ handleSelection(); |
+ } |
+ } |
+ |
+ private void handleSelection() { |
+ clearWatermark(); |
+ } |
+ |
private void hookupListeners() { |
- control.addMouseListener(new MouseAdapter() { |
+ textControl.addMouseListener(new MouseAdapter() { |
@Override |
public void mouseUp(MouseEvent e) { |
- if (inControl) { |
- handleSelection(); |
- } |
+ handleMouseUp(); |
} |
}); |
- control.addMouseTrackListener(new MouseTrackAdapter() { |
+ textControl.addMouseTrackListener(new MouseTrackAdapter() { |
@Override |
public void mouseEnter(MouseEvent e) { |
handleMouseEnter(); |
@@ -231,82 +310,29 @@ |
} |
}); |
- control.addModifyListener(new ModifyListener() { |
+ textControl.addModifyListener(new ModifyListener() { |
@Override |
public void modifyText(ModifyEvent e) { |
- if (!listenForTextModify) { |
- return; |
- } |
- String filterText = getFilterText(); |
- if (filterText.length() > 0) { |
- if (popupClosed()) { |
- openPopup(); |
- } |
- refreshPopup(); |
- } else { |
- popup.close(); |
- } |
+ handleModifyText(); |
} |
}); |
- control.addKeyListener(new KeyAdapter() { |
+ textControl.addKeyListener(new KeyAdapter() { |
@Override |
public void keyPressed(KeyEvent e) { |
- |
- if (SWT.ARROW_DOWN == e.keyCode) { |
- if (popupClosed()) { |
- openPopup(); |
- refreshPopup(); |
- } |
- |
- } |
- |
- if (popupClosed()) { |
- //have escape defocus |
- if (SWT.ESC == e.character) { |
- defocus(); |
- return; |
- } |
- //and don't let other control characters invoke the popup |
- if (Character.isISOControl(e.character)) { |
- return; |
- } |
- openPopup(); |
- } |
- |
- if (popup != null && !popup.isDisposed()) { |
- popup.sendKeyPress(e); |
- } |
+ handleKeyPressed(e); |
} |
}); |
- control.addFocusListener(new FocusListener() { |
+ textControl.addFocusListener(new FocusListener() { |
@Override |
public void focusGained(FocusEvent e) { |
- clearWatermark(); |
+ handleFocusGained(); |
} |
@Override |
public void focusLost(FocusEvent e) { |
- //GTK linux requires special casing to handle the case where a click |
- //outside the search box (or popup) should cause the popup to close |
- //We identify this case by keying off focus changes --- if focus |
- //is transfered to another control we trigger a close |
- if (Util.isLinux()) { |
- //Exec async to esnure that it occurs after the focus change |
- Display.getDefault().asyncExec(new Runnable() { |
- @Override |
- public void run() { |
- Control focusControl = Display.getDefault().getFocusControl(); |
- if (focusControl != control && popup != null && focusControl != popup.table) { |
- popup.close(); |
- } |
- } |
- }); |
- } |
- if (popupClosed()) { |
- setWatermarkText(); |
- } |
+ handleFocusLost(); |
} |
}); |
} |
@@ -322,27 +348,27 @@ |
@Override |
protected Point getDefaultLocation(Point initialSize) { |
- return locationRelativeToControl(control); |
+ return locationRelativeToControl(textControl); |
} |
@Override |
protected Point getDefaultSize() { |
- return new Point(control.getSize().x - POPUP_PIXEL_HORIZ_NUDGE * 2, 360); |
+ return new Point(textControl.getSize().x - POPUP_PIXEL_HORIZ_NUDGE * 2, 360); |
} |
}; |
- popup.setFilterControl(control); |
+ popup.setFilterControl(textControl); |
popup.open(); |
if (Util.isMac()) { |
- control.addListener(SWT.Deactivate, new Listener() { |
+ textControl.addListener(SWT.Deactivate, new Listener() { |
@Override |
public void handleEvent(Event event) { |
//selecting the scrollbar will deactivate but in that case we don't want to close |
if (event.display.getFocusControl() != popup.table) { |
popup.close(); |
} |
- control.removeListener(SWT.Deactivate, this); |
+ textControl.removeListener(SWT.Deactivate, this); |
} |
}); |
} |
@@ -354,13 +380,13 @@ |
private void setWatermarkText() { |
silentSetControlText(WATERMARK_TEXT); |
- control.setForeground(OmniBoxColors.WATERMARK_TEXT_COLOR); |
+ textControl.setForeground(OmniBoxColors.WATERMARK_TEXT_COLOR); |
} |
//set text without notifying listeners |
private void silentSetControlText(String txt) { |
listenForTextModify = false; |
- control.setText(txt); |
+ textControl.setText(txt); |
listenForTextModify = true; |
} |