/*******************************************************************************
 * Copyright (c) 2004 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.wst.common.snippets.internal;



import org.eclipse.jface.window.Window;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.common.snippets.core.ISnippetItem;

public class VariableItemHelper {

	public static String getInsertString(Shell host, ISnippetItem item) {
		return getInsertString(host, item, true);
	}

	public static String getInsertString(final Shell host, ISnippetItem item, boolean clearModality) {
		if (item == null)
			return ""; //$NON-NLS-1$
		String insertString = null;
		if (item.getVariables().length > 0) {
			VariableInsertionDialog dialog = new VariableInsertionDialog(host, clearModality);
			dialog.setItem(item);
			// The editor itself influences the insertion's actions, so we
			// can't
			// allow the active editor to be changed.
			// Disabling the parent shell achieves psuedo-modal behavior
			// without
			// locking the UI under Linux
			int result = Window.CANCEL;
			try {
				if (clearModality) {
					host.setEnabled(false);
					dialog.addDisposeListener(new DisposeListener() {
						public void widgetDisposed(DisposeEvent arg0) {
							/*
							 * The parent shell must be reenabled when the
							 * dialog disposes, otherwise it won't
							 * automatically receive focus.
							 */
							host.setEnabled(true);
						}
					});
				}
				result = dialog.open();
			}
			catch (Exception t) {
				Logger.logException(t);
			}
			finally {
				if (clearModality) {
					host.setEnabled(true);
				}
			}
			if (result == Window.OK)
				insertString = dialog.getPreparedText();
		}
		else {
			insertString = item.getContentString();
		}
		return insertString;
	}

}