Ticket #13880: TileSourceLayer_menuAddition.patch

File TileSourceLayer_menuAddition.patch, 3.3 KB (added by holgermappt, 4 years ago)
  • src/org/openstreetmap/josm/gui/layer/AbstractTileSourceLayer.java

     
    126126    public static final int MIN_ZOOM = 2;
    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);
    131134    /** maximum zoom level to show to user */
     
    17631766        return clickedTiles.findAny().orElse(null);
    17641767    }
    17651768
     1769    /**
     1770     * Class to store a menu action and the class it belongs to.
     1771     */
     1772    private static class MenuAddition {
     1773        public final Action addition;
     1774        public final Class<? extends AbstractTileSourceLayer> clazz;
     1775
     1776        MenuAddition(Action addition, Class<? extends AbstractTileSourceLayer> clazz) {
     1777            this.addition = addition;
     1778            this.clazz = clazz;
     1779        }
     1780    }
     1781
     1782    /**
     1783     * Register an additional layer context menu entry.
     1784     *
     1785     * @param addition additional menu action
     1786     */
     1787    public static void registerMenuAddition(Action addition) {
     1788        menuAdditions.add(new MenuAddition(addition, AbstractTileSourceLayer.class));
     1789    }
     1790
     1791    /**
     1792     * Register an additional layer context menu entry for a imagery layer
     1793     * class.  The menu entry is valid for the specified class and subclasses
     1794     * thereof only.
     1795     * <p>
     1796     * Example:
     1797     * <pre>
     1798     * TMSLayer.registerMenuAddition(new TMSSpecificAction(), TMSLayer.class);
     1799     * </pre>
     1800     *
     1801     * @param addition additional menu action
     1802     * @param clazz class the menu action is registered for
     1803     */
     1804    public static void registerMenuAddition(Action addition,
     1805                                            Class<? extends AbstractTileSourceLayer> clazz) {
     1806        menuAdditions.add(new MenuAddition(addition, clazz));
     1807    }
     1808
     1809    /**
     1810     * Prepare list of additional layer context menu entries.  The list is
     1811     * empty if there are no additional menu entries.
     1812     *
     1813     * @return list of additional layer context menu entries
     1814     */
     1815    private List<Action> getMenuAdditions() {
     1816        final LinkedList<Action> menuAdds = new LinkedList<>();
     1817        for (MenuAddition menuAdd: menuAdditions) {
     1818            if (menuAdd.clazz.isInstance(this)) {
     1819                menuAdds.add(menuAdd.addition);
     1820            }
     1821        }
     1822        if (!menuAdds.isEmpty()) {
     1823            menuAdds.addFirst(SeparatorLayerAction.INSTANCE);
     1824        }
     1825        return menuAdds;
     1826    }
     1827
    17661828    @Override
    17671829    public Action[] getMenuEntries() {
    17681830        ArrayList<Action> actions = new ArrayList<>();
    17691831        actions.addAll(Arrays.asList(getLayerListEntries()));
    17701832        actions.addAll(Arrays.asList(getCommonEntries()));
     1833        actions.addAll(getMenuAdditions());
    17711834        actions.add(SeparatorLayerAction.INSTANCE);
    17721835        actions.add(new LayerListPopup.InfoAction(this));
    17731836        return actions.toArray(new Action[actions.size()]);