/*
* 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.templateeditor.editor;
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.core.model.IEntry;
import org.apache.directory.studio.ldapbrowser.ui.BrowserUIConstants;
import org.eclipse.core.runtime.IProgressMonitor;
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.INavigationLocationProvider;
import org.eclipse.ui.IReusableEditor;
import org.eclipse.ui.IShowEditorInput;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.part.EditorPart;
import org.apache.directory.studio.templateeditor.EntryTemplatePlugin;
import org.apache.directory.studio.templateeditor.EntryTemplatePluginConstants;
import org.apache.directory.studio.templateeditor.EntryTemplatePluginUtils;
/**
* This class implements the Template Entry Editor.
* <p>
* This editor is composed of a three tabs TabFolder object:
* <ul>
* <li>the Template Editor itself</li>
* <li>the Table Editor</li>
* <li>the LDIF Editor</li>
* </ul>
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public abstract class TemplateEntryEditor extends EditorPart implements INavigationLocationProvider, IEntryEditor,
IReusableEditor, IShowEditorInput
{
/** The Template Editor page */
private TemplateEditorWidget templateEditorWidget;
/**
* {@inheritDoc}
*/
public void init( IEditorSite site, IEditorInput input ) throws PartInitException
{
setSite( site );
setInput( input );
}
/**
* {@inheritDoc}
*/
public void createPartControl( Composite parent )
{
templateEditorWidget = new TemplateEditorWidget( this );
templateEditorWidget.init( parent );
}
/**
* {@inheritDoc}
*/
public void workingCopyModified( Object source )
{
update();
if ( !isAutoSave() )
{
// mark as dirty
firePropertyChange( PROP_DIRTY );
}
}
/**
* {@inheritDoc}
*/
public void dispose()
{
// Template Editor Widget
if ( templateEditorWidget != null )
{
templateEditorWidget.dispose();
}
super.dispose();
}
/**
* {@inheritDoc}
*/
public boolean canHandle( IEntry entry )
{
int useTemplateEditorFor = EntryTemplatePlugin.getDefault().getPreferenceStore().getInt(
EntryTemplatePluginConstants.PREF_USE_TEMPLATE_EDITOR_FOR );
if ( useTemplateEditorFor == EntryTemplatePluginConstants.PREF_USE_TEMPLATE_EDITOR_FOR_ANY_ENTRY )
{
return true;
}
else if ( useTemplateEditorFor == EntryTemplatePluginConstants.PREF_USE_TEMPLATE_EDITOR_FOR_ENTRIES_WITH_TEMPLATE )
{
if ( entry == null )
{
return true;
}
return canBeHandledWithATemplate( entry );
}
return false;
}
/**
* Indicates whether or not the entry can be handled with a (at least) template.
*
* @param entry
* the entry
* @return
* <code>true</code> if the entry can be handled with a template,
* <code>false</code> if not.
*/
private boolean canBeHandledWithATemplate( IEntry entry )
{
return ( EntryTemplatePluginUtils.getMatchingTemplates( entry ).size() > 0 );
}
/**
* {@inheritDoc}
*/
public void doSave( IProgressMonitor monitor )
{
if ( !isAutoSave() )
{
EntryEditorInput eei = getEntryEditorInput();
eei.saveSharedWorkingCopy( true, this );
}
}
/**
* {@inheritDoc}
*/
public boolean isDirty()
{
return getEntryEditorInput().isSharedWorkingCopyDirty( this );
}
/**
* {@inheritDoc}
*/
public boolean isSaveAsAllowed()
{
return false;
}
/**
* {@inheritDoc}
*/
public void doSaveAs()
{
// Nothing to do, will never occur as "Save As..." is not allowed
}
/**
* {@inheritDoc}
*/
public void setFocus()
{
if ( templateEditorWidget != null )
{
templateEditorWidget.setFocus();
}
}
/**
* {@inheritDoc}
*/
public EntryEditorInput getEntryEditorInput()
{
Object editorInput = getEditorInput();
if ( editorInput instanceof EntryEditorInput )
{
return ( EntryEditorInput ) editorInput;
}
return null;
}
/**
* Updates the selected AbstractTemplateEntryEditorPage.
*/
private void update()
{
if ( templateEditorWidget != null )
{
templateEditorWidget.update();
}
}
/**
* {@inheritDoc}
*/
public void setInput( IEditorInput input )
{
super.setInput( input );
setPartName( input.getName() );
}
/**
* {@inheritDoc}
*/
public INavigationLocation createEmptyNavigationLocation()
{
return null;
}
/**
* {@inheritDoc}
*/
public INavigationLocation createNavigationLocation()
{
return new TemplateEntryEditorNavigationLocation( this );
}
/**
* {@inheritDoc}
*/
public void showEditorInput( IEditorInput input )
{
if ( input instanceof EntryEditorInput )
{
/*
* Optimization: no need to set the input again if the same input is already set
*/
if ( getEntryEditorInput() != null
&& getEntryEditorInput().getResolvedEntry() == ( ( EntryEditorInput ) input ).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
setInput( input );
getSite().getPage().getNavigationHistory().markLocation( this );
firePropertyChange( BrowserUIConstants.INPUT_CHANGED );
// Updating the input on the template editor widget
templateEditorWidget.editorInputChanged();
}
}
}