Java tutorial
/******************************************************************************* * Copyright (c) 2012 gavingui2011@gmail.com * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * gavingui2011@gmail.com - initial API and implementation * *******************************************************************************/ package org.apache.tapestrytools.ui.internal.wizards; import java.util.ArrayList; import java.util.HashMap; 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.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.ui.JavaElementLabelProvider; import org.eclipse.jface.dialogs.IDialogPage; 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.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardPage; 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.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.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.dialogs.ElementListSelectionDialog; 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.ui.views.contentoutline.ContentOutline; /** * Tapestry component creation wizard page * * @author gavingui2011@gmail.com - Beijing China * */ public class NewTapestryPageClassWizard extends WizardPage { private Text folderText; private Button folderButton; protected Text packageText; protected Button packageButton; protected Label packageLabel; protected Text classText; protected Label classLabel; protected Label projectNameLabel; private Combo projectNameCombo; protected String projectType = "java";// private String projectName; private Button createTemplate; private HashMap<String, Object> model = new HashMap<String, Object>(); /** * Constructor for SampleNewWizardPage. * * @param pageName */ public NewTapestryPageClassWizard(ISelection selection) { super("wizardPage"); setTitle(WizardConstants.NEW_PAGE_TITLE); setDescription(WizardConstants.NEW_PAGE_DESC); } /** * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { Composite composite = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); layout.numColumns = 3; composite.setLayout(layout); GridData data = new GridData(); data.verticalAlignment = GridData.FILL; data.horizontalAlignment = GridData.FILL; data.widthHint = 300; composite.setLayoutData(data); addProjectNameGroup(composite); addFolderGroup(composite); addSeperator(composite, 3); addPackageGroup(composite); addClassnameGroup(composite); //addCreateTemplate(composite); // set the cursor focus // - to the "Java package" if it is empty // - to the "Class name" - otherwise if (packageText.getText().trim().length() == 0) { packageText.setFocus(); } else { classText.setFocus(); } setControl(composite); } /** * Add classname group to composite */ private void addClassnameGroup(Composite composite) { // class name classLabel = new Label(composite, SWT.LEFT); classLabel.setText("Page Name:"); classLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); classText = new Text(composite, SWT.SINGLE | SWT.BORDER); classText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); new Label(composite, SWT.LEFT); } /*private void addCreateTemplate(Composite composite){ Label templateLabel = new Label(composite, SWT.LEFT); templateLabel.setText("Create Page:"); templateLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); createTemplate = new Button(composite, SWT.CHECK); createTemplate.setText("Use Default Page Template"); createTemplate.setToolTipText("Select this checkbox button to create template file for Tapestry 5 page"); createTemplate.setSelection(true); createTemplate.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); }*/ /** * Add package group to composite */ private void addPackageGroup(Composite composite) { // package packageLabel = new Label(composite, SWT.LEFT); packageLabel.setText("Package"); packageLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); packageText = new Text(composite, SWT.SINGLE | SWT.BORDER); packageText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); IPackageFragment packageFragment = getSelectedPackageFragment(); String targetProject = projectNameCombo.getText(); if (packageFragment != null && packageFragment.exists() && packageFragment.getJavaProject().getElementName().equals(targetProject)) { IPackageFragmentRoot root = getPackageFragmentRoot(packageFragment); model.put("JAVA_PACKAGE_FRAGMENT_ROOT", root); if (root != null) folderText.setText(root.getPath().toString()); //model.put(INewJavaClassDataModelProperties.JAVA_PACKAGE, packageFragment.getElementName()); packageText.setText(packageFragment.getElementName()); } packageButton = new Button(composite, SWT.PUSH); packageButton.setText("Browse"); packageButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); packageButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handlePackageButtonPressed(); } public void widgetDefaultSelected(SelectionEvent e) { // Do nothing } }); } protected void handlePackageButtonPressed() { IPackageFragmentRoot packRoot = (IPackageFragmentRoot) model.get("JAVA_PACKAGE_FRAGMENT_ROOT"); if (packRoot == null && !this.folderText.getText().isEmpty()) { String projectName = this.projectNameCombo.getText(); String folderName = this.folderText.getText(); if (projectName != null && projectName.length() > 0) { IProject targetProject = ResourcesPlugin.getWorkspace().getRoot().findMember(projectName) .getProject(); try { IPackageFragmentRoot[] roots = JavaCore.create(targetProject).getAllPackageFragmentRoots(); for (IPackageFragmentRoot root : roots) { if (folderName.toString().replace('\\', '/').equals(root.getPath().toString())) { packRoot = root; break; } } } catch (JavaModelException e) { e.printStackTrace(); } } } if (packRoot == null) return; IJavaElement[] packages = null; try { packages = packRoot.getChildren(); } catch (JavaModelException e) { // Do nothing } if (packages == null) packages = new IJavaElement[0]; ElementListSelectionDialog dialog = new ElementListSelectionDialog(getShell(), new JavaElementLabelProvider(1)); dialog.setTitle(WizardConstants.PACKAGE_SELECTION_DIALOG_TITLE); dialog.setMessage(WizardConstants.PACKAGE_SELECTION_DIALOG_DESC); dialog.setEmptyListMessage(WizardConstants.PACKAGE_SELECTION_DIALOG_MSG_NONE); dialog.setElements(packages); if (dialog.open() == Window.OK) { IPackageFragment fragment = (IPackageFragment) dialog.getFirstResult(); if (fragment != null) { packageText.setText(fragment.getElementName()); } else { packageText.setText("EMPTY_STRING"); } } } private 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 getPackageFragmentRoot(IPackageFragment packageFragment) { if (packageFragment == null) return null; else if (packageFragment.getParent() instanceof IPackageFragment) return getPackageFragmentRoot((IPackageFragment) packageFragment.getParent()); else if (packageFragment.getParent() instanceof IPackageFragmentRoot) return (IPackageFragmentRoot) packageFragment.getParent(); else return null; } /** * Add seperator to composite */ protected void addSeperator(Composite composite, int horSpan) { GridData data = new GridData(); data.verticalAlignment = GridData.FILL; data.horizontalAlignment = GridData.FILL; data.widthHint = 300; // Separator label Label seperator = new Label(composite, SWT.HORIZONTAL | SWT.SEPARATOR); data = new GridData(GridData.HORIZONTAL_ALIGN_FILL); data.horizontalSpan = horSpan; seperator.setLayoutData(data); } /** * Add folder group to composite */ private void addFolderGroup(Composite composite) { // folder Label folderLabel = new Label(composite, SWT.LEFT); folderLabel.setText("Source folder:"); folderLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); folderText = new Text(composite, SWT.SINGLE | SWT.BORDER); folderText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); IPackageFragmentRoot root = getSelectedPackageFragmentRoot(); String projectName = projectNameCombo.getText(); if (projectName != null && projectName.length() > 0) { IProject targetProject = ResourcesPlugin.getWorkspace().getRoot().findMember(projectName).getProject(); if (root == null || !root.getJavaProject().getProject().equals(targetProject)) { IFolder folder = getDefaultJavaSourceFolder(targetProject); if (folder != null) { folderText.setText(folder.getFullPath().toString()); } } else { folderText.setText(root.getPath().toString()); } } folderButton = new Button(composite, SWT.PUSH); folderButton.setText("Browse"); folderButton.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL)); folderButton.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { handleFolderButtonPressed(); } public void widgetDefaultSelected(SelectionEvent e) { // Do nothing } }); } /** * 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(WizardConstants.CONTAINER_SELECTION_DIALOG_TITLE); dialog.setMessage(WizardConstants.CONTAINER_SELECTION_DIALOG_DESC); dialog.addFilter(filter); String projectName = projectNameCombo.getText(); ; if (projectName == null || projectName.length() == 0) return; IProject project = ResourcesPlugin.getWorkspace().getRoot().findMember(projectName).getProject(); 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()); model.put("JAVA_PACKAGE_FRAGMENT_ROOT", null); } } catch (Exception ex) { // Do nothing } } } /** * Returns a new instance of the Selection Listner for the Container * Selection Dialog */ protected ViewerFilter getContainerDialogViewerFilter() { return new ViewerFilter() { @Override public boolean select(Viewer viewer, Object parent, Object element) { if (element instanceof IProject) { IProject project = (IProject) element; return project.getName().equals(projectNameCombo.getText()); } else if (element instanceof IFolder) { IFolder folder = (IFolder) element; // only show source folders IProject project = ResourcesPlugin.getWorkspace().getRoot() .findMember(projectNameCombo.getText()).getProject(); IPackageFragmentRoot[] sourceFolders; try { sourceFolders = JavaCore.create(project).getAllPackageFragmentRoots(); for (int i = 0; i < sourceFolders.length; i++) { if (sourceFolders[i].getResource() != null && !sourceFolders[i].isArchive() && sourceFolders[i].getResource().toString().startsWith(folder.toString())) return true; } } catch (JavaModelException e) { e.printStackTrace(); } } return false; } }; } protected ISelectionStatusValidator getContainerDialogSelectionValidator() { return null; } private IPackageFragmentRoot getSelectedPackageFragmentRoot() { 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_ROOT) return (IPackageFragmentRoot) element; } return null; } private IFolder getDefaultJavaSourceFolder(IProject project) { if (project == null) return null; try { IPackageFragmentRoot[] roots = JavaCore.create(project).getAllPackageFragmentRoots(); if (roots != null && roots.length > 0) { return (IFolder) roots[0].getCorrespondingResource(); } } catch (JavaModelException e) { e.printStackTrace(); } return null; } /** * Add project group */ private void addProjectNameGroup(Composite parent) { // set up project name label projectNameLabel = new Label(parent, SWT.NONE); projectNameLabel.setText("Project:"); GridData data = new GridData(); projectNameLabel.setLayoutData(data); // set up project name entry field projectNameCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY); data = new GridData(GridData.FILL_HORIZONTAL); data.widthHint = 300; data.horizontalSpan = 1; projectNameCombo.setLayoutData(data); projectNameCombo.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { super.widgetSelected(e); } }); initializeProjectList(); new Label(parent, SWT.NONE); } private void initializeProjectList() { IProject[] workspaceProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); List items = new ArrayList(); 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; if (selectedProject == null) selectedProject = getSelectedProject(); if (selectedProject != null && selectedProject.isAccessible()) { projectNameCombo.setText(selectedProject.getName()); } if (projectName == null && names.length > 0) projectName = names[0]; if ((projectNameCombo.getText() == null || projectNameCombo.getText().length() == 0) && projectName != null) { projectNameCombo.setText(projectName); } } protected boolean isProjectValid(IProject project) { boolean result = true; /* try { result = project.isAccessible() && project.hasNature(IModuleConstants.MODULE_NATURE_ID) && JavaEEProjectUtilities.getJ2EEProjectType(project).equals(projectType); } catch (CoreException ce) { result = false; }*/ return result; } private 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; IProject project = getExtendedSelectedProject(stucturedSelection.getFirstElement()); if (project != null) { return project; } if (selection instanceof TreeSelection && (((TreeSelection) selection).getPaths().length > 0)) { TreePath path = (((TreeSelection) selection).getPaths()[0]); if (path.getSegmentCount() > 0 && path.getSegment(0) instanceof IProject) { return (IProject) path.getSegment(0); } } return null; } protected IProject getExtendedSelectedProject(Object selection) { /*if (selection instanceof CompressedJavaProject) { return ((CompressedJavaProject) selection).getProject().getProject(); }*/ return null; } protected IJavaElement getInitialJavaElement(ISelection selection) { IJavaElement jelem = null; if (selection != null && !selection.isEmpty() && selection instanceof IStructuredSelection) { Object selectedElement = ((IStructuredSelection) selection).getFirstElement(); jelem = getJavaElement(selectedElement); if (jelem == null) { IResource resource = getResource(selectedElement); if (resource != null && resource.getType() != IResource.ROOT) { while (jelem == null && resource.getType() != IResource.PROJECT) { resource = resource.getParent(); jelem = (IJavaElement) resource.getAdapter(IJavaElement.class); } if (jelem == null) { jelem = JavaCore.create(resource); } } } } if (jelem == null) { IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window == null) return null; IWorkbenchPart part = window.getActivePage().getActivePart(); if (part instanceof ContentOutline) { part = window.getActivePage().getActiveEditor(); } } if (jelem == null || jelem.getElementType() == IJavaElement.JAVA_MODEL) { try { IJavaProject[] projects = JavaCore.create(getWorkspaceRoot()).getJavaProjects(); if (projects.length == 1) { jelem = projects[0]; } } catch (JavaModelException e) { e.printStackTrace(); } } return jelem; } protected IJavaElement getJavaElement(Object obj) { if (obj == null) return null; if (obj instanceof IJavaElement) return (IJavaElement) obj; if (obj instanceof IAdaptable) return (IJavaElement) ((IAdaptable) obj).getAdapter(IJavaElement.class); return (IJavaElement) Platform.getAdapterManager().getAdapter(obj, IJavaElement.class); } protected IResource getResource(Object obj) { if (obj == null) return null; if (obj instanceof IResource) return (IResource) obj; if (obj instanceof IAdaptable) return (IResource) ((IAdaptable) obj).getAdapter(IResource.class); return (IResource) Platform.getAdapterManager().getAdapter(obj, IResource.class); } protected IWorkspaceRoot getWorkspaceRoot() { return ResourcesPlugin.getWorkspace().getRoot(); } public String getProjectName() { return projectNameCombo.getText(); } public String getFolderName() { return folderText.getText(); } public String getPackageName() { return packageText.getText(); } public String getClassName() { return classText.getText(); } public boolean createTemplateOrNot() { return createTemplate.getSelection(); } }