/*******************************************************************************
 * Copyright (c) 2006, 2012 Oracle Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * SPDX-License-Identifier: EPL-2.0
 *
 * Contributors:
 *     Oracle Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.bpel.ui.editors.xpath;

import java.util.ResourceBundle;

import org.eclipse.bpel.ui.details.providers.ModelTreeLabelProvider;
import org.eclipse.bpel.ui.details.providers.VariableTreeContentProvider;
import org.eclipse.bpel.ui.dialogs.ElementTreePreviewSelectionDialog;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.TextSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.ui.IEditorInput;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.TextEditorAction;


/**
 * Action for jumping to a particular line in the editor's text viewer.
 * The user is requested to enter the line number into an input dialog.
 * The action is initially associated with a text editor via the constructor,
 * but that can be subsequently changed using <code>setEditor</code>.
 * <p>
 * The following keys, prepended by the given option prefix,
 * are used for retrieving resources from the given bundle:
 * <ul>
 *   <li><code>"dialog.invalid_range"</code> - to indicate an invalid line number</li>
 *   <li><code>"dialog.invalid_input"</code> - to indicate an invalid line number format</li>
 *   <li><code>"dialog.title"</code> - the input dialog's title</li>
 *   <li><code>"dialog.message"</code> - the input dialog's message</li>
 * </ul></p>
 * <p>
 * This class may be instantiated; it is not intended to be subclassed.
 * </p>
 */
public class VariablePickerAction extends TextEditorAction {


	/** This action's resource bundle */
	private ResourceBundle fBundle;
	/** This action's prefix used for accessing the resource bundle */
	private String fPrefix;

	/**
	 * Creates a new action for the given text editor. The action configures its
	 * visual representation from the given resource bundle.
	 *
	 * @param bundle the resource bundle
	 * @param prefix a prefix to be prepended to the various resource keys
	 *   (described in <code>ResourceAction</code> constructor), or
	 *   <code>null</code> if none
	 * @param editor the text editor
	 * @see TextEditorAction#TextEditorAction(ResourceBundle, String, ITextEditor)
	 */
	public VariablePickerAction (ResourceBundle bundle, String prefix, ITextEditor editor) {
		
		super(bundle, prefix, editor);
		fBundle= bundle;
		fPrefix= prefix;
	}

	/**
	 * @see Action#run()
	 */
	
	@Override
	public void run() {
		ITextEditor editor = getTextEditor();

		if (editor == null) {
			return;
		}

		IDocumentProvider docProvider= editor.getDocumentProvider();
		if (docProvider == null) {
			return;
		}

		IDocument document= docProvider.getDocument(editor.getEditorInput());
		if (document == null) {
			return;
		}
		IEditorInput input = editor.getEditorInput();	
		if (input == null) {
			return ;
		}
				
        VariableTreeContentProvider variableContentProvider = new VariableTreeContentProvider(true, false, false);
        
        ElementTreePreviewSelectionDialog dialog = new ElementTreePreviewSelectionDialog (
        		editor.getSite().getShell(), 
        		new ModelTreeLabelProvider(), 
        		variableContentProvider);
        
        
        String title= fBundle.getString(fPrefix + "dialog.title"); //$NON-NLS-1$
		dialog.setTitle( title );
		dialog.setAllowMultiple(false);
		
		EObject eObj = (EObject) input.getAdapter(EObject.class);
		dialog.setInput( eObj );

		if (dialog.open() == Window.OK) {
			
			TextSelection sel = (TextSelection)editor.getSelectionProvider().getSelection();
			int offset = sel.getOffset();
			int length = sel.getLength();
			
			String result = dialog.getPreviewResult();
			
		   try {
		       document.replace(offset, length, result);
		       editor.selectAndReveal(offset + result.length(), 0);		       
		   }
		   catch (BadLocationException ble) {
			   // ignore ?
		   }				
		}
	}
	
}
