diff --git a/designer/src/com/fr/design/actions/insert/flot/ChartFloatAction.java b/designer/src/com/fr/design/actions/insert/flot/ChartFloatAction.java index 8f20a1577..80ce31525 100644 --- a/designer/src/com/fr/design/actions/insert/flot/ChartFloatAction.java +++ b/designer/src/com/fr/design/actions/insert/flot/ChartFloatAction.java @@ -36,7 +36,7 @@ public class ChartFloatAction extends ElementCaseAction { public ChartFloatAction(ElementCasePane t) { super(t); this.setMenuKeySet(FLOAT_INSERT_CHART); - this.setName(getMenuKeySet().getMenuKeySetName() + "..."); + this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_insert/chart.png")); } diff --git a/designer/src/com/fr/design/actions/insert/flot/FormulaFloatAction.java b/designer/src/com/fr/design/actions/insert/flot/FormulaFloatAction.java index de7cbe582..82536e887 100644 --- a/designer/src/com/fr/design/actions/insert/flot/FormulaFloatAction.java +++ b/designer/src/com/fr/design/actions/insert/flot/FormulaFloatAction.java @@ -27,7 +27,7 @@ public class FormulaFloatAction extends AbstractShapeAction { public FormulaFloatAction(ElementCasePane t) { super(t); this.setMenuKeySet(FLOAT_INSERT_FORMULA); - this.setName(getMenuKeySet().getMenuKeySetName() + "..."); + this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_insert/formula.png")); } diff --git a/designer/src/com/fr/design/actions/insert/flot/ImageFloatAction.java b/designer/src/com/fr/design/actions/insert/flot/ImageFloatAction.java index 8814936cd..78b408347 100644 --- a/designer/src/com/fr/design/actions/insert/flot/ImageFloatAction.java +++ b/designer/src/com/fr/design/actions/insert/flot/ImageFloatAction.java @@ -34,7 +34,7 @@ public class ImageFloatAction extends ElementCaseAction { public ImageFloatAction(ElementCasePane t) { super(t); this.setMenuKeySet(FLOAT_INSERT_IMAGE); - this.setName(getMenuKeySet().getMenuKeySetName() + "..."); + this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_insert/image.png")); } diff --git a/designer/src/com/fr/design/actions/insert/flot/TextBoxFloatAction.java b/designer/src/com/fr/design/actions/insert/flot/TextBoxFloatAction.java index 3f0be1c56..9548db51c 100644 --- a/designer/src/com/fr/design/actions/insert/flot/TextBoxFloatAction.java +++ b/designer/src/com/fr/design/actions/insert/flot/TextBoxFloatAction.java @@ -26,7 +26,7 @@ public class TextBoxFloatAction extends AbstractShapeAction { public TextBoxFloatAction(ElementCasePane t) { super(t); this.setMenuKeySet(FLOAT_INSERT_TEXT); - this.setName(getMenuKeySet().getMenuKeySetName() + "..."); + this.setName(getMenuKeySet().getMenuKeySetName()); this.setMnemonic(getMenuKeySet().getMnemonic()); this.setSmallIcon(BaseUtils.readIcon("/com/fr/design/images/m_insert/text.png")); } diff --git a/designer/src/com/fr/design/mainframe/ReportFloatPane.java b/designer/src/com/fr/design/mainframe/ReportFloatPane.java index 227378b71..b7fead91a 100644 --- a/designer/src/com/fr/design/mainframe/ReportFloatPane.java +++ b/designer/src/com/fr/design/mainframe/ReportFloatPane.java @@ -67,7 +67,7 @@ public class ReportFloatPane extends JPanel { } private MenuDef createInsertToolBar() { - MenuDef insertFloatMenu = new MenuDef(); + MenuDef insertFloatMenu = new MenuDef(true); insertFloatMenu.setName(KeySetUtils.INSERT_FLOAT.getMenuKeySetName()); insertFloatMenu.setTooltip(Inter.getLocText("FR-Designer_T_Insert_Float")); insertFloatMenu.setIconPath("com/fr/design/images/control/addPopup.png"); diff --git a/designer_base/src/com/fr/design/actions/UpdateAction.java b/designer_base/src/com/fr/design/actions/UpdateAction.java index b716da73b..eb0ede5fa 100644 --- a/designer_base/src/com/fr/design/actions/UpdateAction.java +++ b/designer_base/src/com/fr/design/actions/UpdateAction.java @@ -9,8 +9,7 @@ import com.fr.base.Style; import com.fr.design.actions.core.ActionFactory; import com.fr.design.constants.UIConstants; import com.fr.design.gui.ibutton.UIButton; -import com.fr.design.gui.imenu.UICheckBoxMenuItem; -import com.fr.design.gui.imenu.UIMenuItem; +import com.fr.design.gui.imenu.*; import com.fr.design.menu.ShortCut; import com.fr.design.selection.SelectionListener; import com.fr.general.ComparatorUtils; @@ -249,10 +248,17 @@ public abstract class UpdateAction extends ShortCut implements Action { this.putValue(UIMenuItem.class.getName(), object); } - return (UIMenuItem) object; } + public UIMenuEastAttrItem createMenuItemEastAttr() { + UIMenuEastAttrItem menuItem = new UIMenuEastAttrItem(this); + // 设置名字用作单元测 + menuItem.setName(getName()); + this.putValue(UIMenuItem.class.getName(), menuItem); + return menuItem; + } + /** * Gets component on toolbar. * @@ -317,7 +323,10 @@ public abstract class UpdateAction extends ShortCut implements Action { @Override public void intoJPopupMenu(JPopupMenu menu) { update(); - + if (menu instanceof UIPopupEastAttrMenu){ + menu.add(this.createMenuItemEastAttr()); + return; + } menu.add(this.createMenuItem()); } diff --git a/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java b/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java index 25369a550..986f29651 100644 --- a/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java +++ b/designer_base/src/com/fr/design/gui/controlpane/UIListControlPane.java @@ -488,6 +488,7 @@ public abstract class UIListControlPane extends UIControlPane { */ protected class AddItemMenuDef extends MenuDef { public AddItemMenuDef(NameableCreator[] creators) { + super(true); this.setName(Inter.getLocText("FR-Action_Add")); this.setMnemonic('A'); this.setIconPath("/com/fr/design/images/control/addPopup.png"); diff --git a/designer_base/src/com/fr/design/gui/imenu/UIMenuEastAttrItem.java b/designer_base/src/com/fr/design/gui/imenu/UIMenuEastAttrItem.java new file mode 100644 index 000000000..442464c61 --- /dev/null +++ b/designer_base/src/com/fr/design/gui/imenu/UIMenuEastAttrItem.java @@ -0,0 +1,103 @@ +package com.fr.design.gui.imenu; + +import com.fr.design.constants.UIConstants; +import com.fr.design.utils.gui.GUIPaintUtils; +import com.fr.stable.Constants; +import com.fr.stable.StringUtils; +import sun.swing.SwingUtilities2; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicMenuItemUI; +import java.awt.*; + +/** + * 右侧属性面板悬浮元素、超级链接弹窗重绘 + */ +public class UIMenuEastAttrItem extends JMenuItem { + + public UIMenuEastAttrItem() { + this(StringUtils.BLANK); + } + + public UIMenuEastAttrItem(String string) { + this(string, null); + + } + + public UIMenuEastAttrItem(String string, Icon pageSmallIcon) { + super(string, pageSmallIcon); + setBackground(UIConstants.NORMAL_BACKGROUND); + setUI(new UIMenuItemEastAttrUI()); + } + + public UIMenuEastAttrItem(String string, int key) { + super(string, key); + setBackground(UIConstants.NORMAL_BACKGROUND); + setUI(new UIMenuItemEastAttrUI()); + } + + public UIMenuEastAttrItem(Action action) { + this(); + setAction(action); + } + + @Override + public String getText() { + return StringUtils.BLANK + super.getText(); + } + + private class UIMenuItemEastAttrUI extends BasicMenuItemUI { + @Override + protected void paintBackground(Graphics g, JMenuItem menuItem,Color bgColor) { + if(menuItem.getIcon() != null) { + menuItem.setIcon(null); + } + + ButtonModel model = menuItem.getModel(); + Color oldColor = g.getColor(); + int menuWidth = menuItem.getWidth(); + int menuHeight = menuItem.getHeight(); + g.setColor(UIConstants.NORMAL_BACKGROUND); + g.fillRect(0, 0, menuWidth, menuHeight); + + if (menuItem.isOpaque()) { + if (model.isArmed() || (menuItem instanceof JMenu && model.isSelected())) { + GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 0); + } else { + GUIPaintUtils.fillPaint((Graphics2D) g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.TOOLBARUI_BACKGROUND, 0); + } + g.setColor(oldColor); + } + else if (model.isArmed() || (menuItem instanceof JMenu && + model.isSelected())) { + GUIPaintUtils.fillPaint((Graphics2D)g, 0, 0, menuWidth, menuHeight, true, Constants.NULL, UIConstants.FLESH_BLUE, 7); + g.setColor(oldColor); + } + } + + protected void paintText(Graphics g, JMenuItem menuItem, Rectangle textRect, String text) { + ButtonModel model = menuItem.getModel(); + FontMetrics fm = SwingUtilities2.getFontMetrics(menuItem, g); + + if(!model.isEnabled()) { + // *** paint the text disabled + if ( UIManager.get("MenuItem.disabledForeground") instanceof Color ) { + g.setColor( UIManager.getColor("MenuItem.disabledForeground") ); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g,text, + -1, textRect.x, textRect.y + fm.getAscent()); + } else { + g.setColor(menuItem.getBackground().brighter()); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, + -1, textRect.x, textRect.y + fm.getAscent()); + g.setColor(menuItem.getBackground().darker()); + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g,text, + -1, textRect.x - 1, textRect.y + + fm.getAscent() - 1); + } + } else { + SwingUtilities2.drawStringUnderlineCharAt(menuItem, g, text, + -1, 0, textRect.y + fm.getAscent()); + } + } + } +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java b/designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java index e5370d322..e35f440a1 100644 --- a/designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java +++ b/designer_base/src/com/fr/design/gui/imenu/UIMenuItem.java @@ -37,7 +37,7 @@ public class UIMenuItem extends JMenuItem{ this(); setAction(action); } - + @Override public String getText() { return StringUtils.BLANK + super.getText(); diff --git a/designer_base/src/com/fr/design/gui/imenu/UIPopupEastAttrMenu.java b/designer_base/src/com/fr/design/gui/imenu/UIPopupEastAttrMenu.java new file mode 100644 index 000000000..42b04e03a --- /dev/null +++ b/designer_base/src/com/fr/design/gui/imenu/UIPopupEastAttrMenu.java @@ -0,0 +1,28 @@ +package com.fr.design.gui.imenu; + +import java.awt.Graphics; +import java.awt.Insets; + +import javax.swing.JPopupMenu; + +import com.fr.design.constants.UIConstants; + +public class UIPopupEastAttrMenu extends JPopupMenu { + + public UIPopupEastAttrMenu() { + super(); + setBackground(UIConstants.NORMAL_BACKGROUND); + } + + @Override + protected void paintBorder(Graphics g) { + g.setColor(UIConstants.POP_DIALOG_BORDER); + g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); + } + + @Override + public Insets getInsets() { + return new Insets(0, 1, 1, 1); + } + +} \ No newline at end of file diff --git a/designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java b/designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java index 9555689f6..44b36ae11 100644 --- a/designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java +++ b/designer_base/src/com/fr/design/gui/imenu/UIPopupMenu.java @@ -13,13 +13,13 @@ public class UIPopupMenu extends JPopupMenu{ super(); setBackground(UIConstants.NORMAL_BACKGROUND); } - + @Override protected void paintBorder(Graphics g) { g.setColor(UIConstants.LINE_COLOR); g.drawRect(0, 0, getWidth() - 1, getHeight() - 1); } - + @Override public Insets getInsets() { if(onlyText) { diff --git a/designer_base/src/com/fr/design/menu/MenuDef.java b/designer_base/src/com/fr/design/menu/MenuDef.java index 319b94f2e..00dd2ff3a 100644 --- a/designer_base/src/com/fr/design/menu/MenuDef.java +++ b/designer_base/src/com/fr/design/menu/MenuDef.java @@ -3,6 +3,7 @@ package com.fr.design.menu; import com.fr.base.BaseUtils; import com.fr.design.gui.ibutton.UIButton; 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; @@ -13,7 +14,10 @@ import javax.swing.*; import javax.swing.event.MenuEvent; import javax.swing.event.MenuListener; import java.awt.*; -import java.awt.event.*; +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.List; @@ -22,338 +26,406 @@ import java.util.List; */ public class MenuDef extends ShortCut { - protected String name; - protected char mnemonic; - protected String iconPath; - protected String tooltip; - //item List. - private List shortcutList = new ArrayList(); - // peter:产生的JMenu, UIButton以及enabled变量都是为由MenuDef产生的控件所用的 - protected boolean enabled = true; - protected UIMenu createdJMenu; - protected UIButton createdButton; - protected JPopupMenu popupMenu; - private boolean hasScrollSubMenu; - - private String anchor; - - public MenuDef() { - } - - public MenuDef(String name) { - this.setName(name); - } - - 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 char getMnemonic() { - return mnemonic; - } - - public void setMnemonic(char mnemonic) { - this.mnemonic = mnemonic; - } - - public void setHasScrollSubMenu(boolean scrollSubMenu) { - this.hasScrollSubMenu = scrollSubMenu; - } - - public String getIconPath() { - return iconPath; - } - - public void setIconPath(String iconPath) { - this.iconPath = iconPath; - } - - 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 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) { - this.shortcutList.add(i); - } - } - + private static final int MENU_DEFAULTWDITH = 156; + protected String name; + //右侧属性表弹出框重绘 + protected Boolean isEastAttr = false; + protected char mnemonic; + protected String iconPath; + protected String tooltip; + //item List. + private List shortcutList = new ArrayList(); + // peter:产生的JMenu, UIButton以及enabled变量都是为由MenuDef产生的控件所用的 + protected boolean enabled = true; + protected UIMenu createdJMenu; + protected UIButton createdButton; + protected JPopupMenu popupMenu; + private boolean hasScrollSubMenu; + + 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 String getIconPath() { + return iconPath; + } + + public void setIconPath(String iconPath) { + this.iconPath = iconPath; + } + + 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 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) { + this.shortcutList.add(i); + } + } + 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(BaseUtils.readIcon(iconPath)); - 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) { - if (hasScrollSubMenu) { - createdJMenu = new UIScrollMenu(this.getName()); - } else { - createdJMenu = new UIMenu(this.getName()); - } - createdJMenu.setMnemonic(this.getMnemonic()); - if (this.iconPath != null) { - createdJMenu.setIcon(BaseUtils.readIcon(this.iconPath)); - } - createdJMenu.addMenuListener(menuDefListener); - ContainerListener listener = getContainerListener(); - if(listener != null){ - createdJMenu.getPopupMenu().addContainerListener(listener); - } - } - - 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); - } - } - - /** - * 更新菜单 - * @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 菜单 - */ - 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 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; - } - - UIPopupMenu popupMenu = new UIPopupMenu(); - popupMenu.setInvoker(button); - MenuDef.this.updatePopupMenu(popupMenu); - - GUICoreUtils.showPopupMenu(popupMenu, button, 0, button.getSize().height); - } - }; - - - //ben: for ui test - public JPopupMenu getPopupMenu() { - return popupMenu; - } - - public void setPopupMenu(JPopupMenu popupMenu) { - this.popupMenu = popupMenu; - } - - + /** + * 清理 + */ + public void clearShortCuts() { + this.shortcutList.clear(); + } + + /** + * 生成UIButton + * + * @return 菜单按钮 + */ + public UIButton createUIButton() { + if (createdButton == null) { + if (iconPath != null) { + createdButton = new UIButton(BaseUtils.readIcon(iconPath)); + 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) { + if (hasScrollSubMenu) { + createdJMenu = new UIScrollMenu(this.getName()); + } else { + createdJMenu = new UIMenu(this.getName()); + } + createdJMenu.setMnemonic(this.getMnemonic()); + if (this.iconPath != null) { + createdJMenu.setIcon(BaseUtils.readIcon(this.iconPath)); + } + createdJMenu.addMenuListener(menuDefListener); + ContainerListener listener = getContainerListener(); + if (listener != null) { + createdJMenu.getPopupMenu().addContainerListener(listener); + } + } + + 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); + } + } + + /** + * 更新菜单 + * + * @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 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); + popupMenu.setPopupSize(new Dimension(MENU_DEFAULTWDITH, popupMenu.getPreferredSize().height)); + 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); + } + } + }; + + + //ben: for ui test + public JPopupMenu getPopupMenu() { + return popupMenu; + } + + public void setPopupMenu(JPopupMenu popupMenu) { + this.popupMenu = popupMenu; + } + + } \ No newline at end of file