You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2015/05/14 21:15:46 UTC

svn commit: r1679435 - in /directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config: editor/dialogs/ServerIdDialog.java editor/pages/OverviewPage.java model/widgets/ServerIdTableWidget.java

Author: elecharny
Date: Thu May 14 19:15:46 2015
New Revision: 1679435

URL: http://svn.apache.org/r1679435
Log:
Added a widget and a dialog to handle the ServerIDs. As we may have many values, we need a table for that value.

Added:
    directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/dialogs/ServerIdDialog.java
    directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/widgets/ServerIdTableWidget.java
Modified:
    directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/pages/OverviewPage.java

Added: directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/dialogs/ServerIdDialog.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/dialogs/ServerIdDialog.java?rev=1679435&view=auto
==============================================================================
--- directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/dialogs/ServerIdDialog.java (added)
+++ directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/dialogs/ServerIdDialog.java Thu May 14 19:15:46 2015
@@ -0,0 +1,375 @@
+/*
+ *  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.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.api.ldap.model.exception.LdapURLEncodingException;
+import org.apache.directory.api.ldap.model.url.LdapUrl;
+import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+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.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.apache.directory.studio.openldap.config.editor.pages.ServerIdWrapper;
+
+
+/**
+ * The ServerIdDialog is used to edit a ServerID, which can be an integer, an hexadicimal number,
+ * optionally followed by an URL. The dialog overlay is like :
+ * 
+ * <pre>
+ * +---------------------------------------+
+ * |  ServerID                             |
+ * | .-----------------------------------. |
+ * | | ID  : [    ]                      | |
+ * | | URL : [                         ] | |
+ * | '-----------------------------------' |
+ * | .-----------------------------------. |
+ * | | ServerId : <////////////////////> | |
+ * | '-----------------------------------' |
+ * |                                       |
+ * |  (cancel)                       (OK)  |
+ * +---------------------------------------+
+ * 
+ * </pre>
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ServerIdDialog extends Dialog
+{
+    /** The ServerId */
+    private ServerIdWrapper serverId;
+
+    /** The new serverId */
+    private ServerIdWrapper newServerId;
+
+    /** The list of existing ServerID */
+    List<ServerIdWrapper> serverIdList;
+    
+    // UI widgets
+    /** The ID Text */
+    private Text idText;
+    
+    /** The URL text */
+    private Text urlText;
+    
+    /** The resulting sevrerID Text, or an error message */
+    private Text serverIdText;
+
+
+    /**
+     * Create a new instance of the ServerIdDialog
+     * 
+     * @param parentShell The parent Shell
+     * @param serverId The instance containing the ServerID data
+     */
+    public ServerIdDialog( Shell parentShell, List<ServerIdWrapper> serverIdList, ServerIdWrapper serverId )
+    {
+        super( parentShell );
+        super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
+        this.serverId = serverId;
+        this.serverIdList = serverIdList;
+        
+        if ( serverIdList == null )
+        {
+            this.serverIdList = new ArrayList<ServerIdWrapper>();
+        }
+    }
+
+
+    /**
+     * Create a new instance of the ServerIdDialog
+     * 
+     * @param parentShell The parent Shell
+     * @param serverIdStr : The string containing the serverID
+     */
+    public ServerIdDialog( Shell parentShell, String serverIdStr )
+    {
+        super( parentShell );
+        super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
+        this.serverId = new ServerIdWrapper( serverIdStr );
+    }
+    
+    
+    /**
+     * The A listener for the ID Text
+     */
+    private ModifyListener idTextListener = new ModifyListener()
+    {
+        public void modifyText( ModifyEvent e )
+        {
+            Display display = serverIdText.getDisplay();
+            Button okButton = getButton( IDialogConstants.OK_ID );
+            
+            // This button might be null when the dialog is called.
+            if ( okButton == null )
+            {
+                return;
+            }
+
+            try
+            {
+                int idValue = Integer.parseInt( idText.getText() );
+
+                // The value must be between 0 and 4095, and it must not already exists
+                if ( ( idValue < 0 ) || ( idValue > 4096 ) )
+                {
+                    System.out.println( "Wrong ID : it must be a value in [0..4095]" );
+                    serverIdText.setText( "Wrong ID : it must be a value in [0..4095]" );
+                    serverIdText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
+                    okButton.setEnabled( false );
+                    return;
+                }
+                else
+                {
+                    // Be sure the value is not already taken
+                    for ( ServerIdWrapper serverIdWrapper : serverIdList )
+                    {
+                        if ( serverIdWrapper.getServerId() == idValue )
+                        {
+                            System.out.println( "Wrong ServerID : already taken" );
+                            serverIdText.setText( "Wrong ID : it's already taken by another Server ID" );
+                            serverIdText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
+                            okButton.setEnabled( false );
+                            return;
+                        }
+                    }
+                }
+                
+                serverIdText.setText( idText.getText() + ' ' + urlText.getText() );
+                serverIdText.setForeground( display.getSystemColor( SWT.COLOR_BLACK ) );
+                okButton.setEnabled( true );
+            }
+            catch ( NumberFormatException nfe )
+            {
+                // Not even a number
+                System.out.println( "Wrong ServerID : it must be an integer" );
+                serverIdText.setText( "Wrong ID : it must be an integer in [0..4095]" );
+                serverIdText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
+                okButton.setEnabled( false );
+            }
+        }
+    };
+    
+    
+    /**
+     * The A listener for the URL Text
+     */
+    private ModifyListener urlTextListener = new ModifyListener()
+    {
+        public void modifyText( ModifyEvent e )
+        {
+            Display display = serverIdText.getDisplay();
+            Button okButton = getButton( IDialogConstants.OK_ID );
+            
+            
+            // This button might be null when the dialog is called.
+            if ( okButton == null )
+            {
+                return;
+            }
+
+            try
+            {
+                new LdapUrl( urlText.getText() );
+                
+                serverIdText.setText( idText.getText() + ' ' + urlText.getText() );
+                serverIdText.setForeground( display.getSystemColor( SWT.COLOR_BLACK ) );
+                okButton.setEnabled( true );
+            }
+            catch ( LdapURLEncodingException luee )
+            {
+                System.out.println( "Wrong ServerID : the URL is invalid" );
+                serverIdText.setText( "Wrong ServerID : the URL is invalid" );
+                serverIdText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
+                okButton.setEnabled( false );
+            }
+
+        }
+    };
+            
+
+    /**
+     * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+     */
+    protected void configureShell( Shell shell )
+    {
+        super.configureShell( shell );
+        shell.setText( "ServerId" );
+    }
+
+
+    /**
+     * We have to check that the ID does not already exist.
+     * {@inheritDoc}
+     */
+    protected void okPressed()
+    {
+        // Creating the new index
+        String id = idText.getText();
+        String url = urlText.getText();
+        int idValue = Integer.valueOf( id );
+        
+        newServerId = new ServerIdWrapper( idValue , url );
+        super.okPressed();
+    }
+
+
+    /**
+     * Create the Dialog for ServerID :
+     * <pre>
+     * +---------------------------------------+
+     * |  ServerID                             |
+     * | .-----------------------------------. |
+     * | | ID  : [    ]                      | |
+     * | | URL : [                         ] | |
+     * | '-----------------------------------' |
+     * | .-----------------------------------. |
+     * | | ServerId : <////////////////////> | |
+     * | '-----------------------------------' |
+     * |                                       |
+     * |  (cancel)                       (OK)  |
+     * +---------------------------------------+
+     * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+     */
+    protected Control createDialogArea( Composite parent )
+    {
+        Composite composite = ( Composite ) super.createDialogArea( parent );
+        GridData gd = new GridData( GridData.FILL_BOTH );
+        composite.setLayoutData( gd );
+
+        createServerIdEditGroup( composite );
+        createServerIdShowGroup( composite );
+
+        initFromServerId();
+
+        applyDialogFont( composite );
+        
+        return composite;
+    }
+
+
+    /**
+     * Creates the ServerID input group. This is the part of the dialog
+     * where one can insert the ServerID values:
+     * 
+     * <pre>
+     * ServerID
+     * .-----------------------------------.
+     * | ID  : [    ]                      |
+     * | URL : [                         ] |
+     * '-----------------------------------'
+     * </pre>
+     * @param parent the parent composite
+     */
+    private void createServerIdEditGroup( Composite parent )
+    {
+        // Attributes Group
+        Group serverIdGroup = BaseWidgetUtils.createGroup( parent, "ServerID input", 1 );
+        GridLayout attributesGroupGridLayout = new GridLayout( 2, false );
+        serverIdGroup.setLayout( attributesGroupGridLayout );
+        serverIdGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+
+        // ServerID Text
+        BaseWidgetUtils.createLabel( serverIdGroup, "ID:", 1 );
+        idText = BaseWidgetUtils.createText( serverIdGroup, "", 1 );
+        idText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+        idText.addModifyListener( idTextListener );
+
+        // URL Text
+        BaseWidgetUtils.createLabel( serverIdGroup, "URL:", 1 );
+        urlText = BaseWidgetUtils.createText( serverIdGroup, "", 1 );
+        urlText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+        urlText.addModifyListener( urlTextListener );
+    }
+
+
+    /**
+     * Creates the ServerID show group. This is the part of the dialog
+     * where the real ServerID is shown, or an error message if the ServerID
+     * is invalid.
+     * 
+     * <pre>
+     * .-----------------------------------.
+     * | ServerID  : <///////////////////> |
+     * '-----------------------------------'
+     * </pre>
+     * @param parent the parent composite
+     */
+    private void createServerIdShowGroup( Composite parent )
+    {
+        // Attributes Group
+        Group serverIdGroup = BaseWidgetUtils.createGroup( parent, "", 1 );
+        GridLayout attributesGroupGridLayout = new GridLayout( 2, false );
+        serverIdGroup.setLayout( attributesGroupGridLayout );
+        serverIdGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+
+        // ServerID Text
+        serverIdText = BaseWidgetUtils.createText( serverIdGroup, "", 1 );
+        serverIdText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
+    }
+
+
+    /**
+     * Initializes the UI from the ServerId
+     */
+    private void initFromServerId()
+    {
+        if ( serverId != null )
+        {
+            idText.setText( Integer.toString( serverId.getServerId() ) );
+            
+            String url = serverId.getUrl();
+            
+            if ( url == null )
+            {
+                urlText.setText( "" );
+            }
+            else
+            {
+                urlText.setText( serverId.getUrl() );
+            }
+        }
+    }
+
+
+    /**
+     * Gets the new ServerId.
+     *
+     * @return the new serverID
+     */
+    public ServerIdWrapper getNewServerId()
+    {
+        return newServerId;
+    }
+}

