diff options
author | Tor Norbye <tnorbye@google.com> | 2012-05-15 06:56:49 -0700 |
---|---|---|
committer | android code review <noreply-gerritcodereview@google.com> | 2012-05-15 06:56:50 -0700 |
commit | c17a31c18255b1ac3d4bc8a010d319e4dc545a2e (patch) | |
tree | bfc9b0e07adef3e364b784a02a03ed1adcb75b19 | |
parent | 6f5a197232c3a3d34f197f591a47e4cb2b538807 (diff) | |
parent | 1f6650ac4338fe0eab9874f72cee21c231412d31 (diff) | |
download | eclipse-windowbuilder-c17a31c18255b1ac3d4bc8a010d319e4dc545a2e.tar.gz |
Merge "Fix propertysheet mouse handling"
-rw-r--r-- | propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractTextPropertyEditor.java | 78 |
1 files changed, 63 insertions, 15 deletions
diff --git a/propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractTextPropertyEditor.java b/propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractTextPropertyEditor.java index 1cf9574..1ee9237 100644 --- a/propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractTextPropertyEditor.java +++ b/propertysheet/src/org/eclipse/wb/internal/core/model/property/editor/AbstractTextPropertyEditor.java @@ -12,6 +12,9 @@ package org.eclipse.wb.internal.core.model.property.editor; import org.eclipse.jface.bindings.keys.KeyStroke; import org.eclipse.jface.fieldassist.ContentProposalAdapter; +import org.eclipse.jface.fieldassist.IContentProposal; +import org.eclipse.jface.fieldassist.IContentProposalListener; +import org.eclipse.jface.fieldassist.IContentProposalListener2; import org.eclipse.jface.fieldassist.IContentProposalProvider; import org.eclipse.jface.fieldassist.IControlContentAdapter; import org.eclipse.jface.fieldassist.TextContentAdapter; @@ -51,25 +54,35 @@ public abstract class AbstractTextPropertyEditor extends TextDisplayPropertyEdit // that we can open the dialog up immediately on focus gain to show all available // alternatives (the default implementation requires at least one keytroke before // it shows up) - private static class ImmediateProposalAdapter extends ContentProposalAdapter { - public ImmediateProposalAdapter(Text control, + private class ImmediateProposalAdapter extends ContentProposalAdapter + implements FocusListener, IContentProposalListener, IContentProposalListener2 { + private final PropertyTable m_propertyTable; + public ImmediateProposalAdapter( + Text control, IControlContentAdapter controlContentAdapter, - IContentProposalProvider proposalProvider, KeyStroke keyStroke, - char[] autoActivationCharacters) { + IContentProposalProvider proposalProvider, + KeyStroke keyStroke, + char[] autoActivationCharacters, + PropertyTable propertyTable) { super(control, controlContentAdapter, proposalProvider, keyStroke, autoActivationCharacters); + m_propertyTable = propertyTable; // On focus gain, start completing - control.addFocusListener(new FocusListener() { - @Override - public void focusGained(FocusEvent event) { - openIfNecessary(); - } + control.addFocusListener(this); - @Override - public void focusLost(FocusEvent event) { - } - }); + // Listen on popup open and close events, in order to disable + // focus handling on the textfield during those events. + // This is necessary since otherwise as soon as the user clicks + // on the popup with the mouse, the text field loses focus, and + // then instantly closes the popup -- without the selection being + // applied. See for example + // http://dev.eclipse.org/viewcvs/viewvc.cgi/org.eclipse.jface.snippets/ + // Eclipse%20JFace%20Snippets/org/eclipse/jface/snippets/viewers/ + // Snippet060TextCellEditorWithContentProposal.java?view=markup + // for another example of this technique. + addContentProposalListener((IContentProposalListener) this); + addContentProposalListener((IContentProposalListener2) this); /* Triggering on empty is disabled for now: it has the unfortunate side-effect that it's impossible to enter a blank text field - blank matches everything, @@ -99,6 +112,37 @@ public abstract class AbstractTextPropertyEditor extends TextDisplayPropertyEdit } }); } + + // ---- Implements FocusListener ---- + + @Override + public void focusGained(FocusEvent event) { + openIfNecessary(); + } + + @Override + public void focusLost(FocusEvent event) { + } + + // ---- Implements IContentProposalListener ---- + + @Override + public void proposalAccepted(IContentProposal proposal) { + closeProposalPopup(); + m_propertyTable.deactivateEditor(true); + } + + // ---- Implements IContentProposalListener2 ---- + + @Override + public void proposalPopupClosed(ContentProposalAdapter adapter) { + m_ignoreFocusLost = false; + } + + @Override + public void proposalPopupOpened(ContentProposalAdapter adapter) { + m_ignoreFocusLost = true; + } } // END ADT MODIFICATIONS @@ -108,7 +152,10 @@ public abstract class AbstractTextPropertyEditor extends TextDisplayPropertyEdit // create Text { m_textControl = new Text(propertyTable, SWT.NONE); - new TextControlActionsManager(m_textControl); + + @SuppressWarnings("unused") + TextControlActionsManager manager = new TextControlActionsManager(m_textControl); + m_textControl.setEditable(isEditable()); // BEGIN ADT MODIFICATIONS @@ -117,7 +164,8 @@ public abstract class AbstractTextPropertyEditor extends TextDisplayPropertyEdit IContentProposalProvider completion = property.getAdapter(IContentProposalProvider.class); if (completion != null) { ImmediateProposalAdapter adapter = new ImmediateProposalAdapter( - m_textControl, new TextContentAdapter(), completion, null, null); + m_textControl, new TextContentAdapter(), completion, null, null, + propertyTable); adapter.setFilterStyle(ContentProposalAdapter.FILTER_NONE); adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_REPLACE); ILabelProvider labelProvider = property.getAdapter(ILabelProvider.class); |