/*
* 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 java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.directory.studio.entryeditors.EntryEditorInput;
import org.apache.directory.studio.entryeditors.IEntryEditor;
import org.apache.directory.studio.ldapbrowser.core.model.IEntry;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.ui.ISharedImages;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.forms.widgets.ScrolledForm;
import org.apache.directory.studio.templateeditor.EntryTemplatePlugin;
import org.apache.directory.studio.templateeditor.EntryTemplatePluginUtils;
import org.apache.directory.studio.templateeditor.actions.DisplayEntryInTemplateAction;
import org.apache.directory.studio.templateeditor.actions.DisplayEntryInTemplateMenuManager;
import org.apache.directory.studio.templateeditor.actions.EditorPagePropertiesAction;
import org.apache.directory.studio.templateeditor.actions.RefreshAction;
import org.apache.directory.studio.templateeditor.actions.SimpleActionProxy;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorCheckbox;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorComposite;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorDate;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorFileChooser;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorImage;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorLabel;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorLink;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorListbox;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorPassword;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorRadioButtons;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorSection;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorSpinner;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorTable;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorTextField;
import org.apache.directory.studio.templateeditor.editor.widgets.EditorWidget;
import org.apache.directory.studio.templateeditor.model.Template;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateCheckbox;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateComposite;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateDate;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateFileChooser;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateForm;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateImage;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateLabel;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateLink;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateListbox;
import org.apache.directory.studio.templateeditor.model.widgets.TemplatePassword;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateRadioButtons;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateSection;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateSpinner;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateTable;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateTextField;
import org.apache.directory.studio.templateeditor.model.widgets.TemplateWidget;
/**
* This class implements a widget for the Template Editor.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class TemplateEditorWidget
{
/** The associated editor */
private IEntryEditor editor;
/** The flag to know whether or not the widget has been initialized */
private boolean initialized = false;
/** The parent {@link Composite} of the widget */
private Composite parent;
/** The associated {@link FormToolkit} */
private FormToolkit toolkit;
/** The associated {@link ScrolledForm} */
private ScrolledForm form;
/** The currently selected template */
private Template selectedTemplate;
/** The context menu */
private Menu contextMenu;
/** The list of editor widgets */
private Map<TemplateWidget, EditorWidget<? extends TemplateWidget>> editorWidgets = new HashMap<TemplateWidget, EditorWidget<? extends TemplateWidget>>();
/**
* Creates a new instance of TemplateEditorWidget.
*
* @param editor
* the editor
*/
public TemplateEditorWidget( IEntryEditor editor )
{
this.editor = editor;
}
/**
* {@inheritDoc}
*/
public void init( Composite parent )
{
initialized = true;
this.parent = parent;
// Creating the toolkit
toolkit = new FormToolkit( parent.getDisplay() );
// Creating the new form
form = toolkit.createScrolledForm( parent );
form.getBody().setLayout( new GridLayout() );
form.getToolBarManager().add( new RefreshAction( getEditor() ) );
form.getToolBarManager().add( new Separator() );
form.getToolBarManager().add( new DisplayEntryInTemplateAction( this ) );
form.getToolBarManager().update( true );
// Creating the new menu manager
MenuManager menuManager = new MenuManager();
contextMenu = menuManager.createContextMenu( form );
form.setMenu( contextMenu );
// Adding actions to the menu manager
menuManager.add( new DisplayEntryInTemplateMenuManager( this ) );
menuManager.add( new Separator() );
menuManager.add( new RefreshAction( getEditor() ) );
menuManager.add( new Separator() );
menuManager.add( new SimpleActionProxy( new EditorPagePropertiesAction( getEditor() ) ) );
createFormContent();
parent.layout();
}
/**
* Creates the from content
*/
private void createFormContent()
{
EntryEditorInput entryEditorInput = getEditor().getEntryEditorInput();
// Checking if the input is null
if ( entryEditorInput == null )
{
createFormContentUnableToDisplayTheEntry();
}
else
{
// Getting the entry and the template
IEntry entry = entryEditorInput.getSharedWorkingCopy( getEditor() );
// Special case in the case the entry is null
if ( entry == null )
{
// Hiding the context menu
form.setMenu( null );
// Creating the form content
createFormContentNoEntrySelected();
}
else
{
// Showing the context menu
form.setMenu( contextMenu );
// Checking if a template is selected
if ( selectedTemplate == null )
{
List<Template> matchingTemplates = EntryTemplatePluginUtils.getMatchingTemplates( entry );
if ( ( matchingTemplates != null ) && ( matchingTemplates.size() > 0 ) )
{
// Looking for the default template
for ( Template matchingTemplate : matchingTemplates )
{
if ( EntryTemplatePlugin.getDefault().getTemplatesManager().isDefaultTemplate(
matchingTemplate ) )
{
selectedTemplate = matchingTemplate;
break;
}
}
// If no default template has been found,
// select the first one
if ( selectedTemplate == null )
{
// Assigning the first template as the selected one
selectedTemplate = matchingTemplates.get( 0 );
}
// Creating the form content
createFormContentFromTemplate();
}
else
{
// Creating the form content
createFormContentNoTemplateMatching();
}
}
else
{
// Creating the form content
createFormContentFromTemplate();
}
}
}
form.layout( true, true );
}
/**
* Gets the associated editor.
*
* @return
*/
public IEntryEditor getEditor()
{
return editor;
}
/**
* Creates the form UI in case where the entry cannot be displayed.
*/
private void createFormContentUnableToDisplayTheEntry()
{
// Displaying an error message
form.setText( Messages.getString( "TemplateEditorWidget.UnableToDisplayTheEntry" ) ); //$NON-NLS-1$
form.setImage( PlatformUI.getWorkbench().getSharedImages().getImage( ISharedImages.IMG_OBJS_ERROR_TSK ) );
}
/**
* Creates the form UI from the template.
*
* @param managedForm
* the form
*/
private void createFormContentFromTemplate()
{
form.setText( selectedTemplate.getTitle() );
// Getting the template form
TemplateForm templateForm = selectedTemplate.getForm();
// Creating the children widgets
if ( templateForm.hasChildren() )
{
for ( TemplateWidget templateWidget : templateForm.getChildren() )
{
createFormTemplateWidget( form.getBody(), templateWidget );
}
}
}
/**
* Creates the editor widget associated with the {@link TemplateWidget} object .
*
* @param parent
* the parent composite
* @param templateWidget
* the template widget
*/
private void createFormTemplateWidget( Composite parent, TemplateWidget templateWidget )
{
// The widget composite
Composite widgetComposite = null;
// Creating the widget according to its type
if ( templateWidget instanceof TemplateCheckbox )
{
// Creating the editor checkbox
EditorCheckbox editorCheckbox = new EditorCheckbox( getEditor(), ( TemplateCheckbox ) templateWidget,
getToolkit() );
editorWidgets.put( templateWidget, editorCheckbox );
// Creating the UI
widgetComposite = editorCheckbox.createWidget( parent );
}
else if ( templateWidget instanceof TemplateComposite )
{
// Creating the editor composite
EditorComposite editorComposite = new EditorComposite( getEditor(), ( TemplateComposite ) templateWidget,
getToolkit() );
editorWidgets.put( templateWidget, editorComposite );
// Creating the UI
widgetComposite = editorComposite.createWidget( parent );
}
else if ( templateWidget instanceof TemplateDate )
{
// Creating the editor date
EditorDate editorDate = new EditorDate( getEditor(), ( TemplateDate ) templateWidget, getToolkit() );
editorWidgets.put( templateWidget, editorDate );
// Creating the UI
widgetComposite = editorDate.createWidget( parent );
}
else if ( templateWidget instanceof TemplateFileChooser )
{
// Creating the editor file chooser
EditorFileChooser editorFileChooser = new EditorFileChooser( getEditor(),
( TemplateFileChooser ) templateWidget, getToolkit() );
editorWidgets.put( templateWidget, editorFileChooser );
// Creating the UI
widgetComposite = editorFileChooser.createWidget( parent );
}
else if ( templateWidget instanceof TemplateImage )
{
// Creating the editor image
EditorImage editorImage = new EditorImage( getEditor(), ( TemplateImage ) templateWidget, getToolkit() );
editorWidgets.put( templateWidget, editorImage );
// Creating the UI
widgetComposite = editorImage.createWidget( parent );
}
else if ( templateWidget instanceof TemplateLabel )
{
// Creating the editor label
EditorLabel editorLabel = new EditorLabel( getEditor(), ( TemplateLabel ) templateWidget, getToolkit() );
editorWidgets.put( templateWidget, editorLabel );
// Creating the UI
widgetComposite = editorLabel.createWidget( parent );
}
else if ( templateWidget instanceof TemplateLink )
{
// Creating the editor link
EditorLink editorLink = new EditorLink( getEditor(), ( TemplateLink ) templateWidget, getToolkit() );
editorWidgets.put( templateWidget, editorLink );
// Creating the UI
widgetComposite = editorLink.createWidget( parent );
}
else if ( templateWidget instanceof TemplateListbox )
{
// Creating the editor link
EditorListbox editorListbox = new EditorListbox( getEditor(), ( TemplateListbox ) templateWidget,
getToolkit() );
editorWidgets.put( templateWidget, editorListbox );
// Creating the UI
widgetComposite = editorListbox.createWidget( parent );
}
else if ( templateWidget instanceof TemplatePassword )
{
// Creating the editor password
EditorPassword editorPassword = new EditorPassword( getEditor(), ( TemplatePassword ) templateWidget,
getToolkit() );
editorWidgets.put( templateWidget, editorPassword );
// Creating the UI
widgetComposite = editorPassword.createWidget( parent );
}
else if ( templateWidget instanceof TemplateRadioButtons )
{
// Creating the editor radio buttons
EditorRadioButtons editorRadioButtons = new EditorRadioButtons( getEditor(),
( TemplateRadioButtons ) templateWidget, getToolkit() );
editorWidgets.put( templateWidget, editorRadioButtons );
// Creating the UI
widgetComposite = editorRadioButtons.createWidget( parent );
}
else if ( templateWidget instanceof TemplateSection )
{
// Creating the editor section
EditorSection editorSection = new EditorSection( getEditor(), ( TemplateSection ) templateWidget,
getToolkit() );
editorWidgets.put( templateWidget, editorSection );
// Creating the UI
widgetComposite = editorSection.createWidget( parent );
}
else if ( templateWidget instanceof TemplateSpinner )
{
// Creating the editor spinner
EditorSpinner editorSpinner = new EditorSpinner( getEditor(), ( TemplateSpinner ) templateWidget,
getToolkit() );
editorWidgets.put( templateWidget, editorSpinner );
// Creating the UI
widgetComposite = editorSpinner.createWidget( parent );
}
else if ( templateWidget instanceof TemplateTable )
{
// Creating the editor table
EditorTable editorTable = new EditorTable( getEditor(), ( TemplateTable ) templateWidget, getToolkit() );
editorWidgets.put( templateWidget, editorTable );
// Creating the UI
widgetComposite = editorTable.createWidget( parent );
}
else if ( templateWidget instanceof TemplateTextField )
{
// Creating the editor text field
EditorTextField editorTextField = new EditorTextField( getEditor(), ( TemplateTextField ) templateWidget,
getToolkit() );
editorWidgets.put( templateWidget, editorTextField );
// Creating the UI
widgetComposite = editorTextField.createWidget( parent );
}
// Recursively looping on children
if ( templateWidget.hasChildren() )
{
for ( TemplateWidget templateWidgetChild : templateWidget.getChildren() )
{
createFormTemplateWidget( widgetComposite, templateWidgetChild );
}
}
}
/**
* Creates the form UI in case where no entry is selected.
*/
private void createFormContentNoEntrySelected()
{
// Displaying an error message
form.setText( Messages.getString( "TemplateEditorWidget.NoEntrySelected" ) ); //$NON-NLS-1$
}
/**
* Creates the form UI in case where no template is matching.
*/
private void createFormContentNoTemplateMatching()
{
// Displaying an error message
form.setText( Messages.getString( "TemplateEditorWidget.NoTemplateIsMatchingThisEntry" ) ); //$NON-NLS-1$
}
/**
* Gets the {@link FormToolkit} associated with the editor page.
*
* @return
* the {@link FormToolkit} associated with the editor page
*/
public FormToolkit getToolkit()
{
return toolkit;
}
/**
* {@inheritDoc}
*/
public void dispose()
{
//
// Disposing the toolkit, form and widgets
//
// Toolkit
if ( toolkit != null )
{
toolkit.dispose();
}
// Form
if ( ( form != null ) && ( !form.isDisposed() ) )
{
form.dispose();
}
// Widgets
for ( TemplateWidget key : editorWidgets.keySet() )
{
EditorWidget<?> widget = editorWidgets.get( key );
widget.dispose();
}
}
/**
* {@inheritDoc}
*/
public void update()
{
if ( isInitialized() )
{
// Updating widgets
for ( TemplateWidget key : editorWidgets.keySet() )
{
EditorWidget<?> widget = editorWidgets.get( key );
widget.update();
}
}
}
/**
* {@inheritDoc}
*/
public void setFocus()
{
if ( ( form != null ) && ( !form.isDisposed() ) )
{
form.setFocus();
}
}
/**
* {@inheritDoc}
*/
public void editorInputChanged()
{
if ( isInitialized() )
{
// Resetting the template
selectedTemplate = null;
// Updating the UI
disposeAndRecreateUI();
}
}
/**
* Gets the {@link List} of templates matching the current entry.
*
* @return
* the {@link List} of templates matching the current entry
*/
public List<Template> getMatchingTemplates()
{
return EntryTemplatePluginUtils.getMatchingTemplates( getEditor().getEntryEditorInput().getSharedWorkingCopy(
getEditor() ) );
}
/**
* Gets the selected template.
*
* @return
* the selected template
*/
public Template getSelectedTemplate()
{
return selectedTemplate;
}
/**
* Displays the entry with the given template.
*
* @param selectedTemplate
* the selected template
*/
public void switchTemplate( Template selectedTemplate )
{
// Assigning the selected template
this.selectedTemplate = selectedTemplate;
// Updating the UI
disposeAndRecreateUI();
}
/**
* Disposes and re-creates the UI (if the editor page has been initialized).
*/
private void disposeAndRecreateUI()
{
if ( isInitialized() )
{
// Disposing the previously created form
if ( ( form != null ) && ( !form.isDisposed() ) )
{
// Disposing the from (and all it's children elements
form.dispose();
// Disposing template widgets
for ( TemplateWidget key : editorWidgets.keySet() )
{
EditorWidget<?> widget = editorWidgets.get( key );
widget.dispose();
}
}
// Clearing all previously created editor widgets (which are now disposed)
editorWidgets.clear();
// Recreating the UI
init( parent );
}
}
/**
* Gets the associated {@link Form}.
*
* @return
* the associated {@link Form}
*/
public ScrolledForm getForm()
{
return form;
}
/**
* Indicated if the widget has been initialized.
*
* @return
* <code>true</code> if the widget has been initialized,
* <code>false</code> if not
*/
public boolean isInitialized()
{
return initialized;
}
}