2 // This file is part of the aMule Project.
4 // Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 // Copyright (c) 2002 Merkur ( devs@emule-project.net / http://www.emule-project.net )
7 // Any parts of this program derived from the xMule, lMule or eMule project,
8 // or contributed by third-party developers are copyrighted by their
11 // This program is free software; you can redistribute it and/or modify
12 // it under the terms of the GNU General Public License as published by
13 // the Free Software Foundation; either version 2 of the License, or
14 // (at your option) any later version.
16 // This program is distributed in the hope that it will be useful,
17 // but WITHOUT ANY WARRANTY; without even the implied warranty of
18 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 // GNU General Public License for more details.
21 // You should have received a copy of the GNU General Public License
22 // along with this program; if not, write to the Free Software
23 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 #include "SharedFilesCtrl.h" // Interface declarations
28 #include <common/MenuIDs.h>
30 #include "muuli_wdr.h" // Needed for ID_SHFILELIST
31 #include "SharedFilesWnd.h" // Needed for CSharedFilesWnd
32 #include "amuleDlg.h" // Needed for CamuleDlg
33 #include "CommentDialog.h" // Needed for CCommentDialog
34 #include "PartFile.h" // Needed for CPartFile
35 #include "SharedFileList.h" // Needed for CKnownFileMap
36 #include "amule.h" // Needed for theApp
37 #include "ServerConnect.h" // Needed for CServerConnect
38 #include "Preferences.h" // Needed for thePrefs
39 #include "BarShader.h" // Needed for CBarShader
40 #include "DataToText.h" // Needed for PriorityToStr
41 #include "GuiEvents.h" // Needed for CoreNotify_*
42 #include "MuleCollection.h" // Needed for CMuleCollection
43 #include "DownloadQueue.h" // Needed for CDownloadQueue
44 #include "TransferWnd.h" // Needed for CTransferWnd
47 BEGIN_EVENT_TABLE(CSharedFilesCtrl
,CMuleListCtrl
)
48 EVT_LIST_ITEM_RIGHT_CLICK(-1, CSharedFilesCtrl::OnRightClick
)
50 EVT_MENU( MP_PRIOVERYLOW
, CSharedFilesCtrl::OnSetPriority
)
51 EVT_MENU( MP_PRIOLOW
, CSharedFilesCtrl::OnSetPriority
)
52 EVT_MENU( MP_PRIONORMAL
, CSharedFilesCtrl::OnSetPriority
)
53 EVT_MENU( MP_PRIOHIGH
, CSharedFilesCtrl::OnSetPriority
)
54 EVT_MENU( MP_PRIOVERYHIGH
, CSharedFilesCtrl::OnSetPriority
)
55 EVT_MENU( MP_POWERSHARE
, CSharedFilesCtrl::OnSetPriority
)
56 EVT_MENU( MP_PRIOAUTO
, CSharedFilesCtrl::OnSetPriorityAuto
)
58 EVT_MENU( MP_CMT
, CSharedFilesCtrl::OnEditComment
)
59 EVT_MENU( MP_ADDCOLLECTION
, CSharedFilesCtrl::OnAddCollection
)
60 EVT_MENU( MP_GETMAGNETLINK
, CSharedFilesCtrl::OnCreateURI
)
61 EVT_MENU( MP_GETED2KLINK
, CSharedFilesCtrl::OnCreateURI
)
62 EVT_MENU( MP_GETSOURCEED2KLINK
, CSharedFilesCtrl::OnCreateURI
)
63 EVT_MENU( MP_GETCRYPTSOURCEDED2KLINK
, CSharedFilesCtrl::OnCreateURI
)
64 EVT_MENU( MP_GETHOSTNAMESOURCEED2KLINK
, CSharedFilesCtrl::OnCreateURI
)
65 EVT_MENU( MP_GETHOSTNAMECRYPTSOURCEED2KLINK
, CSharedFilesCtrl::OnCreateURI
)
66 EVT_MENU( MP_GETAICHED2KLINK
, CSharedFilesCtrl::OnCreateURI
)
67 EVT_MENU( MP_GETAICHED2KLINKSRC
, CSharedFilesCtrl::OnCreateURI
)
68 EVT_MENU( MP_RENAME
, CSharedFilesCtrl::OnRename
)
69 EVT_MENU( MP_WS
, CSharedFilesCtrl::OnGetFeedback
)
72 EVT_CHAR( CSharedFilesCtrl::OnKeyPressed
)
75 enum SharedFilesListColumns
{
76 ID_SHARED_COL_NAME
= 0,
91 CSharedFilesCtrl::CSharedFilesCtrl(wxWindow
* parent
, int id
, const wxPoint
& pos
, wxSize size
, int flags
)
92 : CMuleListCtrl(parent
, id
, pos
, size
, flags
| wxLC_OWNERDRAW
)
94 // Setting the sorter function.
95 SetSortFunc( SortProc
);
97 // Set the table-name (for loading and saving preferences).
98 SetTableName( wxT("Shared") );
102 InsertColumn(ID_SHARED_COL_NAME
, _("File Name"), wxLIST_FORMAT_LEFT
, 250, wxT("N") );
103 InsertColumn(ID_SHARED_COL_SIZE
, _("Size"), wxLIST_FORMAT_LEFT
, 100, wxT("Z") );
104 InsertColumn(ID_SHARED_COL_TYPE
, _("Type"), wxLIST_FORMAT_LEFT
, 50, wxT("Y") );
105 InsertColumn(ID_SHARED_COL_PRIO
, _("Priority"), wxLIST_FORMAT_LEFT
, 70, wxT("p") );
106 InsertColumn(ID_SHARED_COL_ID
, _("FileID"), wxLIST_FORMAT_LEFT
, 220, wxT("I") );
107 InsertColumn(ID_SHARED_COL_REQ
, _("Requests"), wxLIST_FORMAT_LEFT
, 100, wxT("Q") );
108 InsertColumn(ID_SHARED_COL_AREQ
, _("Accepted Requests"), wxLIST_FORMAT_LEFT
, 100, wxT("A") );
109 InsertColumn(ID_SHARED_COL_TRA
, _("Transferred Data"), wxLIST_FORMAT_LEFT
, 120, wxT("T") );
110 InsertColumn(ID_SHARED_COL_RTIO
, _("Share Ratio"), wxLIST_FORMAT_LEFT
, 100, wxT("R") );
111 InsertColumn(ID_SHARED_COL_PART
, _("Obtained Parts"), wxLIST_FORMAT_LEFT
, 120, wxT("P") );
112 InsertColumn(ID_SHARED_COL_CMPL
, _("Complete Sources"), wxLIST_FORMAT_LEFT
, 120, wxT("C") );
113 InsertColumn(ID_SHARED_COL_PATH
, _("Directory Path"), wxLIST_FORMAT_LEFT
, 220, wxT("D") );
119 wxString
CSharedFilesCtrl::GetOldColumnOrder() const
121 return wxT("N,Z,Y,p,I,Q,A,T,R,P,C,D");
125 CSharedFilesCtrl::~CSharedFilesCtrl()
130 void CSharedFilesCtrl::OnRightClick(wxListEvent
& event
)
132 long item_hit
= CheckSelection(event
);
134 if ( (m_menu
== NULL
) && (item_hit
!= -1)) {
135 m_menu
= new wxMenu(_("Shared Files"));
136 wxMenu
* prioMenu
= new wxMenu();
137 prioMenu
->AppendCheckItem(MP_PRIOVERYLOW
, _("Very low"));
138 prioMenu
->AppendCheckItem(MP_PRIOLOW
, _("Low"));
139 prioMenu
->AppendCheckItem(MP_PRIONORMAL
, _("Normal"));
140 prioMenu
->AppendCheckItem(MP_PRIOHIGH
, _("High"));
141 prioMenu
->AppendCheckItem(MP_PRIOVERYHIGH
, _("Very High"));
142 prioMenu
->AppendCheckItem(MP_POWERSHARE
, _("Release"));
143 prioMenu
->AppendCheckItem(MP_PRIOAUTO
, _("Auto"));
145 m_menu
->Append(0,_("Priority"),prioMenu
);
146 m_menu
->AppendSeparator();
148 CKnownFile
* file
= reinterpret_cast<CKnownFile
*>(GetItemData(item_hit
));
149 if (file
->GetFileComment().IsEmpty() && !file
->GetFileRating()) {
150 m_menu
->Append(MP_CMT
, _("Add Comment/Rating"));
152 m_menu
->Append(MP_CMT
, _("Edit Comment/Rating"));
155 m_menu
->AppendSeparator();
156 m_menu
->Append(MP_RENAME
, _("Rename"));
157 m_menu
->AppendSeparator();
159 if (file
->GetFileName().GetExt() == wxT("emulecollection")) {
160 m_menu
->Append( MP_ADDCOLLECTION
, _("Add files in collection to transfer list"));
161 m_menu
->AppendSeparator();
163 m_menu
->Append(MP_GETMAGNETLINK
,_("Copy magnet &URI to clipboard"));
164 m_menu
->Append(MP_GETED2KLINK
,_("Copy eD2k &link to clipboard"));
165 m_menu
->Append(MP_GETSOURCEED2KLINK
,_("Copy eD2k link to clipboard (&Source)"));
166 m_menu
->Append(MP_GETCRYPTSOURCEDED2KLINK
,_("Copy eD2k link to clipboard (Source) (&With Crypt options)"));
167 m_menu
->Append(MP_GETHOSTNAMESOURCEED2KLINK
,_("Copy eD2k link to clipboard (&Hostname)"));
168 m_menu
->Append(MP_GETHOSTNAMECRYPTSOURCEED2KLINK
,_("Copy eD2k link to clipboard (Hostname) (With &Crypt options)"));
169 m_menu
->Append(MP_GETAICHED2KLINK
,_("Copy eD2k link to clipboard (&AICH info)"));
170 m_menu
->Append(MP_GETAICHED2KLINKSRC
,_("Copy eD2k link to clipboard (&AICH info + Source)"));
171 m_menu
->Append(MP_WS
,_("Copy feedback to clipboard"));
173 m_menu
->Enable(MP_GETAICHED2KLINK
, file
->HasProperAICHHashSet());
174 m_menu
->Enable(MP_GETAICHED2KLINKSRC
, file
->HasProperAICHHashSet());
175 m_menu
->Enable(MP_GETHOSTNAMESOURCEED2KLINK
, !thePrefs::GetYourHostname().IsEmpty());
176 m_menu
->Enable(MP_GETHOSTNAMECRYPTSOURCEED2KLINK
, !thePrefs::GetYourHostname().IsEmpty());
178 int priority
= file
->IsAutoUpPriority() ? PR_AUTO
: file
->GetUpPriority();
180 prioMenu
->Check(MP_PRIOVERYLOW
, priority
== PR_VERYLOW
);
181 prioMenu
->Check(MP_PRIOLOW
, priority
== PR_LOW
);
182 prioMenu
->Check(MP_PRIONORMAL
, priority
== PR_NORMAL
);
183 prioMenu
->Check(MP_PRIOHIGH
, priority
== PR_HIGH
);
184 prioMenu
->Check(MP_PRIOVERYHIGH
,priority
== PR_VERYHIGH
);
185 prioMenu
->Check(MP_POWERSHARE
, priority
== PR_POWERSHARE
);
186 prioMenu
->Check(MP_PRIOAUTO
, priority
== PR_AUTO
);
188 PopupMenu( m_menu
, event
.GetPoint() );
197 void CSharedFilesCtrl::OnGetFeedback(wxCommandEvent
& WXUNUSED(event
))
200 long index
= GetNextItem(-1, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
201 while (index
!= -1) {
202 if (feed
.IsEmpty()) {
203 feed
= CFormat(_("Feedback from: %s (%s)\n\n")) % thePrefs::GetUserNick() % theApp
->GetFullMuleVersion();
207 feed
+= reinterpret_cast<CKnownFile
*>(GetItemData(index
))->GetFeedback();
208 index
= GetNextItem(index
, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
211 if (!feed
.IsEmpty()) {
212 theApp
->CopyTextToClipboard(feed
);
217 void CSharedFilesCtrl::ShowFileList()
222 std::vector
<CKnownFile
*> files
;
223 theApp
->sharedfiles
->CopyFileList(files
);
224 for (unsigned i
= 0; i
< files
.size(); ++i
) {
225 DoShowFile(files
[i
], true);
235 void CSharedFilesCtrl::RemoveFile(CKnownFile
*toRemove
)
237 long index
= FindItem( -1, reinterpret_cast<wxUIntPtr
>(toRemove
) );
247 void CSharedFilesCtrl::ShowFile(CKnownFile
* file
)
249 DoShowFile(file
, false);
253 void CSharedFilesCtrl::DoShowFile(CKnownFile
* file
, bool batch
)
255 wxUIntPtr ptr
= reinterpret_cast<wxUIntPtr
>(file
);
256 if ((!batch
) && (FindItem(-1, ptr
) > -1)) {
260 const long insertPos
= (batch
? GetItemCount() : GetInsertPos(ptr
));
262 long newitem
= InsertItem(insertPos
, wxEmptyString
);
263 SetItemPtrData( newitem
, ptr
);
270 void CSharedFilesCtrl::OnSetPriority( wxCommandEvent
& event
)
274 switch ( event
.GetId() ) {
275 case MP_PRIOVERYLOW
: priority
= PR_VERYLOW
; break;
276 case MP_PRIOLOW
: priority
= PR_LOW
; break;
277 case MP_PRIONORMAL
: priority
= PR_NORMAL
; break;
278 case MP_PRIOHIGH
: priority
= PR_HIGH
; break;
279 case MP_PRIOVERYHIGH
: priority
= PR_VERYHIGH
; break;
280 case MP_POWERSHARE
: priority
= PR_POWERSHARE
; break;
283 long index
= GetNextItem( -1, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
285 while( index
!= -1 ) {
286 CKnownFile
* file
= reinterpret_cast<CKnownFile
*>(GetItemData(index
));
287 CoreNotify_KnownFile_Up_Prio_Set( file
, priority
);
289 RefreshItem( index
);
291 index
= GetNextItem( index
, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
296 void CSharedFilesCtrl::OnSetPriorityAuto( wxCommandEvent
& WXUNUSED(event
) )
298 long index
= GetNextItem( -1, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
300 while( index
!= -1 ) {
301 CKnownFile
* file
= reinterpret_cast<CKnownFile
*>(GetItemData(index
));
302 CoreNotify_KnownFile_Up_Prio_Auto(file
);
304 RefreshItem( index
);
306 index
= GetNextItem( index
, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
311 void CSharedFilesCtrl::OnCreateURI( wxCommandEvent
& event
)
315 if ( event
.GetId() == MP_GETSOURCEED2KLINK
|| event
.GetId() == MP_GETCRYPTSOURCEDED2KLINK
) {
316 if ( !( (theApp
->IsConnectedED2K() && !theApp
->serverconnect
->IsLowID())
317 || (theApp
->IsConnectedKad() && !theApp
->IsFirewalledKad() ))) {
318 wxMessageBox(_("You need a HighID to create a valid sourcelink"), _("WARNING"), wxOK
| wxICON_ERROR
, this);
323 long index
= GetNextItem( -1, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
325 while( index
!= -1 ) {
326 CKnownFile
* file
= reinterpret_cast<CKnownFile
*>(GetItemData(index
));
328 switch ( event
.GetId() ) {
329 case MP_GETMAGNETLINK
: URIs
+= theApp
->CreateMagnetLink( file
) + wxT("\n"); break;
330 case MP_GETED2KLINK
: URIs
+= theApp
->CreateED2kLink( file
) + wxT("\n"); break;
331 case MP_GETSOURCEED2KLINK
: URIs
+= theApp
->CreateED2kLink( file
, true) + wxT("\n"); break;
332 case MP_GETCRYPTSOURCEDED2KLINK
: URIs
+= theApp
->CreateED2kLink( file
, true, false, true) + wxT("\n"); break;
333 case MP_GETHOSTNAMESOURCEED2KLINK
: URIs
+= theApp
->CreateED2kLink( file
, true, true) + wxT("\n"); break;
334 case MP_GETHOSTNAMECRYPTSOURCEED2KLINK
: URIs
+= theApp
->CreateED2kLink( file
, true, true, true ) + wxT("\n"); break;
335 case MP_GETAICHED2KLINK
: URIs
+= theApp
->CreateED2kLink(file
, false, false, false, true) + wxT("\n"); break;
336 case MP_GETAICHED2KLINKSRC
: URIs
+= theApp
->CreateED2kLink(file
, true, false, false, true) + wxT("\n"); break;
339 index
= GetNextItem( index
, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
342 if ( !URIs
.IsEmpty() ) {
343 theApp
->CopyTextToClipboard( URIs
.RemoveLast() );
348 void CSharedFilesCtrl::OnEditComment( wxCommandEvent
& WXUNUSED(event
) )
350 long index
= GetNextItem( -1, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
353 CKnownFile
* file
= reinterpret_cast<CKnownFile
*>(GetItemData(index
));
355 CCommentDialog
dialog( this, file
);
362 int CSharedFilesCtrl::SortProc(wxUIntPtr item1
, wxUIntPtr item2
, long sortData
)
364 CKnownFile
* file1
= reinterpret_cast<CKnownFile
*>(item1
);
365 CKnownFile
* file2
= reinterpret_cast<CKnownFile
*>(item2
);
367 int mod
= (sortData
& CMuleListCtrl::SORT_DES
) ? -1 : 1;
368 bool altSorting
= (sortData
& CMuleListCtrl::SORT_ALT
) > 0;
370 switch (sortData
& CMuleListCtrl::COLUMN_MASK
) {
372 case ID_SHARED_COL_NAME
:
373 return mod
* CmpAny(file1
->GetFileName(), file2
->GetFileName());
376 case ID_SHARED_COL_SIZE
:
377 return mod
* CmpAny( file1
->GetFileSize(), file2
->GetFileSize() );
380 case ID_SHARED_COL_TYPE
:
381 return mod
* GetFiletypeByName(file1
->GetFileName()).CmpNoCase(GetFiletypeByName( file2
->GetFileName()) );
384 case ID_SHARED_COL_PRIO
: {
385 int8 prioA
= file1
->GetUpPriority();
386 int8 prioB
= file2
->GetUpPriority();
388 // Work-around for PR_VERYLOW which has value 4. See KnownFile.h for that stupidity ...
389 return mod
* CmpAny( ( prioB
!= PR_VERYLOW
? prioB
: -1 ), ( prioA
!= PR_VERYLOW
? prioA
: -1 ) );
393 case ID_SHARED_COL_ID
:
394 return mod
* file1
->GetFileHash().Encode().Cmp( file2
->GetFileHash().Encode() );
396 // Sort by Requests this session.
397 case ID_SHARED_COL_REQ
:
399 return mod
* CmpAny( file1
->statistic
.GetAllTimeRequests(), file2
->statistic
.GetAllTimeRequests() );
401 return mod
* CmpAny( file1
->statistic
.GetRequests(), file2
->statistic
.GetRequests() );
404 // Sort by accepted requests. Ascending.
405 case ID_SHARED_COL_AREQ
:
407 return mod
* CmpAny( file1
->statistic
.GetAllTimeAccepts(), file2
->statistic
.GetAllTimeAccepts() );
409 return mod
* CmpAny( file1
->statistic
.GetAccepts(), file2
->statistic
.GetAccepts() );
412 // Sort by transferred. Ascending.
413 case ID_SHARED_COL_TRA
:
415 return mod
* CmpAny( file1
->statistic
.GetAllTimeTransferred(), file2
->statistic
.GetAllTimeTransferred() );
417 return mod
* CmpAny( file1
->statistic
.GetTransferred(), file2
->statistic
.GetTransferred() );
420 // Sort by Share Ratio. Ascending.
421 case ID_SHARED_COL_RTIO
:
422 return mod
* CmpAny( (double)file1
->statistic
.GetAllTimeTransferred() / file1
->GetFileSize(),
423 (double)file2
->statistic
.GetAllTimeTransferred() / file2
->GetFileSize() );
425 // Complete sources asc
426 case ID_SHARED_COL_CMPL
:
427 return mod
* CmpAny( file1
->m_nCompleteSourcesCount
, file2
->m_nCompleteSourcesCount
);
430 case ID_SHARED_COL_PATH
: {
431 if ( file1
->IsPartFile() && file2
->IsPartFile() )
433 if ( file1
->IsPartFile() )
435 if ( file2
->IsPartFile() )
438 return mod
* CmpAny(file1
->GetFilePath(), file2
->GetFilePath());
447 void CSharedFilesCtrl::UpdateItem(CKnownFile
* toupdate
)
449 long result
= FindItem( -1, reinterpret_cast<wxUIntPtr
>(toupdate
) );
454 if ( GetItemState( result
, wxLIST_STATE_SELECTED
) ) {
455 theApp
->amuledlg
->m_sharedfileswnd
->SelectionUpdated();
461 void CSharedFilesCtrl::ShowFilesCount()
463 wxStaticText
* label
= CastByName( wxT("sharedFilesLabel"), GetParent(), wxStaticText
);
465 label
->SetLabel(CFormat(_("Shared Files (%i)")) % GetItemCount());
466 label
->GetParent()->Layout();
467 // If file list was updated, the "selection" is involved too, if we chose to show clients for all files.
468 // So update client list here too.
469 theApp
->amuledlg
->m_sharedfileswnd
->SelectionUpdated();
473 void CSharedFilesCtrl::OnDrawItem( int item
, wxDC
* dc
, const wxRect
& rect
, const wxRect
& rectHL
, bool highlighted
)
475 CKnownFile
*file
= reinterpret_cast<CKnownFile
*>(GetItemData(item
));
479 CMuleColour
newcol(GetFocus() ? wxSYS_COLOUR_HIGHLIGHT
: wxSYS_COLOUR_BTNSHADOW
);
480 dc
->SetBackground(newcol
.Blend(125).GetBrush());
481 dc
->SetTextForeground( CMuleColour(wxSYS_COLOUR_HIGHLIGHTTEXT
));
482 // The second blending goes over the first one.
483 dc
->SetPen(newcol
.Blend(65).GetPen());
485 dc
->SetBackground( CMuleColour(wxSYS_COLOUR_LISTBOX
).GetBrush() );
486 dc
->SetTextForeground(CMuleColour(wxSYS_COLOUR_WINDOWTEXT
));
487 dc
->SetPen(*wxTRANSPARENT_PEN
);
490 dc
->SetBrush(dc
->GetBackground());
491 dc
->DrawRectangle(rectHL
);
492 dc
->SetPen(*wxTRANSPARENT_PEN
);
494 // Offset based on the height of the fonts
495 const int textVOffset
= ( rect
.GetHeight() - dc
->GetCharHeight() ) / 2;
496 // Empty space to each side of a column
497 const int SPARE_PIXELS_HORZ
= 4;
499 // The leftmost position of the current column
502 for ( int i
= 0; i
< GetColumnCount(); ++i
) {
503 const int columnWidth
= GetColumnWidth(i
);
505 if (columnWidth
> 2*SPARE_PIXELS_HORZ
) {
507 columnLeft
+ SPARE_PIXELS_HORZ
, rect
.y
,
508 columnWidth
- 2 * SPARE_PIXELS_HORZ
, rect
.height
);
510 wxDCClipper
clipper(*dc
, columnRect
);
514 case ID_SHARED_COL_NAME
:
515 textBuffer
= file
->GetFileName().GetPrintable();
517 if (file
->GetFileRating() || file
->GetFileComment().Length()) {
518 int image
= Client_CommentOnly_Smiley
;
519 if (file
->GetFileRating()) {
520 image
= Client_InvalidRating_Smiley
+ file
->GetFileRating() - 1;
523 wxASSERT(image
>= Client_InvalidRating_Smiley
);
524 wxASSERT(image
<= Client_CommentOnly_Smiley
);
528 theApp
->amuledlg
->m_imagelist
.Draw(image
, *dc
, columnRect
.x
,
529 columnRect
.y
+ 1, wxIMAGELIST_DRAW_TRANSPARENT
);
531 // Move the text to the right
532 columnRect
.x
+= (imgWidth
+ 4);
537 case ID_SHARED_COL_SIZE
:
538 textBuffer
= CastItoXBytes(file
->GetFileSize());
541 case ID_SHARED_COL_TYPE
:
542 textBuffer
= GetFiletypeByName(file
->GetFileName());
545 case ID_SHARED_COL_PRIO
:
546 textBuffer
= PriorityToStr(file
->GetUpPriority(), file
->IsAutoUpPriority());
549 case ID_SHARED_COL_ID
:
550 textBuffer
= file
->GetFileHash().Encode();
553 case ID_SHARED_COL_REQ
:
554 textBuffer
= CFormat(wxT("%u (%u)"))
555 % file
->statistic
.GetRequests()
556 % file
->statistic
.GetAllTimeRequests();
559 case ID_SHARED_COL_AREQ
:
560 textBuffer
= CFormat(wxT("%u (%u)"))
561 % file
->statistic
.GetAccepts()
562 % file
->statistic
.GetAllTimeAccepts();
565 case ID_SHARED_COL_TRA
:
566 textBuffer
= CastItoXBytes(file
->statistic
.GetTransferred())
567 + wxT(" (") + CastItoXBytes(file
->statistic
.GetAllTimeTransferred()) + wxT(")");
570 case ID_SHARED_COL_RTIO
:
571 textBuffer
= CFormat(wxT("%.2f")) % ((double)file
->statistic
.GetAllTimeTransferred() / file
->GetFileSize());
574 case ID_SHARED_COL_PART
:
575 if ( file
->GetPartCount() ) {
576 wxRect
barRect(columnRect
.x
, columnRect
. y
+ 1,
577 columnRect
.width
, columnRect
.height
- 2);
579 DrawAvailabilityBar(file
, dc
, barRect
);
583 case ID_SHARED_COL_CMPL
:
584 if ( file
->m_nCompleteSourcesCountLo
== 0 ) {
585 if ( file
->m_nCompleteSourcesCountHi
) {
586 textBuffer
= CFormat(wxT("< %u")) % file
->m_nCompleteSourcesCountHi
;
588 textBuffer
= wxT("0");
590 } else if (file
->m_nCompleteSourcesCountLo
== file
->m_nCompleteSourcesCountHi
) {
591 textBuffer
= CFormat(wxT("%u")) % file
->m_nCompleteSourcesCountLo
;
593 textBuffer
= CFormat(wxT("%u - %u")) % file
->m_nCompleteSourcesCountLo
% file
->m_nCompleteSourcesCountHi
;
598 case ID_SHARED_COL_PATH
:
599 if ( file
->IsPartFile() ) {
600 textBuffer
= _("[PartFile]");
602 textBuffer
= file
->GetFilePath().GetPrintable();
606 if (!textBuffer
.IsEmpty()) {
607 dc
->DrawText(textBuffer
, columnRect
.x
, columnRect
.y
+ textVOffset
);
611 // Move to the next column
612 columnLeft
+= columnWidth
;
617 wxString
CSharedFilesCtrl::GetTTSText(unsigned item
) const
619 return reinterpret_cast<CKnownFile
*>(GetItemData(item
))->GetFileName().GetPrintable();
623 bool CSharedFilesCtrl::AltSortAllowed(unsigned column
) const
626 case ID_SHARED_COL_REQ
:
627 case ID_SHARED_COL_AREQ
:
628 case ID_SHARED_COL_TRA
:
637 void CSharedFilesCtrl::DrawAvailabilityBar(CKnownFile
* file
, wxDC
* dc
, const wxRect
& rect
) const
639 // Reference to the availability list
640 const ArrayOfUInts16
& list
= file
->IsPartFile() ?
641 static_cast<CPartFile
*>(file
)->m_SrcpartFrequency
:
642 file
->m_AvailPartFrequency
;
643 wxPen old_pen
= dc
->GetPen();
644 wxBrush old_brush
= dc
->GetBrush();
645 bool bFlat
= thePrefs::UseFlatBar();
647 wxRect barRect
= rect
;
648 if (!bFlat
) { // round bar has a black border, the bar itself is 1 pixel less on each border
654 static CBarShader s_ChunkBar
;
655 s_ChunkBar
.SetFileSize( file
->GetFileSize() );
656 s_ChunkBar
.SetHeight( barRect
.GetHeight() );
657 s_ChunkBar
.SetWidth( barRect
.GetWidth() );
658 s_ChunkBar
.Set3dDepth( CPreferences::Get3DDepth() );
660 for ( unsigned int i
= 0; i
< list
.size(); ++i
) {
661 uint64 start
= PARTSIZE
* static_cast<uint64
>(i
);
662 end
= PARTSIZE
* static_cast<uint64
>(i
+ 1);
663 s_ChunkBar
.FillRange(start
, end
, CMuleColour(list
[i
] ? 0 : 255, list
[i
] ? ((210-(22*( list
[i
] - 1 ) ) < 0) ? 0 : (210-(22*( list
[i
] - 1 ) ))) : 0, list
[i
] ? 255 : 0));
665 s_ChunkBar
.FillRange(end
+ 1, file
->GetFileSize() - 1, CMuleColour(255, 0, 0));
666 s_ChunkBar
.Draw(dc
, barRect
.x
, barRect
.y
, bFlat
);
670 dc
->SetPen( *wxBLACK_PEN
);
671 dc
->SetBrush( *wxTRANSPARENT_BRUSH
);
672 dc
->DrawRectangle(rect
);
675 dc
->SetPen( old_pen
);
676 dc
->SetBrush( old_brush
);
679 void CSharedFilesCtrl::OnRename( wxCommandEvent
& WXUNUSED(event
) )
681 int item
= GetNextItem( -1, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
683 CKnownFile
* file
= reinterpret_cast<CKnownFile
*>(GetItemData(item
));
685 wxString strNewName
= ::wxGetTextFromUser(
686 _("Enter new name for this file:"),
687 _("File rename"), file
->GetFileName().GetPrintable());
689 CPath newName
= CPath(strNewName
);
690 if (newName
.IsOk() && (newName
!= file
->GetFileName())) {
691 theApp
->sharedfiles
->RenameFile(file
, newName
);
697 void CSharedFilesCtrl::OnKeyPressed( wxKeyEvent
& event
)
699 if (event
.GetKeyCode() == WXK_F2
) {
709 void CSharedFilesCtrl::OnAddCollection( wxCommandEvent
& WXUNUSED(evt
) )
711 int item
= GetNextItem( -1, wxLIST_NEXT_ALL
, wxLIST_STATE_SELECTED
);
713 CKnownFile
*file
= reinterpret_cast<CKnownFile
*>(GetItemData(item
));
714 wxString CollectionFile
= file
->GetFilePath().JoinPaths(file
->GetFileName()).GetRaw();
715 CMuleCollection my_collection
;
716 if (my_collection
.Open( (std::string
)CollectionFile
.mb_str() )) {
717 //#warning This is probably not working on Unicode
718 for (size_t e
= 0; e
< my_collection
.GetFileCount(); ++e
) {
719 theApp
->downloadqueue
->AddLink(
720 wxString(my_collection
.GetEd2kLink(e
).c_str(), wxConvUTF8
));
727 // File_checked_for_headers