/*
* 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.acl.dialogs;
import java.util.List;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
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.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Control;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.apache.directory.studio.openldap.config.acl.OpenLdapAclEditorPlugin;
import org.apache.directory.studio.openldap.config.acl.OpenLdapAclEditorPluginConstants;
import org.apache.directory.studio.openldap.config.acl.model.AclAccessLevel;
import org.apache.directory.studio.openldap.config.acl.model.AclAccessLevelLevelEnum;
import org.apache.directory.studio.openldap.config.acl.model.AclAccessLevelPrivModifierEnum;
import org.apache.directory.studio.openldap.config.acl.model.AclAccessLevelPrivilegeEnum;
/**
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class OpenLdapAccessLevelDialog extends Dialog
{
/** The array of access levels */
private Object[] levels = new Object[]
{
new AccessLevelComboViewerName(),
AclAccessLevelLevelEnum.MANAGE,
AclAccessLevelLevelEnum.WRITE,
AclAccessLevelLevelEnum.READ,
AclAccessLevelLevelEnum.SEARCH,
AclAccessLevelLevelEnum.COMPARE,
AclAccessLevelLevelEnum.AUTH,
AclAccessLevelLevelEnum.DISCLOSE,
AclAccessLevelLevelEnum.NONE,
};
/** The access level */
private AclAccessLevel accessLevel;
// UI widgets
private Button okButton;
private Button selfCheckbox;
private Button levelRadioButton;
private ComboViewer levelComboViewer;
private Button customPrivilegesRadioButton;
private Button privilegeModifierEqualRadioButton;
private Button privilegeModifierPlusRadioButton;
private Button privilegeModifierMinusRadioButton;
private Button privilegeAuthCheckbox;
private Button privilegeCompareCheckbox;
private Button privilegeSearchCheckbox;
private Button privilegeReadCheckbox;
private Button privilegeWriteCheckbox;
/**
* Creates a new instance of OpenLdapAccessLevelDialog.
*
* @param accessLevel the access level
*/
public OpenLdapAccessLevelDialog( AclAccessLevel accessLevel )
{
super( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell() );
this.accessLevel = accessLevel;
}
/**
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell( Shell shell )
{
super.configureShell( shell );
shell.setText( "Access Level Editor" );
shell.setImage( OpenLdapAclEditorPlugin.getDefault().getImage( OpenLdapAclEditorPluginConstants.IMG_EDITOR ) );
}
/**
* @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, false );
createButton( parent, IDialogConstants.CANCEL_ID, IDialogConstants.CANCEL_LABEL, false );
}
protected Control createContents( Composite parent )
{
Control control = super.createContents( parent );
// Validating the dialog
validate();
return control;
}
/**
* {@inheritDoc}
*/
protected void okPressed()
{
// Self
accessLevel.setSelf( selfCheckbox.getSelection() );
// Level
if ( levelRadioButton.getSelection() )
{
Object levelSelection = ( ( StructuredSelection ) levelComboViewer.getSelection() ).getFirstElement();
if ( levelSelection instanceof AclAccessLevelLevelEnum )
{
accessLevel.setLevel( ( AclAccessLevelLevelEnum ) levelSelection );
}
else
{
accessLevel.setLevel( null );
}
}
else
{
accessLevel.setLevel( null );
}
// Custom privileges
if ( customPrivilegesRadioButton.getSelection() )
{
// Privilege modifier
accessLevel.setPrivilegeModifier( getPrivilegeModifier() );
// Privileges
accessLevel.clearPrivileges();
addPrivileges();
}
else
{
accessLevel.setPrivilegeModifier( null );
accessLevel.clearPrivileges();
}
super.okPressed();
}
/**
* Gets the privilege modifier.
*
* @return the privilege modifier
*/
private AclAccessLevelPrivModifierEnum getPrivilegeModifier()
{
if ( privilegeModifierEqualRadioButton.getSelection() )
{
return AclAccessLevelPrivModifierEnum.EQUAL;
}
else if ( privilegeModifierPlusRadioButton.getSelection() )
{
return AclAccessLevelPrivModifierEnum.PLUS;
}
else if ( privilegeModifierMinusRadioButton.getSelection() )
{
return AclAccessLevelPrivModifierEnum.MINUS;
}
return null;
}
/**
* Adds privileges.
*/
private void addPrivileges()
{
// Auth checkbox
if ( privilegeAuthCheckbox.getSelection() )
{
accessLevel.addPrivilege( AclAccessLevelPrivilegeEnum.AUTHENTICATION );
}
// Compare checkbox
if ( privilegeCompareCheckbox.getSelection() )
{
accessLevel.addPrivilege( AclAccessLevelPrivilegeEnum.COMPARE );
}
// Read checkbox
if ( privilegeReadCheckbox.getSelection() )
{
accessLevel.addPrivilege( AclAccessLevelPrivilegeEnum.READ );
}
// Search checkbox
if ( privilegeSearchCheckbox.getSelection() )
{
accessLevel.addPrivilege( AclAccessLevelPrivilegeEnum.SEARCH );
}
// Write checkbox
if ( privilegeWriteCheckbox.getSelection() )
{
accessLevel.addPrivilege( AclAccessLevelPrivilegeEnum.WRITE );
}
}
/**
* @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
*/
protected Control createDialogArea( Composite parent )
{
Composite composite = ( Composite ) super.createDialogArea( parent );
GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true );
// gd.widthHint = convertHorizontalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ) * 4 / 3;
// gd.heightHint = convertVerticalDLUsToPixels( IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH ) * 4 / 3;
composite.setLayoutData( gd );
// Creating UI
createSelfGroup( composite );
createLevelAndPrivilegesGroup( composite );
// Initializing the UI with the access level
initWithAccessLevel();
// Adding listeners
addListeners();
// Setting default focus on the composite
composite.setFocus();
applyDialogFont( composite );
return composite;
}
/**
* Validates the dialog.
*/
private void validate()
{
if ( levelRadioButton.getSelection() )
{
// Getting the selection of the level combo viewer
Object levelSelection = ( ( StructuredSelection ) levelComboViewer.getSelection() ).getFirstElement();
// Enabling the OK button only when the selection is a 'real' level
okButton.setEnabled( levelSelection instanceof AclAccessLevelLevelEnum );
return;
}
else if ( customPrivilegesRadioButton.getSelection() )
{
// Enabling the OK button only when at least one of privileges is checked
okButton.setEnabled( privilegeAuthCheckbox.getSelection() || privilegeCompareCheckbox.getSelection()
|| privilegeSearchCheckbox.getSelection() || privilegeReadCheckbox.getSelection()
|| privilegeWriteCheckbox.getSelection() );
return;
}
// Default case
okButton.setEnabled( true );
}
/**
* Creates the self group.
*
* @param parent the parent composite
*/
private void createSelfGroup( Composite parent )
{
Group selfGroup = BaseWidgetUtils.createGroup( parent, "", 1 );
selfGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Self Checkbox
selfCheckbox = new Button( selfGroup, SWT.CHECK );
selfCheckbox.setText( "Self" ); //$NON-NLS-1$
}
/**
* Creates the level and privileges group.
*
* @param parent the parent composite
*/
private void createLevelAndPrivilegesGroup( Composite parent )
{
// Access level and privileges group
Group levelAndPrivilegesGroup = BaseWidgetUtils.createGroup( parent, "Access Level and Privilege(s)", 1 );
levelAndPrivilegesGroup.setLayout( new GridLayout( 2, false ) );
levelAndPrivilegesGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Level label and radio button
levelRadioButton = BaseWidgetUtils.createRadiobutton( levelAndPrivilegesGroup, "Level:", 1 );
levelComboViewer = new ComboViewer( BaseWidgetUtils.createReadonlyCombo( levelAndPrivilegesGroup,
new String[0], -1, 1 ) );
levelComboViewer.setContentProvider( new ArrayContentProvider() );
levelComboViewer.setLabelProvider( new LabelProvider()
{
public String getText( Object element )
{
if ( element instanceof AccessLevelComboViewerName )
{
return "< Access Level >";
}
else if ( element instanceof AclAccessLevelLevelEnum )
{
AclAccessLevelLevelEnum value = ( AclAccessLevelLevelEnum ) element;
switch ( value )
{
case MANAGE:
return "Manage";
case WRITE:
return "Write";
case READ:
return "Read";
case SEARCH:
return "Search";
case COMPARE:
return "Compare";
case AUTH:
return "Auth";
case DISCLOSE:
return "Disclose";
case NONE:
return "None";
}
}
return super.getText( element );
}
} );
levelComboViewer.setInput( levels );
// levelComboViewer.setSelection( new StructuredSelection( currentClauseSelection ) ); TODO
// Custom privileges radio button
customPrivilegesRadioButton = BaseWidgetUtils.createRadiobutton( levelAndPrivilegesGroup,
"Custom Privilege(s):", 2 );
// Custom privileges composite
Composite privilegesTabComposite = BaseWidgetUtils.createColumnContainer( levelAndPrivilegesGroup, 2, 2 );
// Custom privileges modifier group
createRadioIndent( privilegesTabComposite );
Group modifierGroup = BaseWidgetUtils.createGroup( privilegesTabComposite, "Modifier", 1 );
modifierGroup.setLayout( new GridLayout( 3, true ) );
modifierGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Custom privileges modifier radio buttons
privilegeModifierEqualRadioButton = BaseWidgetUtils.createRadiobutton( modifierGroup, "Equal (=)", 1 );
privilegeModifierEqualRadioButton.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
privilegeModifierPlusRadioButton = BaseWidgetUtils.createRadiobutton( modifierGroup, "Add (+)", 1 );
privilegeModifierPlusRadioButton.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
privilegeModifierMinusRadioButton = BaseWidgetUtils.createRadiobutton( modifierGroup, "Delete (-)", 1 );
privilegeModifierMinusRadioButton.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Custom privileges group
createRadioIndent( privilegesTabComposite );
Group privilegesGroup = BaseWidgetUtils.createGroup( privilegesTabComposite, "Privileges", 1 );
privilegesGroup.setLayout( new GridLayout( 3, true ) );
privilegesGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Custom privileges checkboxes
privilegeAuthCheckbox = BaseWidgetUtils.createCheckbox( privilegesGroup, "Auth", 1 );
privilegeAuthCheckbox.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
privilegeCompareCheckbox = BaseWidgetUtils.createCheckbox( privilegesGroup, "Compare", 1 );
privilegeCompareCheckbox.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
privilegeSearchCheckbox = BaseWidgetUtils.createCheckbox( privilegesGroup, "Search", 1 );
privilegeSearchCheckbox.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
privilegeReadCheckbox = BaseWidgetUtils.createCheckbox( privilegesGroup, "Read", 1 );
privilegeReadCheckbox.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
privilegeWriteCheckbox = BaseWidgetUtils.createCheckbox( privilegesGroup, "Write", 1 );
privilegeWriteCheckbox.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
}
/**
* Adds some space to indent radio buttons.
*
* @param parent the parent
* @param span the horizontal span
*/
public static void createRadioIndent( Composite parent )
{
Label l = new Label( parent, SWT.NONE );
GridData gd = new GridData();
gd.horizontalIndent = 10;
l.setLayoutData( gd );
}
private void initWithAccessLevel()
{
// Creating a boolean to indicate if the level is used (rather than the privileges)
boolean isLevelUsed = true;
if ( accessLevel == null )
{
// Access level can't be null, creating a new one
accessLevel = new AclAccessLevel();
}
// Self
selfCheckbox.setSelection( accessLevel.isSelf() );
// Level
AclAccessLevelLevelEnum level = accessLevel.getLevel();
if ( level != null )
{
levelComboViewer.setSelection( new StructuredSelection( level ) );
}
else
{
// Default
levelComboViewer.setSelection( new StructuredSelection( levels[0] ) );
}
// Privilege Modifier
AclAccessLevelPrivModifierEnum privilegeModifier = accessLevel.getPrivilegeModifier();
if ( privilegeModifier != null )
{
// Level is not used in that case
isLevelUsed = false;
privilegeModifierEqualRadioButton.setSelection( AclAccessLevelPrivModifierEnum.EQUAL
.equals( privilegeModifier ) );
privilegeModifierPlusRadioButton.setSelection( AclAccessLevelPrivModifierEnum.PLUS
.equals( privilegeModifier ) );
privilegeModifierMinusRadioButton.setSelection( AclAccessLevelPrivModifierEnum.MINUS
.equals( privilegeModifier ) );
}
else
{
// Default
privilegeModifierEqualRadioButton.setSelection( true );
privilegeModifierPlusRadioButton.setSelection( false );
privilegeModifierMinusRadioButton.setSelection( false );
}
// Privileges
List<AclAccessLevelPrivilegeEnum> privileges = accessLevel.getPrivileges();
privilegeAuthCheckbox.setSelection( privileges.contains( AclAccessLevelPrivilegeEnum.AUTHENTICATION ) );
privilegeCompareCheckbox.setSelection( privileges.contains( AclAccessLevelPrivilegeEnum.COMPARE ) );
privilegeSearchCheckbox.setSelection( privileges.contains( AclAccessLevelPrivilegeEnum.SEARCH ) );
privilegeReadCheckbox.setSelection( privileges.contains( AclAccessLevelPrivilegeEnum.READ ) );
privilegeWriteCheckbox.setSelection( privileges.contains( AclAccessLevelPrivilegeEnum.WRITE ) );
// Setting choice buttons
levelRadioButton.setSelection( isLevelUsed );
customPrivilegesRadioButton.setSelection( !isLevelUsed );
// Setting the enable/disable state for buttons
setButtonsEnableDisableState();
}
/**
* Sets the enable/disable state for buttons
*/
private void setButtonsEnableDisableState()
{
boolean isLevelUsed = levelRadioButton.getSelection();
levelComboViewer.getCombo().setEnabled( isLevelUsed );
privilegeModifierEqualRadioButton.setEnabled( !isLevelUsed );
privilegeModifierPlusRadioButton.setEnabled( !isLevelUsed );
privilegeModifierMinusRadioButton.setEnabled( !isLevelUsed );
privilegeAuthCheckbox.setEnabled( !isLevelUsed );
privilegeCompareCheckbox.setEnabled( !isLevelUsed );
privilegeSearchCheckbox.setEnabled( !isLevelUsed );
privilegeReadCheckbox.setEnabled( !isLevelUsed );
privilegeWriteCheckbox.setEnabled( !isLevelUsed );
}
/**
* Adds listeners to the UI widgets.
*/
private void addListeners()
{
// Level and custom privileges radio buttons
SelectionAdapter enableDisableStateAndValidateSelectionAdapter = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
setButtonsEnableDisableState();
validate();
}
};
levelRadioButton.addSelectionListener( enableDisableStateAndValidateSelectionAdapter );
customPrivilegesRadioButton.addSelectionListener( enableDisableStateAndValidateSelectionAdapter );
// Level combo viewer
levelComboViewer.addSelectionChangedListener( new ISelectionChangedListener()
{
public void selectionChanged( SelectionChangedEvent event )
{
validate();
}
} );
// Privilege modifier and privileges radio buttons
SelectionAdapter validateSelectionAdapter = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
validate();
}
};
privilegeModifierEqualRadioButton.addSelectionListener( validateSelectionAdapter );
privilegeModifierPlusRadioButton.addSelectionListener( validateSelectionAdapter );
privilegeModifierMinusRadioButton.addSelectionListener( validateSelectionAdapter );
privilegeAuthCheckbox.addSelectionListener( validateSelectionAdapter );
privilegeCompareCheckbox.addSelectionListener( validateSelectionAdapter );
privilegeSearchCheckbox.addSelectionListener( validateSelectionAdapter );
privilegeReadCheckbox.addSelectionListener( validateSelectionAdapter );
privilegeWriteCheckbox.addSelectionListener( validateSelectionAdapter );
}
/**
* Gets the ACL Access Level value.
*
* @return the ACL Access Level value
*/
public AclAccessLevel getAccessLevel()
{
return accessLevel;
}
/**
* A private object for the first row of the access level combo viewer.
*/
private class AccessLevelComboViewerName
{
}
}