Changeset 11197 in josm for trunk/src/org


Ignore:
Timestamp:
2016-10-30T22:21:00+01:00 (8 years ago)
Author:
Don-vip
Message:

fix #13880 - AbstractTileSourceLayer: Allow additional layer context menu entries (patch by holgermappt)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java

    r11167 r11197  
    127127    private static final Font InfoFont = new Font("sansserif", Font.BOLD, 13);
    128128
     129    /** additional layer menu actions */
     130    private static List<MenuAddition> menuAdditions = new LinkedList<>();
     131
    129132    /** minimum zoom level to show to user */
    130133    public static final IntegerProperty PROP_MIN_ZOOM_LVL = new IntegerProperty(PREFERENCE_PREFIX + ".min_zoom_lvl", 2);
     
    17641767    }
    17651768
     1769    /**
     1770     * Class to store a menu action and the class it belongs to.
     1771     */
     1772    private static class MenuAddition {
     1773        final Action addition;
     1774        @SuppressWarnings("rawtypes")
     1775        final Class<? extends AbstractTileSourceLayer> clazz;
     1776
     1777        @SuppressWarnings("rawtypes")
     1778        MenuAddition(Action addition, Class<? extends AbstractTileSourceLayer> clazz) {
     1779            this.addition = addition;
     1780            this.clazz = clazz;
     1781        }
     1782    }
     1783
     1784    /**
     1785     * Register an additional layer context menu entry.
     1786     *
     1787     * @param addition additional menu action
     1788     * @since 11197
     1789     */
     1790    public static void registerMenuAddition(Action addition) {
     1791        menuAdditions.add(new MenuAddition(addition, AbstractTileSourceLayer.class));
     1792    }
     1793
     1794    /**
     1795     * Register an additional layer context menu entry for a imagery layer
     1796     * class.  The menu entry is valid for the specified class and subclasses
     1797     * thereof only.
     1798     * <p>
     1799     * Example:
     1800     * <pre>
     1801     * TMSLayer.registerMenuAddition(new TMSSpecificAction(), TMSLayer.class);
     1802     * </pre>
     1803     *
     1804     * @param addition additional menu action
     1805     * @param clazz class the menu action is registered for
     1806     * @since 11197
     1807     */
     1808    public static void registerMenuAddition(Action addition,
     1809                                            Class<? extends AbstractTileSourceLayer<?>> clazz) {
     1810        menuAdditions.add(new MenuAddition(addition, clazz));
     1811    }
     1812
     1813    /**
     1814     * Prepare list of additional layer context menu entries.  The list is
     1815     * empty if there are no additional menu entries.
     1816     *
     1817     * @return list of additional layer context menu entries
     1818     */
     1819    private List<Action> getMenuAdditions() {
     1820        final LinkedList<Action> menuAdds = new LinkedList<>();
     1821        for (MenuAddition menuAdd: menuAdditions) {
     1822            if (menuAdd.clazz.isInstance(this)) {
     1823                menuAdds.add(menuAdd.addition);
     1824            }
     1825        }
     1826        if (!menuAdds.isEmpty()) {
     1827            menuAdds.addFirst(SeparatorLayerAction.INSTANCE);
     1828        }
     1829        return menuAdds;
     1830    }
     1831
    17661832    @Override
    17671833    public Action[] getMenuEntries() {
     
    17691835        actions.addAll(Arrays.asList(getLayerListEntries()));
    17701836        actions.addAll(Arrays.asList(getCommonEntries()));
     1837        actions.addAll(getMenuAdditions());
    17711838        actions.add(SeparatorLayerAction.INSTANCE);
    17721839        actions.add(new LayerListPopup.InfoAction(this));
Note: See TracChangeset for help on using the changeset viewer.