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}