xref: /haiku/src/apps/mediaconverter/MediaFileListView.cpp (revision 9760dcae2038d47442f4658c2575844c6cf92c40)
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