/*******************************************************************************
 * Copyright (c) 2000, 2005 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.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;

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.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));
	}
}
