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