/*
* 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.actions;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.action.Separator;
import org.apache.directory.studio.templateeditor.EntryTemplatePlugin;
import org.apache.directory.studio.templateeditor.EntryTemplatePluginConstants;
import org.apache.directory.studio.templateeditor.editor.TemplateEditorWidget;
import org.apache.directory.studio.templateeditor.model.Template;
/**
* This class implements the menu manager which is used in the Template Editor to
* allow to switch templates and open preferences.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public class DisplayEntryInTemplateMenuManager extends MenuManager implements IMenuListener
{
/** The associated {@link TemplateEditorWidget} */
private TemplateEditorWidget templateEditorPage;
/**
* Creates a new instance of DisplayEntryInTemplateMenuManager.
*
* @param templateEditorPage
* the associated editor page
*/
public DisplayEntryInTemplateMenuManager( TemplateEditorWidget templateEditorPage )
{
super(
Messages.getString( "DisplayEntryInTemplateMenuManager.DiplayEntryIn" ), EntryTemplatePlugin.getDefault().getImageDescriptor( //$NON-NLS-1$
EntryTemplatePluginConstants.IMG_SWITCH_TEMPLATE ), null );
addMenuListener( this );
this.templateEditorPage = templateEditorPage;
}
/**
* {@inheritDoc}
*/
public void menuAboutToShow( IMenuManager manager )
{
fillInMenuManager( manager, templateEditorPage );
}
/**
* {@inheritDoc}
*/
public boolean isVisible()
{
return true;
}
/**
* {@inheritDoc}
*/
public boolean isDynamic()
{
return true;
}
/**
* Fill the menu manager in with one menu item for each available template.
*
* @param menuManager
* the menu manager
* @param templateEditorWidget
* the associated editor widget
*/
protected static void fillInMenuManager( IMenuManager menuManager, TemplateEditorWidget templateEditorWidget )
{
// Getting the matching templates and currently selected one from the editor page
List<Template> matchingTemplates = new ArrayList<Template>( templateEditorWidget.getMatchingTemplates() );
Template selectedTemplate = templateEditorWidget.getSelectedTemplate();
// Sorting the list of matching templates by their title
Collections.sort( matchingTemplates, new Comparator<Template>()
{
public int compare( Template o1, Template o2 )
{
if ( ( o1 == null ) && ( o2 == null ) )
{
return 0;
}
else if ( ( o1 != null ) && ( o2 == null ) )
{
return 1;
}
else if ( ( o1 == null ) && ( o2 != null ) )
{
return -1;
}
else if ( ( o1 != null ) && ( o2 != null ) )
{
String title1 = o1.getTitle();
String title2 = o2.getTitle();
if ( ( title1 == null ) && ( title2 == null ) )
{
return 0;
}
else if ( ( title1 != null ) && ( title2 == null ) )
{
return 1;
}
else if ( ( title1 == null ) && ( title2 != null ) )
{
return -1;
}
else if ( ( title1 != null ) && ( title2 != null ) )
{
return title1.compareTo( title2 );
}
}
return 0;
};
} );
// As the Menu Manager is dynamic, we need to
// remove all the previously added actions
menuManager.removeAll();
if ( ( matchingTemplates != null ) && ( matchingTemplates.size() > 0 ) )
{
// Looping on the matching templates and creating an action for each one
for ( Template matchingTemplate : matchingTemplates )
{
// Creating the action associated with the entry editor
menuManager.add( createAction( templateEditorWidget, matchingTemplate, ( matchingTemplate
.equals( selectedTemplate ) ) ) );
}
}
else
{
// Creating a action that will be disabled when no template is available
Action noTemplateAction = new Action(
Messages.getString( "DisplayEntryInTemplateMenuManager.NoTemplate" ), Action.AS_CHECK_BOX ) //$NON-NLS-1$
{
};
noTemplateAction.setEnabled( false );
menuManager.add( noTemplateAction );
}
// Separator
menuManager.add( new Separator() );
// Preferences Action
menuManager.add( new EntryTemplatePreferencePageAction() );
}
/**
* Created the action.
*
* @param templateEditorWidget
* the template editor widget
* @param template
* the template
* @param isChecked
* <code>true</code> if the action is checked,
* <code>false</code> if not
* @return
* the associated action
*/
private static IAction createAction( TemplateEditorWidget templateEditorWidget, Template template, boolean isChecked )
{
Action action = new SwitchTemplateAction( templateEditorWidget, template );
action.setChecked( isChecked );
return action;
}
}