/* * Xmission - a cross-platform bittorrent client * Copyright (C) 2007 Charles Kerr * * 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. * * 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 * * $Id$ */ #ifndef __XMISSION_TORRENT_LIST_H__ #define __XMISSION_TORRENT_LIST_H__ #include #include #include #include #include #include class TorrentListCtrl: public wxListCtrl { public: TorrentListCtrl( tr_handle * handle, wxConfig * config, wxWindow * parent, const wxPoint & pos = wxDefaultPosition, const wxSize & size = wxDefaultSize ); virtual ~TorrentListCtrl(); public: enum ShowMode { SHOW_ALL, SHOW_DOWNLOADING, SHOW_UPLOADING, SHOW_COMPLETE, SHOW_INCOMPLETE, SHOW_ACTIVE, SHOW_INACTIVE, N_FILTERS }; void SetShowMode( ShowMode ); int GetShowModeCounts( ShowMode ) const; public: struct Listener { Listener() {} virtual ~Listener() {} virtual void OnTorrentListSelectionChanged( TorrentListCtrl*, const std::set& ) = 0; }; private: typedef std::set listeners_t; listeners_t myListeners; void fire_selection_changed( const std::set& t ) { for( listeners_t::iterator it(myListeners.begin()), end(myListeners.end()); it!=end; ) (*it++)->OnTorrentListSelectionChanged( this, t ); } public: void AddListener( Listener* l ) { myListeners.insert(l); } void RemoveListener( Listener* l ) { myListeners.erase(l); } public: void Rebuild (); void Repopulate (); void Refresh (); void SelectAll (); void DeselectAll (); public: typedef std::vector torrents_v; void Assign( const torrents_v& torrents ); private: void Add( const torrents_v& torrents ); void Sort( int column ); void Resort( ); void RefreshTorrent( tr_torrent*, int, const std::vector& ); void Remove( const std::set& ); static int wxCALLBACK Compare( long, long, long ); /** torrent hash -> the torrent's row in myTorrentList */ typedef std::map str2int_t; str2int_t myHashToItem; private: void SetCell( int item, int col, const wxString& xstr ); private: struct TorStat { time_t time; const tr_stat * stat; TorStat(): time(0), stat(0) {} }; typedef std::map hash2stat_t; hash2stat_t myHashToStat; const tr_stat* getStat( tr_torrent* ); private: void OnSort( wxListEvent& ); void OnItemSelected( wxListEvent& ); void OnItemDeselected( wxListEvent& ); bool IsSorted( ) const; private: tr_handle * myHandle; wxConfig * myConfig; torrents_v myTorrents; int prevSortCol; private: DECLARE_EVENT_TABLE() }; #endif