/*=============================================================================#
 # Copyright (c) 2000, 2021 IBM Corporation and others.
 # 
 # This program and the accompanying materials are made available under the
 # terms of the Eclipse Public License 2.0 which is available at
 # https://www.eclipse.org/legal/epl-2.0.
 # 
 # SPDX-License-Identifier: EPL-2.0
 # 
 # Contributors:
 #     IBM Corporation - org.eclipse.jdt: initial API and implementation
 #     Stephan Wahlbrink <sw@wahlbrink.eu> - removed editor dependencies
 #=============================================================================*/

package org.eclipse.statet.ecommons.text.ui;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.text.ITextViewerExtension4;
import org.eclipse.jface.text.source.ISourceViewer;


/**
 * Command handler for source viewers showing the information popup.
 * 
 * This action behaves in two different ways: If there is no current text hover, the information
 * is displayed using information presenter. If there is a current text hover, it is converted 
 * into a information presenter in order to make it sticky.
 */
public final class InformationDispatchHandler extends AbstractHandler {
	
	
	private final ISourceViewer fSourceViewer;
	
	/** The wrapped text operation action. */
	private final TextViewerAction fTextOperationAction;
	
	
	public InformationDispatchHandler(final ISourceViewer sourceViewer) {
		if (sourceViewer == null) {
			throw new NullPointerException("viewer"); //$NON-NLS-1$
		}
		this.fSourceViewer= sourceViewer;
		this.fTextOperationAction= new TextViewerAction(sourceViewer, ISourceViewer.INFORMATION);
	}
	
	
	@Override
	public Object execute(final ExecutionEvent event) throws ExecutionException {
		if (this.fSourceViewer instanceof ITextViewerExtension4) {
			final ITextViewerExtension4 extension4= (ITextViewerExtension4) this.fSourceViewer;
			if (extension4.moveFocusToWidgetToken()) {
				return null;
			}
		}
		// otherwise, just run the action
		if (this.fTextOperationAction.isEnabled()) {
			this.fTextOperationAction.run();
		}
		return null;
	}
	
}
