001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.preferences;
003
004import java.awt.Component;
005import java.util.HashMap;
006import java.util.Map;
007
008import javax.swing.JPanel;
009import javax.swing.JScrollPane;
010import javax.swing.JTabbedPane;
011
012import org.openstreetmap.josm.Main;
013import org.openstreetmap.josm.tools.GBC;
014
015public abstract class DefaultTabPreferenceSetting extends DefaultPreferenceSetting implements TabPreferenceSetting {
016
017    private final String iconName;
018    private final String description;
019    private final String title;
020    private final JTabbedPane tabpane;
021    private final Map<SubPreferenceSetting, Component> subSettingMap;
022
023    /**
024     * Constructs a new {@code DefaultTabPreferenceSetting}.
025     */
026    public DefaultTabPreferenceSetting() {
027        this(null, null, null);
028    }
029
030    public DefaultTabPreferenceSetting(String iconName, String title, String description) {
031        this(iconName, title, description, false);
032    }
033
034    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert) {
035        this(iconName, title, description, isExpert, null);
036    }
037
038    public DefaultTabPreferenceSetting(String iconName, String title, String description, boolean isExpert, JTabbedPane tabpane) {
039        super(isExpert);
040        this.iconName = iconName;
041        this.description = description;
042        this.title = title;
043        this.tabpane = tabpane;
044        this.subSettingMap = tabpane != null ? new HashMap<>() : null;
045    }
046
047    @Override
048    public String getIconName() {
049        return iconName;
050    }
051
052    @Override
053    public String getTooltip() {
054        if (getDescription() != null) {
055            return "<html>"+getDescription()+"</html>";
056        } else {
057            return null;
058        }
059    }
060
061    @Override
062    public String getDescription() {
063        return description;
064    }
065
066    @Override
067    public String getTitle() {
068        return title;
069    }
070
071    /**
072     * Get the inner tab pane, if any.
073     * @return The JTabbedPane contained in this tab preference settings, or null if none is set.
074     * @since 5631
075     */
076    public final JTabbedPane getTabPane() {
077        return tabpane;
078    }
079
080    protected final void createPreferenceTabWithScrollPane(PreferenceTabbedPane gui, JPanel panel) {
081        GBC a = GBC.eol().insets(-5, 0, 0, 0);
082        a.anchor = GBC.EAST;
083
084        JScrollPane scrollPane = new JScrollPane(panel);
085        scrollPane.setBorder(null);
086
087        JPanel tab = gui.createPreferenceTab(this);
088        tab.add(scrollPane, GBC.eol().fill(GBC.BOTH));
089        tab.add(GBC.glue(0, 10), a);
090    }
091
092    @Override
093    public boolean selectSubTab(SubPreferenceSetting subPref) {
094        if (tabpane != null && subPref != null) {
095            Component tab = getSubTab(subPref);
096            if (tab != null) {
097                try {
098                    tabpane.setSelectedComponent(tab);
099                    return true;
100                } catch (IllegalArgumentException e) {
101                    // Ignore exception and return false below
102                    Main.debug(Main.getErrorMessage(e));
103                }
104            }
105        }
106        return false;
107    }
108
109    @Override
110    public final void addSubTab(SubPreferenceSetting sub, String title, Component component) {
111        addSubTab(sub, title, component, null);
112    }
113
114    @Override
115    public final void addSubTab(SubPreferenceSetting sub, String title, Component component, String tip) {
116        if (tabpane != null && component != null) {
117            tabpane.addTab(title, null, component, tip);
118            registerSubTab(sub, component);
119        }
120    }
121
122    @Override
123    public final void registerSubTab(SubPreferenceSetting sub, Component component) {
124        if (subSettingMap != null && sub != null && component != null) {
125            subSettingMap.put(sub, component);
126        }
127    }
128
129    @Override
130    public final Component getSubTab(SubPreferenceSetting sub) {
131        return subSettingMap != null ? subSettingMap.get(sub) : null;
132    }
133}