⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ngmenu.java

📁 Novocode的 SWT 控件框架 丰富了MDI功能
💻 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 + -