| /* |
| * 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.common.wizards; |
| |
| |
| import java.util.Collection; |
| |
| import org.apache.directory.api.ldap.model.schema.AttributeType; |
| import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator; |
| import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants; |
| import org.apache.directory.studio.ldapbrowser.common.widgets.entryeditor.EntryEditorWidget; |
| import org.apache.directory.studio.ldapbrowser.common.widgets.entryeditor.EntryEditorWidgetActionGroup; |
| import org.apache.directory.studio.ldapbrowser.common.widgets.entryeditor.EntryEditorWidgetActionGroupWithAttribute; |
| import org.apache.directory.studio.ldapbrowser.common.widgets.entryeditor.EntryEditorWidgetConfiguration; |
| import org.apache.directory.studio.ldapbrowser.common.widgets.entryeditor.EntryEditorWidgetUniversalListener; |
| import org.apache.directory.studio.ldapbrowser.common.widgets.entryeditor.OpenDefaultEditorAction; |
| import org.apache.directory.studio.ldapbrowser.core.events.EntryModificationEvent; |
| import org.apache.directory.studio.ldapbrowser.core.events.EntryUpdateListener; |
| import org.apache.directory.studio.ldapbrowser.core.events.EventRegistry; |
| 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.DummyEntry; |
| import org.apache.directory.studio.ldapbrowser.core.model.schema.SchemaUtils; |
| import org.eclipse.jface.dialogs.IPageChangedListener; |
| import org.eclipse.jface.dialogs.PageChangedEvent; |
| import org.eclipse.jface.viewers.StructuredSelection; |
| import org.eclipse.jface.wizard.IWizardContainer; |
| import org.eclipse.jface.wizard.WizardDialog; |
| import org.eclipse.jface.wizard.WizardPage; |
| import org.eclipse.swt.SWT; |
| import org.eclipse.swt.layout.GridData; |
| import org.eclipse.swt.layout.GridLayout; |
| import org.eclipse.swt.widgets.Composite; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.contexts.IContextActivation; |
| import org.eclipse.ui.contexts.IContextService; |
| |
| |
| /** |
| * The NewEntryAttributesWizardPage is used to fill the attributes of |
| * the new entry. |
| * |
| * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> |
| */ |
| public class NewEntryAttributesWizardPage extends WizardPage implements EntryUpdateListener |
| { |
| |
| /** The wizard. */ |
| private NewEntryWizard wizard; |
| |
| /** The configuration. */ |
| private EntryEditorWidgetConfiguration configuration; |
| |
| /** The action group. */ |
| private EntryEditorWidgetActionGroup actionGroup; |
| |
| /** The main widget. */ |
| private EntryEditorWidget mainWidget; |
| |
| /** The universal listener. */ |
| private EntryEditorWidgetUniversalListener universalListener; |
| |
| /** Token used to activate and deactivate shortcuts in the editor */ |
| private IContextActivation contextActivation; |
| |
| |
| /** |
| * Creates a new instance of NewEntryAttributesWizardPage. |
| * |
| * @param pageName the page name |
| * @param wizard the wizard |
| */ |
| public NewEntryAttributesWizardPage( String pageName, NewEntryWizard wizard ) |
| { |
| super( pageName ); |
| setTitle( Messages.getString( "NewEntryAttributesWizardPage.Attributes" ) ); //$NON-NLS-1$ |
| setDescription( Messages.getString( "NewEntryAttributesWizardPage.PleaseEnterAttributesForEntry" ) ); //$NON-NLS-1$ |
| setImageDescriptor( BrowserCommonActivator.getDefault().getImageDescriptor( |
| BrowserCommonConstants.IMG_ENTRY_WIZARD ) ); |
| setPageComplete( false ); |
| |
| this.wizard = wizard; |
| |
| IWizardContainer container = wizard.getContainer(); |
| if ( container instanceof WizardDialog ) |
| { |
| WizardDialog dialog = ( WizardDialog ) container; |
| dialog.addPageChangedListener( new IPageChangedListener() |
| { |
| public void pageChanged( PageChangedEvent event ) |
| { |
| if ( getControl().isVisible() ) |
| { |
| for ( IAttribute attribute : NewEntryAttributesWizardPage.this.wizard.getPrototypeEntry() |
| .getAttributes() ) |
| { |
| for ( IValue value : attribute.getValues() ) |
| { |
| if ( value.isEmpty() ) |
| { |
| mainWidget.getViewer().setSelection( new StructuredSelection( value ), true ); |
| OpenDefaultEditorAction openDefaultEditorAction = actionGroup |
| .getOpenDefaultEditorAction(); |
| if ( openDefaultEditorAction.isEnabled() ) |
| { |
| openDefaultEditorAction.run(); |
| } |
| return; |
| } |
| } |
| } |
| } |
| } |
| } ); |
| } |
| } |
| |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public void dispose() |
| { |
| if ( configuration != null ) |
| { |
| EventRegistry.removeEntryUpdateListener( this ); |
| universalListener.dispose(); |
| universalListener = null; |
| mainWidget.dispose(); |
| mainWidget = null; |
| actionGroup.dispose(); |
| actionGroup = null; |
| configuration.dispose(); |
| configuration = null; |
| |
| if ( contextActivation != null ) |
| { |
| IContextService contextService = ( IContextService ) PlatformUI.getWorkbench().getAdapter( |
| IContextService.class ); |
| contextService.deactivateContext( contextActivation ); |
| contextActivation = null; |
| } |
| } |
| super.dispose(); |
| } |
| |
| |
| /** |
| * {@inheritDoc} |
| * |
| * This implementation initializes the must attributes of the |
| * prototype entry and initializes the entry widget when this |
| * page becomes visible. |
| */ |
| public void setVisible( boolean visible ) |
| { |
| super.setVisible( visible ); |
| |
| if ( visible ) |
| { |
| DummyEntry newEntry = wizard.getPrototypeEntry(); |
| try |
| { |
| EventRegistry.suspendEventFiringInCurrentThread(); |
| |
| // remove empty must attributes |
| // necessary when navigating back, modifying object classes |
| // and Dn and navigating forward again. |
| Collection<AttributeType> oldMusts = SchemaUtils.getMustAttributeTypeDescriptions( newEntry ); |
| for ( AttributeType oldMust : oldMusts ) |
| { |
| IAttribute attribute = newEntry.getAttribute( oldMust.getOid() ); |
| if ( attribute != null ) |
| { |
| IValue[] values = attribute.getValues(); |
| for ( int v = 0; v < values.length; v++ ) |
| { |
| if ( values[v].isEmpty() ) |
| { |
| attribute.deleteValue( values[v] ); |
| } |
| } |
| if ( attribute.getValueSize() == 0 ) |
| { |
| newEntry.deleteAttribute( attribute ); |
| } |
| } |
| } |
| |
| // add must attributes |
| Collection<AttributeType> newMusts = SchemaUtils.getMustAttributeTypeDescriptions( newEntry ); |
| for ( AttributeType newMust : newMusts ) |
| { |
| if ( newEntry.getAttributeWithSubtypes( newMust.getOid() ) == null ) |
| { |
| String friendlyIdentifier = SchemaUtils.getFriendlyIdentifier( newMust ); |
| IAttribute att = new Attribute( newEntry, friendlyIdentifier ); |
| newEntry.addAttribute( att ); |
| att.addEmptyValue(); |
| } |
| } |
| } |
| finally |
| { |
| EventRegistry.resumeEventFiringInCurrentThread(); |
| } |
| |
| // set the input |
| universalListener.setInput( newEntry ); |
| mainWidget.getViewer().refresh(); |
| validate(); |
| |
| // set focus to the viewer |
| mainWidget.getViewer().getControl().setFocus(); |
| } |
| else |
| { |
| mainWidget.getViewer().setInput( "" ); //$NON-NLS-1$ |
| mainWidget.getViewer().refresh(); |
| setPageComplete( false ); |
| } |
| } |
| |
| |
| /** |
| * Checks if the prototype entry is completed. |
| */ |
| private void validate() |
| { |
| if ( wizard.getPrototypeEntry() != null ) |
| { |
| Collection<String> messages = SchemaUtils.getEntryIncompleteMessages( wizard.getPrototypeEntry() ); |
| if ( messages != null && !messages.isEmpty() ) |
| { |
| StringBuffer sb = new StringBuffer(); |
| for ( String message : messages ) |
| { |
| sb.append( message ); |
| sb.append( ' ' ); |
| } |
| setMessage( sb.toString(), WizardPage.WARNING ); |
| } |
| else |
| { |
| setMessage( null ); |
| } |
| |
| setPageComplete( true ); |
| } |
| else |
| { |
| setPageComplete( false ); |
| } |
| } |
| |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public void createControl( Composite parent ) |
| { |
| Composite composite = new Composite( parent, SWT.NONE ); |
| GridLayout gl = new GridLayout( 1, false ); |
| composite.setLayout( gl ); |
| composite.setLayoutData( new GridData( GridData.FILL_BOTH ) ); |
| |
| // create configuration |
| configuration = new EntryEditorWidgetConfiguration(); |
| |
| // create main widget |
| mainWidget = new EntryEditorWidget( configuration ); |
| mainWidget.createWidget( composite ); |
| mainWidget.getViewer().getTree().setFocus(); |
| |
| // create actions |
| actionGroup = new EntryEditorWidgetActionGroupWithAttribute( mainWidget, configuration ); |
| actionGroup.fillToolBar( mainWidget.getToolBarManager() ); |
| actionGroup.fillMenu( mainWidget.getMenuManager() ); |
| actionGroup.fillContextMenu( mainWidget.getContextMenuManager() ); |
| IContextService contextService = ( IContextService ) PlatformUI.getWorkbench().getAdapter( |
| IContextService.class ); |
| contextActivation = contextService.activateContext( BrowserCommonConstants.CONTEXT_DIALOGS ); |
| actionGroup.activateGlobalActionHandlers(); |
| |
| // create the listener |
| universalListener = new EntryEditorWidgetUniversalListener( mainWidget.getViewer(), configuration, actionGroup, |
| actionGroup.getOpenDefaultEditorAction() ); |
| EventRegistry.addEntryUpdateListener( this, BrowserCommonActivator.getDefault().getEventRunner() ); |
| |
| setControl( composite ); |
| } |
| |
| |
| /** |
| * {@inheritDoc} |
| */ |
| public void entryUpdated( EntryModificationEvent event ) |
| { |
| if ( event.getModifiedEntry() == wizard.getPrototypeEntry() && !isDisposed() && getControl().isVisible() ) |
| { |
| validate(); |
| } |
| } |
| |
| |
| /** |
| * Checks if is disposed. |
| * |
| * @return true, if is disposed |
| */ |
| private boolean isDisposed() |
| { |
| return configuration == null; |
| } |
| |
| } |