1 // AuthenticationPanel.cpp
12 #include <StringView.h>
13 #include <TextControl.h>
15 #include "AuthenticationPanel.h"
23 AuthenticationPanel::AuthenticationPanel(BRect frame
)
24 : Panel(frame
, "Name Panel",
25 B_TITLED_WINDOW_LOOK
, B_MODAL_APP_WINDOW_FEEL
,
26 B_ASYNCHRONOUS_CONTROLS
| B_NOT_RESIZABLE
| B_NOT_ZOOMABLE
),
30 fExitSem
= create_sem(0, "Authentication Panel");
32 BRect
controlFrame(0.0, 0.0, frame
.Width(), 15.0);
34 fNameTC
= new BTextControl(controlFrame
, "name", "Username", "", NULL
,
35 B_FOLLOW_LEFT
| B_FOLLOW_RIGHT
);
37 fPassTC
= new BTextControl(controlFrame
, "pass", "Password", "", NULL
,
38 B_FOLLOW_LEFT
| B_FOLLOW_RIGHT
);
40 fKeepUsingCB
= new BCheckBox(controlFrame
, "again",
41 "Use login for all shares of this host",
42 NULL
, B_FOLLOW_LEFT
| B_FOLLOW_RIGHT
);
44 BRect
buttonFrame(0.0, 0.0, 20.0, 15.0);
45 fOkB
= new BButton(buttonFrame
, "ok", "OK",
46 new BMessage(MSG_PANEL_OK
));
47 fCancelB
= new BButton(buttonFrame
, "cancel", "Cancel",
48 new BMessage(MSG_PANEL_CANCEL
));
53 AuthenticationPanel::~AuthenticationPanel()
60 AuthenticationPanel::QuitRequested()
63 release_sem(fExitSem
);
69 AuthenticationPanel::MessageReceived(BMessage
* message
)
71 switch (message
->what
) {
72 case MSG_PANEL_CANCEL
:
76 release_sem(fExitSem
);
80 Panel::MessageReceived(message
);
86 AuthenticationPanel::GetAuthentication(const char* server
,
88 const char* previousUser
,
89 const char* previousPass
,
92 char* user
, char* pass
, bool* keep
)
94 // configure panel and layout controls
95 BString
helper("Enter login for: ");
96 helper
<< (server
? server
: "<unkown host>") << "/";
97 helper
<< (share
? share
: "<unkown share>");
99 // ignore the previous password, if it didn't work
103 SetTitle(helper
.String());
105 BPoint
offset(0.0, 5.0);
107 fNameTC
->SetText(previousUser
? previousUser
: "");
108 fNameTC
->ResizeToPreferred();
109 fNameTC
->MoveTo(BPoint(10.0, 10.0));
111 fPassTC
->SetText(previousPass
? previousPass
: "");
112 fPassTC
->ResizeToPreferred();
113 fPassTC
->MoveTo(fNameTC
->Frame().LeftBottom() + offset
);
115 fKeepUsingCB
->SetValue(previousKeep
);
116 fKeepUsingCB
->ResizeToPreferred();
117 fKeepUsingCB
->MoveTo(fPassTC
->Frame().LeftBottom() + offset
);
119 fCancelB
->ResizeToPreferred();
121 fOkB
->ResizeToPreferred();
122 fOkB
->MoveTo(fKeepUsingCB
->Frame().RightBottom() + offset
+ offset
- fOkB
->Frame().RightTop());
124 fCancelB
->MoveTo(fOkB
->Frame().LeftTop() - BPoint(10.0, 0.0) - fCancelB
->Frame().RightTop());
126 BRect
frame(fNameTC
->Frame().LeftTop(), fOkB
->Frame().RightBottom());
128 // work arround buggy BTextControl resizing
129 BRect nameFrame
= fNameTC
->Frame();
130 BRect passFrame
= fPassTC
->Frame();
132 nameFrame
.right
= nameFrame
.left
+ frame
.Width();
133 passFrame
.right
= passFrame
.left
+ frame
.Width();
135 float divider
= fNameTC
->Divider();
137 if (fPassTC
->Divider() > divider
)
138 divider
= fPassTC
->Divider();
141 fNameTC
= new BTextControl(nameFrame
, "name", "Username", "", NULL
,
142 B_FOLLOW_LEFT
| B_FOLLOW_RIGHT
);
143 fNameTC
->SetText(previousUser
? previousUser
: "");
146 fPassTC
= new BTextControl(passFrame
, "pass", "Password", "", NULL
,
147 B_FOLLOW_LEFT
| B_FOLLOW_RIGHT
);
149 fPassTC
->TextView()->HideTyping(true);
150 fPassTC
->SetText(previousPass
? previousPass
: "");
152 fNameTC
->SetDivider(divider
);
153 fPassTC
->SetDivider(divider
);
156 // create background view
157 frame
.InsetBy(-10.0, -10.0);
159 BBox
* bg
= new BBox(frame
, "bg", B_FOLLOW_ALL
,
160 B_FRAME_EVENTS
| B_WILL_DRAW
| B_NAVIGABLE_JUMP
,
163 bg
->AddChild(fNameTC
);
164 bg
->AddChild(fPassTC
);
165 bg
->AddChild(fKeepUsingCB
);
168 bg
->AddChild(fCancelB
);
170 frame
.OffsetTo(-10000.0, -10000.0);
171 frame
= _CalculateFrame(frame
);
172 MoveTo(frame
.LeftTop());
173 ResizeTo(frame
.Width(), frame
.Height());
176 SetDefaultButton(fOkB
);
177 fNameTC
->MakeFocus(true);
179 // start window thread
182 // let the window jitter, if the previous password was invalid
184 BPoint leftTop
= Frame().LeftTop();
185 const float jitterOffsets
[] = { -10, 0, 10, 0 };
186 const int32 jitterOffsetCount
= sizeof(jitterOffsets
) / sizeof(float);
187 for (int32 i
= 0; i
< 30; i
++) {
188 float offset
= jitterOffsets
[i
% jitterOffsetCount
];
189 MoveTo(leftTop
.x
+ offset
, leftTop
.y
);
195 // block calling thread
196 acquire_sem(fExitSem
);
198 // window wants to quit
201 sprintf(user
, fNameTC
->Text());
202 sprintf(pass
, fPassTC
->Text());
203 *keep
= fKeepUsingCB
->Value() == B_CONTROL_ON
;
211 AuthenticationPanel::Cancel()
214 // release_sem(fExitSem);
222 AuthenticationPanel::_CalculateFrame(BRect frame
)
224 BScreen
screen(B_MAIN_SCREEN_ID
);
225 BRect screenFrame
= screen
.Frame();
226 if (!screenFrame
.Contains(frame
)) {
227 float width
= frame
.Width();
228 float height
= frame
.Height();
230 center
.x
= screenFrame
.left
+ screenFrame
.Width() / 2.0;
231 center
.y
= screenFrame
.top
+ screenFrame
.Height() / 4.0;
232 frame
.left
= center
.x
- width
/ 2.0;
233 frame
.right
= frame
.left
+ width
;
234 frame
.top
= center
.y
- height
/ 2.0;
235 frame
.bottom
= frame
.top
+ height
;