/* * 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.editors.entry; import org.apache.directory.studio.entryeditors.EntryEditorInput; import org.apache.directory.studio.entryeditors.EntryEditorUtils; import org.apache.directory.studio.entryeditors.IEntryEditor; import org.apache.directory.studio.ldapbrowser.common.BrowserCommonActivator; import org.apache.directory.studio.ldapbrowser.common.BrowserCommonConstants; import org.apache.directory.studio.ldapbrowser.core.jobs.InitializeAttributesRunnable; import org.apache.directory.studio.ldapbrowser.core.jobs.StudioBrowserJob; import org.apache.directory.studio.ldapbrowser.core.model.IEntry; import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants; import org.apache.directory.studio.ldifeditor.editor.LdifEditor; import org.apache.directory.studio.ldifeditor.editor.LdifOutlinePage; import org.apache.directory.studio.utils.ActionUtils; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.action.Action; import org.eclipse.jface.action.IAction; import org.eclipse.jface.action.IMenuManager; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IEditorSite; import org.eclipse.ui.INavigationLocation; import org.eclipse.ui.IShowEditorInput; import org.eclipse.ui.PartInitException; import org.eclipse.ui.texteditor.ITextEditorActionConstants; import org.eclipse.ui.views.contentoutline.IContentOutlinePage; /** * An entry editor that uses LDIF format. * * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a> */ public abstract class LdifEntryEditor extends LdifEditor implements IEntryEditor, IShowEditorInput { private static final String REFRESH_ACTION = "RefreshAction"; //$NON-NLS-1$ private static final String FETCH_OPERATIONAL_ATTRIBUTES_ACTION = "FetchOperationalAttributesAction"; //$NON-NLS-1$ private boolean inShowEditorInput = false; private IAction refreshAction = new Action() { @Override public ImageDescriptor getImageDescriptor() { return BrowserCommonActivator.getDefault().getImageDescriptor( BrowserCommonConstants.IMG_REFRESH ); } @Override public String getText() { return org.apache.directory.studio.ldapbrowser.common.actions.Messages .getString( "RefreshAction.RelaodAttributes" ); //$NON-NLS-1$ } @Override public boolean isEnabled() { return ( getEntryEditorInput().getResolvedEntry() != null ); } @Override public String getActionDefinitionId() { return "org.eclipse.ui.file.refresh"; //$NON-NLS-1$ } @Override public void run() { IEntry entry = getEntryEditorInput().getResolvedEntry(); new StudioBrowserJob( new InitializeAttributesRunnable( entry ) ).execute(); } }; private IAction fetchOperationalAttributesAction = new Action() { @Override public int getStyle() { return Action.AS_CHECK_BOX; } @Override public String getText() { return org.apache.directory.studio.ldapbrowser.common.actions.Messages .getString( "FetchOperationalAttributesAction.FetchOperationalAttributes" ); //$NON-NLS-1$ } @Override public boolean isEnabled() { IEntry entry = getEntryEditorInput().getResolvedEntry(); if ( entry != null ) { entry = entry.getBrowserConnection().getEntryFromCache( entry.getDn() ); return !entry.getBrowserConnection().isFetchOperationalAttributes(); } return false; } @Override public void run() { IEntry entry = getEntryEditorInput().getResolvedEntry(); entry = entry.getBrowserConnection().getEntryFromCache( entry.getDn() ); boolean init = !entry.isInitOperationalAttributes(); entry.setInitOperationalAttributes( init ); new StudioBrowserJob( new InitializeAttributesRunnable( entry ) ).execute(); } }; public LdifEntryEditor() { super(); // use our own document provider that saves changes to the directory setDocumentProvider( new LdifEntryEditorDocumentProvider( this ) ); } @Override public void init( IEditorSite site, IEditorInput input ) throws PartInitException { super.init( site, input ); } @Override protected void doSetInput( IEditorInput input ) throws CoreException { super.doSetInput( input ); IEntry entry = getEntryEditorInput().getResolvedEntry(); if ( entry != null ) { setConnection( entry.getBrowserConnection() ); } } @Override public void createPartControl( Composite parent ) { // don't show the tool bar showToolBar = false; super.createPartControl( parent ); } @Override public boolean isSaveAsAllowed() { // Allowing "Save As..." requires an IPathEditorInput. // Would makes things much more complex, maybe we could add this later. return false; } @Override public void dispose() { super.dispose(); } /** * @see org.eclipse.ui.editors.text.TextEditor#getAdapter(java.lang.Class) */ public Object getAdapter( Class required ) { // Overwriting the outline page if ( IContentOutlinePage.class.equals( required ) ) { if ( outlinePage == null || outlinePage.getControl() == null || outlinePage.getControl().isDisposed() ) { outlinePage = new LdifOutlinePage( this, true ); } return outlinePage; } // In all other cases, refering to the super class return super.getAdapter( required ); } @Override protected void createActions() { super.createActions(); setAction( REFRESH_ACTION, refreshAction ); setAction( FETCH_OPERATIONAL_ATTRIBUTES_ACTION, fetchOperationalAttributesAction ); } @Override protected void editorContextMenuAboutToShow( IMenuManager menu ) { super.editorContextMenuAboutToShow( menu ); IEntry entry = getEntryEditorInput().getResolvedEntry(); fetchOperationalAttributesAction.setChecked( ( entry != null ) ? entry.isInitOperationalAttributes() : false ); addAction( menu, ITextEditorActionConstants.GROUP_REST, REFRESH_ACTION ); addAction( menu, ITextEditorActionConstants.GROUP_REST, FETCH_OPERATIONAL_ATTRIBUTES_ACTION ); } @Override public void activateGlobalActionHandlers() { ActionUtils.activateActionHandler( refreshAction ); } @Override public void deactivateGlobalActionHandlers() { ActionUtils.deactivateActionHandler( refreshAction ); } @Override public INavigationLocation createNavigationLocation() { return new LdifEntryEditorNavigationLocation( this, true ); } @Override public INavigationLocation createEmptyNavigationLocation() { return new LdifEntryEditorNavigationLocation( this, false ); } /** * This implementation returns always false. * * {@inheritDoc} */ public boolean isAutoSave() { return false; } /** * This implementation returns always true. * * {@inheritDoc} */ public boolean canHandle( IEntry entry ) { return true; } /** * {@inheritDoc} */ public EntryEditorInput getEntryEditorInput() { return EntryEditorUtils.getEntryEditorInput( getEditorInput() ); } /** * {@inheritDoc} */ public void workingCopyModified( Object source ) { ( ( LdifEntryEditorDocumentProvider ) getDocumentProvider() ).workingCopyModified( getEntryEditorInput(), source ); } public void showEditorInput( IEditorInput input ) { if ( inShowEditorInput ) { /* * This is to avoid recursion when using history navigation: * - when selecting an entry this method is called * - this method fires an input changed event * - the LinkWithEditorAction gets the event and selects the entry in the browser tree * - this selection fires an selection event * - the selection event causes an openEditor() that calls this method again */ return; } try { inShowEditorInput = true; if ( input instanceof EntryEditorInput ) { EntryEditorInput eei = ( EntryEditorInput ) input; /* * Optimization: no need to set the input again if the same input is already set */ if ( getEntryEditorInput() != null && getEntryEditorInput().getResolvedEntry() == eei.getResolvedEntry() ) { return; } // If the editor is dirty, let's ask for a save before changing the input if ( isDirty() ) { if ( !EntryEditorUtils.askSaveSharedWorkingCopyBeforeInputChange( this ) ) { return; } } // now set the real input and mark history location doSetInput( input ); getSite().getPage().getNavigationHistory().markLocation( this ); firePropertyChange( BrowserUIConstants.INPUT_CHANGED ); } } catch ( CoreException e ) { throw new RuntimeException( e ); } finally { inShowEditorInput = false; } } }