/* * opsu! - an open-source osu! client * Copyright (C) 2014, 2015 Jeffrey Han * * opsu! is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * opsu! is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with opsu!. If not, see . */ package itdelatrisu.opsu.downloads; import itdelatrisu.opsu.ErrorHandler; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import javax.swing.JOptionPane; import javax.swing.UIManager; /** * Maintains the current downloads list. */ public class DownloadList { /** The single instance of this class. */ private static DownloadList list = new DownloadList(); /** Current list of downloads. */ private List nodes; /** The map of beatmap set IDs to DownloadNodes for the current downloads. */ private Map map; /** * Returns the single instance of this class. */ public static DownloadList get() { return list; } /** * Constructor. */ private DownloadList() { nodes = new ArrayList(); map = new HashMap(); } /** * Returns the DownloadNode at an index. */ public DownloadNode getNode(int index) { return nodes.get(index); } /** * Gets the Download for a beatmap set ID, or null if not in the list. */ public Download getDownload(int beatmapSetID) { DownloadNode node = map.get(beatmapSetID); return (node == null) ? null : node.getDownload(); } /** * Returns the size of the doownloads list. */ public int size() { return nodes.size(); } /** * Returns {@code true} if this list contains no elements. */ public boolean isEmpty() { return nodes.isEmpty(); } /** * Returns {@code true} if this list contains the beatmap set ID. */ public boolean contains(int beatmapSetID) { return map.containsKey(beatmapSetID); } /** * Adds a DownloadNode to the list. */ public void addNode(DownloadNode node) { nodes.add(node); map.put(node.getID(), node); } /** * Removes a DownloadNode from the list. */ public void remove(DownloadNode node) { remove(nodes.indexOf(node)); } /** * Removes a DownloadNode from the list at the given index. */ public void remove(int index) { DownloadNode node = nodes.remove(index); map.remove(node.getID()); } /** * Returns {@code true} if the list contains any downloads that are active. */ public boolean hasActiveDownloads() { for (DownloadNode node: nodes) { Download dl = node.getDownload(); if (dl != null && dl.isActive()) return true; } return false; } /** * Cancels all downloads. */ public void cancelAllDownloads() { for (DownloadNode node : nodes) { Download dl = node.getDownload(); if (dl != null && dl.isActive()) dl.cancel(); } } /** * Removes all inactive downloads from the list. */ public void clearInactiveDownloads() { Iterator iter = nodes.iterator(); while (iter.hasNext()) { DownloadNode node = iter.next(); Download dl = node.getDownload(); if (dl != null && !dl.isActive()) { iter.remove(); map.remove(node.getID()); } } } /** * Shows a confirmation dialog (used before exiting the game). * @return true if user selects "yes", false otherwise */ public static boolean showExitConfirmation() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (Exception e) { ErrorHandler.error("Could not set system look and feel for DownloadList.", e, true); } int n = JOptionPane.showConfirmDialog(null, "Beatmap downloads are in progress.\nAre you sure you want to quit opsu!?", "Warning", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE); return (n != JOptionPane.YES_OPTION); } }