Modified: directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/pages/OverviewPage.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/pages/OverviewPage.java?rev=1679435&r1=1679434&r2=1679435&view=diff
==============================================================================
--- directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/pages/OverviewPage.java (original)
+++ directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/editor/pages/OverviewPage.java Thu May 14 19:15:46 2015
@@ -36,15 +36,14 @@ import org.apache.directory.studio.openl
 import org.apache.directory.studio.openldap.config.editor.pages.OverlaysPage;
 import org.apache.directory.studio.openldap.config.model.OlcModuleList;
 import org.apache.directory.studio.openldap.config.model.database.OlcDatabaseConfig;
+import org.apache.directory.studio.openldap.config.model.widgets.ServerIdTableWidget;
 import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.TableViewer;
 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.Display;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.Text;
 import org.eclipse.ui.forms.events.HyperlinkAdapter;
@@ -74,7 +73,12 @@ import org.eclipse.ui.forms.widgets.Tabl
  * | .-------------------------------------------------------------------------------. |
  * | |V Global parameters                                                            | |
  * | +-------------------------------------------------------------------------------+ |
- * | | Server ID  : [   ]                                                            | |
+ * | | Server ID  :                                                                  | |
+ * | | +-----------------------------------------------------------------+           | |
+ * | | |                                                                 | (Add)     | |
+ * | | |                                                                 | (Edit)    | |
+ * | | |                                                                 | (Delete)  | |
+ * | | +-----------------------------------------------------------------+           | |
  * | |                                                                               | |
  * | | Configuration Dir : [                ]  Pid File  : [                ]        | |
  * | | Log File          : [                ]  Log Level : [                ]  (edit)| |
