001: package org.jvnet.substance.netbeans.ui;
002:
003: import java.awt.Frame;
004: import java.awt.event.ActionEvent;
005: import java.beans.PropertyChangeListener;
006: import java.util.Iterator;
007: import java.util.Map;
008: import javax.swing.AbstractAction;
009: import javax.swing.Action;
010: import javax.swing.JMenu;
011: import javax.swing.JMenuItem;
012: import javax.swing.LookAndFeel;
013: import javax.swing.SwingUtilities;
014: import javax.swing.UIManager;
015: import org.jvnet.substance.SubstanceLookAndFeel;
016: import org.jvnet.substance.button.ButtonShaperInfo;
017: import org.openide.util.NbBundle;
018: import org.openide.util.WeakListeners;
019: import org.openide.util.WeakSet;
020: import org.openide.util.actions.Presenter;
021:
022: /**
023: *
024: * @author Timothy Boudreau
025: */
026: public class ButtonShapeSelector extends AbstractAction implements
027: Presenter.Menu, Presenter.Popup {
028: public void actionPerformed(ActionEvent e) {
029: throw new UnsupportedOperationException();
030: }
031:
032: public JMenuItem getPopupPresenter() {
033: return getMenuPresenter();
034: }
035:
036: public JMenuItem getMenuPresenter() {
037: LookAndFeel lf = UIManager.getLookAndFeel();
038: JMenu result = new JMenu(NbBundle.getMessage(getClass(),
039: "LBL_ButtonShapers")); //NOI18N
040:
041: if (lf instanceof SubstanceLookAndFeel) {
042: Map shapers = SubstanceLookAndFeel.getAllButtonShapers();
043: for (Iterator i = shapers.keySet().iterator(); i.hasNext();) {
044: String shaper = (String) i.next();
045: JMenuItem item = new JMenuItem(
046: new ChangeButtonShaperAction(shaper));
047:
048: result.add(item);
049: }
050: } else {
051: result.setText(NbBundle.getMessage(getClass(),
052: "LBL_NotRunning")); //NOI18N
053: result.setEnabled(false);
054: }
055: return result;
056: }
057:
058: private static final WeakSet allActions = new WeakSet();
059:
060: private static void updateActions() {
061: for (Iterator i = allActions.iterator(); i.hasNext();) {
062: ChangeButtonShaperAction a = (ChangeButtonShaperAction) i
063: .next();
064: if (a != null) {
065: a.update();
066: }
067: }
068: }
069:
070: private static final class ChangeButtonShaperAction extends
071: AbstractAction {
072: private final String name;
073:
074: public ChangeButtonShaperAction(String name) {
075: this .name = name;
076: update();
077: allActions.add(this );
078: }
079:
080: private void update() {
081: String nm = name;
082: if (nm.equals(SubstanceLookAndFeel
083: .getCurrentButtonShaperName())) {
084: nm = "<html><b>" + nm + "</b></html>"; //NOI18N
085: }
086: putValue(Action.NAME, nm);
087: }
088:
089: public void addPropertyChangeListener(PropertyChangeListener pcl) {
090: //ensure old menu items can be garbage collected
091: super .addPropertyChangeListener(WeakListeners
092: .propertyChange(pcl, this ));
093: }
094:
095: public void actionPerformed(ActionEvent e) {
096: ButtonShaperInfo info = (ButtonShaperInfo) SubstanceLookAndFeel
097: .getAllButtonShapers().get(name);
098:
099: String shaperClass = info.getClassName();
100: setButtonShaper(shaperClass);
101: ButtonShapeSelector.updateUIs();
102: persist(shaperClass);
103: updateActions();
104: assert info != null;
105: }
106: }
107:
108: static void setButtonShaper(String s) {
109: SubstanceLookAndFeel.setCurrentButtonShaper(s);
110: }
111:
112: static void persist(String value) {
113: NbPrefs p = new NbPrefs();
114: p.put("shaperClassName", value); //NOI18N
115: // p.put ("skinClassName", null); //NOI18N
116: }
117:
118: public static boolean restore() {
119: NbPrefs p = new NbPrefs();
120: String preferred = p.get("shaperClassName", null); //NOI18N
121: if (preferred != null) {
122: setButtonShaper(preferred);
123: }
124: return preferred != null;
125: }
126:
127: public static final void updateUIs() {
128: Frame[] f = Frame.getFrames();
129: for (int i = 0; i < f.length; i++) {
130: SwingUtilities.updateComponentTreeUI(f[i]);
131: }
132: }
133: }
|