blob: 43611d11440b9334a77f4e1d8e73da259226e547 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.studio.ldapbrowser.common.widgets;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.IHandler;
import org.eclipse.jface.contentassist.ComboContentAssistSubjectAdapter;
import org.eclipse.jface.contentassist.SubjectControlContentAssistant;
import org.eclipse.jface.contentassist.TextContentAssistSubjectAdapter;
import org.eclipse.jface.text.ITextViewer;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.events.TraverseEvent;
import org.eclipse.swt.events.TraverseListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;
/**
* The DialogContentAssistant is used to provide content assist and
* a proposal popup within a SWT {@link Text}, {@link Combo} or
* {@link ITextViewer}.
*
* It provides a special handling of ESC keystrokes:
* When the proposal popup is shown ESC is catched and the popup is closed.
* This ensures that a dialog isn't closed on a ESC keystroke
* while the proposal popup is opened.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class DialogContentAssistant extends SubjectControlContentAssistant implements FocusListener
{
/** The control */
private Control control;
/** The handler activation. */
private IHandlerActivation handlerActivation;
/** The possible completions visible. */
private boolean possibleCompletionsVisible;
/**
* Creates a new instance of DialogContentAssistant.
*/
public DialogContentAssistant()
{
this.possibleCompletionsVisible = false;
}
/**
* Installs content assist on the given text.
*
* @param text the text
*/
public void install( Text text )
{
control = text;
control.addFocusListener( this );
super.install( new TextContentAssistSubjectAdapter( text ) );
}
/**
* Installs content assist on the given combo.
*
* @param combo the combo
*/
public void install( Combo combo )
{
control = combo;
control.addFocusListener( this );
super.install( new ComboContentAssistSubjectAdapter( combo ) );
}
/**
* Installs content assist on the given text viewer.
*
* @param viewer the text viewer
*/
public void install( ITextViewer viewer )
{
control = viewer.getTextWidget();
control.addFocusListener( this );
// stop traversal (ESC) if popup is shown
control.addTraverseListener( new TraverseListener()
{
public void keyTraversed( TraverseEvent e )
{
if ( possibleCompletionsVisible )
{
e.doit = false;
}
}
} );
super.install( viewer );
}
/**
* Uninstalls content assist on the control.
*/
public void uninstall()
{
if ( handlerActivation != null )
{
IHandlerService handlerService = ( IHandlerService ) PlatformUI.getWorkbench().getAdapter(
IHandlerService.class );
handlerService.deactivateHandler( handlerActivation );
handlerActivation = null;
}
if ( control != null )
{
control.removeFocusListener( this );
}
super.uninstall();
}
/**
* {@inheritDoc}
*/
protected Point restoreCompletionProposalPopupSize()
{
possibleCompletionsVisible = true;
return super.restoreCompletionProposalPopupSize();
}
/**
* {@inheritDoc}
*/
public String showPossibleCompletions()
{
possibleCompletionsVisible = true;
return super.showPossibleCompletions();
}
/**
* {@inheritDoc}
*/
protected void possibleCompletionsClosed()
{
possibleCompletionsVisible = false;
super.possibleCompletionsClosed();
}
/**
* {@inheritDoc}
*/
public void focusGained( FocusEvent e )
{
IHandlerService handlerService = ( IHandlerService ) PlatformUI.getWorkbench().getAdapter(
IHandlerService.class );
if ( handlerService != null )
{
IHandler handler = new org.eclipse.core.commands.AbstractHandler()
{
public Object execute( ExecutionEvent event ) throws org.eclipse.core.commands.ExecutionException
{
showPossibleCompletions();
return null;
}
};
handlerActivation = handlerService.activateHandler(
ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, handler );
}
}
/**
* {@inheritDoc}
*/
public void focusLost( FocusEvent e )
{
if ( handlerActivation != null )
{
IHandlerService handlerService = ( IHandlerService ) PlatformUI.getWorkbench().getAdapter(
IHandlerService.class );
handlerService.deactivateHandler( handlerActivation );
handlerActivation = null;
}
}
}