📄 ngmenu.java
字号:
/*******************************************************************************
* Copyright (c) 2004 Stefan Zeiger 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.novocode.com/legal/epl-v10.html
*
* Contributors:
* Stefan Zeiger (szeiger@novocode.com) - initial API and implementation
*******************************************************************************/
package com.novocode.naf.gui;
import java.util.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.ToolBar;
import org.eclipse.swt.widgets.ToolItem;
import com.novocode.naf.app.*;
import com.novocode.naf.data.DataDecoder;
import com.novocode.naf.data.ModelBinding;
import com.novocode.naf.data.XMLProperty;
import com.novocode.naf.gui.event.ChangeEvent;
import com.novocode.naf.gui.event.IChangeListener;
import com.novocode.naf.model.DefaultItemListModel;
import com.novocode.naf.model.IItemListModel;
import com.novocode.naf.resource.NGComponent;
/**
* A menu.
*
* @author Stefan Zeiger (szeiger@novocode.com)
* @since Nov 24, 2003
*/
public final class NGMenu extends NGWidget implements IToolItemWidget, IMenuItemWidget
{
private String accelerator, text, imageResource;
@XMLProperty
public void setText(String s) { this.text = s; }
public String getText() { return text; }
@XMLProperty
public void setAccelerator(String s) { this.accelerator = s; }
public String getAccelerator() { return accelerator; }
@XMLProperty("image")
public void setImageResource(String s) { this.imageResource = s; }
public String getImageResource() { return imageResource; }
public ToolItem createToolItem(NGToolBar parentComp, final ToolBar bar, final ShellWindowInstance wi) throws NAFException
{
final ToolItem item = new ToolItem(bar, SWT.PUSH);
parentComp.addRegisteredImage(imageResource, item, wi.imageManager);
if(text != null) item.setText(DataDecoder.decodeAccessKey(text));
else if((bar.getStyle() & SWT.RIGHT) != 0) item.setText("");
IItemListModel itemsModel = getModel("items", wi.models);
final Menu[] menu = new Menu[1];
if(itemsModel != null)
{
final boolean[] dirty = new boolean[1];
final IChangeListener cl = new IChangeListener()
{
public void stateChanged(ChangeEvent e)
{
dirty[0] = true;
}
};
SWTUtil.registerModel(item, itemsModel, cl);
item.addListener(SWT.Selection, new Listener ()
{
public void handleEvent (Event event)
{
if(menu[0] == null || dirty[0])
{
dirty[0] = false;
if(menu[0] != null)
{
//System.out.println("Disposing of dynamic menu");
menu[0].dispose();
}
//System.out.println("Creating dynamic menu");
menu[0] = new Menu (wi.getShell(true), SWT.POP_UP);
addMenuChildren(menu[0], wi);
}
Rectangle rect = item.getBounds();
Point pt = bar.toDisplay(new Point(rect.x, rect.y + rect.height));
menu[0].setLocation(pt.x, pt.y);
menu[0].setVisible(true);
}
});
}
else // no dynamic items
{
menu[0] = new Menu (wi.getShell(true), SWT.POP_UP);
item.addListener(SWT.Selection, new Listener ()
{
public void handleEvent (Event event)
{
Rectangle rect = item.getBounds();
Point pt = bar.toDisplay(new Point(rect.x, rect.y + rect.height));
menu[0].setLocation(pt.x, pt.y);
menu[0].setVisible(true);
}
});
addMenuChildren(menu[0], wi);
}
item.addListener(SWT.Dispose, new Listener()
{
public void handleEvent(Event event)
{
if(menu[0] != null)
{
menu[0].dispose();
menu[0] = null;
}
}
});
//addModels(item, wi);
return item;
}
public Menu createMenuBar(Shell shell, final ShellWindowInstance wi) throws NAFException
{
IItemListModel itemsModel = getModel("items", wi.models);
final Menu mbar = new Menu(shell, SWT.BAR);
addMenuChildren(mbar, wi);
if(itemsModel != null)
{
final IChangeListener cl = new IChangeListener()
{
public void stateChanged(ChangeEvent e)
{
try
{
mbar.getParent().setRedraw(false);
// [TODO] React to ItemListModel for partial updates
for(MenuItem mi : mbar.getItems()) mi.dispose();
addMenuChildren(mbar, wi);
}
finally { mbar.getParent().setRedraw(true); }
}
};
SWTUtil.registerModel(mbar, itemsModel, cl);
}
return mbar;
}
public MenuItem createMenuItem(Menu parent, final WindowInstance wi) throws NAFException
{
MenuItem i = new MenuItem(parent, SWT.CASCADE);
addCommonMenuFeatures(i, wi, DataDecoder.decodeAccessKey(text), getAccelerator(), imageResource);
Menu menu = createMenu(wi, SWT.DROP_DOWN);
if(getModel("items", wi.models) == null && menu.getItemCount() == 0) i.setEnabled(false);
i.setMenu(menu);
return i;
}
public Menu createMenu(final WindowInstance wi, int menuStyle) throws NAFException
{
final Menu menu = new Menu(wi.getShell(true), menuStyle);
IItemListModel itemsModel = getModel("items", wi.models);
if(itemsModel != null)
{
final boolean[] dirty = { true };
final IChangeListener cl = new IChangeListener()
{
public void stateChanged(ChangeEvent e)
{
dirty[0] = true;
}
};
SWTUtil.registerModel(menu, itemsModel, cl);
menu.addListener(SWT.Show, new Listener()
{
public void handleEvent(Event event)
{
if(dirty[0])
{
//System.out.println("(Re)creating dynamic menu items");
dirty[0] = false;
for(MenuItem m : menu.getItems()) m.dispose();
addMenuChildren(menu, wi);
}
}
});
}
else addMenuChildren(menu, wi);
return menu;
}
private void addMenuChildren(Menu parent, WindowInstance wi)
{
ModelBinding itemsModelBinding = getModelBinding("items");
IItemListModel itemsModel = getModel("items", wi.models);
//System.out.println("itemsModel = "+itemsModel);
//System.out.println("itemsModelBinding.widgetListIdx = "+itemsModelBinding.widgetListIdx);
List<NGComponent> list = getUnexpandedChildren(null);
List<NGComponent> childList = new ArrayList<NGComponent>();
for(int i=0; i<=list.size(); i++)
{
if(itemsModel != null && itemsModelBinding.widgetListIdx == i)
{
NGComponent[] dynamicWidgets = itemsModel.getItems();
childList.clear();
//System.out.println("dynamicWidgets.length = "+dynamicWidgets.length);
for(int j=0; j<dynamicWidgets.length; j++) dynamicWidgets[j].expandSelf(childList);
//System.out.println("childList.size() = "+childList.size());
for(NGComponent ch : childList)
{
if(!(ch instanceof IMenuItemWidget))
throw new NAFException("Cannot create a menu item from a "+ch.getClass()+" object");
MenuItem item = ((IMenuItemWidget)ch).createMenuItem(parent, wi);
((NGWidget)ch).addModels(item, wi, this);
}
}
if(i != list.size())
{
childList.clear();
list.get(i).expandSelf(childList);
for(NGComponent ch : childList)
{
if(!(ch instanceof IMenuItemWidget))
throw new NAFException("Cannot create a menu item from a "+ch.getClass()+" object");
MenuItem item = ((IMenuItemWidget)ch).createMenuItem(parent, wi);
((NGWidget)ch).addModels(item, wi, this);
}
}
}
}
protected Object createDefaultModel(ModelBinding mb)
{
if("items".equals(mb.type)) return new DefaultItemListModel();
else return super.createDefaultModel(mb);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -