Java tutorial
/****************************************************************************** * Copyright (c) 2009-2013, Linagora * * 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: * Linagora - initial API and implementation *******************************************************************************/ package com.ebmwebsourcing.petals.common.internal.wizards; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.IWorkspaceRunnable; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; 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.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import com.ebmwebsourcing.petals.common.internal.Messages; import com.ebmwebsourcing.petals.common.internal.PetalsCommonPlugin; /** * The only required page to create a new 'jbi.xml' file. * @author Vincent Zurczak - EBM WebSourcing */ public class JbiXmlNewWizardPage extends WizardPage { /** * The selected container for the target file. */ private IContainer selectedContainer; /** * True to overwrite an existing file, false otherwise. */ private boolean overwriteExistingFile = false; /** * Constructor. * @param pageName * @param selection */ public JbiXmlNewWizardPage(String pageName, IStructuredSelection selection) { super(pageName); setTitle(Messages.NewJbiXmlWizardPage_0); setDescription(Messages.NewJbiXmlWizardPage_1); if (selection != null) { Object o = (selection).getFirstElement(); if (o instanceof IContainer) this.selectedContainer = (IContainer) o; } } /* * (non-Javadoc) * @see org.eclipse.jface.dialogs.IDialogPage * #createControl(org.eclipse.swt.widgets.Composite) */ @Override public void createControl(Composite parent) { // Create the composite container and define its layout final Composite container = new Composite(parent, SWT.NONE); GridLayout layout = new GridLayout(); layout.marginLeft = layout.marginRight = 15; layout.marginTop = 15; container.setLayout(layout); container.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); // Container viewer new Label(container, SWT.NONE).setText(Messages.NewJbiXmlWizardPage_2); final Text folderPathText = new Text(container, SWT.SINGLE | SWT.BORDER); folderPathText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); TreeViewer viewer = new TreeViewer(container, SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.HIDE_SELECTION); GridData layoutData = new GridData(GridData.FILL_BOTH); layoutData.heightHint = 100; viewer.getTree().setLayoutData(layoutData); viewer.setLabelProvider(new WorkbenchLabelProvider()); viewer.setContentProvider(new WorkbenchContentProvider() { /* * (non-Javadoc) * @see org.eclipse.ui.model.BaseWorkbenchContentProvider * #getChildren(java.lang.Object) */ @Override public Object[] getChildren(Object o) { if (o instanceof IProject && !((IProject) o).isOpen()) return new Object[0]; List<IResource> children = new ArrayList<IResource>(); if (o instanceof IContainer) { try { IResource[] members = ((IContainer) o).members(); for (IResource member : members) { if (member instanceof IContainer || (member instanceof IFile && member.getName().equals("jbi.xml"))) //$NON-NLS-1$ children.add(member); } } catch (CoreException e) { PetalsCommonPlugin.log(e, IStatus.ERROR); } } return children.toArray(new IResource[0]); } /* * (non-Javadoc) * @see org.eclipse.ui.model.BaseWorkbenchContentProvider * #hasChildren(java.lang.Object) */ @Override public boolean hasChildren(Object element) { return getChildren(element).length > 0; } }); // Set page input IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot(); viewer.setInput(root); if (this.selectedContainer != null) { viewer.setSelection(new StructuredSelection(this.selectedContainer), true); viewer.expandToLevel(this.selectedContainer, 1); } viewer.addPostSelectionChangedListener(new ISelectionChangedListener() { @Override public void selectionChanged(SelectionChangedEvent event) { Object o = ((IStructuredSelection) event.getSelection()).getFirstElement(); if (o instanceof IContainer) JbiXmlNewWizardPage.this.selectedContainer = (IContainer) o; else JbiXmlNewWizardPage.this.selectedContainer = ((IFile) o).getParent(); String path = JbiXmlNewWizardPage.this.selectedContainer.getFullPath().toOSString(); String fileSeparator = System.getProperty("file.separator"); //$NON-NLS-1$ if (path.startsWith(fileSeparator)) path = path.substring(fileSeparator.length()); folderPathText.setText(path); validate(); } }); // Overwrite existing file ? final Button overwriteButton = new Button(container, SWT.CHECK); overwriteButton.setText(Messages.NewJbiXmlWizardPage_5); overwriteButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent e) { JbiXmlNewWizardPage.this.overwriteExistingFile = overwriteButton.getSelection(); validate(); } }); // Set control setControl(container); } /** * Validates the page entries. */ private void validate() { String errorMsg = null; boolean isComplete = true; if (this.selectedContainer == null) { isComplete = false; errorMsg = Messages.NewJbiXmlWizardPage_6; } else { IFile f = this.selectedContainer.getFile(new Path("jbi.xml")); //$NON-NLS-1$ if (f.exists() && !this.overwriteExistingFile) { isComplete = false; errorMsg = Messages.NewJbiXmlWizardPage_8; } } setErrorMessage(errorMsg); setPageComplete(isComplete); } /** * Gets the content of the created jbi.xml file. * @return the content as an input stream */ public InputStream getInitialContents() { String jbiXmlTemplate = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" //$NON-NLS-1$ + "<jbi:jbi\n" //$NON-NLS-1$ + "\tversion=\"1.0\"\n" //$NON-NLS-1$ + "\txmlns=\"http://java.sun.com/xml/ns/jbi\"\n" //$NON-NLS-1$ + "\txmlns:jbi=\"http://java.sun.com/xml/ns/jbi\">\n\n" //$NON-NLS-1$ + "</jbi:jbi>"; //$NON-NLS-1$ InputStream inputStream = new ByteArrayInputStream(jbiXmlTemplate.getBytes()); return inputStream; } /** * Creates the new 'jbi.xml' file at the selected location. * @return the created {@link IFile} * @throws CoreException if something went wrong */ public IFile createNewFile() throws CoreException { final IFile file = this.selectedContainer.getFile(new Path("jbi.xml")); //$NON-NLS-1$ IWorkspaceRunnable op = new IWorkspaceRunnable() { @Override public void run(IProgressMonitor monitor) throws CoreException { try { if (file.exists()) file.setContents(getInitialContents(), true, true, monitor); else file.create(getInitialContents(), true, monitor); } finally { monitor.done(); } } }; ResourcesPlugin.getWorkspace().run(op, new NullProgressMonitor()); return file; } /** * @return the selectedContainer */ public IContainer getSelectedContainer() { return this.selectedContainer; } }