/*******************************************************************************
 * 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.jdt.internal.ui.refactoring.nls;

import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Text;

import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;

import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaPackageCompletionProcessor;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonStatusDialogField;

class PackageFragmentSelection extends StringButtonStatusDialogField implements SourceChangeListener {

	private final SourceFirstPackageSelectionDialogField fDialogField;
	private JavaPackageCompletionProcessor fCurrPackageCompletionProcessor;
	private IDialogFieldListener fUpdateListener;

	public PackageFragmentSelection(SourceFirstPackageSelectionDialogField field, String packageLabel, String browseLabel,
		String statusHint, IStringButtonAdapter adapter) {
		super(adapter);
		fDialogField= field;
		setLabelText(packageLabel);
		setButtonLabel(browseLabel);
		setStatusWidthHint(statusHint);
		fCurrPackageCompletionProcessor= new JavaPackageCompletionProcessor();
	}

	public void setUpdateListener(IDialogFieldListener updateListener) {
		fUpdateListener= updateListener;
	}

	public Control[] doFillIntoGrid(Composite parent, int nColumns, int textWidth) {
		Control[] res= super.doFillIntoGrid(parent, nColumns);

		final Text text= getTextControl(null);
		text.addModifyListener(new ModifyListener() {
			public void modifyText(ModifyEvent e) {
				updateListener();
			}
		});
		LayoutUtil.setWidthHint(text, textWidth);
		LayoutUtil.setHorizontalGrabbing(text);
		ControlContentAssistHelper.createTextContentAssistant(text, fCurrPackageCompletionProcessor);
		TextFieldNavigationHandler.install(text);

		return res;
	}

	public void setPackageFragment(IPackageFragment fragment) {
		if (fragment != null) {
			setText(fragment.getElementName());
		}

		updateListener();
	}

	private void updateListener() {
		if (fUpdateListener != null) {
			fUpdateListener.dialogFieldChanged(this);
		}
	}

	public IPackageFragment getPackageFragment() {
		return calculateFragment(fDialogField.getSelectedFragmentRoot());
	}

	private IPackageFragment calculateFragment(IPackageFragmentRoot root) {
		if (root == null) {
			return null;
		} else {
			return root.getPackageFragment(getText());
		}
	}

	public void sourceRootChanged(IPackageFragmentRoot newRoot) {
		fCurrPackageCompletionProcessor.setPackageFragmentRoot(newRoot);

		setPackageFragment(calculateFragment(newRoot));
	}
}