/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.studio.templateeditor.editor.widgets;
import java.util.Comparator;
import org.apache.directory.studio.entryeditors.IEntryEditor;
import org.apache.directory.studio.ldapbrowser.common.dialogs.TextDialog;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.IValue;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.DoubleClickEvent;
import org.eclipse.jface.viewers.IDoubleClickListener;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.ViewerComparator;
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.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.apache.directory.studio.templateeditor.EntryTemplatePlugin;
import org.apache.directory.studio.templateeditor.EntryTemplatePluginConstants;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateTable;
/**
* This class implements an editor table.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class EditorTable extends EditorWidget<TemplateTable>
{
/** The widget's composite */
private Composite composite;
/** The table viewer */
private TableViewer tableViewer;
/** The 'Add...' button */
private ToolItem addToolItem;
/** The 'Edit...' button */
private ToolItem editToolItem;
/** The 'Delete...' button */
private ToolItem deleteToolItem;
/**
* Creates a new instance of EditorTable.
*
* @param editor
* the associated editor
* @param templateTable
* the associated template table
* @param toolkit
* the associated toolkit
*/
public EditorTable( IEntryEditor editor, TemplateTable templateTable, FormToolkit toolkit )
{
super( templateTable, editor, toolkit );
}
/**
* {@inheritDoc}
*/
public Composite createWidget( Composite parent )
{
// Creating and initializing the widget UI
Composite composite = initWidget( parent );
// Updating the widget's content
updateWidget();
// Adding the listeners
addListeners();
return composite;
}
/**
* Creates and initializes the widget UI.
*
* @param parent
* the parent composite
* @return
* the associated composite
*/
private Composite initWidget( Composite parent )
{
// Creating the widget composite
composite = getToolkit().createComposite( parent );
composite.setLayoutData( getGridata() );
// Creating the layout
GridLayout gl = new GridLayout( ( needsToolbar() ? 2 : 1 ), false );
gl.marginHeight = gl.marginWidth = 0;
gl.horizontalSpacing = gl.verticalSpacing = 0;
composite.setLayout( gl );
// Table Viewer
Table table = getToolkit().createTable( composite, SWT.BORDER | SWT.V_SCROLL | SWT.H_SCROLL );
table.setLayoutData( new GridData( SWT.FILL, SWT.FILL, true, true ) );
tableViewer = new TableViewer( table );
tableViewer.setContentProvider( new ArrayContentProvider() );
tableViewer.setComparator( new ViewerComparator( new Comparator<String>()
{
public int compare( String s1, String s2 )
{
if ( s1 == null )
{
return 1;
}
else if ( s2 == null )
{
return -1;
}
else
{
return s1.compareToIgnoreCase( s2 );
}
}
} ) );
// Toolbar (if needed)
if ( needsToolbar() )
{
ToolBar toolbar = new ToolBar( composite, SWT.VERTICAL );
toolbar.setLayoutData( new GridData( SWT.NONE, SWT.FILL, false, true ) );
// Add Button
if ( getWidget().isShowAddButton() )
{
addToolItem = new ToolItem( toolbar, SWT.PUSH );
addToolItem.setToolTipText( Messages.getString( "EditorTable.Add" ) ); //$NON-NLS-1$
addToolItem.setImage( EntryTemplatePlugin.getDefault().getImage(
EntryTemplatePluginConstants.IMG_TOOLBAR_ADD_VALUE ) );
}
// Edit Button
if ( getWidget().isShowEditButton() )
{
editToolItem = new ToolItem( toolbar, SWT.PUSH );
editToolItem.setToolTipText( Messages.getString( "EditorTable.Edit" ) ); //$NON-NLS-1$
editToolItem.setImage( EntryTemplatePlugin.getDefault().getImage(
EntryTemplatePluginConstants.IMG_TOOLBAR_EDIT_VALUE ) );
editToolItem.setEnabled( false );
}
// Delete Button
if ( getWidget().isShowDeleteButton() )
{
deleteToolItem = new ToolItem( toolbar, SWT.PUSH );
deleteToolItem.setToolTipText( Messages.getString( "EditorTable.Delete" ) ); //$NON-NLS-1$
deleteToolItem.setImage( EntryTemplatePlugin.getDefault().getImage(
EntryTemplatePluginConstants.IMG_TOOLBAR_DELETE_VALUE ) );
deleteToolItem.setEnabled( false );
}
}
return composite;
}
/**
* Indicates if the widget needs a toolbar for actions.
*
* @return
* <code>true</code> if the widget needs a toolbar for actions,
* <code>false</code> if not
*/
private boolean needsToolbar()
{
return getWidget().isShowAddButton() || getWidget().isShowEditButton() || getWidget().isShowDeleteButton();
}
/**
* Updates the widget's content.
*/
private void updateWidget()
{
IAttribute attribute = getAttribute();
if ( ( attribute != null ) && ( attribute.isString() ) && ( attribute.getValueSize() > 0 ) )
{
tableViewer.setInput( attribute.getStringValues() );
}
else
{
tableViewer.setInput( new String[0] );
}
}
/**
* Adds the listeners.
*/
private void addListeners()
{
// Add button
if ( ( addToolItem != null ) && ( !addToolItem.isDisposed() ) )
{
addToolItem.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
addToolItemAction();
}
} );
}
// Edit button
if ( ( editToolItem != null ) && ( !editToolItem.isDisposed() ) )
{
editToolItem.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
editToolItemAction();
}
} );
}
// Delete button
if ( ( deleteToolItem != null ) && ( !deleteToolItem.isDisposed() ) )
{
deleteToolItem.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
deleteToolItemAction();
}
} );
}
// Table Viewer
if ( ( tableViewer != null ) && ( !tableViewer.getTable().isDisposed() ) )
{
tableViewer.addSelectionChangedListener( new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
updateButtonsStates();
}
} );
tableViewer.addDoubleClickListener( new IDoubleClickListener()
{
public void doubleClick( DoubleClickEvent event )
{
if ( ( editToolItem != null ) && ( !editToolItem.isDisposed() ) )
{
editToolItemAction();
}
}
} );
}
}
/**
* This method is called when the 'Add...' toolbar item is clicked.
*/
private void addToolItemAction()
{
TextDialog textDialog = new TextDialog( tableViewer.getTable().getShell(), "" ); //$NON-NLS-1$
if ( textDialog.open() == Dialog.OK )
{
String value = textDialog.getText();
addAttributeValue( value );
tableViewer.setSelection( new StructuredSelection( value ) );
}
}
/**
* This method is called when the 'Edit...' toolbar item is clicked.
*/
private void editToolItemAction()
{
StructuredSelection selection = ( StructuredSelection ) tableViewer.getSelection();
if ( !selection.isEmpty() )
{
String selectedValue = ( String ) selection.getFirstElement();
IAttribute attribute = getAttribute();
if ( ( attribute != null ) && ( attribute.isString() ) && ( attribute.getValueSize() > 0 ) )
{
IValue value = null;
for ( IValue attributeValue : attribute.getValues() )
{
if ( selectedValue.equals( attributeValue.getStringValue() ) )
{
value = attributeValue;
break;
}
}
if ( value != null )
{
TextDialog textDialog = new TextDialog( tableViewer.getTable().getShell(), selectedValue );
if ( textDialog.open() == Dialog.OK )
{
String newValue = textDialog.getText();
if ( !selectedValue.equals( newValue ) )
{
deleteAttributeValue( selectedValue );
addAttributeValue( newValue );
tableViewer.setSelection( new StructuredSelection( newValue ) );
}
}
}
}
}
}
/**
* This method is called when the 'Delete...' toolbar item is clicked.
*/
private void deleteToolItemAction()
{
StructuredSelection selection = ( StructuredSelection ) tableViewer.getSelection();
if ( !selection.isEmpty() )
{
// Launching a confirmation dialog
if ( MessageDialog.openConfirm( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages
.getString( "EditorTable.Confirmation" ), Messages.getString( "EditorTable.ConfirmationDeleteValue" ) ) ) //$NON-NLS-1$ //$NON-NLS-2$
{
deleteAttributeValue( ( String ) selection.getFirstElement() );
}
}
}
/**
* Updates the states of the buttons.
*/
private void updateButtonsStates()
{
StructuredSelection selection = ( StructuredSelection ) tableViewer.getSelection();
if ( ( editToolItem != null ) && ( !editToolItem.isDisposed() ) )
{
editToolItem.setEnabled( !selection.isEmpty() );
}
if ( ( deleteToolItem != null ) && ( !deleteToolItem.isDisposed() ) )
{
deleteToolItem.setEnabled( !selection.isEmpty() );
}
}
/**
* {@inheritDoc}
*/
public void update()
{
updateWidget();
}
/**
* {@inheritDoc}
*/
public void dispose()
{
// Nothing to do
}
}