/* * 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.aciitemeditor.widgets; import java.text.ParseException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; import org.apache.directory.api.ldap.aci.ProtectedItem; import org.apache.directory.studio.aciitemeditor.ACIItemValueWithContext; import org.apache.directory.studio.aciitemeditor.Activator; import org.apache.directory.studio.aciitemeditor.dialogs.MultiValuedDialog; import org.apache.directory.studio.aciitemeditor.model.ProtectedItemWrapper; import org.apache.directory.studio.aciitemeditor.model.ProtectedItemWrapperFactory; import org.apache.directory.studio.ldapbrowser.core.model.IAttribute; import org.apache.directory.studio.ldapbrowser.core.model.IValue; import org.apache.directory.studio.ldapbrowser.core.model.impl.Attribute; import org.apache.directory.studio.ldapbrowser.core.model.impl.Value; import org.apache.directory.studio.valueeditors.AbstractDialogStringValueEditor; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.CellEditor; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTableViewer; import org.eclipse.jface.viewers.DoubleClickEvent; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IDoubleClickListener; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; 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.Label; import org.eclipse.swt.widgets.Table; /** * This composite contains GUI elements to edit ACI item protected items. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class ACIItemProtectedItemsComposite extends Composite { /** The context. */ private ACIItemValueWithContext context; /** The inner composite for all the content */ private Composite composite = null; /** The table viewer containing all protected items */ private CheckboxTableViewer tableViewer = null; /** The edit button */ private Button editButton = null; /** The possible protected items, used as input for the table viewer */ private ProtectedItemWrapper[] protectedItemWrappers = ProtectedItemWrapperFactory.createProtectedItemWrappers(); /** * Creates a new instance of ACIItemProtectedItemsComposite. * * @param parent * @param style */ public ACIItemProtectedItemsComposite( Composite parent, int style ) { super( parent, style ); GridLayout layout = new GridLayout(); layout.horizontalSpacing = 0; layout.verticalSpacing = 0; layout.marginHeight = 0; layout.marginWidth = 0; setLayout( layout ); GridData layoutData = new GridData(); layoutData.horizontalAlignment = GridData.FILL; layoutData.grabExcessHorizontalSpace = true; layoutData.verticalAlignment = GridData.CENTER; setLayoutData( layoutData ); createComposite(); } /** * This method initializes composite * */ private void createComposite() { GridData labelGridData = new GridData(); labelGridData.horizontalSpan = 2; labelGridData.verticalAlignment = GridData.CENTER; labelGridData.grabExcessHorizontalSpace = true; labelGridData.horizontalAlignment = GridData.FILL; GridLayout gridLayout = new GridLayout(); gridLayout.makeColumnsEqualWidth = false; gridLayout.numColumns = 2; GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.FILL; gridData.grabExcessHorizontalSpace = true; gridData.verticalSpan = 1; gridData.verticalAlignment = GridData.BEGINNING; composite = new Composite( this, SWT.NONE ); composite.setLayoutData( gridData ); composite.setLayout( gridLayout ); Label label = new Label( composite, SWT.NONE ); label.setText( Messages.getString( "ACIItemProtectedItemsComposite.description" ) ); //$NON-NLS-1$ label.setLayoutData( labelGridData ); createTable(); createButtonComposite(); } /** * This method initializes table and table viewer * */ private void createTable() { GridData tableGridData = new GridData(); tableGridData.grabExcessHorizontalSpace = true; tableGridData.verticalAlignment = GridData.FILL; tableGridData.horizontalAlignment = GridData.FILL; //tableGridData.heightHint = 100; Table table = new Table( composite, SWT.BORDER | SWT.CHECK ); table.setHeaderVisible( false ); table.setLayoutData( tableGridData ); table.setLinesVisible( false ); tableViewer = new CheckboxTableViewer( table ); tableViewer.setContentProvider( new ArrayContentProvider() ); tableViewer.setLabelProvider( new ProtectedItemsLabelProvider() ); tableViewer.setInput( protectedItemWrappers ); tableViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( SelectionChangedEvent event ) { protectedItemSelected(); } } ); tableViewer.addCheckStateListener( new ICheckStateListener() { public void checkStateChanged( CheckStateChangedEvent event ) { protectedItemChecked(); } } ); tableViewer.addDoubleClickListener( new IDoubleClickListener() { public void doubleClick( DoubleClickEvent event ) { if ( editButton.isEnabled() ) { editProtectedItem(); } } } ); } /** * This method initializes buttons * */ private void createButtonComposite() { GridData reverseSelectionButtonGridData = new GridData(); reverseSelectionButtonGridData.horizontalAlignment = GridData.FILL; reverseSelectionButtonGridData.grabExcessHorizontalSpace = false; reverseSelectionButtonGridData.verticalAlignment = GridData.BEGINNING; reverseSelectionButtonGridData.widthHint = Activator.getButtonWidth( this ); GridData deselectAllButtonGridData = new GridData(); deselectAllButtonGridData.horizontalAlignment = GridData.FILL; deselectAllButtonGridData.grabExcessHorizontalSpace = false; deselectAllButtonGridData.verticalAlignment = GridData.BEGINNING; deselectAllButtonGridData.widthHint = Activator.getButtonWidth( this ); GridData selectAllButtonGridData = new GridData(); selectAllButtonGridData.horizontalAlignment = GridData.FILL; selectAllButtonGridData.grabExcessHorizontalSpace = false; selectAllButtonGridData.verticalAlignment = GridData.BEGINNING; selectAllButtonGridData.widthHint = Activator.getButtonWidth( this ); GridData editButtonGridData = new GridData(); editButtonGridData.horizontalAlignment = GridData.FILL; editButtonGridData.grabExcessHorizontalSpace = false; editButtonGridData.verticalAlignment = GridData.BEGINNING; editButtonGridData.widthHint = Activator.getButtonWidth( this ); GridLayout gridLayout = new GridLayout(); gridLayout.marginWidth = 0; gridLayout.marginHeight = 0; GridData gridData = new GridData(); gridData.horizontalAlignment = GridData.CENTER; gridData.grabExcessHorizontalSpace = false; gridData.grabExcessVerticalSpace = false; gridData.verticalAlignment = GridData.FILL; Composite buttonComposite = new Composite( composite, SWT.NONE ); buttonComposite.setLayoutData( gridData ); buttonComposite.setLayout( gridLayout ); editButton = new Button( buttonComposite, SWT.NONE ); editButton.setText( Messages.getString( "ACIItemProtectedItemsComposite.edit.button" ) ); //$NON-NLS-1$ editButton.setLayoutData( editButtonGridData ); editButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { editProtectedItem(); } } ); editButton.setEnabled( false ); Button selectAllButton = new Button( buttonComposite, SWT.NONE ); selectAllButton.setText( Messages.getString( "ACIItemProtectedItemsComposite.selectAll.button" ) ); //$NON-NLS-1$ selectAllButton.setLayoutData( selectAllButtonGridData ); selectAllButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { tableViewer.setCheckedElements( protectedItemWrappers ); refreshTable(); } } ); Button deselectAllButton = new Button( buttonComposite, SWT.NONE ); deselectAllButton.setText( Messages.getString( "ACIItemProtectedItemsComposite.deselectAll.button" ) ); //$NON-NLS-1$ deselectAllButton.setLayoutData( deselectAllButtonGridData ); deselectAllButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { tableViewer.setCheckedElements( new ProtectedItem[0] ); refreshTable(); } } ); Button reverseSelectionButton = new Button( buttonComposite, SWT.NONE ); reverseSelectionButton.setText( Messages.getString( "ACIItemProtectedItemsComposite.revers.button" ) ); //$NON-NLS-1$ reverseSelectionButton.setLayoutData( reverseSelectionButtonGridData ); reverseSelectionButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { List<Object> elements = new ArrayList<Object>(); elements.addAll( Arrays.asList( protectedItemWrappers ) ); elements.removeAll( Arrays.asList( tableViewer.getCheckedElements() ) ); tableViewer.setCheckedElements( elements.toArray() ); refreshTable(); } } ); } /** * The label provider used for this table viewer. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ private class ProtectedItemsLabelProvider extends LabelProvider { /** * Returns the error icon if the protected item is checked and invalid. * * @param element the element * * @return the image */ public Image getImage( Object element ) { if ( element instanceof ProtectedItemWrapper ) { ProtectedItemWrapper wrapper = ( ProtectedItemWrapper ) element; if ( tableViewer.getChecked( wrapper ) ) { try { wrapper.getProtectedItem(); } catch ( ParseException e ) { return Activator.getDefault().getImage( Messages.getString( "ACIItemProtectedItemsComposite.error.icon" ) ); //$NON-NLS-1$ } } } return null; } } /** * Sets the context. * * @param context the context */ public void setContext( ACIItemValueWithContext context ) { this.context = context; } /** * Sets the protected items. * * @param protectedItems */ public void setProtectedItems( Collection<ProtectedItem> protectedItems ) { // reset first for ( ProtectedItemWrapper protectedItemWrapper : protectedItemWrappers ) { tableViewer.setChecked( protectedItemWrapper, false ); } for ( ProtectedItem item : protectedItems ) { for ( ProtectedItemWrapper protectedItemWrapper : protectedItemWrappers ) { if ( protectedItemWrapper.getClazz() == item.getClass() ) { protectedItemWrapper.setProtectedItem( item ); tableViewer.setChecked( protectedItemWrapper, true ); } } } refreshTable(); } /** * Returns the protected items as selected by the user. * * @return the protected items * @throws ParseException if the protected items or its values are not valid. */ public Collection<ProtectedItem> getProtectedItems() throws ParseException { Collection<ProtectedItem> protectedItems = new ArrayList<ProtectedItem>(); for ( ProtectedItemWrapper protectedItemWrapper : protectedItemWrappers ) { if ( tableViewer.getChecked( protectedItemWrapper ) ) { ProtectedItem protectedItem = protectedItemWrapper.getProtectedItem(); protectedItems.add( protectedItem ); } } return protectedItems; } /** * Shows or hides this composite. * * @param visible true if visible */ public void setVisible( boolean visible ) { super.setVisible( visible ); ( ( GridData ) getLayoutData() ).heightHint = visible ? -1 : 0; } /** * * @return the protected item that is selected in the table viewer, or null. */ private ProtectedItemWrapper getSelectedProtectedItemWrapper() { ProtectedItemWrapper protectedItemWrapper = null; IStructuredSelection selection = ( IStructuredSelection ) tableViewer.getSelection(); if ( !selection.isEmpty() ) { Object element = selection.getFirstElement(); if ( element instanceof ProtectedItemWrapper ) { protectedItemWrapper = ( ProtectedItemWrapper ) element; } } return protectedItemWrapper; } /** * Called, when a protected item is selected in the table viewer. * - enables/disables the edit button * */ private void protectedItemSelected() { ProtectedItemWrapper protectedItemWrapper = getSelectedProtectedItemWrapper(); if ( protectedItemWrapper == null || !protectedItemWrapper.isEditable() ) { editButton.setEnabled( false ); } else { editButton.setEnabled( true ); } } /** * Called, when a protected item checkbox is checked or unchecked. */ private void protectedItemChecked() { refreshTable(); } /** * Called, when pushing the edit button. Opens the text editor. * */ private void editProtectedItem() { ProtectedItemWrapper protectedItemWrapper = getSelectedProtectedItemWrapper(); AbstractDialogStringValueEditor valueEditor = protectedItemWrapper.getValueEditor(); if ( valueEditor != null ) { if ( protectedItemWrapper.isMultivalued() ) { MultiValuedDialog dialog = new MultiValuedDialog( getShell(), protectedItemWrapper.getDisplayName(), protectedItemWrapper.getValues(), context, valueEditor ); dialog.open(); refreshTable(); } else { List<String> values = protectedItemWrapper.getValues(); String oldValue = values.isEmpty() ? null : values.get( 0 ); if ( oldValue == null ) { oldValue = ""; //$NON-NLS-1$ } IAttribute attribute = new Attribute( context.getEntry(), "" ); //$NON-NLS-1$ IValue value = new Value( attribute, oldValue ); //$NON-NLS-1$ Object oldRawValue = valueEditor.getRawValue( value ); //$NON-NLS-1$ CellEditor cellEditor = valueEditor.getCellEditor(); cellEditor.setValue( oldRawValue ); cellEditor.activate(); Object newRawValue = cellEditor.getValue(); if ( newRawValue != null ) { String newValue = ( String ) valueEditor.getStringOrBinaryValue( newRawValue ); values.clear(); values.add( newValue ); tableViewer.refresh(); } } } } /** * Refreshes the table viewer. */ private void refreshTable() { tableViewer.refresh(); } }