/* * 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.dialogs; import java.text.ParseException; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; import org.apache.directory.studio.openldap.common.ui.model.UnixPermissions; import org.eclipse.jface.dialogs.Dialog; 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.events.VerifyEvent; import org.eclipse.swt.events.VerifyListener; 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; /** * The UnixPermissionsDialog is used to edit a Unix Permissions value. Unix * permissions are stored using 3 sets of permissions for 3 different entities : * * <ul> * <li>users</li> * <li>group</li> * <li>other</li> * </ul> * * with the following permissions : * * <ul> * <li>read</li> * <li>write</li> * <li>execute</li> * </ul> * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class UnixPermissionsDialog extends Dialog { /** The octal value */ private String value; // UI widgets private Button ownerReadCheckbox; private Button ownerWriteCheckbox; private Button ownerExecuteCheckbox; private Button groupReadCheckbox; private Button groupWriteCheckbox; private Button groupExecuteCheckbox; private Button othersReadCheckbox; private Button othersWriteCheckbox; private Button othersExecuteCheckbox; private Text octalNotationText; // The octal verifier only accepts values between 0 and 7. private VerifyListener octalNotationTextVerifyListener = new VerifyListener() { public void verifyText( VerifyEvent e ) { if ( !e.text.matches( "[0-7]*" ) ) //$NON-NLS-1$ { e.doit = false; } } }; private ModifyListener octalNotationTextModifyListener = new ModifyListener() { public void modifyText( ModifyEvent e ) { resetChecboxSelection(); try { UnixPermissions perm = new UnixPermissions( octalNotationText.getText() ); removeListeners(); setCheckboxesValue( perm ); addListeners(); } catch ( ParseException e1 ) { // Nothing to do } } }; private SelectionListener checkboxSelectionListener = new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { UnixPermissions perm = new UnixPermissions(); perm.setOwnerRead( ownerReadCheckbox.getSelection() ); perm.setOwnerWrite( ownerWriteCheckbox.getSelection() ); perm.setOwnerExecute( ownerExecuteCheckbox.getSelection() ); perm.setGroupRead( groupReadCheckbox.getSelection() ); perm.setGroupWrite( groupWriteCheckbox.getSelection() ); perm.setGroupExecute( groupExecuteCheckbox.getSelection() ); perm.setOthersRead( othersReadCheckbox.getSelection() ); perm.setOthersWrite( othersWriteCheckbox.getSelection() ); perm.setOthersExecute( othersExecuteCheckbox.getSelection() ); removeListeners(); setOctalValue( perm ); addListeners(); } }; /** * Creates a new instance of UnixPermissionsDialog. * * @param parentShell the parent shell */ public UnixPermissionsDialog( Shell parentShell ) { super( parentShell ); super.setShellStyle( super.getShellStyle() | SWT.RESIZE ); } /** * Creates a new instance of UnixPermissionsDialog. * * @param parentShell the parent shell * @param value the initial value */ public UnixPermissionsDialog( Shell parentShell, String value ) { super( parentShell ); super.setShellStyle( super.getShellStyle() | SWT.RESIZE ); this.value = value; } /** * {@inheritDoc} */ protected void configureShell( Shell shell ) { super.configureShell( shell ); shell.setText( "Unix Permissions Dialog" ); } /** * {@inheritDoc} */ protected void okPressed() { try { UnixPermissions perm = new UnixPermissions( octalNotationText.getText() ); value = perm.getOctalValue(); } catch ( ParseException e ) { value = "0000"; } super.okPressed(); } /** * {@inheritDoc} */ protected Control createDialogArea( Composite parent ) { Composite composite = ( Composite ) super.createDialogArea( parent ); GridData gd = new GridData( GridData.FILL_BOTH ); composite.setLayoutData( gd ); createPermissionsArea( composite ); createOctalNotationArea( composite ); initialize(); addListeners(); applyDialogFont( composite ); return composite; } /** * Initializes the dialog with the initial value */ private void initialize() { if ( value != null ) { try { UnixPermissions perm = new UnixPermissions( value ); setCheckboxesValue( perm ); setOctalValue( perm ); } catch ( ParseException e ) { resetChecboxSelection(); setOctalValue( new UnixPermissions() ); } } else { resetChecboxSelection(); setOctalValue( new UnixPermissions() ); } } /** * Sets the checkboxes value. * * @param perm the Unix permissions */ private void setCheckboxesValue( UnixPermissions perm ) { ownerReadCheckbox.setSelection( perm.isOwnerRead() ); ownerWriteCheckbox.setSelection( perm.isOwnerWrite() ); ownerExecuteCheckbox.setSelection( perm.isOwnerExecute() ); groupReadCheckbox.setSelection( perm.isGroupRead() ); groupWriteCheckbox.setSelection( perm.isGroupWrite() ); groupExecuteCheckbox.setSelection( perm.isGroupExecute() ); othersReadCheckbox.setSelection( perm.isOthersRead() ); othersWriteCheckbox.setSelection( perm.isOthersWrite() ); othersExecuteCheckbox.setSelection( perm.isOthersExecute() ); } /** * Sets the octal value. * * @param perm the Unix permissions */ private void setOctalValue( UnixPermissions perm ) { octalNotationText.setText( perm.getOctalValue() ); } /** * Resets the checkbox selection */ private void resetChecboxSelection() { ownerReadCheckbox.setSelection( false ); ownerWriteCheckbox.setSelection( false ); ownerExecuteCheckbox.setSelection( false ); groupReadCheckbox.setSelection( false ); groupWriteCheckbox.setSelection( false ); groupExecuteCheckbox.setSelection( false ); othersReadCheckbox.setSelection( false ); othersWriteCheckbox.setSelection( false ); othersExecuteCheckbox.setSelection( false ); } /** * Creates the permissions area. * * @param parent the parent composite */ private void createPermissionsArea( Composite parent ) { Group symbolicNotationGroup = BaseWidgetUtils.createGroup( parent, "Permissions", 1 ); symbolicNotationGroup.setLayout( new GridLayout( 2, false ) ); BaseWidgetUtils.createLabel( symbolicNotationGroup, "Owner:", 1 ); Composite ownerComposite = BaseWidgetUtils.createColumnContainer( symbolicNotationGroup, 3, true, 1 ); ownerReadCheckbox = BaseWidgetUtils.createCheckbox( ownerComposite, "Read", 1 ); ownerWriteCheckbox = BaseWidgetUtils.createCheckbox( ownerComposite, "Write", 1 ); ownerExecuteCheckbox = BaseWidgetUtils.createCheckbox( ownerComposite, "Execute", 1 ); BaseWidgetUtils.createLabel( symbolicNotationGroup, "Group:", 1 ); Composite groupComposite = BaseWidgetUtils.createColumnContainer( symbolicNotationGroup, 3, true, 1 ); groupReadCheckbox = BaseWidgetUtils.createCheckbox( groupComposite, "Read", 1 ); groupWriteCheckbox = BaseWidgetUtils.createCheckbox( groupComposite, "Write", 1 ); groupExecuteCheckbox = BaseWidgetUtils.createCheckbox( groupComposite, "Execute", 1 ); BaseWidgetUtils.createLabel( symbolicNotationGroup, "Others:", 1 ); Composite othersComposite = BaseWidgetUtils.createColumnContainer( symbolicNotationGroup, 3, true, 1 ); othersReadCheckbox = BaseWidgetUtils.createCheckbox( othersComposite, "Read", 1 ); othersWriteCheckbox = BaseWidgetUtils.createCheckbox( othersComposite, "Write", 1 ); othersExecuteCheckbox = BaseWidgetUtils.createCheckbox( othersComposite, "Execute", 1 ); } /** * Creates the octal notation area. * * @param parent the parent composite */ private void createOctalNotationArea( Composite parent ) { Group octalNotationGroup = BaseWidgetUtils.createGroup( parent, "Octal Notation", 1 ); octalNotationText = BaseWidgetUtils.createText( octalNotationGroup, "0000", 1 ); octalNotationText.setTextLimit( 4 ); } /** * Adds listeners. */ private void addListeners() { ownerReadCheckbox.addSelectionListener( checkboxSelectionListener ); ownerWriteCheckbox.addSelectionListener( checkboxSelectionListener ); ownerExecuteCheckbox.addSelectionListener( checkboxSelectionListener ); groupReadCheckbox.addSelectionListener( checkboxSelectionListener ); groupWriteCheckbox.addSelectionListener( checkboxSelectionListener ); groupExecuteCheckbox.addSelectionListener( checkboxSelectionListener ); othersReadCheckbox.addSelectionListener( checkboxSelectionListener ); othersWriteCheckbox.addSelectionListener( checkboxSelectionListener ); othersExecuteCheckbox.addSelectionListener( checkboxSelectionListener ); octalNotationText.addVerifyListener( octalNotationTextVerifyListener ); octalNotationText.addModifyListener( octalNotationTextModifyListener ); } /** * Remove listeners. */ private void removeListeners() { ownerReadCheckbox.removeSelectionListener( checkboxSelectionListener ); ownerWriteCheckbox.removeSelectionListener( checkboxSelectionListener ); ownerExecuteCheckbox.removeSelectionListener( checkboxSelectionListener ); groupReadCheckbox.removeSelectionListener( checkboxSelectionListener ); groupWriteCheckbox.removeSelectionListener( checkboxSelectionListener ); groupExecuteCheckbox.removeSelectionListener( checkboxSelectionListener ); othersReadCheckbox.removeSelectionListener( checkboxSelectionListener ); othersWriteCheckbox.removeSelectionListener( checkboxSelectionListener ); othersExecuteCheckbox.removeSelectionListener( checkboxSelectionListener ); octalNotationText.removeVerifyListener( octalNotationTextVerifyListener ); octalNotationText.removeModifyListener( octalNotationTextModifyListener ); } /** * Gets the symbolic value (no type included). * * @return the symbolic value */ public String getSymbolicValue() { UnixPermissions perm = null; try { perm = new UnixPermissions( value ); } catch ( ParseException e ) { perm = new UnixPermissions(); } return perm.getSymbolicValue(); } /** * Gets the octal value. * * @return the octal value */ public String getOctalValue() { return value; } /** * Gets the decimal value. * * @return the decimal value */ public String getDecimalValue() { return "" + Integer.parseInt( value, 8 ); } }