1/*
2 * Copyright 2006-2010, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "MimeTypeListView.h"
8#include "TypeListWindow.h"
9
10#include <Button.h>
11#include <Catalog.h>
12#include <ControlLook.h>
13#include <LayoutBuilder.h>
14#include <Locale.h>
15#include <ScrollView.h>
16
17#include <string.h>
18
19
20#undef B_TRANSLATION_CONTEXT
21#define B_TRANSLATION_CONTEXT "Type List Window"
22
23
24const uint32 kMsgTypeSelected = 'tpsl';
25const uint32 kMsgSelected = 'seld';
26
27
28TypeListWindow::TypeListWindow(const char* currentType, uint32 what,
29		BWindow* target)
30	:
31	BWindow(BRect(100, 100, 360, 440), B_TRANSLATE("Choose type"),
32		B_MODAL_WINDOW,
33		B_NOT_ZOOMABLE | B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
34	fTarget(target),
35	fWhat(what)
36{
37	float padding = be_control_look->DefaultItemSpacing();
38
39	fSelectButton = new BButton("select", B_TRANSLATE("Done"),
40		new BMessage(kMsgSelected));
41	fSelectButton->SetEnabled(false);
42
43	BButton* button = new BButton("cancel", B_TRANSLATE("Cancel"),
44		new BMessage(B_CANCEL));
45
46	fSelectButton->MakeDefault(true);
47
48	fListView = new MimeTypeListView("typeview", NULL, true, false);
49	fListView->SetSelectionMessage(new BMessage(kMsgTypeSelected));
50	fListView->SetInvocationMessage(new BMessage(kMsgSelected));
51
52	BScrollView* scrollView = new BScrollView("scrollview", fListView,
53		B_FRAME_EVENTS | B_WILL_DRAW, false, true);
54
55	BLayoutBuilder::Group<>(this, B_VERTICAL, padding)
56		.SetInsets(padding)
57		.Add(scrollView)
58		.AddGroup(B_HORIZONTAL, padding)
59			.AddGlue()
60			.Add(button)
61			.Add(fSelectButton);
62
63	BAlignment buttonAlignment =
64		BAlignment(B_ALIGN_USE_FULL_WIDTH, B_ALIGN_VERTICAL_CENTER);
65	button->SetExplicitAlignment(buttonAlignment);
66	fSelectButton->SetExplicitAlignment(buttonAlignment);
67
68	MoveTo(target->Frame().LeftTop() + BPoint(15.0f, 15.0f));
69}
70
71
72TypeListWindow::~TypeListWindow()
73{
74}
75
76
77void
78TypeListWindow::MessageReceived(BMessage* message)
79{
80	switch (message->what) {
81		case kMsgTypeSelected:
82			fSelectButton->SetEnabled(fListView->CurrentSelection() >= 0);
83			break;
84
85		case kMsgSelected:
86		{
87			MimeTypeItem* item = dynamic_cast<MimeTypeItem*>(fListView->ItemAt(
88				fListView->CurrentSelection()));
89			if (item != NULL) {
90				BMessage select(fWhat);
91				select.AddString("type", item->Type());
92				fTarget.SendMessage(&select);
93			}
94
95			// supposed to fall through
96		}
97		case B_CANCEL:
98			PostMessage(B_QUIT_REQUESTED);
99			break;
100
101		default:
102			BWindow::MessageReceived(message);
103			break;
104	}
105}
106
107