void JobSetupView::AddPopUpMenu(const DriverSpecificCap* capability, BGridLayout* gridLayout, int& row) { const char* label = capability->fLabel.c_str(); BPopUpMenu* popUpMenu = new BPopUpMenu(label); popUpMenu->SetRadioMode(true); PrinterCap::CapID category = static_cast<PrinterCap::CapID>( capability->ID()); const BaseCap** categoryCapabilities = fPrinterCap->GetCaps(category); int categoryCount = fPrinterCap->CountCap(category); string value = GetDriverSpecificValue(category, capability->Key()); PrinterCap::KeyPredicate predicate(value.c_str()); FillCapabilityMenu(popUpMenu, kMsgNone, categoryCapabilities, categoryCount, predicate); BString menuLabel = label; menuLabel << ":"; BMenuField* menuField = new BMenuField(label, menuLabel.String(), popUpMenu); popUpMenu->SetTargetForItems(this); gridLayout->AddItem(menuField->CreateLabelLayoutItem(), 0, row); gridLayout->AddItem(menuField->CreateMenuBarLayoutItem(), 1, row); row ++; fDriverSpecificPopUpMenus[category] = popUpMenu; }
/*! * \brief Internal function that creates a menu with month names. * \param[in] listOfMonths List of months for a given year. * \returns The created BMenu. * \remarks Deletion and deallocation of the created menu is in * responcibility of the caller. */ BPopUpMenu* CalendarControl::CreateMonthsMenu( map<int, DoubleNames> &listOfMonths ) { BMessage* message = NULL; BMenuItem* item = NULL; BString monthName; BPopUpMenu* toReturn = new BPopUpMenu("Months list"); if (!toReturn) { /* Panic! */ fLastError = B_NO_MEMORY; return NULL; } toReturn->SetLabelFromMarked(true); toReturn->SetRadioMode(true); BFont font(be_plain_font); toReturn->SetFont(&font, B_FONT_FAMILY_AND_STYLE); int limit = listOfMonths.size(); for (int i = 1; i <= limit; ++i ) { message = new BMessage( kMonthChanged ); if ( !message ) { /* Panic! */ fLastError = B_NO_MEMORY; return NULL; } if ( B_OK != message->AddInt8( "Month", ( int8 )i ) ) { //< Number of selected month in the year // Panic! exit(5); } monthName = listOfMonths[ i ].longName; item = new BMenuItem( monthName.String(), message ); if (!item) { /* Panic! */ fLastError = B_NO_MEMORY; return NULL; } if ( i == this->fRepresentedTime.tm_mon ) { item->SetMarked(true); } toReturn->AddItem(item); } UpdateTargets( toReturn ); return toReturn; }
/*! * \brief * \param[in] year The current year * \returns The created BMenu. * \remarks It's up to the caller to delete this menu! */ BPopUpMenu* CalendarControl::CreateYearsMenu( int yearIn ) { BPopUpMenu* toReturn = new BPopUpMenu("Years list"); BMessage* message = NULL; BMenuItem* item = NULL; BString yearName; if (!toReturn) { /* Panic! */ fLastError = B_NO_MEMORY; return NULL; } toReturn->SetLabelFromMarked(true); toReturn->SetRadioMode(true); for ( int i = yearIn - YEARS_UP_AND_DOWN; i <= yearIn + YEARS_UP_AND_DOWN; ++i ) { message = new BMessage( kYearChanged ); if ( !message ) { /* Panic! */ fLastError = B_NO_MEMORY; return NULL; } if ( B_OK != message->AddInt32( "Year", i ) ) { exit(5); } yearName.Truncate( 0 ); yearName << i; item = new BMenuItem( yearName.String(), message ); if ( !item ) { /* Panic! */ fLastError = B_NO_MEMORY; return NULL; } item->SetTarget( this ); if ( i == yearIn ) { item->SetMarked( true ); } toReturn->AddItem( item ); } UpdateTargets( toReturn ); return toReturn; } // <-- end of function CalendarControl::CreateYearsMenu
PageSetupWindow::PageSetupWindow(BMessage *msg, const char *printerName) : BlockingWindow(BRect(0, 0, 100, 100), "Page setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), fSetupMsg(msg), fPrinterDirName(printerName) { if (printerName) SetTitle(BString(printerName).Append(" Page setup").String()); // load orientation if (fSetupMsg->FindInt32("orientation", &fCurrentOrientation) != B_OK) fCurrentOrientation = PrinterDriver::PORTRAIT_ORIENTATION; // load page rect BRect page; float width = letter_width; float height = letter_height; if (fSetupMsg->FindRect("preview:paper_rect", &page) == B_OK) { width = page.Width(); height = page.Height(); } else { page.Set(0, 0, width, height); } BString label; if (fSetupMsg->FindString("preview:paper_size", &label) != B_OK) label = "Letter"; // Load units int32 units; if (fSetupMsg->FindInt32("units", &units) != B_OK) units = kUnitInch; // re-calculate the margin from the printable rect in points BRect margin = page; if (fSetupMsg->FindRect("preview:printable_rect", &margin) == B_OK) { margin.top -= page.top; margin.left -= page.left; margin.right = page.right - margin.right; margin.bottom = page.bottom - margin.bottom; } else { margin.Set(28.34, 28.34, 28.34, 28.34); // 28.34 dots = 1cm } fMarginView = new MarginView(int32(width), int32(height), margin, MarginUnit(units)); BPopUpMenu* pageSizePopUpMenu = new BPopUpMenu("Page size"); pageSizePopUpMenu->SetRadioMode(true); fPageSizeMenu = new BMenuField("page_size", "Page size:", pageSizePopUpMenu); fPageSizeMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; pageFormat[i].label != NULL; i++) { BMessage* message = new BMessage(PAGE_SIZE_CHANGED); message->AddFloat("width", pageFormat[i].width); message->AddFloat("height", pageFormat[i].height); BMenuItem* item = new BMenuItem(pageFormat[i].label, message); pageSizePopUpMenu->AddItem(item); if (label.Compare(pageFormat[i].label) == 0) item->SetMarked(true); } BPopUpMenu* orientationPopUpMenu = new BPopUpMenu("Orientation"); orientationPopUpMenu->SetRadioMode(true); fOrientationMenu = new BMenuField("orientation", "Orientation:", orientationPopUpMenu); fOrientationMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; orientation[i].label != NULL; i++) { BMessage* message = new BMessage(ORIENTATION_CHANGED); message->AddInt32("orientation", orientation[i].orientation); BMenuItem* item = new BMenuItem(orientation[i].label, message); orientationPopUpMenu->AddItem(item); if (fCurrentOrientation == orientation[i].orientation) item->SetMarked(true); } float scale0; BString scale; if (fSetupMsg->FindFloat("scale", &scale0) == B_OK) scale << (int)scale0; else scale = "100"; fScaleControl = new BTextControl("scale", "Scale [%]:", scale.String(), NULL); for (uint32 i = 0; i < '0'; i++) fScaleControl->TextView()->DisallowChar(i); for (uint32 i = '9' + 1; i < 255; i++) fScaleControl->TextView()->DisallowChar(i); fScaleControl->TextView()->SetMaxBytes(3); BBox *separator = new BBox("separator"); separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1)); BButton *cancel = new BButton("cancel", "Cancel", new BMessage(CANCEL_MSG)); BButton *ok = new BButton("ok", "OK", new BMessage(OK_MSG)); ok->MakeDefault(true); BGridView* settings = new BGridView(); BGridLayout* settingsLayout = settings->GridLayout(); settingsLayout->AddItem(fPageSizeMenu->CreateLabelLayoutItem(), 0, 0); settingsLayout->AddItem(fPageSizeMenu->CreateMenuBarLayoutItem(), 1, 0); settingsLayout->AddItem(fOrientationMenu->CreateLabelLayoutItem(), 0, 1); settingsLayout->AddItem(fOrientationMenu->CreateMenuBarLayoutItem(), 1, 1); settingsLayout->AddItem(fScaleControl->CreateLabelLayoutItem(), 0, 2); settingsLayout->AddItem(fScaleControl->CreateTextViewLayoutItem(), 1, 2); settingsLayout->SetSpacing(0, 0); SetLayout(new BGroupLayout(B_VERTICAL)); AddChild(BGroupLayoutBuilder(B_VERTICAL, 0) .AddGroup(B_HORIZONTAL, 5, 1) .AddGroup(B_VERTICAL, 0, 1.0f) .Add(fMarginView) .AddGlue() .End() .AddGroup(B_VERTICAL, 0, 1.0f) .Add(settings) .AddGlue() .End() .End() .Add(separator) .AddGroup(B_HORIZONTAL, 10, 1.0f) .AddGlue() .Add(cancel) .Add(ok) .End() .SetInsets(10, 10, 10, 10) ); BRect winFrame(Frame()); BRect screenFrame(BScreen().Frame()); MoveTo((screenFrame.right - winFrame.right) / 2, (screenFrame.bottom - winFrame.bottom) / 2); }
/***************************************************************************** * VLCVIew::MouseDown *****************************************************************************/ void VLCView::MouseDown(BPoint where) { VideoWindow* videoWindow = dynamic_cast<VideoWindow*>(Window()); BMessage* msg = Window()->CurrentMessage(); int32 clicks; uint32_t buttons; msg->FindInt32("clicks", &clicks); msg->FindInt32("buttons", (int32*)&buttons); if (videoWindow) { if (buttons & B_PRIMARY_MOUSE_BUTTON) { if (clicks == 2 && !fIgnoreDoubleClick) Window()->Zoom(); /* else videoWindow->ToggleInterfaceShowing(); */ fIgnoreDoubleClick = false; } else { if (buttons & B_SECONDARY_MOUSE_BUTTON) { // clicks will be 2 next time (if interval short enough) // even if the first click and the second // have not been made with the same mouse button fIgnoreDoubleClick = true; // launch popup menu BPopUpMenu *menu = new BPopUpMenu("context menu"); menu->SetRadioMode(false); // In full screen, add an item to show/hide the interface if( videoWindow->IsFullScreen() ) { BMenuItem *intfItem = new BMenuItem( _("Show Interface"), new BMessage(SHOW_INTERFACE) ); menu->AddItem( intfItem ); } // Resize to 50% BMenuItem *halfItem = new BMenuItem(_("50%"), new BMessage(RESIZE_50)); menu->AddItem(halfItem); // Resize to 100% BMenuItem *origItem = new BMenuItem(_("100%"), new BMessage(RESIZE_100)); menu->AddItem(origItem); // Resize to 200% BMenuItem *doubleItem = new BMenuItem(_("200%"), new BMessage(RESIZE_200)); menu->AddItem(doubleItem); // Toggle FullScreen BMenuItem *zoomItem = new BMenuItem(_("Fullscreen"), new BMessage(TOGGLE_FULL_SCREEN)); zoomItem->SetMarked(videoWindow->IsFullScreen()); menu->AddItem(zoomItem); menu->AddSeparatorItem(); // Toggle vSync BMenuItem *vsyncItem = new BMenuItem(_("Vertical Sync"), new BMessage(VERT_SYNC)); vsyncItem->SetMarked(videoWindow->IsSyncedToRetrace()); menu->AddItem(vsyncItem); // Correct Aspect Ratio BMenuItem *aspectItem = new BMenuItem(_("Correct Aspect Ratio"), new BMessage(ASPECT_CORRECT)); aspectItem->SetMarked(videoWindow->CorrectAspectRatio()); menu->AddItem(aspectItem); menu->AddSeparatorItem(); // Window Feel Items /* BMessage *winNormFeel = new BMessage(WINDOW_FEEL); winNormFeel->AddInt32("WinFeel", (int32_t)B_NORMAL_WINDOW_FEEL); BMenuItem *normWindItem = new BMenuItem("Normal Window", winNormFeel); normWindItem->SetMarked(videoWindow->Feel() == B_NORMAL_WINDOW_FEEL); menu->AddItem(normWindItem); BMessage *winFloatFeel = new BMessage(WINDOW_FEEL); winFloatFeel->AddInt32("WinFeel", (int32_t)B_FLOATING_APP_WINDOW_FEEL); BMenuItem *onTopWindItem = new BMenuItem("App Top", winFloatFeel); onTopWindItem->SetMarked(videoWindow->Feel() == B_FLOATING_APP_WINDOW_FEEL); menu->AddItem(onTopWindItem); BMessage *winAllFeel = new BMessage(WINDOW_FEEL); winAllFeel->AddInt32("WinFeel", (int32_t)B_FLOATING_ALL_WINDOW_FEEL); BMenuItem *allSpacesWindItem = new BMenuItem("On Top All Workspaces", winAllFeel); allSpacesWindItem->SetMarked(videoWindow->Feel() == B_FLOATING_ALL_WINDOW_FEEL); menu->AddItem(allSpacesWindItem);*/ BMessage *windowFeelMsg = new BMessage( WINDOW_FEEL ); bool onTop = videoWindow->Feel() == B_FLOATING_ALL_WINDOW_FEEL; window_feel feel = onTop ? B_NORMAL_WINDOW_FEEL : B_FLOATING_ALL_WINDOW_FEEL; windowFeelMsg->AddInt32( "WinFeel", (int32_t)feel ); BMenuItem *windowFeelItem = new BMenuItem( _("Stay On Top"), windowFeelMsg ); windowFeelItem->SetMarked( onTop ); menu->AddItem( windowFeelItem ); menu->AddSeparatorItem(); BMenuItem* screenShotItem = new BMenuItem( _("Take Screen Shot"), new BMessage( SCREEN_SHOT ) ); menu->AddItem( screenShotItem ); menu->SetTargetForItems( this ); ConvertToScreen( &where ); BRect mouseRect( where.x - 5, where.y - 5, where.x + 5, where.y + 5 ); menu->Go( where, true, false, mouseRect, true ); } } } fLastMouseMovedTime = mdate(); fCursorHidden = false; }
PageSetupWindow::PageSetupWindow(BMessage *msg, const char *printerName) : BlockingWindow(BRect(0,0,400,220), "Page setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE), fSetupMsg(msg), fPrinterDirName(printerName) { if (printerName) SetTitle(BString(printerName).Append(" Page setup").String()); // load orientation if (fSetupMsg->FindInt32("orientation", &fCurrentOrientation) != B_OK) fCurrentOrientation = PrinterDriver::PORTRAIT_ORIENTATION; // load page rect BRect page; float width = letter_width; float height = letter_height; if (fSetupMsg->FindRect("preview:paper_rect", &page) == B_OK) { width = page.Width(); height = page.Height(); } else { page.Set(0, 0, width, height); } BString label; if (fSetupMsg->FindString("preview:paper_size", &label) != B_OK) label = "Letter"; // Load units int32 units; if (fSetupMsg->FindInt32("units", &units) != B_OK) units = kUnitInch; // re-calculate the margin from the printable rect in points BRect margin = page; if (fSetupMsg->FindRect("preview:printable_rect", &margin) == B_OK) { margin.top -= page.top; margin.left -= page.left; margin.right = page.right - margin.right; margin.bottom = page.bottom - margin.bottom; } else { margin.Set(28.34, 28.34, 28.34, 28.34); // 28.34 dots = 1cm } BRect bounds(Bounds()); BBox *panel = new BBox(bounds, "background", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE_JUMP, B_PLAIN_BORDER); AddChild(panel); bounds.InsetBy(10.0, 10.0); bounds.right = 230.0; bounds.bottom = 160.0; fMarginView = new MarginView(bounds, int32(width), int32(height), margin, MarginUnit(units)); panel->AddChild(fMarginView); fMarginView->SetResizingMode(B_FOLLOW_NONE); BPopUpMenu* m = new BPopUpMenu("Page size"); m->SetRadioMode(true); bounds.OffsetBy(bounds.Width() + 10.0, 5.0); float divider = be_plain_font->StringWidth("Orientation: "); fPageSizeMenu = new BMenuField(bounds, "page_size", "Page size:", m); panel->AddChild(fPageSizeMenu); fPageSizeMenu->ResizeToPreferred(); fPageSizeMenu->SetDivider(divider); fPageSizeMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; pageFormat[i].label != NULL; i++) { BMessage* message = new BMessage(PAGE_SIZE_CHANGED); message->AddFloat("width", pageFormat[i].width); message->AddFloat("height", pageFormat[i].height); BMenuItem* item = new BMenuItem(pageFormat[i].label, message); m->AddItem(item); if (label.Compare(pageFormat[i].label) == 0) item->SetMarked(true); } m = new BPopUpMenu("Orientation"); m->SetRadioMode(true); bounds.OffsetBy(0.0, fPageSizeMenu->Bounds().Height() + 10.0); fOrientationMenu = new BMenuField(bounds, "orientation", "Orientation:", m); panel->AddChild(fOrientationMenu); fOrientationMenu->ResizeToPreferred(); fOrientationMenu->SetDivider(divider); fOrientationMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; orientation[i].label != NULL; i++) { BMessage* message = new BMessage(ORIENTATION_CHANGED); message->AddInt32("orientation", orientation[i].orientation); BMenuItem* item = new BMenuItem(orientation[i].label, message); m->AddItem(item); if (fCurrentOrientation == orientation[i].orientation) item->SetMarked(true); } float scale0; BString scale; if (fSetupMsg->FindFloat("scale", &scale0) == B_OK) scale << (int)scale0; else scale = "100"; bounds.OffsetBy(0.0, fOrientationMenu->Bounds().Height() + 10.0); bounds.right -= 30.0; fScaleControl = new BTextControl(bounds, "scale", "Scale [%]:", scale.String(), NULL); panel->AddChild(fScaleControl); fScaleControl->ResizeToPreferred(); fScaleControl->SetDivider(divider); for (uint32 i = 0; i < '0'; i++) fScaleControl->TextView()->DisallowChar(i); for (uint32 i = '9' + 1; i < 255; i++) fScaleControl->TextView()->DisallowChar(i); fScaleControl->TextView()->SetMaxBytes(3); bounds = Bounds(); bounds.InsetBy(5.0, 0.0); bounds.top = MAX(fScaleControl->Frame().bottom, fMarginView->Frame().bottom) + 10.0; BBox *line = new BBox(BRect(bounds.left, bounds.top, bounds.right, bounds.top + 1.0), NULL, B_FOLLOW_LEFT_RIGHT); panel->AddChild(line); bounds.InsetBy(5.0, 0.0); bounds.OffsetBy(0.0, 11.0); BButton *cancel = new BButton(bounds, NULL, "Cancel", new BMessage(CANCEL_MSG)); panel->AddChild(cancel); cancel->ResizeToPreferred(); BButton *ok = new BButton(bounds, NULL, "OK", new BMessage(OK_MSG)); panel->AddChild(ok, cancel); ok->ResizeToPreferred(); bounds.right = fScaleControl->Frame().right; ok->MoveTo(bounds.right - ok->Bounds().Width(), ok->Frame().top); bounds = ok->Frame(); cancel->MoveTo(bounds.left - cancel->Bounds().Width() - 10.0, bounds.top); ok->MakeDefault(true); ResizeTo(bounds.right + 10.0, bounds.bottom + 10.0); BRect winFrame(Frame()); BRect screenFrame(BScreen().Frame()); MoveTo((screenFrame.right - winFrame.right) / 2, (screenFrame.bottom - winFrame.bottom) / 2); }
PageSetupWindow::PageSetupWindow(BMessage *msg, const char *printerName) : HWindow(BRect(0, 0, 200, 100), "Page setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), fResult(B_ERROR), fSetupMsg(msg), fAdvancedSettings(*msg), fPrinterDirName(printerName) { fExitSem = create_sem(0, "PageSetup"); if (printerName) SetTitle(BString(printerName).Append(" page setup").String()); if (fSetupMsg->FindInt32("orientation", &fCurrentOrientation) != B_OK) fCurrentOrientation = PrinterDriver::PORTRAIT_ORIENTATION; BRect page; float width = letter_width; float height = letter_height; if (fSetupMsg->FindRect("paper_rect", &page) == B_OK) { width = page.Width(); height = page.Height(); } else { page.Set(0, 0, width, height); } BString label; if (fSetupMsg->FindString("pdf_paper_size", &label) != B_OK) label = "Letter"; int32 compression; fSetupMsg->FindInt32("pdf_compression", &compression); int32 units; if (fSetupMsg->FindInt32("units", &units) != B_OK) units = kUnitInch; // re-calculate the margin from the printable rect in points BRect margin = page; if (fSetupMsg->FindRect("printable_rect", &margin) == B_OK) { margin.top -= page.top; margin.left -= page.left; margin.right = page.right - margin.right; margin.bottom = page.bottom - margin.bottom; } else { margin.Set(28.34, 28.34, 28.34, 28.34); // 28.34 dots = 1cm } BString setting_value; if (fSetupMsg->FindString("pdf_compatibility", &setting_value) != B_OK) setting_value = "1.3"; // Load font settings fFonts = new Fonts(); fFonts->CollectFonts(); BMessage fonts; if (fSetupMsg->FindMessage("fonts", &fonts) == B_OK) fFonts->SetTo(&fonts); fMarginView = new MarginView(int32(width), int32(height), margin, MarginUnit(units)); BPopUpMenu* pageSize = new BPopUpMenu("Page size"); pageSize->SetRadioMode(true); fPageSizeMenu = new BMenuField("page_size", "Page size:", pageSize); fPageSizeMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; pageFormat[i].label != NULL; i++) { BMessage* message = new BMessage(PAGE_SIZE_CHANGED); message->AddFloat("width", pageFormat[i].width); message->AddFloat("height", pageFormat[i].height); BMenuItem* item = new BMenuItem(pageFormat[i].label, message); pageSize->AddItem(item); if (label.Compare(pageFormat[i].label) == 0) item->SetMarked(true); } BPopUpMenu* orientationPopUpMenu = new BPopUpMenu("Orientation"); orientationPopUpMenu->SetRadioMode(true); fOrientationMenu = new BMenuField("orientation", "Orientation:", orientationPopUpMenu); fOrientationMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; orientation[i].label != NULL; i++) { BMessage* message = new BMessage(ORIENTATION_CHANGED); message->AddInt32("orientation", orientation[i].orientation); BMenuItem* item = new BMenuItem(orientation[i].label, message); orientationPopUpMenu->AddItem(item); if (fCurrentOrientation == orientation[i].orientation) item->SetMarked(true); } BPopUpMenu* compatibility = new BPopUpMenu("PDF compatibility"); compatibility->SetRadioMode(true); fPDFCompatibilityMenu = new BMenuField("pdf_compatibility", "PDF compatibility:", compatibility); fPDFCompatibilityMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; pdf_compatibility[i] != NULL; i++) { BMenuItem* item = new BMenuItem(pdf_compatibility[i], NULL); compatibility->AddItem(item); if (setting_value == pdf_compatibility[i]) item->SetMarked(true); } fPDFCompressionSlider = new BSlider("pdf_compression", "Compression:", NULL, 0, 9, B_HORIZONTAL); fPDFCompressionSlider->SetLimitLabels("None", "Best"); fPDFCompressionSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); fPDFCompressionSlider->SetValue(compression); BBox *separator = new BBox("separator"); separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1)); BButton *cancel = new BButton("cancel", "Cancel", new BMessage(CANCEL_MSG)); BButton *ok = new BButton("ok", "OK", new BMessage(OK_MSG)); ok->MakeDefault(true); BButton *fontsButton = new BButton("fonts", "Fonts" B_UTF8_ELLIPSIS, new BMessage(FONTS_MSG)); BButton* advancedButton = new BButton("advanced", "Advanced" B_UTF8_ELLIPSIS, new BMessage(ADVANCED_MSG)); BGridView* settings = new BGridView(); BGridLayout* settingsLayout = settings->GridLayout(); settingsLayout->AddItem(fPageSizeMenu->CreateLabelLayoutItem(), 0, 0); settingsLayout->AddItem(fPageSizeMenu->CreateMenuBarLayoutItem(), 1, 0); settingsLayout->AddItem(fOrientationMenu->CreateLabelLayoutItem(), 0, 1); settingsLayout->AddItem(fOrientationMenu->CreateMenuBarLayoutItem(), 1, 1); settingsLayout->AddItem(fPDFCompatibilityMenu->CreateLabelLayoutItem(), 0, 2); settingsLayout->AddItem(fPDFCompatibilityMenu->CreateMenuBarLayoutItem(), 1, 2); settingsLayout->AddView(fPDFCompressionSlider, 0, 3, 2); settingsLayout->SetSpacing(0, 0); SetLayout(new BGroupLayout(B_VERTICAL)); AddChild(BGroupLayoutBuilder(B_VERTICAL, 0) .AddGroup(B_HORIZONTAL, 5, 1) .AddGroup(B_VERTICAL, 0, 1.0f) .Add(fMarginView) .AddGlue() .End() .AddGroup(B_VERTICAL, 0, 1.0f) .Add(settings) .AddGlue() .End() .End() .Add(separator) .AddGroup(B_HORIZONTAL, 10, 1.0f) .Add(fontsButton) .Add(advancedButton) .AddGlue() .Add(cancel) .Add(ok) .End() .SetInsets(10, 10, 10, 10) ); BRect winFrame(Frame()); BRect screenFrame(BScreen().Frame()); MoveTo((screenFrame.right - winFrame.right) / 2, (screenFrame.bottom - winFrame.bottom) / 2); }
PageSetupWindow::PageSetupWindow(BMessage *msg, const char *printerName) : HWindow(BRect(0,0,400,220), "Page setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL, B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE), fResult(B_ERROR), fSetupMsg(msg), fAdvancedSettings(*msg), fPrinterDirName(printerName) { fExitSem = create_sem(0, "PageSetup"); if (printerName) SetTitle(BString(printerName).Append(" page setup").String()); if (fSetupMsg->FindInt32("orientation", &fCurrentOrientation) != B_OK) fCurrentOrientation = PrinterDriver::PORTRAIT_ORIENTATION; BRect page; float width = letter_width; float height = letter_height; if (fSetupMsg->FindRect("paper_rect", &page) == B_OK) { width = page.Width(); height = page.Height(); } else { page.Set(0, 0, width, height); } BString label; if (fSetupMsg->FindString("pdf_paper_size", &label) != B_OK) label = "Letter"; int32 compression; fSetupMsg->FindInt32("pdf_compression", &compression); int32 units; if (fSetupMsg->FindInt32("units", &units) != B_OK) units = kUnitInch; // re-calculate the margin from the printable rect in points BRect margin = page; if (fSetupMsg->FindRect("printable_rect", &margin) == B_OK) { margin.top -= page.top; margin.left -= page.left; margin.right = page.right - margin.right; margin.bottom = page.bottom - margin.bottom; } else { margin.Set(28.34, 28.34, 28.34, 28.34); // 28.34 dots = 1cm } BString setting_value; if (fSetupMsg->FindString("pdf_compatibility", &setting_value) != B_OK) setting_value = "1.3"; // Load font settings fFonts = new Fonts(); fFonts->CollectFonts(); BMessage fonts; if (fSetupMsg->FindMessage("fonts", &fonts) == B_OK) fFonts->SetTo(&fonts); // add a *dialog* background BRect bounds(Bounds()); BBox *panel = new BBox(bounds, "background", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE_JUMP, B_PLAIN_BORDER); AddChild(panel); bounds.InsetBy(10.0, 10.0); bounds.right = 230.0; bounds.bottom = 160.0; fMarginView = new MarginView(bounds, int32(width), int32(height), margin, MarginUnit(units)); panel->AddChild(fMarginView); fMarginView->SetResizingMode(B_FOLLOW_NONE); BPopUpMenu* m = new BPopUpMenu("Page size"); m->SetRadioMode(true); bounds.OffsetBy(bounds.Width() + 10.0, 5.0); float divider = be_plain_font->StringWidth("PDF compatibility: "); fPageSizeMenu = new BMenuField(bounds, "page_size", "Page size:", m); panel->AddChild(fPageSizeMenu); fPageSizeMenu->ResizeToPreferred(); fPageSizeMenu->SetDivider(divider); fPageSizeMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; pageFormat[i].label != NULL; i++) { BMessage* message = new BMessage(PAGE_SIZE_CHANGED); message->AddFloat("width", pageFormat[i].width); message->AddFloat("height", pageFormat[i].height); BMenuItem* item = new BMenuItem(pageFormat[i].label, message); m->AddItem(item); if (label.Compare(pageFormat[i].label) == 0) item->SetMarked(true); } m = new BPopUpMenu("Orientation"); m->SetRadioMode(true); bounds.OffsetBy(0.0, fPageSizeMenu->Bounds().Height() + 10.0); fOrientationMenu = new BMenuField(bounds, "orientation", "Orientation:", m); panel->AddChild(fOrientationMenu); fOrientationMenu->ResizeToPreferred(); fOrientationMenu->SetDivider(divider); fOrientationMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; orientation[i].label != NULL; i++) { BMessage* message = new BMessage(ORIENTATION_CHANGED); message->AddInt32("orientation", orientation[i].orientation); BMenuItem* item = new BMenuItem(orientation[i].label, message); m->AddItem(item); if (fCurrentOrientation == orientation[i].orientation) item->SetMarked(true); } m = new BPopUpMenu("PDF compatibility"); m->SetRadioMode(true); bounds.OffsetBy(0.0, fOrientationMenu->Bounds().Height() + 10.0); fPDFCompatibilityMenu = new BMenuField(bounds, "pdf_compatibility", "PDF compatibility:", m); panel->AddChild(fPDFCompatibilityMenu); fPDFCompatibilityMenu->ResizeToPreferred(); fPDFCompatibilityMenu->SetDivider(divider); fPDFCompatibilityMenu->Menu()->SetLabelFromMarked(true); for (int32 i = 0; pdf_compatibility[i] != NULL; i++) { BMenuItem* item = new BMenuItem(pdf_compatibility[i], NULL); m->AddItem(item); if (setting_value == pdf_compatibility[i]) item->SetMarked(true); } bounds.OffsetBy(0.0, fPDFCompatibilityMenu->Bounds().Height() + 10.0); fPDFCompressionSlider = new BSlider(bounds, "pdf_compression", "Compression:", NULL, 0, 9); panel->AddChild(fPDFCompressionSlider); fPDFCompressionSlider->SetLimitLabels("None", "Best"); fPDFCompressionSlider->SetHashMarks(B_HASH_MARKS_BOTTOM); fPDFCompressionSlider->SetValue(compression); fPDFCompressionSlider->ResizeToPreferred(); bounds = Bounds(); bounds.InsetBy(5.0, 0.0); bounds.top = MAX(fPDFCompressionSlider->Frame().bottom, fMarginView->Frame().bottom) + 10.0; BBox *line = new BBox(BRect(bounds.left, bounds.top, bounds.right, bounds.top + 1.0), NULL, B_FOLLOW_LEFT_RIGHT); panel->AddChild(line); bounds.InsetBy(5.0, 0.0); bounds.OffsetBy(0.0, 11.0); BButton *cancel = new BButton(bounds, NULL, "Cancel", new BMessage(CANCEL_MSG)); panel->AddChild(cancel); cancel->ResizeToPreferred(); BButton *ok = new BButton(bounds, NULL, "OK", new BMessage(OK_MSG)); panel->AddChild(ok, cancel); ok->ResizeToPreferred(); bounds.right = fPDFCompressionSlider->Frame().right; ok->MoveTo(bounds.right - ok->Bounds().Width(), ok->Frame().top); bounds = ok->Frame(); cancel->MoveTo(bounds.left - cancel->Bounds().Width() - 10.0, bounds.top); ok->MakeDefault(true); ResizeTo(bounds.right + 10.0, bounds.bottom + 10.0); BButton *button = new BButton(bounds, NULL, "Fonts" B_UTF8_ELLIPSIS, new BMessage(FONTS_MSG)); panel->AddChild(button); button->ResizeToPreferred(); button->MoveTo(fMarginView->Frame().left, bounds.top); bounds = button->Frame(); button = new BButton(bounds, NULL, "Advanced" B_UTF8_ELLIPSIS, new BMessage(ADVANCED_MSG)); panel->AddChild(button); button->ResizeToPreferred(); button->MoveTo(bounds.right + 10, bounds.top); BRect winFrame(Frame()); BRect screenFrame(BScreen().Frame()); MoveTo((screenFrame.right - winFrame.right) / 2, (screenFrame.bottom - winFrame.bottom) / 2); }