/*******************************************************************************
* Copyright © 2008, 2013 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.edt.ide.rui.visualeditor.internal.palette;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.eclipse.core.resources.IProject;
import org.eclipse.gef.palette.CombinedTemplateCreationEntry;
import org.eclipse.gef.palette.MarqueeToolEntry;
import org.eclipse.gef.palette.PaletteDrawer;
import org.eclipse.gef.palette.PaletteRoot;
import org.eclipse.gef.palette.SelectionToolEntry;
import org.eclipse.gef.palette.ToolEntry;
import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.jface.resource.ImageDescriptor;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.ui.IPartListener2;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartReference;
import org.eclipse.edt.ide.core.EDTCoreIDEPlugin;
import org.eclipse.edt.ide.rui.visualeditor.internal.editor.EvEditor;
import org.eclipse.edt.ide.rui.visualeditor.internal.nl.Messages;
import org.eclipse.edt.ide.rui.visualeditor.internal.util.BidiUtils;
import org.eclipse.edt.ide.rui.visualeditor.internal.widget.IWidgetDescriptorRegistryListener;
import org.eclipse.edt.ide.rui.visualeditor.internal.widget.WidgetCreationFactory;
import org.eclipse.edt.ide.rui.visualeditor.internal.widget.WidgetDescriptor;
import org.eclipse.edt.ide.rui.visualeditor.internal.widget.WidgetDescriptorGroup;
import org.eclipse.edt.ide.rui.visualeditor.internal.widget.WidgetDescriptorRegistry;
public class EvPaletteRoot extends PaletteRoot implements IWidgetDescriptorRegistryListener, IPropertyChangeListener{
protected Map _mapNodeTypeToImageDescriptor = new TreeMap();
protected static HashMap _paletteRootMap = new HashMap();
private IProject project = null;
//
public static EvPaletteRoot getInstance(IProject project) {
EvPaletteRoot _instance = null;
if (EvPaletteRoot._paletteRootMap.containsKey(project.getName())) {
_instance = (EvPaletteRoot)EvPaletteRoot._paletteRootMap.get(project.getName());
} else {
_instance = new EvPaletteRoot(project);
IPreferenceStore preferences = EDTCoreIDEPlugin.getPlugin().getPreferenceStore();
preferences.addPropertyChangeListener( _instance ); // IBMBIDI Append
EvPaletteRoot._paletteRootMap.put(project.getName(), _instance);
}
return _instance;
}
/**
* Returns an image descriptor given a node type ID.
*/
public static ImageDescriptor getImageDescriptorForNodeType( String strNodeTypeID ) {
Iterator iterRoot = EvPaletteRoot._paletteRootMap.values().iterator();
while (iterRoot.hasNext()){
EvPaletteRoot root = (EvPaletteRoot)iterRoot.next();
// Check for exact match: Project@@Package@@TypeName
//--------------------------------------------------
if( root._mapNodeTypeToImageDescriptor.containsKey( strNodeTypeID ) == true )
return (ImageDescriptor)root._mapNodeTypeToImageDescriptor.get( strNodeTypeID );
// Check for partial match: Package@@TypeName or TypeName
//-------------------------------------------------------
Set setKeys = root._mapNodeTypeToImageDescriptor.keySet();
Iterator iterKeys = setKeys.iterator();
while( iterKeys.hasNext() ){
String strNodeID = (String)iterKeys.next();
if( strNodeID.endsWith( strNodeTypeID ) == true ){
return (ImageDescriptor)root._mapNodeTypeToImageDescriptor.get( strNodeID );
}
}
}
return null;
}
/**
* Creating of multiple instances is prevented. Use the getInstance() method to obtain the singleton.
*/
private EvPaletteRoot(IProject project) {
super();
this.project = project;
// Listen for changes to the widget descriptor registry
///-----------------------------------------------------
WidgetDescriptorRegistry.getInstance(project).addWidgetDescriptorRegistryListener( this );
}
/**
*
*/
protected Object getPaletteItem( WidgetDescriptorGroup group ) {
String strGroupName = group.getName();
if(strGroupName == null){
return null;
}
String strGroupNameTranslated = translateGroupName( strGroupName );
PaletteDrawer drawer = new PaletteDrawer( strGroupNameTranslated );
ImageDescriptor smallIcon = group.getIconSmall();
ImageDescriptor largeIcon = group.getIconLarge();
drawer.setSmallIcon( smallIcon );
drawer.setLargeIcon( largeIcon );
drawer.setInitialState( PaletteDrawer.INITIAL_STATE_CLOSED );
List drawerEntries = new ArrayList();
ArrayList listWidgetDescriptors = group.getWidgetDescriptors();
// IBMBIDI Change Start
boolean isBidi = BidiUtils.isBidi();
for( int i = 0; i < listWidgetDescriptors.size(); i++ ) {
WidgetDescriptor widgetDescriptor = (WidgetDescriptor)listWidgetDescriptors.get( i );
CombinedTemplateCreationEntry groupElement = getPaletteEntry( widgetDescriptor );
if (isBidi || (!isBidi && !groupElement.getLabel().startsWith("BIDI")))
drawerEntries.add( groupElement );
}
// IBMBIDI Change End
if(drawerEntries.isEmpty()){
return null;
}else{
drawer.addAll( drawerEntries );
return drawer;
}
}
/**
*
*/
protected CombinedTemplateCreationEntry getPaletteEntry( WidgetDescriptor descriptor ) {
CombinedTemplateCreationEntry entry = null;
ImageDescriptor smallIcon = descriptor.getIconSmall();
ImageDescriptor largeIcon = descriptor.getIconLarge();
String strID = descriptor.getID();
String strLabel = (descriptor.getProvider() != null && descriptor.getProvider().length() != 0) ? descriptor.getLabel() + " (" + descriptor.getProvider() + ")" : descriptor.getLabel();
String strDescription = descriptor.getDescription();
entry = new EvPaletteCreationEntry( strLabel, strDescription, strID, WidgetCreationFactory.getInstance(), smallIcon, largeIcon, false );
_mapNodeTypeToImageDescriptor.put( strID, smallIcon );
return entry;
}
/**
* Translates a widget category into a translated name for presenting as a group label.
*/
protected String translateGroupName( String strGroupName ){
if( strGroupName == null )
return null;
if( strGroupName.equals( "EGL Widgets" ) == true )
return Messages.NL_EGL_Widgets;
return strGroupName;
}
/**
*
*/
public void updatePalette(){
List listPaletteDrawers = new ArrayList();
// Add selection and marquee tools to a Palette drawer
//----------------------------------------------------
if( false ) {
PaletteDrawer paletteDrawer = new PaletteDrawer( "Tools" );
// Selection tool
//---------------
ToolEntry tool = new SelectionToolEntry();
paletteDrawer.add( tool );
setDefaultEntry( tool );
// Marquee selection tool
//-----------------------
paletteDrawer.add( new MarqueeToolEntry() );
listPaletteDrawers.add( paletteDrawer );
}
// Add all other palette drawers
//------------------------------
WidgetDescriptorRegistry registry = WidgetDescriptorRegistry.getInstance(this.project);
Iterator iterGroups = registry.getDescriptorGroups();
while( iterGroups.hasNext() ) {
WidgetDescriptorGroup group = (WidgetDescriptorGroup)iterGroups.next();
Object objPaletteItem = getPaletteItem( group );
if( objPaletteItem instanceof PaletteDrawer == false )
continue;
PaletteDrawer drawer = (PaletteDrawer)objPaletteItem;
drawer.setInitialState( PaletteDrawer.INITIAL_STATE_PINNED_OPEN );
listPaletteDrawers.add( drawer );
}
// Add palette drawers to this palette container
//----------------------------------------------
setChildren( listPaletteDrawers );
}
/**
* Declared in IWidgetDescriptorRegistryListener.
* Called when the descriptor registry has changed.
*/
public void widgetDescriptorRegistryChanged() {
updatePalette();
}
// IBMBIDI Append Start
public void propertyChange(PropertyChangeEvent event) {
//TODO EDT BIDI
// if (EDTCoreIDEPlugin.BIDI_ENABLED_OPTION.equals(event.getProperty()))
// updatePalette();
}
// IBMBIDI Append End
}