/****************************************************************************** * Copyright (c) 2006, 2007 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): * PSNC: * - Katarzyna Bylec (katis@man.poznan.pl) * *****************************************************************************/ package eu.geclipse.ui.widgets; import java.util.ArrayList; import java.util.List; import org.eclipse.debug.core.ILaunchConfiguration; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.ui.AbstractLaunchConfigurationTab; import org.eclipse.jface.dialogs.Dialog; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.ComboBoxCellEditor; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.ICellModifier; import org.eclipse.jface.viewers.IDoubleClickListener; 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.SelectionChangedEvent; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Font; 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.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.swt.widgets.TableItem; /** * @author katis * @param <T> Type of items stored in the table */ public abstract class TabComponent<T> extends AbstractLaunchConfigurationTab { protected Button editButton; protected Button removeButton; protected Button addButton; protected ColumnLayoutData[] tabColumnsLayouts; protected TableViewer table; private IStructuredContentProvider contentProvider; private ITableLabelProvider labelProvider; private String[] tabColumnsHeaders; private String[] tabColumnsProperties; private int tabHeight; private List<Integer> columnsWidth = new ArrayList<Integer>(); private ArrayList<CellEditor> cellEditors = new ArrayList<CellEditor>(); private ICellModifier cellModifier; private int buttonsPosition; private Object input; public TabComponent( final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider, final List<String> propertiesVsHearders, final Object input, final int hight, final int width ) { this( contentProvider, labelProvider, propertiesVsHearders, hight, width, SWT.LEFT ); this.input = input; } /** * @param contentProvider * @param labelProvider * @param propertiesVsHearders */ public TabComponent( final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider, final List<String> propertiesVsHearders, final int hight, final int width ) { this( contentProvider, labelProvider, propertiesVsHearders, hight, width, SWT.LEFT ); } public TabComponent( final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider, final List<String> propertiesVsHearders, final int hight, final int width, final int buttonsPosition ) { this.contentProvider = contentProvider; this.tabHeight = hight; this.labelProvider = labelProvider; this.tabColumnsHeaders = new String[ propertiesVsHearders.size() ]; this.tabColumnsProperties = new String[ propertiesVsHearders.size() ]; this.tabColumnsHeaders = propertiesVsHearders.toArray( this.tabColumnsHeaders ); this.tabColumnsProperties = propertiesVsHearders.toArray( this.tabColumnsProperties ); this.tabColumnsLayouts = new ColumnLayoutData[ this.tabColumnsHeaders.length ]; for( int i = 0; i < this.tabColumnsHeaders.length; i++ ) { this.columnsWidth.add( Integer.valueOf( width ) ); this.tabColumnsLayouts[ i ] = new ColumnWeightData( this.columnsWidth.get( i ) .intValue(), this.columnsWidth.get( i ) .intValue(), false ); } this.buttonsPosition = buttonsPosition; } public TabComponent( final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider, final List<String> propertiesVsHearders, final Object input, final int hight, final List<Integer> columnsWidth, final int buttonsPosition ) { this.contentProvider = contentProvider; this.tabHeight = hight; this.columnsWidth = columnsWidth; this.labelProvider = labelProvider; this.tabColumnsHeaders = new String[ propertiesVsHearders.size() ]; this.tabColumnsProperties = new String[ propertiesVsHearders.size() ]; this.tabColumnsHeaders = propertiesVsHearders.toArray( this.tabColumnsHeaders ); this.tabColumnsProperties = propertiesVsHearders.toArray( this.tabColumnsProperties ); this.tabColumnsLayouts = new ColumnLayoutData[ this.tabColumnsHeaders.length ]; for( int i = 0; i < this.tabColumnsHeaders.length; i++ ) { this.tabColumnsLayouts[ i ] = new ColumnWeightData( this.columnsWidth.get( i ) .intValue(), this.columnsWidth.get( i ) .intValue(), false ); } this.buttonsPosition = buttonsPosition; this.input = input; } public TabComponent( final IStructuredContentProvider contentProvider, final ITableLabelProvider labelProvider, final List<String> propertiesVsHearders, final int hight, final List<Integer> columnsWidth, final int buttonsPosition ) { this.contentProvider = contentProvider; this.tabHeight = hight; this.columnsWidth = columnsWidth; this.labelProvider = labelProvider; this.tabColumnsHeaders = new String[ propertiesVsHearders.size() ]; this.tabColumnsProperties = new String[ propertiesVsHearders.size() ]; this.tabColumnsHeaders = propertiesVsHearders.toArray( this.tabColumnsHeaders ); this.tabColumnsProperties = propertiesVsHearders.toArray( this.tabColumnsProperties ); this.tabColumnsLayouts = new ColumnLayoutData[ this.tabColumnsHeaders.length ]; for( int i = 0; i < this.tabColumnsHeaders.length; i++ ) { this.tabColumnsLayouts[ i ] = new ColumnWeightData( this.columnsWidth.get( i ) .intValue(), this.columnsWidth.get( i ) .intValue(), false ); } this.buttonsPosition = buttonsPosition; } public void createControl( final Composite parent ) { Composite mainComposite1 = new Composite( parent, SWT.NONE ); setControl( mainComposite1 ); GridLayout layout = new GridLayout(); if( this.buttonsPosition == SWT.BOTTOM || this.buttonsPosition == SWT.TOP ) { layout.numColumns = 1; } else { layout.numColumns = 2; } GridData gridData = new GridData( GridData.FILL_HORIZONTAL ); mainComposite1.setLayout( layout ); mainComposite1.setLayoutData( gridData ); mainComposite1.setFont( parent.getFont() ); createTable( mainComposite1 ); createTableButtons( mainComposite1 ); setLabels(); Dialog.applyDialogFont( mainComposite1 ); addEditors(); if( !this.cellEditors.isEmpty() ) { CellEditor[] editorsTable = new CellEditor[ this.cellEditors.size() ]; int i = 0; for( CellEditor editor : this.cellEditors ) { editorsTable[ i ] = editor; i++; } this.table.setCellEditors( editorsTable ); this.table.setCellModifier( this.cellModifier ); } } protected void addEditors() { // do nothing - subclasses defines its behavior } protected void setCellModifier( final ICellModifier cellModifier ) { this.cellModifier = cellModifier; } protected void addComboEditor( final ComboBoxCellEditor editor, final String[] types, final boolean readOnly ) { editor.create( this.table.getTable() ); editor.setItems( types ); if( readOnly ) { editor.setStyle( SWT.READ_ONLY ); } this.cellEditors.add( editor ); } public void addEditor( final CellEditor editor ) { editor.create( this.table.getTable() ); this.cellEditors.add( editor ); } private void createTable( final Composite parent ) { Font font = parent.getFont(); // Create table composite Composite tableComposite = new Composite( parent, SWT.NONE ); GridLayout layout = new GridLayout(); layout.marginHeight = 0; layout.marginWidth = 0; layout.numColumns = 1; GridData gridData = new GridData( GridData.FILL_BOTH ); gridData.heightHint = this.tabHeight; int width = 0; for( Integer value : this.columnsWidth ) { width = width + value.intValue(); } // gridData.widthHint = ( this.tabColumnsHeaders.length * width ) + 30; tableComposite.setLayout( layout ); tableComposite.setLayoutData( gridData ); tableComposite.setFont( font ); // Create label // Label label = new Label( tableComposite, SWT.NONE ); // label.setFont( font ); // label.setText(Messages.getString("OutputFilesTab.output_files_settings_label")); // //$NON-NLS-1$ // Create table this.table = new TableViewer( tableComposite, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.MULTI | SWT.FULL_SELECTION ); Table localTable = this.table.getTable(); TableLayout tableLayout = new TableLayout(); localTable.setLayout( tableLayout ); localTable.setHeaderVisible( true ); localTable.setFont( font ); gridData = new GridData( GridData.FILL_BOTH ); this.table.getControl().setLayoutData( gridData ); this.table.setContentProvider( this.contentProvider ); this.table.setInput( this.input ); this.table.setLabelProvider( this.labelProvider ); this.table.setColumnProperties( this.tabColumnsProperties ); this.table.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( final SelectionChangedEvent event ) { handleTableSelectionChanged( event ); } } ); this.table.addDoubleClickListener( new IDoubleClickListener() { public void doubleClick( final DoubleClickEvent event ) { if( !TabComponent.this.table.getSelection().isEmpty() ) { handleEditButtonSelected(); } } } ); // Create columns for( int i = 0; i < this.tabColumnsHeaders.length; i++ ) { tableLayout.addColumnData( this.tabColumnsLayouts[ i ] ); TableColumn tc = new TableColumn( localTable, SWT.NONE, i ); tc.setResizable( this.tabColumnsLayouts[ i ].resizable ); tc.setText( this.tabColumnsHeaders[ i ] ); } this.table.refresh(); } public String getName() { // TODO Auto-generated method stub return null; } public void initializeFrom( final ILaunchConfiguration configuration ) { // TODO Auto-generated method stub } public void performApply( final ILaunchConfigurationWorkingCopy configuration ) { // TODO Auto-generated method stub } public void setDefaults( final ILaunchConfigurationWorkingCopy configuration ) { // TODO Auto-generated method stub } /** * Responds to a selection changed event in the environment table * * @param event the selection change event */ protected void handleTableSelectionChanged( final SelectionChangedEvent event ) { int size = ( ( IStructuredSelection )event.getSelection() ).size(); this.editButton.setEnabled( size == 1 ); this.removeButton.setEnabled( size > 0 ); } /** * Creates the add/edit/remove buttons for the table * * @param parent the composite in which the buttons should be created */ protected void createTableButtons( final Composite parent ) { // Create button composite Composite buttonComposite = new Composite( parent, SWT.NONE ); GridLayout glayout = new GridLayout(); glayout.marginHeight = 0; glayout.marginWidth = 0; if( this.buttonsPosition == SWT.BOTTOM || this.buttonsPosition == SWT.TOP ) { glayout.numColumns = 3; } else { glayout.numColumns = 1; } GridData gdata = new GridData( GridData.VERTICAL_ALIGN_BEGINNING | GridData.HORIZONTAL_ALIGN_END ); buttonComposite.setLayout( glayout ); buttonComposite.setLayoutData( gdata ); buttonComposite.setFont( parent.getFont() ); if( this.buttonsPosition == SWT.LEFT ) { createVerticalSpacer( buttonComposite, 1 ); } // Create buttons gdata = new GridData( GridData.FILL_BOTH ); this.addButton = new Button( buttonComposite, SWT.PUSH ); this.addButton.setLayoutData( gdata ); this.addButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { handleAddButtonSelected(); } } ); gdata = new GridData( GridData.FILL_BOTH ); this.editButton = new Button( buttonComposite, SWT.PUSH ); this.editButton.setLayoutData( gdata ); this.editButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { handleEditButtonSelected(); } } ); this.editButton.setEnabled( false ); gdata = new GridData( GridData.FILL_BOTH ); this.removeButton = new Button( buttonComposite, SWT.PUSH ); this.removeButton.setLayoutData( gdata ); this.removeButton.addSelectionListener( new SelectionAdapter() { @Override public void widgetSelected( final SelectionEvent event ) { handleRemoveButtonSelected(); } } ); this.removeButton.setEnabled( false ); } @SuppressWarnings("unchecked") protected boolean addVariable( final T variable ) { boolean result = true; TableItem[] items = this.table.getTable().getItems(); for( int i = 0; i < items.length; i++ ) { T existingVariable = ( T )items[ i ].getData(); if( existingVariable.equals( variable ) ) { boolean overWrite = MessageDialog.openQuestion( getShell(), Messages.getString( "TabComponent.replace_table_item_question_title" ), //$NON-NLS-1$ Messages.getString( "TabComponent.replace_table_item_question" ) ); //$NON-NLS-1$ if( !overWrite ) { result = false; } else { this.table.remove( existingVariable ); } break; } } if( result ) { this.table.add( variable ); // this.table.setInput( variable ); // updateLaunchConfigurationDialog(); } return result; } /** * Method to access data kept in table * * @return ArrayList of items kept in table */ @SuppressWarnings("unchecked") public ArrayList<T> getInput() { ArrayList<T> result = new ArrayList<T>(); for( TableItem item : this.table.getTable().getItems() ) { result.add( ( T )item.getData() ); } return result; } abstract protected void handleRemoveButtonSelected(); abstract protected void handleAddButtonSelected(); abstract protected void handleEditButtonSelected(); abstract protected void setLabels(); }