1 /*******************************************************************************
2 * Copyright (c) 2000, 2011 IBM Corporation and others.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
9 * IBM Corporation - initial API and implementation
10 *******************************************************************************/
11 package org.eclipse.jdt.internal.ui.refactoring.nls;
13 import java.util.ArrayList;
14 import java.util.HashMap;
15 import java.util.List;
17 import org.eclipse.swt.widgets.Display;
19 import org.eclipse.jface.window.Window;
21 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
23 import org.eclipse.jdt.core.ICompilationUnit;
24 import org.eclipse.jdt.core.IJavaElement;
25 import org.eclipse.jdt.core.IJavaProject;
26 import org.eclipse.jdt.core.IPackageFragment;
27 import org.eclipse.jdt.core.IPackageFragmentRoot;
28 import org.eclipse.jdt.core.JavaModelException;
30 import org.eclipse.jdt.ui.JavaElementLabelProvider;
32 import org.eclipse.jdt.internal.ui.JavaPlugin;
33 import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField;
34 import org.eclipse.jdt.internal.ui.wizards.dialogfields.IStringButtonAdapter;
37 public class PackageBrowseAdapter implements IStringButtonAdapter {
39 PackageSelectionDialogButtonField fReceiver;
40 private ICompilationUnit fCu;
42 public PackageBrowseAdapter(ICompilationUnit unit) {
46 public void setReceiver(PackageSelectionDialogButtonField receiver) {
50 public void changeControlPressed(DialogField field) {
51 ElementListSelectionDialog dialog= new ElementListSelectionDialog(
52 Display.getCurrent().getActiveShell(), new JavaElementLabelProvider());
53 dialog.setIgnoreCase(false);
54 dialog.setTitle(NLSUIMessages.PackageBrowseAdapter_package_selection);
55 dialog.setMessage(NLSUIMessages.PackageBrowseAdapter_choose_package);
56 dialog.setElements(createPackageListInput(fCu, null));
57 if (dialog.open() == Window.OK) {
58 IPackageFragment selectedPackage= (IPackageFragment)dialog.getFirstResult();
59 if (selectedPackage != null) {
60 fReceiver.setPackage(selectedPackage);
64 public static Object[] createPackageListInput(ICompilationUnit cu, String elementNameMatch){
66 IJavaProject project= cu.getJavaProject();
67 IPackageFragmentRoot[] roots= project.getPackageFragmentRoots();
68 List<IPackageFragment> result= new ArrayList<IPackageFragment>();
69 HashMap<String, Object> entered =new HashMap<String, Object>();
70 for (int i= 0; i < roots.length; i++){
71 if (canAddPackageRoot(roots[i])){
72 getValidPackages(roots[i], result, entered, elementNameMatch);
75 return result.toArray();
76 } catch (JavaModelException e){
82 static boolean canAddPackageRoot(IPackageFragmentRoot root) throws JavaModelException{
87 if (root.isExternal())
89 if (root.isReadOnly())
91 if (! root.isStructureKnown())
96 static void getValidPackages(IPackageFragmentRoot root, List<IPackageFragment> result, HashMap<String, Object> entered, String elementNameMatch) throws JavaModelException {
97 IJavaElement[] children= null;
99 children= root.getChildren();
100 } catch (JavaModelException e){
103 for (int i= 0; i < children.length; i++){
104 if (children[i] instanceof IPackageFragment) {
105 IPackageFragment packageFragment = (IPackageFragment)children[i];
106 String packageName = packageFragment.getElementName();
108 if ((entered != null) && (entered.containsKey(packageName)) == true) {
112 if (canAddPackage(packageFragment)) {
113 if ((elementNameMatch == null) || (elementNameMatch.equals(packageName))) {
114 result.add(packageFragment);
115 if (entered != null) {
116 entered.put(packageName, null);
124 static boolean canAddPackage(IPackageFragment p) throws JavaModelException{
129 if (! p.isStructureKnown())
134 public static List<IPackageFragment> searchAllPackages(IJavaProject project, String matcher) {
136 IPackageFragmentRoot[] roots= project.getPackageFragmentRoots();
137 List<IPackageFragment> result= new ArrayList<IPackageFragment>();
138 for (int i= 0; i < roots.length; i++){
139 if (canAddPackageRoot(roots[i])){
140 getValidPackages(roots[i], result, null, matcher);
144 } catch (JavaModelException e) {
146 return new ArrayList<IPackageFragment>(0);