Search in sources :

Example 1 with StructurePath

use of org.freeplane.core.ui.ribbon.StructureTree.StructurePath in project freeplane by freeplane.

the class RibbonActionContributorFactory method getContributor.

/**
 *********************************************************************************
 * REQUIRED METHODS FOR INTERFACES
 *********************************************************************************
 */
public ARibbonContributor getContributor(final Properties attributes) {
    final String actionKey = attributes.getProperty("action");
    if (actionKey != null) {
        String accel = attributes.getProperty("accelerator", null);
        if (accel != null) {
            if (Compat.isMacOsX()) {
                accel = accel.replaceFirst("CONTROL", "META").replaceFirst("control", "meta");
            }
            builder.getAcceleratorManager().setDefaultAccelerator(actionKey, accel);
        }
    }
    return new ARibbonContributor() {

        private List<Component> childButtons = new ArrayList<Component>();

        public String getKey() {
            String key = attributes.getProperty("action");
            if (key == null) {
                key = attributes.getProperty("name");
            }
            return key;
        }

        public void contribute(RibbonBuildContext context, ARibbonContributor parent) {
            final String actionKey = attributes.getProperty("action");
            final boolean mandatory = Boolean.parseBoolean(attributes.getProperty("mandatory", "false").toLowerCase());
            ChildProperties childProps = new ChildProperties(parseOrderSettings(attributes.getProperty("orderPriority", "")));
            childProps.set(RibbonElementPriority.class, getPriority(attributes.getProperty("priority", "medium")));
            if (actionKey != null) {
                AFreeplaneAction action = context.getBuilder().getMode().getAction(actionKey);
                if (action != null) {
                    if (mandatory) {
                        action.putValue(MANDATORY_PROPERTY, mandatory);
                    }
                    AbstractCommandButton button;
                    if (isSelectionListener(action)) {
                        button = createCommandToggleButton(action);
                        if (context.hasChildren(context.getCurrentPath())) {
                            LogUtils.severe("RibbonActionContributorFactory.getContributor(): can't add popup menu to toggle button for action: " + context.getCurrentPath().toString());
                        }
                    } else {
                        button = createCommandButton(action);
                        if (context.hasChildren(context.getCurrentPath())) {
                            StructurePath path = context.getCurrentPath();
                            ((JCommandButton) button).setPopupCallback(getPopupPanelCallBack(path, context));
                            ((JCommandButton) button).setCommandButtonKind(CommandButtonKind.ACTION_AND_POPUP_MAIN_ACTION);
                            KeyStroke ks = context.getBuilder().getAcceleratorManager().getAccelerator(actionKey);
                            updateRichTooltip(button, action, ks);
                            updateActionState(action, button);
                        }
                    }
                    button.putClientProperty(ACTION_KEY_PROPERTY, action);
                    KeyStroke ks = context.getBuilder().getAcceleratorManager().getAccelerator(actionKey);
                    if (ks != null) {
                        button.putClientProperty(ACTION_ACCELERATOR, ks);
                        updateRichTooltip(button, action, ks);
                    }
                    getAccelChangeListener().addAction(actionKey, button);
                    builder.getMapChangeAdapter().addListener(new ActionChangeListener(action, button));
                    parent.addChild(button, childProps);
                }
            } else {
                final String name = attributes.getProperty("name");
                if (name != null) {
                    AFreeplaneAction action = ActionUtils.getDummyAction(name);
                    final JCommandButton button = new JCommandButton(ActionUtils.getActionTitle(action), ActionUtils.getActionIcon(action));
                    button.putClientProperty(ACTION_NAME_PROPERTY, action);
                    updateRichTooltip(button, action, null);
                    if (context.hasChildren(context.getCurrentPath())) {
                        StructurePath path = context.getCurrentPath();
                        button.setPopupCallback(getPopupPanelCallBack(path, context));
                        button.setCommandButtonKind(CommandButtonKind.POPUP_ONLY);
                    }
                    button.setFocusable(false);
                    parent.addChild(button, childProps);
                }
            }
        }

        private PopupPanelCallback getPopupPanelCallBack(StructurePath path, final RibbonBuildContext context) {
            childButtons.clear();
            context.processChildren(path, this);
            return new PopupPanelCallback() {

                public JPopupPanel getPopupPanel(JCommandButton commandButton) {
                    JCommandPopupMenu popupmenu = new JCommandPopupMenu();
                    for (Component comp : childButtons) {
                        if (comp instanceof JSeparator) {
                            popupmenu.addMenuSeparator();
                        } else if (comp instanceof AbstractCommandButton) {
                            AbstractCommandButton button = (AbstractCommandButton) comp;
                            AbstractCommandButton menuButton = null;
                            AFreeplaneAction action = (AFreeplaneAction) button.getClientProperty(ACTION_KEY_PROPERTY);
                            if (action != null) {
                                if (isSelectionListener(action)) {
                                    menuButton = createCommandToggleMenuButton(action);
                                    popupmenu.addMenuButton((JCommandToggleMenuButton) menuButton);
                                } else {
                                    menuButton = createCommandMenuButton(action);
                                    popupmenu.addMenuButton((JCommandMenuButton) menuButton);
                                }
                                menuButton.setEnabled(button.isEnabled());
                                menuButton.putClientProperty(ACTION_KEY_PROPERTY, action);
                                KeyStroke ks = context.getBuilder().getAcceleratorManager().getAccelerator(action.getKey());
                                updateRichTooltip(menuButton, action, ks);
                                updateActionState(action, menuButton);
                            } else {
                                action = (AFreeplaneAction) button.getClientProperty(ACTION_NAME_PROPERTY);
                                menuButton = createCommandMenuButton(action);
                                if (action != null) {
                                    menuButton.putClientProperty(ACTION_NAME_PROPERTY, action);
                                    updateRichTooltip(menuButton, action, null);
                                }
                            }
                            if (button instanceof JCommandButton) {
                                if (((JCommandButton) button).getPopupCallback() != null) {
                                    ((JCommandMenuButton) menuButton).setPopupCallback(((JCommandButton) button).getPopupCallback());
                                    ((JCommandMenuButton) menuButton).setCommandButtonKind(((JCommandButton) button).getCommandButtonKind());
                                }
                            }
                            // clear all RibbonActionListeners from the menuButton
                            for (ActionListener listener : menuButton.getListeners(ActionListener.class)) {
                                if (listener instanceof RibbonActionListener) {
                                    menuButton.removeActionListener(listener);
                                }
                            }
                            // add
                            for (ActionListener listener : button.getListeners(ActionListener.class)) {
                                if (listener instanceof RibbonActionListener) {
                                    menuButton.addActionListener(listener);
                                }
                            }
                        }
                    }
                    return popupmenu;
                }
            };
        }

        public void addChild(Object child, ChildProperties properties) {
            if (child instanceof AbstractCommandButton) {
                childButtons.add((AbstractCommandButton) child);
                Object obj = ((AbstractCommandButton) child).getClientProperty(ACTION_KEY_PROPERTY);
                if (obj != null) {
                    try {
                        builder.getMapChangeAdapter().removeListener((IChangeObserver) ((AFreeplaneAction) obj).getValue(ACTION_CHANGE_LISTENER));
                        getAccelChangeListener().removeAction(((AFreeplaneAction) obj).getKey());
                    } catch (Exception e) {
                        LogUtils.info("RibbonActionContributorFactory.getContributor(...).new ARibbonContributor() {...}.addChild(): " + e.getMessage());
                    }
                }
            }
            if (child instanceof RibbonSeparator) {
                childButtons.add(new JSeparator(JSeparator.HORIZONTAL));
            }
        }
    };
}
Also used : StructurePath(org.freeplane.core.ui.ribbon.StructureTree.StructurePath) JCommandToggleMenuButton(org.pushingpixels.flamingo.api.common.JCommandToggleMenuButton) PopupPanelCallback(org.pushingpixels.flamingo.api.common.popup.PopupPanelCallback) JCommandButton(org.pushingpixels.flamingo.api.common.JCommandButton) JSeparator(javax.swing.JSeparator) JCommandMenuButton(org.pushingpixels.flamingo.api.common.JCommandMenuButton) AFreeplaneAction(org.freeplane.core.ui.AFreeplaneAction) RibbonSeparator(org.freeplane.core.ui.ribbon.RibbonSeparatorContributorFactory.RibbonSeparator) ActionListener(java.awt.event.ActionListener) AbstractCommandButton(org.pushingpixels.flamingo.api.common.AbstractCommandButton) JCommandPopupMenu(org.pushingpixels.flamingo.api.common.popup.JCommandPopupMenu) KeyStroke(javax.swing.KeyStroke) ArrayList(java.util.ArrayList) List(java.util.List) Component(java.awt.Component)

