/****************************************************************************** * Copyright (c) 2008 g-Eclipse consortium * 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 * * Initial development of the original code was made for * project g-Eclipse founded by European Union * project number: FP6-IST-034327 http://www.geclipse.eu/ * * Contributor(s): * - Katarzyna Bylec (katis@man.poznan.pl) * - Szymon Mueller *****************************************************************************/ package eu.geclipse.servicejob.ui.wizard; import java.net.URL; import java.util.ArrayList; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.runtime.IPath; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ILabelProviderListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.wizard.IWizardPage; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; import org.eclipse.swt.widgets.TreeItem; import org.eclipse.ui.PlatformUI; import eu.geclipse.core.model.GridModel; import eu.geclipse.core.model.IGridElement; import eu.geclipse.core.model.IGridProject; import eu.geclipse.core.model.IGridRoot; import eu.geclipse.core.reporting.ProblemException; import eu.geclipse.servicejob.ui.Activator; import eu.geclipse.ui.dialogs.ProblemDialog; /** * Wizard page for selecting project in which should service job be created. */ public class ProjectSelectionPage extends WizardPage { static IGridProject selectedProject; String serviceJobName; Text nameText; private Tree tree; private IGridProject initialProject; /** * Constructor of project selection page. * * @param pageName Name of this page. */ public ProjectSelectionPage( final String pageName ) { super( pageName ); setTitle( "Project selection page" ); setDescription( "Choose project that contains services you want to perform operator's job on." ); } public ProjectSelectionPage( final String pageName, final IGridProject selectedProject ) { this( pageName ); this.initialProject = selectedProject; if (this.initialProject != null){ this.selectedProject = this.initialProject; } } protected void updateButtons() { getContainer().updateButtons(); } @Override public boolean canFlipToNextPage() { boolean flag = false; setErrorMessage( null ); if( this.selectedProject != null && this.serviceJobName != null && !this.serviceJobName.equals( "" ) ) { flag = true; IPath projectPath = this.selectedProject.getPath(); IPath serviceJobsFolderPath = projectPath.append( "/" //$NON-NLS-1$ + ServiceJobWizard.SERVICE_JOBS_FOLDER + "/" ); //$NON-NLS-1$ IWorkspaceRoot workspaceRoot = ( IWorkspaceRoot )GridModel.getRoot() .getResource(); IFolder serviceJobsFolder = workspaceRoot.getFolder( serviceJobsFolderPath ); if( serviceJobsFolder.exists() ) { IFile serviceJobFile = serviceJobsFolder.getFile( this.serviceJobName + ServiceJobWizard.SERVICE_JOB_EXTENSION ); if( serviceJobFile.exists() ) { setErrorMessage( "Operator's Job with this name already exists." ); flag = false; } } } return flag && getNextPage() != null; } public void createControl( final Composite parent ) { Composite mainComp = new Composite( parent, SWT.NONE ); mainComp.setLayout( new GridLayout( 1, false ) ); GridData gd = new GridData( GridData.FILL_BOTH ); gd.grabExcessHorizontalSpace = true; gd.grabExcessVerticalSpace = true; gd.verticalSpan = 3; gd.horizontalSpan = 2; gd.heightHint = 300; gd.widthHint = 250; final TreeViewer treeViewer = new TreeViewer( mainComp, SWT.SINGLE | SWT.BORDER ); treeViewer.setContentProvider( new CProvider() ); treeViewer.setLabelProvider( new LProvider() ); treeViewer.setInput( GridModel.getRoot() ); setTree( treeViewer.getTree() ); getTree().setLayoutData( gd ); getTree().addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent e ) { Object selectedData = ( ( ( Tree )e.getSource() ).getSelection()[ 0 ] ).getData(); if( selectedData instanceof IGridProject ) { ProjectSelectionPage.selectedProject = ( IGridProject )selectedData; ProjectSelectionPage.this.updateButtons(); } } } ); this.tree.deselectAll(); this.tree.update(); treeViewer.refresh(); // this.tree.layout(); treeViewer.refresh( true ); for( TreeItem item : this.tree.getItems() ) { if( item.getData() instanceof IGridProject ) { if( item.getData().equals( this.initialProject ) ) { this.tree.setSelection( item ); break; } } } Composite textComp = new Composite( mainComp, SWT.NONE ); textComp.setLayout( new GridLayout( 2, false ) ); gd = new GridData( GridData.FILL_BOTH ); gd.grabExcessHorizontalSpace = true; textComp.setLayoutData( gd ); Label nameLabel = new Label( textComp, SWT.LEAD ); nameLabel.setText( "Operator's Job name" ); gd = new GridData(); nameLabel.setLayoutData( gd ); this.nameText = new Text( textComp, SWT.BORDER | SWT.LEAD ); gd = new GridData( GridData.FILL_HORIZONTAL ); this.nameText.setLayoutData( gd ); this.nameText.addModifyListener( new ModifyListener() { public void modifyText( final ModifyEvent e ) { ProjectSelectionPage.this.serviceJobName = ProjectSelectionPage.this.nameText.getText(); ProjectSelectionPage.this.updateButtons(); } } ); setControl( mainComp ); } @Override public IWizardPage getNextPage() { return super.getNextPage(); } public IGridProject getProject() { return this.selectedProject; } private void setTree( final Tree tree ) { this.tree = tree; } private Tree getTree() { return this.tree; } class LProvider implements ILabelProvider { private Image projectImage; /** * Constructor of label provider for project selection page */ public LProvider() { super(); URL argsURL = Activator.getDefault() .getBundle() .getEntry( "icons/gridprojects.gif" ); //$NON-NLS-1$ ImageDescriptor argsDesc = ImageDescriptor.createFromURL( argsURL ); this.projectImage = argsDesc.createImage(); } public Image getImage( final Object element ) { return this.projectImage; } public String getText( final Object element ) { return ( ( IGridProject )element ).getName(); } public void addListener( final ILabelProviderListener listener ) { // empty implementation } public void dispose() { this.projectImage.dispose(); } public boolean isLabelProperty( final Object element, final String property ) { return false; } public void removeListener( final ILabelProviderListener listener ) { // empty implementation } } class CProvider implements ITreeContentProvider { public Object[] getChildren( final Object parentElement ) { return new Object[ 0 ]; } public Object getParent( final Object element ) { return new Object(); } public boolean hasChildren( final Object element ) { return false; } public Object[] getElements( final Object inputElement ) { ArrayList<IGridProject> projects = new ArrayList<IGridProject>(); IGridElement[] elements = null; try { elements = ( ( IGridRoot )inputElement ).getChildren( null ); } catch( ProblemException e ) { ProblemDialog.openProblem( PlatformUI.getWorkbench() .getActiveWorkbenchWindow() .getShell(), "Error when fetching children", "Error when fetching children of " + inputElement.toString(), e ); } for( IGridElement elem : elements ) { if( elem instanceof IGridProject && !( ( IGridProject )elem ).isHidden() && ((IGridProject)elem).hasGridNature() && ((IGridProject)elem).isOpen() ) { projects.add( ( IGridProject )elem ); } } return projects.toArray(); } public void dispose() { // empty implementation } public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) { // empty implementation } } /** * Getter method to access name of service job. * * @return String name of service job that will be used in all views as well * as a name of GTDL file. */ public String getJobName() { return this.serviceJobName; } }