Java tutorial
/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library 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.1 of the License, or (at your option) * any later version. * * This library 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 Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.portlet.ui.wizard; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.portlet.core.operation.INewPortletClassDataModelProperties; import com.liferay.ide.portlet.ui.PortletUIPlugin; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.ui.dialog.FilteredTypesSelectionDialogEx; import com.liferay.ide.ui.util.SWTUtil; import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.ecore.EObject; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.search.IJavaSearchConstants; import org.eclipse.jdt.core.search.IJavaSearchScope; import org.eclipse.jdt.internal.core.search.BasicSearchEngine; import org.eclipse.jdt.internal.ui.dialogs.FilteredTypesSelectionDialog; import org.eclipse.jem.util.emf.workbench.ProjectUtilities; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.DecoratingLabelProvider; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.jst.j2ee.internal.common.operations.INewJavaClassDataModelProperties; import org.eclipse.jst.j2ee.internal.plugin.J2EEUIMessages; import org.eclipse.jst.j2ee.internal.project.J2EEProjectUtilities; import org.eclipse.jst.j2ee.internal.wizard.NewJavaClassWizardPage; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.graphics.Cursor; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.ISelectionStatusValidator; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.wst.common.componentcore.internal.operation.IArtifactEditOperationDataModelProperties; import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; /** * @author Greg Amerson * @author Cindy Li */ @SuppressWarnings({ "restriction", "deprecation" }) public class NewPortletClassWizardPage extends NewJavaClassWizardPage implements INewPortletClassDataModelProperties { protected Button createNewClassRadio; protected Button customButton; protected Button folderButton; protected Text folderText; protected boolean fragment; protected boolean initialProject; protected Button portletClassButton; protected Label portletClassLabel; protected Text portletClassText; protected String projectName; protected Combo projectNameCombo; protected Label projectNameLabel; protected Combo superCombo; protected Button useDefaultPortletRadio; public NewPortletClassWizardPage(IDataModel model, String pageName, String pageDesc, String pageTitle, boolean fragment) { super(model, pageName, pageDesc, pageTitle, IModuleConstants.JST_WEB_MODULE); this.projectName = null; this.fragment = fragment; } public NewPortletClassWizardPage(IDataModel model, String pageName, String pageDesc, String pageTitle, boolean fragment, boolean initialProject) { this(model, pageName, pageDesc, pageTitle, fragment); this.initialProject = initialProject; } protected void createClassnameGroup(Composite parent) { // class name classLabel = new Label(parent, SWT.LEFT); classLabel.setText(Msgs.portletClassLabel); classLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); classText = new Text(parent, SWT.SINGLE | SWT.BORDER); classText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); synchHelper.synchText(classText, INewJavaClassDataModelProperties.CLASS_NAME, null); new Label(parent, SWT.LEFT); } /** * Add folder group to composite */ protected void createFolderGroup(Composite composite) { // folder Label folderLabel = new Label(composite, SWT.LEFT); folderLabel.setText(J2EEUIMessages.FOLDER_LABEL); folderLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); folderText = new Text(composite, SWT.SINGLE | SWT.BORDER); folderText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); synchHelper.synchText(folderText, INewJavaClassDataModelProperties.SOURCE_FOLDER, null); IPackageFragmentRoot root = getSelectedPackageFragmentRoot(); String projectName = model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME); if (projectName != null && projectName.length() > 0) { IProject targetProject = ProjectUtilities.getProject(projectName); if (root == null || !root.getJavaProject().getProject().equals(targetProject)) { IFolder folder = getDefaultJavaSourceFolder(targetProject); if (folder != null) { folderText.setText(folder.getFullPath().toPortableString()); } } else { folderText.setText(root.getPath().toString()); } } folderButton = new Button(composite, SWT.PUSH); folderButton.setText(J2EEUIMessages.BROWSE_BUTTON_LABEL); folderButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); folderButton.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // Do nothing } public void widgetSelected(SelectionEvent e) { handleFolderButtonPressed(); } }); } protected void createNewPortletClassGroup(Composite parent) { new Label(parent, SWT.LEFT); Composite composite = new Composite(parent, SWT.NONE); composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); composite.setLayout(new GridLayout(2, false)); createNewClassRadio = new Button(composite, SWT.RADIO); createNewClassRadio.setText(Msgs.createNewPortlet); useDefaultPortletRadio = new Button(composite, SWT.RADIO); useDefaultPortletRadio.setText(Msgs.useDefaultPortlet); new Label(parent, SWT.NONE); synchHelper.synchRadio(createNewClassRadio, CREATE_NEW_PORTLET_CLASS, null); synchHelper.synchRadio(useDefaultPortletRadio, USE_DEFAULT_PORTLET_CLASS, null); createNewClassRadio.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { classText.setEnabled(createNewClassRadio.getSelection()); packageText.setEnabled(createNewClassRadio.getSelection()); superCombo.setEnabled(createNewClassRadio.getSelection()); } }); } protected void createPackageGroup(Composite parent) { // package packageLabel = new Label(parent, SWT.LEFT); packageLabel.setText(J2EEUIMessages.JAVA_PACKAGE_LABEL); packageLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); packageText = new Text(parent, SWT.SINGLE | SWT.BORDER); packageText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); synchHelper.synchText(packageText, INewJavaClassDataModelProperties.JAVA_PACKAGE, null); IPackageFragment packageFragment = getSelectedPackageFragment(); String targetProject = model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME); if (packageFragment != null && packageFragment.exists() && packageFragment.getJavaProject().getElementName().equals(targetProject)) { IPackageFragmentRoot root = getPackageFragmentRoot(packageFragment); if (root != null) { folderText.setText(root.getPath().toString()); } model.setProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE, packageFragment.getElementName()); } if (this.fragment) { SWTUtil.createLabel(parent, StringPool.EMPTY, 1); } else { packageButton = new Button(parent, SWT.PUSH); packageButton.setText(J2EEUIMessages.BROWSE_BUTTON_LABEL); packageButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); packageButton.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // Do nothing } public void widgetSelected(SelectionEvent e) { handlePackageButtonPressed(); } }); } } protected void createPortletClassGroup(Composite parent) { if (!this.fragment && getDataModel().getBooleanProperty(SHOW_NEW_CLASS_OPTION)) { createNewPortletClassGroup(parent); } createClassnameGroup(parent); createPackageGroup(parent); createSuperclassGroup(parent); } /** * Add project group */ protected void createProjectNameGroup(Composite parent) { // set up project name label projectNameLabel = new Label(parent, SWT.NONE); projectNameLabel.setText("Portlet plugin project:"); //$NON-NLS-1$ projectNameLabel.setLayoutData(new GridData()); // set up project name entry field projectNameCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY); GridData data = new GridData(GridData.FILL_HORIZONTAL); data.widthHint = 300; data.horizontalSpan = 1; projectNameCombo.setLayoutData(data); projectNameCombo.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); IProject project = CoreUtil.getProject(projectNameCombo.getText()); validateProjectRequirements(project); getDataModel().notifyPropertyChange(SUPERCLASS, IDataModel.VALID_VALUES_CHG); getDataModel().notifyPropertyChange(ENTRY_CATEGORY, IDataModel.VALID_VALUES_CHG); } }); synchHelper.synchCombo(projectNameCombo, IArtifactEditOperationDataModelProperties.PROJECT_NAME, null); initializeProjectList(); new Label(parent, SWT.NONE); } protected void createSuperclassGroup(Composite parent) { // superclass superLabel = new Label(parent, SWT.LEFT); superLabel.setText(J2EEUIMessages.SUPERCLASS_LABEL); superLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); // superText = new Text(parent, SWT.SINGLE | SWT.BORDER); // superText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // synchHelper.synchText(superText, // INewJavaClassDataModelProperties.SUPERCLASS, null); superCombo = new Combo(parent, SWT.DROP_DOWN); superCombo.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); synchHelper.synchCombo(superCombo, INewJavaClassDataModelProperties.SUPERCLASS, null); if (this.fragment) { SWTUtil.createLabel(parent, StringPool.EMPTY, 1); } else { superButton = new Button(parent, SWT.PUSH); superButton.setText(J2EEUIMessages.BROWSE_BUTTON_LABEL); superButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); superButton.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent e) { // Do nothing } public void widgetSelected(SelectionEvent e) { // handleSuperButtonPressed(); handleClassButtonSelected(superCombo, "javax.portlet.Portlet", //$NON-NLS-1$ J2EEUIMessages.SUPERCLASS_SELECTION_DIALOG_TITLE, J2EEUIMessages.SUPERCLASS_SELECTION_DIALOG_DESC); } }); } } @Override protected Composite createTopLevelComposite(Composite parent) { Composite composite = SWTUtil.createTopComposite(parent, 3); if (!this.fragment) { createProjectNameGroup(composite); createFolderGroup(composite); addSeperator(composite, 3); } createPortletClassGroup(composite); setFocusOnClassText(); setShellImage(); return composite; } @Override protected void enter() { super.enter(); validatePage(); } protected ViewerFilter getContainerDialogViewerFilter() { return new ViewerFilter() { public boolean select(Viewer viewer, Object parent, Object element) { if (element instanceof IProject) { IProject project = (IProject) element; return project.getName() .equals(model.getProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME)); } else if (element instanceof IFolder) { IFolder folder = (IFolder) element; // only show source folders IProject project = ProjectUtilities.getProject( model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME)); IPackageFragmentRoot[] sourceFolders = J2EEProjectUtilities.getSourceContainers(project); for (int i = 0; i < sourceFolders.length; i++) { if (sourceFolders[i].getResource() != null && sourceFolders[i].getResource().equals(folder)) { return true; } else if (ProjectUtil.isParent(folder, sourceFolders[i].getResource())) { return true; } } } return false; } }; } protected IFolder getDefaultJavaSourceFolder(IProject project) { if (project == null) { return null; } IPackageFragmentRoot[] sources = J2EEProjectUtilities.getSourceContainers(project); // Try and return the first source folder if (sources.length > 0) { try { return (IFolder) sources[0].getCorrespondingResource(); } catch (Exception e) { return null; } } return null; } /** * @return */ protected IPackageFragment getSelectedPackageFragment() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) { return null; } ISelection selection = window.getSelectionService().getSelection(); if (selection == null) { return null; } IJavaElement element = getInitialJavaElement(selection); if (element != null) { if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { return (IPackageFragment) element; } else if (element.getElementType() == IJavaElement.COMPILATION_UNIT) { IJavaElement parent = ((ICompilationUnit) element).getParent(); if (parent.getElementType() == IJavaElement.PACKAGE_FRAGMENT) { return (IPackageFragment) parent; } } else if (element.getElementType() == IJavaElement.TYPE) { return ((IType) element).getPackageFragment(); } } return null; } protected IPackageFragmentRoot getSelectedPackageFragmentRoot() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) { return null; } ISelection selection = window.getSelectionService().getSelection(); if (selection == null) { return null; } // StructuredSelection stucturedSelection = (StructuredSelection) // selection; IJavaElement element = getInitialJavaElement(selection); if (element != null) { if (element.getElementType() == IJavaElement.PACKAGE_FRAGMENT_ROOT) { return (IPackageFragmentRoot) element; } } return null; } protected IProject getSelectedProject() { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) { return null; } ISelection selection = window.getSelectionService().getSelection(); if (selection == null) { return null; } if (!(selection instanceof IStructuredSelection)) { return null; } IJavaElement element = getInitialJavaElement(selection); if (element != null && element.getJavaProject() != null) { return element.getJavaProject().getProject(); } IStructuredSelection stucturedSelection = (IStructuredSelection) selection; if (stucturedSelection.getFirstElement() instanceof EObject) { return ProjectUtilities.getProject(stucturedSelection.getFirstElement()); } return getExtendedSelectedProject(stucturedSelection.getFirstElement()); } protected String[] getValidationPropertyNames() { List<String> validationPropertyNames = new ArrayList<String>(); if (this.fragment) { return new String[] { IArtifactEditOperationDataModelProperties.COMPONENT_NAME, INewJavaClassDataModelProperties.JAVA_PACKAGE, INewJavaClassDataModelProperties.CLASS_NAME, INewJavaClassDataModelProperties.SUPERCLASS }; } else { validationPropertyNames.add(CREATE_NEW_PORTLET_CLASS); validationPropertyNames.add(USE_DEFAULT_PORTLET_CLASS); Collections.addAll(validationPropertyNames, super.getValidationPropertyNames()); } return validationPropertyNames.toArray(new String[0]); } protected void handleClassButtonSelected(Control control, String baseClass, String title, String message) { getControl().setCursor(new Cursor(getShell().getDisplay(), SWT.CURSOR_WAIT)); IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model .getProperty(INewJavaClassDataModelProperties.JAVA_PACKAGE_FRAGMENT_ROOT); if (packRoot == null) { return; } // this eliminates the non-exported classpath entries // final IJavaSearchScope scope = // TypeSearchEngine.createJavaSearchScopeForAProject(packRoot.getJavaProject(), // true, true); IJavaSearchScope scope = null; try { IType type = packRoot.getJavaProject().findType(baseClass); if (type == null) { return; } scope = BasicSearchEngine.createHierarchyScope(type); } catch (JavaModelException e) { PortletUIPlugin.logError(e); return; } // This includes all entries on the classpath. This behavior is // identical // to the Super Class Browse Button on the Create new Java Class Wizard // final IJavaSearchScope scope = SearchEngine.createJavaSearchScope(new // IJavaElement[] {root.getJavaProject()} ); FilteredTypesSelectionDialog dialog = new FilteredTypesSelectionDialogEx(getShell(), false, getWizard().getContainer(), scope, IJavaSearchConstants.CLASS); dialog.setTitle(title); dialog.setMessage(message); if (dialog.open() == Window.OK) { IType type = (IType) dialog.getFirstResult(); String classFullPath = J2EEUIMessages.EMPTY_STRING; if (type != null) { classFullPath = type.getFullyQualifiedName(); } if (control instanceof Text) { ((Text) control).setText(classFullPath); } else if (control instanceof Combo) { ((Combo) control).setText(classFullPath); } getControl().setCursor(null); return; } getControl().setCursor(null); } protected void handleCustomButtonSelected() { // boolean enable = customButton.getSelection(); // portletClassLabel.setEnabled(!enable); // portletClassText.setEnabled(!enable); // packageText.setEnabled(enable); // packageButton.setEnabled(enable); // packageLabel.setEnabled(enable); // classText.setEnabled(enable); // classLabel.setEnabled(enable); // superText.setEnabled(enable); // superCombo.setEnabled(enable); // superButton.setEnabled(enable); // superLabel.setEnabled(enable); } /** * Browse for a new Destination Folder */ protected void handleFolderButtonPressed() { ISelectionStatusValidator validator = getContainerDialogSelectionValidator(); ViewerFilter filter = getContainerDialogViewerFilter(); ITreeContentProvider contentProvider = new WorkbenchContentProvider(); ILabelProvider labelProvider = new DecoratingLabelProvider(new WorkbenchLabelProvider(), PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()); ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(getShell(), labelProvider, contentProvider); dialog.setValidator(validator); dialog.setTitle(J2EEUIMessages.CONTAINER_SELECTION_DIALOG_TITLE); dialog.setMessage(J2EEUIMessages.CONTAINER_SELECTION_DIALOG_DESC); dialog.addFilter(filter); String projectName = model.getStringProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME); if (projectName == null || projectName.length() == 0) { return; } IProject project = ProjectUtilities.getProject(projectName); dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); if (project != null) { dialog.setInitialSelection(project); } if (dialog.open() == Window.OK) { Object element = dialog.getFirstResult(); try { if (element instanceof IContainer) { IContainer container = (IContainer) element; folderText.setText(container.getFullPath().toString()); // dealWithSelectedContainerResource(container); } } catch (Exception ex) { // Do nothing } } } protected void initializeProjectList() { IProject[] workspaceProjects = CoreUtil.getAllProjects(); List<String> items = new ArrayList<String>(); for (int i = 0; i < workspaceProjects.length; i++) { IProject project = workspaceProjects[i]; if (isProjectValid(project)) { items.add(project.getName()); } } if (items.isEmpty()) { return; } String[] names = new String[items.size()]; for (int i = 0; i < items.size(); i++) { names[i] = (String) items.get(i); } projectNameCombo.setItems(names); IProject selectedProject = null; try { if (model != null) { String projectNameFromModel = model .getStringProperty(IArtifactEditOperationDataModelProperties.COMPONENT_NAME); if (projectNameFromModel != null && projectNameFromModel.length() > 0) { selectedProject = CoreUtil.getProject(projectNameFromModel); } } } catch (Exception e) { } ; try { if (selectedProject == null) { selectedProject = getSelectedProject(); } if (selectedProject != null && selectedProject.isAccessible() && selectedProject.hasNature(IModuleConstants.MODULE_NATURE_ID)) { projectNameCombo.setText(selectedProject.getName()); validateProjectRequirements(selectedProject); model.setProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME, selectedProject.getName()); } } catch (CoreException ce) { // Ignore } if (projectName == null && names.length > 0) { projectName = names[0]; } if ((projectNameCombo.getText() == null || projectNameCombo.getText().length() == 0) && projectName != null) { projectNameCombo.setText(projectName); validateProjectRequirements(CoreUtil.getProject(projectName)); model.setProperty(IArtifactEditOperationDataModelProperties.PROJECT_NAME, projectName); } projectNameLabel.setEnabled(!initialProject); projectNameCombo.setEnabled(!initialProject); } protected boolean isProjectValid(IProject project) { return super.isProjectValid(project) && ProjectUtil.isPortletProject(project); } protected void setFocusOnClassText() { if (classText != null) { classText.setFocus(); } } protected void setShellImage() { URL url = PortletUIPlugin.getDefault().getBundle().getEntry("/icons/e16/portlet.png"); //$NON-NLS-1$ Image shellImage = ImageDescriptor.createFromURL(url).createImage(); getShell().setImage(shellImage); } protected void validateProjectRequirements(IProject project) { super.validateProjectRequirements(project); } private static class Msgs extends NLS { public static String createNewPortlet; public static String portletClassLabel; public static String useDefaultPortlet; static { initializeMessages(NewPortletClassWizardPage.class.getName(), Msgs.class); } } }