1 /*
2 * Copyright 2002-2006, Stephan Aßmus <superstippi@gmx.de>
3 * All rights reserved. Distributed under the terms of the MIT license.
4 *
5 */
6
7 #include "ColorPickerPanel.h"
8
9 #include <stdio.h>
10
11 #include <Autolock.h>
12 #include <Application.h>
13 #include <Locker.h>
14
15 #include <Box.h>
16 #include <Button.h>
17 #include <Catalog.h>
18 #include <ControlLook.h>
19 #include <GroupView.h>
20 #include <LayoutBuilder.h>
21 #include <Locale.h>
22 #include <SeparatorView.h>
23
24 #include "support_ui.h"
25
26 #include "ColorPickerView.h"
27
28
29 #undef B_TRANSLATION_CONTEXT
30 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-ColorPicker"
31
32
33 enum {
34 MSG_CANCEL = 'cncl',
35 MSG_DONE = 'done',
36 };
37
38
ColorPickerPanel(BRect frame,rgb_color color,SelectedColorMode mode,BWindow * window,BMessage * message,BHandler * target)39 ColorPickerPanel::ColorPickerPanel(BRect frame, rgb_color color,
40 SelectedColorMode mode,
41 BWindow* window,
42 BMessage* message, BHandler* target)
43 : Panel(frame, "Pick a color",
44 B_FLOATING_WINDOW_LOOK, B_FLOATING_SUBSET_WINDOW_FEEL,
45 B_ASYNCHRONOUS_CONTROLS |
46 B_NOT_RESIZABLE | B_NOT_ZOOMABLE | B_NOT_CLOSABLE
47 | B_AUTO_UPDATE_SIZE_LIMITS),
48 fWindow(window),
49 fMessage(message),
50 fTarget(target)
51 {
52 SetTitle(B_TRANSLATE("Pick a color"));
53
54 fColorPickerView = new ColorPickerView("color picker", color, mode);
55
56 SetLayout(new BGroupLayout(B_VERTICAL));
57
58 BButton* defaultButton = new BButton("ok button",
59 B_TRANSLATE("OK"),
60 new BMessage(MSG_DONE));
61 BButton* cancelButton = new BButton("cancel button",
62 B_TRANSLATE("Cancel"),
63 new BMessage(MSG_CANCEL));
64
65 BView* topView = new BGroupView(B_VERTICAL);
66
67 const float inset = be_control_look->DefaultLabelSpacing();
68
69 BLayoutBuilder::Group<>(topView, B_VERTICAL, 0.0f)
70 .Add(fColorPickerView)
71 .Add(new BSeparatorView(B_HORIZONTAL))
72 .AddGroup(B_HORIZONTAL)
73 .AddGlue()
74 .Add(cancelButton)
75 .Add(defaultButton)
76 .SetInsets(inset, inset, inset, inset)
77 .End()
78 ;
79
80 SetDefaultButton(defaultButton);
81
82 if (fWindow != NULL)
83 AddToSubset(fWindow);
84 else
85 SetFeel(B_FLOATING_APP_WINDOW_FEEL);
86
87 AddChild(topView);
88 }
89
90
~ColorPickerPanel()91 ColorPickerPanel::~ColorPickerPanel()
92 {
93 delete fMessage;
94 }
95
96
97 void
Cancel()98 ColorPickerPanel::Cancel()
99 {
100 PostMessage(MSG_CANCEL);
101 }
102
103
104 void
MessageReceived(BMessage * message)105 ColorPickerPanel::MessageReceived(BMessage* message)
106 {
107 switch (message->what) {
108 case MSG_CANCEL:
109 case MSG_DONE:
110 {
111 BMessage msg('PSTE');
112 BLooper* looper = fTarget ? fTarget->Looper() : be_app;
113 if (fMessage)
114 msg = *fMessage;
115 if (message->what == MSG_DONE)
116 store_color_in_message(&msg, fColorPickerView->Color());
117 msg.AddRect("panel frame", Frame());
118 msg.AddInt32("panel mode", fColorPickerView->Mode());
119 msg.AddBool("begin", true);
120 looper->PostMessage(&msg, fTarget);
121 PostMessage(B_QUIT_REQUESTED);
122 break;
123 }
124 default:
125 Panel::MessageReceived(message);
126 break;
127 }
128 }
129
130
131 // #pragma mark -
132
133
134 void
SetColor(rgb_color color)135 ColorPickerPanel::SetColor(rgb_color color)
136 {
137 fColorPickerView->SetColor(color);
138 }
139
140
141 void
SetMessage(BMessage * message)142 ColorPickerPanel::SetMessage(BMessage* message)
143 {
144 if (message != fMessage) {
145 delete fMessage;
146 fMessage = message;
147 }
148 }
149
150
151 void
SetTarget(BHandler * target)152 ColorPickerPanel::SetTarget(BHandler* target)
153 {
154 fTarget = target;
155 }
156
157