/*
* 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 org.apache.directory.studio.common.ui.AddEditDialog;
import org.apache.directory.studio.common.ui.CommonUIConstants;
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.Group;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.apache.directory.studio.openldap.config.editor.wrappers.LimitWrapper;
import org.apache.directory.studio.openldap.config.editor.wrappers.SizeLimitWrapper;
import org.apache.directory.studio.openldap.config.editor.wrappers.TimeLimitWrapper;
/**
* The LimitDialog is used to edit the size and time limit parameter<br/>
*
* The dialog overlay is like :
*
* <pre>
* +--------------------------------------------------------------------------+
* | Limit |
* | .----------------------------------------------------------------------. |
* | | (o) Size Limit : [ ] (Edit...) | |
* | | (o) TimeLimit : [ ] (Edit...) | |
* | '----------------------------------------------------------------------' |
* | |
* | (Cancel) (OK) |
* +--------------------------------------------------------------------------+
* </pre>
*
* A second option for the Dialog would be like :
*
* +--------------------------------------------------------------------------+
* | Limit |
* | .----------------------------------------------------------------------. |
* | | (o) Size Limit (o) TimeLimit | |
* | '----------------------------------------------------------------------' |
* ............................................................................
*
* SizeLimit :
* ............................................................................
* | .----------------------------------------------------------------------. |
* | | Soft Limit : [----------] [] Unlimited | |
* | | | |
* | | Hard Limit : [----------] [] Unlimited [] Soft | |
* | | | |
* | | Global Limit : [----------] [] Unlimited | |
* | | | |
* | | Unchecked Limit : [----------] [] Unlimited [] Disabled | |
* | | | |
* | | Paged Results Limit : [----------] [] Unlimited [] No Estimate | |
* | | | |
* | | Paged Results Total : [----------] [] Unlimited [] Disabled [] Hard | |
* | '----------------------------------------------------------------------' |
* ............................................................................
* TimeLimit :
* ............................................................................
* | .----------------------------------------------------------------------. |
* | | Soft Limit : [----------] [] Unlimited | |
* | | | |
* | | Hard Limit : [----------] [] Unlimited [] Soft | |
* | | | |
* | | Global : [----------] [] Unlimited | |
* | '----------------------------------------------------------------------' |
* ............................................................................
* End :
* ............................................................................
* | Resulting Limit |
* | .----------------------------------------------------------------------. |
* | | <//////////////////////////////////////////////////////////////////> | |
* | '----------------------------------------------------------------------' |
* | |
* | (Cancel) (OK) |
* +--------------------------------------------------------------------------+
* </pre>
*
* But this would mean a duplication of code.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class SizeTimeLimitDialog extends AddEditDialog<LimitWrapper>
{
/** The TimeLimit radio button */
private Button timeLimitButton;
/** The Text that contains the TimeLimit (either as typed or as built from the TimeLimitDialog) */
private Text timeLimitText;
/** A Button used to edit the TimeLimit value */
private Button timeLimitEditButton;
/** The SizeLimit radio button */
private Button sizeLimitButton;
/** The Text that contains the SizeLimit (either as typed or as built from the SizeLimitDialog) */
private Text sizeLimitText;
/** A Button used to edit the SizeLimit value */
private Button sizeLimitEditButton;
/**
* Listeners for the Selector radioButtons. It will enable or disable the dnSpec or Group accordingly
* to the selection.
**/
private SelectionListener sizeTimeButtonsSelectionListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent event )
{
if ( event.getSource() instanceof Button )
{
Button button = (Button)event.getSource();
if ( button == sizeLimitButton )
{
if ( button.getSelection() )
{
setEditedElement( new SizeLimitWrapper( "" ) );
// Enable the SizeLimit elements, disable the TimeLimit ones
sizeLimitEditButton.setEnabled( true );
sizeLimitText.setEnabled( true );
timeLimitEditButton.setEnabled( false );
timeLimitText.setEnabled( false );
timeLimitText.clearSelection();
}
}
else
{
setEditedElement( new TimeLimitWrapper( "" ) );
// Enable the TimeLimit elements, disable the SizeLimit ones
timeLimitEditButton.setEnabled( true );
timeLimitText.setEnabled( true );
sizeLimitEditButton.setEnabled( false );
sizeLimitText.setEnabled( false );
sizeLimitText.clearSelection();
}
}
}
};
/**
* The listener for the sizeLimit Text
*/
private SelectionListener sizeLimitEditSelectionListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
SizeLimitDialog dialog = new SizeLimitDialog( sizeLimitText.getShell(), sizeLimitText.getText() );
if ( dialog.open() == OverlayDialog.OK )
{
String newSizeLimitStr = dialog.getNewLimit();
if ( newSizeLimitStr != null )
{
sizeLimitText.setText( newSizeLimitStr );
}
}
}
};
/**
* The listener for the timeLimit Text
*/
private SelectionListener timeLimitEditSelectionListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
TimeLimitDialog dialog = new TimeLimitDialog( timeLimitText.getShell(), timeLimitText.getText() );
if ( dialog.open() == OverlayDialog.OK )
{
String newTimeLimitStr = dialog.getNewLimit();
if ( newTimeLimitStr != null )
{
timeLimitText.setText( newTimeLimitStr );
}
}
}
};
protected ModifyListener sizeLimitTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
Button okButton = getButton( IDialogConstants.OK_ID );
// This button might be null when the dialog is called.
if ( okButton == null )
{
return;
}
// The String must be a valid SizeLimit
String sizeLimitStr = sizeLimitText.getText();
SizeLimitWrapper sizeLimitWrapper = new SizeLimitWrapper( sizeLimitStr );
if ( sizeLimitWrapper.isValid() )
{
sizeLimitText.setForeground( CommonUIConstants.BLACK_COLOR );
setEditedElement( sizeLimitWrapper );
okButton.setEnabled( true );
}
else
{
sizeLimitText.setForeground( CommonUIConstants.RED_COLOR );
okButton.setEnabled( false );
}
}
};
protected ModifyListener timeLimitTextListener = new ModifyListener()
{
public void modifyText( ModifyEvent e )
{
Button okButton = getButton( IDialogConstants.OK_ID );
// This button might be null when the dialog is called.
if ( okButton == null )
{
return;
}
// The String must be a valid TimeLimit
String timeLimitStr = timeLimitText.getText();
TimeLimitWrapper timeLimitWrapper = new TimeLimitWrapper( timeLimitStr );
if ( timeLimitWrapper.isValid() )
{
timeLimitText.setForeground( CommonUIConstants.BLACK_COLOR );
setEditedElement( timeLimitWrapper );
okButton.setEnabled( true );
}
else
{
timeLimitText.setForeground( CommonUIConstants.RED_COLOR );
okButton.setEnabled( false );
}
}
};
/**
* Create a new instance of the SizeTimeLimitsDialog
*
* @param parentShell The parent Shell
*/
public SizeTimeLimitDialog( Shell parentShell )
{
super( parentShell );
super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
}
/**
* Create a new instance of the SizeTimeLimitDialog
*
* @param parentShell The parent Shell
* @param timeLimitStr The instance containing the Limits data
*/
public SizeTimeLimitDialog( Shell parentShell, String limitStr )
{
super( parentShell );
super.setShellStyle( super.getShellStyle() | SWT.RESIZE );
}
/**
* @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
*/
protected void configureShell( Shell shell )
{
super.configureShell( shell );
shell.setText( "Size/Time Limit" );
}
/**
* Create the Dialog for TimeLimit :
* <pre>
* Limit
* .----------------------------------------------------------------------.
* | (o) Size Limit : [ ] (Edit...) |
* | (o) TimeLimit : [ ] (Edit...) |
* '----------------------------------------------------------------------'
* </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 );
// Create the selection group
Group selectionGroup = BaseWidgetUtils.createGroup( parent, "Limit selection", 1 );
GridLayout selectionGridLayout = new GridLayout( 3, false );
selectionGroup.setLayout( selectionGridLayout );
selectionGroup.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) );
// SizeLimit button
sizeLimitButton = BaseWidgetUtils.createRadiobutton( selectionGroup, "SizeLimit", 1 );
sizeLimitButton.addSelectionListener( sizeTimeButtonsSelectionListener );
// SizeLimit Text
sizeLimitText = BaseWidgetUtils.createText( selectionGroup, "", 1 );
sizeLimitText.addModifyListener( sizeLimitTextListener );
// SizeLimit Edit button
sizeLimitEditButton = BaseWidgetUtils.createButton( selectionGroup, "Edit...", 1 );
sizeLimitEditButton.addSelectionListener( sizeLimitEditSelectionListener );
// TimeLimit button
timeLimitButton = BaseWidgetUtils.createRadiobutton( selectionGroup, "TimeLimit", 1 );
timeLimitButton.addSelectionListener( sizeTimeButtonsSelectionListener );
// TimeLimit Text
timeLimitText = BaseWidgetUtils.createText( selectionGroup, "", 1 );
timeLimitText.addModifyListener( timeLimitTextListener );
// TimeLimit Edit button
timeLimitEditButton = BaseWidgetUtils.createButton( selectionGroup, "Edit...", 1 );
timeLimitEditButton.addSelectionListener( timeLimitEditSelectionListener );
// create the SizeLimit
initDialog();
addListeners();
applyDialogFont( composite );
return composite;
}
/**
* Adds listeners.
*/
private void addListeners()
{
/*
softLimitText.addModifyListener( softLimitTextListener );
softUnlimitedCheckbox.addSelectionListener( softUnlimitedCheckboxSelectionListener );
hardLimitText.addModifyListener( hardLimitTextListener );
hardUnlimitedCheckbox.addSelectionListener( hardUnlimitedCheckboxSelectionListener );
hardSoftCheckbox.addSelectionListener( hardSoftCheckboxSelectionListener );
globalLimitText.addModifyListener( globalLimitTextListener );
globalUnlimitedCheckbox.addSelectionListener( globalUnlimitedCheckboxSelectionListener );
*/
}
@Override
public void addNewElement()
{
setEditedElement( null );
}
/**
* Initializes the UI from the Limit
*/
protected void initDialog()
{
LimitWrapper editedElement = (LimitWrapper)getEditedElement();
if ( editedElement != null )
{
if ( editedElement instanceof SizeLimitWrapper )
{
sizeLimitButton.setSelection( true );
// Enable the SizeLimit elements, disable the TimeLimit ones
sizeLimitEditButton.setEnabled( true );
sizeLimitText.setEnabled( true );
sizeLimitText.setText( editedElement.toString() );
timeLimitEditButton.setEnabled( false );
timeLimitText.setEnabled( false );
}
else
{
timeLimitButton.setSelection( true );
// Enable the TimeLimit elements, disable the SizeLimit ones
timeLimitEditButton.setEnabled( true );
timeLimitText.setEnabled( true );
timeLimitText.setText( editedElement.toString() );
sizeLimitEditButton.setEnabled( false );
sizeLimitText.setEnabled( false );
}
}
else
{
// Nothing selected, disable the Text and Button
timeLimitEditButton.setEnabled( false );
timeLimitText.setEnabled( false );
timeLimitText.clearSelection();
sizeLimitEditButton.setEnabled( false );
sizeLimitText.setEnabled( false );
sizeLimitText.clearSelection();
}
}
}