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() 41 : 42 BListView("MediaFileListView", B_SINGLE_SELECTION_LIST, B_WILL_DRAW 43 | B_NAVIGABLE | B_FRAME_EVENTS) 44 { 45 fEnabled = true; 46 } 47 48 49 MediaFileListView::~MediaFileListView() 50 { 51 BListItem *item; 52 while ((item = RemoveItem((int32)0)) != NULL) { 53 delete item; 54 } 55 } 56 57 58 void 59 MediaFileListView::SetEnabled(bool enabled) 60 { 61 if (enabled == fEnabled) 62 return; 63 64 fEnabled = enabled; 65 // TODO: visual indication of enabled status? 66 } 67 68 69 bool 70 MediaFileListView::IsEnabled() const 71 { 72 return fEnabled; 73 } 74 75 76 bool 77 MediaFileListView::AddMediaItem(BMediaFile* file, const entry_ref& ref) 78 { 79 MediaFileListItem* item = new(std::nothrow) MediaFileListItem(file, ref); 80 if (item == NULL || !AddItem(item)) { 81 delete item; 82 return false; 83 } 84 be_app_messenger.SendMessage(FILE_LIST_CHANGE_MESSAGE); 85 return true; 86 } 87 88 89 void 90 MediaFileListView::KeyDown(const char *bytes, int32 numBytes) 91 { 92 switch (bytes[0]) { 93 case B_DELETE: 94 if (IsEnabled()) { 95 int32 selection = CurrentSelection(); 96 if (selection >= 0) { 97 delete RemoveItem(selection); 98 // select the previous item 99 int32 count = CountItems(); 100 if (selection >= count) 101 selection = count - 1; 102 Select(selection); 103 be_app_messenger.SendMessage(FILE_LIST_CHANGE_MESSAGE); 104 } 105 } 106 break; 107 default: 108 BListView::KeyDown(bytes, numBytes); 109 break; 110 } 111 } 112 113 114 void 115 MediaFileListView::SelectionChanged() 116 { 117 MediaConverterWindow* win = dynamic_cast<MediaConverterWindow*>(Window()); 118 if (win != NULL) 119 win->SourceFileSelectionChanged(); 120 } 121