001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.gui.io;
003
004import static org.openstreetmap.josm.tools.I18n.tr;
005
006import java.awt.Component;
007import java.awt.event.ActionEvent;
008
009import javax.swing.JCheckBoxMenuItem;
010import javax.swing.JMenu;
011import javax.swing.JMenuItem;
012import javax.swing.event.MenuEvent;
013import javax.swing.event.MenuListener;
014
015import org.openstreetmap.josm.actions.ToggleAction;
016import org.openstreetmap.josm.io.NetworkManager;
017import org.openstreetmap.josm.io.OnlineResource;
018import org.openstreetmap.josm.tools.ImageProvider;
019
020/**
021 * Show list of {@link OnlineResource} to set online/offline via {@link NetworkManager}.
022 * @since 16823
023 */
024public class OnlineResourceMenu extends JMenu {
025
026    /**
027     * Constructs a new {@link OnlineResourceMenu}
028     */
029    public OnlineResourceMenu() {
030        super(tr("Work Offline..."));
031        setToolTipText(tr("Block network access to resources"));
032        setIcon(ImageProvider.get("offline", ImageProvider.ImageSizes.MENU));
033        addMenuListener(new ToggleMenuListener());
034
035        for (OnlineResource onlineResource : OnlineResource.values()) {
036            ToggleOnlineResourceAction action = new ToggleOnlineResourceAction(onlineResource);
037            JCheckBoxMenuItem item = new JCheckBoxMenuItem(action);
038            action.addButtonModel(item.getModel());
039            add(item);
040        }
041    }
042
043    private static class ToggleOnlineResourceAction extends ToggleAction {
044        private final OnlineResource onlineResource;
045
046        ToggleOnlineResourceAction(OnlineResource onlineResource) {
047            super(onlineResource.getLocName(), onlineResource.getOfflineIcon(), null, null, false);
048            this.onlineResource = onlineResource;
049            setToolbarId("menu:offline:" + onlineResource.name());
050            updateSelectedState();
051        }
052
053        @Override
054        public void actionPerformed(ActionEvent e) {
055            if (isOffline()) {
056                NetworkManager.setOnline(onlineResource);
057            } else {
058                NetworkManager.setOffline(onlineResource);
059            }
060            updateSelectedState();
061        }
062
063        private void updateSelectedState() {
064            setEnabled(onlineResource == OnlineResource.ALL || !NetworkManager.isOffline(OnlineResource.ALL));
065            setSelected(isOffline());
066            notifySelectedState();
067        }
068
069        private boolean isOffline() {
070            return NetworkManager.isOffline(onlineResource);
071        }
072
073        @Override
074        protected boolean listenToSelectionChange() {
075            return false;
076        }
077    }
078
079    private class ToggleMenuListener implements MenuListener {
080        @Override
081        public void menuSelected(MenuEvent e) {
082            for (Component component : getMenuComponents()) {
083                JMenuItem menuItem = (JMenuItem) component;
084                ToggleOnlineResourceAction action = (ToggleOnlineResourceAction) menuItem.getAction();
085                action.updateSelectedState();
086            }
087        }
088
089        @Override
090        public void menuDeselected(MenuEvent e) {
091            // Do nothing
092        }
093
094        @Override
095        public void menuCanceled(MenuEvent e) {
096            // Do nothing
097        }
098    }
099}