Package org.eclipse.ui.contentassist

Source Code of org.eclipse.ui.contentassist.ContentAssistHandler

/*******************************************************************************
* Copyright (c) 2000, 2008 IBM Corporation and others.
* 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
*
* Contributors:
*     IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.contentassist;

import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.FocusEvent;
import org.eclipse.swt.events.FocusListener;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.IHandler;

import org.eclipse.jface.bindings.TriggerSequence;
import org.eclipse.jface.contentassist.AbstractControlContentAssistSubjectAdapter;
import org.eclipse.jface.contentassist.ComboContentAssistSubjectAdapter;
import org.eclipse.jface.contentassist.SubjectControlContentAssistant;
import org.eclipse.jface.contentassist.TextContentAssistSubjectAdapter;
import org.eclipse.jface.viewers.ILabelProvider;
import org.eclipse.jface.viewers.LabelProvider;

import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.handlers.IHandlerActivation;
import org.eclipse.ui.handlers.IHandlerService;
import org.eclipse.ui.internal.texteditor.NLSUtility;
import org.eclipse.ui.keys.IBindingService;

import org.eclipse.ui.texteditor.ITextEditorActionDefinitionIds;


/**
* A content assistant handler which handles the key binding and
* the cue for a {@link org.eclipse.jface.text.contentassist.ContentAssistant}
* and its subject adapter.
*
* @since 3.0
* @deprecated As of 3.2, replaced by JFace field assist support
*/
public class ContentAssistHandler {
  /**
   * The target control.
   */
  private Control fControl;
  /**
   * The content assist subject adapter.
   */
  private AbstractControlContentAssistSubjectAdapter fContentAssistSubjectAdapter;
  /**
   * The content assistant.
   */
  private SubjectControlContentAssistant fContentAssistant;
  /**
   * The currently installed FocusListener, or <code>null</code> iff none installed.
   * This is also used as flag to tell whether content assist is enabled
   */
  private FocusListener fFocusListener;
  /**
   * The currently installed IHandlerActivation, or <code>null</code> iff none installed.
   */
  private IHandlerActivation fHandlerActivation;

  /**
   * Creates a new {@link ContentAssistHandler} for the given {@link Combo}.
   * Only a single {@link ContentAssistHandler} may be installed on a {@link Combo} instance.
   * Content Assist is enabled by default.
   *
   * @param combo target combo
   * @param contentAssistant a configured content assistant
   * @return a new {@link ContentAssistHandler}
   */
  public static ContentAssistHandler createHandlerForCombo(Combo combo, SubjectControlContentAssistant contentAssistant) {
    return new ContentAssistHandler(combo, new ComboContentAssistSubjectAdapter(combo), contentAssistant);
  }

  /**
   * Creates a new {@link ContentAssistHandler} for the given {@link Text}.
   * Only a single {@link ContentAssistHandler} may be installed on a {@link Text} instance.
   * Content Assist is enabled by default.
   *
   * @param text target text
   * @param contentAssistant a configured content assistant
   * @return a new {@link ContentAssistHandler}
   */
  public static ContentAssistHandler createHandlerForText(Text text, SubjectControlContentAssistant contentAssistant) {
    return new ContentAssistHandler(text, new TextContentAssistSubjectAdapter(text), contentAssistant);
  }

  /**
   * Internal constructor.
   *
   * @param control target control
   * @param subjectAdapter content assist subject adapter
   * @param contentAssistant content assistant
   */
  private ContentAssistHandler(
      Control control,
      AbstractControlContentAssistSubjectAdapter subjectAdapter,
      SubjectControlContentAssistant contentAssistant) {
    fControl= control;
    fContentAssistant= contentAssistant;
    fContentAssistSubjectAdapter= subjectAdapter;
    setEnabled(true);
    fControl.addDisposeListener(new DisposeListener() {
      public void widgetDisposed(DisposeEvent e) {
        setEnabled(false);
      }
    });
  }

  /**
   * @return <code>true</code> iff content assist is enabled
   */
  public boolean isEnabled() {
    return fFocusListener != null;
  }

  /**
   * Controls enablement of content assist.
   * When enabled, a cue is shown next to the focused field
   * and the affordance hover shows the shortcut.
   *
   * @param enable enable content assist iff true
   */
  public void setEnabled(boolean enable) {
    if (enable == isEnabled())
      return;

    if (enable)
      enable();
    else
      disable();
  }

  /**
   * Enable content assist.
   */
  private void enable() {
    if (! fControl.isDisposed()) {
      fContentAssistant.install(fContentAssistSubjectAdapter);
      installCueLabelProvider();
      installFocusListener();
      if (fControl.isFocusControl())
        activateHandler();
    }
  }

  /**
   * Disable content assist.
   */
  private void disable() {
    if (! fControl.isDisposed()) {
      fContentAssistant.uninstall();
      fContentAssistSubjectAdapter.setContentAssistCueProvider(null);
      fControl.removeFocusListener(fFocusListener);
      fFocusListener= null;
      if (fHandlerActivation != null)
        deactivateHandler();
    }
  }

  /**
   * Create and install the {@link LabelProvider} for fContentAssistSubjectAdapter.
   */
  private void installCueLabelProvider() {
    ILabelProvider labelProvider= new LabelProvider() {
      /*
       * @see org.eclipse.jface.viewers.ILabelProvider#getText(java.lang.Object)
       */
      public String getText(Object element) {
        IBindingService bindingService= (IBindingService) PlatformUI.getWorkbench().getAdapter(IBindingService.class);
        TriggerSequence[] activeBindings= bindingService.getActiveBindingsFor(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS);
        if (activeBindings.length == 0)
          return ContentAssistMessages.ContentAssistHandler_contentAssistAvailable;
        return NLSUtility.format(ContentAssistMessages.ContentAssistHandler_contentAssistAvailableWithKeyBinding, activeBindings[0].format());
      }
    };
    fContentAssistSubjectAdapter.setContentAssistCueProvider(labelProvider);
  }

  /**
   * Create fFocusListener and install it on fControl.
   */
  private void installFocusListener() {
    fFocusListener= new FocusListener() {
      public void focusGained(final FocusEvent e) {
        if (fHandlerActivation == null)
          activateHandler();
      }
      public void focusLost(FocusEvent e) {
        if (fHandlerActivation != null)
          deactivateHandler();
      }
    };
    fControl.addFocusListener(fFocusListener);
  }

  /**
   * Create and register fHandlerSubmission.
   */
  private void activateHandler() {
    IHandlerService handlerService= (IHandlerService)PlatformUI.getWorkbench().getAdapter(IHandlerService.class);
    if (handlerService == null)
      return;

    IHandler handler= new AbstractHandler() {
      public Object execute(ExecutionEvent event) throws ExecutionException {
        if (ContentAssistHandler.this.isEnabled()) // don't call AbstractHandler#isEnabled()!
          fContentAssistant.showPossibleCompletions();
        return null;
      }
    };
    fHandlerActivation= handlerService.activateHandler(ITextEditorActionDefinitionIds.CONTENT_ASSIST_PROPOSALS, handler);
  }

  /**
   * Unregister the {@link IHandlerActivation} from the shell.
   */
  private void deactivateHandler() {
    IHandlerService handlerService= (IHandlerService)PlatformUI.getWorkbench().getAdapter(IHandlerService.class);
    if (handlerService != null)
      handlerService.deactivateHandler(fHandlerActivation);
    fHandlerActivation= null;
  }
}
TOP

Related Classes of org.eclipse.ui.contentassist.ContentAssistHandler

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.