1 /** 2 * Created on May 6, 2008 3 * 4 * Copyright (C) Azureus Software, Inc, All Rights Reserved. 5 * 6 * This program is free software; you can redistribute it and/or modify 7 * it under the terms of the GNU General Public License as published by 8 * the Free Software Foundation; either version 2 of the License, or 9 * (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 19 */ 20 21 package com.aelitis.azureus.ui.selectedcontent; 22 23 import org.gudy.azureus2.core3.download.DownloadManager; 24 import org.gudy.azureus2.core3.util.Debug; 25 import org.gudy.azureus2.plugins.download.Download; 26 import org.gudy.azureus2.pluginsimpl.local.PluginCoreUtils; 27 28 import com.aelitis.azureus.core.util.CopyOnWriteList; 29 import com.aelitis.azureus.ui.common.table.TableView; 30 31 /** 32 * Manages the currently selected content in the visible display 33 * 34 * @author TuxPaper 35 * @created May 6, 2008 36 * 37 */ 38 public class SelectedContentManager 39 { 40 private static CopyOnWriteList<SelectedContentListener> listeners = new CopyOnWriteList<SelectedContentListener>(); 41 42 private static volatile ISelectedContent[] currentlySelectedContent = new ISelectedContent[0]; 43 44 private static volatile String viewID = null; 45 46 private static volatile TableView tv = null; 47 getCurrentySelectedViewID()48 public static String getCurrentySelectedViewID() { 49 return viewID; 50 } 51 addCurrentlySelectedContentListener( SelectedContentListener l)52 public static void addCurrentlySelectedContentListener( 53 SelectedContentListener l) { 54 if (listeners.contains(l)) { 55 return; 56 } 57 listeners.add(l); 58 l.currentlySelectedContentChanged(currentlySelectedContent, viewID); 59 } 60 removeCurrentlySelectedContentListener( SelectedContentListener l)61 public static void removeCurrentlySelectedContentListener( 62 SelectedContentListener l) { 63 listeners.remove(l); 64 } clearCurrentlySelectedContent()65 public static void clearCurrentlySelectedContent() { 66 changeCurrentlySelectedContentNoTrigger(null, null, null); 67 // Always trigger selected content listeners since toolbar relies it 68 // them to reset the toolbaritems if something that didn't use 69 // SelectedContentManager modified the toolbaritems states 70 triggerSelectedContentListeners(); 71 } 72 changeCurrentlySelectedContent(String viewID, ISelectedContent[] currentlySelectedContent)73 public static void changeCurrentlySelectedContent(String viewID, 74 ISelectedContent[] currentlySelectedContent) { 75 changeCurrentlySelectedContent(viewID, currentlySelectedContent, null); 76 } 77 changeCurrentlySelectedContent(String viewID, ISelectedContent[] currentlySelectedContent, TableView tv)78 public static void changeCurrentlySelectedContent(String viewID, 79 ISelectedContent[] currentlySelectedContent, TableView tv) { 80 changeCurrentlySelectedContentNoTrigger(viewID, currentlySelectedContent, tv); 81 triggerSelectedContentListeners(); 82 } 83 changeCurrentlySelectedContentNoTrigger(String viewID, ISelectedContent[] currentlySelectedContent, TableView tv)84 private static void changeCurrentlySelectedContentNoTrigger(String viewID, 85 ISelectedContent[] currentlySelectedContent, TableView tv) { 86 if (currentlySelectedContent == null) { 87 currentlySelectedContent = new ISelectedContent[0]; 88 } 89 /* 90 System.out.println("change CURSEL for '" 91 + viewID 92 + "' to " 93 + currentlySelectedContent.length 94 + ";" 95 + (currentlySelectedContent.length > 0 ? currentlySelectedContent[0] 96 : "") + Debug.getCompressedStackTrace()); 97 */ 98 if (currentlySelectedContent.length == 0 99 && SelectedContentManager.viewID != null && viewID != null 100 && !viewID.equals(SelectedContentManager.viewID)) { 101 // don't allow clearing if someone else set the currently selected 102 //System.out.println("-->abort because it's not " + SelectedContentManager.viewID); 103 return; 104 } 105 106 synchronized( SelectedContentManager.class ){ 107 boolean same = SelectedContentManager.tv == tv; 108 109 if ( same ){ 110 111 same = 112 SelectedContentManager.viewID == viewID || 113 ( SelectedContentManager.viewID != null && 114 viewID != null && 115 SelectedContentManager.viewID.equals( viewID )); 116 117 if ( same ){ 118 119 if ( SelectedContentManager.currentlySelectedContent.length == currentlySelectedContent.length ){ 120 121 for ( int i=0;i<currentlySelectedContent.length && same ;i++){ 122 123 same = currentlySelectedContent[i].sameAs( SelectedContentManager.currentlySelectedContent[i]); 124 } 125 126 if ( same ){ 127 128 return; 129 } 130 } 131 } 132 } 133 134 SelectedContentManager.tv = tv; 135 SelectedContentManager.currentlySelectedContent = currentlySelectedContent; 136 SelectedContentManager.viewID = viewID; 137 } 138 } 139 triggerSelectedContentListeners()140 public static void triggerSelectedContentListeners() { 141 for( SelectedContentListener l: listeners ){ 142 143 try{ 144 l.currentlySelectedContentChanged( currentlySelectedContent, viewID); 145 146 }catch( Throwable e ){ 147 148 Debug.out( e ); 149 } 150 } 151 } 152 getCurrentlySelectedContent()153 public static ISelectedContent[] getCurrentlySelectedContent() { 154 return currentlySelectedContent; 155 } 156 getDMSFromSelectedContent()157 public static DownloadManager[] getDMSFromSelectedContent() { 158 ISelectedContent[] sc = SelectedContentManager.getCurrentlySelectedContent(); 159 if (sc.length > 0) { 160 int x = 0; 161 DownloadManager[] dms = new DownloadManager[sc.length]; 162 for (int i = 0; i < sc.length; i++) { 163 ISelectedContent selectedContent = sc[i]; 164 if (selectedContent == null) { 165 continue; 166 } 167 dms[x] = selectedContent.getDownloadManager(); 168 if (dms[x] != null) { 169 x++; 170 } 171 } 172 if (x > 0) { 173 System.arraycopy(dms, 0, dms, 0, x); 174 return dms; 175 } 176 } 177 return null; 178 } 179 getCurrentlySelectedTableView()180 public static TableView getCurrentlySelectedTableView() { 181 return tv; 182 } 183 convertSelectedContentToObject(ISelectedContent[] contents)184 public static Object convertSelectedContentToObject(ISelectedContent[] contents) { 185 if (contents == null) { 186 contents = getCurrentlySelectedContent(); 187 } 188 if (contents.length == 0) { 189 TableView tv = SelectedContentManager.getCurrentlySelectedTableView(); 190 if (tv != null) { 191 return tv.getSelectedDataSources(false); 192 } 193 return null; 194 } 195 if (contents.length == 1) { 196 return selectedContentToObject(contents[0]); 197 } 198 Object[] objects = new Object[contents.length]; 199 for (int i = 0; i < contents.length; i++) { 200 ISelectedContent content = contents[i]; 201 objects[i] = selectedContentToObject(content); 202 } 203 return objects; 204 } 205 selectedContentToObject(ISelectedContent content)206 private static Object selectedContentToObject(ISelectedContent content) { 207 DownloadManager dm = content.getDownloadManager(); 208 if ( dm == null ){ 209 return( null ); 210 } 211 Download dl = PluginCoreUtils.wrap( dm ); 212 if (dl == null) { 213 return null; 214 } 215 int i = content.getFileIndex(); 216 if (i < 0) { 217 return dl; 218 } 219 return dl.getDiskManagerFileInfo(i); 220 } 221 222 } 223