use of org.freeplane.core.ui.ribbon.RibbonSeparatorContributorFactory.RibbonSeparator 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));
}
}
};
}
Aggregations