1/*
2 * Copyright 2015 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * 		Josef Gajdusek
7 */
8
9
10#include "PopUpColumn.h"
11
12#include <PopUpMenu.h>
13#include <MenuItem.h>
14#include <Window.h>
15
16#include "EditWindow.h"
17#include "ShortcutsWindow.h"
18
19PopUpColumn::PopUpColumn(BPopUpMenu* menu, const char* name, float width,
20	float minWidth, float maxWidth, uint32 truncate, bool editable,
21	bool cycle, int cycleInit, alignment align)
22	:
23	BStringColumn(name, width, minWidth, maxWidth, truncate, align),
24	fEditable(editable),
25	fCycle(cycle),
26	fCycleInit(cycleInit),
27	fMenu(menu)
28{
29	SetWantsEvents(true);
30}
31
32
33PopUpColumn::~PopUpColumn()
34{
35	delete fMenu;
36}
37
38void
39PopUpColumn::MouseDown(BColumnListView* parent, BRow* row, BField* field,
40	BRect fieldRect, BPoint point, uint32 buttons)
41{
42	if ((buttons & B_SECONDARY_MOUSE_BUTTON)
43		|| (buttons & B_PRIMARY_MOUSE_BUTTON && (fEditable || fCycle))) {
44		BMessage* msg = new BMessage(ShortcutsWindow::HOTKEY_ITEM_MODIFIED);
45		msg->SetInt32("row", parent->IndexOf(row));
46		msg->SetInt32("column", LogicalFieldNum());
47		if (buttons & B_SECONDARY_MOUSE_BUTTON) {
48			BMenuItem* selected = fMenu->Go(parent->ConvertToScreen(point));
49			if (selected) {
50				msg->SetString("text", selected->Label());
51				parent->Window()->PostMessage(msg);
52			}
53		}
54		if (buttons & B_PRIMARY_MOUSE_BUTTON && row->IsSelected()) {
55			BStringField* stringField = static_cast<BStringField*>(field);
56			if (fEditable) {
57				EditWindow* edit = new EditWindow(stringField->String(), 0);
58				msg->SetString("text", edit->Go());
59			} else if (fCycle) {
60				BMenuItem* item;
61				for (int i = 0; (item = fMenu->ItemAt(i)) != NULL; i++)
62					if (strcmp(stringField->String(), item->Label()) == 0) {
63						item = fMenu->ItemAt((i + 1) % fMenu->CountItems());
64						break;
65					}
66				if (item == NULL)
67					item = fMenu->ItemAt(fCycleInit);
68				msg->SetString("text", item->Label());
69			}
70			parent->Window()->PostMessage(msg);
71		}
72	}
73	BStringColumn::MouseDown(parent, row, field, fieldRect, point, buttons);
74}
75
76