/****************************************************************************** * 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; } }