@@ -109,9 +113,12 @@ public class OverviewPage extends OpenLD
     private static final String TITLE = Messages.getString( "OpenLDAPOverviewPage.Title" ); //$NON-NLS-1$"Overview";
     
     // UI Controls
-    /** olcServerID */
-    private Text serverIdText;
+    /** The serverID wrapper */
+    private List<ServerIdWrapper> serverIdWrappers = new ArrayList<ServerIdWrapper>();
     
+    /** The Widget used to manage ServerID */
+    private ServerIdTableWidget serverIdWidget;
+
     /** olcConfigDir */
     private Text configDirText;
     
@@ -318,12 +325,18 @@ public class OverviewPage extends OpenLD
      * .-------------------------------------------------------------------------------.
      * |V Global parameters                                                            |
      * +-------------------------------------------------------------------------------+
-     * | Server ID  : [   ]                                                            |
+     * | Server ID  :                                                                  |
+     * | +-----------------------------------------------------------------+           |
+     * | |                                                                 | (Add)     |
+     * | |                                                                 | (Edit)    |
+     * | |                                                                 | (Delete)  |
+     * | +-----------------------------------------------------------------+           |
      * |                                                                               |
      * | Configuration Dir : [                ]  Pid File  : [                ]        |
-     * | Log File          : [                ]  Log Level : [                ] (Edit) |
+     * | Log File          : [                ]  Log Level : [                ]  (edit)|
      * +-------------------------------------------------------------------------------+
      * </pre>
