package org.freeplane.core.ui.ribbon.special; import java.awt.Component; import java.awt.Container; import java.util.ArrayList; import java.util.List; import java.util.Properties; import javax.swing.JComponent; import javax.swing.event.TreeSelectionEvent; import org.freeplane.core.ui.AFreeplaneAction; import org.freeplane.core.ui.ribbon.ARibbonContributor; import org.freeplane.core.ui.ribbon.CurrentState; import org.freeplane.core.ui.ribbon.IChangeObserver; import org.freeplane.core.ui.ribbon.IRibbonContributorFactory; import org.freeplane.core.ui.ribbon.RibbonActionContributorFactory; import org.freeplane.core.ui.ribbon.RibbonActionContributorFactory.ActionChangeListener; import org.freeplane.core.ui.ribbon.RibbonBuildContext; import org.freeplane.core.ui.ribbon.RibbonBuilder; import org.freeplane.core.util.Compat; import org.freeplane.core.util.TextUtils; import org.freeplane.features.mode.Controller; import org.freeplane.features.styles.mindmapmode.MUIFactory; import org.pushingpixels.flamingo.api.common.AbstractCommandButton; import org.pushingpixels.flamingo.api.common.CommandButtonDisplayState; import org.pushingpixels.flamingo.api.common.JCommandButton; import org.pushingpixels.flamingo.api.common.JCommandButtonStrip; import org.pushingpixels.flamingo.api.common.JCommandToggleButton; import org.pushingpixels.flamingo.api.ribbon.JFlowRibbonBand; import org.pushingpixels.flamingo.api.ribbon.JRibbonComponent; import org.pushingpixels.flamingo.api.ribbon.resize.CoreRibbonResizePolicies; import org.pushingpixels.flamingo.api.ribbon.resize.IconRibbonBandResizePolicy; import org.pushingpixels.flamingo.api.ribbon.resize.RibbonBandResizePolicy; public class FontStyleContributorFactory implements IRibbonContributorFactory { private void setAccelerator(RibbonBuilder builder, String accel, String actionKey) { if (accel != null) { if (Compat.isMacOsX()) { accel = accel.replaceFirst("CONTROL", "META").replaceFirst("control", "meta"); } builder.getAcceleratorManager().setDefaultAccelerator(actionKey, accel); } } public ARibbonContributor getContributor(final Properties attributes) { return new ARibbonContributor() { public String getKey() { return attributes.getProperty("name"); } public void contribute(final RibbonBuildContext context, ARibbonContributor parent) { setAccelerator(context.getBuilder(), "control B", "BoldAction"); setAccelerator(context.getBuilder(), "control I", "ItalicAction"); setAccelerator(context.getBuilder(), "control PLUS", "IncreaseNodeFontAction"); setAccelerator(context.getBuilder(), "control MINUS", "DecreaseNodeFontAction"); setAccelerator(context.getBuilder(), "alt shift F", "NodeColorAction"); setAccelerator(context.getBuilder(), "alt shift P", "UsePlainTextAction"); if (parent == null) { return; } // RIBBONS expandlistener and icon JFlowRibbonBand band = new JFlowRibbonBand(TextUtils.removeTranslateComment(TextUtils.getText("ribbon.band.font")), null, null); band.setExpandButtonKeyTip("FN"); band.setCollapsedStateKeyTip("ZF"); MUIFactory uiFactory = Controller.getCurrentModeController().getExtension(MUIFactory.class); final Container fontBox = uiFactory.createFontBox(); JRibbonComponent fontComboWrapper = new JRibbonComponent((JComponent) fontBox); fontComboWrapper.setKeyTip("SF"); addDefaultToggleHandler(context, fontComboWrapper); band.addFlowComponent(fontComboWrapper); final Container sizeBox = uiFactory.createSizeBox(); JRibbonComponent sizeComboWrapper = new JRibbonComponent((JComponent) sizeBox); sizeComboWrapper.setKeyTip("SS"); addDefaultToggleHandler(context, sizeComboWrapper); band.addFlowComponent(sizeComboWrapper); JCommandButtonStrip fontResizeStrip = new JCommandButtonStrip(); AFreeplaneAction action = context.getBuilder().getMode().getAction("IncreaseNodeFontAction"); final JCommandToggleButton fontIncreaseButton = RibbonActionContributorFactory.createCommandToggleButton(action); addDefaultToggleHandler(context, action, fontIncreaseButton); fontResizeStrip.add(fontIncreaseButton); action = context.getBuilder().getMode().getAction("DecreaseNodeFontAction"); final JCommandToggleButton fontDecreaseButton = RibbonActionContributorFactory.createCommandToggleButton(action); addDefaultToggleHandler(context, action, fontDecreaseButton); fontResizeStrip.add(fontDecreaseButton); band.addFlowComponent(fontResizeStrip); JCommandButtonStrip styleStrip = new JCommandButtonStrip(); action = context.getBuilder().getMode().getAction("BoldAction"); final JCommandToggleButton boldButton = RibbonActionContributorFactory.createCommandToggleButton(action); addDefaultToggleHandler(context, action, boldButton); styleStrip.add(boldButton); action = context.getBuilder().getMode().getAction("ItalicAction"); final JCommandToggleButton italicButton = RibbonActionContributorFactory.createCommandToggleButton(action); addDefaultToggleHandler(context, action, italicButton); styleStrip.add(italicButton); action = context.getBuilder().getMode().getAction("NodeColorAction"); JCommandButton button = RibbonActionContributorFactory.createCommandButton(action); addDefaultToggleHandler(context, action, button); styleStrip.add(button); action = context.getBuilder().getMode().getAction("NodeBackgroundColorAction"); button = RibbonActionContributorFactory.createCommandButton(action); addDefaultToggleHandler(context, action, button); styleStrip.add(button); action = context.getBuilder().getMode().getAction("NodeColorBlendAction"); button = RibbonActionContributorFactory.createCommandButton(action); addDefaultToggleHandler(context, action, button); styleStrip.add(button); action = context.getBuilder().getMode().getAction("BlinkingNodeHookAction"); button = RibbonActionContributorFactory.createCommandButton(action); addDefaultToggleHandler(context, action, button); styleStrip.add(button); action = context.getBuilder().getMode().getAction("MapBackgroundColorAction"); button = RibbonActionContributorFactory.createCommandButton(action); addDefaultToggleHandler(context, action, button); styleStrip.add(button); band.addFlowComponent(styleStrip); final Container styleBox = uiFactory.createStyleBox(); JRibbonComponent styleComboWrapper = new JRibbonComponent((JComponent) styleBox); styleComboWrapper.setKeyTip("SD"); addDefaultToggleHandler(context, styleComboWrapper); band.addFlowComponent(styleComboWrapper); action = context.getBuilder().getMode().getAction("RemoveFormatAction"); button = RibbonActionContributorFactory.createCommandButton(action); button.setDisplayState(CommandButtonDisplayState.MEDIUM); addDefaultToggleHandler(context, action, button); band.addFlowComponent(button); action = context.getBuilder().getMode().getAction("UsePlainTextAction"); button = RibbonActionContributorFactory.createCommandButton(action); button.setDisplayState(CommandButtonDisplayState.MEDIUM); addDefaultToggleHandler(context, action, button); band.addFlowComponent(button); List<RibbonBandResizePolicy> policies = new ArrayList<RibbonBandResizePolicy>(); policies.add(new CoreRibbonResizePolicies.FlowThreeRows(band.getControlPanel())); policies.add(new IconRibbonBandResizePolicy(band.getControlPanel())); band.setResizePolicies(policies); parent.addChild(band, new ChildProperties(parseOrderSettings(attributes.getProperty("orderPriority", "")))); } public void addChild(Object child, ChildProperties properties) { } }; } private void addDefaultToggleHandler(final RibbonBuildContext context, final Component component) { context.getBuilder().getMapChangeAdapter().addListener(new IChangeObserver() { public void updateState(CurrentState state) { if(state.isNodeChangeEvent()) { } else if(state.allMapsClosed()) { component.setEnabled(false); } else if (state.get(TreeSelectionEvent.class) == null) { component.setEnabled(true); } } }); } private void addDefaultToggleHandler(final RibbonBuildContext context, final AFreeplaneAction action, final AbstractCommandButton button) { context.getBuilder().getMapChangeAdapter().addListener(new ActionChangeListener(action, button)); } /*********************************************************************************** * CONSTRUCTORS **********************************************************************************/ /*********************************************************************************** * METHODS **********************************************************************************/ /*********************************************************************************** * REQUIRED METHODS FOR INTERFACES **********************************************************************************/ }