bool AuthenticationPanel::getAuthentication(const BString& text, const BString& previousUser, const BString& previousPass, bool previousRememberCredentials, bool badPassword, BString& user, BString& pass, bool* rememberCredentials) { // Configure panel and layout controls. rgb_color infoColor = ui_color(B_PANEL_TEXT_COLOR); BRect textBounds(0, 0, 250, 200); BTextView* textView = new BTextView(textBounds, "text", textBounds, be_plain_font, &infoColor, B_FOLLOW_NONE, B_WILL_DRAW | B_SUPPORTS_LAYOUT); textView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR)); textView->SetText(text.String()); textView->MakeEditable(false); textView->MakeSelectable(false); m_usernameTextControl->SetText(previousUser.String()); m_passwordTextControl->TextView()->HideTyping(true); // Ignore the previous password, if it didn't work. if (!badPassword) m_passwordTextControl->SetText(previousPass.String()); m_hidePasswordCheckBox->SetValue(B_CONTROL_ON); m_rememberCredentialsCheckBox->SetValue(previousRememberCredentials); // create layout SetLayout(new BGroupLayout(B_VERTICAL, 0.0)); float spacing = be_control_look->DefaultItemSpacing(); AddChild(BGroupLayoutBuilder(B_VERTICAL, 0.0) .Add(BGridLayoutBuilder(0, spacing) .Add(textView, 0, 0, 2) .Add(m_usernameTextControl->CreateLabelLayoutItem(), 0, 1) .Add(m_usernameTextControl->CreateTextViewLayoutItem(), 1, 1) .Add(m_passwordTextControl->CreateLabelLayoutItem(), 0, 2) .Add(m_passwordTextControl->CreateTextViewLayoutItem(), 1, 2) .Add(BSpaceLayoutItem::CreateGlue(), 0, 3) .Add(m_hidePasswordCheckBox, 1, 3) .Add(m_rememberCredentialsCheckBox, 0, 4, 2) .SetInsets(spacing, spacing, spacing, spacing) ) .Add(new BSeparatorView(B_HORIZONTAL, B_PLAIN_BORDER)) .Add(BGroupLayoutBuilder(B_HORIZONTAL, spacing) .AddGlue() .Add(m_cancelButton) .Add(m_okButton) .SetInsets(spacing, spacing, spacing, spacing) ) ); float textHeight = textView->LineHeight(0) * textView->CountLines(); textView->SetExplicitMinSize(BSize(B_SIZE_UNSET, textHeight)); SetDefaultButton(m_okButton); if (badPassword && previousUser.Length()) m_passwordTextControl->MakeFocus(true); else m_usernameTextControl->MakeFocus(true); if (m_parentWindowFrame.IsValid()) CenterIn(m_parentWindowFrame); else CenterOnScreen(); // Start AuthenticationPanel window thread Show(); // Let the window jitter, if the previous password was invalid if (badPassword) PostMessage(kMsgJitter); // Block calling thread // Get the originating window, if it exists, to let it redraw itself. BWindow* window = dynamic_cast<BWindow*>(BLooper::LooperForThread(find_thread(NULL))); if (window) { status_t err; for (;;) { do { err = acquire_sem_etc(m_exitSemaphore, 1, B_RELATIVE_TIMEOUT, 10000); // We've (probably) had our time slice taken away from us } while (err == B_INTERRUPTED); if (err != B_TIMED_OUT) { // Semaphore was finally released or nuked. break; } window->UpdateIfNeeded(); } } else { // No window to update, so just hang out until we're done. while (acquire_sem(m_exitSemaphore) == B_INTERRUPTED) { } } // AuthenticationPanel wants to quit. Lock(); user = m_usernameTextControl->Text(); pass = m_passwordTextControl->Text(); if (rememberCredentials) *rememberCredentials = m_rememberCredentialsCheckBox->Value() == B_CONTROL_ON; bool canceled = m_cancelled; Quit(); // AuthenticationPanel object is TOAST here. return !canceled; }
void BTextWidget::StartEdit(BRect bounds, BPoseView *view, BPose *pose) { if (!IsEditable()) return; // don't allow editing of the trash directory name if (pose->TargetModel()->IsTrash()) return; // don't allow editing of the "Disks" icon name if (pose->TargetModel()->IsRoot()) return; BEntry entry(pose->TargetModel()->EntryRef()); if (entry.InitCheck() == B_OK && !ConfirmChangeIfWellKnownDirectory(&entry, "rename")) return; // get bounds with full text length BRect rect(bounds); BRect textRect(bounds); rect.OffsetBy(-2, -1); rect.right += 1; BFont font; view->GetFont(&font); BTextView *textView = new BTextView(rect, "WidgetTextView", textRect, &font, 0, B_FOLLOW_ALL, B_WILL_DRAW); textView->SetWordWrap(false); DisallowMetaKeys(textView); fText->SetUpEditing(textView); textView->AddFilter(new BMessageFilter(B_KEY_DOWN, TextViewFilter)); rect.right = rect.left + textView->LineWidth() + 3; // center new width, if necessary if (view->ViewMode() == kIconMode || (view->ViewMode() == kListMode && fAlignment == B_ALIGN_CENTER)) { rect.OffsetBy(bounds.Width() / 2 - rect.Width() / 2, 0); } rect.bottom = rect.top + textView->LineHeight() + 1; textRect = rect.OffsetToCopy(2, 1); textRect.right -= 3; textRect.bottom--; textView->SetTextRect(textRect); textRect = view->Bounds(); bool hitBorder = false; if (rect.left < 1) rect.left = 1, hitBorder = true; if (rect.right > textRect.right) rect.right = textRect.right - 2, hitBorder = true; textView->MoveTo(rect.LeftTop()); textView->ResizeTo(rect.Width(), rect.Height()); BScrollView *scrollView = new BScrollView("BorderView", textView, 0, 0, false, false, B_PLAIN_BORDER); view->AddChild(scrollView); // configure text view switch (view->ViewMode()) { case kIconMode: textView->SetAlignment(B_ALIGN_CENTER); break; case kMiniIconMode: textView->SetAlignment(B_ALIGN_LEFT); break; case kListMode: textView->SetAlignment(fAlignment); break; } textView->MakeResizable(true, hitBorder ? NULL : scrollView); view->SetActivePose(pose); // tell view about pose SetActive(true); // for widget textView->SelectAll(); textView->MakeFocus(); // make this text widget invisible while we edit it SetVisible(false); ASSERT(view->Window()); // how can I not have a Window here??? if (view->Window()) // force immediate redraw so TextView appears instantly view->Window()->UpdateIfNeeded(); }
void BTextWidget::StartEdit(BRect bounds, BPoseView* view, BPose* pose) { view->SetTextWidgetToCheck(NULL, this); if (!IsEditable() || IsActive()) return; BEntry entry(pose->TargetModel()->EntryRef()); if (entry.InitCheck() == B_OK && !ConfirmChangeIfWellKnownDirectory(&entry, B_TRANSLATE_COMMENT("rename", "As in 'if you rename this folder...' (en) " "'Wird dieser Ordner umbenannt...' (de)"), B_TRANSLATE_COMMENT("rename", "As in 'to rename this folder...' (en) " "'Um diesen Ordner umzubenennen...' (de)"), B_TRANSLATE_COMMENT("Rename", "Button label, 'Rename' (en), 'Umbenennen' (de)"))) return; // get bounds with full text length BRect rect(bounds); BRect textRect(bounds); rect.OffsetBy(-2, -1); rect.right += 1; BFont font; view->GetFont(&font); BTextView* textView = new BTextView(rect, "WidgetTextView", textRect, &font, 0, B_FOLLOW_ALL, B_WILL_DRAW); textView->SetWordWrap(false); DisallowMetaKeys(textView); fText->SetUpEditing(textView); textView->AddFilter(new BMessageFilter(B_KEY_DOWN, TextViewFilter)); rect.right = rect.left + textView->LineWidth() + 3; // center new width, if necessary if (view->ViewMode() == kIconMode || (view->ViewMode() == kListMode && fAlignment == B_ALIGN_CENTER)) { rect.OffsetBy(bounds.Width() / 2 - rect.Width() / 2, 0); } rect.bottom = rect.top + textView->LineHeight() + 1; textRect = rect.OffsetToCopy(2, 1); textRect.right -= 3; textRect.bottom--; textView->SetTextRect(textRect); BPoint origin = view->LeftTop(); textRect = view->Bounds(); bool hitBorder = false; if (rect.left <= origin.x) rect.left = origin.x + 1, hitBorder = true; if (rect.right >= textRect.right) rect.right = textRect.right - 1, hitBorder = true; textView->MoveTo(rect.LeftTop()); textView->ResizeTo(rect.Width(), rect.Height()); BScrollView* scrollView = new BScrollView("BorderView", textView, 0, 0, false, false, B_PLAIN_BORDER); view->AddChild(scrollView); // configure text view switch (view->ViewMode()) { case kIconMode: textView->SetAlignment(B_ALIGN_CENTER); break; case kMiniIconMode: textView->SetAlignment(B_ALIGN_LEFT); break; case kListMode: textView->SetAlignment(fAlignment); break; } textView->MakeResizable(true, hitBorder ? NULL : scrollView); view->SetActivePose(pose); // tell view about pose SetActive(true); // for widget textView->SelectAll(); textView->MakeFocus(); // make this text widget invisible while we edit it SetVisible(false); ASSERT(view->Window() != NULL); // how can I not have a Window here??? if (view->Window()) { // force immediate redraw so TextView appears instantly view->Window()->UpdateIfNeeded(); } }