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