// Created on 30.09.2007 package org.eclipse.rap.rms.ui.internal.datamodel; import org.eclipse.core.databinding.DataBindingContext; import org.eclipse.core.databinding.conversion.IConverter; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredContentProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.window.Window; import org.eclipse.jface.wizard.WizardDialog; import org.eclipse.osgi.util.NLS; import org.eclipse.rap.rms.data.ITask; import org.eclipse.rap.rms.ui.internal.Activator; import org.eclipse.rap.rms.ui.internal.RMSMessages; import org.eclipse.rap.rms.ui.internal.datamodel.PageUtil.Container; import org.eclipse.rap.rms.ui.internal.wizards.NewEntityWizard; import org.eclipse.swt.SWT; 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.widgets.Composite; import org.eclipse.swt.widgets.DateTime; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.forms.IManagedForm; import org.eclipse.ui.forms.editor.FormEditor; import org.eclipse.ui.forms.editor.FormPage; import org.eclipse.ui.forms.widgets.FormToolkit; import org.eclipse.ui.forms.widgets.ScrolledForm; import org.eclipse.ui.forms.widgets.Section; public class ProjectTasksPage extends FormPage { private static final String TASKS = "Tasks"; //$NON-NLS-1$ private final ProjectCopy project; private Text txtName; private Text txtDesc; private DateTime dtStart; private DateTime dtEnd; private DataBindingContext ctx; private TaskCopy currentTask; private TableViewer taskViewer; private final class TaskLabelProvider extends LabelProvider implements ITableLabelProvider { public Image getColumnImage( final Object element, final int columnIndex ) { return null; } public String getColumnText( final Object element, final int columnIndex ) { String result = null; ITask task = ( ITask )element; IConverter converter = PageUtil.DATE_TO_STRING_CONVERTER; switch( columnIndex ) { case 0: result = task.getName(); break; case 1: result = task.getDescription(); break; case 2: result = ( String )converter.convert( task.getStartDate() ); break; case 3: result = ( String )converter.convert( task.getEndDate() ); break; default: Object[] param = new Object[] { new Integer( columnIndex ) }; String msg = NLS.bind( RMSMessages.get().ProjectTasksPage_ColumnIndexNotSupported, param ); throw new IllegalStateException( msg ); } return result; } } private final class TaskContentProvider implements IStructuredContentProvider { public Object[] getElements( final Object inputElement ) { return project.getTasks().toArray(); } public void dispose() { } public void inputChanged( final Viewer viewer, final Object oldInput, final Object newInput ) { } } public ProjectTasksPage( final FormEditor editor, final ProjectCopy project ) { super( editor, TASKS, RMSMessages.get().ProjectTasksPage_Title ); this.project = project; } public void init( final IEditorSite site, final IEditorInput input ) { super.init( site, input ); setTitleToolTip( RMSMessages.get().ProjectTasksPage_ToolTip ); } protected void createFormContent( final IManagedForm managedForm ) { ScrolledForm scrolledForm = managedForm.getForm(); FormToolkit toolkit = managedForm.getToolkit(); Composite body = PageUtil.createBody( scrolledForm, Activator.IMG_FORM_HEAD_TASKS ); // task detail section final Composite detail = PageUtil.createSection( scrolledForm, toolkit, body, RMSMessages.get().ProjectTasksPage_TaskDetails, RMSMessages.get().ProjectTasksPage_AddOrEditTask, 3, false ); Container cDetail = new Container( toolkit, detail ); SelectionAdapter newTask = new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent evt ) { Display display = Display.getCurrent(); NewEntityWizard wizard = new NewEntityWizard( project, ITask.class ); WizardDialog dlg = new WizardDialog( display.getActiveShell(), wizard ); if( dlg.open() == Window.OK ) { taskViewer.refresh(); StructuredSelection selection = new StructuredSelection( wizard.getEntity() ); taskViewer.setSelection( selection ); } } }; txtName = PageUtil.createLabelTextButton( cDetail, RMSMessages.get().ProjectTasksPage_Name, "", //$NON-NLS-1$ Activator.IMG_NEW_TASK, newTask ); txtDesc = PageUtil.createLabelMultiText( cDetail, RMSMessages.get().ProjectTasksPage_Description, "" ); //$NON-NLS-1$ dtStart = PageUtil.createLabelDate( cDetail, RMSMessages.get().ProjectTasksPage_StartDate, null ); dtEnd = PageUtil.createLabelDate( cDetail, RMSMessages.get().ProjectTasksPage_EndDate, null ); // task list section Composite tasks = PageUtil.createSection( scrolledForm, toolkit, body, RMSMessages.get().ProjectTasksPage_TaskList, RMSMessages.get().ProjectTasksPage_SelectTaskToEdit, 1, true ); taskViewer = new TableViewer( tasks ); taskViewer.setContentProvider( new TaskContentProvider() ); taskViewer.setLabelProvider( new TaskLabelProvider() ); Table table = ( Table )taskViewer.getControl(); taskViewer.setColumnProperties( initColumnProperties( table ) ); taskViewer.setInput( project ); taskViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( final SelectionChangedEvent event ) { ISelection selection = event.getSelection(); IStructuredSelection sSelection = ( IStructuredSelection )selection; TaskCopy task = ( TaskCopy )sSelection.getFirstElement(); bindDetailSection( task ); } } ); table.addSelectionListener( new SelectionAdapter() { @Override public void widgetDefaultSelected( final SelectionEvent e ) { Section section = ( Section )detail.getParent(); section.setExpanded( true ); } } ); GridData gridData = new GridData( GridData.FILL_HORIZONTAL ); gridData.heightHint = table.getItemHeight() * 10; table.setLayoutData( gridData ); table.setHeaderVisible( true ); } private void bindDetailSection( final TaskCopy task ) { if( currentTask != null ) { taskViewer.refresh( currentTask ); } currentTask = task; if( ctx != null ) { ctx.dispose(); } ctx = PageUtil.createBindingContext(); txtName.setText( task.getName() ); PageUtil.bindText( ctx, task, txtDesc, TaskCopy.DESCRIPTION ); PageUtil.bindDate( ctx, task, dtStart, TaskCopy.START_DATE ); PageUtil.bindDate( ctx, task, dtEnd, TaskCopy.END_DATE ); } private String[] initColumnProperties( final Table table ) { String[] result = new String[] { RMSMessages.get().ProjectTasksPage_TableName, RMSMessages.get().ProjectTasksPage_TableDescription, RMSMessages.get().ProjectTasksPage_TableStart, RMSMessages.get().ProjectTasksPage_TableEnd }; for( int i = 0; i < result.length; i++ ) { TableColumn tableColumn = new TableColumn( table, SWT.NONE ); tableColumn.setText( result[ i ] ); if( i == 1 ) { tableColumn.setWidth( 250 ); } else { tableColumn.setWidth( 100 ); } } return result; } @Override public void doSave( final IProgressMonitor monitor ) { if( currentTask != null ) { taskViewer.refresh( currentTask ); } super.doSave( monitor ); } }