+     * 
      *
      * @param toolkit the toolkit
      * @param parent the parent composite
@@ -334,42 +347,45 @@ public class OverviewPage extends OpenLD
         Section section = createSection( toolkit, parent, Messages.getString( "OpenLDAPOverviewPage.GlobalSection" ) );
 
         // The content
-        Composite composite = toolkit.createComposite( section );
-        toolkit.paintBordersFor( composite );
+        Composite globalSectionComposite = toolkit.createComposite( section );
+        toolkit.paintBordersFor( globalSectionComposite );
         GridLayout gridLayout = new GridLayout( 4, false );
         gridLayout.marginHeight = gridLayout.marginWidth = 0;
-        composite.setLayout( gridLayout );
-        section.setClient( composite );
+        globalSectionComposite.setLayout( gridLayout );
+        section.setClient( globalSectionComposite );
 
-        // The ServerID parameter
-        toolkit.createLabel( composite, Messages.getString( "OpenLDAPOverviewPage.ServerID" ) ); //$NON-NLS-1$
-        serverIdText = createServerIdText( toolkit, composite );
-        toolkit.createLabel( composite, TABULATION );
-        toolkit.createLabel( composite, TABULATION );
+        // The ServerID parameter.
+        Label serverIdLabel = toolkit.createLabel( globalSectionComposite, Messages.getString( "OpenLDAPOverviewPage.ServerID" ) ); //$NON-NLS-1$
+        serverIdLabel.setLayoutData( new GridData( SWT.FILL, SWT.FILL, false, false, 4, 1 ) );
+
+        // The ServerID widget
+        serverIdWidget = new ServerIdTableWidget();
+        serverIdWidget.createWidget( globalSectionComposite );
+        serverIdWidget.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false, 4, 1 ) );
         
         // One blank line
         for ( int i = 0; i < gridLayout.numColumns; i++ )
         {
-            toolkit.createLabel( composite, TABULATION );
+            toolkit.createLabel( globalSectionComposite, TABULATION );
         }
         
         // The ConfigDir parameter
-        toolkit.createLabel( composite, Messages.getString( "OpenLDAPOverviewPage.ConfigDir" ) ); //$NON-NLS-1$
-        configDirText = createConfigDirText( toolkit, composite );
+        toolkit.createLabel( globalSectionComposite, Messages.getString( "OpenLDAPOverviewPage.ConfigDir" ) ); //$NON-NLS-1$
+        configDirText = createConfigDirText( toolkit, globalSectionComposite );
         
         // The PidFile parameter
-        toolkit.createLabel( composite, Messages.getString( "OpenLDAPOverviewPage.PidFile" ) ); //$NON-NLS-1$
-        pidFileText = createPidFileText( toolkit, composite );
+        toolkit.createLabel( globalSectionComposite, Messages.getString( "OpenLDAPOverviewPage.PidFile" ) ); //$NON-NLS-1$
+        pidFileText = createPidFileText( toolkit, globalSectionComposite );
         pidFileText.setText( getConfiguration().getGlobal().getOlcPidFile() );
         
         // The LogFile parameter
