1 /*******************************************************************************
2  * Copyright (c) 2000, 2008 IBM Corporation and others.
3  *
4  * This program and the accompanying materials
5  * are made available under the terms of the Eclipse Public License 2.0
6  * which accompanies this distribution, and is available at
7  * https://www.eclipse.org/legal/epl-2.0/
8  *
9  * SPDX-License-Identifier: EPL-2.0
10  *
11  * Contributors:
12  *     IBM Corporation - initial API and implementation
13  *******************************************************************************/
14 package org.eclipse.jdt.internal.ui.refactoring.nls;
15 
16 import org.eclipse.swt.events.ModifyEvent;
17 import org.eclipse.swt.events.ModifyListener;
18 import org.eclipse.swt.widgets.Composite;
19 import org.eclipse.swt.widgets.Control;
20 import org.eclipse.swt.widgets.Text;
21 
22 import org.eclipse.jdt.core.IPackageFragment;
23 import org.eclipse.jdt.core.IPackageFragmentRoot;
24 
25 import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler;
26 import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
27 import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaPackageCompletionProcessor;
28 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IDialogFieldListener;
29 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
30 import org.eclipse.jdt.internal.ui.wizards.dialogfields.LayoutUtil;
31 import org.eclipse.jdt.internal.ui.wizards.dialogfields.StringButtonStatusDialogField;
32 
33 class PackageFragmentSelection extends StringButtonStatusDialogField implements SourceChangeListener {
34 
35 	private final SourceFirstPackageSelectionDialogField fDialogField;
36 	private JavaPackageCompletionProcessor fCurrPackageCompletionProcessor;
37 	private IDialogFieldListener fUpdateListener;
38 
PackageFragmentSelection(SourceFirstPackageSelectionDialogField field, String packageLabel, String browseLabel, String statusHint, IStringButtonAdapter adapter)39 	public PackageFragmentSelection(SourceFirstPackageSelectionDialogField field, String packageLabel, String browseLabel,
40 		String statusHint, IStringButtonAdapter adapter) {
41 		super(adapter);
42 		fDialogField= field;
43 		setLabelText(packageLabel);
44 		setButtonLabel(browseLabel);
45 		setStatusWidthHint(statusHint);
46 		fCurrPackageCompletionProcessor= new JavaPackageCompletionProcessor();
47 	}
48 
setUpdateListener(IDialogFieldListener updateListener)49 	public void setUpdateListener(IDialogFieldListener updateListener) {
50 		fUpdateListener= updateListener;
51 	}
52 
doFillIntoGrid(Composite parent, int nColumns, int textWidth)53 	public Control[] doFillIntoGrid(Composite parent, int nColumns, int textWidth) {
54 		Control[] res= super.doFillIntoGrid(parent, nColumns);
55 
56 		final Text text= getTextControl(null);
57 		text.addModifyListener(new ModifyListener() {
58 			@Override
59 			public void modifyText(ModifyEvent e) {
60 				updateListener();
61 			}
62 		});
63 		LayoutUtil.setWidthHint(text, textWidth);
64 		LayoutUtil.setHorizontalGrabbing(text);
65 		ControlContentAssistHelper.createTextContentAssistant(text, fCurrPackageCompletionProcessor);
66 		TextFieldNavigationHandler.install(text);
67 
68 		return res;
69 	}
70 
setPackageFragment(IPackageFragment fragment)71 	public void setPackageFragment(IPackageFragment fragment) {
72 		if (fragment != null) {
73 			setText(fragment.getElementName());
74 		}
75 
76 		updateListener();
77 	}
78 
updateListener()79 	private void updateListener() {
80 		if (fUpdateListener != null) {
81 			fUpdateListener.dialogFieldChanged(this);
82 		}
83 	}
84 
getPackageFragment()85 	public IPackageFragment getPackageFragment() {
86 		return calculateFragment(fDialogField.getSelectedFragmentRoot());
87 	}
88 
calculateFragment(IPackageFragmentRoot root)89 	private IPackageFragment calculateFragment(IPackageFragmentRoot root) {
90 		if (root == null) {
91 			return null;
92 		} else {
93 			return root.getPackageFragment(getText());
94 		}
95 	}
96 
97 	@Override
sourceRootChanged(IPackageFragmentRoot newRoot)98 	public void sourceRootChanged(IPackageFragmentRoot newRoot) {
99 		fCurrPackageCompletionProcessor.setPackageFragmentRoot(newRoot);
100 
101 		setPackageFragment(calculateFragment(newRoot));
102 	}
103 }
104