/* * 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.ldapservers.wizards; import java.util.regex.Pattern; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; import org.apache.directory.studio.ldapservers.LdapServersManager; import org.apache.directory.studio.ldapservers.LdapServersPlugin; import org.apache.directory.studio.ldapservers.LdapServersPluginConstants; import org.apache.directory.studio.ldapservers.model.LdapServerAdapterExtension; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; 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.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.swt.widgets.Tree; /** * This class implements the wizard page for the new server wizard selection page. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class NewServerWizardSelectionPage extends WizardPage { /** The servers handler */ private LdapServersManager ldapServersManager; /** The content provider of the TreeViewer */ private LdapServerAdapterExtensionsContentProvider contentProvider; /** The label provider of the TreeViewer */ private LdapServerAdapterExtensionsLabelProvider labelProvider; // UI fields private Label filterLabel; private Text filterText; private TreeViewer ldapServerAdaptersTreeViewer; private Text serverNameText; /** * Creates a new instance of NewServerWizardSelectionPage. */ public NewServerWizardSelectionPage() { super( NewServerWizardSelectionPage.class.getCanonicalName() ); setTitle( Messages.getString( "NewServerWizardSelectionPage.CreateAnLdapServer" ) ); //$NON-NLS-1$ setDescription( Messages.getString( "NewServerWizardSelectionPage.ChooseTypeOfServerAndSpecifyName" ) ); //$NON-NLS-1$ setImageDescriptor( LdapServersPlugin.getDefault().getImageDescriptor( LdapServersPluginConstants.IMG_SERVER_NEW_WIZARD ) ); setPageComplete( false ); ldapServersManager = LdapServersManager.getDefault(); } /** * {@inheritDoc} */ public void createControl( Composite parent ) { // Creating the composite to hold the UI Composite composite = new Composite( parent, SWT.NONE ); composite.setLayout( new GridLayout( 2, false ) ); // Filter Label filterLabel = BaseWidgetUtils.createLabel( composite, Messages.getString( "NewServerWizardSelectionPage.SelectServerType" ), 2 ); //$NON-NLS-1$ filterLabel.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 2, 1 ) ); // Filter Text filterText = new Text( composite, SWT.BORDER | SWT.SEARCH | SWT.CANCEL ); filterText.setMessage( Messages.getString( "NewServerWizardSelectionPage.TypeFilterHere" ) ); //$NON-NLS-1$ filterText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 2, 1 ) ); // LDAP Server Adapters Tree Viewer ldapServerAdaptersTreeViewer = new TreeViewer( new Tree( composite, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER ) ); GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true, 2, 1 ); gd.heightHint = 90; ldapServerAdaptersTreeViewer.getTree().setLayoutData( gd ); contentProvider = new LdapServerAdapterExtensionsContentProvider(); ldapServerAdaptersTreeViewer.setContentProvider( contentProvider ); labelProvider = new LdapServerAdapterExtensionsLabelProvider(); ldapServerAdaptersTreeViewer.setLabelProvider( labelProvider ); ldapServerAdaptersTreeViewer.setInput( "LDAP Server Adapters Tree Viewer Input" ); //$NON-NLS-1$ ldapServerAdaptersTreeViewer.expandAll(); ldapServerAdaptersTreeViewer.addFilter( new ViewerFilter() { public boolean select( Viewer viewer, Object parentElement, Object element ) { // The current element is a Vendor if ( element instanceof String ) { Object[] children = contentProvider.getChildren( element ); for ( Object child : children ) { String label = labelProvider.getText( child ); return getFilterPattern().matcher( label ).matches(); } } // The current element is an LdapServerAdapterExtension else if ( element instanceof LdapServerAdapterExtension ) { String label = labelProvider.getText( element ); return getFilterPattern().matcher( label ).matches(); } return false; } /** * Gets the filter pattern. * * @return * the filter pattern */ private Pattern getFilterPattern() { String filter = filterText.getText(); return Pattern.compile( ( ( filter == null ) ? ".*" : ".*" + filter + ".*" ), Pattern.CASE_INSENSITIVE ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } } ); // Filler Label filler = new Label( composite, SWT.NONE ); filler.setLayoutData( new GridData( SWT.NONE, SWT.NONE, true, false, 2, 1 ) ); // Server Name Label BaseWidgetUtils.createLabel( composite, Messages.getString( "NewServerWizardSelectionPage.ServerName" ), 1 ); //$NON-NLS-1$ // Server Name Text serverNameText = BaseWidgetUtils.createText( composite, "", 1 ); //$NON-NLS-1$ // Adding listeners addListeners(); // Setting the control on the composite and setting focus setControl( composite ); composite.setFocus(); } /** * Adding listeners to UI elements. */ private void addListeners() { // Filter Text filterText.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent e ) { // Refreshing the LDAP Server Adapters Tree Viewer ldapServerAdaptersTreeViewer.refresh(); ldapServerAdaptersTreeViewer.expandAll(); } } ); // LDAP Server Adapters Tree Viewer ldapServerAdaptersTreeViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( SelectionChangedEvent event ) { // Assigning an automatic name to the LDAP Server based on the selected LDAP Server Adapter Extension serverNameText.setText( getServerName( ( StructuredSelection ) ldapServerAdaptersTreeViewer .getSelection() ) ); // getContainer().updateButtons(); validate(); } /** * Get a name for the server based on the current selection. * * @param selection * the current selection * @return * a name for the server based on the current selection */ private String getServerName( StructuredSelection selection ) { if ( !selection.isEmpty() ) { Object selectedObject = selection.getFirstElement(); if ( selectedObject instanceof LdapServerAdapterExtension ) { // Getting the name of the LDAP Server Adapter Extension String serverName = labelProvider.getText( selection.getFirstElement() ); // Checking if the name if available if ( ldapServersManager.isNameAvailable( serverName ) ) { return serverName; } else { // The name is not available, looking for another name String newServerName = serverName; for ( int i = 2; !ldapServersManager.isNameAvailable( newServerName ); i++ ) { newServerName = serverName + " (" + i + ")"; //$NON-NLS-1$ //$NON-NLS-2$ } return newServerName; } } } // Returning an empty string if the selection is empty or if the current selection is a vendor return ""; //$NON-NLS-1$ } } ); // Server Name Text serverNameText.addModifyListener( new ModifyListener() { public void modifyText( ModifyEvent e ) { validate(); } } ); } /** * Validates the page. */ private void validate() { displayErrorMessage( null ); // LDAP Server Adapters Tree Viewer StructuredSelection selection = ( StructuredSelection ) ldapServerAdaptersTreeViewer.getSelection(); if ( selection.isEmpty() ) { displayErrorMessage( Messages.getString( "NewServerWizardSelectionPage.ChooseTypeOfServerToCreate" ) ); //$NON-NLS-1$ return; } else { Object selectedObject = selection.getFirstElement(); if ( selectedObject instanceof String ) { displayErrorMessage( Messages.getString( "NewServerWizardSelectionPage.ChooseTypeOfServerToCreate" ) ); //$NON-NLS-1$ return; } } // Server Name Text String name = serverNameText.getText(); if ( ( name != null ) ) { if ( "".equals( name ) ) //$NON-NLS-1$ { displayErrorMessage( Messages.getString( "NewServerWizardSelectionPage.EnterANameForLdapServer" ) ); //$NON-NLS-1$ return; } if ( !ldapServersManager.isNameAvailable( name ) ) { displayErrorMessage( Messages .getString( "NewServerWizardSelectionPage.LdapServerWithSameNameAlreadyExists" ) ); //$NON-NLS-1$ return; } } } /** * Displays an error message and set the page status as incomplete * if the message is not null. * * @param message * the message to display */ protected void displayErrorMessage( String message ) { setErrorMessage( message ); setPageComplete( message == null ); } /** * Gets the name of the server. * * @return * the name of the server */ public String getServerName() { return serverNameText.getText(); } /** * Gets the Ldap Server Adapter Extension. * * @return * the Ldap Server Adapter Extension */ public LdapServerAdapterExtension getLdapServerAdapterExtension() { StructuredSelection selection = ( StructuredSelection ) ldapServerAdaptersTreeViewer.getSelection(); if ( !selection.isEmpty() ) { Object selectedObject = selection.getFirstElement(); if ( selectedObject instanceof LdapServerAdapterExtension ) { return ( LdapServerAdapterExtension ) selectedObject; } } return null; } }