/*
* 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.common.ui.widgets;
import org.apache.directory.studio.common.ui.widgets.AbstractWidget;
import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
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.Text;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.apache.directory.studio.openldap.common.ui.dialogs.PasswordDialog;
/**
* The PasswordWidget provides a label to display the password, an edit button
* and a 'Show Password' button to show/hide the password.
*/
public class PasswordWidget extends AbstractWidget
{
/** The password */
private byte[] password;
/** The flag to show the "None" checkbox or not */
private boolean showNoneCheckbox;
/** The flag indicating if the password should be shown or not */
private boolean showPassword;
// UI widgets
private Composite composite;
private Button noneCheckbox;
private Text passwordText;
private Button editButton;
private Button showPasswordCheckbox;
/**
* Creates a new instance of PasswordWidget.
*/
public PasswordWidget()
{
}
/**
* Creates a new instance of PasswordWidget.
*
* @param showNoneButton the flag to show the "None" checkbox
*/
public PasswordWidget( boolean showNoneCheckbox )
{
this.showNoneCheckbox = showNoneCheckbox;
}
/**
* Creates the widget.
*
* @param parent the parent
*/
public void createWidget( Composite parent )
{
createWidget( parent, null );
}
/**
* Creates the widget.
*
* @param parent the parent
* @param toolkit the toolkit
*/
public void createWidget( Composite parent, FormToolkit toolkit )
{
// Composite
if ( toolkit != null )
{
composite = toolkit.createComposite( parent );
}
else
{
composite = new Composite( parent, SWT.NONE );
}
GridLayout compositeGridLayout = new GridLayout( getNumberOfColumnsForComposite(), false );
compositeGridLayout.marginHeight = compositeGridLayout.marginWidth = 0;
compositeGridLayout.verticalSpacing = 0;
composite.setLayout( compositeGridLayout );
// None Checbox
if ( showNoneCheckbox )
{
if ( toolkit != null )
{
noneCheckbox = toolkit.createButton( composite, "None", SWT.CHECK );
}
else
{
noneCheckbox = BaseWidgetUtils.createCheckbox( composite, "None", 1 );
}
noneCheckbox.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
noneCheckboxSelected( noneCheckbox.getSelection() );
notifyListeners();
}
} );
}
// Password Text
if ( toolkit != null )
{
passwordText = toolkit.createText( composite, "", SWT.NONE );
}
else
{
passwordText = BaseWidgetUtils.createReadonlyText( composite, "", 1 );
}
passwordText.setEditable( false );
GridData gd = new GridData( SWT.FILL, SWT.CENTER, true, false );
gd.widthHint = 50;
passwordText.setLayoutData( gd );
// Setting the echo char for the password text
if ( showPassword )
{
passwordText.setEchoChar( '\0' );
}
else
{
passwordText.setEchoChar( '\u2022' );
}
// Edit Button
if ( toolkit != null )
{
editButton = toolkit.createButton( composite, "Edit Password...", SWT.PUSH );
}
else
{
editButton = BaseWidgetUtils.createButton( composite, "Edit Password...", 1 );
editButton.setLayoutData( new GridData() );
}
editButton.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent event )
{
editButtonAction();
}
} );
// Show Password Checkbox
if ( toolkit != null )
{
if ( showNoneCheckbox )
{
toolkit.createLabel( composite, "" );
}
showPasswordCheckbox = toolkit.createButton( composite, "Show Password", SWT.CHECK );
}
else
{
if ( showNoneCheckbox )
{
BaseWidgetUtils.createLabel( composite, "", 1 );
}
showPasswordCheckbox = BaseWidgetUtils.createCheckbox( composite, "Show Password",
getNumberOfColumnsForComposite() );
}
GridData showPasswordCheckboxGridData = new GridData();
showPasswordCheckboxGridData.horizontalSpan = getNumberOfColumnsForComposite() - 1;
showPasswordCheckbox.setLayoutData( showPasswordCheckboxGridData );
showPasswordCheckbox.addSelectionListener( new SelectionAdapter()
{
public void widgetSelected( SelectionEvent event )
{
showPasswordAction();
}
} );
noneCheckboxSelected( showNoneCheckbox );
}
/**
* Gets the number of columns for the composite.
*
* @return the number of columns for the composite
*/
private int getNumberOfColumnsForComposite()
{
if ( showNoneCheckbox )
{
return 3;
}
else
{
return 2;
}
}
/**
* This method is called when the "None" checkbox is clicked.
*/
private void noneCheckboxSelected( boolean state )
{
editButton.setEnabled( !state );
showPasswordCheckbox.setEnabled( !state );
}
/**
* This action is called when the 'Edit...' button is clicked.
*/
private void editButtonAction()
{
// Creating and displaying a password dialog
PasswordDialog passwordDialog = new PasswordDialog( editButton.getShell(), password );
if ( passwordDialog.open() == Dialog.OK )
{
if ( passwordDialog.getNewPassword() != password )
{
byte[] password = passwordDialog.getNewPassword();
if ( ( password != null ) && ( password.length > 0 ) )
{
this.password = password;
passwordText.setText( new String( password ) );
notifyListeners();
}
}
}
}
/**
* This action is called when the 'Show Password' checkbox is clicked.
*/
private void showPasswordAction()
{
if ( showPasswordCheckbox.getSelection() )
{
passwordText.setEchoChar( '\0' );
}
else
{
passwordText.setEchoChar( '\u2022' );
}
}
/**
* Sets the password.
*
* @param password the password
*/
public void setPassword( byte[] password )
{
this.password = password;
if ( showNoneCheckbox )
{
boolean noneSelected = ( password == null );
noneCheckbox.setSelection( noneSelected );
noneCheckboxSelected( noneSelected );
}
// Updating the password text field
if ( ( password != null ) && ( password.length > 0 ) )
{
passwordText.setText( new String( password ) );
}
else
{
passwordText.setText( "" ); //$NON-NLS-1$
}
}
/**
* Gets the password.
*
* @return the password
*/
public byte[] getPassword()
{
if ( showNoneCheckbox && noneCheckbox.getSelection() )
{
return null;
}
if ( ( password != null ) && ( password.length > 0 ) )
{
return password;
}
return null;
}
/**
* Gets the password as string.
*
* @return the password as string
*/
public String getPasswordAsString()
{
if ( showNoneCheckbox && noneCheckbox.getSelection() )
{
return null;
}
if ( ( password != null ) && ( password.length > 0 ) )
{
return new String( password );
}
return null;
}
/**
* Returns the primary control associated with this widget.
*
* @return the primary control associated with this widget.
*/
public Control getControl()
{
return composite;
}
/**
* Sets the enabled state of the widget.
*
* @param enabled true to enable the widget, false to disable the widget
*/
public void setEnabled( boolean enabled )
{
if ( ( editButton != null ) && ( !editButton.isDisposed() ) )
{
if ( showNoneCheckbox )
{
noneCheckbox.setEnabled( enabled );
noneCheckboxSelected( noneCheckbox.getSelection() && enabled );
}
else
{
editButton.setEnabled( enabled );
showPasswordCheckbox.setEnabled( enabled );
}
}
}
}