/***************************************************************************** * This file is part of Rinzo * * Author: Claudio Cancinos * WWW: https://sourceforge.net/projects/editorxml * Copyright (C): 2008, Claudio Cancinos * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this program; If not, see <http://www.gnu.org/licenses/> ****************************************************************************/ package ar.com.tadp.xml.rinzo.jdt.wizards; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaModelException; 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.NewWizardMessages; import org.eclipse.jdt.internal.ui.wizards.dialogfields.DialogField; 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; import org.eclipse.jdt.ui.JavaElementLabelProvider; import org.eclipse.jdt.ui.wizards.NewContainerWizardPage; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.window.Window; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.dialogs.ElementListSelectionDialog; import ar.com.tadp.xml.rinzo.XMLEditorPlugin; /** * Abstract wizard page for pages requiring to locate a package and proyect's * source folder * * @author ccancinos */ public abstract class NewPackageContainerWizardPage extends NewContainerWizardPage { private static final String PACKAGE = "NewPackageContainerWizardPage.package"; private JavaPackageCompletionProcessor packageCompletionProcessor; private StringButtonStatusDialogField packageDialogField; public NewPackageContainerWizardPage(String name, IStructuredSelection selection) { super(name); ContainerFieldAdapter adapter = new ContainerFieldAdapter(); packageDialogField = new StringButtonStatusDialogField(adapter); packageDialogField.setDialogFieldListener(adapter); packageDialogField.setLabelText(NewWizardMessages.NewTypeWizardPage_package_label); packageDialogField.setButtonLabel(NewWizardMessages.NewTypeWizardPage_package_button); packageDialogField.setStatusWidthHint(NewWizardMessages.NewTypeWizardPage_default); packageCompletionProcessor = new JavaPackageCompletionProcessor(); this.initContainerPage(this.getInitialJavaElement(selection)); } public void createControl(Composite parentRoot) { initializeDialogUnits(parentRoot); Composite parent = new Composite(parentRoot, SWT.NONE); parent.setLayout(new GridLayout(1, false)); Composite groupParent = new Composite(parent, SWT.NONE); groupParent.setLayout(new GridLayout()); Composite sourceAndPackageContainer = new Composite(groupParent, SWT.NONE); sourceAndPackageContainer.setFont(groupParent.getFont()); int nColumns = 4; GridLayout layout = new GridLayout(); layout.numColumns = nColumns; sourceAndPackageContainer.setLayout(layout); // pick & choose the wanted UI components createContainerControls(sourceAndPackageContainer, nColumns); createPackageControls(sourceAndPackageContainer, nColumns); Label separator = new Label(groupParent, SWT.SEPARATOR | SWT.HORIZONTAL); separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); packageDialogField.setFocus(); this.createAdditionalControls(parent); this.setControl(parent); } protected abstract void createAdditionalControls(Composite parent); protected void createPackageControls(Composite composite, int nColumns) { packageDialogField.doFillIntoGrid(composite, nColumns); Text text = packageDialogField.getTextControl(null); LayoutUtil.setWidthHint(text, getMaxFieldWidth()); LayoutUtil.setHorizontalGrabbing(text); ControlContentAssistHelper.createTextContentAssistant(text, packageCompletionProcessor); TextFieldNavigationHandler.install(text); } protected IPackageFragment choosePackage() { IPackageFragmentRoot froot = getPackageFragmentRoot(); IJavaElement[] packages = null; try { if (froot != null && froot.exists()) { packages = froot.getChildren(); } } catch (JavaModelException e) { XMLEditorPlugin.log(e); } if (packages == null) { packages = new IJavaElement[0]; } ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), new JavaElementLabelProvider( JavaElementLabelProvider.SHOW_DEFAULT)); dialog.setIgnoreCase(false); dialog.setTitle(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_title); dialog.setMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_description); dialog.setEmptyListMessage(NewWizardMessages.NewTypeWizardPage_ChoosePackageDialog_empty); dialog.setElements(packages); dialog.setHelpAvailable(false); // IPackageFragment pack = getPackageFragment(); // if (pack != null) { // dialog.setInitialSelections(new Object[] { pack }); // } if (dialog.open() == Window.OK) { return (IPackageFragment) dialog.getFirstResult(); } return null; } @Override protected IStatus containerChanged() { IStatus status = super.containerChanged(); packageCompletionProcessor.setPackageFragmentRoot(this.getPackageFragmentRoot()); return status; } private void typePageChangeControlPressed(DialogField field) { if (field == packageDialogField) { IPackageFragment pack = choosePackage(); if (pack != null) { packageDialogField.setText(pack.getElementName()); } } } public String getSourceDirectoryAbsolutePath() { if (this.getPackageFragmentRootText().isEmpty()) { return ""; } else { IWorkspaceRoot fWorkspaceRoot = ResourcesPlugin.getWorkspace().getRoot(); return fWorkspaceRoot.getFolder(new Path(this.getPackageFragmentRootText())).getLocation().toOSString(); } } public String getPackage() { return this.packageDialogField.getText(); } private class ContainerFieldAdapter implements IStringButtonAdapter, IDialogFieldListener { public void changeControlPressed(DialogField field) { typePageChangeControlPressed(field); } public void dialogFieldChanged(DialogField field) { if (field == packageDialogField) { fContainerStatus= containerChanged(); } // tell all others handleFieldChanged(PACKAGE); } } protected static class InterfaceWrapper { public String interfaceName; public InterfaceWrapper(String interfaceName) { this.interfaceName = interfaceName; } @Override public int hashCode() { return interfaceName.hashCode(); } @Override public boolean equals(Object obj) { return obj != null && getClass().equals(obj.getClass()) && ((InterfaceWrapper) obj).interfaceName.equals(interfaceName); } } @SuppressWarnings("restriction") @Override protected void handleFieldChanged(String fieldName) { super.handleFieldChanged(fieldName); if (fieldName.equals(PACKAGE) && this.packageDialogField.getText().isEmpty()) { this.setErrorMessage("Package cannot be empty"); this.setPageComplete(false); } else if (fieldName.equals(CONTAINER) && this.getPackageFragmentRootText().isEmpty()) { this.setErrorMessage("Source folder cannot be empty"); this.setPageComplete(false); } else { this.setErrorMessage(null); this.setPageComplete(true); } } }