/* * 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.widgets; import java.util.ArrayList; import java.util.List; import org.apache.directory.studio.common.ui.CommonUIUtils; import org.apache.directory.studio.common.ui.widgets.AbstractWidget; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; import org.apache.directory.studio.common.ui.widgets.TableWidget; import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator; import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants; import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection; import org.eclipse.jface.fieldassist.ContentProposalAdapter; import org.eclipse.jface.fieldassist.IContentProposal; import org.eclipse.jface.viewers.LabelProvider; 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.VerifyEvent; import org.eclipse.swt.events.VerifyListener; import org.eclipse.swt.graphics.Image; 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.Text; 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.AclAttribute; import org.apache.directory.studio.openldap.config.acl.model.AclAttributeStyleEnum; import org.apache.directory.studio.openldap.config.acl.model.AclWhatClauseAttributes; import org.apache.directory.studio.openldap.config.acl.wrapper.AclAttributeDecorator; import org.apache.directory.studio.openldap.config.acl.wrapper.AclAttributeWrapper; /** * A widget used to create an AclWhatClause Attribute : * * <pre> * ... * | .--------------------------------------------------------. | * | | Attribute list : | | * | | +-------------------------------------------+ | | * | | | abc | (Add) | | * | | | !def | (Edit) | | * | | | entry | (Delete) | | * | | +-------------------------------------------+ | | * | | Val : [ ] MatchingRule : [ ] Style : [--------------] | | * | | Value : [////////////////////////////////////////////] | | * | `--------------------------------------------------------' | * ... * </pre> * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class AttributesWidget extends AbstractWidget { /** The Attributes table */ private TableWidget<AclAttributeWrapper> attributeTable; /** The WhatAttributes clause */ private AclWhatClauseAttributes aclWhatClauseAttributes; /** The checkbox for the Val */ private Button valButton; /** The checkbox for the matchingrule */ private Button matchingRuleButton; /** The style combo */ private Combo styleCombo; /** The Value Text */ private Text valueText; /** The initial attributes. */ private String[] initialAttributes; /** The proposal provider */ private AttributesWidgetContentProposalProvider proposalProvider; /** The proposal adapter*/ private ContentProposalAdapter proposalAdapter; /** The label provider for the proposal adapter */ private LabelProvider labelProvider = new LabelProvider() { public String getText( Object element ) { if ( element instanceof IContentProposal ) { IContentProposal proposal = ( IContentProposal ) element; return proposal.getLabel() == null ? proposal.getContent() : proposal.getLabel(); } return super.getText( element ); }; public Image getImage( Object element ) { if ( element instanceof AttributeTypeContentProposal ) { return BrowserCommonActivator.getDefault().getImage( BrowserCommonConstants.IMG_ATD ); } else if ( element instanceof ObjectClassContentProposal ) { return BrowserCommonActivator.getDefault().getImage( BrowserCommonConstants.IMG_OCD ); } else if ( element instanceof KeywordContentProposal ) { return OpenLdapAclEditorPlugin.getDefault().getImage( OpenLdapAclEditorPluginConstants.IMG_KEYWORD ); } return super.getImage( element ); } }; /** The verify listener which doesn't allow white spaces*/ private VerifyListener verifyListener = new VerifyListener() { public void verifyText( VerifyEvent e ) { // Not allowing white spaces if ( Character.isWhitespace( e.character ) ) { e.doit = false; } } }; /** The modify listener */ private ModifyListener modifyListener = new ModifyListener() { public void modifyText( ModifyEvent e ) { notifyListeners(); } }; /** The Val button listener */ private SelectionAdapter valButtonListener = new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { // If the Val Button is selected, then the MatchingRule Button, // the Style Combo and the value Text must be enabled boolean valSelected = valButton.getSelection(); matchingRuleButton.setEnabled( valSelected ); styleCombo.setEnabled( valSelected ); valueText.setEnabled( valSelected ); aclWhatClauseAttributes.setVal( valSelected ); // TODO : disable the OK button if Val is set and there is no value } }; /** The MatchingRule button listener */ private SelectionAdapter matchingRuleButtonListener = new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { aclWhatClauseAttributes.setMatchingRule( matchingRuleButton.getSelection() ); } }; /** The style combo listener */ private SelectionAdapter styleComboListener = new SelectionAdapter() { public void widgetSelected( SelectionEvent event ) { aclWhatClauseAttributes.setStyle( AclAttributeStyleEnum.getStyle( styleCombo.getText() ) ); } }; /** * Creates the widget. * <pre> * Attribute list : * +-------------------------------------------+ * | abc | (Add) * | !def | (Edit) * | entry | (Delete) * +-------------------------------------------+ * Val : [ ] MatchingRule : [ ] Style : [--------------] * Value : [////////////////////////////////////////////] * </pre> * * @param parent the parent */ public void createWidget( Composite parent, IBrowserConnection connection, AclWhatClauseAttributes clause ) { Composite composite = BaseWidgetUtils.createColumnContainer( parent, 4, 1 ); GridData gd = new GridData( GridData.FILL_HORIZONTAL ); gd.horizontalSpan = 1; gd.widthHint = 30; composite.setLayoutData( gd ); // The Attribute table BaseWidgetUtils.createLabel( composite, "Attributes list :", 4 ); AclAttributeDecorator decorator = new AclAttributeDecorator( composite.getShell(), connection ); attributeTable = new TableWidget<AclAttributeWrapper>( decorator ); attributeTable.createWidgetWithEdit( composite, null ); attributeTable.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 4, 3 ) ); //attributeTable.addWidgetModifyListener( attributeTableListener ); // The Val valButton = BaseWidgetUtils.createCheckbox( composite, "Val", 1 ); valButton.addSelectionListener( valButtonListener ); // The MatchingRule matchingRuleButton = BaseWidgetUtils.createCheckbox( composite, "MatchingRule", 1 ); matchingRuleButton.setEnabled( false ); matchingRuleButton.addSelectionListener( matchingRuleButtonListener ); // The style BaseWidgetUtils.createLabel( composite, "Style :", 1 ); styleCombo = BaseWidgetUtils.createCombo( composite, AclAttributeStyleEnum.getNames(), 9, 1 ); styleCombo.setEnabled( false ); styleCombo.addSelectionListener( styleComboListener ); // The value BaseWidgetUtils.createLabel( composite, "Value :", 1 ); valueText = BaseWidgetUtils.createText( composite, "", 3 ); valueText.setEnabled( false ); //valueText.addModifyListener( valueTextListener ); initWidget( clause ); } /** * Initialize the widget with the current value */ private void initWidget( AclWhatClauseAttributes clause ) { aclWhatClauseAttributes = clause; // Update the table setAttributes( clause.getAttributes() ); // The Val button is always enabled valButton.setEnabled( true ); if ( clause.hasVal() ) { matchingRuleButton.setEnabled( clause.hasMatchingRule() ); styleCombo.setEnabled( false ); styleCombo.setText( clause.getStyle().getName() ); valueText.setEnabled( false ); valueText.setText( CommonUIUtils.getTextValue( clause.getValue() ) ); } else { matchingRuleButton.setEnabled( false ); styleCombo.setEnabled( false ); valueText.setEnabled( false ); } } /** * Sets the initial attributes. * * @param aclAttributes the initial attributes */ private void setAttributes( List<AclAttribute> aclAttributes ) { List<AclAttributeWrapper> aclAttributeWrappers = new ArrayList<AclAttributeWrapper>( aclAttributes.size() ); for ( AclAttribute aclAttribute: aclAttributes ) { AclAttributeWrapper aclAttributeWrapper = new AclAttributeWrapper( aclAttribute ); aclAttributeWrappers.add( aclAttributeWrapper ); } attributeTable.setElements( aclAttributeWrappers ); } /** * Sets the enabled state of the widget. * * @param b true to enable the widget, false to disable the widget */ public void setEnabled( boolean b ) { } /** * Gets the attributes. * * @return the attributes */ public List<AclAttribute> getAttributes() { List<AclAttributeWrapper> elementList = attributeTable.getElements(); List<AclAttribute> result = new ArrayList<AclAttribute>( elementList.size() ); for ( AclAttributeWrapper element : elementList ) { result.add( element.getAclAttribute() ); } return result; } }