/* * 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.dialogs.preferences; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; import org.apache.directory.api.ldap.model.schema.AttributeType; import org.apache.directory.api.ldap.model.schema.LdapSyntax; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator; import org.apache.directory.studio.ldapbrowser.core.BrowserConnectionManager; import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin; import org.apache.directory.studio.ldapbrowser.core.model.IBrowserConnection; import org.apache.directory.studio.ldapbrowser.core.model.schema.AttributeValueEditorRelation; import org.apache.directory.studio.ldapbrowser.core.model.schema.Schema; import org.apache.directory.studio.ldapbrowser.core.model.schema.SchemaUtils; import org.apache.directory.studio.ldapbrowser.core.model.schema.SyntaxValueEditorRelation; import org.apache.directory.studio.valueeditors.ValueEditorManager; import org.apache.directory.studio.valueeditors.ValueEditorManager.ValueEditorExtension; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITableLabelProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; /** * The ValueEditorsPreferencePage is used to specify * value editors for attributes and syntaxes. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class ValueEditorsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private SortedMap<String, ValueEditorExtension> class2ValueEditorExtensionMap; /** Map with attribute OID => attribute type description */ private SortedMap<String, AttributeType> attributeOid2AtdMap; /** Map with attribute name => attribute type description */ private SortedMap<String, AttributeType> attributeNames2AtdMap; /** The attribute names and OIDs. */ private String[] attributeTypesAndOids; /** Map with syntax OID => syntax description */ private SortedMap<String, LdapSyntax> syntaxOid2LsdMap; /** Map with syntax DESC => syntax description */ private SortedMap<String, LdapSyntax> syntaxDesc2LsdMap; /** The syntax DESCs and OIDs. */ private String[] syntaxDescsAndOids; /** The attribute list. */ private List<AttributeValueEditorRelation> attributeList; /** The attribute viewer. */ private TableViewer attributeViewer; /** The attribute add button. */ private Button attributeAddButton; /** The attribute edit button. */ private Button attributeEditButton; /** The attribute remove button. */ private Button attributeRemoveButton; /** The syntax list. */ private List<SyntaxValueEditorRelation> syntaxList; /** The syntax viewer. */ private TableViewer syntaxViewer; /** The syntax add button. */ private Button syntaxAddButton; /** The syntax edit button. */ private Button syntaxEditButton; /** The syntax remove button. */ private Button syntaxRemoveButton; /** The map of images */ private Map<ImageDescriptor, Image> imageMap; /** * Creates a new instance of ValueEditorsPreferencePage. */ public ValueEditorsPreferencePage() { super( Messages.getString( "ValueEditorsPreferencePage.ValueEditors" ) ); //$NON-NLS-1$ super.setDescription( Messages.getString( "ValueEditorsPreferencePage.SpecifyValueEditors" ) ); //$NON-NLS-1$ this.imageMap = new HashMap<ImageDescriptor, Image>(); } /** * {@inheritDoc} */ public void init( IWorkbench workbench ) { } /** * {@inheritDoc} */ public void dispose() { if ( imageMap != null ) { for ( Image image : imageMap.values() ) { if ( image != null && !image.isDisposed() ) { image.dispose(); } } } super.dispose(); } /** * {@inheritDoc} */ protected Control createContents( Composite parent ) { Composite composite = BaseWidgetUtils.createColumnContainer( parent, 1, 1 ); composite.setLayoutData( new GridData( GridData.FILL_BOTH ) ); // init available value providers class2ValueEditorExtensionMap = new TreeMap<String, ValueEditorExtension>(); Composite dummyComposite = new Composite( composite, SWT.NONE ); dummyComposite.setLayoutData( new GridData( 1, 1 ) ); Collection<ValueEditorExtension> valueEditorExtensions = ValueEditorManager.getValueEditorExtensions(); for ( ValueEditorExtension vee : valueEditorExtensions ) { class2ValueEditorExtensionMap.put( vee.className, vee ); } // init available attribute types attributeNames2AtdMap = new TreeMap<String, AttributeType>(); attributeOid2AtdMap = new TreeMap<String, AttributeType>(); BrowserConnectionManager cm = BrowserCorePlugin.getDefault().getConnectionManager(); IBrowserConnection[] connections = cm.getBrowserConnections(); for ( IBrowserConnection browserConnection : connections ) { Schema schema = browserConnection.getSchema(); createAttributeMapsAndArray( schema ); } createAttributeMapsAndArray( Schema.DEFAULT_SCHEMA ); // init available syntaxes syntaxOid2LsdMap = new TreeMap<String, LdapSyntax>(); syntaxDesc2LsdMap = new TreeMap<String, LdapSyntax>(); for ( IBrowserConnection browserConnection : connections ) { Schema schema = browserConnection.getSchema(); createSyntaxMapsAndArray( schema ); } createSyntaxMapsAndArray( Schema.DEFAULT_SCHEMA ); // create attribute contents // BaseWidgetUtils.createSpacer(composite, 1); BaseWidgetUtils.createSpacer( composite, 1 ); createAttributeContents( composite ); attributeList = new ArrayList<AttributeValueEditorRelation>( Arrays.asList( BrowserCommonActivator.getDefault() .getValueEditorsPreferences().getAttributeValueEditorRelations() ) ); attributeViewer.setInput( attributeList ); attributeViewer.getTable().getColumn( 0 ).pack(); attributeViewer.getTable().getColumn( 2 ).pack(); attributeViewer.getTable().pack(); // create syntax contents BaseWidgetUtils.createSpacer( composite, 1 ); BaseWidgetUtils.createSpacer( composite, 1 ); createSyntaxContents( composite ); syntaxList = new ArrayList<SyntaxValueEditorRelation>( Arrays.asList( BrowserCommonActivator.getDefault() .getValueEditorsPreferences().getSyntaxValueEditorRelations() ) ); syntaxViewer.setInput( syntaxList ); syntaxViewer.getTable().getColumn( 0 ).pack(); syntaxViewer.getTable().getColumn( 2 ).pack(); syntaxViewer.getTable().pack(); return composite; } /** * Creates the attribute maps and array. * * @param schema the schema */ private void createAttributeMapsAndArray( Schema schema ) { List<String> attributeTypesList = new ArrayList<String>(); List<String> oidsList = new ArrayList<String>(); Collection<AttributeType> atds = schema.getAttributeTypeDescriptions(); for ( AttributeType atd : atds ) { attributeOid2AtdMap.put( atd.getOid(), atd ); oidsList.add( atd.getOid() ); for ( String name : atd.getNames() ) { attributeNames2AtdMap.put( name.toLowerCase(), atd ); attributeTypesList.add( name ); } } Collections.sort( attributeTypesList ); Collections.sort( oidsList ); List<String> attributeTypesAndOidsList = new ArrayList<String>(); attributeTypesAndOidsList.addAll( attributeTypesList ); attributeTypesAndOidsList.addAll( oidsList ); attributeTypesAndOids = attributeTypesAndOidsList.toArray( new String[0] ); } /** * Create the syntax maps and array. * * @param schema the schema */ private void createSyntaxMapsAndArray( Schema schema ) { List<String> syntaxDescsAndOidsList = new ArrayList<String>(); Collection<LdapSyntax> lsds = schema.getLdapSyntaxDescriptions(); for ( LdapSyntax lsd : lsds ) { syntaxOid2LsdMap.put( lsd.getOid(), lsd ); syntaxDescsAndOidsList.add( lsd.getOid() ); if ( lsd.getDescription() != null ) { syntaxDesc2LsdMap.put( lsd.getDescription(), lsd ); } } Collections.sort( syntaxDescsAndOidsList ); syntaxDescsAndOids = syntaxDescsAndOidsList.toArray( new String[0] ); } private void createAttributeContents( Composite parent ) { BaseWidgetUtils.createLabel( parent, Messages .getString( "ValueEditorsPreferencePage.ValueEditorsByAttributeType" ), 1 ); //$NON-NLS-1$ Composite composite = BaseWidgetUtils.createColumnContainer( parent, 2, 1 ); composite.setLayoutData( new GridData( GridData.FILL_BOTH ) ); Composite listComposite = BaseWidgetUtils.createColumnContainer( composite, 1, 1 ); listComposite.setLayoutData( new GridData( GridData.FILL_BOTH ) ); Composite buttonComposite = BaseWidgetUtils.createColumnContainer( composite, 1, 1 ); buttonComposite.setLayoutData( new GridData( GridData.VERTICAL_ALIGN_BEGINNING ) ); Table table = new Table( listComposite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.FULL_SELECTION ); GridData data = new GridData( GridData.FILL_BOTH ); data.widthHint = 360; data.heightHint = convertHeightInCharsToPixels( 10 ); table.setLayoutData( data ); table.setHeaderVisible( true ); table.setLinesVisible( true ); attributeViewer = new TableViewer( table ); TableColumn c1 = new TableColumn( table, SWT.NONE ); c1.setText( Messages.getString( "ValueEditorsPreferencePage.Attribute" ) ); //$NON-NLS-1$ c1.setWidth( 80 ); TableColumn c2 = new TableColumn( table, SWT.NONE ); c2.setText( Messages.getString( "ValueEditorsPreferencePage.Alias" ) ); //$NON-NLS-1$ c2.setWidth( 80 ); TableColumn c3 = new TableColumn( table, SWT.NONE ); c3.setText( Messages.getString( "ValueEditorsPreferencePage.ValueEditor" ) ); //$NON-NLS-1$ c3.setWidth( 200 ); attributeViewer .setColumnProperties( new String[] { Messages.getString( "ValueEditorsPreferencePage.Attribute" ), Messages.getString( "ValueEditorsPreferencePage.ValueEditor" ) } ); //$NON-NLS-1$ //$NON-NLS-2$ attributeViewer.setContentProvider( new ArrayContentProvider() ); attributeViewer.setLabelProvider( new AttributeLabelProvider() ); attributeViewer.addDoubleClickListener( new IDoubleClickListener() { public void doubleClick( DoubleClickEvent event ) { editAttribute(); } } ); attributeViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( SelectionChangedEvent event ) { attributeEditButton.setEnabled( !attributeViewer.getSelection().isEmpty() ); attributeRemoveButton.setEnabled( !attributeViewer.getSelection().isEmpty() ); } } ); attributeAddButton = BaseWidgetUtils.createButton( buttonComposite, Messages .getString( "ValueEditorsPreferencePage.Add" ), 1 ); //$NON-NLS-1$ attributeAddButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { addAttribute(); } } ); attributeEditButton = BaseWidgetUtils.createButton( buttonComposite, Messages .getString( "ValueEditorsPreferencePage.Edit" ), 1 ); //$NON-NLS-1$ attributeEditButton.setEnabled( false ); attributeEditButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { editAttribute(); } } ); attributeRemoveButton = BaseWidgetUtils.createButton( buttonComposite, Messages .getString( "ValueEditorsPreferencePage.Remove" ), 1 ); //$NON-NLS-1$ attributeRemoveButton.setEnabled( false ); attributeRemoveButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { removeAttribute(); } } ); } private void createSyntaxContents( Composite parent ) { BaseWidgetUtils.createLabel( parent, Messages.getString( "ValueEditorsPreferencePage.ValueEditorBySyntax" ), 1 ); //$NON-NLS-1$ Composite composite = BaseWidgetUtils.createColumnContainer( parent, 2, 1 ); composite.setLayoutData( new GridData( GridData.FILL_BOTH ) ); Composite listComposite = BaseWidgetUtils.createColumnContainer( composite, 1, 1 ); listComposite.setLayoutData( new GridData( GridData.FILL_BOTH ) ); Composite buttonComposite = BaseWidgetUtils.createColumnContainer( composite, 1, 1 ); buttonComposite.setLayoutData( new GridData( GridData.VERTICAL_ALIGN_BEGINNING ) ); Table table = new Table( listComposite, SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.FULL_SELECTION ); GridData data = new GridData( GridData.FILL_BOTH ); data.widthHint = 360; data.heightHint = convertHeightInCharsToPixels( 10 ); table.setLayoutData( data ); table.setHeaderVisible( true ); table.setLinesVisible( true ); syntaxViewer = new TableViewer( table ); TableColumn c1 = new TableColumn( table, SWT.NONE ); c1.setText( Messages.getString( "ValueEditorsPreferencePage.Syntax" ) ); //$NON-NLS-1$ c1.setWidth( 80 ); TableColumn c2 = new TableColumn( table, SWT.NONE ); c2.setText( Messages.getString( "ValueEditorsPreferencePage.Description" ) ); //$NON-NLS-1$ c2.setWidth( 80 ); TableColumn c3 = new TableColumn( table, SWT.NONE ); c3.setText( Messages.getString( "ValueEditorsPreferencePage.ValueEditor" ) ); //$NON-NLS-1$ c3.setWidth( 200 ); syntaxViewer .setColumnProperties( new String[] { Messages.getString( "ValueEditorsPreferencePage.Syntax" ), Messages.getString( "ValueEditorsPreferencePage.ValueEditor" ) } ); //$NON-NLS-1$ //$NON-NLS-2$ syntaxViewer.setContentProvider( new ArrayContentProvider() ); syntaxViewer.setLabelProvider( new SyntaxLabelProvider() ); syntaxViewer.addDoubleClickListener( new IDoubleClickListener() { public void doubleClick( DoubleClickEvent event ) { editSyntax(); } } ); syntaxViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( SelectionChangedEvent event ) { syntaxEditButton.setEnabled( !syntaxViewer.getSelection().isEmpty() ); syntaxRemoveButton.setEnabled( !syntaxViewer.getSelection().isEmpty() ); } } ); syntaxAddButton = BaseWidgetUtils.createButton( buttonComposite, Messages .getString( "ValueEditorsPreferencePage.Add" ), 1 ); //$NON-NLS-1$ syntaxAddButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { addSyntax(); } } ); syntaxEditButton = BaseWidgetUtils.createButton( buttonComposite, Messages .getString( "ValueEditorsPreferencePage.Edit" ), 1 ); //$NON-NLS-1$ syntaxEditButton.setEnabled( false ); syntaxEditButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { editSyntax(); } } ); syntaxRemoveButton = BaseWidgetUtils.createButton( buttonComposite, Messages .getString( "ValueEditorsPreferencePage.Remove" ), 1 ); //$NON-NLS-1$ syntaxRemoveButton.setEnabled( false ); syntaxRemoveButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { removeSyntax(); } } ); } private void addAttribute() { AttributeValueEditorDialog dialog = new AttributeValueEditorDialog( getShell(), null, class2ValueEditorExtensionMap, attributeTypesAndOids ); if ( dialog.open() == AttributeValueEditorDialog.OK ) { attributeList.add( dialog.getRelation() ); attributeViewer.refresh(); } } private void removeAttribute() { Object o = ( ( StructuredSelection ) attributeViewer.getSelection() ).getFirstElement(); attributeList.remove( o ); attributeViewer.refresh(); } private void editAttribute() { StructuredSelection sel = ( StructuredSelection ) attributeViewer.getSelection(); if ( !sel.isEmpty() ) { AttributeValueEditorRelation relation = ( AttributeValueEditorRelation ) sel.getFirstElement(); AttributeValueEditorDialog dialog = new AttributeValueEditorDialog( getShell(), relation, class2ValueEditorExtensionMap, attributeTypesAndOids ); if ( dialog.open() == AttributeValueEditorDialog.OK ) { int index = attributeList.indexOf( relation ); attributeList.set( index, dialog.getRelation() ); attributeViewer.refresh(); } } } private void addSyntax() { SyntaxValueEditorDialog dialog = new SyntaxValueEditorDialog( getShell(), null, class2ValueEditorExtensionMap, syntaxDescsAndOids ); if ( dialog.open() == SyntaxValueEditorDialog.OK ) { syntaxList.add( dialog.getRelation() ); syntaxViewer.refresh(); } } private void removeSyntax() { Object o = ( ( StructuredSelection ) syntaxViewer.getSelection() ).getFirstElement(); syntaxList.remove( o ); syntaxViewer.refresh(); } private void editSyntax() { StructuredSelection sel = ( StructuredSelection ) syntaxViewer.getSelection(); if ( !sel.isEmpty() ) { SyntaxValueEditorRelation relation = ( SyntaxValueEditorRelation ) sel.getFirstElement(); SyntaxValueEditorDialog dialog = new SyntaxValueEditorDialog( getShell(), relation, class2ValueEditorExtensionMap, syntaxDescsAndOids ); if ( dialog.open() == SyntaxValueEditorDialog.OK ) { int index = syntaxList.indexOf( relation ); syntaxList.set( index, dialog.getRelation() ); syntaxViewer.refresh(); } } } /** * {@inheritDoc} */ public boolean performOk() { AttributeValueEditorRelation[] aRelations = attributeList .toArray( new AttributeValueEditorRelation[attributeList.size()] ); BrowserCommonActivator.getDefault().getValueEditorsPreferences().setAttributeValueEditorRelations( aRelations ); SyntaxValueEditorRelation[] sRelations = syntaxList.toArray( new SyntaxValueEditorRelation[syntaxList.size()] ); BrowserCommonActivator.getDefault().getValueEditorsPreferences().setSyntaxValueEditorRelations( sRelations ); return true; } /** * {@inheritDoc} */ protected void performDefaults() { attributeList.clear(); attributeList.addAll( Arrays.asList( BrowserCommonActivator.getDefault().getValueEditorsPreferences() .getDefaultAttributeValueEditorRelations() ) ); attributeViewer.refresh(); syntaxList.clear(); syntaxList.addAll( Arrays.asList( BrowserCommonActivator.getDefault().getValueEditorsPreferences() .getDefaultSyntaxValueEditorRelations() ) ); syntaxViewer.refresh(); super.performDefaults(); } class AttributeLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText( Object obj, int index ) { if ( obj instanceof AttributeValueEditorRelation ) { AttributeValueEditorRelation relation = ( AttributeValueEditorRelation ) obj; if ( index == 0 ) { return relation.getAttributeNumericOidOrType(); } else if ( index == 1 ) { if ( relation.getAttributeNumericOidOrType() != null ) { if ( attributeNames2AtdMap.containsKey( relation.getAttributeNumericOidOrType().toLowerCase() ) ) { AttributeType atd = ( AttributeType ) attributeNames2AtdMap .get( relation.getAttributeNumericOidOrType().toLowerCase() ); String s = atd.getOid(); for ( String name : atd.getNames() ) { if ( !relation.getAttributeNumericOidOrType().equalsIgnoreCase( name ) ) { s += ", " + name; //$NON-NLS-1$ } } return s; } else if ( attributeOid2AtdMap.containsKey( relation.getAttributeNumericOidOrType() ) ) { AttributeType atd = ( AttributeType ) attributeOid2AtdMap .get( relation.getAttributeNumericOidOrType() ); return atd.toString(); } } } else if ( index == 2 ) { ValueEditorExtension vee = class2ValueEditorExtensionMap.get( relation.getValueEditorClassName() ); return vee != null ? vee.name : null; } } return null; } public Image getColumnImage( Object obj, int index ) { if ( obj instanceof AttributeValueEditorRelation ) { AttributeValueEditorRelation relation = ( AttributeValueEditorRelation ) obj; if ( index == 2 ) { ValueEditorExtension vee = class2ValueEditorExtensionMap.get( relation.getValueEditorClassName() ); if ( vee != null ) { if ( !imageMap.containsKey( vee.icon ) ) { Image image = vee.icon.createImage(); imageMap.put( vee.icon, image ); } return imageMap.get( vee.icon ); } return null; } } return null; } } class SyntaxLabelProvider extends LabelProvider implements ITableLabelProvider { public String getColumnText( Object obj, int index ) { if ( obj instanceof SyntaxValueEditorRelation ) { SyntaxValueEditorRelation relation = ( SyntaxValueEditorRelation ) obj; if ( index == 0 ) { return relation.getSyntaxOID(); } else if ( index == 1 ) { if ( relation.getSyntaxOID() != null ) { if ( syntaxOid2LsdMap.containsKey( relation.getSyntaxOID() ) ) { LdapSyntax lsd = ( LdapSyntax ) syntaxOid2LsdMap.get( relation .getSyntaxOID() ); return SchemaUtils.toString( lsd ); } } } else if ( index == 2 ) { ValueEditorExtension vee = class2ValueEditorExtensionMap.get( relation.getValueEditorClassName() ); return vee != null ? vee.name : null; } } return null; } public Image getColumnImage( Object obj, int index ) { if ( obj instanceof SyntaxValueEditorRelation ) { SyntaxValueEditorRelation relation = ( SyntaxValueEditorRelation ) obj; if ( index == 2 ) { ValueEditorExtension vee = class2ValueEditorExtensionMap.get( relation.getValueEditorClassName() ); if ( vee != null ) { if ( !imageMap.containsKey( vee.icon ) ) { Image image = vee.icon.createImage(); imageMap.put( vee.icon, image ); } return imageMap.get( vee.icon ); } return null; } } return null; } } }