/** * Created on May 6, 2008 * * Copyright 2008 Vuze, Inc. All rights reserved. * This program 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; version 2 of the License only. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ package com.aelitis.azureus.ui.selectedcontent; import org.gudy.azureus2.core3.download.DownloadManager; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.plugins.download.Download; import org.gudy.azureus2.pluginsimpl.local.PluginCoreUtils; import com.aelitis.azureus.core.util.CopyOnWriteList; import com.aelitis.azureus.ui.common.table.TableView; /** * Manages the currently selected content in the visible display * * @author TuxPaper * @created May 6, 2008 * */ public class SelectedContentManager { private static CopyOnWriteList<SelectedContentListener> listeners = new CopyOnWriteList<SelectedContentListener>(); private static volatile ISelectedContent[] currentlySelectedContent = new ISelectedContent[0]; private static volatile String viewID = null; private static volatile TableView tv = null; public static String getCurrentySelectedViewID() { return viewID; } public static void addCurrentlySelectedContentListener( SelectedContentListener l) { if (listeners.contains(l)) { return; } listeners.add(l); l.currentlySelectedContentChanged(currentlySelectedContent, viewID); } public static void removeCurrentlySelectedContentListener( SelectedContentListener l) { listeners.remove(l); } public static void clearCurrentlySelectedContent() { changeCurrentlySelectedContentNoTrigger(null, null, null); // Always trigger selected content listeners since toolbar relies it // them to reset the toolbaritems if something that didn't use // SelectedContentManager modified the toolbaritems states triggerSelectedContentListeners(); } public static void changeCurrentlySelectedContent(String viewID, ISelectedContent[] currentlySelectedContent) { changeCurrentlySelectedContent(viewID, currentlySelectedContent, null); } public static void changeCurrentlySelectedContent(String viewID, ISelectedContent[] currentlySelectedContent, TableView tv) { changeCurrentlySelectedContentNoTrigger(viewID, currentlySelectedContent, tv); triggerSelectedContentListeners(); } private static void changeCurrentlySelectedContentNoTrigger(String viewID, ISelectedContent[] currentlySelectedContent, TableView tv) { if (currentlySelectedContent == null) { currentlySelectedContent = new ISelectedContent[0]; } /* System.out.println("change CURSEL for '" + viewID + "' to " + currentlySelectedContent.length + ";" + (currentlySelectedContent.length > 0 ? currentlySelectedContent[0] : "") + Debug.getCompressedStackTrace()); */ if (currentlySelectedContent.length == 0 && SelectedContentManager.viewID != null && viewID != null && !viewID.equals(SelectedContentManager.viewID)) { // don't allow clearing if someone else set the currently selected //System.out.println("-->abort because it's not " + SelectedContentManager.viewID); return; } synchronized( SelectedContentManager.class ){ boolean same = SelectedContentManager.tv == tv; if ( same ){ same = SelectedContentManager.viewID == viewID || ( SelectedContentManager.viewID != null && viewID != null && SelectedContentManager.viewID.equals( viewID )); if ( same ){ if ( SelectedContentManager.currentlySelectedContent.length == currentlySelectedContent.length ){ for ( int i=0;i<currentlySelectedContent.length && same ;i++){ same = currentlySelectedContent[i].sameAs( SelectedContentManager.currentlySelectedContent[i]); } if ( same ){ return; } } } } SelectedContentManager.tv = tv; SelectedContentManager.currentlySelectedContent = currentlySelectedContent; SelectedContentManager.viewID = viewID; } } public static void triggerSelectedContentListeners() { for( SelectedContentListener l: listeners ){ try{ l.currentlySelectedContentChanged( currentlySelectedContent, viewID); }catch( Throwable e ){ Debug.out( e ); } } } public static ISelectedContent[] getCurrentlySelectedContent() { return currentlySelectedContent; } public static DownloadManager[] getDMSFromSelectedContent() { ISelectedContent[] sc = SelectedContentManager.getCurrentlySelectedContent(); if (sc.length > 0) { int x = 0; DownloadManager[] dms = new DownloadManager[sc.length]; for (int i = 0; i < sc.length; i++) { ISelectedContent selectedContent = sc[i]; if (selectedContent == null) { continue; } dms[x] = selectedContent.getDownloadManager(); if (dms[x] != null) { x++; } } if (x > 0) { System.arraycopy(dms, 0, dms, 0, x); return dms; } } return null; } public static TableView getCurrentlySelectedTableView() { return tv; } public static Object convertSelectedContentToObject(ISelectedContent[] contents) { if (contents == null) { contents = getCurrentlySelectedContent(); } if (contents.length == 0) { return null; } if (contents.length == 1) { return selectedContentToObject(contents[0]); } Object[] objects = new Object[contents.length]; for (int i = 0; i < contents.length; i++) { ISelectedContent content = contents[i]; objects[i] = selectedContentToObject(content); } return objects; } private static Object selectedContentToObject(ISelectedContent content) { Download dl = PluginCoreUtils.wrap(content.getDownloadManager()); if (dl == null) { return null; } int i = content.getFileIndex(); if (i < 0) { return dl; } return dl.getDiskManagerFileInfo(i); } }