/*
* 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.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import org.apache.directory.studio.common.ui.AddEditDialog;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
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.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
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.wrappers.TcpBufferWrapper;
import org.apache.directory.studio.openldap.config.editor.wrappers.TcpBufferWrapper.TcpTypeEnum;
/**
* The TcpBufferDialog is used to edit a TcpBuffer, which can contain an URL and a type of TCP buffer,
* plus the size.<br/>
* The dialog overlay is like :
*
* <pre>
* +---------------------------------------+
* | TcpBuffer |
* | .-----------------------------------. |
* | | Size : [ ] () read () write | |
* | | URL : [ ] | |
* | '-----------------------------------' |
* | .-----------------------------------. |
* | | TcpBuffer : <///////////////////> | |
* | '-----------------------------------' |
* | |
* | (cancel) (OK) |
* +---------------------------------------+
*
* </pre>
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class TcpBufferDialog extends AddEditDialog<TcpBufferWrapper>
{
/** The list of existing TcpBuffer */
List<TcpBufferWrapper> tcpBufferList;
// UI widgets
/** The Size Text */
private Text sizeText;
/** The Read and Write checkboxes */
private Button readCheckbox;
private Button writeCheckbox;
/** The Listener text */
private Text listenerText;
/** The resulting TcpBuffer Text, or an error message */
private Text tcpBufferText;
/**
* Create a new instance of the TcpBufferDialog
*
* @param parentShell The parent Shell
*/
public TcpBufferDialog( Shell parentShell )
{
super( parentShell );
super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
}
/**
* The listener for the size Text
*/
private ModifyListener sizeTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
Display display = tcpBufferText.getDisplay();
Button okButton = getButton( IDialogConstants.OK_ID );
// This button might be null when the dialog is called.
if ( okButton == null )
{
return;
}
try
{
long sizeValue = Long.parseLong( sizeText.getText() );
// The size must be between 0 and 2^32-1
if ( ( sizeValue < 0L ) || ( sizeValue > TcpBufferWrapper.MAX_TCP_BUFFER_SIZE ) )
{
sizeText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
tcpBufferText.setText( getEditedElement().toString() );
tcpBufferText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
okButton.setEnabled( false );
return;
}
sizeText.setForeground( display.getSystemColor( SWT.COLOR_BLACK ) );
getEditedElement().setSize( sizeValue );
tcpBufferText.setText( getEditedElement().toString() );
if ( TcpBufferWrapper.isValid( sizeText.getText(), listenerText.getText() ) )
{
tcpBufferText.setForeground( display.getSystemColor( SWT.COLOR_BLACK ) );
okButton.setEnabled( true );
}
else
{
tcpBufferText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
okButton.setEnabled( false );
}
}
catch ( NumberFormatException nfe )
{
// Not even a number
sizeText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
tcpBufferText.setText( getEditedElement().toString() );
tcpBufferText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
okButton.setEnabled( false );
}
}
};
/**
* The listener for the URL Text
*/
private ModifyListener urlTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
Display display = tcpBufferText.getDisplay();
Button okButton = getButton( IDialogConstants.OK_ID );
// This button might be null when the dialog is called.
if ( okButton == null )
{
return;
}
try
{
URI newUri = new URI( listenerText.getText() );
getEditedElement().setListener( newUri );
listenerText.setForeground( display.getSystemColor( SWT.COLOR_BLACK ) );
tcpBufferText.setText( getEditedElement().toString() );
if ( TcpBufferWrapper.isValid( sizeText.getText(), listenerText.getText() ) )
{
tcpBufferText.setForeground( display.getSystemColor( SWT.COLOR_BLACK ) );
okButton.setEnabled( true );
}
else
{
tcpBufferText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
okButton.setEnabled( false );
}
}
catch ( URISyntaxException mue )
{
listenerText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
tcpBufferText.setText( getEditedElement().toString() );
tcpBufferText.setForeground( display.getSystemColor( SWT.COLOR_RED ) );
okButton.setEnabled( false );
}
}
};
/**
* The listener in charge of exposing the changes when the read or write buttons are checked
*/
private SelectionListener checkboxSelectionListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
Display display = tcpBufferText.getDisplay();
Button okButton = getButton( IDialogConstants.OK_ID );
if ( readCheckbox.getSelection() )
{
if ( writeCheckbox.getSelection())
{
getEditedElement().setTcpType( TcpTypeEnum.BOTH );
}
else
{
getEditedElement().setTcpType( TcpTypeEnum.READ );
}
}
else if ( writeCheckbox.getSelection() )
{
if ( readCheckbox.getSelection() )
{
getEditedElement().setTcpType( TcpTypeEnum.BOTH );
}
else
{
getEditedElement().setTcpType( TcpTypeEnum.WRITE );
}
}
else
{
getEditedElement().setTcpType( TcpTypeEnum.BOTH );
}
// Set the TcpBuffer into the text box
tcpBufferText.setText( getEditedElement().toString() );
if ( TcpBufferWrapper.isValid( sizeText.getText(), listenerText.getText() ) )
{
tcpBufferText.setForeground( display.getSystemColor( SWT.COLOR_BLACK ) );
okButton.setEnabled( true );
}
else
{
tcpBufferText.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( "TcpBuffer" );
}
/**
* Create the Dialog for TcpBuffer :
* <pre>
* +---------------------------------------+
* | TcpBuffer |
* | .-----------------------------------. |
* | | Size : [ ] () read () write | |
* | | URL : [ ] | |
* | '-----------------------------------' |
* | .-----------------------------------. |
* | | TcpBuffer : <///////////////////> | |
* | '-----------------------------------' |
* | |
* | (cancel) (OK) |
* +---------------------------------------+
* </pre>
* @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 );
createTcpBufferEditGroup( composite );
createTcpBufferShowGroup( composite );
initDialog();
addListeners();
applyDialogFont( composite );
return composite;
}
/**
* Creates the TcpBuffer input group. This is the part of the dialog
* where one can insert the TcpBuffer size and URL
*
* <pre>
* TcpBuffer Input
* .-----------------------------------.
* | Size : [ ] () read () write |
* | URL : [ ] |
* '-----------------------------------'
* </pre>
* @param parent the parent composite
*/
private void createTcpBufferEditGroup( Composite parent )
{
// TcpBuffer Group
Group tcpBufferGroup = BaseWidgetUtils.createGroup( parent, "TcpBuffer input", 1 );
GridLayout tcpBufferGroupGridLayout = new GridLayout( 6, false );
tcpBufferGroup.setLayout( tcpBufferGroupGridLayout );
tcpBufferGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// Size Text
BaseWidgetUtils.createLabel( tcpBufferGroup, "Size :", 1 );
sizeText = BaseWidgetUtils.createText( tcpBufferGroup, "", 1 );
sizeText.addModifyListener( sizeTextListener );
// Read checkbox Button
readCheckbox = BaseWidgetUtils.createCheckbox( tcpBufferGroup, "read", 2 );
// Write checkbox Button
writeCheckbox = BaseWidgetUtils.createCheckbox( tcpBufferGroup, "write", 2 );
// URL Text
BaseWidgetUtils.createLabel( tcpBufferGroup, "URL:", 1 );
listenerText = BaseWidgetUtils.createText( tcpBufferGroup, "", 5 );
listenerText.addModifyListener( urlTextListener );
}
/**
* Creates the TcpBuffer show group. This is the part of the dialog
* where the real TcpBuffer is shown, or an error message if the TcpBuffer
* is invalid.
*
* <pre>
* .-----------------------------------.
* | TcpBuffer : <///////////////////> |
* '-----------------------------------'
* </pre>
* @param parent the parent composite
*/
private void createTcpBufferShowGroup( Composite parent )
{
// TcpBuffer Group
Group tcpBufferGroup = BaseWidgetUtils.createGroup( parent, "", 1 );
GridLayout tcpBufferGroupGridLayout = new GridLayout( 2, false );
tcpBufferGroup.setLayout( tcpBufferGroupGridLayout );
tcpBufferGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// TcpBuffer Text
tcpBufferText = BaseWidgetUtils.createText( tcpBufferGroup, "", 1 );
tcpBufferText.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
tcpBufferText.setEditable( false );
}
/**
* Initializes the UI from the TcpBuffer
*/
protected void initDialog()
{
TcpBufferWrapper editedElement = (TcpBufferWrapper)getEditedElement();
if ( editedElement != null )
{
sizeText.setText( Long.toString( editedElement.getSize() ) );
URI listener = editedElement.getListener();
if ( listener == null )
{
listenerText.setText( "" );
}
else
{
listenerText.setText( listener.toString() );
}
tcpBufferText.setText( editedElement.toString() );
}
}
/**
* Add a new Element that will be edited
*/
public void addNewElement()
{
setEditedElement( new TcpBufferWrapper( "" ) );
}
/**
* Add a new Element that will be edited
*/
protected void addNewElement( TcpBufferWrapper editedElement )
{
TcpBufferWrapper newElement = (TcpBufferWrapper)editedElement.clone();
setEditedElement( newElement );
}
/**
* Adds listeners.
*/
private void addListeners()
{
readCheckbox.addSelectionListener( checkboxSelectionListener );
writeCheckbox.addSelectionListener( checkboxSelectionListener );
}
}