-        toolkit.createLabel( composite, Messages.getString( "OpenLDAPOverviewPage.LogFile" ) ); //$NON-NLS-1$
-        logFileText = createLogFileText( toolkit, composite );
+        toolkit.createLabel( globalSectionComposite, Messages.getString( "OpenLDAPOverviewPage.LogFile" ) ); //$NON-NLS-1$
+        logFileText = createLogFileText( toolkit, globalSectionComposite );
         
         // The LogLevel parameter
-        toolkit.createLabel( composite, Messages.getString( "OpenLDAPOverviewPage.LogLevel" ) );
+        toolkit.createLabel( globalSectionComposite, Messages.getString( "OpenLDAPOverviewPage.LogLevel" ) );
         logLevelWidget = new LogLevelWidget();
-        logLevelWidget.create( composite, toolkit );
+        logLevelWidget.create( globalSectionComposite, toolkit );
         logLevelWidget.getControl().setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
     }
     
@@ -549,49 +565,6 @@ public class OverviewPage extends OpenLD
 
     
     /**
-     * Creates a Text that can be used to enter a serverID. If the serverID is incorrect, 
-     * it will be in red while typing until it gets correct.
-     *
-     * @param toolkit the toolkit
-     * @param parent the parent
-     * @return a Text that can be used to enter a ServerID
-     */
-    private Text createServerIdText( FormToolkit toolkit, Composite parent )
-    {
-        final Text serverIdText = toolkit.createText( parent, "" ); //$NON-NLS-1$
-        GridData gd = new GridData( SWT.NONE, SWT.NONE, false, false );
-        gd.widthHint = 200;
-        serverIdText.setLayoutData( gd );
-        
-        serverIdText.addModifyListener( new ModifyListener()
-        {
-            Display display = serverIdText.getDisplay();
-
-            // Check that the ServerID is valid
-            public void modifyText( ModifyEvent e )
-            {
-                Text serverIdText = (Text)e.widget;
-                String serverId = serverIdText.getText();
-                
-                try
-                {
-                    Integer.parseInt( serverId );
-                }
-                catch ( NumberFormatException nfe )
-                {
-                    serverIdText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
-                }
-            }
-        } );
-        
-        // No more than 3 digits
-        serverIdText.setTextLimit( 3 );
-
-        return serverIdText;
-    }
-
-
-    /**
      * Creates a Text that can be used to enter an ConfigDir.
      *
      * @param toolkit the toolkit
@@ -655,85 +628,6 @@ public class OverviewPage extends OpenLD
 
 
     /**
-     * Creates a Text that can be used to enter the Log level.
-     *
-     * @param toolkit the toolkit
-     * @param parent the parent
-     * @return a Text that can be used to enter the Log level
-     */
-    private Text createLogLevelText( FormToolkit toolkit, Composite parent )
-    {
-        final Text logLevelText = toolkit.createText( parent, "" ); //$NON-NLS-1$
-        GridData gd = new GridData( SWT.NONE, SWT.NONE, false, false );
-        gd.widthHint = 200;
-        logLevelText.setLayoutData( gd );
-        
-        // No more than 512 digits
-        logLevelText.setTextLimit( 512 );
-
-        logLevelText.addModifyListener( new ModifyListener()
-        {
-            Display display = logLevelText.getDisplay();
-
-            // Check that the LogLevel is valid
-            public void modifyText( ModifyEvent e )
-            {
-                Text logLevelText = (Text)e.widget;
-                String logLevel = logLevelText.getText();
-                
-                try
-                {
-                    Integer.parseInt( logLevel );
-                    logLevelText.setForeground( display.getSystemColor( SWT.COLOR_BLACK ) );
-                }
-                catch ( NumberFormatException nfe )
-                {
-                    logLevelText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
-                }
-            }
-        } );
-        
-        // No more than 6 digits
-        logLevelText.setTextLimit( 6 );
-
-        return logLevelText;
-    }
-
-    
-    /**
-     * Get the ServerID
-     */
-    private String getServerId()
-    {
-        List<String> serverIdList = getConfiguration().getGlobal().getOlcServerID();
-        
-        if ( serverIdList == null )
-        {
-            return "";
-        }
-        
-        boolean isFirst = true;
-        StringBuilder sb = new StringBuilder();
-        
-        for ( String serverId : serverIdList )
-        {
-            if ( isFirst )
-            {
-                isFirst = false;
-            }
-            else
-            {
-                sb.append( ", " );
-            }
-            
-            sb.append( serverId );
-        }
-        
-        return sb.toString();
-    }
-
-    
-    /**
      * Get the various LogLevel values, and concatenate them in a String
      */
     private String getLogLevel()
