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
PopUpColumn(BPopUpMenu * menu,const char * name,float width,float minWidth,float maxWidth,uint32 truncate,bool editable,bool cycle,int cycleInit,alignment align)19 PopUpColumn::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
~PopUpColumn()33 PopUpColumn::~PopUpColumn()
34 {
35 delete fMenu;
36 }
37
38 void
MouseDown(BColumnListView * parent,BRow * row,BField * field,BRect fieldRect,BPoint point,uint32 buttons)39 PopUpColumn::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