PageRenderTime 41ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/projects/azureus-4.7.0.2/org/gudy/azureus2/ui/swt/views/stats/StatsView.java

https://gitlab.com/essere.lab.public/qualitas.class-corpus
Java | 457 lines | 335 code | 82 blank | 40 comment | 81 complexity | e591276db57fa5dcea49b8fa1adc7f2d MD5 | raw file
  1. /*
  2. * Created on Sep 13, 2004
  3. * Created by Olivier Chalouhi
  4. * Copyright (C) 2004, 2005, 2006 Aelitis, All Rights Reserved.
  5. *
  6. * This program is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU General Public License
  8. * as published by the Free Software Foundation; either version 2
  9. * of the License, or (at your option) any later version.
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. *
  18. * AELITIS, SAS au capital de 46,603.30 euros
  19. * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
  20. *
  21. */
  22. package org.gudy.azureus2.ui.swt.views.stats;
  23. import java.util.ArrayList;
  24. import java.util.Map;
  25. import org.eclipse.swt.SWT;
  26. import org.eclipse.swt.custom.CTabFolder;
  27. import org.eclipse.swt.custom.CTabItem;
  28. import org.eclipse.swt.events.SelectionAdapter;
  29. import org.eclipse.swt.events.SelectionEvent;
  30. import org.eclipse.swt.widgets.*;
  31. import org.gudy.azureus2.core3.internat.MessageText;
  32. import org.gudy.azureus2.core3.util.AERunnable;
  33. import org.gudy.azureus2.core3.util.Constants;
  34. import org.gudy.azureus2.core3.util.Debug;
  35. import org.gudy.azureus2.ui.swt.Messages;
  36. import org.gudy.azureus2.ui.swt.Utils;
  37. import org.gudy.azureus2.ui.swt.plugins.*;
  38. import org.gudy.azureus2.ui.swt.pluginsimpl.*;
  39. import org.gudy.azureus2.ui.swt.views.IViewAlwaysInitialize;
  40. import com.aelitis.azureus.core.networkmanager.admin.NetworkAdmin;
  41. import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT;
  42. import com.aelitis.azureus.ui.swt.UIFunctionsSWT;
  43. /**
  44. * aka "Statistics View" that contains {@link ActivityView},
  45. * {@link TransferStatsView}, {@link CacheView}, {@link DHTView},
  46. * {@link VivaldiView}
  47. */
  48. public class StatsView
  49. implements IViewAlwaysInitialize, UISWTViewCoreEventListener
  50. {
  51. public static String VIEW_ID = UISWTInstance.VIEW_STATISTICS;
  52. public static final int EVENT_PERIODIC_UPDATE = 0x100;
  53. private CTabFolder folder;
  54. private ArrayList<UISWTViewCore> tabViews = new ArrayList<UISWTViewCore>();
  55. private int idxActivityTab = -1;
  56. private int idxDHTView = -1;
  57. private int idxTransfersView = -1;
  58. private UpdateThread updateThread;
  59. private Object dataSource;
  60. private UISWTViewCore activeView;
  61. private UISWTView swtView;
  62. private Composite parent;
  63. private static boolean registeredCoreSubViews;
  64. private class UpdateThread
  65. extends Thread
  66. {
  67. boolean bContinue;
  68. public UpdateThread() {
  69. super("StatsView Update Thread");
  70. }
  71. public void run() {
  72. bContinue = true;
  73. while (bContinue) {
  74. for (UISWTViewCore iview : tabViews) {
  75. try {
  76. iview.triggerEvent(EVENT_PERIODIC_UPDATE, null);
  77. } catch (Exception e) {
  78. Debug.printStackTrace(e);
  79. }
  80. }
  81. try {
  82. Thread.sleep(1000);
  83. } catch (Throwable e) {
  84. Debug.out(e);
  85. break;
  86. }
  87. }
  88. }
  89. public void stopIt() {
  90. bContinue = false;
  91. }
  92. }
  93. private void initialize(Composite composite) {
  94. parent = composite;
  95. folder = new CTabFolder(composite, SWT.LEFT);
  96. folder.setBorderVisible(true);
  97. Label lblClose = new Label(folder, SWT.WRAP);
  98. lblClose.setText("x");
  99. lblClose.addListener(SWT.MouseUp, new Listener() {
  100. public void handleEvent(Event event) {
  101. delete();
  102. }
  103. });
  104. folder.setTopRight(lblClose);
  105. folder.setTabHeight(20);
  106. // Call plugin listeners
  107. UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
  108. if (uiFunctions != null) {
  109. UISWTInstanceImpl pluginUI = uiFunctions.getSWTPluginInstanceImpl();
  110. if (pluginUI != null && !registeredCoreSubViews) {
  111. pluginUI.addView(UISWTInstance.VIEW_STATISTICS,
  112. ActivityView.MSGID_PREFIX, ActivityView.class, null);
  113. pluginUI.addView(UISWTInstance.VIEW_STATISTICS,
  114. TransferStatsView.MSGID_PREFIX, TransferStatsView.class, null);
  115. pluginUI.addView(UISWTInstance.VIEW_STATISTICS, CacheView.MSGID_PREFIX,
  116. CacheView.class, null);
  117. pluginUI.addView(UISWTInstance.VIEW_STATISTICS, DHTView.MSGID_PREFIX,
  118. DHTView.class, DHTView.DHT_TYPE_MAIN);
  119. pluginUI.addView(UISWTInstance.VIEW_STATISTICS,
  120. VivaldiView.MSGID_PREFIX, VivaldiView.class,
  121. VivaldiView.DHT_TYPE_MAIN);
  122. if (NetworkAdmin.getSingleton().hasDHTIPV6()) {
  123. pluginUI.addView(UISWTInstance.VIEW_STATISTICS, DHTView.MSGID_PREFIX
  124. + ".6", DHTView.class, DHTView.DHT_TYPE_MAIN_V6);
  125. pluginUI.addView(UISWTInstance.VIEW_STATISTICS,
  126. VivaldiView.MSGID_PREFIX + ".6", VivaldiView.class,
  127. VivaldiView.DHT_TYPE_MAIN_V6);
  128. }
  129. if (Constants.isCVSVersion()) {
  130. pluginUI.addView(UISWTInstance.VIEW_STATISTICS, DHTView.MSGID_PREFIX
  131. + ".cvs", DHTView.class, DHTView.DHT_TYPE_CVS);
  132. pluginUI.addView(UISWTInstance.VIEW_STATISTICS,
  133. VivaldiView.MSGID_PREFIX + ".cvs", VivaldiView.class,
  134. VivaldiView.DHT_TYPE_CVS);
  135. }
  136. registeredCoreSubViews = true;
  137. }
  138. UISWTViewEventListenerHolder[] pluginViews = pluginUI == null
  139. ? null : pluginUI.getViewListeners(UISWTInstance.VIEW_STATISTICS);
  140. for (int i = 0; i < pluginViews.length; i++) {
  141. UISWTViewEventListenerHolder l = pluginViews[i];
  142. String name = l.getViewID();
  143. if (name.equals(ActivityView.MSGID_PREFIX)) {
  144. idxActivityTab = i;
  145. } else if (name.equals(TransferStatsView.MSGID_PREFIX)) {
  146. idxTransfersView = i;
  147. } else if (idxDHTView == -1 && name.equals(DHTView.MSGID_PREFIX)) {
  148. idxTransfersView = i;
  149. }
  150. if (l != null) {
  151. try {
  152. UISWTViewImpl view = new UISWTViewImpl(
  153. UISWTInstance.VIEW_STATISTICS, name, l, null);
  154. addSection(view, null);
  155. } catch (Exception e) {
  156. // skip
  157. }
  158. }
  159. }
  160. }
  161. // Initialize view when user selects it
  162. folder.addSelectionListener(new SelectionAdapter() {
  163. public void widgetSelected(SelectionEvent e) {
  164. CTabItem item = (CTabItem) e.item;
  165. selectView(item);
  166. }
  167. });
  168. Utils.execSWTThreadLater(0, new AERunnable() {
  169. public void runSupport() {
  170. if (folder == null || folder.isDisposed() || folder.getItemCount() == 0) {
  171. return;
  172. }
  173. selectView(folder.getItem(0));
  174. }
  175. });
  176. updateThread = new UpdateThread();
  177. updateThread.setDaemon(true);
  178. updateThread.start();
  179. dataSourceChanged(dataSource);
  180. }
  181. private void selectView(CTabItem item) {
  182. if (item == null) {
  183. return;
  184. }
  185. if (folder.getSelection() != item) {
  186. folder.setSelection(item);
  187. }
  188. folder.getShell().setCursor(
  189. folder.getDisplay().getSystemCursor(SWT.CURSOR_WAIT));
  190. try {
  191. // Send one last refresh to previous tab, just in case it
  192. // wants to do something when view goes invisible
  193. refresh();
  194. Object ds = item.getData("ds");
  195. if (ds == null) {
  196. ds = dataSource;
  197. }
  198. UISWTViewCore view = (UISWTViewCore) item.getData("IView");
  199. if (view == null) {
  200. Class<?> cla = (Class<?>)item.getData("claEventListener");
  201. UISWTViewEventListener l = (UISWTViewEventListener) cla.newInstance();
  202. view = new UISWTViewImpl(UISWTInstance.VIEW_MAIN, cla.getSimpleName(),
  203. l, ds);
  204. item.setData("IView", view);
  205. }
  206. activeView = view;
  207. if (item.getControl() == null) {
  208. view.triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, ds);
  209. view.initialize(folder);
  210. item.setControl(view.getComposite());
  211. }
  212. item.getControl().setFocus();
  213. UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT();
  214. if (uiFunctions != null) {
  215. uiFunctions.refreshIconBar(); // For edit columns view
  216. }
  217. refresh();
  218. } catch (Exception e) {
  219. Debug.out(e);
  220. } finally {
  221. folder.getShell().setCursor(null);
  222. }
  223. }
  224. // Copied from ManagerView
  225. private UISWTViewCore getActiveView() {
  226. return activeView;
  227. }
  228. // Copied from ManagerView
  229. private void refresh() {
  230. if (folder == null || folder.isDisposed())
  231. return;
  232. try {
  233. UISWTViewCore view = getActiveView();
  234. if (view != null) {
  235. view.triggerEvent(UISWTViewEvent.TYPE_REFRESH, null);
  236. }
  237. CTabItem[] items = folder.getItems();
  238. for (int i = 0; i < items.length; i++) {
  239. CTabItem item = items[i];
  240. view = (UISWTViewCore) item.getData("IView");
  241. try {
  242. if (item.isDisposed() || view == null) {
  243. continue;
  244. }
  245. String lastTitle = item.getText();
  246. String newTitle = view.getFullTitle();
  247. if (lastTitle == null || !lastTitle.equals(newTitle)) {
  248. item.setText(escapeAccelerators(newTitle));
  249. }
  250. String lastToolTip = item.getToolTipText();
  251. String newToolTip = view.getFullTitle();
  252. if (lastToolTip == null || !lastToolTip.equals(newToolTip)) {
  253. item.setToolTipText(newToolTip);
  254. }
  255. } catch (Exception e) {
  256. Debug.printStackTrace(e);
  257. }
  258. }
  259. } catch (Exception e) {
  260. Debug.printStackTrace(e);
  261. }
  262. }
  263. // Copied from ManagerView
  264. private static String escapeAccelerators(String str) {
  265. if (str == null) {
  266. return (str);
  267. }
  268. return (str.replaceAll("&", "&&"));
  269. }
  270. private String getFullTitle() {
  271. return MessageText.getString("Stats.title.full");
  272. }
  273. private void delete() {
  274. if (updateThread != null) {
  275. updateThread.stopIt();
  276. }
  277. if (folder != null && !folder.isDisposed()) {
  278. folder.setSelection(0);
  279. }
  280. //Don't ask me why, but without this an exception is thrown further
  281. // (in folder.dispose() )
  282. //TODO : Investigate to see if it's a platform (OSX-Carbon) BUG, and report to SWT team.
  283. if (Utils.isCarbon) {
  284. if (folder != null && !folder.isDisposed()) {
  285. CTabItem[] items = folder.getItems();
  286. for (int i = 0; i < items.length; i++) {
  287. if (!items[i].isDisposed())
  288. items[i].dispose();
  289. }
  290. }
  291. }
  292. for (int i = 0; i < tabViews.size(); i++) {
  293. UISWTViewCore view = tabViews.get(i);
  294. if (view != null) {
  295. view.triggerEvent(UISWTViewEvent.TYPE_DESTROY, null);
  296. }
  297. }
  298. tabViews.clear();
  299. Utils.disposeSWTObjects(new Object[] {
  300. folder,
  301. parent
  302. });
  303. }
  304. private void dataSourceChanged(Object newDataSource) {
  305. dataSource = newDataSource;
  306. if (folder == null) {
  307. return;
  308. }
  309. if (newDataSource instanceof String) {
  310. int i = -1;
  311. if ("dht".equals(newDataSource)) {
  312. i = idxDHTView;
  313. } else if ("transfers".equals(newDataSource)) {
  314. i = idxTransfersView;
  315. } else {
  316. i = idxActivityTab;
  317. }
  318. if (i >= 0) {
  319. CTabItem item = folder.getItem(i);
  320. selectView(item);
  321. }
  322. }
  323. }
  324. private int addSection(String titleIdPrefix, Class<?> claEventListener) {
  325. return addSection(titleIdPrefix, claEventListener, null);
  326. }
  327. private int addSection(String titleIdPrefix, Class<?> claEventListener, Object ds) {
  328. CTabItem item = new CTabItem(folder, SWT.NULL);
  329. Messages.setLanguageText(item, titleIdPrefix + ".title.full");
  330. item.setData("claEventListener", claEventListener);
  331. if (ds != null) {
  332. item.setData("ds", ds);
  333. }
  334. return folder.indexOf(item);
  335. }
  336. private void addSection(UISWTViewCore view, Object dataSource) {
  337. if (view == null)
  338. return;
  339. view.triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, dataSource);
  340. CTabItem item = new CTabItem(folder, SWT.NULL);
  341. Messages.setLanguageText(item, view.getTitleID());
  342. item.setData("IView", view);
  343. tabViews.add(view);
  344. }
  345. /* (non-Javadoc)
  346. * @see org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener#eventOccurred(org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent)
  347. */
  348. public boolean eventOccurred(UISWTViewEvent event) {
  349. switch (event.getType()) {
  350. case UISWTViewEvent.TYPE_CREATE:
  351. swtView = (UISWTView) event.getData();
  352. swtView.setTitle(getFullTitle());
  353. break;
  354. case UISWTViewEvent.TYPE_DESTROY:
  355. delete();
  356. break;
  357. case UISWTViewEvent.TYPE_INITIALIZE:
  358. initialize((Composite) event.getData());
  359. break;
  360. case UISWTViewEvent.TYPE_LANGUAGEUPDATE:
  361. swtView.setTitle(getFullTitle());
  362. Messages.updateLanguageForControl(folder);
  363. break;
  364. case UISWTViewEvent.TYPE_DATASOURCE_CHANGED:
  365. dataSourceChanged(event.getData());
  366. break;
  367. case UISWTViewEvent.TYPE_FOCUSGAINED:
  368. break;
  369. case UISWTViewEvent.TYPE_REFRESH:
  370. refresh();
  371. break;
  372. }
  373. return true;
  374. }
  375. }