@@ -776,7 +670,15 @@ public class OverviewPage extends OpenLD
             removeListeners();
 
             // Update the ServerIDText
-            serverIdText.setText( getServerId() );
+            // Update the DatabaseTableViewer
+            serverIdWrappers.clear();
+
+            for ( String serverIdWrapper : getConfiguration().getGlobal().getOlcServerID() )
+            {
+                serverIdWrappers.add( new ServerIdWrapper( serverIdWrapper ) );
+            }
+
+            serverIdWidget.setElements( serverIdWrappers );
             
             // Update the ConfigDirText
             configDirText.setText( getConfiguration().getGlobal().getOlcConfigDir() );
@@ -841,7 +743,7 @@ public class OverviewPage extends OpenLD
     private void removeListeners()
     {
         // The serverID Text 
-        removeDirtyListener( serverIdText );
+        //removeDirtyListener( serverIdText );
 
         // The configDir Text 
         removeDirtyListener( configDirText );
@@ -863,7 +765,7 @@ public class OverviewPage extends OpenLD
     private void addListeners()
     {
         // The serverID Text 
-        addDirtyListener( serverIdText );
+        //addDirtyListener( serverIdText );
 
         // The configDir Text 
         addDirtyListener( configDirText );

Added: directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/widgets/ServerIdTableWidget.java
URL: http://svn.apache.org/viewvc/directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/widgets/ServerIdTableWidget.java?rev=1679435&view=auto
==============================================================================
--- directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/widgets/ServerIdTableWidget.java (added)
+++ directory/studio/trunk/plugins/openldap.config.editor/src/main/java/org/apache/directory/studio/openldap/config/model/widgets/ServerIdTableWidget.java Thu May 14 19:15:46 2015
@@ -0,0 +1,413 @@
+/*
+ *  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.model.widgets;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
+import org.apache.directory.studio.ldapbrowser.common.widgets.BrowserWidget;
+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.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.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+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.ui.forms.widgets.FormToolkit;
+import org.apache.directory.studio.openldap.config.OpenLdapConfigurationPlugin;
+import org.apache.directory.studio.openldap.config.OpenLdapConfigurationPluginConstants;
+import org.apache.directory.studio.openldap.config.editor.dialogs.ServerIdDialog;
+import org.apache.directory.studio.openldap.config.editor.pages.ServerIdWrapper;
+
+
+/**
+ * The ServerIdTable Widget provides a table viewer to add/edit/remove ServerId from
+ * a list of ServerId.
+ * <pre>
+ * +--------------------------------------+
+ * | ServerId 1                           | (Add... )
+ * | ServerId 2                           | (Edit...)
+ * |                                      | (Delete )
+ * +--------------------------------------+
+ * </pre>
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ */
+public class ServerIdTableWidget extends BrowserWidget
+{
+    /** The ServerId list */
+    private List<ServerIdWrapper> serverIds = new ArrayList<ServerIdWrapper>();
+
+    // UI widgets
+    private Composite composite;
+    private Table table;
+    private TableViewer tableViewer;
+    private Button addButton;
+    private Button editButton;
+    private Button deleteButton;
+    
+    /**
+     *  A listener on the ServerIds table, that modifies the button when an ServerId is selected
+     */
+    private ISelectionChangedListener tableViewerSelectionChangedListener = new ISelectionChangedListener()
+    {
+        public void selectionChanged( SelectionChangedEvent event )
+        {
+            StructuredSelection selection = ( StructuredSelection ) tableViewer.getSelection();
+
+            editButton.setEnabled( !selection.isEmpty() );
+            deleteButton.setEnabled( !selection.isEmpty() );
+        }
+    };
+    
+    /**
+     * A listener on the ServerIds table, that reacts to a doubleClick : it's opening the ServerId editor
+     */
+    private IDoubleClickListener tableViewerDoubleClickListener = new IDoubleClickListener()
+    {
+        public void doubleClick( DoubleClickEvent event )
+        {
+            editServerId();
+        }
+    };
+    
+    
+    /**
+     *  A listener on the Add button, which opens the ServerId addition editor
+     */
+    private SelectionListener addButtonListener = new SelectionAdapter()
+    {
+        public void widgetSelected( SelectionEvent e )
+        {
+            addServerId();
+        }
+    };
+    
+    /**
+     *  A listener on the Edit button, that open the ServerId editor
+     */
+    private SelectionListener editButtonListener = new SelectionAdapter()
+    {
+        public void widgetSelected( SelectionEvent e )
+        {
+            editServerId();
+        }
+    };
+    
+    /**
+     *  A listener on the Delete button, which delete the selected ServerId
+     */
+    private SelectionListener deleteButtonListener = new SelectionAdapter()
+    {
+        public void widgetSelected( SelectionEvent e )
+        {
+            deleteServerId();
+        }
+    };
+
+
+    /**
+     * Creates a new instance of ServerIdTableWidget.
+     */
+    public ServerIdTableWidget()
+    {
+    }
+
+
+    /**
+     * Creates the widget.
+     * 
+     * @param parent the parent
+     */
+    public void createWidget( Composite parent )
+    {
+        createWidget( parent, null );
+    }
+
+
+    /**
+     * Creates the ServerId widget. It's a Table and three button :
+     * <pre>
+     * +--------------------------------------+
+     * | ServerId 1                           | (Add... )
+     * | ServerId 2                           | (Edit...)
+     * |                                      | (Delete )
+     * +--------------------------------------+
+     * </pre>
+     * 
+     * @param parent the parent
+     * @param toolkit the toolkit
+     */
+    public void createWidget( Composite parent, FormToolkit toolkit )
+    {
+        // Compositea
+        if ( toolkit != null )
+        {
+            composite = toolkit.createComposite( parent );
+        }
+        else
+        {
+            composite = new Composite( parent, SWT.NONE );
+        }
+        
+        // First, define a grid of 2 columns
+        GridLayout compositeGridLayout = new GridLayout( 2, false );
+        compositeGridLayout.marginHeight = compositeGridLayout.marginWidth = 0;
+        composite.setLayout( compositeGridLayout );
+
+        // Create the Element Table and Table Viewer
+        if ( toolkit != null )
+        {
+            table = toolkit.createTable( composite, SWT.BORDER );
+        }
+        else
+        {
+            table = new Table( composite, SWT.BORDER );
+        }
+        
+        // Define the table size and height. It will span on 3 lines.
+        GridData gd = new GridData( SWT.FILL, SWT.FILL, true, true, 1, 3 );
+        gd.heightHint = 20;
+        gd.widthHint = 100;
+        table.setLayoutData( gd );
+        
+        // Create the Elements TableViewer
+        tableViewer = new TableViewer( table );
+        tableViewer.setContentProvider( new ArrayContentProvider() );
+        
+        // The LabelProvider
+        tableViewer.setLabelProvider( new LabelProvider()
+        {
+            public Image getImage( Object element )
+            {
+                return OpenLdapConfigurationPlugin.getDefault().getImage(
+                    OpenLdapConfigurationPluginConstants.IMG_LDAP_SERVER );
+            }
+        } );
+        
+        // Listeners : we want to catch changes and double clicks
+        tableViewer.addSelectionChangedListener( tableViewerSelectionChangedListener );
+        tableViewer.addDoubleClickListener( tableViewerDoubleClickListener );
+        
+        // Inject the existing indices
+        tableViewer.setInput( serverIds );
+
+        // Create the Add Button and its listener
+        if ( toolkit != null )
+        {
+            addButton = toolkit.createButton( composite, "Add...", SWT.PUSH );
+        }
+        else
+        {
+            addButton = BaseWidgetUtils.createButton( composite, "Add...", 1 );
+        }
+        
+        addButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, false, false ) );
+        addButton.addSelectionListener( addButtonListener );
+
+        // Create the Edit Button and its listener
+        if ( toolkit != null )
+        {
+            editButton = toolkit.createButton( composite, "Edit...", SWT.PUSH );
+        }
+        else
+        {
+            editButton = BaseWidgetUtils.createButton( composite, "Edit...", SWT.PUSH );
+        }
+        
+        // It's not enabled unless we have selected a serverId
+        editButton.setEnabled( false );
+        editButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, false, false ) );
+        editButton.addSelectionListener( editButtonListener );
+
+        // Create the Delete Button and its listener
+        if ( toolkit != null )
+        {
+            deleteButton = toolkit.createButton( composite, "Delete", SWT.PUSH );
+        }
+        else
+        {
+            deleteButton = BaseWidgetUtils.createButton( composite, "Delete", SWT.PUSH );
+        }
+        
+        // It's not selected unless we have selected a ServerId
+        deleteButton.setEnabled( false );
+        deleteButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, false, false ) );
+        deleteButton.addSelectionListener( deleteButtonListener );
+    }
+
+
+    /**
+     * Returns the primary control associated with this widget.
+     *
+     * @return the primary control associated with this widget.
+     */
+    public Control getControl()
+    {
+        return composite;
+    }
+
+
+    /**
+     * Sets the ServerIds.
+     *
+     * @param serverIds the ServerIds
+     */
+    public void setElements( List<ServerIdWrapper> serverIds )
+    {
+        if ( ( serverIds != null ) && ( serverIds.size() > 0 ) )
+        {
+            this.serverIds.addAll( serverIds );
+        }
+
+        tableViewer.refresh();
+    }
+
+
+    /**
+     * Gets the ServerIds.
+     *
+     * @return the ServerIds
+     */
+    public List<ServerIdWrapper> getServerIds()
+    {
+        return serverIds;
+    }
+    
+    
+    /**
+     * Insert the modified or added ServerID at the right place in the ServerID table
+     * @param newServerId
+     */
+    private void insertServerId( ServerIdWrapper newServerId )
+    {
+        // Search for the inclusion position
+        int pos = 0;
+
+        for ( ServerIdWrapper serverIdWrapper : serverIds )
+        {
+            if ( serverIdWrapper.getServerId() > newServerId.getServerId() )
+            {
+                serverIds.add( pos, newServerId );
+                break;
+            }
+            else
+            {
+                pos++;
+            }
+        }
+        
+        // Special case : the value has to be added at the end
+        if ( pos == serverIds.size() )
+        {
+            serverIds.add( newServerId );
+        }
+
+    }
+
+
+    /**
+     * This method is called when the 'Add...' button is clicked.
+     */
+    private void addServerId()
+    {
+        ServerIdDialog dialog = new ServerIdDialog( addButton.getShell(), serverIds, (ServerIdWrapper)null );
+        
+        if ( dialog.open() == ServerIdDialog.OK )
+        {
+            ServerIdWrapper newServerId = dialog.getNewServerId();
+            
+            // If the user clicked on OK but the value was invalid, we will receive a Null value
+            if ( newServerId != null )
+            {
+                String serverIdString = newServerId.toString();
+                
+                insertServerId( newServerId );
+                tableViewer.refresh();
+                tableViewer.setSelection( new StructuredSelection( serverIdString ) );
+                notifyListeners();
+            }
+        }
+    }
+
+
+    /**
+     * This method is called when the 'Edit...' button is clicked
+     * or the table viewer is double-clicked.
+     */
+    private void editServerId()
+    {
+        StructuredSelection selection = ( StructuredSelection ) tableViewer.getSelection();
+
+        if ( !selection.isEmpty() )
+        {
+            ServerIdWrapper selectedServerId = ( ServerIdWrapper ) selection.getFirstElement();
+
+            // Open the ServerID dialog, with the selected serverId
+            ServerIdDialog dialog = new ServerIdDialog( addButton.getShell(), serverIds, selectedServerId );
+            
+            if ( dialog.open() == ServerIdDialog.OK )
+            {
+                ServerIdWrapper newServerId = dialog.getNewServerId();
+                
+                // We will remove the modifies serverId, and replace it with the new serverId, at the right position
+                serverIds.remove( selectedServerId );
+                
+                insertServerId( newServerId );
+                tableViewer.refresh();
+                tableViewer.setSelection( new StructuredSelection( newServerId.toString() ) );
+                notifyListeners();
+            }
+        }
+    }
+
+
+    /**
+     * This method is called when the 'Delete' button is clicked. It removes the selected
+     * ServerId from the list.
+     */
+    private void deleteServerId()
+    {
+        StructuredSelection selection = ( StructuredSelection ) tableViewer.getSelection();
+
+        if ( !selection.isEmpty() )
+        {
+            ServerIdWrapper selectedIndex = ( ServerIdWrapper ) selection.getFirstElement();
+
+            serverIds.remove( selectedIndex );
+            tableViewer.refresh();
+            notifyListeners();
+        }
+    }
+}