Package org.apache.tapestrytools.ui.internal.wizards

Source Code of org.apache.tapestrytools.ui.internal.wizards.NewTapestryComponentPage

/*******************************************************************************
* 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 NewTapestryComponentPage 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 NewTapestryComponentPage(ISelection selection) {
    super("wizardPage");
    setTitle(WizardConstants.NEW_COMPONENT_TITLE);
    setDescription(WizardConstants.NEW_COMPONENT_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("Component 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);
  }
  /**
   * In Tapestry it is possible to create components without templates.
   * Please provide an additional checkbox, labeled with "Create template" which is checked by default.
   */
  private void addCreateTemplate(Composite composite){
    Label templateLabel = new Label(composite, SWT.LEFT);
    templateLabel.setText("Create Template:");
    templateLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
   
    createTemplate = new Button(composite, SWT.CHECK);
    createTemplate.setText("Use Default Component Template");
    createTemplate.setToolTipText("Select this checkbox button to create template file for Tapestry 5 component");
    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 new ISelectionStatusValidator() {
      public IStatus validate(Object[] selection) {
        if (selection != null && selection[0] != null && !(selection[0] instanceof IProject))
          return WTPCommonPlugin.OK_STATUS;
        return WTPCommonPlugin.createErrorStatus(J2EEUIMessages.CONTAINER_SELECTION_DIALOG_VALIDATOR_MESG);
      }
    };*/
    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 (part instanceof IViewPartInputProvider) {
        Object elem = ((IViewPartInputProvider) part).getViewPartInput();
        if (elem instanceof IJavaElement) {
          jelem = (IJavaElement) elem;
        }
      }*/
    }

    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();
  }
}
TOP

Related Classes of org.apache.tapestrytools.ui.internal.wizards.NewTapestryComponentPage

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.