/* * 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.schema.AttributeType; import org.apache.directory.api.ldap.model.schema.ObjectClass; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; 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.config.model.overlay.OlcRwmMapValue; import org.apache.directory.studio.openldap.config.model.overlay.OlcRwmMapValueTypeEnum; /** * T * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class RwmMappingDialog extends Dialog { /** The connection's attribute types */ private List<String> connectionAttributeTypes; /** The connection's object classes */ private List<String> connectionObjectClasses; /** The connection */ private IBrowserConnection browserConnection; /** The value */ private OlcRwmMapValue value; // UI widgets private Button okButton; private ComboViewer typeComboViewer; private ComboViewer localNameComboViewer; private ComboViewer foreignNameComboViewer; // Listeners private ModifyListener namesComboViewerListener = new ModifyListener() { public void modifyText( ModifyEvent e ) { checkAndUpdateOkButtonEnableState(); } }; private ISelectionChangedListener typeComboViewerSelectionListener = new ISelectionChangedListener() { public void selectionChanged( SelectionChangedEvent event ) { OlcRwmMapValueTypeEnum selectedType = getSelectedType(); // Backing up the combos text String localNameText = localNameComboViewer.getCombo().getText(); String foreignNameText = foreignNameComboViewer.getCombo().getText(); // Adding the correct suggestions to the viewers if ( OlcRwmMapValueTypeEnum.ATTRIBUTE.equals( selectedType ) ) { localNameComboViewer.setInput( connectionAttributeTypes ); foreignNameComboViewer.setInput( connectionAttributeTypes ); } else if ( OlcRwmMapValueTypeEnum.OBJECTCLASS.equals( selectedType ) ) { localNameComboViewer.setInput( connectionObjectClasses ); foreignNameComboViewer.setInput( connectionObjectClasses ); } // Restoring the combos text localNameComboViewer.getCombo().setText( localNameText ); foreignNameComboViewer.getCombo().setText( foreignNameText ); } }; /** * Creates a new instance of ValueSortingValueDialog. * * @param parentShell the parent shell * @param browserConnection the connection * @param value the value */ public RwmMappingDialog( Shell parentShell, IBrowserConnection browserConnection, String value ) { super( parentShell ); super.setShellStyle( super.getShellStyle() | SWT.RESIZE ); this.browserConnection = browserConnection; // Parsing the value try { this.value = OlcRwmMapValue.parse( value ); if ( this.value == null ) { this.value = new OlcRwmMapValue(); } } catch ( ParseException e ) { this.value = new OlcRwmMapValue(); } initAttributeTypesAndObjectClassesLists(); } /** * Creates a new instance of ValueSortingValueDialog. * * @param parentShell the parent shell * @param browserConnection the connection */ public RwmMappingDialog( Shell parentShell, IBrowserConnection browserConnection ) { super( parentShell ); super.setShellStyle( super.getShellStyle() | SWT.RESIZE ); this.browserConnection = browserConnection; this.value = new OlcRwmMapValue(); initAttributeTypesAndObjectClassesLists(); } /** * Initializes the lists of attribute types and object classes. */ private void initAttributeTypesAndObjectClassesLists() { connectionAttributeTypes = new ArrayList<String>(); connectionObjectClasses = 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 ); } } // Object Classes Collection<ObjectClass> ocds = browserConnection.getSchema().getObjectClassDescriptions(); for ( ObjectClass ocd : ocds ) { for ( String name : ocd.getNames() ) { connectionObjectClasses.add( name ); } } // Creating a case insensitive comparator Comparator<String> ignoreCaseComparator = new Comparator<String>() { public int compare( String o1, String o2 ) { return o1.compareToIgnoreCase( o2 ); } }; // Sorting the lists Collections.sort( connectionAttributeTypes, ignoreCaseComparator ); Collections.sort( connectionObjectClasses, ignoreCaseComparator ); // Adding the '*' special name connectionAttributeTypes.add( 0, "*" ); connectionObjectClasses.add( 0, "*" ); } } /** * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell) */ protected void configureShell( Shell shell ) { super.configureShell( shell ); shell.setText( "Mapping" ); } /** * @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() { // Type value.setType( getSelectedType() ); // Local Name String localName = localNameComboViewer.getCombo().getText(); if ( ( localName != null ) && ( !localName.isEmpty() ) ) { value.setLocalName( localName ); } else { value.setLocalName( null ); } // Foreign Name String foreignName = foreignNameComboViewer.getCombo().getText(); if ( ( foreignName != null ) && ( !foreignName.isEmpty() ) ) { value.setForeignName( foreignName ); } else { value.setForeignName( null ); } 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 ); // Type BaseWidgetUtils.createLabel( composite, "Type:", 1 ); typeComboViewer = new ComboViewer( composite ); typeComboViewer.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); typeComboViewer.setContentProvider( new ArrayContentProvider() ); typeComboViewer.setLabelProvider( new LabelProvider() { public String getText( Object element ) { if ( element instanceof OlcRwmMapValueTypeEnum ) { OlcRwmMapValueTypeEnum type = ( OlcRwmMapValueTypeEnum ) element; switch ( type ) { case ATTRIBUTE: return "Attribute Type"; case OBJECTCLASS: return "Object Class"; } } return super.getText( element ); } } ); typeComboViewer.setInput( new OlcRwmMapValueTypeEnum[] { OlcRwmMapValueTypeEnum.ATTRIBUTE, OlcRwmMapValueTypeEnum.OBJECTCLASS } ); // Local Name BaseWidgetUtils.createLabel( composite, "Local Name:", 1 ); localNameComboViewer = new ComboViewer( new Combo( composite, SWT.DROP_DOWN ) ); localNameComboViewer.getControl() .setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); localNameComboViewer.setContentProvider( new ArrayContentProvider() ); // Foreign Name BaseWidgetUtils.createLabel( composite, "Foreign Name:", 1 ); foreignNameComboViewer = new ComboViewer( new Combo( composite, SWT.DROP_DOWN ) ); foreignNameComboViewer.getControl() .setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); foreignNameComboViewer.setContentProvider( new ArrayContentProvider() ); initFromValue(); addListeners(); applyDialogFont( composite ); return composite; } /** * Adds listeners to UI widgets. */ private void addListeners() { typeComboViewer.addSelectionChangedListener( typeComboViewerSelectionListener ); localNameComboViewer.getCombo().addModifyListener( namesComboViewerListener ); foreignNameComboViewer.getCombo().addModifyListener( namesComboViewerListener ); } /** * Inits the UI from the value. */ private void initFromValue() { // Type OlcRwmMapValueTypeEnum type = value.getType(); if ( type != null ) { typeComboViewer.setSelection( new StructuredSelection( type ) ); // Adding the correct suggestions to the viewers if ( OlcRwmMapValueTypeEnum.ATTRIBUTE.equals( type ) ) { localNameComboViewer.setInput( connectionAttributeTypes ); foreignNameComboViewer.setInput( connectionAttributeTypes ); } else if ( OlcRwmMapValueTypeEnum.OBJECTCLASS.equals( type ) ) { localNameComboViewer.setInput( connectionObjectClasses ); foreignNameComboViewer.setInput( connectionObjectClasses ); } } else { typeComboViewer.setSelection( new StructuredSelection( OlcRwmMapValueTypeEnum.ATTRIBUTE ) ); // Adding the suggestions to the viewers localNameComboViewer.setInput( connectionAttributeTypes ); foreignNameComboViewer.setInput( connectionAttributeTypes ); } // Local Name String localName = value.getLocalName(); if ( localName != null ) { localNameComboViewer.getCombo().setText( localName ); } else { localNameComboViewer.getCombo().setText( "" ); } // Local Name String foreignName = value.getForeignName(); if ( foreignName != null ) { foreignNameComboViewer.getCombo().setText( foreignName ); } else { foreignNameComboViewer.getCombo().setText( "" ); } } /** * Gets the selected sort method. * * @return the selected sort method */ private OlcRwmMapValueTypeEnum getSelectedType() { StructuredSelection selection = ( StructuredSelection ) typeComboViewer.getSelection(); if ( !selection.isEmpty() ) { return ( OlcRwmMapValueTypeEnum ) selection.getFirstElement(); } return null; } /** * Checks and updates the OK button 'enable' state. */ private void checkAndUpdateOkButtonEnableState() { boolean enableOkButton = true; do { // Type if ( getSelectedType() == null ) { enableOkButton = false; break; } // Local Name can be omitted, so we don't check it // Foreign Name can't be omitted String foreignName = foreignNameComboViewer.getCombo().getText(); if ( ( foreignName == null ) || ( foreignName.isEmpty() ) ) { enableOkButton = false; break; } } while ( false ); okButton.setEnabled( enableOkButton ); } /** * Gets the value. * * @return the value */ public String getValue() { return value.toString(); } }