/*
* 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.openldap.config.editor.dialogs;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.apache.directory.api.ldap.model.name.Dn;
import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.apache.directory.studio.common.ui.widgets.WidgetModifyEvent;
import org.apache.directory.studio.common.ui.widgets.WidgetModifyListener;
import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Shell;
import org.apache.directory.studio.openldap.common.ui.widgets.EntryWidget;
import org.apache.directory.studio.openldap.config.model.overlay.OlcValSortMethodEnum;
import org.apache.directory.studio.openldap.config.model.overlay.OlcValSortValue;
/**
* The ValueSortingValueDialog is used to edit a value from the Value Sorting overlay configuration.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class ValueSortingValueDialog extends Dialog
{
/** The 'weighted' combo viewer option */
private static final String WEIGHTED_OPTION = "Weighted";
/** The '<none>' combo viewer option */
private static final String NONE_OPTION = "<none>";
/** The connection's attribute types */
private List<String> connectionAttributeTypes;
/** The connection */
private IBrowserConnection browserConnection;
/** The value */
private OlcValSortValue value;
// UI widgets
private Button okButton;
private ComboViewer attributeComboViewer;
private EntryWidget baseDnEntryWidget;
private ComboViewer sortMethodComboViewer;
private ComboViewer secondarySortMethodComboViewer;
// Listeners
private ModifyListener attributeComboViewerListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
checkAndUpdateOkButtonEnableState();
}
};
private WidgetModifyListener baseDnEntryWidgetListener = new WidgetModifyListener()
{
public void widgetModified( WidgetModifyEvent event )
{
checkAndUpdateOkButtonEnableState();
}
};
private ISelectionChangedListener sortMethodComboViewerListener = new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
Object selectedSortMethod = getSelectedSortMethod();
if ( WEIGHTED_OPTION.equals( selectedSortMethod ) )
{
secondarySortMethodComboViewer.getCombo().setEnabled( true );
}
else
{
secondarySortMethodComboViewer.getCombo().setEnabled( false );
secondarySortMethodComboViewer.setSelection( new StructuredSelection( NONE_OPTION ) );
}
}
};
/**
* Creates a new instance of ValueSortingValueDialog.
*
* @param parentShell the parent shell
* @param browserConnection the connection
* @param value the value
*/
public ValueSortingValueDialog( Shell parentShell, IBrowserConnection browserConnection, String value )
{
super( parentShell );
super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
this.browserConnection = browserConnection;
// Parsing the value
try
{
this.value = OlcValSortValue.parse( value );
if ( this.value == null )
{
this.value = new OlcValSortValue();
}
}
catch ( ParseException e )
{
this.value = new OlcValSortValue();
}
initAttributeTypesList();
}
/**
* Creates a new instance of ValueSortingValueDialog.
*
* @param parentShell the parent shell
* @param browserConnection the connection
*/
public ValueSortingValueDialog( Shell parentShell, IBrowserConnection browserConnection )
{
super( parentShell );
super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
this.browserConnection = browserConnection;
this.value = new OlcValSortValue();
initAttributeTypesList();
}
/**
* Initializes the list of attribute types.
*/
private void initAttributeTypesList()
{
connectionAttributeTypes = new ArrayList<String>();
if ( browserConnection != null )
{
// Attribute Types
Collection<AttributeType> atds = browserConnection.getSchema().getAttributeTypeDescriptions();
for ( AttributeType atd : atds )
{
for ( String name : atd.getNames() )
{
connectionAttributeTypes.add( name );
}
}
// Sorting the list
Collections.sort( connectionAttributeTypes, new Comparator<String>()
{
public int compare( String o1, String o2 )
{
return o1.compareToIgnoreCase( o2 );
}
} );
}
}
/**
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell( Shell shell )
{
super.configureShell( shell );
shell.setText( "Value Sort" );
}
/**
* @see org.eclipse.jface.dialogs.Dialog#createButtonsForButtonBar(org.eclipse.swt.widgets.Composite)
*/
protected void createButtonsForButtonBar( Composite parent )
{
okButton = createButton( parent, IDialogConstants.OK_ID, IDialogConstants.OK_LABEL, true );
createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false );
checkAndUpdateOkButtonEnableState();
}
/**
* {@inheritDoc}
*/
protected void okPressed()
{
// Attribute
value.setAttribute( attributeComboViewer.getCombo().getText() );
// Base DN
value.setBaseDn( baseDnEntryWidget.getDn() );
// Sort Method
Object selectedSortMethod = getSelectedSortMethod();
if ( WEIGHTED_OPTION.equals( selectedSortMethod ) )
{
value.setWeighted( true );
// Secondary Sort Method
Object selectedSecondarySortMethod = getSelectedSecondarySortMethod();
if ( NONE_OPTION.equals( selectedSecondarySortMethod ) )
{
value.setSortMethod( null );
}
else
{
value.setSortMethod( ( OlcValSortMethodEnum ) selectedSecondarySortMethod );
}
}
else
{
value.setSortMethod( ( OlcValSortMethodEnum ) selectedSortMethod );
}
super.okPressed();
}
/**
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea( Composite parent )
{
// Creating the dialog composites
Composite dialogComposite = ( Composite ) super.createDialogArea( parent );
GridData gridData = new GridData( SWT.FILL, SWT.FILL, true, true );
gridData.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH );
// gridData.heightHint = convertVerticalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ) * 4 / 3;
dialogComposite.setLayoutData( gridData );
Composite composite = BaseWidgetUtils.createColumnContainer( dialogComposite, 2, 1 );
// Attribute
BaseWidgetUtils.createLabel( composite, "Attribute:", 1 );
attributeComboViewer = new ComboViewer( new Combo( composite, SWT.DROP_DOWN ) );
attributeComboViewer.getControl()
.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
attributeComboViewer.setContentProvider( new ArrayContentProvider() );
attributeComboViewer.setInput( connectionAttributeTypes );
// Base DN
BaseWidgetUtils.createLabel( composite, "Base DN:", 1 );
baseDnEntryWidget = new EntryWidget( browserConnection );
baseDnEntryWidget.createWidget( composite );
baseDnEntryWidget.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Sort Method
BaseWidgetUtils.createLabel( composite, "Sort Method:", 1 );
sortMethodComboViewer = new ComboViewer( composite );
sortMethodComboViewer.getControl().setLayoutData(
new GridData( SWT.FILL, SWT.NONE, true, false ) );
sortMethodComboViewer.setContentProvider( new ArrayContentProvider() );
sortMethodComboViewer.setLabelProvider( new OlcValSortMethodEnumLabelProvider() );
sortMethodComboViewer.setInput( new Object[]
{
OlcValSortMethodEnum.ALPHA_ASCEND,
OlcValSortMethodEnum.ALPHA_DESCEND,
OlcValSortMethodEnum.NUMERIC_ASCEND,
OlcValSortMethodEnum.NUMERIC_DESCEND,
WEIGHTED_OPTION
} );
// Secondary Sort Method
BaseWidgetUtils.createLabel( composite, "Secondary Sort Method:", 1 );
secondarySortMethodComboViewer = new ComboViewer( composite );
secondarySortMethodComboViewer.getControl().setLayoutData(
new GridData( SWT.FILL, SWT.NONE, true, false ) );
secondarySortMethodComboViewer.setContentProvider( new ArrayContentProvider() );
secondarySortMethodComboViewer.setLabelProvider( new OlcValSortMethodEnumLabelProvider() );
secondarySortMethodComboViewer.setInput( new Object[]
{
NONE_OPTION,
OlcValSortMethodEnum.ALPHA_ASCEND,
OlcValSortMethodEnum.ALPHA_DESCEND,
OlcValSortMethodEnum.NUMERIC_ASCEND,
OlcValSortMethodEnum.NUMERIC_DESCEND
} );
initFromValue();
addListeners();
applyDialogFont( composite );
return composite;
}
/**
* Adds listeners to UI widgets.
*/
private void addListeners()
{
attributeComboViewer.getCombo().addModifyListener( attributeComboViewerListener );
baseDnEntryWidget.addWidgetModifyListener( baseDnEntryWidgetListener );
sortMethodComboViewer.addSelectionChangedListener( sortMethodComboViewerListener );
}
/**
* Inits the UI from the value.
*/
private void initFromValue()
{
// Attribute
String attribute = value.getAttribute();
if ( attribute != null )
{
attributeComboViewer.getCombo().setText( attribute );
}
else
{
attributeComboViewer.getCombo().setText( "" );
}
// Base DN
Dn baseDn = value.getBaseDn();
if ( baseDn != null )
{
baseDnEntryWidget.setInput( baseDn );
}
else
{
baseDnEntryWidget.setInput( Dn.EMPTY_DN );
}
// Sort Method
if ( value.isWeighted() )
{
sortMethodComboViewer.setSelection( new StructuredSelection( WEIGHTED_OPTION ) );
}
else
{
OlcValSortMethodEnum secondarySortMethod = value.getSortMethod();
if ( secondarySortMethod != null )
{
sortMethodComboViewer.setSelection( new StructuredSelection( secondarySortMethod ) );
}
else
{
sortMethodComboViewer
.setSelection( new StructuredSelection( OlcValSortMethodEnum.ALPHA_ASCEND ) );
}
}
// Secondary Sort Method
if ( value.isWeighted() )
{
OlcValSortMethodEnum secondarySortMethod = value.getSortMethod();
if ( secondarySortMethod != null )
{
secondarySortMethodComboViewer.setSelection( new StructuredSelection( secondarySortMethod ) );
}
else
{
secondarySortMethodComboViewer.setSelection( new StructuredSelection( NONE_OPTION ) );
}
}
else
{
secondarySortMethodComboViewer.setSelection( new StructuredSelection( NONE_OPTION ) );
secondarySortMethodComboViewer.getControl().setEnabled( false );
}
}
/**
* Gets the selected sort method.
*
* @return the selected sort method
*/
private Object getSelectedSortMethod()
{
StructuredSelection selection = ( StructuredSelection ) sortMethodComboViewer.getSelection();
if ( !selection.isEmpty() )
{
return selection.getFirstElement();
}
return null;
}
/**
* Gets the selected secondary sort method.
*
* @return the selected secondary sort method
*/
private Object getSelectedSecondarySortMethod()
{
StructuredSelection selection = ( StructuredSelection ) secondarySortMethodComboViewer.getSelection();
if ( !selection.isEmpty() )
{
return selection.getFirstElement();
}
return null;
}
/**
* Checks and updates the OK button 'enable' state.
*/
private void checkAndUpdateOkButtonEnableState()
{
boolean enableOkButton = true;
// Attribute
String attribute = attributeComboViewer.getCombo().getText();
if ( ( attribute == null ) || ( attribute.isEmpty() ) )
{
enableOkButton = false;
}
// Base DN
if ( enableOkButton )
{
Dn baseDn = baseDnEntryWidget.getDn();
if ( ( baseDn == null ) || ( Dn.EMPTY_DN.equals( baseDn ) ) )
{
enableOkButton = false;
}
}
okButton.setEnabled( enableOkButton );
}
/**
* Gets the value.
*
* @return the value
*/
public String getValue()
{
return value.toString();
}
/**
* This class implement a {@link LabelProvider} for {@link OlcValSortMethodEnum} objects.
*/
private class OlcValSortMethodEnumLabelProvider extends LabelProvider
{
public String getText( Object element )
{
if ( element instanceof OlcValSortMethodEnum )
{
OlcValSortMethodEnum sortMethod = ( OlcValSortMethodEnum ) element;
switch ( sortMethod )
{
case ALPHA_ASCEND:
return "Alpha Ascendant";
case ALPHA_DESCEND:
return "Alpha Descendant";
case NUMERIC_ASCEND:
return "Numeric Ascendant";
case NUMERIC_DESCEND:
return "Numeric Descendant";
}
}
return super.getText( element );
}
}
}