/**
* Copyright (c) Red Hat, Inc., contributors and others 2013 - 2014. All rights reserved
*
* Licensed under the Eclipse Public License version 1.0, available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.jboss.tools.forge.ui.internal.ext.control;
import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.resources.IResource;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.ui.IJavaElementSearchConstants;
import org.eclipse.jdt.ui.JavaUI;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.dialogs.SelectionDialog;
import org.jboss.forge.addon.ui.context.UIContext;
import org.jboss.forge.addon.ui.hints.InputType;
import org.jboss.forge.addon.ui.input.InputComponent;
import org.jboss.forge.addon.ui.input.UICompleter;
import org.jboss.forge.addon.ui.input.UIInput;
import org.jboss.forge.addon.ui.util.InputComponents;
import org.jboss.tools.forge.ui.internal.ForgeUIPlugin;
import org.jboss.tools.forge.ui.internal.ext.context.UISelectionImpl;
import org.jboss.tools.forge.ui.internal.ext.wizards.ForgeWizardPage;
public class JavaPackageChooserControlBuilder extends AbstractTextButtonControl {
/**
* Adds the project source packages if no completer was specified for the
* input
*/
@Override
protected void decorateContainerText(ForgeWizardPage page,
InputComponent<?, ?> input, Text containerText) {
if (InputComponents.getCompleterFor(input) != null) {
return;
}
final IJavaProject selectedProject = getSelectedProject(page);
if (selectedProject != null) {
UICompleter<Object> completer = new UICompleter<Object>() {
@Override
public Iterable<Object> getCompletionProposals(
UIContext context, InputComponent<?, Object> input,
String value) {
Set<Object> proposals = new TreeSet<>();
try {
for (IPackageFragment pkg : selectedProject
.getPackageFragments()) {
if (pkg.getKind() == IPackageFragmentRoot.K_BINARY) {
continue;
}
String name = pkg.getElementName();
if (name.startsWith(value)) {
proposals.add(name);
}
}
} catch (JavaModelException jme) {
ForgeUIPlugin.log(jme);
}
return proposals;
}
};
setupAutoCompleteForText(page.getWizard().getUIContext(), input, completer,
containerText);
}
}
@Override
protected void browseButtonPressed(ForgeWizardPage page,
InputComponent<?, ?> input, Text containerText) {
final IJavaProject project = getSelectedProject(page);
if (project == null) {
MessageDialog.openError(page.getShell(), "No project selected",
"No project was selected");
return;
}
int style = IJavaElementSearchConstants.CONSIDER_REQUIRED_PROJECTS;
try {
SelectionDialog dialog = JavaUI.createPackageDialog(
page.getShell(), project, style, containerText.getText());
dialog.setTitle("Package Selection");
dialog.setMessage("Select a package.");
if (dialog.open() == Window.OK) {
IPackageFragment res = (IPackageFragment) dialog.getResult()[0];
containerText.setText(res.getElementName());
}
} catch (JavaModelException ex) {
ForgeUIPlugin.log(ex);
}
}
/**
* Resolves the selected project in the workspace
*
* @return null if no selected project was found
*/
private IJavaProject getSelectedProject(ForgeWizardPage page) {
UISelectionImpl<?> initialSelection = page.getWizard().getUIContext()
.getInitialSelection();
final IJavaProject project;
if (initialSelection != null) {
IResource resource = initialSelection.getResource();
if (resource != null) {
project = JavaCore.create(resource.getProject());
} else {
project = null;
}
} else {
project = null;
}
return project;
}
@Override
protected Class<String> getProducedType() {
return String.class;
}
@Override
protected String getSupportedInputType() {
return InputType.JAVA_PACKAGE_PICKER;
}
@Override
protected Class<?>[] getSupportedInputComponentTypes() {
return new Class<?>[] { UIInput.class };
}
}