1 // Copyright 1999, Be Incorporated. All Rights Reserved. 2 // Copyright 2000-2004, Jun Suzuki. All Rights Reserved. 3 // Copyright 2007, 2009 Stephan Aßmus. All Rights Reserved. 4 // This file may be used under the terms of the Be Sample Code License. 5 6 7 #include "MediaFileListView.h" 8 9 #include <new> 10 11 #include <Application.h> 12 #include <MediaFile.h> 13 #include <Messenger.h> 14 15 #include "MediaConverterWindow.h" 16 #include "MessageConstants.h" 17 18 19 // #pragma mark - MediaFileListItem 20 21 22 MediaFileListItem::MediaFileListItem(BMediaFile* file, const entry_ref& ref) 23 : 24 BStringItem(ref.name), 25 fRef(ref), 26 fMediaFile(file) 27 { 28 } 29 30 31 MediaFileListItem::~MediaFileListItem() 32 { 33 delete fMediaFile; 34 } 35 36 37 // #pragma mark - MediaFileListView 38 39 40 MediaFileListView::MediaFileListView(BRect frame, uint32 resizingMode) 41 : BListView(frame, "MediaFileListView", B_SINGLE_SELECTION_LIST, resizingMode, 42 B_WILL_DRAW | B_NAVIGABLE | B_FRAME_EVENTS) 43 { 44 fEnabled = true; 45 } 46 47 48 MediaFileListView::~MediaFileListView() 49 { 50 BListItem *item; 51 while ((item = RemoveItem((int32)0)) != NULL) { 52 delete item; 53 } 54 } 55 56 57 void 58 MediaFileListView::SetEnabled(bool enabled) 59 { 60 if (enabled == fEnabled) 61 return; 62 63 fEnabled = enabled; 64 // TODO: visual indication of enabled status? 65 } 66 67 68 bool 69 MediaFileListView::IsEnabled() const 70 { 71 return fEnabled; 72 } 73 74 75 bool 76 MediaFileListView::AddMediaItem(BMediaFile* file, const entry_ref& ref) 77 { 78 MediaFileListItem* item = new(std::nothrow) MediaFileListItem(file, ref); 79 if (item == NULL || !AddItem(item)) { 80 delete item; 81 return false; 82 } 83 be_app_messenger.SendMessage(FILE_LIST_CHANGE_MESSAGE); 84 return true; 85 } 86 87 88 void 89 MediaFileListView::KeyDown(const char *bytes, int32 numBytes) 90 { 91 switch (bytes[0]) { 92 case B_DELETE: 93 if (IsEnabled()) { 94 int32 selection = CurrentSelection(); 95 if (selection >= 0) { 96 delete RemoveItem(selection); 97 // select the previous item 98 int32 count = CountItems(); 99 if (selection >= count) 100 selection = count - 1; 101 Select(selection); 102 be_app_messenger.SendMessage(FILE_LIST_CHANGE_MESSAGE); 103 } 104 } 105 break; 106 default: 107 BListView::KeyDown(bytes, numBytes); 108 } 109 } 110 111 112 void 113 MediaFileListView::SelectionChanged() 114 { 115 MediaConverterWindow* win = dynamic_cast<MediaConverterWindow*>(Window()); 116 if (win != NULL) 117 win->SourceFileSelectionChanged(); 118 } 119 120