/*
* 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 org.apache.directory.api.ldap.model.schema.SchemaUtils;
import org.apache.directory.api.util.Strings;
import org.apache.directory.studio.common.ui.AddEditDialog;
import org.apache.directory.studio.common.ui.CommonUIConstants;
import org.apache.directory.studio.common.ui.CommonUIUtils;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection;
import org.apache.directory.studio.openldap.config.acl.model.AclAttribute;
import org.apache.directory.studio.openldap.config.acl.wrapper.AclAttributeWrapper;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.Shell;
import org.eclipse.swt.widgets.Text;
/**
* This Dialog is used to add a new AclAttribute.
*
* <pre>
* +---------------------------------------------+
* | ACL Attribute |
* | .-----------------------------------------. |
* | | (o) Attribute | |
* | | (o) Entry | |
* | | (o) Children | |
* | | (o) ObjectClass | |
* | | (o) ObjectClass exclusion | |
* | | | |
* | | Value : [/////////////////////////////] | |
* | '-----------------------------------------' |
* | |
* | (Cancel) (OK) |
* +---------------------------------------------+
* </pre>
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class AclAttributeDialog extends AddEditDialog<AclAttributeWrapper>
{
/** The connection to the LDAP server */
private IBrowserConnection connection;
// The UI widgets
/** The Attribute checkbox */
private Button attributeCheckbox;
/** The entry checkbox */
private Button entryCheckbox;
/** The children checkbox */
private Button childrenCheckbox;
/** The OjectClass checkbox */
private Button objectClassCheckbox;
/** The OjectClass Exclusioncheckbox */
private Button objectClassExclusionCheckbox;
/** The Attribute Value text */
private Text attributevalueText;
/** A flag set when we clear the AttributeValue text */
private boolean clearText;
/** A listener for the AttributeCheckBox */
private SelectionListener attributeCheckboxListener = new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
Button selection = (Button)e.getSource();
if ( selection.getSelection() )
{
// Clear the AttributeValue Text and disable it
clearText = true;
attributevalueText.setText( "" );
attributevalueText.setEnabled( true );
getButton( IDialogConstants.OK_ID ).setEnabled( false );
}
}
};
/** A listener for the EntryCheckBox */
private SelectionListener entryCheckboxListener = new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
Button selection = (Button)e.getSource();
if ( selection.getSelection() )
{
// Clear the AttributeValue Text and disable it
clearText = true;
attributevalueText.setText( "" );
attributevalueText.setEnabled( false );
getEditedElement().getAclAttribute().setName( "entry" );
getButton( IDialogConstants.OK_ID ).setEnabled( true );
}
}
};
/** A listener for the ChildrenCheckBox */
private SelectionListener childrenCheckboxListener = new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
Button selection = (Button)e.getSource();
if ( selection.getSelection() )
{
// Clear the AttributeValue Text and disable it
clearText = true;
attributevalueText.setText( "" );
attributevalueText.setEnabled( false );
getEditedElement().getAclAttribute().setName( "children" );
getButton( IDialogConstants.OK_ID ).setEnabled( true );
}
}
};
/** A listener for the ObjectClassCheckBox */
private SelectionListener objectClassCheckboxListener = new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
Button selection = (Button)e.getSource();
if ( selection.getSelection() )
{
// Clear the AttributeValue Text and enable it
clearText = true;
attributevalueText.setText( "" );
attributevalueText.setEnabled( true );
getButton( IDialogConstants.OK_ID ).setEnabled( false );
}
}
};
/** A listener for the ObjectClassExclusionCheckBox */
private SelectionListener objectClassExclusionCheckboxListener = new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
Button selection = (Button)e.getSource();
if ( selection.getSelection() )
{
// Clear the AttributeValue Text and enable it
clearText = true;
attributevalueText.setText( "" );
attributevalueText.setEnabled( true );
getButton( IDialogConstants.OK_ID ).setEnabled( false );
}
}
};
/** A listener for the AttributeValuetext */
private ModifyListener attributeValueTextListener = new ModifyListener()
{
@Override
public void modifyText( ModifyEvent e )
{
// if the text has been clear by a button, don't do anything but switch the flag
if ( clearText )
{
clearText = false;
return;
}
Button okButton = getButton( IDialogConstants.OK_ID );
// This button might be null when the dialog is called.
if ( okButton == null )
{
return;
}
String attributeValue = attributevalueText.getText();
boolean isAttribute = attributeCheckbox.getSelection();
boolean isObjectClass = objectClassCheckbox.getSelection();
boolean isObjectExclusionClass = objectClassExclusionCheckbox.getSelection();
boolean isEntry = entryCheckbox.getSelection();
boolean isChildren = childrenCheckbox.getSelection();
// Check that is a valid name, if needed
if ( isAttribute || isObjectClass || isObjectExclusionClass )
{
if ( Strings.isEmpty( attributeValue ) )
{
okButton.setEnabled( false );
return;
}
if ( !SchemaUtils.isAttributeNameValid( attributeValue) )
{
okButton.setEnabled( false );
return;
}
}
// Handle the various use cases
String result;
if ( isAttribute )
{
// This is an attribute
result = attributeValue;
}
else if ( isEntry )
{
// This is the special attribute value Entry
result = AclAttribute.ENTRY;
}
else if ( isChildren )
{
// This is the special attribute value Children
result = AclAttribute.CHILDREN;
}
else if ( isObjectClass )
{
// This is an ObjectClass
StringBuilder buffer = new StringBuilder();
buffer.append( AclAttribute.OC ).append( attributeValue );
result = buffer.toString();
}
else
{
// This is an ObjectClass exclusion
StringBuilder buffer = new StringBuilder( AclAttribute.OC_EX );
buffer.append( AclAttribute.OC_EX ).append( attributeValue );
result = buffer.toString();
}
getEditedElement().setAclAttribute( result );
// Check that the element does not already exist
if ( getElements().contains( getEditedElement() ) )
{
attributevalueText.setForeground( CommonUIConstants.RED_COLOR );
okButton.setEnabled( false );
}
else
{
attributevalueText.setForeground( CommonUIConstants.BLACK_COLOR );
okButton.setEnabled( true );
}
}
};
/**
* Creates a new instance of AclAttributeDialog.
*
* @param shell the parent shell
*/
public AclAttributeDialog( Shell shell, IBrowserConnection connection )
{
super( shell );
//shell.setText( Messages.getString( "AclAttribute.Title" ) );
this.connection = connection;
}
/**
* Create the Dialog for AclAttribute :
* <pre>
* +---------------------------------------------+
* | ACL Attribute |
* | .-----------------------------------------. |
* | | (o) Attribute | |
* | | (o) entry | |
* | | (o) children | |
* | | (o) ObjectClass | |
* | | (o) ObjectClass exclusion | |
* | | | |
* | | Value : [/////////////////////////////] | |
* | '-----------------------------------------' |
* | |
* | (Cancel) (OK) |
* +---------------------------------------------+
* </pre>
* @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( GridData.FILL_BOTH );
composite.setLayoutData( gd );
createAclAttributeEditGroup( composite );
initDialog();
applyDialogFont( composite );
return composite;
}
/**
* Creates the AclAttribute input group.
*
* <pre>
* ACL Attribute
* .-----------------------------------------.
* | (o) Attribute |
* | (o) entry |
* | (o) children |
* | (o) ObjectClass |
* | (o) ObjectClass exclusion |
* | |
* | Value : [/////////////////////////////] |
* '-----------------------------------------'
* </pre>
* @param parent the parent composite
*/
private void createAclAttributeEditGroup( Composite parent )
{
// Disallow Feature Group
Group aclAttributeGroup = BaseWidgetUtils.createGroup( parent, "", 1 );
GridLayout aclAttributeGridLayout = new GridLayout( 2, false );
aclAttributeGroup.setLayout( aclAttributeGridLayout );
aclAttributeGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// The Attribute checkbox
attributeCheckbox = BaseWidgetUtils.createRadiobutton( aclAttributeGroup, "Attribute", 2 );
attributeCheckbox.addSelectionListener( attributeCheckboxListener );
// The entry checkbox
entryCheckbox = BaseWidgetUtils.createRadiobutton( aclAttributeGroup, "Entry", 2 );
entryCheckbox.addSelectionListener( entryCheckboxListener );
// The children checkbox
childrenCheckbox = BaseWidgetUtils.createRadiobutton( aclAttributeGroup, "Children", 2 );
childrenCheckbox.addSelectionListener( childrenCheckboxListener );
// The OjectClass checkbox
objectClassCheckbox = BaseWidgetUtils.createRadiobutton( aclAttributeGroup, "ObjectClass", 2 );
objectClassCheckbox.addSelectionListener( objectClassCheckboxListener );
// The OjectClass Exclusioncheckbox
objectClassExclusionCheckbox = BaseWidgetUtils.createRadiobutton( aclAttributeGroup, "ObjectClass Exclusion", 2 );
objectClassExclusionCheckbox.addSelectionListener( objectClassExclusionCheckboxListener );
// The Value Text
BaseWidgetUtils.createLabel( aclAttributeGroup, "Value : ", 1 );
attributevalueText = BaseWidgetUtils.createText( aclAttributeGroup, "", 1 );
attributevalueText.addModifyListener( attributeValueTextListener );
}
@Override
protected void initDialog()
{
AclAttributeWrapper editedElement = (AclAttributeWrapper)getEditedElement();
if ( editedElement != null )
{
AclAttribute aclAttribute = editedElement.getAclAttribute();
if ( aclAttribute.isEntry() )
{
entryCheckbox.setEnabled( true );
}
else if ( aclAttribute.isChildren() )
{
childrenCheckbox.setEnabled( true );
}
else if ( aclAttribute.isAttributeType() )
{
attributeCheckbox.setEnabled( true );
attributevalueText.setText( CommonUIUtils.getTextValue( aclAttribute.getName() ) );
}
else if ( aclAttribute.isObjectClass() )
{
objectClassCheckbox.setEnabled( true );
attributevalueText.setText( CommonUIUtils.getTextValue( aclAttribute.getName() ) );
}
else
{
objectClassExclusionCheckbox.setEnabled( true );
attributevalueText.setText( CommonUIUtils.getTextValue( aclAttribute.getName() ) );
}
}
}
/**
* {@inheritDoc}
*/
@Override
public void addNewElement()
{
// Default to none
setEditedElement( new AclAttributeWrapper( new AclAttribute( "", connection ) ) );
}
/**
* Add an Element that will be edited
*
* @param editedElement The element to edit
*/
public void addNewElement( AclAttributeWrapper editedElement )
{
AclAttributeWrapper newElement = (AclAttributeWrapper)editedElement.clone();
setEditedElement( newElement );
}
}