blob: 896def5bc32ec19036b3602d17ca5d108c9e7ce7 [file] [log] [blame]
/*
* 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.ldapbrowser.common.wizards;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.apache.directory.studio.connection.ui.widgets.ExtendedContentAssistCommandAdapter;
import org.apache.directory.studio.ldapbrowser.common.widgets.ListContentProposalProvider;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
import org.apache.directory.studio.ldapbrowser.core.model.schema.SchemaUtils;
import org.eclipse.jface.fieldassist.ComboContentAdapter;
import org.eclipse.jface.wizard.WizardPage;
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.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
/**
* The AttributeTypeWizardPage provides a combo to select the attribute type,
* some filter and a preview field.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class AttributeTypeWizardPage extends WizardPage
{
/** The parent wizard. */
private AttributeWizard wizard;
/** The initial show subschema attributes only. */
private boolean initialShowSubschemaAttributesOnly;
/** The initial hide existing attributes. */
private boolean initialHideExistingAttributes;
/** The parsed attribute type. */
private String parsedAttributeType;
/** The possible attribute types. */
private String[] possibleAttributeTypes;
/** The possible attribute types applicable to the entry's schema only. */
private String[] possibleAttributeTypesSubschemaOnly;
/** The possible attribute types applicable to the entry's schema only, existing attributes are hidden. */
private String[] possibleAttributeTypesSubschemaOnlyAndExistingHidden;
/** The attribute type combo. */
private Combo attributeTypeCombo;
/** The show subschem attributes only button. */
private Button showSubschemAttributesOnlyButton;
/** The hide existing attributes button. */
private Button hideExistingAttributesButton;
/** The preview text. */
private Text previewText;
/**
* Creates a new instance of AttributeTypeWizardPage.
*
* @param pageName the page name
* @param initialEntry the initial entry
* @param initialAttributeDescription the initial attribute description
* @param initialShowSubschemaAttributesOnly the initial show subschema attributes only
* @param initialHideExistingAttributes the initial hide existing attributes
* @param wizard the wizard
*/
public AttributeTypeWizardPage( String pageName, IEntry initialEntry, String initialAttributeDescription,
boolean initialShowSubschemaAttributesOnly, boolean initialHideExistingAttributes, AttributeWizard wizard )
{
super( pageName );
super.setTitle( Messages.getString( "AttributeTypeWizardPage.AttributeType" ) ); //$NON-NLS-1$
super.setDescription( Messages.getString( "AttributeTypeWizardPage.AttributeTypeDescription" ) ); //$NON-NLS-1$
super.setPageComplete( false );
this.wizard = wizard;
this.initialShowSubschemaAttributesOnly = initialShowSubschemaAttributesOnly;
this.initialHideExistingAttributes = initialHideExistingAttributes;
Collection<AttributeType> atds = initialEntry.getBrowserConnection().getSchema()
.getAttributeTypeDescriptions();
Collection<String> atdNames = SchemaUtils.getNames( atds );
possibleAttributeTypes = atdNames.toArray( new String[atdNames.size()] );
Arrays.sort( possibleAttributeTypes );
Collection<AttributeType> allAtds = SchemaUtils.getAllAttributeTypeDescriptions( initialEntry );
Collection<String> names = SchemaUtils.getNames( allAtds );
possibleAttributeTypesSubschemaOnly = names.toArray( new String[0] );
Arrays.sort( possibleAttributeTypesSubschemaOnly );
Set<String> set = new HashSet<>( Arrays.asList( possibleAttributeTypesSubschemaOnly ) );
IAttribute[] existingAttributes = initialEntry.getAttributes();
for ( int i = 0; existingAttributes != null && i < existingAttributes.length; i++ )
{
set.remove( existingAttributes[i].getDescription() );
}
possibleAttributeTypesSubschemaOnlyAndExistingHidden = set.toArray( new String[set.size()] );
Arrays.sort( possibleAttributeTypesSubschemaOnlyAndExistingHidden );
String attributeDescription = initialAttributeDescription;
if ( attributeDescription == null )
{
attributeDescription = ""; //$NON-NLS-1$
}
String[] attributeDescriptionComponents = attributeDescription.split( ";" ); //$NON-NLS-1$
parsedAttributeType = attributeDescriptionComponents[0];
}
/**
* Validates this page.
*/
private void validate()
{
previewText.setText( wizard.getAttributeDescription() );
setPageComplete( !"".equals( attributeTypeCombo.getText() ) ); //$NON-NLS-1$
}
/**
* {@inheritDoc}
*/
@Override
public void setVisible( boolean visible )
{
super.setVisible( visible );
if ( visible )
{
validate();
}
}
/**
* {@inheritDoc}
*/
@Override
public void createControl( Composite parent )
{
Composite composite = new Composite( parent, SWT.NONE );
GridLayout gl = new GridLayout( 2, false );
composite.setLayout( gl );
composite.setLayoutData( new GridData( GridData.FILL_BOTH ) );
BaseWidgetUtils.createLabel( composite, Messages.getString( "AttributeTypeWizardPage.AttributeTypeLabel" ), 1 ); //$NON-NLS-1$
// attribute combo with field decoration and content proposal
attributeTypeCombo = BaseWidgetUtils.createCombo( composite, possibleAttributeTypes, -1, 1 );
attributeTypeCombo.setText( parsedAttributeType );
new ExtendedContentAssistCommandAdapter( attributeTypeCombo, new ComboContentAdapter(),
new ListContentProposalProvider( possibleAttributeTypes ), null, null, true );
BaseWidgetUtils.createSpacer( composite, 1 );
showSubschemAttributesOnlyButton = BaseWidgetUtils.createCheckbox( composite, Messages
.getString( "AttributeTypeWizardPage.ShowSubschemaAttributesOnly" ), //$NON-NLS-1$
1 );
showSubschemAttributesOnlyButton.setSelection( initialShowSubschemaAttributesOnly );
BaseWidgetUtils.createSpacer( composite, 1 );
hideExistingAttributesButton = BaseWidgetUtils.createCheckbox( composite, Messages
.getString( "AttributeTypeWizardPage.HideExistingAttributes" ), 1 ); //$NON-NLS-1$
hideExistingAttributesButton.setSelection( initialHideExistingAttributes );
Label l = new Label( composite, SWT.NONE );
GridData gd = new GridData( GridData.FILL_BOTH );
gd.horizontalSpan = 2;
l.setLayoutData( gd );
BaseWidgetUtils.createLabel( composite, Messages.getString( "AttributeTypeWizardPage.PreviewLabel" ), 1 ); //$NON-NLS-1$
previewText = BaseWidgetUtils.createReadonlyText( composite, "", 1 ); //$NON-NLS-1$
// attribute type listener
attributeTypeCombo.addModifyListener( new ModifyListener()
{
@Override
public void modifyText( ModifyEvent e )
{
validate();
}
} );
// filter listener
showSubschemAttributesOnlyButton.addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
updateFilter();
validate();
}
} );
hideExistingAttributesButton.addSelectionListener( new SelectionAdapter()
{
@Override
public void widgetSelected( SelectionEvent e )
{
updateFilter();
validate();
}
} );
updateFilter();
setControl( composite );
}
/**
* Updates the filter.
*/
private void updateFilter()
{
// enable/disable filter buttons
hideExistingAttributesButton.setEnabled( showSubschemAttributesOnlyButton.getSelection() );
if ( possibleAttributeTypesSubschemaOnly.length == 0 )
{
showSubschemAttributesOnlyButton.setSelection( false );
showSubschemAttributesOnlyButton.setEnabled( false );
}
if ( possibleAttributeTypesSubschemaOnlyAndExistingHidden.length == 0 )
{
hideExistingAttributesButton.setEnabled( false );
hideExistingAttributesButton.setSelection( false );
}
// update combo items and proposals
String value = attributeTypeCombo.getText();
if ( hideExistingAttributesButton.getSelection() && showSubschemAttributesOnlyButton.getSelection() )
{
attributeTypeCombo.setItems( possibleAttributeTypesSubschemaOnlyAndExistingHidden );
}
else if ( showSubschemAttributesOnlyButton.getSelection() )
{
attributeTypeCombo.setItems( possibleAttributeTypesSubschemaOnly );
}
else
{
attributeTypeCombo.setItems( possibleAttributeTypes );
}
attributeTypeCombo.setText( value );
}
/**
* Gets the attribute type.
*
* @return the attribute type
*/
String getAttributeType()
{
if ( attributeTypeCombo == null || attributeTypeCombo.isDisposed() )
{
return ""; //$NON-NLS-1$
}
return attributeTypeCombo.getText();
}
}