/*******************************************************************************
* Copyright (c) 2008 Software Competence Center Hagenberg (SCCH) GmbH
* Copyright (c) 2008 Mario Winterer
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.springframework.ide.eclipse.boot.launch.util;
import org.eclipse.jface.bindings.keys.KeyStroke;
import org.eclipse.jface.fieldassist.ContentProposalAdapter;
import org.eclipse.jface.fieldassist.IContentProposalListener2;
import org.eclipse.jface.fieldassist.IContentProposalProvider;
import org.eclipse.jface.fieldassist.TextContentAdapter;
import org.eclipse.jface.viewers.TextCellEditor;
import org.eclipse.swt.widgets.Composite;
public class TextCellEditorWithContentProposal extends TextCellEditor {
private ContentProposalAdapter contentProposalAdapter;
private boolean popupOpen = false; // true, iff popup is currently open
public TextCellEditorWithContentProposal(Composite parent, IContentProposalProvider contentProposalProvider,
KeyStroke keyStroke, char[] autoActivationCharacters) {
super(parent);
enableContentProposal(contentProposalProvider, keyStroke, autoActivationCharacters);
}
public TextCellEditorWithContentProposal setProposalAcceptanceStyle(int acceptance) {
contentProposalAdapter.setProposalAcceptanceStyle(acceptance);
return this;
}
private void enableContentProposal(IContentProposalProvider contentProposalProvider, KeyStroke keyStroke,
char[] autoActivationCharacters) {
contentProposalAdapter = new ContentProposalAdapter(text, new TextContentAdapter(),
contentProposalProvider, keyStroke, autoActivationCharacters);
// Listen for popup open/close events to be able to handle focus events correctly
contentProposalAdapter.addContentProposalListener(new IContentProposalListener2() {
public void proposalPopupClosed(ContentProposalAdapter adapter) {
popupOpen = false;
}
public void proposalPopupOpened(ContentProposalAdapter adapter) {
popupOpen = true;
}
});
}
/**
* Return the {@link ContentProposalAdapter} of this cell editor.
*
* @return the {@link ContentProposalAdapter}
*/
public ContentProposalAdapter getContentProposalAdapter() {
return contentProposalAdapter;
}
protected void focusLost() {
if (!popupOpen) {
// Focus lost deactivates the cell editor.
// This must not happen if focus lost was caused by activating
// the completion proposal popup.
super.focusLost();
}
}
protected boolean dependsOnExternalFocusListener() {
// Always return false;
// Otherwise, the ColumnViewerEditor will install an additional focus listener
// that cancels cell editing on focus lost, even if focus gets lost due to
// activation of the completion proposal popup. See also bug 58777.
return false;
}
}