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
22MediaFileListItem::MediaFileListItem(BMediaFile* file, const entry_ref& ref)
23	:
24	BStringItem(ref.name),
25	fRef(ref),
26	fMediaFile(file)
27{
28}
29
30
31MediaFileListItem::~MediaFileListItem()
32{
33	delete fMediaFile;
34}
35
36
37// #pragma mark - MediaFileListView
38
39
40MediaFileListView::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
49MediaFileListView::~MediaFileListView()
50{
51	BListItem *item;
52	while ((item = RemoveItem((int32)0)) != NULL) {
53		delete item;
54	}
55}
56
57
58void
59MediaFileListView::SetEnabled(bool enabled)
60{
61	if (enabled == fEnabled)
62		return;
63
64	fEnabled = enabled;
65	// TODO: visual indication of enabled status?
66}
67
68
69bool
70MediaFileListView::IsEnabled() const
71{
72	return fEnabled;
73}
74
75
76bool
77MediaFileListView::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
89void
90MediaFileListView::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
114void
115MediaFileListView::SelectionChanged()
116{
117	MediaConverterWindow* win = dynamic_cast<MediaConverterWindow*>(Window());
118	if (win != NULL)
119		win->SourceFileSelectionChanged();
120}
121