package org.eurocarbdb.application.glycoworkbench; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.eurocarbdb.application.glycanbuilder.Context; import org.pushingpixels.flamingo.api.ribbon.JRibbon; import org.pushingpixels.flamingo.api.ribbon.RibbonContextualTaskGroup; import org.pushingpixels.flamingo.api.ribbon.RibbonTask; public class RibbonManager { public enum RibbonTaskChangeState { SET_TO_DEFAULT_BAND, CURRENT_BAND_SUPPORTS_CONTEXT, NO_BAND_SUPPORTS_CONTEXT; } protected Map<Context,RibbonTask> defaultContextRibbonTask; protected Map<RibbonTask,Set<Context>> ribbonTaskContextSupport; protected JRibbon jRibbon; protected RibbonTask enabledTask; protected RibbonTask lastTask; protected Context defaultContext; public void setDefaultContext(Context context){ defaultContext=context; } public RibbonManager(JRibbon _jRibbon){ jRibbon=_jRibbon; defaultContextRibbonTask=new HashMap<Context,RibbonTask>(); ribbonTaskContextSupport=new HashMap<RibbonTask,Set<Context>>(); } public void setRibbonAsDefault(RibbonTask ribbonTask,Context context){ defaultContextRibbonTask.put(context, ribbonTask); } public void registerContextSupport(RibbonTask ribbonTask,Set<Context> contexts){ ribbonTaskContextSupport.put(ribbonTask, contexts); } public RibbonTaskChangeState setCurrentContext(Context context,boolean switchToDefault){ synchronized(jRibbon){ setAllAssociatedTasksVisible(context,true); Set<Context> contexts=getRibbonTaskContexts(jRibbon.getSelectedTask()); if(contexts==null || !contexts.contains(context)){ RibbonTask defaultRibbonTask=defaultContextRibbonTask.get(context); if(defaultRibbonTask !=null ){ lastTask=jRibbon.getSelectedTask(); enabledTask=defaultRibbonTask; if(switchToDefault){ jRibbon.setSelectedTask(defaultRibbonTask); } return RibbonTaskChangeState.SET_TO_DEFAULT_BAND; }else{ return RibbonTaskChangeState.NO_BAND_SUPPORTS_CONTEXT; } }else{ return RibbonTaskChangeState.CURRENT_BAND_SUPPORTS_CONTEXT; } } } public void setAllAssociatedTasksVisible(Context context,boolean visible){ synchronized(jRibbon){ boolean rememberLast=false; for(RibbonTask ribbonTask:ribbonTaskContextSupport.keySet()){ if(ribbonTaskContextSupport.get(ribbonTask).contains(context)){ RibbonContextualTaskGroup group=ribbonTask.getContextualGroup(); if(group!=null){ if(jRibbon.isVisible(group)!=visible){ if(visible){ rememberLast=true; } jRibbon.setVisible(group, visible); } } } } if(rememberLast){ lastTask=jRibbon.getSelectedTask(); } } } public void undoContextChange(Context context){ synchronized(jRibbon){ RibbonTask selectedTask=jRibbon.getSelectedTask(); if(enabledTask!=null){ RibbonContextualTaskGroup group=enabledTask.getContextualGroup(); if(group!=null){ for(int i=0;i<group.getTaskCount();i++){ RibbonTask taskOnGroup=group.getTask(i); if(taskOnGroup==selectedTask){ jRibbon.setSelectedTask(lastTask); break; } } } } setAllAssociatedTasksVisible(context, false); } } public Set<Context> getRibbonTaskContexts(RibbonTask task){ return ribbonTaskContextSupport.get(task); } }