1/*
2 * Copyright 2002-2006, Haiku, Inc.
3 * Distributed under the terms of the MIT license.
4 *
5 * Authors:
6 *		Oliver Siebenmarck
7 *		Andrew McCall, mccall@digitalparadise.co.uk
8 *		Michael Wilber
9 */
10
11
12#include "TranslatorListView.h"
13
14#include <string.h>
15
16#include <Application.h>
17#include <String.h>
18#include <TranslatorRoster.h>
19
20
21static int
22compare_items(const void* a, const void* b)
23{
24	const TranslatorItem* itemA = *(const TranslatorItem**)a;
25	const TranslatorItem* itemB = *(const TranslatorItem**)b;
26
27	// Compare by supertype, then by name
28	int typeDiff = itemA->Supertype().Compare(itemB->Supertype());
29	if (typeDiff != 0)
30		return typeDiff;
31
32	return strcmp(itemA->Text(), itemB->Text());
33}
34
35
36//	#pragma mark -
37
38
39TranslatorItem::TranslatorItem(translator_id id, const char* name)
40	:
41	BStringItem(name),
42	fID(id)
43{
44	static BTranslatorRoster* roster = BTranslatorRoster::Default();
45
46	const translation_format* format;
47	int32 count;
48	roster->GetOutputFormats(id, &format, &count);
49
50	// Find a supertype to categorize the item in ("application" is too generic,
51	// so exclude it unless it's the only one available)
52	do {
53		fSupertype = format->MIME;
54		int32 slash = fSupertype.FindFirst('/');
55		fSupertype.Truncate(slash);
56	} while (fSupertype == "application" && --count != 0);
57}
58
59
60TranslatorItem::~TranslatorItem()
61{
62}
63
64
65//	#pragma mark -
66
67
68TranslatorListView::TranslatorListView(const char* name, list_view_type type)
69	:
70	BListView(name, B_SINGLE_SELECTION_LIST)
71{
72}
73
74
75TranslatorListView::~TranslatorListView()
76{
77}
78
79
80TranslatorItem*
81TranslatorListView::TranslatorAt(int32 index) const
82{
83	return dynamic_cast<TranslatorItem*>(ItemAt(index));
84}
85
86
87void
88TranslatorListView::MessageReceived(BMessage* message)
89{
90	uint32 type;
91	int32 count;
92
93	switch (message->what) {
94		case B_SIMPLE_DATA:
95			// Tell the application object that a
96			// file has been dropped on this view
97			message->GetInfo("refs", &type, &count);
98			if (count > 0 && type == B_REF_TYPE) {
99				message->what = B_REFS_RECEIVED;
100				be_app->PostMessage(message);
101				Invalidate();
102			}
103			break;
104
105		default:
106			BListView::MessageReceived(message);
107			break;
108	}
109}
110
111
112void
113TranslatorListView::MouseMoved(BPoint point, uint32 transit,
114	const BMessage* dragMessage)
115{
116	if (dragMessage != NULL && transit == B_ENTERED_VIEW) {
117		// Draw a red box around the inside of the view
118		// to tell the user that this view accepts drops
119		SetHighColor(220, 0, 0);
120		SetPenSize(4);
121		StrokeRect(Bounds());
122		SetHighColor(0, 0, 0);
123	} else if (dragMessage != NULL && transit == B_EXITED_VIEW)
124		Invalidate();
125
126	BListView::MouseMoved(point, transit, dragMessage);
127}
128
129
130void
131TranslatorListView::SortItems()
132{
133	BListView::SortItems(&compare_items);
134}
135
136