/* * 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.ldapbrowser.ui.dialogs.preferences; import java.util.ArrayList; import java.util.List; import org.apache.directory.studio.common.ui.widgets.BaseWidgetUtils; import org.apache.directory.studio.entryeditors.EntryEditorExtension; import org.apache.directory.studio.entryeditors.EntryEditorManager; import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants; import org.apache.directory.studio.ldapbrowser.ui.BrowserUIPlugin; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.jface.viewers.TableViewer; 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.Control; import org.eclipse.swt.widgets.Group; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Link; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.eclipse.ui.dialogs.PreferencesUtil; /** * The entry editors preference page contains settings * for the Entry Editors. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public class EntryEditorsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { /** A flag indicating whether or not to use the user's priority for entry editors */ private boolean useUserPriority = false; /** The open mode setting value */ private int openMode = 0; /** The ordered list of entry editors */ private List<EntryEditorExtension> sortedEntryEditorsList; // UI fields private Button historicalBehaviorButton; private Button useApplicationWideOpenModeButton; private TableViewer entryEditorsTableViewer; private Button upEntryEditorButton; private Button downEntryEditorButton; private Button restoreDefaultsEntryEditorsButton; /** * Creates a new instance of EntryEditorsPreferencePage. */ public EntryEditorsPreferencePage() { super( Messages.getString( "EntryEditorsPreferencePage.EntryEditorsPrefPageTitle" ) ); //$NON-NLS-1$ super.setPreferenceStore( BrowserUIPlugin.getDefault().getPreferenceStore() ); super.setDescription( Messages.getString( "EntryEditorsPreferencePage.EntryEditorsPrefPageDescription" ) ); //$NON-NLS-1$ } /** * {@inheritDoc} */ public void init( IWorkbench workbench ) { openMode = BrowserUIPlugin.getDefault().getPluginPreferences().getInt( BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE ); useUserPriority = BrowserUIPlugin.getDefault().getPluginPreferences().getBoolean( BrowserUIConstants.PREFERENCE_ENTRYEDITORS_USE_USER_PRIORITIES ); } /** * {@inheritDoc} */ protected Control createContents( Composite parent ) { Composite composite = BaseWidgetUtils.createColumnContainer( parent, 1, 1 ); // Open Mode Group BaseWidgetUtils.createSpacer( composite, 1 ); BaseWidgetUtils.createSpacer( composite, 1 ); Group openModeGroup = BaseWidgetUtils.createGroup( BaseWidgetUtils.createColumnContainer( composite, 1, 1 ), Messages.getString( "EntryEditorsPreferencePage.OpenMode" ), 1 ); //$NON-NLS-1$ // Historical Behavior Button historicalBehaviorButton = BaseWidgetUtils.createRadiobutton( openModeGroup, Messages .getString( "EntryEditorsPreferencePage.HistoricalBehavior" ), 1 ); //$NON-NLS-1$ Composite historicalBehaviorComposite = BaseWidgetUtils.createColumnContainer( openModeGroup, 2, 1 ); BaseWidgetUtils.createRadioIndent( historicalBehaviorComposite, 1 ); Label historicalBehaviourLabel = BaseWidgetUtils.createWrappedLabel( historicalBehaviorComposite, Messages .getString( "EntryEditorsPreferencePage.HistoricalBehaviorTooltip" ), 1 ); //$NON-NLS-1$ GridData historicalBehaviourLabelGridData = new GridData( GridData.FILL_HORIZONTAL ); historicalBehaviourLabelGridData.widthHint = 300; historicalBehaviourLabel.setLayoutData( historicalBehaviourLabelGridData ); // Use Application Wide Open Mode Button useApplicationWideOpenModeButton = BaseWidgetUtils.createRadiobutton( openModeGroup, Messages .getString( "EntryEditorsPreferencePage.ApplicationWideSetting" ), 1 ); //$NON-NLS-1$ Composite useApplicationWideOpenModeComposite = BaseWidgetUtils.createColumnContainer( openModeGroup, 2, 1 ); BaseWidgetUtils.createRadioIndent( useApplicationWideOpenModeComposite, 1 ); Link link = BaseWidgetUtils.createLink( useApplicationWideOpenModeComposite, Messages .getString( "EntryEditorsPreferencePage.ApplicationWideSettingTooltip" ), 1 ); //$NON-NLS-1$ GridData linkGridData = new GridData( GridData.FILL_HORIZONTAL ); linkGridData.widthHint = 300; link.setLayoutData( linkGridData ); link.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { PreferencesUtil.createPreferenceDialogOn( getShell(), "org.eclipse.ui.preferencePages.Workbench", null, null ); //$NON-NLS-1$ } } ); // Initializing the UI from the preferences value if ( openMode == BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE_HISTORICAL_BEHAVIOR ) { historicalBehaviorButton.setSelection( true ); useApplicationWideOpenModeButton.setSelection( false ); } else if ( openMode == BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE_APPLICATION_WIDE ) { historicalBehaviorButton.setSelection( false ); useApplicationWideOpenModeButton.setSelection( true ); } // Entry Editors Group BaseWidgetUtils.createSpacer( composite, 1 ); BaseWidgetUtils.createSpacer( composite, 1 ); Group entryEditorsGroup = BaseWidgetUtils.createGroup( BaseWidgetUtils.createColumnContainer( composite, 1, 1 ), Messages .getString( "EntryEditorsPreferencePage.EntryEditors" ), 1 ); //$NON-NLS-1$ // Entry Editors Label Label entryEditorsLabel = BaseWidgetUtils.createWrappedLabel( entryEditorsGroup, Messages .getString( "EntryEditorsPreferencePage.EntryEditorsLabel" ), 1 ); //$NON-NLS-1$ GridData entryEditorsLabelGridData = new GridData( GridData.FILL_HORIZONTAL ); entryEditorsLabelGridData.widthHint = 300; entryEditorsLabel.setLayoutData( entryEditorsLabelGridData ); // Entry Editors Composite Composite entryEditorsComposite = new Composite( entryEditorsGroup, SWT.NONE ); GridLayout gl = new GridLayout( 2, false ); gl.marginHeight = gl.marginWidth = 0; entryEditorsComposite.setLayout( gl ); entryEditorsComposite.setLayoutData( new GridData( SWT.FILL, SWT.NONE, true, false ) ); // SchemaConnectors TableViewer entryEditorsTableViewer = new TableViewer( entryEditorsComposite, SWT.BORDER | SWT.SINGLE | SWT.FULL_SELECTION ); GridData gridData = new GridData( SWT.FILL, SWT.NONE, true, false, 1, 3 ); gridData.heightHint = 125; entryEditorsTableViewer.getTable().setLayoutData( gridData ); entryEditorsTableViewer.setContentProvider( new ArrayContentProvider() ); entryEditorsTableViewer.setLabelProvider( new LabelProvider() { public String getText( Object element ) { return ( ( EntryEditorExtension ) element ).getName(); } public Image getImage( Object element ) { return ( ( EntryEditorExtension ) element ).getIcon().createImage(); } } ); entryEditorsTableViewer.setInput( BrowserUIPlugin.getDefault().getEntryEditorManager() .getEntryEditorExtensions() ); // Up Button upEntryEditorButton = BaseWidgetUtils.createButton( entryEditorsComposite, Messages .getString( "EntryEditorsPreferencePage.Up" ), 1 ); //$NON-NLS-1$ upEntryEditorButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, false, false ) ); upEntryEditorButton.setEnabled( false ); upEntryEditorButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { moveSelectedEntryEditor( MoveEntryEditorDirectionEnum.UP ); } } ); // Down Button downEntryEditorButton = BaseWidgetUtils.createButton( entryEditorsComposite, Messages .getString( "EntryEditorsPreferencePage.Down" ), 1 ); //$NON-NLS-1$ downEntryEditorButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, false, false ) ); downEntryEditorButton.setEnabled( false ); downEntryEditorButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { moveSelectedEntryEditor( MoveEntryEditorDirectionEnum.DOWN ); } } ); // Restore Defaults Button restoreDefaultsEntryEditorsButton = BaseWidgetUtils.createButton( entryEditorsComposite, Messages .getString( "EntryEditorsPreferencePage.RestoreDefaults" ), 1 ); //$NON-NLS-1$ restoreDefaultsEntryEditorsButton.setLayoutData( new GridData( SWT.FILL, SWT.BEGINNING, false, false ) ); restoreDefaultsEntryEditorsButton.addSelectionListener( new SelectionAdapter() { public void widgetSelected( SelectionEvent e ) { performDefaultsEntryEditors(); } } ); // Description Label BaseWidgetUtils.createLabel( entryEditorsGroup, Messages .getString( "EntryEditorsPreferencePage.DescriptionColon" ), 1 ); //$NON-NLS-1$ // Description Text final Text descriptionText = new Text( entryEditorsGroup, SWT.BORDER | SWT.MULTI | SWT.READ_ONLY ); descriptionText.setEditable( false ); gridData = new GridData( SWT.FILL, SWT.NONE, true, false ); gridData.heightHint = 27; gridData.widthHint = 300; descriptionText.setLayoutData( gridData ); entryEditorsTableViewer.addSelectionChangedListener( new ISelectionChangedListener() { public void selectionChanged( SelectionChangedEvent event ) { // Getting the selected entry editor EntryEditorExtension entryEditor = ( EntryEditorExtension ) ( ( StructuredSelection ) entryEditorsTableViewer .getSelection() ).getFirstElement(); if ( entryEditor != null ) { // Updating the description text field descriptionText.setText( entryEditor.getDescription() ); // Updating the state of the buttons updateButtonsState( entryEditor ); } } } ); if ( useUserPriority ) { sortEntryEditorsByUserPriority(); } else { sortEntryEditorsByDefaultPriority(); } // Selecting the first entry editor if ( sortedEntryEditorsList.size() > 0 ) { entryEditorsTableViewer.setSelection( new StructuredSelection( sortedEntryEditorsList.get( 0 ) ) ); } return composite; } /** * Sorts the entry editors using the user's priority. */ private void sortEntryEditorsByUserPriority() { // Getting the entry editors sorted by user's priority sortedEntryEditorsList = new ArrayList<EntryEditorExtension>( BrowserUIPlugin.getDefault() .getEntryEditorManager().getEntryEditorExtensionsSortedByUserPriority() ); // Assigning the sorted editors to the viewer entryEditorsTableViewer.setInput( sortedEntryEditorsList ); } /** * Sorts the entry editors using the default priority. */ private void sortEntryEditorsByDefaultPriority() { // Getting the entry editors sorted by default priority sortedEntryEditorsList = new ArrayList<EntryEditorExtension>( BrowserUIPlugin.getDefault() .getEntryEditorManager().getEntryEditorExtensionsSortedByDefaultPriority() ); // Assigning the sorted editors to the viewer entryEditorsTableViewer.setInput( sortedEntryEditorsList ); } /** * Moves the currently selected entry editor. * * @param direction * the direction (up or down) */ private void moveSelectedEntryEditor( MoveEntryEditorDirectionEnum direction ) { StructuredSelection selection = ( StructuredSelection ) entryEditorsTableViewer.getSelection(); if ( selection.size() == 1 ) { EntryEditorExtension entryEditor = ( EntryEditorExtension ) selection.getFirstElement(); if ( sortedEntryEditorsList.contains( entryEditor ) ) { int oldIndex = sortedEntryEditorsList.indexOf( entryEditor ); int newIndex = 0; // Determining the new index number switch ( direction ) { case UP: newIndex = oldIndex - 1; break; case DOWN: newIndex = oldIndex + 1; break; } // Checking bounds if ( ( newIndex >= 0 ) && ( newIndex < sortedEntryEditorsList.size() ) ) { // Switching the two entry editors EntryEditorExtension newIndexEntryEditorBackup = sortedEntryEditorsList.set( newIndex, entryEditor ); sortedEntryEditorsList.set( oldIndex, newIndexEntryEditorBackup ); // Reloading the viewer entryEditorsTableViewer.refresh(); // Updating the state of the buttons updateButtonsState( entryEditor ); // Setting the "Use User Priority" to true useUserPriority = true; } } } } /** * Updates the state of the buttons. * * @param entryEditor * the selected entry editor */ private void updateButtonsState( EntryEditorExtension entryEditor ) { // Getting the index of the entry editor in the list int index = sortedEntryEditorsList.indexOf( entryEditor ); // Updating up button state upEntryEditorButton.setEnabled( index > 0 ); // Updating down button state downEntryEditorButton.setEnabled( index <= ( sortedEntryEditorsList.size() - 2 ) ); } /** * Updates the state of the buttons. */ private void updateButtonsState() { StructuredSelection selection = ( StructuredSelection ) entryEditorsTableViewer.getSelection(); if ( selection.size() == 1 ) { EntryEditorExtension entryEditor = ( EntryEditorExtension ) selection.getFirstElement(); // Updating the state of the buttons updateButtonsState( entryEditor ); } } /** * This enum is used to determine in which direction the entry editor * should be moved. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ private enum MoveEntryEditorDirectionEnum { UP, DOWN } /** * {@inheritDoc} */ public boolean performOk() { if ( historicalBehaviorButton.getSelection() ) { BrowserUIPlugin.getDefault().getPluginPreferences().setValue( BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE, BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE_HISTORICAL_BEHAVIOR ); } else if ( useApplicationWideOpenModeButton.getSelection() ) { BrowserUIPlugin.getDefault().getPluginPreferences().setValue( BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE, BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE_APPLICATION_WIDE ); } BrowserUIPlugin.getDefault().getPluginPreferences().setValue( BrowserUIConstants.PREFERENCE_ENTRYEDITORS_USE_USER_PRIORITIES, useUserPriority ); if ( useUserPriority ) { StringBuilder sb = new StringBuilder(); for ( EntryEditorExtension entryEditor : sortedEntryEditorsList ) { sb.append( entryEditor.getId() + EntryEditorManager.PRIORITIES_SEPARATOR ); } if ( sb.length() > 0 ) { sb.deleteCharAt( sb.length() - 1 ); } BrowserUIPlugin.getDefault().getPluginPreferences().setValue( BrowserUIConstants.PREFERENCE_ENTRYEDITORS_USER_PRIORITIES, sb.toString() ); } return true; } /** * {@inheritDoc} */ protected void performDefaults() { openMode = BrowserUIPlugin.getDefault().getPluginPreferences().getDefaultInt( BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE ); if ( openMode == BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE_HISTORICAL_BEHAVIOR ) { historicalBehaviorButton.setSelection( true ); useApplicationWideOpenModeButton.setSelection( false ); } else if ( openMode == BrowserUIConstants.PREFERENCE_ENTRYEDITORS_OPEN_MODE_APPLICATION_WIDE ) { historicalBehaviorButton.setSelection( false ); useApplicationWideOpenModeButton.setSelection( true ); } performDefaultsEntryEditors(); super.performDefaults(); } /** * Restore defaults to the entry editors part of the UI. */ private void performDefaultsEntryEditors() { useUserPriority = BrowserUIPlugin.getDefault().getPluginPreferences().getDefaultBoolean( BrowserUIConstants.PREFERENCE_ENTRYEDITORS_USE_USER_PRIORITIES ); if ( useUserPriority ) { sortEntryEditorsByUserPriority(); } else { sortEntryEditorsByDefaultPriority(); } updateButtonsState(); } }