You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
513 lines
14 KiB
513 lines
14 KiB
package com.fr.design.menu; |
|
|
|
import com.fr.base.svg.IconUtils; |
|
import com.fr.design.file.HistoryTemplateListCache; |
|
import com.fr.design.gui.ibutton.UIButton; |
|
import com.fr.design.gui.imenu.UIHeadMenu; |
|
import com.fr.design.gui.imenu.UIMenu; |
|
import com.fr.design.gui.imenu.UIPopupEastAttrMenu; |
|
import com.fr.design.gui.imenu.UIPopupMenu; |
|
import com.fr.design.gui.imenu.UIScrollMenu; |
|
import com.fr.design.gui.iscrollbar.UIScrollBar; |
|
import com.fr.design.i18n.Toolkit; |
|
import com.fr.design.mainframe.JTemplate; |
|
import com.fr.design.utils.gui.GUICoreUtils; |
|
import com.fr.stable.StringUtils; |
|
|
|
import javax.swing.JMenu; |
|
import javax.swing.JPopupMenu; |
|
import javax.swing.JToolBar; |
|
import javax.swing.event.MenuEvent; |
|
import javax.swing.event.MenuListener; |
|
import java.awt.Component; |
|
import java.awt.Dimension; |
|
import java.awt.event.ContainerListener; |
|
import java.awt.event.MouseAdapter; |
|
import java.awt.event.MouseEvent; |
|
import java.awt.event.MouseListener; |
|
import java.util.ArrayList; |
|
import java.util.HashSet; |
|
import java.util.List; |
|
import java.util.Set; |
|
|
|
/** |
|
* Define Menu. |
|
*/ |
|
public class MenuDef extends ShortCut { |
|
|
|
private static final int MENU_DEFAULTWDITH = 156; |
|
private static final int BLANK_WIDTH = 30; |
|
|
|
private static final Set<String> FORBIDDEN_SET = new HashSet<>(); |
|
|
|
{ |
|
FORBIDDEN_SET.add(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_M_Template")); |
|
FORBIDDEN_SET.add(Toolkit.i18nText("Fine-Design_Report_M_Insert")); |
|
FORBIDDEN_SET.add(Toolkit.i18nText("Fine-Design_Basic_Action_Add")); |
|
FORBIDDEN_SET.add(KeySetUtils.CELL.getMenuKeySetName()); |
|
FORBIDDEN_SET.add(KeySetUtils.INSERT_FLOAT.getMenuKeySetName()); |
|
} |
|
|
|
protected String name; |
|
//右侧属性表弹出框重绘 |
|
protected Boolean isEastAttr = false; |
|
protected char mnemonic; |
|
protected String iconPath; |
|
private boolean needDisabled; |
|
protected String tooltip; |
|
//item List. |
|
private List<ShortCut> shortcutList = new ArrayList<ShortCut>(); |
|
// peter:产生的JMenu, UIButton以及enabled变量都是为由MenuDef产生的控件所用的 |
|
protected boolean enabled = true; |
|
protected UIMenu createdJMenu; |
|
protected UIButton createdButton; |
|
protected JPopupMenu popupMenu; |
|
protected boolean hasScrollSubMenu; |
|
protected boolean isHeadMenu; |
|
|
|
private String anchor; |
|
|
|
public MenuDef() { |
|
} |
|
|
|
public MenuDef(String name) { |
|
this.setName(name); |
|
} |
|
|
|
public MenuDef(Boolean rePaint) { |
|
this.setRePaint(rePaint); |
|
} |
|
|
|
public MenuDef(String name, char mnemonic) { |
|
this.setName(name); |
|
this.setMnemonic(mnemonic); |
|
} |
|
|
|
public String getName() { |
|
return name; |
|
} |
|
|
|
public void setName(String name) { |
|
this.name = name; |
|
} |
|
|
|
public boolean getRePaint() { |
|
return isEastAttr; |
|
} |
|
|
|
public void setRePaint(boolean rePaint) { |
|
this.isEastAttr = rePaint; |
|
} |
|
|
|
public char getMnemonic() { |
|
return mnemonic; |
|
} |
|
|
|
public void setMnemonic(char mnemonic) { |
|
this.mnemonic = mnemonic; |
|
} |
|
|
|
public void setHasScrollSubMenu(boolean scrollSubMenu) { |
|
this.hasScrollSubMenu = scrollSubMenu; |
|
} |
|
|
|
public void setHasRecMenu(boolean headMenu) { |
|
this.isHeadMenu = headMenu; |
|
} |
|
|
|
public String getIconPath() { |
|
return iconPath; |
|
} |
|
|
|
public void setIconPath(String iconPath) { |
|
setDisabledIcon(iconPath, false); |
|
} |
|
|
|
/** |
|
* 设置不可用图标时,注意传递路径问题,若路径为"view_normal.svg",请传递"view",不带后缀 |
|
* 读取disable图标的文件名应当为"xxx_disabled.svg",也是项目中的svg命名规范 |
|
* 注意必须是svg图标路径才能使用此函数设置正常和禁用状态 |
|
* |
|
* */ |
|
public void setDisabledIcon(String iconPath, boolean needDisabled) { |
|
this.iconPath = iconPath; |
|
this.needDisabled = needDisabled; |
|
} |
|
public int getShortCutCount() { |
|
return this.shortcutList.size(); |
|
} |
|
|
|
public ShortCut getShortCut(int index) { |
|
return this.shortcutList.get(index); |
|
} |
|
|
|
public String getAnchor() { |
|
return anchor == null ? StringUtils.EMPTY : anchor; |
|
} |
|
|
|
public void setAnchor(String anchor) { |
|
this.anchor = anchor; |
|
} |
|
|
|
public List<ShortCut> getShortcutList() { |
|
return this.shortcutList; |
|
} |
|
|
|
/** |
|
* 插入菜单项 |
|
* |
|
* @param index 插入的位置 |
|
* @param shortCut 菜单信息 |
|
*/ |
|
public void insertShortCut(int index, ShortCut shortCut) { |
|
int size = this.shortcutList.size(); |
|
index = Math.min(index, size); |
|
this.shortcutList.add(index, shortCut); |
|
} |
|
|
|
/** |
|
* 用可变参数,方便添加数组 |
|
* |
|
* @param shortcut 参数 存储菜单项信息 |
|
*/ |
|
public void addShortCut(ShortCut... shortcut) { |
|
for (ShortCut i : shortcut) { |
|
addShortCut(i); |
|
} |
|
} |
|
|
|
public void addShortCut(ShortCut shortCut) { |
|
this.shortcutList.add(shortCut); |
|
} |
|
|
|
public void removeShortCut(ShortCut shortCut) { |
|
|
|
this.shortcutList.remove(shortCut); |
|
} |
|
|
|
/** |
|
* 清理 |
|
*/ |
|
public void clearShortCuts() { |
|
this.shortcutList.clear(); |
|
} |
|
|
|
/** |
|
* 生成UIButton |
|
* |
|
* @return 菜单按钮 |
|
*/ |
|
public UIButton createUIButton() { |
|
if (createdButton == null) { |
|
if (iconPath != null) { |
|
createdButton = new UIButton(IconUtils.readIcon(iconPath)); |
|
if(needDisabled) { |
|
createdButton.setDisabledIcon(IconUtils.readIcon(iconPath + IconUtils.ICON_TYPE_DISABLED)); |
|
} |
|
createdButton.set4ToolbarButton(); |
|
} else { |
|
createdButton = new UIButton(name); |
|
} |
|
// 添加名字以作自动化测试 |
|
createdButton.setName(name); |
|
createdButton.setToolTipText(tooltip); |
|
createdButton.addMouseListener(mouseListener); |
|
} |
|
|
|
return createdButton; |
|
} |
|
|
|
public void setTooltip(String text) { |
|
this.tooltip = text; |
|
} |
|
|
|
/** |
|
* 生成JMenu |
|
* |
|
* @return 菜单 |
|
*/ |
|
public UIMenu createJMenu() { |
|
if (createdJMenu == null) { |
|
createdJMenu = createJMenu0(); |
|
createdJMenu.setMnemonic(this.getMnemonic()); |
|
if (this.iconPath != null) { |
|
createdJMenu.setIcon(IconUtils.readIcon(iconPath)); |
|
} |
|
MenuListener menuListener = createMenuListener(); |
|
createdJMenu.addMenuListener(menuListener); |
|
ContainerListener listener = getContainerListener(); |
|
if (listener != null) { |
|
createdJMenu.getPopupMenu().addContainerListener(listener); |
|
} |
|
} |
|
|
|
return createdJMenu; |
|
} |
|
|
|
protected UIMenu createJMenu0() { |
|
|
|
UIMenu createdJMenu; |
|
if (hasScrollSubMenu) { |
|
createdJMenu = new UIScrollMenu(this.getName()); |
|
} else if (isHeadMenu){ |
|
createdJMenu = new UIHeadMenu(this.getName()); |
|
} else { |
|
createdJMenu = new UIMenu(this.getName()); |
|
} |
|
return createdJMenu; |
|
} |
|
|
|
protected ContainerListener getContainerListener() { |
|
return null; |
|
} |
|
|
|
/** |
|
* 生成 JPopupMenu |
|
* |
|
* @return 弹出菜单 |
|
*/ |
|
public JPopupMenu createJPopupMenu() { |
|
UIMenu menu = createJMenu(); |
|
updateMenu(); |
|
return menu.getPopupMenu(); |
|
} |
|
|
|
/** |
|
* 设置是否可用 |
|
* |
|
* @param b 布尔型 |
|
*/ |
|
@Override |
|
public void setEnabled(boolean b) { |
|
this.enabled = b; |
|
|
|
if (createdButton != null) { |
|
createdButton.setEnabled(enabled); |
|
} |
|
|
|
if (createdJMenu != null) { |
|
createdJMenu.setEnabled(enabled); |
|
} |
|
} |
|
|
|
/** |
|
* 按钮状态 |
|
* |
|
* @return 状态 |
|
*/ |
|
@Override |
|
public boolean isEnabled() { |
|
return enabled; |
|
} |
|
|
|
/** |
|
* 更新菜单 |
|
*/ |
|
public void updateMenu() { |
|
//peter:这个方法用来产生JMenu的孩子控件,但是不update,action. |
|
this.updatePopupMenu(this.createJMenu().getPopupMenu()); |
|
|
|
//peter:需要设置JMenu的enabled属性. |
|
if (createdJMenu != null) { |
|
createdJMenu.setEnabled(createdJMenu.getPopupMenu().getComponentCount() > 0 && enabled); |
|
createdJMenu.repaint(10); |
|
} |
|
} |
|
|
|
public void updateEnable() { |
|
setEnabled(checkEnable()); |
|
} |
|
|
|
/** |
|
* 更新菜单 |
|
* |
|
* @param popupMenu 菜单 |
|
*/ |
|
protected void updatePopupMenu(JPopupMenu popupMenu) { |
|
removeComponent(popupMenu); |
|
this.popupMenu = popupMenu; |
|
// 一开始是不能插入分隔符的 |
|
boolean nec_seperator = false; |
|
boolean isFirstItem = true; |
|
int actionCount = this.getShortCutCount(); |
|
for (int i = 0; i < actionCount; i++) { |
|
ShortCut shortcut = this.getShortCut(i); |
|
|
|
// 如果shortcut是SeparatorDef,先不加,先标记一下nec_seperator为true,等下一个shortcut需要加到PopupMenu时再加 |
|
if (shortcut instanceof SeparatorDef) { |
|
nec_seperator = true; |
|
continue; |
|
} |
|
if (nec_seperator) { |
|
if (!isFirstItem) { |
|
SeparatorDef.DEFAULT.intoJPopupMenu(popupMenu); |
|
} |
|
nec_seperator = false; |
|
} |
|
|
|
shortcut.intoJPopupMenu(popupMenu); |
|
isFirstItem = false; |
|
} |
|
|
|
if (createdJMenu != null && createdJMenu.getPopupMenu() != null) { |
|
setEnabled(createdJMenu.getPopupMenu().getComponentCount() > 0 && enabled); |
|
} |
|
} |
|
|
|
/** |
|
* 更新右侧属性面板菜单 |
|
* |
|
* @param popupMenu 菜单 |
|
*/ |
|
protected void updateEastPopupMenu(JPopupMenu popupMenu) { |
|
removeComponent(popupMenu); |
|
this.popupMenu = popupMenu; |
|
// 一开始是不能插入分隔符的 |
|
boolean nec_seperator = false; |
|
boolean isFirstItem = true; |
|
int actionCount = this.getShortCutCount(); |
|
for (int i = 0; i < actionCount; i++) { |
|
ShortCut shortcut = this.getShortCut(i); |
|
|
|
// 如果shortcut是SeparatorDef,先不加,先标记一下nec_seperator为true,等下一个shortcut需要加到PopupMenu时再加 |
|
if (shortcut instanceof SeparatorDef) { |
|
nec_seperator = true; |
|
continue; |
|
} |
|
if (nec_seperator) { |
|
if (!isFirstItem) { |
|
SeparatorDef.DEFAULT.intoJPopupMenu(popupMenu); |
|
} |
|
nec_seperator = false; |
|
} |
|
shortcut.intoJPopupMenu(popupMenu); |
|
isFirstItem = false; |
|
} |
|
|
|
if (createdJMenu != null && createdJMenu.getPopupMenu() != null) { |
|
setEnabled(createdJMenu.getPopupMenu().getComponentCount() > 0 && enabled); |
|
} |
|
} |
|
|
|
/** |
|
* 删除所有组件 除了滚动条 |
|
* |
|
* @param popupMenu 菜单 |
|
*/ |
|
public void removeComponent(JPopupMenu popupMenu) { |
|
UIScrollBar uiScrollBar = new UIScrollBar(); |
|
if (hasScrollSubMenu) { |
|
for (Component comp : popupMenu.getComponents()) { |
|
if (comp instanceof UIScrollBar) { |
|
uiScrollBar = (UIScrollBar) comp; |
|
} |
|
} |
|
} |
|
popupMenu.removeAll(); |
|
if (hasScrollSubMenu) { |
|
popupMenu.add(uiScrollBar); |
|
} |
|
} |
|
|
|
/** |
|
* 添加菜单项 |
|
* |
|
* @param menu 菜单 |
|
*/ |
|
@Override |
|
public void intoJPopupMenu(JPopupMenu menu) { |
|
updateMenu(); |
|
|
|
menu.add(this.createJMenu()); |
|
} |
|
|
|
/** |
|
* 添加 |
|
* |
|
* @param toolBar 菜单条 |
|
*/ |
|
@Override |
|
public void intoJToolBar(JToolBar toolBar) { |
|
toolBar.add(this.createUIButton()); |
|
} |
|
|
|
private boolean checkEnable() { |
|
if (FORBIDDEN_SET.contains(this.getName())) { |
|
JTemplate<?, ?> template = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate(); |
|
boolean flag = true; |
|
if (template != null) { |
|
flag = template.checkEnable(); |
|
} |
|
if (!flag) { |
|
return false; |
|
} |
|
} |
|
return true; |
|
} |
|
|
|
protected MenuListener createMenuListener() { |
|
|
|
return menuDefListener; |
|
} |
|
|
|
private MenuListener menuDefListener = new MenuListener() { |
|
|
|
@Override |
|
public void menuCanceled(MenuEvent evt) { |
|
} |
|
|
|
@Override |
|
public void menuDeselected(MenuEvent evt) { |
|
} |
|
|
|
@Override |
|
public void menuSelected(MenuEvent evt) { |
|
Object source = evt.getSource(); |
|
if (!(source instanceof JMenu)) { |
|
return; |
|
} |
|
MenuDef.this.updateMenu(); |
|
} |
|
}; |
|
private MouseListener mouseListener = new MouseAdapter() { |
|
|
|
@Override |
|
public void mouseReleased(MouseEvent evt) { |
|
Object source = evt.getSource(); |
|
UIButton button = (UIButton) source; |
|
if (!button.isEnabled()) { |
|
return; |
|
} |
|
if (isEastAttr) { |
|
popupMenu = new UIPopupEastAttrMenu(); |
|
popupMenu.setInvoker(button); |
|
MenuDef.this.updateEastPopupMenu(popupMenu); |
|
updatePopupMenuSize(); |
|
GUICoreUtils.showPopupMenu(popupMenu, button, 0, button.getSize().height); |
|
} else { |
|
popupMenu = new UIPopupMenu(); |
|
popupMenu.setInvoker(button); |
|
MenuDef.this.updatePopupMenu(popupMenu); |
|
GUICoreUtils.showPopupMenu(popupMenu, button, 0, button.getSize().height); |
|
} |
|
} |
|
}; |
|
|
|
private void updatePopupMenuSize() { |
|
int preferredWidth = popupMenu.getPreferredSize().width - BLANK_WIDTH; // 减少行尾的空白部分 |
|
int popupMenuWidth = preferredWidth > MENU_DEFAULTWDITH ? preferredWidth : MENU_DEFAULTWDITH; |
|
popupMenu.setPopupSize(new Dimension(popupMenuWidth, popupMenu.getPreferredSize().height)); |
|
} |
|
|
|
|
|
//ben: for ui test |
|
public JPopupMenu getPopupMenu() { |
|
return popupMenu; |
|
} |
|
|
|
public void setPopupMenu(JPopupMenu popupMenu) { |
|
this.popupMenu = popupMenu; |
|
} |
|
|
|
|
|
}
|
|
|