/* * Created on Sep 13, 2004 * Created by Olivier Chalouhi * Copyright (C) 2004, 2005, 2006 Aelitis, 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; either version 2 * of the License, or (at your option) any later version. * 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. * * AELITIS, SAS au capital de 46,603.30 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package org.gudy.azureus2.ui.swt.views.stats; import java.util.ArrayList; import java.util.Map; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.CTabFolder; import org.eclipse.swt.custom.CTabItem; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.widgets.*; import org.gudy.azureus2.core3.internat.MessageText; import org.gudy.azureus2.core3.util.AERunnable; import org.gudy.azureus2.core3.util.Constants; import org.gudy.azureus2.core3.util.Debug; import org.gudy.azureus2.ui.swt.Messages; import org.gudy.azureus2.ui.swt.Utils; import org.gudy.azureus2.ui.swt.plugins.*; import org.gudy.azureus2.ui.swt.plugins.UISWTInstance.UISWTViewEventListenerWrapper; import org.gudy.azureus2.ui.swt.pluginsimpl.*; import org.gudy.azureus2.ui.swt.views.IViewAlwaysInitialize; import com.aelitis.azureus.core.networkmanager.admin.NetworkAdmin; import com.aelitis.azureus.ui.swt.UIFunctionsManagerSWT; import com.aelitis.azureus.ui.swt.UIFunctionsSWT; /** * aka "Statistics View" that contains {@link ActivityView}, * {@link TransferStatsView}, {@link CacheView}, {@link DHTView}, * {@link VivaldiView} */ public class StatsView implements IViewAlwaysInitialize, UISWTViewCoreEventListener { public static String VIEW_ID = UISWTInstance.VIEW_STATISTICS; public static final int EVENT_PERIODIC_UPDATE = 0x100; private CTabFolder folder; private ArrayList<UISWTViewCore> tabViews = new ArrayList<UISWTViewCore>(); private UpdateThread updateThread; private Object dataSource; private UISWTViewCore activeView; private UISWTView swtView; private Composite parent; private static boolean registeredCoreSubViews; private class UpdateThread extends Thread { boolean bContinue; public UpdateThread() { super("StatsView Update Thread"); } public void run() { bContinue = true; while (bContinue) { for (UISWTViewCore iview : tabViews) { try { iview.triggerEvent(EVENT_PERIODIC_UPDATE, null); } catch (Exception e) { Debug.printStackTrace(e); } } try { Thread.sleep(1000); } catch (Throwable e) { Debug.out(e); break; } } } public void stopIt() { bContinue = false; } } public StatsView() { } private void initialize(Composite composite) { parent = composite; folder = new CTabFolder(composite, SWT.LEFT); folder.setBorderVisible(true); Label lblClose = new Label(folder, SWT.WRAP); lblClose.setText("x"); lblClose.addListener(SWT.MouseUp, new Listener() { public void handleEvent(Event event) { delete(); } }); folder.setTopRight(lblClose); folder.setTabHeight(20); // Call plugin listeners UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT(); if (uiFunctions != null) { UISWTInstance pluginUI = uiFunctions.getUISWTInstance(); if (pluginUI != null && !registeredCoreSubViews) { pluginUI.addView(UISWTInstance.VIEW_STATISTICS, ActivityView.MSGID_PREFIX, ActivityView.class, null); pluginUI.addView(UISWTInstance.VIEW_STATISTICS, TransferStatsView.MSGID_PREFIX, TransferStatsView.class, null); pluginUI.addView(UISWTInstance.VIEW_STATISTICS, CacheView.MSGID_PREFIX, CacheView.class, null); pluginUI.addView(UISWTInstance.VIEW_STATISTICS, DHTView.MSGID_PREFIX, DHTView.class, DHTView.DHT_TYPE_MAIN); pluginUI.addView(UISWTInstance.VIEW_STATISTICS, DHTOpsView.MSGID_PREFIX, DHTOpsView.class, DHTOpsView.DHT_TYPE_MAIN); pluginUI.addView(UISWTInstance.VIEW_STATISTICS, VivaldiView.MSGID_PREFIX, VivaldiView.class, VivaldiView.DHT_TYPE_MAIN); if (NetworkAdmin.getSingleton().hasDHTIPV6()) { pluginUI.addView(UISWTInstance.VIEW_STATISTICS, DHTView.MSGID_PREFIX + ".6", DHTView.class, DHTView.DHT_TYPE_MAIN_V6); pluginUI.addView(UISWTInstance.VIEW_STATISTICS, VivaldiView.MSGID_PREFIX + ".6", VivaldiView.class, VivaldiView.DHT_TYPE_MAIN_V6); } if (Constants.isCVSVersion()) { pluginUI.addView(UISWTInstance.VIEW_STATISTICS, DHTView.MSGID_PREFIX + ".cvs", DHTView.class, DHTView.DHT_TYPE_CVS); pluginUI.addView(UISWTInstance.VIEW_STATISTICS, VivaldiView.MSGID_PREFIX + ".cvs", VivaldiView.class, VivaldiView.DHT_TYPE_CVS); } pluginUI.addView(UISWTInstance.VIEW_STATISTICS, TagStatsView.MSGID_PREFIX, TagStatsView.class, null ); registeredCoreSubViews = true; } if ( pluginUI != null ){ UISWTViewEventListenerWrapper[] pluginViews = pluginUI.getViewListeners(UISWTInstance.VIEW_STATISTICS); for (int i = 0; i < pluginViews.length; i++) { UISWTViewEventListenerWrapper l = pluginViews[i]; String name = l.getViewID(); try { UISWTViewImpl view = new UISWTViewImpl( UISWTInstance.VIEW_STATISTICS, name, l, null); addSection(view, name); } catch (Exception e) { // skip } } } } // Initialize view when user selects it folder.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { CTabItem item = (CTabItem) e.item; selectView(item); } }); Utils.execSWTThreadLater(0, new AERunnable() { public void runSupport() { if (folder == null || folder.isDisposed() || folder.getItemCount() == 0) { return; } if ( dataSource != null ){ for ( CTabItem item: folder.getItems()){ String ds = (String)item.getData( "ds" ); if ( dataSource.equals( ds )){ selectView( item ); return; } } } selectView(folder.getItem(0)); } }); updateThread = new UpdateThread(); updateThread.setDaemon(true); updateThread.start(); dataSourceChanged(dataSource); } private void selectView(CTabItem item) { if (item == null) { return; } if (folder.getSelection() != item) { folder.setSelection(item); } folder.getShell().setCursor( folder.getDisplay().getSystemCursor(SWT.CURSOR_WAIT)); try { // Send one last refresh to previous tab, just in case it // wants to do something when view goes invisible refresh(); Object ds = item.getData("ds"); if (ds == null) { ds = dataSource; }else{ dataSource = ds; } UISWTViewCore view = (UISWTViewCore) item.getData("IView"); if (view == null) { Class<?> cla = (Class<?>)item.getData("claEventListener"); UISWTViewEventListener l = (UISWTViewEventListener) cla.newInstance(); view = new UISWTViewImpl(UISWTInstance.VIEW_MAIN, cla.getSimpleName(), l, ds); item.setData("IView", view); } activeView = view; if (item.getControl() == null) { view.triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, ds); view.initialize(folder); item.setControl(view.getComposite()); } item.getControl().setFocus(); UIFunctionsSWT uiFunctions = UIFunctionsManagerSWT.getUIFunctionsSWT(); if (uiFunctions != null) { uiFunctions.getMDI().getEntry( StatsView.VIEW_ID ).setDatasource( dataSource ); uiFunctions.refreshIconBar(); // For edit columns view } refresh(); } catch (Exception e) { Debug.out(e); } finally { folder.getShell().setCursor(null); } } // Copied from ManagerView private UISWTViewCore getActiveView() { return activeView; } // Copied from ManagerView private void refresh() { if (folder == null || folder.isDisposed()) return; try { UISWTViewCore view = getActiveView(); if (view != null) { view.triggerEvent(UISWTViewEvent.TYPE_REFRESH, null); } CTabItem[] items = folder.getItems(); for (int i = 0; i < items.length; i++) { CTabItem item = items[i]; view = (UISWTViewCore) item.getData("IView"); try { if (item.isDisposed() || view == null) { continue; } String lastTitle = item.getText(); String newTitle = view.getFullTitle(); if (lastTitle == null || !lastTitle.equals(newTitle)) { item.setText(escapeAccelerators(newTitle)); } String lastToolTip = item.getToolTipText(); String newToolTip = view.getFullTitle(); if (lastToolTip == null || !lastToolTip.equals(newToolTip)) { item.setToolTipText(newToolTip); } } catch (Exception e) { Debug.printStackTrace(e); } } } catch (Exception e) { Debug.printStackTrace(e); } } private void focusGained() { if (folder == null || folder.isDisposed()) return; try { CTabItem[] items = folder.getItems(); for (int i = 0; i < items.length; i++) { CTabItem item = items[i]; UISWTViewCore view = (UISWTViewCore) item.getData("IView"); try { if (item.isDisposed() || view == null) { continue; } view.triggerEvent(UISWTViewEvent.TYPE_FOCUSGAINED, null); } catch (Throwable e) { Debug.printStackTrace(e); } } } catch ( Throwable e) { Debug.printStackTrace(e); } } // Copied from ManagerView private static String escapeAccelerators(String str) { if (str == null) { return (str); } return (str.replaceAll("&", "&&")); } private String getFullTitle() { return MessageText.getString("Stats.title.full"); } private void delete() { if (updateThread != null) { updateThread.stopIt(); } if (folder != null && !folder.isDisposed()) { folder.setSelection(0); } //Don't ask me why, but without this an exception is thrown further // (in folder.dispose() ) //TODO : Investigate to see if it's a platform (OSX-Carbon) BUG, and report to SWT team. if (Utils.isCarbon) { if (folder != null && !folder.isDisposed()) { CTabItem[] items = folder.getItems(); for (int i = 0; i < items.length; i++) { if (!items[i].isDisposed()) items[i].dispose(); } } } for (int i = 0; i < tabViews.size(); i++) { UISWTViewCore view = tabViews.get(i); if (view != null) { view.triggerEvent(UISWTViewEvent.TYPE_DESTROY, null); } } tabViews.clear(); Utils.disposeSWTObjects(new Object[] { folder, parent }); } private void dataSourceChanged(Object newDataSource) { if ( dataSource == newDataSource ){ return; } if ( dataSource != null && newDataSource != null && dataSource.equals( newDataSource )){ return; } dataSource = newDataSource; if (folder == null) { return; } if (newDataSource instanceof String) { for ( CTabItem item: folder.getItems()){ String ds = (String)item.getData( "ds" ); if ( newDataSource.equals( ds )){ selectView(item); } } } } /* private int addSection(String titleIdPrefix, Class<?> claEventListener) { return addSection(titleIdPrefix, claEventListener, null); } private int addSection(String titleIdPrefix, Class<?> claEventListener, Object ds) { CTabItem item = new CTabItem(folder, SWT.NULL); Messages.setLanguageText(item, titleIdPrefix + ".title.full"); item.setData("claEventListener", claEventListener); if (ds != null) { item.setData("ds", ds); } return folder.indexOf(item); } */ private void addSection(UISWTViewCore view, Object dataSource) { if (view == null) return; view.triggerEvent(UISWTViewEvent.TYPE_DATASOURCE_CHANGED, dataSource); CTabItem item = new CTabItem(folder, SWT.NULL); Messages.setLanguageText(item, view.getTitleID()); item.setData("IView", view); if (dataSource != null) { item.setData("ds", dataSource); } tabViews.add(view); } /* (non-Javadoc) * @see org.gudy.azureus2.ui.swt.plugins.UISWTViewEventListener#eventOccurred(org.gudy.azureus2.ui.swt.plugins.UISWTViewEvent) */ public boolean eventOccurred(UISWTViewEvent event) { switch (event.getType()) { case UISWTViewEvent.TYPE_CREATE: swtView = (UISWTView) event.getData(); swtView.setTitle(getFullTitle()); break; case UISWTViewEvent.TYPE_DESTROY: delete(); break; case UISWTViewEvent.TYPE_INITIALIZE: initialize((Composite) event.getData()); break; case UISWTViewEvent.TYPE_LANGUAGEUPDATE: swtView.setTitle(getFullTitle()); Messages.updateLanguageForControl(folder); break; case UISWTViewEvent.TYPE_DATASOURCE_CHANGED: dataSourceChanged(event.getData()); break; case UISWTViewEvent.TYPE_FOCUSGAINED: focusGained(); break; case UISWTViewEvent.TYPE_REFRESH: refresh(); break; } return true; } }