/*
* Copyright 2011 Uwe Krueger.
*
* Licensed 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 com.mandelsoft.mand.tool.util;
import com.mandelsoft.util.upd.UpdateSource;
import java.awt.Component;
import javax.swing.JComponent;
import javax.swing.JMenu;
import javax.swing.JPopupMenu;
import com.mandelsoft.mand.QualifiedMandelName;
import com.mandelsoft.mand.tool.MandelListSelector;
import com.mandelsoft.mand.tool.MandelNameSelector;
import com.mandelsoft.mand.util.MandelList;
import com.mandelsoft.swing.UpdatableJMenu;
import com.mandelsoft.swing.UpdatableJPopupMenu;
import com.mandelsoft.util.upd.UpdatableObject;
import com.mandelsoft.util.upd.UpdateContext;
import javax.swing.JMenuItem;
/**
*
* @author Uwe Krüger
*/
public abstract class MandelContextMenuFactory {
private String name;
public MandelContextMenuFactory(String name)
{
this.name=name;
}
public String getName()
{
return name;
}
public void updateMenu(JComponent menu, Component comp)
{
Component[] comps;
if (menu instanceof JMenu) comps=((JMenu)menu).getMenuComponents();
else comps=menu.getComponents();
for (Component c:comps) {
if (c instanceof JMenuItem) updateItem((JMenuItem)c,comp);
}
}
protected void updateItem(JMenuItem item, Component comp)
{
}
public JPopupMenu createPopupMenu(Component comp, boolean generic)
{
JPopupMenu menu=new PopupMenuBase(comp);
_addItems(menu, comp, generic);
return menu;
}
public JMenu createMenu(Component comp, boolean generic)
{
JMenu menu=new MenuBase(comp);
_addItems(menu, comp, generic);
return menu;
}
public JPopupMenu createPopupMenu(Component comp, QualifiedMandelName name)
{
JPopupMenu menu=new MandelPopupMenu(comp,name);
_addItems(menu, comp, false);
return menu;
}
public JMenu createMenu(Component comp, QualifiedMandelName name)
{
JMenu menu=new MandelMenu(comp,name);
_addItems(menu, comp, false);
return menu;
}
public JPopupMenu createPopupMenu(Component comp, MandelNameSelector sel)
{
JPopupMenu menu=new MandelSelPopupMenu(comp,sel);
_addItems(menu, comp, true);
return menu;
}
public JMenu createMenu(Component comp, MandelNameSelector sel)
{
JMenu menu=new MandelSelMenu(comp,sel);
_addItems(menu, comp, true);
return menu;
}
public JPopupMenu createPopupMenu(Component comp, MandelListSelector sel)
{
JPopupMenu menu=new MandelListSelPopupMenu(comp,sel);
_addItems(menu, comp, true);
return menu;
}
public JMenu createMenu(Component comp, MandelListSelector sel)
{
JMenu menu=new MandelListSelMenu(comp,sel);
_addItems(menu, comp, true);
return menu;
}
protected void _addItems(JComponent menu, // common parent for JMenu and JPopupMenu
Component comp, boolean generic)
{
addItems(menu,comp,generic);
if (menu instanceof UpdatableObject) {
((UpdatableObject)menu).updateObject(null/*unused*/);
}
}
protected abstract void addItems(JComponent menu, Component comp,
boolean generic);
////////////////////////////////////////////////////////////////////////////
// item menu
////////////////////////////////////////////////////////////////////////////
protected class PopupMenuBase extends UpdatableJPopupMenu {
private Component comp;
public PopupMenuBase(Component comp)
{
super(MandelContextMenuFactory.this.getName());
this.comp=comp;
}
@Override
public void updateObject(UpdateContext ctx)
{
MandelContextMenuFactory.this.updateMenu(this, comp);
}
}
protected class MenuBase extends UpdatableJMenu {
private Component comp;
public MenuBase(Component comp)
{
super(MandelContextMenuFactory.this.getName());
this.comp=comp;
}
@Override
public void updateObject(UpdateContext ctx)
{
MandelContextMenuFactory.this.updateMenu(this, comp);
}
}
////////////////////////////////////////////////////////////////////////////
// direct name flavors
private class MandelPopupMenu extends PopupMenuBase
implements MandelNameSelector {
private QualifiedMandelName selected;
public MandelPopupMenu(Component comp, QualifiedMandelName name)
{
super(comp);
this.selected=name;
}
public QualifiedMandelName getSelectedMandelName()
{
return selected;
}
}
private class MandelMenu extends MenuBase
implements MandelNameSelector {
private QualifiedMandelName selected;
public MandelMenu(Component comp, QualifiedMandelName name)
{
super(comp);
selected=name;
}
public QualifiedMandelName getSelectedMandelName()
{
return selected;
}
}
////////////////////////////////////////////////////////////////////////////
// name selector flavors
private class MandelSelPopupMenu extends PopupMenuBase
implements MandelNameSelector {
private MandelNameSelector selector;
public MandelSelPopupMenu(Component comp, MandelNameSelector sel)
{
super(comp);
selector=sel;
}
public QualifiedMandelName getSelectedMandelName()
{
return selector.getSelectedMandelName();
}
}
private class MandelSelMenu extends MenuBase
implements MandelNameSelector {
private MandelNameSelector selector;
public MandelSelMenu(Component comp, MandelNameSelector sel)
{
super(comp);
selector=sel;
}
public QualifiedMandelName getSelectedMandelName()
{
return selector.getSelectedMandelName();
}
}
///////////////////////////////////////////////////////////////////////////
private class MandelListSelPopupMenu extends PopupMenuBase
implements MandelListSelector {
private MandelListSelector selector;
public MandelListSelPopupMenu(Component comp, MandelListSelector sel)
{
super(comp);
selector=sel;
}
public MandelList getSelectedMandelList()
{
return selector.getSelectedMandelList();
}
}
private class MandelListSelMenu extends MenuBase
implements MandelListSelector {
private MandelListSelector selector;
public MandelListSelMenu(Component comp, MandelListSelector sel)
{
super(comp);
selector=sel;
}
public MandelList getSelectedMandelList()
{
return selector.getSelectedMandelList();
}
}
}