SelectionWindow::SelectionWindow(BContainerWindow *window) : BWindow(BRect(0, 0, 270, 0), "Select", B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_NOT_MINIMIZABLE | B_NOT_V_RESIZABLE | B_NO_WORKSPACE_ACTIVATION | B_ASYNCHRONOUS_CONTROLS | B_NOT_ANCHORED_ON_ACTIVATE), fParentWindow(window) { if (window->Feel() & kPrivateDesktopWindowFeel) // The window will not show up if we have B_FLOATING_SUBSET_WINDOW_FEEL // and use it with the desktop window since it's never in front. SetFeel(B_NORMAL_WINDOW_FEEL); AddToSubset(fParentWindow); BRect backgroundRect = Bounds(); backgroundRect.InsetBy(-1, -1); BView *backgroundView = new BBox(backgroundRect, "bgView", B_FOLLOW_ALL); AddChild(backgroundView); BMenu *menu = new BPopUpMenu(""); menu->AddItem(new BMenuItem("starts with", NULL)); menu->AddItem(new BMenuItem("ends with", NULL)); menu->AddItem(new BMenuItem("contains", NULL)); menu->AddItem(new BMenuItem("matches wildcard expression", NULL)); menu->AddItem(new BMenuItem("matches regular expression", NULL)); menu->SetLabelFromMarked(true); menu->ItemAt(3)->SetMarked(true); // Set wildcard matching to default. // Set up the menu field fMatchingTypeMenuField = new BMenuField(BRect(7, 6, Bounds().right - 5, 0), NULL, "Name", menu); backgroundView->AddChild(fMatchingTypeMenuField); fMatchingTypeMenuField->SetDivider(fMatchingTypeMenuField->StringWidth("Name") + 8); fMatchingTypeMenuField->ResizeToPreferred(); // Set up the expression text control fExpressionTextControl = new BTextControl(BRect(7, fMatchingTypeMenuField-> Bounds().bottom + 11, Bounds().right - 6, 0), NULL, NULL, NULL, NULL, B_FOLLOW_LEFT_RIGHT); backgroundView->AddChild(fExpressionTextControl); fExpressionTextControl->ResizeToPreferred(); fExpressionTextControl->MakeFocus(true); // Set up the Invert checkbox fInverseCheckBox = new BCheckBox(BRect(7, fExpressionTextControl->Frame().bottom + 6, 6, 6), NULL, "Invert", NULL); backgroundView->AddChild(fInverseCheckBox); fInverseCheckBox->ResizeToPreferred(); // Set up the Ignore Case checkbox fIgnoreCaseCheckBox = new BCheckBox(BRect(fInverseCheckBox->Frame().right + 10, fInverseCheckBox->Frame().top, 6, 6), NULL, "Ignore case", NULL); fIgnoreCaseCheckBox->SetValue(1); backgroundView->AddChild(fIgnoreCaseCheckBox); fIgnoreCaseCheckBox->ResizeToPreferred(); // Set up the Select button fSelectButton = new BButton(BRect(0, 0, 5, 5), NULL, "Select", new BMessage(kSelectButtonPressed), B_FOLLOW_RIGHT); backgroundView->AddChild(fSelectButton); fSelectButton->ResizeToPreferred(); fSelectButton->MoveTo(Bounds().right - 10 - fSelectButton->Bounds().right, fExpressionTextControl->Frame().bottom + 9); fSelectButton->MakeDefault(true); #if !B_BEOS_VERSION_DANO fSelectButton->SetLowColor(backgroundView->ViewColor()); fSelectButton->SetViewColor(B_TRANSPARENT_COLOR); #endif font_height fh; be_plain_font->GetHeight(&fh); // Center the checkboxes vertically to the button float topMiddleButton = (fSelectButton->Bounds().Height() / 2 - (fh.ascent + fh.descent + fh.leading + 4) / 2) + fSelectButton->Frame().top; fInverseCheckBox->MoveTo(fInverseCheckBox->Frame().left, topMiddleButton); fIgnoreCaseCheckBox->MoveTo(fIgnoreCaseCheckBox->Frame().left, topMiddleButton); float bottomMinWidth = 32 + fSelectButton->Bounds().Width() + fInverseCheckBox->Bounds().Width() + fIgnoreCaseCheckBox->Bounds().Width(); float topMinWidth = be_plain_font->StringWidth("Name matches wildcard expression:###"); float minWidth = bottomMinWidth > topMinWidth ? bottomMinWidth : topMinWidth; Run(); Lock(); ResizeTo(minWidth, fSelectButton->Frame().bottom + 6); SetSizeLimits( /* Minimum Width */ minWidth, /* Maximum Width */ 1280, /* Minimum Height */ Bounds().bottom, /* Maximum Height */ Bounds().bottom); MoveCloseToMouse(); Unlock(); }
SelectionWindow::SelectionWindow(BContainerWindow* window) : BWindow(BRect(0, 0, 270, 0), B_TRANSLATE("Select"), B_TITLED_WINDOW, B_NOT_ZOOMABLE | B_NOT_MINIMIZABLE | B_NOT_V_RESIZABLE | B_NO_WORKSPACE_ACTIVATION | B_ASYNCHRONOUS_CONTROLS | B_NOT_ANCHORED_ON_ACTIVATE), fParentWindow(window) { if (window->Feel() & kDesktopWindowFeel) { // The window will not show up if we have // B_FLOATING_SUBSET_WINDOW_FEEL and use it with the desktop window // since it's never in front. SetFeel(B_NORMAL_WINDOW_FEEL); } AddToSubset(fParentWindow); BView* backgroundView = new BView(Bounds(), "bgView", B_FOLLOW_ALL, B_WILL_DRAW); backgroundView->SetViewUIColor(B_PANEL_BACKGROUND_COLOR); AddChild(backgroundView); BMenu* menu = new BPopUpMenu(""); menu->AddItem(new BMenuItem(B_TRANSLATE("starts with"), NULL)); menu->AddItem(new BMenuItem(B_TRANSLATE("ends with"), NULL)); menu->AddItem(new BMenuItem(B_TRANSLATE("contains"), NULL)); menu->AddItem(new BMenuItem(B_TRANSLATE("matches wildcard expression"), NULL)); menu->AddItem(new BMenuItem(B_TRANSLATE("matches regular expression"), NULL)); menu->SetLabelFromMarked(true); menu->ItemAt(3)->SetMarked(true); // Set wildcard matching to default. // Set up the menu field fMatchingTypeMenuField = new BMenuField(BRect(7, 6, Bounds().right - 5, 0), NULL, B_TRANSLATE("Name"), menu); backgroundView->AddChild(fMatchingTypeMenuField); fMatchingTypeMenuField->SetDivider(fMatchingTypeMenuField->StringWidth( B_TRANSLATE("Name")) + 8); fMatchingTypeMenuField->ResizeToPreferred(); // Set up the expression text control fExpressionTextControl = new BTextControl(BRect(7, fMatchingTypeMenuField->Bounds().bottom + 11, Bounds().right - 6, 0), NULL, NULL, NULL, NULL, B_FOLLOW_LEFT_RIGHT); backgroundView->AddChild(fExpressionTextControl); fExpressionTextControl->ResizeToPreferred(); fExpressionTextControl->MakeFocus(true); // Set up the Invert checkbox fInverseCheckBox = new BCheckBox( BRect(7, fExpressionTextControl->Frame().bottom + 6, 6, 6), NULL, B_TRANSLATE("Invert"), NULL); backgroundView->AddChild(fInverseCheckBox); fInverseCheckBox->ResizeToPreferred(); // Set up the Ignore Case checkbox fIgnoreCaseCheckBox = new BCheckBox( BRect(fInverseCheckBox->Frame().right + 10, fInverseCheckBox->Frame().top, 6, 6), NULL, B_TRANSLATE("Ignore case"), NULL); fIgnoreCaseCheckBox->SetValue(1); backgroundView->AddChild(fIgnoreCaseCheckBox); fIgnoreCaseCheckBox->ResizeToPreferred(); // Set up the Select button fSelectButton = new BButton(BRect(0, 0, 5, 5), NULL, B_TRANSLATE("Select"), new BMessage(kSelectButtonPressed), B_FOLLOW_RIGHT); backgroundView->AddChild(fSelectButton); fSelectButton->ResizeToPreferred(); fSelectButton->MoveTo(Bounds().right - 10 - fSelectButton->Bounds().right, fExpressionTextControl->Frame().bottom + 9); fSelectButton->MakeDefault(true); #if !B_BEOS_VERSION_DANO fSelectButton->SetLowColor(backgroundView->ViewColor()); fSelectButton->SetViewColor(B_TRANSPARENT_COLOR); #endif font_height fh; be_plain_font->GetHeight(&fh); // Center the checkboxes vertically to the button float topMiddleButton = (fSelectButton->Bounds().Height() / 2 - (fh.ascent + fh.descent + fh.leading + 4) / 2) + fSelectButton->Frame().top; fInverseCheckBox->MoveTo(fInverseCheckBox->Frame().left, topMiddleButton); fIgnoreCaseCheckBox->MoveTo(fIgnoreCaseCheckBox->Frame().left, topMiddleButton); float bottomMinWidth = 32 + fSelectButton->Bounds().Width() + fInverseCheckBox->Bounds().Width() + fIgnoreCaseCheckBox->Bounds().Width(); float topMinWidth = be_plain_font->StringWidth( B_TRANSLATE("Name matches wildcard expression:###")); float minWidth = bottomMinWidth > topMinWidth ? bottomMinWidth : topMinWidth; class EscapeFilter : public BMessageFilter { public: EscapeFilter(BWindow* target) : BMessageFilter(B_KEY_DOWN), fTarget(target) { } virtual filter_result Filter(BMessage* message, BHandler** _target) { int8 byte; if (message->what == B_KEY_DOWN && message->FindInt8("byte", &byte) == B_OK && byte == B_ESCAPE) { fTarget->Hide(); return B_SKIP_MESSAGE; } return B_DISPATCH_MESSAGE; } private: BWindow* fTarget; }; AddCommonFilter(new(std::nothrow) EscapeFilter(this)); Run(); Lock(); ResizeTo(minWidth, fSelectButton->Frame().bottom + 6); SetSizeLimits(minWidth, 1280, Bounds().bottom, Bounds().bottom); MoveCloseToMouse(); Unlock(); }