1218893Sdim/* 2193326Sed * Copyright 2003-2008, Haiku. All rights reserved. 3193326Sed * Distributed under the terms of the MIT License. 4193326Sed * 5193326Sed * Authors: 6193326Sed * Philippe Houdoin 7193326Sed * Simon Gauvin 8193326Sed * Michael Pfeiffer 9193326Sed * julun <host.haiku@gmx.de> 10193326Sed */ 11249423Sdim 12249423Sdim#include "JobSetupWindow.h" 13249423Sdim#include "PrinterDriver.h" 14249423Sdim 15193326Sed 16249423Sdim#include <stdlib.h> 17198893Srdivacky 18198893Srdivacky 19193326Sed#include <Box.h> 20199512Srdivacky#include <Button.h> 21263508Sdim#include <GridView.h> 22193326Sed#include <GroupLayout.h> 23193326Sed#include <GroupLayoutBuilder.h> 24263508Sdim#include <RadioButton.h> 25198092Srdivacky#include <Screen.h> 26263508Sdim#include <TextControl.h> 27198893Srdivacky 28198092Srdivacky 29263508SdimJobSetupWindow::JobSetupWindow(BMessage *msg, const char * printerName) 30263508Sdim : BlockingWindow(BRect(0, 0, 100, 100), "Job Setup", 31263508Sdim B_TITLED_WINDOW_LOOK, 32249423Sdim B_MODAL_APP_WINDOW_FEEL, B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | 33218893Sdim B_NOT_ZOOMABLE | B_AUTO_UPDATE_SIZE_LIMITS | B_CLOSE_ON_ESCAPE), 34193326Sed fPrinterName(printerName), 35218893Sdim fSetupMsg(msg) 36263508Sdim{ 37263508Sdim if (printerName) 38218893Sdim SetTitle(BString(printerName).Append(" Job Setup").String()); 39249423Sdim 40263508Sdim int32 firstPage; 41193326Sed fSetupMsg->FindInt32("first_page", &firstPage); 42193326Sed 43193326Sed int32 lastPage; 44226633Sdim fSetupMsg->FindInt32("last_page", &lastPage); 45263508Sdim bool allPages = firstPage == 1 && lastPage == LONG_MAX; 46193326Sed 47198092Srdivacky fAll = new BRadioButton("allPages", "Print all pages", 48198092Srdivacky new BMessage(ALL_PAGES_MGS)); 49198092Srdivacky fAll->SetValue(allPages); 50198092Srdivacky 51263508Sdim fRange = new BRadioButton("pagesRange", "Print selected pages:", 52226633Sdim new BMessage(RANGE_SELECTION_MSG)); 53198092Srdivacky fRange->SetValue(!allPages); 54198092Srdivacky 55198092Srdivacky fFrom = new BTextControl("from", "From:", "SomeSpaceHere", NULL); 56198092Srdivacky fFrom->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT); 57198092Srdivacky fFrom->SetEnabled(!allPages); 58198092Srdivacky 59198092Srdivacky fTo = new BTextControl("to", "To:", "", NULL); 60198092Srdivacky fTo->SetAlignment(B_ALIGN_LEFT, B_ALIGN_RIGHT); 61198092Srdivacky fTo->SetEnabled(!allPages); 62198092Srdivacky 63226633Sdim BString buffer; 64198092Srdivacky buffer << firstPage; 65198092Srdivacky fFrom->SetText(buffer.String()); 66198092Srdivacky 67206084Srdivacky buffer = ""; 68206084Srdivacky buffer << lastPage; 69226633Sdim fTo->SetText(buffer.String()); 70226633Sdim 71206084Srdivacky for (uint32 i = 0; i < '0'; i++) { 72206084Srdivacky fTo->TextView()->DisallowChar(i); 73206084Srdivacky fFrom->TextView()->DisallowChar(i); 74206084Srdivacky } 75206084Srdivacky 76206084Srdivacky for (uint32 i = '9' + 1; i < 255; i++) { 77206084Srdivacky fTo->TextView()->DisallowChar(i); 78206084Srdivacky fFrom->TextView()->DisallowChar(i); 79206084Srdivacky } 80206084Srdivacky 81206084Srdivacky BBox *separator = new BBox("separator"); 82206084Srdivacky separator->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, 1)); 83206084Srdivacky 84206084Srdivacky BButton *cancel = new BButton("cancel", "Cancel", new BMessage(CANCEL_MSG)); 85206084Srdivacky 86206084Srdivacky BButton *ok = new BButton("ok", "OK", new BMessage(OK_MSG)); 87206084Srdivacky ok->MakeDefault(true); 88206084Srdivacky 89206084Srdivacky BGridView* settings = new BGridView(); 90206084Srdivacky BGridLayout* settingsLayout = settings->GridLayout(); 91206084Srdivacky settingsLayout->AddItem(fFrom->CreateLabelLayoutItem(), 0, 0); 92206084Srdivacky settingsLayout->AddItem(fFrom->CreateTextViewLayoutItem(), 1, 0); 93206084Srdivacky settingsLayout->AddItem(fTo->CreateLabelLayoutItem(), 0, 1); 94206084Srdivacky settingsLayout->AddItem(fTo->CreateTextViewLayoutItem(), 1, 1); 95206084Srdivacky settingsLayout->SetSpacing(0, 0); 96234353Sdim 97234353Sdim SetLayout(new BGroupLayout(B_VERTICAL)); 98234353Sdim AddChild(BGroupLayoutBuilder(B_VERTICAL, 0) 99234353Sdim .Add(fAll) 100234353Sdim .Add(fRange) 101243830Sdim .Add(settings) 102243830Sdim .AddGlue() 103234353Sdim .Add(separator) 104234353Sdim .AddGroup(B_HORIZONTAL, 10, 1.0f) 105234353Sdim .AddGlue() 106243830Sdim .Add(cancel) 107243830Sdim .Add(ok) 108243830Sdim .End() 109243830Sdim .SetInsets(10, 10, 10, 10) 110234353Sdim ); 111234353Sdim 112234353Sdim 113234353Sdim BRect winFrame(Frame()); 114234353Sdim BRect screenFrame(BScreen().Frame()); 115263508Sdim MoveTo((screenFrame.right - winFrame.right) / 2, 116234353Sdim (screenFrame.bottom - winFrame.bottom) / 2); 117243830Sdim} 118243830Sdim 119243830Sdim 120243830Sdimvoid 121243830SdimJobSetupWindow::UpdateJobMessage() 122243830Sdim{ 123234353Sdim int32 from = 1; 124243830Sdim int32 to = LONG_MAX; 125243830Sdim if (fAll->Value() == B_CONTROL_OFF) { 126243830Sdim from = atoi(fFrom->Text()); 127243830Sdim to = atoi(fTo->Text()); 128243830Sdim if (from <= 0) from = 1; 129243830Sdim if (to < from) to = from; 130234353Sdim } 131234353Sdim 132234353Sdim int32 copies = 1; 133234353Sdim fSetupMsg->RemoveName("copies"); 134234353Sdim fSetupMsg->AddInt32("copies", copies); 135243830Sdim 136243830Sdim fSetupMsg->RemoveName("first_page"); 137243830Sdim fSetupMsg->AddInt32("first_page", from); 138243830Sdim 139243830Sdim fSetupMsg->RemoveName("last_page"); 140243830Sdim fSetupMsg->AddInt32("last_page", to); 141234353Sdim} 142243830Sdim 143243830Sdim 144243830Sdimvoid 145243830SdimJobSetupWindow::MessageReceived(BMessage *msg) 146243830Sdim{ 147243830Sdim switch (msg->what) { 148234353Sdim case OK_MSG: 149234353Sdim UpdateJobMessage(); 150234353Sdim Quit(B_OK); 151218893Sdim break; 152218893Sdim 153218893Sdim case CANCEL_MSG: 154218893Sdim Quit(B_ERROR); 155218893Sdim break; 156218893Sdim 157218893Sdim case ALL_PAGES_MGS: 158218893Sdim fTo->SetEnabled(false); 159218893Sdim fFrom->SetEnabled(false); 160218893Sdim break; 161218893Sdim 162218893Sdim case RANGE_SELECTION_MSG: 163218893Sdim fTo->SetEnabled(true); 164218893Sdim fFrom->SetEnabled(true); 165218893Sdim break; 166218893Sdim 167218893Sdim default: 168218893Sdim BlockingWindow::MessageReceived(msg); 169218893Sdim break; 170226633Sdim } 171218893Sdim} 172218893Sdim