Example 2 with StructurePath

use of org.freeplane.core.ui.ribbon.StructureTree.StructurePath in project freeplane by freeplane.

the class RibbonBuildContext method processChildren.

public void processChildren(StructurePath path, ARibbonContributor parent) {
    WeightedMutableTreeNode<StructureTreeHull> parentNode = ribbonBuilder.structure.get(path);
    if (parentNode != null) {
        StructurePath lastPath = getCurrentPath();
        try {
            Enumeration<WeightedMutableTreeNode<StructureTreeHull>> children = parentNode.children();
            while (children.hasMoreElements()) {
                WeightedMutableTreeNode<StructureTreeHull> node = children.nextElement();
                currentPath = node.getUserObject().getPath();
                ((ARibbonContributor) node.getUserObject().getObject()).contribute(this, parent);
            }
        } finally {
            currentPath = lastPath;
        }
    }
}
Also used : StructurePath(org.freeplane.core.ui.ribbon.StructureTree.StructurePath) StructureTreeHull(org.freeplane.core.ui.ribbon.StructureTree.StructureTreeHull)

Aggregations

StructurePath (org.freeplane.core.ui.ribbon.StructureTree.StructurePath)2 Component (java.awt.Component)1 ActionListener (java.awt.event.ActionListener)1 ArrayList (java.util.ArrayList)1 List (java.util.List)1 JSeparator (javax.swing.JSeparator)1 KeyStroke (javax.swing.KeyStroke)1 AFreeplaneAction (org.freeplane.core.ui.AFreeplaneAction)1 RibbonSeparator (org.freeplane.core.ui.ribbon.RibbonSeparatorContributorFactory.RibbonSeparator)1 StructureTreeHull (org.freeplane.core.ui.ribbon.StructureTree.StructureTreeHull)1 AbstractCommandButton (org.pushingpixels.flamingo.api.common.AbstractCommandButton)1 JCommandButton (org.pushingpixels.flamingo.api.common.JCommandButton)1 JCommandMenuButton (org.pushingpixels.flamingo.api.common.JCommandMenuButton)1 JCommandToggleMenuButton (org.pushingpixels.flamingo.api.common.JCommandToggleMenuButton)1 JCommandPopupMenu (org.pushingpixels.flamingo.api.common.popup.JCommandPopupMenu)1 PopupPanelCallback (org.pushingpixels.flamingo.api.common.popup.PopupPanelCallback)1