* Copyright 2005-2006, Haiku. All rights reserved.
* Distributed under the terms of the MIT License.
*
* Authors:
* Dr.H.Reh
*/
#include "StatusWindow.h"
#include <Button.h>
#include <GroupLayout.h>
#include <GroupLayoutBuilder.h>
#include <Message.h>
#include <View.h>
#include <StatusBar.h>
#include <stdio.h>
#include <StringView.h>
#define CANCEL_MSG 'canM'
#define HIDE_MSG 'hidM'
StatusWindow::StatusWindow(bool oddPages, bool evenPages, uint32 firstPage,
uint32 numPages, uint32 numCopies, uint32 nup)
:
BWindow(BRect(200, 200, 250, 250),
"Print status",
B_TITLED_WINDOW,
B_NOT_RESIZABLE | B_NOT_CLOSABLE | B_NOT_ZOOMABLE
| B_AUTO_UPDATE_SIZE_LIMITS)
{
fStatusBar = new BStatusBar("statusBar", "Page: ");
fHideButton = new BButton("hideButton", "Hide status",
new BMessage(HIDE_MSG));
fCancelButton = new BButton("cancelButton", "Cancel",
new BMessage(CANCEL_MSG));
SetLayout(new BGroupLayout(B_VERTICAL));
AddChild(BGroupLayoutBuilder(B_HORIZONTAL, 10)
.Add(fStatusBar)
.Add(fHideButton)
.Add(fCancelButton)
.SetInsets(10, 10, 10, 10)
);
fCancelled = false;
fNops = numPages;
bool evenFirstPage = (firstPage % 2) == 0;
bool evenNumPages = (numPages % 2) == 0;
if (oddPages || evenPages) {
if (evenNumPages) {
fNops = numPages / 2;
} else if (evenFirstPage) {
if (oddPages)
fNops = (numPages - 1) / 2;
if (evenPages)
fNops = (numPages + 1) / 2;
} else {
if (oddPages)
fNops = (numPages + 1) / 2;
if (evenPages)
fNops = (numPages - 1) / 2;
}
}
uint32 addPage = 0;
if (fNops % nup > 0)
addPage = 1;
fNops = (uint32)(fNops / (float)nup) + addPage;
fStatusBar->SetMaxValue((float)fNops);
fDelta = 1.0/numCopies;
fStatusDelta = fDelta;
fDocCopies = numCopies;
fDocumentCopy = fDocCopies > 1;
fDocCopies++;
ResetStatusBar();
Show();
}
StatusWindow::~StatusWindow(void)
{
}
void
StatusWindow::ResetStatusBar(void)
{
Lock();
fStatusBar->Reset("Page: ");
InvalidateLayout(true);
Unlock();
}
bool
StatusWindow::UpdateStatusBar(uint32 page, uint32 copy)
{
Lock();
Activate(true);
char buffer[20];
sprintf(buffer,"%d", (int)(page + 1));
BString string1(buffer);
sprintf(buffer,"%d",(int)fNops );
BString string2(buffer);
string1.Append(BString(" / "));
string1.Append(string2);
BString string3 = BString("Remaining document copies: ");
if (fDocumentCopy == true) {
sprintf(buffer, "%d", (int)(fDocCopies));
BString string4(buffer);
string3.Append(string4);
} else {
string3 = BString("Remaining page copies: ");
char buffer[20];
sprintf(buffer,"%d",(int)(fCopies - copy) );
BString string4(buffer);
string3.Append(string4);
}
fStatusBar->Update(fStatusDelta * 100.0 / fNops,
string1.String(), string3.String());
if (fStatusBar->MaxValue() == fStatusBar->CurrentValue())
fCancelButton->SetEnabled(false);
InvalidateLayout(true);
Unlock();
return fCancelled;
}
void
StatusWindow::SetPageCopies(uint32 copies)
{
fCopies = copies;
fStatusDelta = fDelta / (float)fCopies;
fDocCopies--;
}
void
StatusWindow::MessageReceived(BMessage *message)
{
switch(message->what) {
case CANCEL_MSG:
fCancelled = true;
fCancelButton->SetEnabled(false);
fCancelButton->SetLabel("Job cancelled");
InvalidateLayout(true);
break;
case HIDE_MSG:
Hide();
break;
default:
BWindow::MessageReceived(message);
break;
}
}