/*
* 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.templateeditor.editor.widgets;
import org.apache.directory.studio.entryeditors.IEntryEditor;
import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
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.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateCheckbox;
/**
* This class implements an editor checkbox.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class EditorCheckbox extends EditorWidget<TemplateCheckbox>
{
/** The checkbox */
private Button checkbox;
/** The enum used to determine the state of a checkbox*/
private enum CheckboxState
{
UNCHECKED, CHECKED, GRAYED
}
/** Constant for the 'false' string value */
private static final String FALSE_STRING_VALUE = "FALSE"; //$NON-NLS-1$
/** Constant for the 'true' string value */
private static final String TRUE_STRING_VALUE = "TRUE"; //$NON-NLS-1$
/** The current state of the checkbox */
private CheckboxState currentState = CheckboxState.UNCHECKED;
/** The selection listener */
private SelectionListener selectionListener = new SelectionAdapter()
{
public void widgetSelected( SelectionEvent e )
{
// Changing the state of the checkbox
changeCheckboxState();
// Getting the value
boolean value = checkbox.getSelection();
IAttribute attribute = getAttribute();
String checkedValue = getWidget().getCheckedValue();
String uncheckedValue = getWidget().getUncheckedValue();
if ( attribute == null )
{
// The attribute does not exist
if ( ( checkedValue == null ) && ( uncheckedValue == null ) )
{
// Creating a new attribute with the value
addNewAttribute( ( value ? TRUE_STRING_VALUE : FALSE_STRING_VALUE ) );
}
else if ( ( checkedValue != null ) && ( uncheckedValue == null ) && value )
{
// Creating a new attribute with the value
addNewAttribute( checkedValue );
}
else if ( ( checkedValue == null ) && ( uncheckedValue != null ) && !value )
{
// Creating a new attribute with the value
addNewAttribute( uncheckedValue );
}
else if ( ( checkedValue != null ) && ( uncheckedValue != null ) )
{
// Creating a new attribute with the value
addNewAttribute( ( value ? checkedValue : uncheckedValue ) );
}
}
else
{
// The attribute exists
if ( ( checkedValue == null ) && ( uncheckedValue == null ) )
{
// Modifying the attribute
modifyAttributeValue( ( value ? TRUE_STRING_VALUE : FALSE_STRING_VALUE ) );
}
else if ( ( checkedValue != null ) && ( uncheckedValue == null ) )
{
if ( value )
{
// Modifying the attribute
modifyAttributeValue( checkedValue );
}
else
{
// Deleting the attribute
deleteAttribute();
}
}
else if ( ( checkedValue == null ) && ( uncheckedValue != null ) )
{
if ( value )
{
// Deleting the attribute
}
else
{
// Modifying the attribute
modifyAttributeValue( uncheckedValue );
}
}
else if ( ( checkedValue != null ) && ( uncheckedValue != null ) )
{
// Modifying the attribute
modifyAttributeValue( ( value ? checkedValue : uncheckedValue ) );
}
}
}
};
/**
* Creates a new instance of EditorCheckbox.
*
* @param editor
* the associated editor
* @param templateCheckbox
* the associated template checkbox
* @param toolkit
* the associated toolkit
*/
public EditorCheckbox( IEntryEditor editor, TemplateCheckbox templateCheckbox, FormToolkit toolkit )
{
super( templateCheckbox, editor, toolkit );
}
/**
* {@inheritDoc}
*/
public Composite createWidget( Composite parent )
{
// Creating and initializing the widget UI
Composite composite = initWidget( parent );
// Updating the widget's content
updateWidget();
// Adding the listeners
addListeners();
return composite;
}
/**
* Creates and initializes the widget UI.
*
* @param parent
* the parent composite
* @return
* the associated composite
*/
private Composite initWidget( Composite parent )
{
// Creating the checkbox
checkbox = getToolkit().createButton( parent, getWidget().getLabel(), SWT.CHECK );
checkbox.setLayoutData( getGridata() );
checkbox.setEnabled( getWidget().isEnabled() );
return parent;
}
/**
* Updates the widget's content.
*/
private void updateWidget()
{
IAttribute attribute = getAttribute();
if ( ( attribute != null ) && ( attribute.isString() ) && ( attribute.getValueSize() > 0 ) )
{
setCheckboxState( attribute.getStringValue() );
}
}
/**
* Sets the state of the checkbox.
*
* @param value
* the value
*/
private void setCheckboxState( String value )
{
String checkedValue = getWidget().getCheckedValue();
String uncheckedValue = getWidget().getUncheckedValue();
if ( ( checkedValue == null ) && ( uncheckedValue == null ) )
{
if ( TRUE_STRING_VALUE.equalsIgnoreCase( value ) )
{
setCheckboxCheckedState();
}
else if ( FALSE_STRING_VALUE.equalsIgnoreCase( value ) )
{
setCheckboxUncheckedState();
}
else
{
setCheckboxGrayedState();
}
}
else if ( ( checkedValue != null ) && ( uncheckedValue == null ) )
{
if ( checkedValue.equals( value ) )
{
setCheckboxCheckedState();
}
else
{
setCheckboxUncheckedState();
}
}
else if ( ( checkedValue == null ) && ( uncheckedValue != null ) )
{
if ( uncheckedValue.equals( value ) )
{
setCheckboxUncheckedState();
}
else
{
setCheckboxCheckedState();
}
}
else if ( ( checkedValue != null ) && ( uncheckedValue != null ) )
{
if ( checkedValue.equals( value ) )
{
setCheckboxCheckedState();
}
else if ( uncheckedValue.equals( value ) )
{
setCheckboxUncheckedState();
}
else
{
setCheckboxGrayedState();
}
}
}
/**
* Sets the checkbox in checked state.
*/
private void setCheckboxCheckedState()
{
checkbox.setGrayed( false );
checkbox.setSelection( true );
currentState = CheckboxState.CHECKED;
}
/**
* Sets the checkbox in unchecked state.
*
*/
private void setCheckboxUncheckedState()
{
checkbox.setGrayed( false );
checkbox.setSelection( false );
currentState = CheckboxState.UNCHECKED;
}
/**
* Sets the checkbox in grayed state.
*/
private void setCheckboxGrayedState()
{
checkbox.setGrayed( true );
checkbox.setSelection( true );
currentState = CheckboxState.GRAYED;
}
/**
* Adds the listeners.
*/
private void addListeners()
{
if ( ( checkbox != null ) && ( !checkbox.isDisposed() ) )
{
checkbox.addSelectionListener( selectionListener );
}
}
/**
* Changes the state of the checkbox.
*/
private void changeCheckboxState()
{
switch ( currentState )
{
case UNCHECKED:
setCheckboxCheckedState();
currentState = CheckboxState.CHECKED;
break;
case CHECKED:
setCheckboxUncheckedState();
currentState = CheckboxState.UNCHECKED;
break;
case GRAYED:
setCheckboxCheckedState();
currentState = CheckboxState.CHECKED;
break;
}
}
/**
* {@inheritDoc}
*/
public void update()
{
updateWidget();
}
/**
* {@inheritDoc}
*/
public void dispose()
{
// Nothing to do
}
}