Some printing related improvements:
* libprint based drivers can now show a preview window and show progress window while printing contributed in part by Hartmut Reh. * Libprint and PCL6 driver bug fixes. * Code clean-up (removed code duplications, coding style, copyright text) Builds under Linux. Not tested under BeOS. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19882 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -36,8 +36,8 @@
|
|||||||
// DEALINGS IN THE SOFTWARE.
|
// DEALINGS IN THE SOFTWARE.
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
#ifndef BEUTILS_H
|
#ifndef _BE_UTILS_H
|
||||||
#define BEUTILS_H
|
#define _BE_UTILS_H
|
||||||
|
|
||||||
#include <FindDirectory.h>
|
#include <FindDirectory.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
@@ -91,7 +91,7 @@ public:
|
|||||||
// mimetype from sender
|
// mimetype from sender
|
||||||
bool MimeTypeForSender(BMessage* sender, BString& mime);
|
bool MimeTypeForSender(BMessage* sender, BString& mime);
|
||||||
// adds fields to message or replaces existing fields
|
// adds fields to message or replaces existing fields
|
||||||
void AddFields(BMessage* to, const BMessage* from, const char* excludeList[] = NULL, const char* includeList[] = NULL);
|
void AddFields(BMessage* to, const BMessage* from, const char* excludeList[] = NULL, const char* includeList[] = NULL, bool overwrite = true);
|
||||||
// load bitmap from application resources
|
// load bitmap from application resources
|
||||||
BBitmap* LoadBitmap(const char* name, uint32 type_code = B_TRANSLATOR_BITMAP);
|
BBitmap* LoadBitmap(const char* name, uint32 type_code = B_TRANSLATOR_BITMAP);
|
||||||
// convert bitmap to picture; view must be attached to a window!
|
// convert bitmap to picture; view must be attached to a window!
|
||||||
|
|||||||
@@ -27,6 +27,9 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef _PRINT_JOB_READER_H
|
||||||
|
#define _PRINT_JOB_READER_H
|
||||||
|
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
|
|
||||||
@@ -80,3 +83,5 @@ public:
|
|||||||
status_t GetPage(int no, PrintJobPage& pjp);
|
status_t GetPage(int no, PrintJobPage& pjp);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PRINT_TRANSPORT_H
|
#ifndef _PRINT_TRANSPORT_H
|
||||||
#define PRINT_TRANSPORT_H
|
#define _PRINT_TRANSPORT_H
|
||||||
|
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <DataIO.h>
|
#include <DataIO.h>
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PRINT_TRANSPORT_ADD_ON_H
|
#ifndef _PRINT_TRANSPORT_ADD_ON_H
|
||||||
#define PRINT_TRANSPORT_ADD_ON_H
|
#define _PRINT_TRANSPORT_ADD_ON_H
|
||||||
|
|
||||||
#include <image.h>
|
#include <image.h>
|
||||||
#include <DataIO.h>
|
#include <DataIO.h>
|
||||||
@@ -38,4 +38,5 @@ THE SOFTWARE.
|
|||||||
// to be implemented by the transport add-on
|
// to be implemented by the transport add-on
|
||||||
extern "C" BDataIO* instantiate_transport(BDirectory* printer, BMessage* msg);
|
extern "C" BDataIO* instantiate_transport(BDirectory* printer, BMessage* msg);
|
||||||
|
|
||||||
#endif PRINT_TRANSPORT_ADD_ON_H
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -82,4 +82,4 @@ public:
|
|||||||
virtual void SetFontFace(int32 flags);
|
virtual void SetFontFace(int32 flags);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif _TEMPLATE_H
|
#endif // _TEMPLATE_H
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "PrintProcess.h"
|
#include "PrintProcess.h"
|
||||||
#include "SpoolMetaData.h"
|
#include "SpoolMetaData.h"
|
||||||
#include "Transport.h"
|
#include "Transport.h"
|
||||||
|
#include "StatusWindow.h"
|
||||||
|
|
||||||
class BView;
|
class BView;
|
||||||
class BBitmap;
|
class BBitmap;
|
||||||
@@ -26,7 +27,11 @@ class GraphicsDriver {
|
|||||||
public:
|
public:
|
||||||
GraphicsDriver(BMessage *, PrinterData *, const PrinterCap *);
|
GraphicsDriver(BMessage *, PrinterData *, const PrinterCap *);
|
||||||
virtual ~GraphicsDriver();
|
virtual ~GraphicsDriver();
|
||||||
|
const JobData *getJobData(BFile *spoolFile);
|
||||||
BMessage *takeJob(BFile *spool, uint32 flags = 0);
|
BMessage *takeJob(BFile *spool, uint32 flags = 0);
|
||||||
|
static BPoint getScale(int32 nup, BRect physicalRect, float scaling);
|
||||||
|
static BPoint getOffset(int32 nup, int index, JobData::Orientation orientation, const BPoint *scale,
|
||||||
|
BRect scaledPhysicalRect, BRect scaledPrintableRect, BRect physicalRect);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual bool startDoc();
|
virtual bool startDoc();
|
||||||
@@ -58,7 +63,7 @@ protected:
|
|||||||
GraphicsDriver &operator = (const GraphicsDriver &);
|
GraphicsDriver &operator = (const GraphicsDriver &);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupData(BFile *file, long page_count);
|
bool setupData(BFile *file);
|
||||||
void setupBitmap();
|
void setupBitmap();
|
||||||
void cleanupData();
|
void cleanupData();
|
||||||
void cleanupBitmap();
|
void cleanupBitmap();
|
||||||
@@ -91,6 +96,9 @@ private:
|
|||||||
int fPixelDepth;
|
int fPixelDepth;
|
||||||
int fBandCount;
|
int fBandCount;
|
||||||
int fInternalCopies;
|
int fInternalCopies;
|
||||||
|
|
||||||
|
uint32 fPageCount;
|
||||||
|
StatusWindow *fStatusWindow;
|
||||||
};
|
};
|
||||||
|
|
||||||
inline const JobData *GraphicsDriver::getJobData() const
|
inline const JobData *GraphicsDriver::getJobData() const
|
||||||
|
|||||||
@@ -206,7 +206,10 @@ public:
|
|||||||
*/
|
*/
|
||||||
enum Color {
|
enum Color {
|
||||||
kMonochrome = 1,
|
kMonochrome = 1,
|
||||||
kColor
|
kColor,
|
||||||
|
// Some PCL6 printers do not support compressed data
|
||||||
|
// in color mode.
|
||||||
|
kColorCompressionDisabled
|
||||||
};
|
};
|
||||||
|
|
||||||
enum Settings {
|
enum Settings {
|
||||||
@@ -221,6 +224,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool fShowPreview;
|
||||||
Paper fPaper;
|
Paper fPaper;
|
||||||
int32 fXRes;
|
int32 fXRes;
|
||||||
int32 fYRes;
|
int32 fYRes;
|
||||||
@@ -261,6 +265,9 @@ public:
|
|||||||
void load(BMessage *msg, const PrinterCap *cap, Settings settings);
|
void load(BMessage *msg, const PrinterCap *cap, Settings settings);
|
||||||
void save(BMessage *msg = NULL);
|
void save(BMessage *msg = NULL);
|
||||||
|
|
||||||
|
bool getShowPreview() const { return fShowPreview; }
|
||||||
|
void setShowPreview(bool showPreview) { fShowPreview = showPreview; }
|
||||||
|
|
||||||
Paper getPaper() const { return fPaper; }
|
Paper getPaper() const { return fPaper; }
|
||||||
void setPaper(Paper paper) { fPaper = paper; }
|
void setPaper(Paper paper) { fPaper = paper; }
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public:
|
|||||||
JobSetupView(BRect frame, JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap);
|
JobSetupView(BRect frame, JobData *job_data, PrinterData *printer_data, const PrinterCap *printer_cap);
|
||||||
virtual void AttachedToWindow();
|
virtual void AttachedToWindow();
|
||||||
virtual void MessageReceived(BMessage *msg);
|
virtual void MessageReceived(BMessage *msg);
|
||||||
bool UpdateJobData();
|
bool UpdateJobData(bool showPreview);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void UpdateButtonEnabledState();
|
void UpdateButtonEnabledState();
|
||||||
|
|||||||
@@ -1,29 +1,139 @@
|
|||||||
/*
|
/*
|
||||||
* Preview.h
|
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
Preview
|
||||||
|
|
||||||
|
Copyright (c) 2002, 2003 OpenBeOS.
|
||||||
|
Copyright (c) 2005 Haiku.
|
||||||
|
|
||||||
|
Author:
|
||||||
|
Michael Pfeiffer
|
||||||
|
Hartmut Reh
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#define USE_PREVIEW_FOR_DEBUG
|
#include <InterfaceKit.h>
|
||||||
|
#include "PrintJobReader.h"
|
||||||
|
#include "InterfaceUtils.h"
|
||||||
|
|
||||||
#ifdef USE_PREVIEW_FOR_DEBUG
|
class PreviewPage {
|
||||||
#ifndef __PREVIEW_H
|
int32 fPage;
|
||||||
#define __PREVIEW_H
|
int32 fNumberOfPictures;
|
||||||
|
BPicture* fPictures;
|
||||||
|
BPoint* fPoints;
|
||||||
|
BRect* fRects;
|
||||||
|
status_t fStatus;
|
||||||
|
|
||||||
#include <Window.h>
|
|
||||||
|
|
||||||
class PreviewWindow : public BWindow {
|
|
||||||
public:
|
public:
|
||||||
PreviewWindow(BRect, const char *, BBitmap *);
|
PreviewPage(int32 page, PrintJobPage* pjp);
|
||||||
virtual bool QuitRequested();
|
~PreviewPage();
|
||||||
int Go();
|
status_t InitCheck() const;
|
||||||
|
|
||||||
protected:
|
int32 Page() const { return fPage; }
|
||||||
PreviewWindow(const PreviewWindow &);
|
void Draw(BView* view);
|
||||||
PreviewWindow &operator = (const PreviewWindow &);
|
};
|
||||||
|
|
||||||
private:
|
class PreviewView : public BView {
|
||||||
long fSemaphore;
|
int32 fPage;
|
||||||
|
int32 fZoom;
|
||||||
|
PrintJobReader fReader;
|
||||||
|
int32 fNumberOfPagesPerPage;
|
||||||
|
int32 fNumberOfPages; // physical pages
|
||||||
|
bool fReverse;
|
||||||
|
BRect fPageRect;
|
||||||
|
JobData::Orientation fOrientation;
|
||||||
|
JobData::PageSelection fPageSelection;
|
||||||
|
PreviewPage* fCachedPage;
|
||||||
|
|
||||||
|
float ZoomFactor() const;
|
||||||
|
BRect PageRect() const;
|
||||||
|
BRect PrintableRect() const;
|
||||||
|
int32 GetPageNumber(int32 index) const;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PreviewView(BFile* jobFile, BRect rect);
|
||||||
|
~PreviewView();
|
||||||
|
status_t InitCheck() const;
|
||||||
|
|
||||||
|
BRect ViewRect() const;
|
||||||
|
|
||||||
|
bool IsPageLoaded(int32 page) const;
|
||||||
|
bool IsPageValid() const;
|
||||||
|
void LoadPage(int32 page);
|
||||||
|
void DrawPageFrame(BRect r);
|
||||||
|
void DrawPage(BRect r);
|
||||||
|
void Draw(BRect r);
|
||||||
|
void FrameResized(float width, float height);
|
||||||
|
|
||||||
|
void FixScrollbars();
|
||||||
|
|
||||||
|
bool ShowsFirstPage() const;
|
||||||
|
bool ShowsLastPage() const;
|
||||||
|
int CurrentPage() const { return fPage + 1; }
|
||||||
|
int NumberOfPages() const;
|
||||||
|
void ShowNextPage();
|
||||||
|
void ShowPrevPage();
|
||||||
|
void ShowFirstPage();
|
||||||
|
void ShowLastPage();
|
||||||
|
void ShowFindPage(int page);
|
||||||
|
|
||||||
|
bool CanZoomIn() const;
|
||||||
|
bool CanZoomOut() const;
|
||||||
|
void ZoomIn();
|
||||||
|
void ZoomOut();
|
||||||
|
};
|
||||||
|
|
||||||
|
class PreviewWindow : public BlockingWindow {
|
||||||
|
BButton *fFirst;
|
||||||
|
BButton *fNext;
|
||||||
|
BButton *fPrev;
|
||||||
|
BButton *fLast;
|
||||||
|
BButton *fZoomIn;
|
||||||
|
BButton *fZoomOut;
|
||||||
|
BTextControl *fPageNumber;
|
||||||
|
BStringView *fPageText;
|
||||||
|
PreviewView *fPreview;
|
||||||
|
BScrollView *fPreviewScroller;
|
||||||
|
float fButtonBarHeight;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
MSG_FIRST_PAGE = 'pwfp',
|
||||||
|
MSG_NEXT_PAGE = 'pwnp',
|
||||||
|
MSG_PREV_PAGE = 'pwpp',
|
||||||
|
MSG_LAST_PAGE = 'pwlp',
|
||||||
|
MSG_FIND_PAGE = 'pwsp',
|
||||||
|
MSG_ZOOM_IN = 'pwzi',
|
||||||
|
MSG_ZOOM_OUT = 'pwzo',
|
||||||
|
MSG_PRINT_JOB = 'pwpj',
|
||||||
|
MSG_CANCEL_JOB = 'pwcj',
|
||||||
|
};
|
||||||
|
|
||||||
|
void ResizeToPage(bool allowShrinking = false);
|
||||||
|
void UpdateControls();
|
||||||
|
|
||||||
|
typedef BlockingWindow inherited;
|
||||||
|
|
||||||
|
public:
|
||||||
|
PreviewWindow(BFile* jobFile, bool showOkAndCancelButtons = false);
|
||||||
|
status_t InitCheck() const { return fPreview->InitCheck(); }
|
||||||
|
void MessageReceived(BMessage* m);
|
||||||
|
status_t Go();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __PREVIEW_H */
|
|
||||||
#endif /* USE_PREVIEW_FOR_DEBUG */
|
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
StatusWindow.h
|
||||||
|
Copyright 2005 Dr.H.Reh. All Rights Reserved.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef STATUS_WINDOW_H
|
||||||
|
#define STATUS_WINDOW_H
|
||||||
|
|
||||||
|
#ifndef _WINDOW_H
|
||||||
|
#include <Window.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <String.h>
|
||||||
|
|
||||||
|
|
||||||
|
class StatusWindow : public BWindow
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
StatusWindow(bool oddPages, bool evenPages,
|
||||||
|
uint32 firstPage, uint32 numPages,
|
||||||
|
uint32 docCopies, uint32 nup);
|
||||||
|
~StatusWindow(void);
|
||||||
|
|
||||||
|
virtual void MessageReceived(BMessage *message);
|
||||||
|
|
||||||
|
void ResetStatusBar(void);
|
||||||
|
bool UpdateStatusBar(uint32 page, uint32 copy);
|
||||||
|
void SetPageCopies(uint32 copies);
|
||||||
|
|
||||||
|
private:
|
||||||
|
BView *fStatusView;
|
||||||
|
BStatusBar *fStatusBar;
|
||||||
|
BButton *fCancelButton;
|
||||||
|
BButton *fHideButton;
|
||||||
|
bool fCancelBar;
|
||||||
|
bool fDocumentCopy;
|
||||||
|
uint32 fNops;
|
||||||
|
uint32 fFirstPage;
|
||||||
|
uint32 fCopies;
|
||||||
|
uint32 fDocCopies;
|
||||||
|
float fStatusDelta;
|
||||||
|
float fDelta;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
+5
-4
@@ -32,10 +32,6 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
|
|
||||||
// Text to be displayed in About window, declared in the application
|
|
||||||
// that uses HWindow class!!!
|
|
||||||
extern const char* kAbout;
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
class HWindow : public BWindow
|
class HWindow : public BWindow
|
||||||
{
|
{
|
||||||
@@ -50,6 +46,7 @@ public:
|
|||||||
|
|
||||||
virtual void MessageReceived(BMessage* m);
|
virtual void MessageReceived(BMessage* m);
|
||||||
virtual void AboutRequested();
|
virtual void AboutRequested();
|
||||||
|
virtual const char* AboutText() const { return NULL; }
|
||||||
};
|
};
|
||||||
|
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
@@ -67,12 +64,16 @@ public:
|
|||||||
virtual status_t Go();
|
virtual status_t Go();
|
||||||
// Or quit window e.g. something went wrong in constructor
|
// Or quit window e.g. something went wrong in constructor
|
||||||
void Quit();
|
void Quit();
|
||||||
|
// Sets the result that is returned when the user closes the window.
|
||||||
|
// Default is B_OK.
|
||||||
|
void SetUserQuitResult(status_t result);
|
||||||
|
|
||||||
typedef HWindow inherited;
|
typedef HWindow inherited;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Init(const char* title);
|
void Init(const char* title);
|
||||||
|
|
||||||
|
status_t fUserQuitResult;
|
||||||
bool fReadyToQuit;
|
bool fReadyToQuit;
|
||||||
sem_id fExitSem;
|
sem_id fExitSem;
|
||||||
status_t* fResult;
|
status_t* fResult;
|
||||||
+3
-3
@@ -118,8 +118,8 @@ THE SOFTWARE.
|
|||||||
kUnitPoint, 1 point/point
|
kUnitPoint, 1 point/point
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MARGIN_VIEW_H
|
#ifndef _MARGIN_VIEW_H
|
||||||
#define MARGIN_VIEW_H
|
#define _MARGIN_VIEW_H
|
||||||
|
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
#include <Looper.h>
|
#include <Looper.h>
|
||||||
@@ -222,4 +222,4 @@ public:
|
|||||||
void MessageReceived(BMessage *msg);
|
void MessageReceived(BMessage *msg);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //MARGIN_VIEW_H
|
#endif // _MARGIN_VIEW_H
|
||||||
@@ -38,8 +38,6 @@ THE SOFTWARE.
|
|||||||
#include <MessageFilter.h>
|
#include <MessageFilter.h>
|
||||||
|
|
||||||
|
|
||||||
// adds fields to message or replaces existing fields (copy BeUtils.h)
|
|
||||||
void AddFields(BMessage* to, const BMessage* from, const char* excludeList[] = NULL, const char* includeList[] = NULL);
|
|
||||||
void AddString(BMessage* m, const char* name, const char* value);
|
void AddString(BMessage* m, const char* name, const char* value);
|
||||||
|
|
||||||
// set or replace a value in a BMessage
|
// set or replace a value in a BMessage
|
||||||
@@ -47,9 +45,6 @@ void SetRect(BMessage* msg, const char* name, BRect rect);
|
|||||||
void SetFloat(BMessage* msg, const char* name, float value);
|
void SetFloat(BMessage* msg, const char* name, float value);
|
||||||
void SetInt32(BMessage* msg, const char* name, int32 value);
|
void SetInt32(BMessage* msg, const char* name, int32 value);
|
||||||
|
|
||||||
// scalar multiplication
|
|
||||||
BRect ScaleRect(BRect rect, float scale);
|
|
||||||
|
|
||||||
class EscapeMessageFilter : public BMessageFilter
|
class EscapeMessageFilter : public BMessageFilter
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
@@ -134,30 +129,4 @@ void TList<T>::SortItems(int (*comp)(const T**, const T**)) {
|
|||||||
fList.SortItems(sort);
|
fList.SortItems(sort);
|
||||||
}
|
}
|
||||||
|
|
||||||
// PDF coordinate system
|
|
||||||
class PDFSystem {
|
|
||||||
private:
|
|
||||||
float fHeight;
|
|
||||||
float fX;
|
|
||||||
float fY;
|
|
||||||
float fScale;
|
|
||||||
|
|
||||||
public:
|
|
||||||
PDFSystem()
|
|
||||||
: fHeight(0), fX(0), fY(0), fScale(1) { }
|
|
||||||
PDFSystem(float h, float x, float y, float s)
|
|
||||||
: fHeight(h), fX(x), fY(y), fScale(s) { }
|
|
||||||
|
|
||||||
void SetHeight(float h) { fHeight = h; }
|
|
||||||
void SetOrigin(float x, float y) { fX = x; fY = y; }
|
|
||||||
void SetScale(float scale) { fScale = scale; }
|
|
||||||
float Height() const { return fHeight; }
|
|
||||||
BPoint Origin() const { return BPoint(fX, fY); }
|
|
||||||
float Scale() const { return fScale; }
|
|
||||||
|
|
||||||
inline float tx(float x) { return fX + fScale*x; }
|
|
||||||
inline float ty(float y) { return fHeight - (fY + fScale * y); }
|
|
||||||
inline float scale(float f) { return fScale * f; }
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons print drivers canon_lips lips3 ;
|
|||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
||||||
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
AddResources Canon\ LIPS3\ Compatible : Lips3.rdef ;
|
AddResources Canon\ LIPS3\ Compatible : Lips3.rdef ;
|
||||||
|
|
||||||
@@ -13,7 +14,11 @@ Addon Canon\ LIPS3\ Compatible : Print :
|
|||||||
Compress3.cpp
|
Compress3.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
LinkAgainst Canon\ LIPS3\ Compatible : be libprint.a $(TARGET_LIBSTDC++) ;
|
LinkAgainst Canon\ LIPS3\ Compatible :
|
||||||
|
be
|
||||||
|
libprint.a
|
||||||
|
libprintutils.a
|
||||||
|
$(TARGET_LIBSTDC++) ;
|
||||||
|
|
||||||
Package haiku-printingkit-cvs :
|
Package haiku-printingkit-cvs :
|
||||||
Canon\ LIPS3\ Compatible :
|
Canon\ LIPS3\ Compatible :
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons print drivers canon_lips lips4 ;
|
|||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
||||||
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
AddResources Canon\ LIPS4\ Compatible : Lips4.rdef ;
|
AddResources Canon\ LIPS4\ Compatible : Lips4.rdef ;
|
||||||
|
|
||||||
@@ -12,7 +13,11 @@ Addon Canon\ LIPS4\ Compatible : Print :
|
|||||||
Lips4Cap.cpp
|
Lips4Cap.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
LinkAgainst Canon\ LIPS4\ Compatible : be libprint.a $(TARGET_LIBSTDC++) ;
|
LinkAgainst Canon\ LIPS4\ Compatible :
|
||||||
|
be
|
||||||
|
libprint.a
|
||||||
|
libprintutils.a
|
||||||
|
$(TARGET_LIBSTDC++) ;
|
||||||
|
|
||||||
Package haiku-printingkit-cvs :
|
Package haiku-printingkit-cvs :
|
||||||
Canon\ LIPS4\ Compatible :
|
Canon\ LIPS4\ Compatible :
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons print drivers pcl5 ;
|
|||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
||||||
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
AddResources PCL5\ Compatible : PCL5.rsrc ;
|
AddResources PCL5\ Compatible : PCL5.rsrc ;
|
||||||
|
|
||||||
@@ -12,7 +13,11 @@ Addon PCL5\ Compatible : Print :
|
|||||||
PCL5Cap.cpp
|
PCL5Cap.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
LinkAgainst PCL5\ Compatible : be libprint.a $(TARGET_LIBSTDC++) ;
|
LinkAgainst PCL5\ Compatible :
|
||||||
|
be
|
||||||
|
libprint.a
|
||||||
|
libprintutils.a
|
||||||
|
$(TARGET_LIBSTDC++) ;
|
||||||
|
|
||||||
Package haiku-printingkit-cvs :
|
Package haiku-printingkit-cvs :
|
||||||
PCL5\ Compatible :
|
PCL5\ Compatible :
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons print drivers pcl6 ;
|
|||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
||||||
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
AddResources PCL6\ Compatible : PCL6.rsrc ;
|
AddResources PCL6\ Compatible : PCL6.rsrc ;
|
||||||
|
|
||||||
@@ -16,9 +17,11 @@ Addon PCL6\ Compatible : Print :
|
|||||||
Rasterizer.cpp
|
Rasterizer.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
ObjectC++Flags [ FGristFiles jetlib.o ] : -w ;
|
LinkAgainst PCL6\ Compatible :
|
||||||
|
be
|
||||||
LinkAgainst PCL6\ Compatible : be libprint.a $(TARGET_LIBSTDC++) ;
|
libprint.a
|
||||||
|
libprintutils.a
|
||||||
|
$(TARGET_LIBSTDC++) ;
|
||||||
|
|
||||||
Package haiku-printingkit-cvs :
|
Package haiku-printingkit-cvs :
|
||||||
PCL6\ Compatible :
|
PCL6\ Compatible :
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ bool PCL6Driver::nextBand(BBitmap *bitmap, BPoint *offset)
|
|||||||
int y = (int)offset->y;
|
int y = (int)offset->y;
|
||||||
|
|
||||||
PCL6Rasterizer *rasterizer;
|
PCL6Rasterizer *rasterizer;
|
||||||
if (getJobData()->getColor() == JobData::kColor) {
|
if (useColorMode()) {
|
||||||
#if COLOR_DEPTH == 8
|
#if COLOR_DEPTH == 8
|
||||||
rasterizer = new ColorRGBRasterizer(fHalftone);
|
rasterizer = new ColorRGBRasterizer(fHalftone);
|
||||||
#elif COLOR_DEPTH == 1
|
#elif COLOR_DEPTH == 1
|
||||||
@@ -179,11 +179,13 @@ void PCL6Driver::writeBitmap(const uchar* buffer, int outSize, int rowSize, int
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if ENABLE_RLE_COMPRESSION
|
#if ENABLE_RLE_COMPRESSION
|
||||||
|
if (supportsRLECompression()) {
|
||||||
int rleSize = pack_bits_size(buffer, outSize);
|
int rleSize = pack_bits_size(buffer, outSize);
|
||||||
if (rleSize < dataSize) {
|
if (rleSize < dataSize) {
|
||||||
compressionMethod = PCL6Writer::kRLECompression;
|
compressionMethod = PCL6Writer::kRLECompression;
|
||||||
dataSize = rleSize;
|
dataSize = rleSize;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// write bitmap
|
// write bitmap
|
||||||
@@ -246,9 +248,8 @@ bool PCL6Driver::startPage(int)
|
|||||||
// PageOrigin from Windows NT printer driver
|
// PageOrigin from Windows NT printer driver
|
||||||
int x = 142 * getJobData()->getXres() / 600;
|
int x = 142 * getJobData()->getXres() / 600;
|
||||||
int y = 100 * getJobData()->getYres() / 600;
|
int y = 100 * getJobData()->getYres() / 600;
|
||||||
bool color = getJobData()->getColor() == JobData::kColor;
|
|
||||||
fWriter->SetPageOrigin(x, y);
|
fWriter->SetPageOrigin(x, y);
|
||||||
fWriter->SetColorSpace(color ? PCL6Writer::kRGB : PCL6Writer::kGray);
|
fWriter->SetColorSpace(useColorMode() ? PCL6Writer::kRGB : PCL6Writer::kGray);
|
||||||
fWriter->SetPaintTxMode(PCL6Writer::kOpaque);
|
fWriter->SetPaintTxMode(PCL6Writer::kOpaque);
|
||||||
fWriter->SetSourceTxMode(PCL6Writer::kOpaque);
|
fWriter->SetSourceTxMode(PCL6Writer::kOpaque);
|
||||||
fWriter->SetROP(204);
|
fWriter->SetROP(204);
|
||||||
@@ -257,9 +258,8 @@ bool PCL6Driver::startPage(int)
|
|||||||
|
|
||||||
void PCL6Driver::startRasterGraphics(int x, int y, int width, int height, PCL6Writer::Compression compressionMethod)
|
void PCL6Driver::startRasterGraphics(int x, int y, int width, int height, PCL6Writer::Compression compressionMethod)
|
||||||
{
|
{
|
||||||
bool color = getJobData()->getColor() == JobData::kColor;
|
|
||||||
PCL6Writer::ColorDepth colorDepth;
|
PCL6Writer::ColorDepth colorDepth;
|
||||||
if (color) {
|
if (useColorMode()) {
|
||||||
#if COLOR_DEPTH == 8
|
#if COLOR_DEPTH == 8
|
||||||
colorDepth = PCL6Writer::k8Bit;
|
colorDepth = PCL6Writer::k8Bit;
|
||||||
#elif COLOR_DEPTH == 1
|
#elif COLOR_DEPTH == 1
|
||||||
@@ -351,10 +351,23 @@ void PCL6Driver::move(int x, int y)
|
|||||||
fWriter->SetCursor(x, y);
|
fWriter->SetCursor(x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
PCL6Driver::supportsRLECompression()
|
||||||
|
{
|
||||||
|
return getJobData()->getColor() != JobData::kColorCompressionDisabled;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
PCL6Driver::supportsDeltaRowCompression()
|
PCL6Driver::supportsDeltaRowCompression()
|
||||||
{
|
{
|
||||||
return getProtocolClass() >= PCL6Writer::kProtocolClass2_1;
|
return getProtocolClass() >= PCL6Writer::kProtocolClass2_1 &&
|
||||||
|
getJobData()->getColor() != JobData::kColorCompressionDisabled;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
PCL6Driver::useColorMode()
|
||||||
|
{
|
||||||
|
return getJobData()->getColor() != JobData::kMonochrome;
|
||||||
}
|
}
|
||||||
|
|
||||||
PCL6Writer::MediaSize PCL6Driver::mediaSize(JobData::Paper paper)
|
PCL6Writer::MediaSize PCL6Driver::mediaSize(JobData::Paper paper)
|
||||||
|
|||||||
@@ -29,7 +29,9 @@ protected:
|
|||||||
virtual bool endDoc(bool success);
|
virtual bool endDoc(bool success);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool supportsRLECompression();
|
||||||
bool supportsDeltaRowCompression();
|
bool supportsDeltaRowCompression();
|
||||||
|
bool useColorMode();
|
||||||
PCL6Writer::MediaSize mediaSize(JobData::Paper paper);
|
PCL6Writer::MediaSize mediaSize(JobData::Paper paper);
|
||||||
PCL6Writer::MediaSource mediaSource(JobData::PaperSource source);
|
PCL6Writer::MediaSource mediaSource(JobData::PaperSource source);
|
||||||
void move(int x, int y);
|
void move(int x, int y);
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* PCL6Cap.cpp
|
* PCL6Cap.cpp
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
||||||
* COpyright 2003-2005 Michael Pfeiffer.
|
* Copyright 2003-2007 Michael Pfeiffer.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PCL6Cap.h"
|
#include "PCL6Cap.h"
|
||||||
@@ -247,10 +247,12 @@ const ProtocolClassCap *protocolClasses[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const ColorCap color("Color", false, JobData::kColor);
|
const ColorCap color("Color", false, JobData::kColor);
|
||||||
|
const ColorCap colorCompressionDisabled("Color (No Compression)", false, JobData::kColorCompressionDisabled);
|
||||||
const ColorCap monochrome("Shades of Gray", true, JobData::kMonochrome);
|
const ColorCap monochrome("Shades of Gray", true, JobData::kMonochrome);
|
||||||
|
|
||||||
const ColorCap *colors[] = {
|
const ColorCap *colors[] = {
|
||||||
&color,
|
&color,
|
||||||
|
&colorCompressionDisabled,
|
||||||
&monochrome
|
&monochrome
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
// Run-Length-Encoding Compression
|
// Run-Length-Encoding Compression
|
||||||
#define ENABLE_RLE_COMPRESSION 1
|
#define ENABLE_RLE_COMPRESSION 1
|
||||||
|
//#define ENABLE_RLE_COMPRESSION 0
|
||||||
|
|
||||||
// Delta Row Compression
|
// Delta Row Compression
|
||||||
#define ENABLE_DELTA_ROW_COMPRESSION 1
|
#define ENABLE_DELTA_ROW_COMPRESSION 1
|
||||||
@@ -21,6 +22,7 @@
|
|||||||
// If 1 bit depth is used, the class Halftone is used for dithering
|
// If 1 bit depth is used, the class Halftone is used for dithering
|
||||||
// otherwise dithering is not performed.
|
// otherwise dithering is not performed.
|
||||||
#define COLOR_DEPTH 1
|
#define COLOR_DEPTH 1
|
||||||
|
//#define COLOR_DEPTH 8
|
||||||
|
|
||||||
#define DISPLAY_COMPRESSION_STATISTICS 0
|
#define DISPLAY_COMPRESSION_STATISTICS 0
|
||||||
|
|
||||||
|
|||||||
@@ -48,3 +48,4 @@ PrinterDriver* instantiate_printer_driver(BNode* printerFolder)
|
|||||||
{
|
{
|
||||||
return new PCL6PrinterDriver(printerFolder);
|
return new PCL6PrinterDriver(printerFolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
AboutText.cpp
|
||||||
|
|
||||||
|
Copyright (c) 2001-2006 Haiku.
|
||||||
|
|
||||||
|
Author:
|
||||||
|
Michael Pfeiffer
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <InterfaceDefs.h>
|
||||||
|
|
||||||
|
static const char*
|
||||||
|
kAbout =
|
||||||
|
"PDF Writer for BeOS\n"
|
||||||
|
B_UTF8_COPYRIGHT " 2001-2004 Haiku\n"
|
||||||
|
"\n"
|
||||||
|
"Philippe Houdoin\n"
|
||||||
|
"\tProject Leader\n\n"
|
||||||
|
"Simon Gauvin\n"
|
||||||
|
"\tGUI Design\n\n"
|
||||||
|
"Michael Pfeiffer\n"
|
||||||
|
"\tPDF Generation\n"
|
||||||
|
"\tConfiguration\n"
|
||||||
|
"\tInteractive Features\n"
|
||||||
|
"\t" B_UTF8_ELLIPSIS
|
||||||
|
;
|
||||||
@@ -1,291 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
InterfaceUtils.cpp
|
|
||||||
|
|
||||||
Copyright (c) 2002 OpenBeOS.
|
|
||||||
|
|
||||||
Author:
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "InterfaceUtils.h"
|
|
||||||
#include "Utils.h"
|
|
||||||
|
|
||||||
// Implementation of HWindow
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
HWindow::HWindow(BRect frame, const char *title, window_type type, uint32 flags, uint32 workspace, uint32 escape_msg)
|
|
||||||
: BWindow(frame, title, type, flags, workspace)
|
|
||||||
{
|
|
||||||
Init(escape_msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
HWindow::HWindow(BRect frame, const char *title, window_look look, window_feel feel, uint32 flags, uint32 workspace, uint32 escape_msg)
|
|
||||||
: BWindow(frame, title, look, feel, flags, workspace)
|
|
||||||
{
|
|
||||||
Init(escape_msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
void
|
|
||||||
HWindow::Init(uint32 escape_msg)
|
|
||||||
{
|
|
||||||
AddShortcut('i', 0, new BMessage(B_ABOUT_REQUESTED));
|
|
||||||
AddCommonFilter(new EscapeMessageFilter(this, escape_msg));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
void
|
|
||||||
HWindow::MessageReceived(BMessage* msg)
|
|
||||||
{
|
|
||||||
if (msg->what == B_ABOUT_REQUESTED) {
|
|
||||||
AboutRequested();
|
|
||||||
} else {
|
|
||||||
inherited::MessageReceived(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
static const char*
|
|
||||||
kAbout =
|
|
||||||
"PDF Writer for BeOS\n"
|
|
||||||
B_UTF8_COPYRIGHT " 2001-2004 Haiku\n"
|
|
||||||
"\n"
|
|
||||||
"Philippe Houdoin\n"
|
|
||||||
"\tProject Leader\n\n"
|
|
||||||
"Simon Gauvin\n"
|
|
||||||
"\tGUI Design\n\n"
|
|
||||||
"Michael Pfeiffer\n"
|
|
||||||
"\tPDF Generation\n"
|
|
||||||
"\tConfiguration\n"
|
|
||||||
"\tInteractive Features\n"
|
|
||||||
"\t" B_UTF8_ELLIPSIS
|
|
||||||
;
|
|
||||||
|
|
||||||
void
|
|
||||||
HWindow::AboutRequested()
|
|
||||||
{
|
|
||||||
BAlert *about = new BAlert("About PDF Writer", kAbout, "Cool");
|
|
||||||
BTextView *v = about->TextView();
|
|
||||||
if (v) {
|
|
||||||
// Colors grab with Magnify on BeOS R5 deskbar logo
|
|
||||||
rgb_color red = {203, 0, 51, 255};
|
|
||||||
rgb_color blue = {0, 51, 152, 255};
|
|
||||||
|
|
||||||
v->SetStylable(true);
|
|
||||||
char *text = (char*) v->Text();
|
|
||||||
char *s = text;
|
|
||||||
|
|
||||||
// set first line 16pt bold
|
|
||||||
s = strchr(text, '\n');
|
|
||||||
BFont font(be_bold_font);
|
|
||||||
font.SetSize(16); // font.SetFace(B_OUTLINED_FACE);
|
|
||||||
v->SetFontAndColor(0, s-text, &font);
|
|
||||||
|
|
||||||
// set all Be in blue and red
|
|
||||||
s = text;
|
|
||||||
while ((s = strstr(s, "BeOS")) != NULL) {
|
|
||||||
int32 i = s - text;
|
|
||||||
v->SetFontAndColor(i, i+2, NULL, 0, &blue);
|
|
||||||
v->SetFontAndColor(i+2, i+4, NULL, 0, &red);
|
|
||||||
s += 2;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
about->Go();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Impelementation of TextView
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
TextView::TextView(BRect frame,
|
|
||||||
const char *name,
|
|
||||||
BRect textRect,
|
|
||||||
uint32 rmask,
|
|
||||||
uint32 flags)
|
|
||||||
: BTextView(frame, name, textRect, rmask, flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
TextView::TextView(BRect frame,
|
|
||||||
const char *name,
|
|
||||||
BRect textRect,
|
|
||||||
const BFont *font, const rgb_color *color,
|
|
||||||
uint32 rmask,
|
|
||||||
uint32 flags)
|
|
||||||
: BTextView(frame, name, textRect, font, color, rmask, flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
void
|
|
||||||
TextView::KeyDown(const char *bytes, int32 numBytes)
|
|
||||||
{
|
|
||||||
if (numBytes == 1 && *bytes == B_TAB) {
|
|
||||||
BView::KeyDown(bytes, numBytes);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
inherited::KeyDown(bytes, numBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
void
|
|
||||||
TextView::Draw(BRect update)
|
|
||||||
{
|
|
||||||
inherited::Draw(update);
|
|
||||||
if (IsFocus()) {
|
|
||||||
// stroke focus rectangle
|
|
||||||
SetHighColor(ui_color(B_KEYBOARD_NAVIGATION_COLOR));
|
|
||||||
StrokeRect(Bounds());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
void
|
|
||||||
TextView::MakeFocus(bool focus)
|
|
||||||
{
|
|
||||||
Invalidate();
|
|
||||||
inherited::MakeFocus(focus);
|
|
||||||
// notify TextControl
|
|
||||||
BView* parent = Parent(); // BBox
|
|
||||||
if (focus && parent) {
|
|
||||||
parent = parent->Parent(); // TextControl
|
|
||||||
TextControl* control = dynamic_cast<TextControl*>(parent);
|
|
||||||
if (control) control->FocusSetTo(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Impelementation of TextControl
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
TextControl::TextControl(BRect frame,
|
|
||||||
const char *name,
|
|
||||||
const char *label,
|
|
||||||
const char *initial_text,
|
|
||||||
BMessage *message,
|
|
||||||
uint32 rmask,
|
|
||||||
uint32 flags)
|
|
||||||
: BView(frame, name, rmask, flags)
|
|
||||||
{
|
|
||||||
SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
|
||||||
BRect r(0, 0, frame.Width() / 2 -1, frame.Height());
|
|
||||||
fLabel = new BStringView(r, "", label);
|
|
||||||
BRect f(r);
|
|
||||||
f.OffsetTo(frame.Width() / 2 + 1, 0);
|
|
||||||
// box around TextView
|
|
||||||
BBox *box = new BBox(f, "", B_FOLLOW_LEFT | B_FOLLOW_TOP, B_WILL_DRAW);
|
|
||||||
f.OffsetTo(0, 0);
|
|
||||||
f.InsetBy(1,1);
|
|
||||||
r.InsetBy(2,2);
|
|
||||||
fText = new TextView(f, "", r, rmask, flags | B_NAVIGABLE);
|
|
||||||
fText->SetWordWrap(false);
|
|
||||||
fText->DisallowChar('\n');
|
|
||||||
fText->Insert(initial_text);
|
|
||||||
AddChild(fLabel);
|
|
||||||
AddChild(box);
|
|
||||||
box->AddChild(fText);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
void
|
|
||||||
TextControl::ConvertToParent(BView* parent, BView* child, BRect &rect)
|
|
||||||
{
|
|
||||||
do {
|
|
||||||
child->ConvertToParent(&rect);
|
|
||||||
child = child->Parent();
|
|
||||||
} while (child != NULL && child != parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
void
|
|
||||||
TextControl::FocusSetTo(BView *child)
|
|
||||||
{
|
|
||||||
BRect r;
|
|
||||||
BView* parent = Parent(); // Table
|
|
||||||
if (parent) {
|
|
||||||
ConvertToParent(parent, child, r);
|
|
||||||
parent->ScrollTo(0, r.top);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Impelementation of Implementation of Table
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
Table::Table(BRect frame, const char *name, uint32 rmode, uint32 flags)
|
|
||||||
: BView(frame, name, rmode, flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
void
|
|
||||||
Table::ScrollTo(BPoint p)
|
|
||||||
{
|
|
||||||
float h = Frame().Height()+1;
|
|
||||||
if (Parent()) {
|
|
||||||
BScrollView* scrollView = dynamic_cast<BScrollView*>(Parent());
|
|
||||||
if (scrollView) {
|
|
||||||
BScrollBar *sb = scrollView->ScrollBar(B_VERTICAL);
|
|
||||||
float min, max;
|
|
||||||
sb->GetRange(&min, &max);
|
|
||||||
if (p.y < (h/2)) p.y = 0;
|
|
||||||
else if (p.y > max) p.y = max;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
inherited::ScrollTo(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Impelementation of DragListView
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
DragListView::DragListView(BRect frame, const char *name,
|
|
||||||
list_view_type type,
|
|
||||||
uint32 resizingMode, uint32 flags)
|
|
||||||
: BListView(frame, name, type, resizingMode, flags)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
bool DragListView::InitiateDrag(BPoint point, int32 index, bool wasSelected)
|
|
||||||
{
|
|
||||||
BMessage m;
|
|
||||||
DragMessage(&m, ItemFrame(index), this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
InterfaceUtils.cpp
|
|
||||||
|
|
||||||
Copyright (c) 2002 OpenBeOS.
|
|
||||||
|
|
||||||
Author:
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _INTERFACE_UTILS_H
|
|
||||||
#define _INTERFACE_UTILS_H
|
|
||||||
|
|
||||||
#include <InterfaceKit.h>
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
class HWindow : public BWindow
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
void Init(uint32 escape_msg);
|
|
||||||
|
|
||||||
public:
|
|
||||||
typedef BWindow inherited;
|
|
||||||
|
|
||||||
HWindow(BRect frame, const char *title, window_type type, uint32 flags, uint32 workspace = B_CURRENT_WORKSPACE, uint32 escape_msg = B_QUIT_REQUESTED);
|
|
||||||
HWindow(BRect frame, const char *title, window_look look, window_feel feel, uint32 flags, uint32 workspace = B_CURRENT_WORKSPACE, uint32 escape_msg = B_QUIT_REQUESTED);
|
|
||||||
|
|
||||||
virtual void MessageReceived(BMessage* m);
|
|
||||||
virtual void AboutRequested();
|
|
||||||
};
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
class TextView : public BTextView
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef BTextView inherited;
|
|
||||||
|
|
||||||
TextView(BRect frame,
|
|
||||||
const char *name,
|
|
||||||
BRect textRect,
|
|
||||||
uint32 rmask = B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
|
||||||
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
|
|
||||||
|
|
||||||
TextView(BRect frame,
|
|
||||||
const char *name,
|
|
||||||
BRect textRect,
|
|
||||||
const BFont *font, const rgb_color *color,
|
|
||||||
uint32 rmask = B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
|
||||||
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
|
|
||||||
|
|
||||||
void KeyDown(const char *bytes, int32 numBytes);
|
|
||||||
void MakeFocus(bool focus = true);
|
|
||||||
void Draw(BRect r);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
class TextControl : public BView
|
|
||||||
{
|
|
||||||
BStringView *fLabel;
|
|
||||||
TextView *fText;
|
|
||||||
public:
|
|
||||||
TextControl(BRect frame,
|
|
||||||
const char *name,
|
|
||||||
const char *label,
|
|
||||||
const char *initial_text,
|
|
||||||
BMessage *message,
|
|
||||||
uint32 rmask = B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
|
||||||
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
|
|
||||||
const char *Label() { return fLabel->Text(); }
|
|
||||||
const char *Text() { return fText->Text(); }
|
|
||||||
void MakeFocus(bool focus = true) { fText->MakeFocus(focus); }
|
|
||||||
void ConvertToParent(BView* parent, BView* child, BRect &rect);
|
|
||||||
void FocusSetTo(BView* child);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
class Table : public BView
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef BView inherited;
|
|
||||||
|
|
||||||
Table(BRect frame, const char *name, uint32 rmode, uint32 flags);
|
|
||||||
void ScrollTo(BPoint p);
|
|
||||||
};
|
|
||||||
|
|
||||||
class DragListView : public BListView
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DragListView(BRect frame, const char *name,
|
|
||||||
list_view_type type = B_SINGLE_SELECTION_LIST,
|
|
||||||
uint32 resizingMode = B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
|
||||||
uint32 flags = B_WILL_DRAW | B_NAVIGABLE | B_FRAME_EVENTS);
|
|
||||||
bool InitiateDrag(BPoint point, int32 index, bool wasSelected);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -2,8 +2,7 @@ SubDir HAIKU_TOP src add-ons print drivers pdf source ;
|
|||||||
|
|
||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
UsePrivateHeaders interface print ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
SubDirHdrs [ FDirName $(HAIKU_TOP) src libs pdflib libs pdflib ] ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) src libs pdflib libs pdflib ] ;
|
||||||
|
|
||||||
AddResources PDF\ Writer :
|
AddResources PDF\ Writer :
|
||||||
@@ -11,6 +10,7 @@ AddResources PDF\ Writer :
|
|||||||
;
|
;
|
||||||
|
|
||||||
Addon PDF\ Writer : Print :
|
Addon PDF\ Writer : Print :
|
||||||
|
AboutText.cpp
|
||||||
AdvancedSettingsWindow.cpp
|
AdvancedSettingsWindow.cpp
|
||||||
Bezier.cpp
|
Bezier.cpp
|
||||||
Bookmark.cpp
|
Bookmark.cpp
|
||||||
@@ -22,7 +22,6 @@ Addon PDF\ Writer : Print :
|
|||||||
FontsWindow.cpp
|
FontsWindow.cpp
|
||||||
Image.cpp
|
Image.cpp
|
||||||
ImageCache.cpp
|
ImageCache.cpp
|
||||||
InterfaceUtils.cpp
|
|
||||||
JobSetupWindow.cpp
|
JobSetupWindow.cpp
|
||||||
LinePathBuilder.cpp
|
LinePathBuilder.cpp
|
||||||
Link.cpp
|
Link.cpp
|
||||||
@@ -42,7 +41,6 @@ Addon PDF\ Writer : Print :
|
|||||||
Scanner.cpp
|
Scanner.cpp
|
||||||
StatusWindow.cpp
|
StatusWindow.cpp
|
||||||
SubPath.cpp
|
SubPath.cpp
|
||||||
Utils.cpp
|
|
||||||
XReferences.cpp
|
XReferences.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
@@ -51,7 +49,7 @@ LinkAgainst PDF\ Writer :
|
|||||||
textencoding
|
textencoding
|
||||||
translation
|
translation
|
||||||
libpdf.a
|
libpdf.a
|
||||||
libprint.a
|
libprintutils.a
|
||||||
;
|
;
|
||||||
|
|
||||||
Package haiku-pdf_writer-cvs :
|
Package haiku-pdf_writer-cvs :
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ THE SOFTWARE.
|
|||||||
#include <SupportKit.h>
|
#include <SupportKit.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "BeUtils.h"
|
||||||
|
|
||||||
#include "PrinterDriver.h"
|
#include "PrinterDriver.h"
|
||||||
#include "JobSetupWindow.h"
|
#include "JobSetupWindow.h"
|
||||||
#include "DocInfoWindow.h"
|
#include "DocInfoWindow.h"
|
||||||
@@ -89,7 +91,7 @@ JobSetupWindow::JobSetupWindow(BMessage *msg, const char * printerName)
|
|||||||
doc_info.AddString("Keywords", "");
|
doc_info.AddString("Keywords", "");
|
||||||
fSetupMsg->AddMessage("doc_info", &doc_info);
|
fSetupMsg->AddMessage("doc_info", &doc_info);
|
||||||
}
|
}
|
||||||
AddFields(&fDocInfo, fSetupMsg, true, NULL, includeKeys);
|
AddFields(&fDocInfo, fSetupMsg, NULL, includeKeys);
|
||||||
|
|
||||||
allPages = firstPage == 1 && lastPage == MAX_INT32;
|
allPages = firstPage == 1 && lastPage == MAX_INT32;
|
||||||
|
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ THE SOFTWARE.
|
|||||||
#include "Link.h"
|
#include "Link.h"
|
||||||
#include "XReferences.h"
|
#include "XReferences.h"
|
||||||
#include "Bookmark.h"
|
#include "Bookmark.h"
|
||||||
|
#include "PDFSystem.h"
|
||||||
#include "PDFWriter.h"
|
#include "PDFWriter.h"
|
||||||
#include "Log.h"
|
#include "Log.h"
|
||||||
#include "Report.h"
|
#include "Report.h"
|
||||||
|
|||||||
@@ -34,7 +34,9 @@ THE SOFTWARE.
|
|||||||
#include <Font.h>
|
#include <Font.h>
|
||||||
#include <Point.h>
|
#include <Point.h>
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
#include "PDFSystem.h"
|
||||||
|
|
||||||
|
class PDFSystem;
|
||||||
class PDFWriter;
|
class PDFWriter;
|
||||||
|
|
||||||
class TextLine;
|
class TextLine;
|
||||||
|
|||||||
+3
-95
@@ -3,6 +3,7 @@
|
|||||||
PDF Writer printer driver.
|
PDF Writer printer driver.
|
||||||
|
|
||||||
Copyright (c) 2001-2003 OpenBeOS.
|
Copyright (c) 2001-2003 OpenBeOS.
|
||||||
|
Copyright (c) 2006 Haiku.
|
||||||
|
|
||||||
Authors:
|
Authors:
|
||||||
Philippe Houdoin
|
Philippe Houdoin
|
||||||
@@ -29,101 +30,8 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _UTILS_H
|
#ifndef _PDF_SYSTEM_H
|
||||||
#define _UTILS_H
|
#define _PDF_SYSTEM_H
|
||||||
|
|
||||||
#include <Window.h>
|
|
||||||
#include <Message.h>
|
|
||||||
#include <MessageFilter.h>
|
|
||||||
|
|
||||||
|
|
||||||
// adds fields to message or replaces existing fields (copy BeUtils.h)
|
|
||||||
void AddFields(BMessage* to, const BMessage* from, bool overwrite = true, const char* excludeList[] = NULL, const char* includeList[] = NULL);
|
|
||||||
void AddString(BMessage* m, const char* name, const char* value);
|
|
||||||
|
|
||||||
class EscapeMessageFilter : public BMessageFilter
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
BWindow *fWindow;
|
|
||||||
int32 fWhat;
|
|
||||||
|
|
||||||
public:
|
|
||||||
EscapeMessageFilter(BWindow *window, int32 what);
|
|
||||||
filter_result Filter(BMessage *msg, BHandler **target);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
#define BEGINS_CHAR(byte) ((byte & 0xc0) != 0x80)
|
|
||||||
|
|
||||||
|
|
||||||
template <class T>
|
|
||||||
class TList {
|
|
||||||
private:
|
|
||||||
BList fList;
|
|
||||||
typedef int (*sort_func)(const void*, const void*);
|
|
||||||
|
|
||||||
public:
|
|
||||||
virtual ~TList();
|
|
||||||
void MakeEmpty();
|
|
||||||
int32 CountItems() const;
|
|
||||||
T* ItemAt(int32 index) const;
|
|
||||||
void AddItem(T* p);
|
|
||||||
T* RemoveItem(int i);
|
|
||||||
T* Items();
|
|
||||||
void SortItems(int (*comp)(const T**, const T**));
|
|
||||||
};
|
|
||||||
|
|
||||||
// TList
|
|
||||||
template<class T>
|
|
||||||
TList<T>::~TList() {
|
|
||||||
MakeEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
void TList<T>::MakeEmpty() {
|
|
||||||
const int32 n = CountItems();
|
|
||||||
for (int i = 0; i < n; i++) {
|
|
||||||
delete ItemAt(i);
|
|
||||||
}
|
|
||||||
fList.MakeEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
int32 TList<T>::CountItems() const {
|
|
||||||
return fList.CountItems();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
T* TList<T>::ItemAt(int32 index) const {
|
|
||||||
return (T*)fList.ItemAt(index);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
void TList<T>::AddItem(T* p) {
|
|
||||||
fList.AddItem(p);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
T* TList<T>::RemoveItem(int i) {
|
|
||||||
return (T*)fList.RemoveItem(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
T* TList<T>::Items() {
|
|
||||||
return (T*)fList.Items();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
void TList<T>::SortItems(int (*comp)(const T**, const T**)) {
|
|
||||||
sort_func sort = (sort_func)comp;
|
|
||||||
fList.SortItems(sort);
|
|
||||||
}
|
|
||||||
|
|
||||||
// PDF coordinate system
|
// PDF coordinate system
|
||||||
class PDFSystem {
|
class PDFSystem {
|
||||||
@@ -46,6 +46,7 @@ THE SOFTWARE.
|
|||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include "Link.h"
|
#include "Link.h"
|
||||||
#include "ImageCache.h"
|
#include "ImageCache.h"
|
||||||
|
#include "PDFSystem.h"
|
||||||
|
|
||||||
#include "pdflib.h"
|
#include "pdflib.h"
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ PrinterDriver::PrintJob
|
|||||||
Report::Instance();
|
Report::Instance();
|
||||||
|
|
||||||
// show status window
|
// show status window
|
||||||
fStatusWindow = new StatusWindow(passes, pfh.page_count, this);
|
StatusWindow* statusWindow = new StatusWindow(passes, pfh.page_count, this);
|
||||||
|
|
||||||
status = BeginJob();
|
status = BeginJob();
|
||||||
|
|
||||||
@@ -146,7 +146,7 @@ PrinterDriver::PrintJob
|
|||||||
for (copy = 0; copy < copies && status == B_OK && fPrinting; copy++)
|
for (copy = 0; copy < copies && status == B_OK && fPrinting; copy++)
|
||||||
{
|
{
|
||||||
for (page = 1; page <= pfh.page_count && status == B_OK && fPrinting; page++) {
|
for (page = 1; page <= pfh.page_count && status == B_OK && fPrinting; page++) {
|
||||||
fStatusWindow->PostMessage(new BMessage('page'));
|
statusWindow->NextPage();
|
||||||
status = PrintPage(page, pfh.page_count);
|
status = PrintPage(page, pfh.page_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,10 +163,10 @@ PrinterDriver::PrintJob
|
|||||||
|
|
||||||
// close status window
|
// close status window
|
||||||
if (Report::Instance()->CountItems() != 0) {
|
if (Report::Instance()->CountItems() != 0) {
|
||||||
fStatusWindow->WaitForClose();
|
statusWindow->WaitForClose();
|
||||||
}
|
}
|
||||||
if (fStatusWindow->Lock()) {
|
if (statusWindow->Lock()) {
|
||||||
fStatusWindow->Quit();
|
statusWindow->Quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
// delete Report object
|
// delete Report object
|
||||||
|
|||||||
@@ -29,8 +29,8 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PRINTERDRIVER_H
|
#ifndef _PRINTER_DRIVER_H
|
||||||
#define PRINTERDRIVER_H
|
#define _PRINTER_DRIVER_H
|
||||||
|
|
||||||
#include <AppKit.h>
|
#include <AppKit.h>
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
@@ -50,8 +50,6 @@ extern "C" {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class StatusWindow;
|
|
||||||
|
|
||||||
// close StatusWindow after pdf generation
|
// close StatusWindow after pdf generation
|
||||||
enum CloseOption {
|
enum CloseOption {
|
||||||
kAlways,
|
kAlways,
|
||||||
@@ -90,7 +88,6 @@ public:
|
|||||||
inline BNode *PrinterNode() { return fPrinterNode; }
|
inline BNode *PrinterNode() { return fPrinterNode; }
|
||||||
inline BMessage *JobMsg() { return fJobMsg; }
|
inline BMessage *JobMsg() { return fJobMsg; }
|
||||||
inline BDataIO *Transport() { return fPrintTransport.GetDataIO(); }
|
inline BDataIO *Transport() { return fPrintTransport.GetDataIO(); }
|
||||||
inline StatusWindow *Status() { return fStatusWindow; }
|
|
||||||
inline int32 Pass() const { return fPass; }
|
inline int32 Pass() const { return fPass; }
|
||||||
|
|
||||||
// publics status code
|
// publics status code
|
||||||
@@ -104,7 +101,6 @@ private:
|
|||||||
BFile *fJobFile;
|
BFile *fJobFile;
|
||||||
BNode *fPrinterNode;
|
BNode *fPrinterNode;
|
||||||
BMessage *fJobMsg;
|
BMessage *fJobMsg;
|
||||||
StatusWindow *fStatusWindow;
|
|
||||||
|
|
||||||
volatile Orientation fOrientation;
|
volatile Orientation fOrientation;
|
||||||
|
|
||||||
@@ -115,4 +111,4 @@ private:
|
|||||||
PrintTransport fPrintTransport;
|
PrintTransport fPrintTransport;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // #ifndef PRINTERDRIVER_H
|
#endif // _PRINTER_DRIVER_H
|
||||||
|
|||||||
@@ -29,14 +29,13 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PRINTER_SETTINGS_H
|
|
||||||
#include "PrinterSettings.h"
|
#include "PrinterSettings.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <fs_attr.h>
|
#include <fs_attr.h>
|
||||||
|
|
||||||
|
#include "BeUtils.h"
|
||||||
|
|
||||||
#include "PrinterPrefs.h"
|
#include "PrinterPrefs.h"
|
||||||
#include "Utils.h"
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor
|
* Constructor
|
||||||
@@ -283,7 +282,7 @@ PrinterSettings::Read(BNode* node, BMessage* msg, Kind kind)
|
|||||||
// if there were none, then create a default set...
|
// if there were none, then create a default set...
|
||||||
ps.GetDefaults(&settings);
|
ps.GetDefaults(&settings);
|
||||||
}
|
}
|
||||||
AddFields(msg, &settings, false);
|
AddFields(msg, &settings, NULL, NULL, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
@@ -34,19 +34,20 @@ THE SOFTWARE.
|
|||||||
#include <Message.h>
|
#include <Message.h>
|
||||||
#include <Box.h>
|
#include <Box.h>
|
||||||
|
|
||||||
|
static const uint32 kCancelMsg = 'cncl';
|
||||||
|
static const uint32 kProgressMsg = 'prgs';
|
||||||
|
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
StatusWindow::StatusWindow(int32 passes, int32 pages, PrinterDriver *pd)
|
StatusWindow::StatusWindow(int32 passes, int32 pages, PrinterDriver *pd)
|
||||||
: HWindow(BRect(100, 100, 700, 600/*400, 185*/), "PDF Writer",
|
: HWindow(BRect(100, 100, 700, 600), "PDF Writer",
|
||||||
B_TITLED_WINDOW,
|
B_TITLED_WINDOW,
|
||||||
B_NOT_RESIZABLE|B_NOT_ZOOMABLE|B_NOT_CLOSABLE|B_FRAME_EVENTS,
|
B_NOT_RESIZABLE|B_NOT_ZOOMABLE|B_NOT_CLOSABLE|B_FRAME_EVENTS,
|
||||||
B_CURRENT_WORKSPACE, 'cncl')
|
B_CURRENT_WORKSPACE, kCancelMsg)
|
||||||
{
|
{
|
||||||
fPass = 0;
|
fPass = 0;
|
||||||
fPages = pages;
|
fPages = pages;
|
||||||
fPrinterDriver = pd;
|
fPrinterDriver = pd;
|
||||||
fPageCount = 0;
|
fPageCount = 0;
|
||||||
// fPopyCount = 0;
|
|
||||||
fReportIndex = 0;
|
fReportIndex = 0;
|
||||||
fCloseSem = -1;
|
fCloseSem = -1;
|
||||||
int32 closeOption;
|
int32 closeOption;
|
||||||
@@ -61,21 +62,7 @@ StatusWindow::StatusWindow(int32 passes, int32 pages, PrinterDriver *pd)
|
|||||||
B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE_JUMP,
|
B_WILL_DRAW | B_FRAME_EVENTS | B_NAVIGABLE_JUMP,
|
||||||
B_PLAIN_BORDER);
|
B_PLAIN_BORDER);
|
||||||
AddChild(fPanel);
|
AddChild(fPanel);
|
||||||
/*
|
|
||||||
if (fCopies > 1) {
|
|
||||||
pages *= fCopies;
|
|
||||||
}
|
|
||||||
|
|
||||||
r.Set(10, 0, Frame().Width(), 50);
|
|
||||||
copyLabel = new BStringView(r, "copy_text", "Copy");
|
|
||||||
panel->AddChild(copyLabel);
|
|
||||||
|
|
||||||
r.Set(10, 55, Frame().Width()-20, 65);
|
|
||||||
copyStatus = new BStatusBar(r, "copyStatus");
|
|
||||||
copyStatus->SetMaxValue(copies);
|
|
||||||
copyStatus->SetBarHeight(12);
|
|
||||||
panel->AddChild(copyStatus);
|
|
||||||
*/
|
|
||||||
r.Set(10, 12, Frame().Width()-5, 22);
|
r.Set(10, 12, Frame().Width()-5, 22);
|
||||||
fPageLabel = new BStringView(r, "page_text", "Page", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP);
|
fPageLabel = new BStringView(r, "page_text", "Page", B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP);
|
||||||
fPanel->AddChild(fPageLabel);
|
fPanel->AddChild(fPageLabel);
|
||||||
@@ -86,17 +73,11 @@ StatusWindow::StatusWindow(int32 passes, int32 pages, PrinterDriver *pd)
|
|||||||
fPageStatus->SetBarHeight(12);
|
fPageStatus->SetBarHeight(12);
|
||||||
fPanel->AddChild(fPageStatus);
|
fPanel->AddChild(fPageStatus);
|
||||||
|
|
||||||
// Cancel button
|
|
||||||
// add a separator line...
|
|
||||||
// BBox *line = new BBox(BRect(r.left, 50, r.right, 51), NULL,
|
|
||||||
// B_FOLLOW_LEFT_RIGHT | B_FOLLOW_TOP );
|
|
||||||
// panel->AddChild(line);
|
|
||||||
|
|
||||||
// add a "Cancel" button
|
// add a "Cancel" button
|
||||||
int32 x = 110;
|
int32 x = 110;
|
||||||
int32 y = 55;
|
int32 y = 55;
|
||||||
fCancel = new BButton(BRect(x, y, x + 100, y + 20), NULL, "Cancel",
|
fCancel = new BButton(BRect(x, y, x + 100, y + 20), NULL, "Cancel",
|
||||||
new BMessage('cncl'), B_FOLLOW_NONE, B_WILL_DRAW | B_FRAME_EVENTS);
|
new BMessage(kCancelMsg), B_FOLLOW_NONE, B_WILL_DRAW | B_FRAME_EVENTS);
|
||||||
fCancel->ResizeToPreferred();
|
fCancel->ResizeToPreferred();
|
||||||
fPanel->AddChild(fCancel);
|
fPanel->AddChild(fCancel);
|
||||||
|
|
||||||
@@ -107,7 +88,6 @@ StatusWindow::StatusWindow(int32 passes, int32 pages, PrinterDriver *pd)
|
|||||||
fReport->SetStylable(true);
|
fReport->SetStylable(true);
|
||||||
fReport->MakeEditable(false);
|
fReport->MakeEditable(false);
|
||||||
fPanel->AddChild(new BScrollView("", fReport, B_FOLLOW_ALL, 0, false, true));
|
fPanel->AddChild(new BScrollView("", fReport, B_FOLLOW_ALL, 0, false, true));
|
||||||
// fPanel->AddChild(fReport);
|
|
||||||
|
|
||||||
ResizeTo(300, 85);
|
ResizeTo(300, 85);
|
||||||
|
|
||||||
@@ -119,15 +99,7 @@ void
|
|||||||
StatusWindow::MessageReceived(BMessage *msg)
|
StatusWindow::MessageReceived(BMessage *msg)
|
||||||
{
|
{
|
||||||
switch (msg->what) {
|
switch (msg->what) {
|
||||||
/*
|
case kCancelMsg:
|
||||||
case 'copy':
|
|
||||||
copy = "";
|
|
||||||
copy << "Copy: " << ++copyCount;
|
|
||||||
copyLabel->SetText(copy.String());
|
|
||||||
copyStatus->Update(1);
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case 'cncl':
|
|
||||||
if (fCloseSem == -1) {
|
if (fCloseSem == -1) {
|
||||||
fPrinterDriver->StopPrinting();
|
fPrinterDriver->StopPrinting();
|
||||||
fCancel->SetEnabled(false);
|
fCancel->SetEnabled(false);
|
||||||
@@ -136,7 +108,8 @@ StatusWindow::MessageReceived(BMessage *msg)
|
|||||||
release_sem(fCloseSem);
|
release_sem(fCloseSem);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'page':
|
|
||||||
|
case kProgressMsg:
|
||||||
fPage = "";
|
fPage = "";
|
||||||
if (fPass == 0)
|
if (fPass == 0)
|
||||||
fPage << "Collecting Patterns Page: " << fPageCount;
|
fPage << "Collecting Patterns Page: " << fPageCount;
|
||||||
@@ -200,7 +173,13 @@ void StatusWindow::UpdateReport() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void StatusWindow::WaitForClose() {
|
void
|
||||||
|
StatusWindow::NextPage() {
|
||||||
|
PostMessage(kProgressMsg);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StatusWindow::WaitForClose() {
|
||||||
fCloseSem = create_sem(0, "close_sem");
|
fCloseSem = create_sem(0, "close_sem");
|
||||||
|
|
||||||
Lock();
|
Lock();
|
||||||
@@ -220,7 +199,7 @@ void StatusWindow::WaitForClose() {
|
|||||||
fCloseOption == kNoErrors && !hasErrors ||
|
fCloseOption == kNoErrors && !hasErrors ||
|
||||||
fCloseOption == kNoErrorsOrWarnings && !hasErrorsOrWarnings ||
|
fCloseOption == kNoErrorsOrWarnings && !hasErrorsOrWarnings ||
|
||||||
fCloseOption == kNoErrorsWarningsOrInfo && !hasErrorsWarningsOrInfo) {
|
fCloseOption == kNoErrorsWarningsOrInfo && !hasErrorsWarningsOrInfo) {
|
||||||
PostMessage('cncl');
|
PostMessage(kCancelMsg);
|
||||||
}
|
}
|
||||||
Unlock();
|
Unlock();
|
||||||
|
|
||||||
|
|||||||
@@ -44,14 +44,11 @@ class StatusWindow : public HWindow
|
|||||||
private:
|
private:
|
||||||
int32 fPass;
|
int32 fPass;
|
||||||
int32 fPages;
|
int32 fPages;
|
||||||
// BString fCopy;
|
|
||||||
BString fPage;
|
BString fPage;
|
||||||
int32 fPageCount;
|
int32 fPageCount;
|
||||||
// int fCopyCount;
|
|
||||||
// BStringView *fCopyLabel;
|
|
||||||
BStringView *fPageLabel;
|
BStringView *fPageLabel;
|
||||||
BStatusBar *fPageStatus;
|
BStatusBar *fPageStatus;
|
||||||
// BStatusBar *fCopyStatus;
|
|
||||||
BButton *fCancel;
|
BButton *fCancel;
|
||||||
PrinterDriver *fPrinterDriver;
|
PrinterDriver *fPrinterDriver;
|
||||||
int32 fReportIndex;
|
int32 fReportIndex;
|
||||||
@@ -60,12 +57,14 @@ private:
|
|||||||
CloseOption fCloseOption;
|
CloseOption fCloseOption;
|
||||||
|
|
||||||
void UpdateReport();
|
void UpdateReport();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef HWindow inherited;
|
typedef HWindow inherited;
|
||||||
|
|
||||||
StatusWindow(int32 passes, int32 pages, PrinterDriver *pd);
|
StatusWindow(int32 passes, int32 pages, PrinterDriver *pd);
|
||||||
|
|
||||||
void MessageReceived(BMessage *msg);
|
void MessageReceived(BMessage *msg);
|
||||||
|
void NextPage();
|
||||||
void WaitForClose();
|
void WaitForClose();
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -1,110 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
PDF Writer printer driver.
|
|
||||||
|
|
||||||
Copyright (c) 2001-2003 OpenBeOS.
|
|
||||||
|
|
||||||
Authors:
|
|
||||||
Philippe Houdoin
|
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "Utils.h"
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
EscapeMessageFilter::EscapeMessageFilter(BWindow *window, int32 what)
|
|
||||||
: BMessageFilter(B_ANY_DELIVERY, B_ANY_SOURCE, '_KYD')
|
|
||||||
, fWindow(window),
|
|
||||||
fWhat(what)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
filter_result
|
|
||||||
EscapeMessageFilter::Filter(BMessage *msg, BHandler **target)
|
|
||||||
{
|
|
||||||
int32 key;
|
|
||||||
// notify window with message fWhat if Escape key is hit
|
|
||||||
if (B_OK == msg->FindInt32("key", &key) && key == 1) {
|
|
||||||
fWindow->PostMessage(fWhat);
|
|
||||||
return B_SKIP_MESSAGE;
|
|
||||||
}
|
|
||||||
return B_DISPATCH_MESSAGE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
// copied from BeUtils.cpp
|
|
||||||
static bool InList(const char* list[], const char* name) {
|
|
||||||
for (int i = 0; list[i] != NULL; i ++) {
|
|
||||||
if (strcmp(list[i], name) == 0) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
// copied from BeUtils.cpp
|
|
||||||
void AddFields(BMessage* to, const BMessage* from, bool overwrite, const char* excludeList[], const char* includeList[]) {
|
|
||||||
if (to == from) return;
|
|
||||||
char* name;
|
|
||||||
type_code type;
|
|
||||||
int32 count;
|
|
||||||
for (int32 i = 0; from->GetInfo(B_ANY_TYPE, i, &name, &type, &count) == B_OK; i ++) {
|
|
||||||
const void* data;
|
|
||||||
ssize_t size;
|
|
||||||
if (excludeList && InList(excludeList, name)) continue;
|
|
||||||
if (includeList && !InList(includeList, name)) continue;
|
|
||||||
|
|
||||||
if (!overwrite && to->FindData(name, type, 0, &data, &size) == B_OK) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// replace existing data
|
|
||||||
to->RemoveName(name);
|
|
||||||
|
|
||||||
for (int32 j = 0; j < count; j ++) {
|
|
||||||
if (from->FindData(name, type, j, &data, &size) == B_OK) {
|
|
||||||
// WTF why works AddData not for B_STRING_TYPE in R5.0.3?
|
|
||||||
if (type == B_STRING_TYPE) {
|
|
||||||
to->AddString(name, (const char*)data);
|
|
||||||
} else if (type == B_MESSAGE_TYPE) {
|
|
||||||
BMessage m;
|
|
||||||
from->FindMessage(name, j, &m);
|
|
||||||
to->AddMessage(name, &m);
|
|
||||||
} else {
|
|
||||||
to->AddData(name, type, data, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddString(BMessage* m, const char* name, const char* value) {
|
|
||||||
if (m->HasString(name, 0)) {
|
|
||||||
m->ReplaceString(name, value);
|
|
||||||
} else {
|
|
||||||
m->AddString(name, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -3,6 +3,7 @@ SubDir HAIKU_TOP src add-ons print drivers postscript ;
|
|||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
||||||
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
AddResources PS\ Compatible : PS.rsrc ;
|
AddResources PS\ Compatible : PS.rsrc ;
|
||||||
|
|
||||||
@@ -12,7 +13,11 @@ Addon PS\ Compatible : Print :
|
|||||||
PSCap.cpp
|
PSCap.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
LinkAgainst PS\ Compatible : be libprint.a $(TARGET_LIBSTDC++) ;
|
LinkAgainst PS\ Compatible :
|
||||||
|
be
|
||||||
|
libprint.a
|
||||||
|
libprintutils.a
|
||||||
|
$(TARGET_LIBSTDC++) ;
|
||||||
|
|
||||||
Package haiku-printingkit-cvs :
|
Package haiku-printingkit-cvs :
|
||||||
PS\ Compatible :
|
PS\ Compatible :
|
||||||
|
|||||||
@@ -1,32 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2001-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2001 OpenBeOS.
|
* Authors:
|
||||||
|
* Philippe Houdoin
|
||||||
Authors:
|
* Simon Gauvin
|
||||||
Philippe Houdoin
|
* Michael Pfeiffer
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2002-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2002 OpenBeOS.
|
* Authors:
|
||||||
|
* Philippe Houdoin
|
||||||
Authors:
|
* Simon Gauvin
|
||||||
Philippe Houdoin
|
* Michael Pfeiffer
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <AppKit.h>
|
#include <AppKit.h>
|
||||||
|
|||||||
@@ -2,24 +2,27 @@ SubDir HAIKU_TOP src add-ons print drivers preview ;
|
|||||||
|
|
||||||
SetSubDirSupportedPlatformsBeOSCompatible ;
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
UsePrivateHeaders interface print ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print ] ;
|
||||||
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
|
UsePrivateHeaders interface ;
|
||||||
|
|
||||||
AddResources Preview : Preview.rsrc ;
|
AddResources Preview : Preview.rsrc ;
|
||||||
|
|
||||||
Addon Preview : Print :
|
Addon Preview : Print :
|
||||||
Utils.cpp
|
|
||||||
InterfaceUtils.cpp
|
|
||||||
MarginView.cpp
|
|
||||||
PrinterSetupWindow.cpp
|
PrinterSetupWindow.cpp
|
||||||
PageSetupWindow.cpp
|
PageSetupWindow.cpp
|
||||||
JobSetupWindow.cpp
|
JobSetupWindow.cpp
|
||||||
Driver.cpp
|
Driver.cpp
|
||||||
PrinterDriver.cpp
|
|
||||||
Preview.cpp
|
Preview.cpp
|
||||||
|
PrinterDriver.cpp
|
||||||
PreviewDriver.cpp
|
PreviewDriver.cpp
|
||||||
;
|
;
|
||||||
|
|
||||||
LinkAgainst Preview : be root libprint.a ;
|
LinkAgainst Preview :
|
||||||
|
be
|
||||||
|
root
|
||||||
|
libprintutils.a ;
|
||||||
|
|
||||||
Package haiku-printingkit-cvs :
|
Package haiku-printingkit-cvs :
|
||||||
Preview :
|
Preview :
|
||||||
|
|||||||
@@ -1,32 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2003-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2003 OpenBeOS.
|
* Authors:
|
||||||
|
* Philippe Houdoin
|
||||||
Authors:
|
* Simon Gauvin
|
||||||
Philippe Houdoin
|
* Michael Pfeiffer
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
|
|||||||
@@ -1,32 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2003-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2003 OpenBeOS.
|
* Authors:
|
||||||
|
* Philippe Houdoin
|
||||||
Authors:
|
* Simon Gauvin
|
||||||
Philippe Houdoin
|
* Michael Pfeiffer
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef JOBSETUPWINDOW_H
|
#ifndef JOBSETUPWINDOW_H
|
||||||
|
|||||||
@@ -1,709 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
MarginView.cpp
|
|
||||||
|
|
||||||
Copyright (c) 2002 OpenBeOS.
|
|
||||||
|
|
||||||
Authors:
|
|
||||||
Philippe Houdoin
|
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
Todo:
|
|
||||||
|
|
||||||
2 Make Strings constants or UI resources
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MARGIN_VIEW_H
|
|
||||||
#include "MarginView.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <AppKit.h>
|
|
||||||
#include <SupportKit.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
/*----------------- MarginView Private Constants --------------------*/
|
|
||||||
|
|
||||||
const int Y_OFFSET = 20;
|
|
||||||
const int X_OFFSET = 10;
|
|
||||||
const int STRING_SIZE = 50;
|
|
||||||
const int _WIDTH = 50;
|
|
||||||
const int NUM_COUNT = 10;
|
|
||||||
|
|
||||||
const static float _pointUnits = 1; // 1 point = 1 point
|
|
||||||
const static float _inchUnits = 72; // 1" = 72 points
|
|
||||||
const static float _cmUnits = 28.346; // 72/2.54 1cm = 28.346 points
|
|
||||||
|
|
||||||
const static float _minFieldWidth = 100; // pixels
|
|
||||||
const static float _minUnitHeight = 30; // pixels
|
|
||||||
const static float _drawInset = 10; // pixels
|
|
||||||
|
|
||||||
const static float unitFormat[] = { _inchUnits, _cmUnits, _pointUnits };
|
|
||||||
const static char *unitNames[] = { "Inch", "cm", "Points", NULL };
|
|
||||||
const static uint32 unitMsg[] = { MarginView::UNIT_INCH,
|
|
||||||
MarginView::UNIT_CM,
|
|
||||||
MarginView::UNIT_POINT };
|
|
||||||
|
|
||||||
const pattern dots = {{ 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55 }};
|
|
||||||
|
|
||||||
const rgb_color black = { 0,0,0,0 };
|
|
||||||
const rgb_color red = { 255,0,0,0 };
|
|
||||||
const rgb_color white = { 255,255,255,0 };
|
|
||||||
const rgb_color gray = { 220,220,220,0 };
|
|
||||||
|
|
||||||
/*----------------- MarginView Public Methods --------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructor
|
|
||||||
*
|
|
||||||
* @param frame, BRect that is the size of the view passed to the superclase
|
|
||||||
* @param pageWidth, float that is the points value of the page width
|
|
||||||
* @param pageHeight, float that is the points value of the page height
|
|
||||||
* @param margins, BRect values of margins
|
|
||||||
* @param units, unit32 enum for units used in view
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
MarginView::MarginView(BRect frame,
|
|
||||||
int32 pageWidth,
|
|
||||||
int32 pageHeight,
|
|
||||||
BRect margins,
|
|
||||||
uint32 units)
|
|
||||||
|
|
||||||
:BBox(frame, NULL, B_FOLLOW_ALL)
|
|
||||||
{
|
|
||||||
fUnits = units;
|
|
||||||
fUnitValue = unitFormat[units];
|
|
||||||
|
|
||||||
SetLabel("Margins");
|
|
||||||
|
|
||||||
fMaxPageHeight = frame.Height() - _minUnitHeight - Y_OFFSET;
|
|
||||||
fMaxPageWidth = frame.Width() - _minFieldWidth - X_OFFSET;
|
|
||||||
|
|
||||||
fMargins = margins;
|
|
||||||
|
|
||||||
fPageWidth = pageWidth;
|
|
||||||
fPageHeight = pageHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destructor
|
|
||||||
*
|
|
||||||
* @param none
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
MarginView::~MarginView() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/*----------------- MarginView Public BeOS Hook Methods --------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Draw
|
|
||||||
*
|
|
||||||
* @param BRect, the draw bounds
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::Draw(BRect rect)
|
|
||||||
{
|
|
||||||
BBox::Draw(rect);
|
|
||||||
|
|
||||||
float y_offset = (float)Y_OFFSET;
|
|
||||||
float x_offset = (float)X_OFFSET;
|
|
||||||
BRect r;
|
|
||||||
|
|
||||||
// Calculate offsets depending on orientation
|
|
||||||
if (fPageWidth < fPageHeight) { // Portrait
|
|
||||||
x_offset = (fMaxPageWidth/2 + X_OFFSET) - fViewWidth/2;
|
|
||||||
} else { // landscape
|
|
||||||
y_offset = (fMaxPageHeight/2 + Y_OFFSET) - fViewHeight/2;
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw the page
|
|
||||||
SetHighColor(white);
|
|
||||||
r = BRect(0, 0, fViewWidth, fViewHeight);
|
|
||||||
r.OffsetBy(x_offset, y_offset);
|
|
||||||
FillRect(r);
|
|
||||||
SetHighColor(black);
|
|
||||||
StrokeRect(r);
|
|
||||||
|
|
||||||
// draw margin
|
|
||||||
SetHighColor(red);
|
|
||||||
SetLowColor(white);
|
|
||||||
r.top += fMargins.top;
|
|
||||||
r.right -= fMargins.right;
|
|
||||||
r.bottom -= fMargins.bottom;
|
|
||||||
r.left += fMargins.left;
|
|
||||||
StrokeRect(r, dots);
|
|
||||||
|
|
||||||
// draw the page size label
|
|
||||||
SetHighColor(black);
|
|
||||||
SetLowColor(gray);
|
|
||||||
char str[STRING_SIZE];
|
|
||||||
sprintf(str, "%2.1f x %2.1f", fPageWidth/fUnitValue, fPageHeight/fUnitValue);
|
|
||||||
SetFontSize(10);
|
|
||||||
DrawString((const char *)str, BPoint(x_offset, fMaxPageHeight + 40));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* BeOS Hook Function, change the size of the margin display
|
|
||||||
*
|
|
||||||
* @param width of the page
|
|
||||||
* @param height the page
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::FrameResized(float width, float height)
|
|
||||||
{
|
|
||||||
fMaxPageHeight = height - _minUnitHeight - X_OFFSET;
|
|
||||||
fMaxPageWidth = width - _minFieldWidth - Y_OFFSET;
|
|
||||||
|
|
||||||
CalculateViewSize(MARGIN_CHANGED);
|
|
||||||
Invalidate();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AttachToWindow
|
|
||||||
*
|
|
||||||
* @param none
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::AttachedToWindow()
|
|
||||||
{
|
|
||||||
if (Parent()) {
|
|
||||||
SetViewColor(Parent()->ViewColor());
|
|
||||||
}
|
|
||||||
ConstructGUI();
|
|
||||||
}
|
|
||||||
|
|
||||||
/*----------------- MarginView Public Methods --------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GetUnits
|
|
||||||
*
|
|
||||||
* @param none
|
|
||||||
* @return uint32 enum, units in inches, cm, points
|
|
||||||
*/
|
|
||||||
uint32 MarginView::GetUnits(void) {
|
|
||||||
return fUnits;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* UpdateView, recalculate and redraw the view
|
|
||||||
*
|
|
||||||
* @param msg is a message to the calculate size to tell which field caused
|
|
||||||
* the update to occur, or it is a general update.
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::UpdateView(uint32 msg)
|
|
||||||
{
|
|
||||||
Window()->Lock();
|
|
||||||
CalculateViewSize(msg); // nur Preview in Margins BBox!
|
|
||||||
Invalidate();
|
|
||||||
Window()->Unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SetPageSize
|
|
||||||
*
|
|
||||||
* @param pageWidth, float that is the unit value of the page width
|
|
||||||
* @param pageHeight, float that is the unit value of the page height
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::SetPageSize(float pageWidth, float pageHeight)
|
|
||||||
{
|
|
||||||
fPageWidth = pageWidth;
|
|
||||||
fPageHeight = pageHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GetPageSize
|
|
||||||
*
|
|
||||||
* @param none
|
|
||||||
* @return BPoint, contains actual point values of page in x, y of point
|
|
||||||
*/
|
|
||||||
BPoint MarginView::GetPageSize(void) {
|
|
||||||
return BPoint(fPageWidth, fPageHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* GetMargin
|
|
||||||
*
|
|
||||||
* @param none
|
|
||||||
* @return rect, return margin values always in points
|
|
||||||
*/
|
|
||||||
BRect MarginView::GetMargin(void)
|
|
||||||
{
|
|
||||||
BRect margin;
|
|
||||||
|
|
||||||
// convert the field text to values
|
|
||||||
float ftop = atof(fTop->Text());
|
|
||||||
float fright = atof(fRight->Text());
|
|
||||||
float fleft = atof(fLeft->Text());
|
|
||||||
float fbottom = atof(fBottom->Text());
|
|
||||||
|
|
||||||
// convert to units to points
|
|
||||||
switch (fUnits)
|
|
||||||
{
|
|
||||||
case UNIT_INCH:
|
|
||||||
// convert to points
|
|
||||||
ftop *= _inchUnits;
|
|
||||||
fright *= _inchUnits;
|
|
||||||
fleft *= _inchUnits;
|
|
||||||
fbottom *= _inchUnits;
|
|
||||||
break;
|
|
||||||
case UNIT_CM:
|
|
||||||
// convert to points
|
|
||||||
ftop *= _cmUnits;
|
|
||||||
fright *= _cmUnits;
|
|
||||||
fleft *= _cmUnits;
|
|
||||||
fbottom *= _cmUnits;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
margin.Set(fleft, ftop, fright, fbottom);
|
|
||||||
|
|
||||||
return margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* MesssageReceived()
|
|
||||||
*
|
|
||||||
* Receive messages for the view
|
|
||||||
*
|
|
||||||
* @param BMessage* , the message being received
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::MessageReceived(BMessage *msg)
|
|
||||||
{
|
|
||||||
switch (msg->what)
|
|
||||||
{
|
|
||||||
case CHANGE_PAGE_SIZE: {
|
|
||||||
float w;
|
|
||||||
float h;
|
|
||||||
msg->FindFloat("width", &w);
|
|
||||||
msg->FindFloat("height", &h);
|
|
||||||
SetPageSize(w, h);
|
|
||||||
UpdateView(MARGIN_CHANGED);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FLIP_PAGE: {
|
|
||||||
BPoint p;
|
|
||||||
p = GetPageSize();
|
|
||||||
SetPageSize(p.y, p.x);
|
|
||||||
UpdateView(MARGIN_CHANGED);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case MARGIN_CHANGED:
|
|
||||||
UpdateView(MARGIN_CHANGED);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case TOP_MARGIN_CHANGED:
|
|
||||||
UpdateView(TOP_MARGIN_CHANGED);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case LEFT_MARGIN_CHANGED:
|
|
||||||
UpdateView(LEFT_MARGIN_CHANGED);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case RIGHT_MARGIN_CHANGED:
|
|
||||||
UpdateView(RIGHT_MARGIN_CHANGED);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BOTTOM_MARGIN_CHANGED:
|
|
||||||
UpdateView(BOTTOM_MARGIN_CHANGED);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case UNIT_INCH:
|
|
||||||
case UNIT_CM:
|
|
||||||
case UNIT_POINT:
|
|
||||||
SetUnits(msg->what);
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
BView::MessageReceived(msg);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*----------------- MarginView Private Methods --------------------*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ConstructGUI()
|
|
||||||
*
|
|
||||||
* Creates the GUI for the View. MUST be called AFTER the View is attached to
|
|
||||||
* the Window, or will crash and/or create strange behaviour
|
|
||||||
*
|
|
||||||
* @param none
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::ConstructGUI()
|
|
||||||
{
|
|
||||||
BMessage *msg;
|
|
||||||
BString str;
|
|
||||||
BMenuItem *item;
|
|
||||||
BMenuField *mf;
|
|
||||||
BPopUpMenu *menu;
|
|
||||||
|
|
||||||
// Create text fields
|
|
||||||
msg = new BMessage(MARGIN_CHANGED);
|
|
||||||
BRect r(Frame().Width() - be_plain_font->StringWidth("Top#") - _WIDTH,
|
|
||||||
Y_OFFSET, Frame().Width() - X_OFFSET, _WIDTH);
|
|
||||||
|
|
||||||
// top
|
|
||||||
str << fMargins.top/fUnitValue;
|
|
||||||
fTop = new BTextControl( r, "top", "Top", str.String(), NULL,
|
|
||||||
B_FOLLOW_RIGHT);
|
|
||||||
|
|
||||||
fTop->SetModificationMessage(new BMessage(TOP_MARGIN_CHANGED));
|
|
||||||
fTop->SetDivider(be_plain_font->StringWidth("Top#"));
|
|
||||||
fTop->SetTarget(this);
|
|
||||||
AllowOnlyNumbers(fTop, NUM_COUNT);
|
|
||||||
AddChild(fTop);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//left
|
|
||||||
r.OffsetBy(0, Y_OFFSET);
|
|
||||||
r.left = Frame().Width() - be_plain_font->StringWidth("Left#") - _WIDTH;
|
|
||||||
str = "";
|
|
||||||
str << fMargins.left/fUnitValue;
|
|
||||||
fLeft = new BTextControl( r, "left", "Left", str.String(), NULL,
|
|
||||||
B_FOLLOW_RIGHT);
|
|
||||||
|
|
||||||
fLeft->SetModificationMessage(new BMessage(LEFT_MARGIN_CHANGED));
|
|
||||||
fLeft->SetDivider(be_plain_font->StringWidth("Left#"));
|
|
||||||
fLeft->SetTarget(this);
|
|
||||||
AllowOnlyNumbers(fLeft, NUM_COUNT);
|
|
||||||
AddChild(fLeft);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//bottom
|
|
||||||
r.OffsetBy(0, Y_OFFSET);
|
|
||||||
r.left = Frame().Width() - be_plain_font->StringWidth("Bottom#") - _WIDTH;
|
|
||||||
str = "";
|
|
||||||
str << fMargins.bottom/fUnitValue;
|
|
||||||
fBottom = new BTextControl( r, "bottom", "Bottom", str.String(), NULL,
|
|
||||||
B_FOLLOW_RIGHT);
|
|
||||||
|
|
||||||
fBottom->SetModificationMessage(new BMessage(BOTTOM_MARGIN_CHANGED));
|
|
||||||
fBottom->SetDivider(be_plain_font->StringWidth("Bottom#"));
|
|
||||||
fBottom->SetTarget(this);
|
|
||||||
|
|
||||||
AllowOnlyNumbers(fBottom, NUM_COUNT);
|
|
||||||
AddChild(fBottom);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//right
|
|
||||||
r.OffsetBy(0, Y_OFFSET);
|
|
||||||
r.left = Frame().Width() - be_plain_font->StringWidth("Right#") - _WIDTH;
|
|
||||||
str = "";
|
|
||||||
str << fMargins.right/fUnitValue;
|
|
||||||
fRight = new BTextControl( r, "right", "Right", str.String(), NULL,
|
|
||||||
B_FOLLOW_RIGHT);
|
|
||||||
|
|
||||||
fRight->SetModificationMessage(new BMessage(RIGHT_MARGIN_CHANGED));
|
|
||||||
fRight->SetDivider(be_plain_font->StringWidth("Right#"));
|
|
||||||
fRight->SetTarget(this);
|
|
||||||
AllowOnlyNumbers(fRight, NUM_COUNT);
|
|
||||||
AddChild(fRight);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Create Units popup
|
|
||||||
r.OffsetBy(-X_OFFSET,Y_OFFSET);
|
|
||||||
r.right += Y_OFFSET;
|
|
||||||
|
|
||||||
menu = new BPopUpMenu("units");
|
|
||||||
mf = new BMenuField(r, "units", "Units", menu,
|
|
||||||
B_FOLLOW_BOTTOM|B_FOLLOW_RIGHT|B_WILL_DRAW);
|
|
||||||
mf->ResizeToPreferred();
|
|
||||||
mf->SetDivider(be_plain_font->StringWidth("Units#"));
|
|
||||||
|
|
||||||
// Construct menu items
|
|
||||||
for (int i=0; unitNames[i] != NULL; i++ )
|
|
||||||
{
|
|
||||||
msg = new BMessage(unitMsg[i]);
|
|
||||||
menu->AddItem(item = new BMenuItem(unitNames[i], msg));
|
|
||||||
item->SetTarget(this);
|
|
||||||
if (fUnits == unitMsg[i]) {
|
|
||||||
item->SetMarked(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
AddChild(mf);
|
|
||||||
|
|
||||||
// calculate the sizes for drawing page view
|
|
||||||
CalculateViewSize(MARGIN_CHANGED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AllowOnlyNumbers()
|
|
||||||
*
|
|
||||||
* @param BTextControl, the control we want to only allow numbers
|
|
||||||
* @param maxNum, the maximun number of characters allowed
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::AllowOnlyNumbers(BTextControl *textControl, int maxNum)
|
|
||||||
{
|
|
||||||
BTextView *tv = textControl->TextView();
|
|
||||||
|
|
||||||
for (long i = 0; i < 256; i++) {
|
|
||||||
tv->DisallowChar(i);
|
|
||||||
}
|
|
||||||
for (long i = '0'; i <= '9'; i++) {
|
|
||||||
tv->AllowChar(i);
|
|
||||||
}
|
|
||||||
tv->AllowChar(B_BACKSPACE);
|
|
||||||
tv->AllowChar('.');
|
|
||||||
tv->SetMaxBytes(maxNum);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SetMargin
|
|
||||||
*
|
|
||||||
* @param brect, margin values in rect
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::SetMargin(BRect margin) {
|
|
||||||
fMargins = margin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SetUnits, called by the MarginMgr when the units popup is selected
|
|
||||||
*
|
|
||||||
* @param uint32, the enum that identifies the units requested to change to.
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::SetUnits(uint32 unit)
|
|
||||||
{
|
|
||||||
// do nothing if the current units are the same as requested
|
|
||||||
if (unit == fUnits) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// set the units Format
|
|
||||||
fUnitValue = unitFormat[unit];
|
|
||||||
|
|
||||||
// convert the field text to values
|
|
||||||
float ftop = atof(fTop->Text());
|
|
||||||
float fright = atof(fRight->Text());
|
|
||||||
float fleft = atof(fLeft->Text());
|
|
||||||
float fbottom = atof(fBottom->Text());
|
|
||||||
|
|
||||||
// convert to target units
|
|
||||||
switch (fUnits)
|
|
||||||
{
|
|
||||||
case UNIT_INCH:
|
|
||||||
// convert to points
|
|
||||||
ftop *= _inchUnits;
|
|
||||||
fright *= _inchUnits;
|
|
||||||
fleft *= _inchUnits;
|
|
||||||
fbottom *= _inchUnits;
|
|
||||||
// check for target unit is cm
|
|
||||||
if (unit == UNIT_CM) {
|
|
||||||
ftop /= _cmUnits;
|
|
||||||
fright /= _cmUnits;
|
|
||||||
fleft /= _cmUnits;
|
|
||||||
fbottom /= _cmUnits;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UNIT_CM:
|
|
||||||
// convert to points
|
|
||||||
ftop *= _cmUnits;
|
|
||||||
fright *= _cmUnits;
|
|
||||||
fleft *= _cmUnits;
|
|
||||||
fbottom *= _cmUnits;
|
|
||||||
// check for target unit is inches
|
|
||||||
if (unit == UNIT_INCH) {
|
|
||||||
ftop /= _inchUnits;
|
|
||||||
fright /= _inchUnits;
|
|
||||||
fleft /= _inchUnits;
|
|
||||||
fbottom /= _inchUnits;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case UNIT_POINT:
|
|
||||||
// check for target unit is cm
|
|
||||||
if (unit == UNIT_CM) {
|
|
||||||
ftop /= _cmUnits;
|
|
||||||
fright /= _cmUnits;
|
|
||||||
fleft /= _cmUnits;
|
|
||||||
fbottom /= _cmUnits;
|
|
||||||
}
|
|
||||||
// check for target unit is inches
|
|
||||||
if (unit == UNIT_INCH) {
|
|
||||||
ftop /= _inchUnits;
|
|
||||||
fright /= _inchUnits;
|
|
||||||
fleft /= _inchUnits;
|
|
||||||
fbottom /= _inchUnits;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
fUnits = unit;
|
|
||||||
|
|
||||||
// lock Window since these changes are from another thread
|
|
||||||
Window()->Lock();
|
|
||||||
|
|
||||||
// set the fields to new units
|
|
||||||
BString str;
|
|
||||||
str << ftop;
|
|
||||||
fTop->SetText(str.String());
|
|
||||||
|
|
||||||
str = "";
|
|
||||||
str << fleft;
|
|
||||||
fLeft->SetText(str.String());
|
|
||||||
|
|
||||||
str = "";
|
|
||||||
str << fright;
|
|
||||||
fRight->SetText(str.String());
|
|
||||||
|
|
||||||
str = "";
|
|
||||||
str << fbottom;
|
|
||||||
fBottom->SetText(str.String());
|
|
||||||
|
|
||||||
// update UI
|
|
||||||
CalculateViewSize(MARGIN_CHANGED);
|
|
||||||
Invalidate();
|
|
||||||
|
|
||||||
Window()->Unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* CalculateViewSize
|
|
||||||
*
|
|
||||||
* calculate the size of the view that is used
|
|
||||||
* to show the page inside the margin box. This is dependent
|
|
||||||
* on the size of the box and the room we have to show it and
|
|
||||||
* the units that we are using and the orientation of the page.
|
|
||||||
*
|
|
||||||
* @param msg, the message for which field changed to check value bounds
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
void MarginView::CalculateViewSize(uint32 msg)
|
|
||||||
{
|
|
||||||
// determine page orientation
|
|
||||||
if (fPageHeight < fPageWidth) { // LANDSCAPE
|
|
||||||
fViewWidth = fMaxPageWidth;
|
|
||||||
fViewHeight = fPageHeight * (fViewWidth/fPageWidth);
|
|
||||||
float hdiff = fViewHeight - fMaxPageHeight;
|
|
||||||
if (hdiff > 0) {
|
|
||||||
fViewHeight -= hdiff;
|
|
||||||
fViewWidth -= hdiff;
|
|
||||||
}
|
|
||||||
} else { // PORTRAIT
|
|
||||||
fViewHeight = fMaxPageHeight;
|
|
||||||
fViewWidth = fPageWidth * (fViewHeight/fPageHeight);
|
|
||||||
float wdiff = fViewWidth - fMaxPageWidth;
|
|
||||||
if (wdiff > 0) {
|
|
||||||
fViewHeight -= wdiff;
|
|
||||||
fViewWidth -= wdiff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculate margins based on view size
|
|
||||||
|
|
||||||
// find the length of 1 pixel in points
|
|
||||||
// ex: 80px/800pt = 0.1px/pt
|
|
||||||
float pixelLength = fViewHeight/fPageHeight;
|
|
||||||
|
|
||||||
// convert the margins to points
|
|
||||||
// The text field will have a number that us in the current unit
|
|
||||||
// ex 0.2" * 72pt = 14.4pts
|
|
||||||
float ftop = atof(fTop->Text()) * fUnitValue;
|
|
||||||
float fright = atof(fRight->Text()) * fUnitValue;
|
|
||||||
float fbottom = atof(fBottom->Text()) * fUnitValue;
|
|
||||||
float fleft = atof(fLeft->Text()) * fUnitValue;
|
|
||||||
|
|
||||||
// Check that the margins don't overlap each other...
|
|
||||||
float ph = fPageHeight;
|
|
||||||
float pw = fPageWidth;
|
|
||||||
BString str;
|
|
||||||
|
|
||||||
// Bounds calculation rules:
|
|
||||||
if (msg == TOP_MARGIN_CHANGED)
|
|
||||||
{
|
|
||||||
// top must be <= bottom
|
|
||||||
if (ftop > (ph - fbottom)) {
|
|
||||||
ftop = ph - fbottom;
|
|
||||||
str = "";
|
|
||||||
str << ftop / fUnitValue;
|
|
||||||
Window()->Lock();
|
|
||||||
fTop->SetText(str.String());
|
|
||||||
Window()->Unlock();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg == BOTTOM_MARGIN_CHANGED)
|
|
||||||
{
|
|
||||||
// bottom must be <= pageHeight
|
|
||||||
if (fbottom > (ph - ftop)) {
|
|
||||||
fbottom = ph - ftop;
|
|
||||||
str = "";
|
|
||||||
str << fbottom / fUnitValue;
|
|
||||||
Window()->Lock();
|
|
||||||
fBottom->SetText(str.String());
|
|
||||||
Window()->Unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg == LEFT_MARGIN_CHANGED)
|
|
||||||
{
|
|
||||||
// left must be <= right
|
|
||||||
if (fleft > (pw - fright)) {
|
|
||||||
fleft = pw - fright;
|
|
||||||
str = "";
|
|
||||||
str << fleft / fUnitValue;
|
|
||||||
Window()->Lock();
|
|
||||||
fLeft->SetText(str.String());
|
|
||||||
Window()->Unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (msg == RIGHT_MARGIN_CHANGED)
|
|
||||||
{
|
|
||||||
// right must be <= fPageWidth
|
|
||||||
if (fright > (pw - fleft)) {
|
|
||||||
fright = pw - fleft;
|
|
||||||
str = "";
|
|
||||||
str << fright / fUnitValue;
|
|
||||||
Window()->Lock();
|
|
||||||
fRight->SetText(str.String());
|
|
||||||
Window()->Unlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// convert the unit value to pixels
|
|
||||||
// ex: 14.4pt * 0.1px/pt = 1.44px
|
|
||||||
fMargins.top = ftop * pixelLength;
|
|
||||||
fMargins.right = fright * pixelLength;
|
|
||||||
fMargins.bottom = fbottom * pixelLength;
|
|
||||||
fMargins.left = fleft * pixelLength;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,226 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
MarginView.h
|
|
||||||
|
|
||||||
Copyright (c) 2002 OpenBeOS.
|
|
||||||
|
|
||||||
Authors:
|
|
||||||
Philippe Houdoin
|
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
Documentation:
|
|
||||||
|
|
||||||
The MarginView is designed to be a self contained component that manages
|
|
||||||
the display of a BBox control that shows a graphic of a page and its'
|
|
||||||
margings. The component also includes text fields that are used to mofify
|
|
||||||
the margin values and a popup to change the units used for the margins.
|
|
||||||
|
|
||||||
There are two interfaces for the MarginView component:
|
|
||||||
|
|
||||||
1) Set methods:
|
|
||||||
- page size
|
|
||||||
- orientation
|
|
||||||
|
|
||||||
Get methods to retrieve:
|
|
||||||
- margins
|
|
||||||
- page size
|
|
||||||
|
|
||||||
The method interface is available for the parent Component to call on
|
|
||||||
the MarginView in response to the Window receiveing messages from
|
|
||||||
other BControls that it contains, such as a Page Size popup. The
|
|
||||||
Get methods are used to extract the page size and margins so that
|
|
||||||
the printer driver may put these values into a BMessage for printing.
|
|
||||||
|
|
||||||
2) 'Optional' Message interface:
|
|
||||||
- Set Page Size
|
|
||||||
- Flip Orientation
|
|
||||||
|
|
||||||
The message interface is available for GUI Controls, BPopupMenu to send
|
|
||||||
messages to the MarginView if the parent Window is not used to handle
|
|
||||||
the messages.
|
|
||||||
|
|
||||||
General Use of MarginView component:
|
|
||||||
|
|
||||||
1) Simply construct a new MarginView object with the margins
|
|
||||||
you want as defaults and add this view to the parent view
|
|
||||||
of the dialog.
|
|
||||||
|
|
||||||
MarginView *mv;
|
|
||||||
mv = new MarginView(viewSizeRect, pageWidth, pageHeight);
|
|
||||||
parentView->AddChild(mv);
|
|
||||||
|
|
||||||
* you can also set the margins in the constructor, and the units:
|
|
||||||
|
|
||||||
mv = new MarginView(viewSizeRect, pageWidth, pageHeight
|
|
||||||
marginRect, UNIT_POINTS);
|
|
||||||
|
|
||||||
! but remeber to have the marginRect values match the UNITS :-)
|
|
||||||
|
|
||||||
2) Set Page Size with methods:
|
|
||||||
|
|
||||||
mv-SetPageSize( pageWidth, pageHeight );
|
|
||||||
mv->UpdateView();
|
|
||||||
|
|
||||||
3) Set Page Size with BMessage:
|
|
||||||
|
|
||||||
BMessage* msg = new BMessage(CHANGE_PAGE_SIZE);
|
|
||||||
msg->AddFloat("width", pageWidth);
|
|
||||||
msg->AddFloat("height", pageHeight);
|
|
||||||
mv->PostMessage(msg);
|
|
||||||
|
|
||||||
4) Flip Page with methods:
|
|
||||||
|
|
||||||
mv-SetPageSize( pageHeight, pageWidth );
|
|
||||||
mv->UpdateView();
|
|
||||||
|
|
||||||
5) Flip Page with BMessage:
|
|
||||||
|
|
||||||
BMessage* msg = new BMessage(FLIP_PAGE);
|
|
||||||
mv->Looper()->PostMessage(msg);
|
|
||||||
|
|
||||||
Note: the MarginView DOES NOT keep track of the orientation. This
|
|
||||||
should be done by the code for the Page setup dialog.
|
|
||||||
|
|
||||||
6) Get Page Size
|
|
||||||
|
|
||||||
BPoint pageSize = mv->GetPageSize();
|
|
||||||
|
|
||||||
7) Get Margins
|
|
||||||
|
|
||||||
BRect margins = mv->GetMargins();
|
|
||||||
|
|
||||||
8) Get Units
|
|
||||||
|
|
||||||
uint32 units = mv->GetUnits();
|
|
||||||
|
|
||||||
where units is one of:
|
|
||||||
UNIT_INCH, 72 points/in
|
|
||||||
UNIT_CM, 28.346 points/cm
|
|
||||||
UNIT_POINT, 1 point/point
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef MARGIN_VIEW_H
|
|
||||||
#define MARGIN_VIEW_H
|
|
||||||
|
|
||||||
#include <InterfaceKit.h>
|
|
||||||
#include <Looper.h>
|
|
||||||
|
|
||||||
class MarginManager;
|
|
||||||
|
|
||||||
// Messages that the MarginManager accepts
|
|
||||||
const uint32 TOP_MARGIN_CHANGED = 'tchg';
|
|
||||||
const uint32 RIGHT_MARGIN_CHANGED = 'rchg';
|
|
||||||
const uint32 LEFT_MARGIN_CHANGED = 'lchg';
|
|
||||||
const uint32 BOTTOM_MARGIN_CHANGED = 'bchg';
|
|
||||||
const uint32 MARGIN_CHANGED = 'mchg';
|
|
||||||
const uint32 CHANGE_PAGE_SIZE = 'chps';
|
|
||||||
const uint32 FLIP_PAGE = 'flip';
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class MarginView
|
|
||||||
*/
|
|
||||||
class MarginView : public BBox
|
|
||||||
{
|
|
||||||
friend class MarginManager;
|
|
||||||
|
|
||||||
public:
|
|
||||||
// used to index unitFormat array
|
|
||||||
typedef enum {
|
|
||||||
UNIT_INCH = 0,
|
|
||||||
UNIT_CM,
|
|
||||||
UNIT_POINT
|
|
||||||
};
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
// GUI components
|
|
||||||
BTextControl *fTop, *fBottom, *fLeft, *fRight;
|
|
||||||
|
|
||||||
// rect that holds the margins for the page as a set of point offsets
|
|
||||||
BRect fMargins;
|
|
||||||
|
|
||||||
// the maximum size of the page view calculated from the view size
|
|
||||||
float fMaxPageWidth;
|
|
||||||
float fMaxPageHeight;
|
|
||||||
|
|
||||||
// the actual size of the page in points
|
|
||||||
float fPageHeight;
|
|
||||||
float fPageWidth;
|
|
||||||
|
|
||||||
// the units used to calculate the page size
|
|
||||||
uint32 fUnits;
|
|
||||||
float fUnitValue;
|
|
||||||
|
|
||||||
// the size of the drawing area we have to draw the view in pixels
|
|
||||||
float fViewHeight;
|
|
||||||
float fViewWidth;
|
|
||||||
|
|
||||||
// Calculate the view size for the margins
|
|
||||||
void CalculateViewSize(uint32 msg);
|
|
||||||
|
|
||||||
// performed internally using the supplied popup
|
|
||||||
void SetUnits(uint32 unit);
|
|
||||||
|
|
||||||
// performed internally using text fields
|
|
||||||
void SetMargin(BRect margin);
|
|
||||||
|
|
||||||
// utility method
|
|
||||||
void AllowOnlyNumbers(BTextControl *textControl, int maxNum);
|
|
||||||
|
|
||||||
public:
|
|
||||||
MarginView(BRect rect,
|
|
||||||
int32 pageWidth = 0,
|
|
||||||
int32 pageHeight = 0,
|
|
||||||
BRect margins = BRect(1, 1, 1, 1), // default to 1 inch
|
|
||||||
uint32 units = UNIT_INCH);
|
|
||||||
|
|
||||||
~MarginView();
|
|
||||||
|
|
||||||
/// all the GUI construction code
|
|
||||||
void ConstructGUI();
|
|
||||||
|
|
||||||
// page size
|
|
||||||
void SetPageSize(float pageWidth, float pageHeight);
|
|
||||||
// point.x = width, point.y = height
|
|
||||||
BPoint GetPageSize(void);
|
|
||||||
|
|
||||||
// margin
|
|
||||||
BRect GetMargin(void);
|
|
||||||
|
|
||||||
// orientation
|
|
||||||
// None, this state should be saved elsewhere in the page setup code
|
|
||||||
// and not here. See the FLIP_PAGE message to perform this function.
|
|
||||||
|
|
||||||
// units
|
|
||||||
uint32 GetUnits(void);
|
|
||||||
|
|
||||||
// will cause a recalc and redraw
|
|
||||||
void UpdateView(uint32 msg);
|
|
||||||
|
|
||||||
// BeOS Hook methods
|
|
||||||
virtual void AttachedToWindow(void);
|
|
||||||
void Draw(BRect rect);
|
|
||||||
void FrameResized(float width, float height);
|
|
||||||
void MessageReceived(BMessage *msg);
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif //MARGIN_VIEW_H
|
|
||||||
@@ -1,34 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2003-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2003 OpenBeOS.
|
* Authors:
|
||||||
Copyright (c) 2005 Haiku.
|
* Philippe Houdoin
|
||||||
|
* Simon Gauvin
|
||||||
Authors:
|
* Michael Pfeiffer
|
||||||
Philippe Houdoin
|
* Hartmut Reh
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
Hartmut Reh
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@@ -38,9 +16,9 @@ THE SOFTWARE.
|
|||||||
#include "PrinterDriver.h"
|
#include "PrinterDriver.h"
|
||||||
#include "PageSetupWindow.h"
|
#include "PageSetupWindow.h"
|
||||||
|
|
||||||
|
#include "BeUtils.h"
|
||||||
#include "MarginView.h"
|
#include "MarginView.h"
|
||||||
|
|
||||||
|
|
||||||
// static global variables
|
// static global variables
|
||||||
static struct
|
static struct
|
||||||
{
|
{
|
||||||
@@ -113,7 +91,7 @@ PageSetupWindow::PageSetupWindow(BMessage *msg, const char *printerName)
|
|||||||
int32 orient;
|
int32 orient;
|
||||||
BRect page;
|
BRect page;
|
||||||
BRect margin(0, 0, 0, 0);
|
BRect margin(0, 0, 0, 0);
|
||||||
int32 units = MarginView::UNIT_INCH;
|
MarginUnit units = kUnitInch;
|
||||||
BString setting_value;
|
BString setting_value;
|
||||||
|
|
||||||
// load orientation
|
// load orientation
|
||||||
@@ -131,7 +109,10 @@ PageSetupWindow::PageSetupWindow(BMessage *msg, const char *printerName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Load units
|
// Load units
|
||||||
fSetupMsg->FindInt32("units", &units);
|
int32 unitsValue;
|
||||||
|
if (fSetupMsg->FindInt32("units", &unitsValue) == B_OK) {
|
||||||
|
units = (MarginUnit)unitsValue;
|
||||||
|
}
|
||||||
|
|
||||||
// add a *dialog* background
|
// add a *dialog* background
|
||||||
r = Bounds();
|
r = Bounds();
|
||||||
@@ -149,7 +130,7 @@ PageSetupWindow::PageSetupWindow(BMessage *msg, const char *printerName)
|
|||||||
margin.right = page.right - margin.right;
|
margin.right = page.right - margin.right;
|
||||||
margin.bottom = page.bottom - margin.bottom;
|
margin.bottom = page.bottom - margin.bottom;
|
||||||
} else {
|
} else {
|
||||||
margin.Set(0, 0, 0, 0);
|
margin.Set(28.34, 28.34, 28.34, 28.34); // 28.34 dots = 1cm
|
||||||
}
|
}
|
||||||
|
|
||||||
fMarginView = new MarginView(BRect(20,20,200,160), (int32)width, (int32)height,
|
fMarginView = new MarginView(BRect(20,20,200,160), (int32)width, (int32)height,
|
||||||
@@ -340,7 +321,7 @@ PageSetupWindow::UpdateSetupMessage()
|
|||||||
SetRect(fSetupMsg, "printable_rect", ScaleRect(margin, scaleR));
|
SetRect(fSetupMsg, "printable_rect", ScaleRect(margin, scaleR));
|
||||||
|
|
||||||
// save the units used
|
// save the units used
|
||||||
int32 units = fMarginView->GetUnits();
|
int32 units = fMarginView->GetMarginUnit();
|
||||||
SetInt32(fSetupMsg, "units", units);
|
SetInt32(fSetupMsg, "units", units);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,34 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2003-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2003 OpenBeOS.
|
* Authors:
|
||||||
Copyright (c) 2005 Haiku.
|
* Philippe Houdoin
|
||||||
|
* Simon Gauvin
|
||||||
Authors:
|
* Michael Pfeiffer
|
||||||
Philippe Houdoin
|
* Hartmut Reh
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
Hartmut Reh
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PAGESETUPWINDOW_H
|
#ifndef PAGESETUPWINDOW_H
|
||||||
|
|||||||
@@ -1,38 +1,19 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2002-2007, Haiku. All rights reserved.
|
||||||
Preview
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2002, 2003 OpenBeOS.
|
* Authors:
|
||||||
Copyright (c) 2005 Haiku.
|
* Michael Pfeiffer
|
||||||
|
* Hartmut Reh
|
||||||
Author:
|
|
||||||
Michael Pfeiffer
|
|
||||||
Hartmut Reh
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// TODO Remove. Use shared/libprint/Preview.cpp instead.
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include <Debug.h>
|
#include <Debug.h>
|
||||||
#include <String.h>
|
#include <String.h>
|
||||||
|
#include "BeUtils.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
||||||
#include "Preview.h"
|
#include "Preview.h"
|
||||||
|
|||||||
@@ -1,32 +1,10 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2002-2007, Haiku. All rights reserved.
|
||||||
Preview
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2002, 2003 OpenBeOS.
|
* Authors:
|
||||||
Copyright (c) 2005 Haiku.
|
* Michael Pfeiffer
|
||||||
|
* Hartmut Reh
|
||||||
Author:
|
|
||||||
Michael Pfeiffer
|
|
||||||
Hartmut Reh
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
|
|||||||
@@ -1,30 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2003-2007, Haiku. All rights reserved.
|
||||||
PreviewDriver
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2003 OpenBeOS.
|
* Authors:
|
||||||
|
* Michael Pfeiffer
|
||||||
Author:
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "PreviewDriver.h"
|
#include "PreviewDriver.h"
|
||||||
@@ -43,8 +22,8 @@ PrinterDriver* instanciate_driver(BNode *spoolDir)
|
|||||||
// About dialog text:
|
// About dialog text:
|
||||||
const char*
|
const char*
|
||||||
kAbout =
|
kAbout =
|
||||||
"Preview for BeOS\n"
|
"Preview for Haiku\n"
|
||||||
"© 2003 OpenBeOS\n"
|
"© 2003-2007 Haiku\n"
|
||||||
"by Michael Pfeiffer\n"
|
"by Michael Pfeiffer\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Based on PDF Writer by\nPhilippe Houdoin, Simon Gauvin, Michael Pfeiffer\n"
|
"Based on PDF Writer by\nPhilippe Houdoin, Simon Gauvin, Michael Pfeiffer\n"
|
||||||
|
|||||||
@@ -1,30 +1,9 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2002-2007, Haiku. All rights reserved.
|
||||||
Preview
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2002, 2003 OpenBeOS.
|
* Authors:
|
||||||
|
* Michael Pfeiffer
|
||||||
Author:
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Preview.h"
|
#include "Preview.h"
|
||||||
|
|||||||
@@ -1,35 +1,14 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2003-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2003 OpenBeOS.
|
* Authors:
|
||||||
|
* Philippe Houdoin
|
||||||
Authors:
|
* Simon Gauvin
|
||||||
Philippe Houdoin
|
* Michael Pfeiffer
|
||||||
Simon Gauvin
|
* Dr. Hartmut Reh
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h> // for memset()
|
#include <string.h> // for memset()
|
||||||
|
|
||||||
@@ -105,13 +84,6 @@ PrinterDriver::PrintJob
|
|||||||
if (!fJobFile || !fPrinterNode)
|
if (!fJobFile || !fPrinterNode)
|
||||||
return B_ERROR;
|
return B_ERROR;
|
||||||
|
|
||||||
if (fPrintTransport.Open(fPrinterNode) != B_OK) {
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
if (fPrintTransport.IsPrintToFileCanceled()) {
|
|
||||||
return B_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
// read print file header
|
// read print file header
|
||||||
fJobFile->Seek(0, SEEK_SET);
|
fJobFile->Seek(0, SEEK_SET);
|
||||||
fJobFile->Read(&pfh, sizeof(pfh));
|
fJobFile->Read(&pfh, sizeof(pfh));
|
||||||
|
|||||||
@@ -1,32 +1,12 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2001-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2001 OpenBeOS.
|
* Authors:
|
||||||
|
* Philippe Houdoin
|
||||||
Authors:
|
* Simon Gauvin
|
||||||
Philippe Houdoin
|
* Michael Pfeiffer
|
||||||
Simon Gauvin
|
* Dr. Hartmut Reh
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PRINTERDRIVER_H
|
#ifndef PRINTERDRIVER_H
|
||||||
@@ -34,7 +14,6 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
#include <AppKit.h>
|
#include <AppKit.h>
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
#include "PrintTransport.h"
|
|
||||||
#include "InterfaceUtils.h"
|
#include "InterfaceUtils.h"
|
||||||
|
|
||||||
#ifndef ROUND_UP
|
#ifndef ROUND_UP
|
||||||
@@ -102,7 +81,6 @@ public:
|
|||||||
inline BFile *JobFile() { return fJobFile; }
|
inline BFile *JobFile() { return fJobFile; }
|
||||||
inline BNode *PrinterNode() { return fPrinterNode; }
|
inline BNode *PrinterNode() { return fPrinterNode; }
|
||||||
inline BMessage *JobMsg() { return fJobMsg; }
|
inline BMessage *JobMsg() { return fJobMsg; }
|
||||||
inline BDataIO *Transport() { return fPrintTransport.GetDataIO(); }
|
|
||||||
inline int32 Pass() const { return fPass; }
|
inline int32 Pass() const { return fPass; }
|
||||||
|
|
||||||
// publics status code
|
// publics status code
|
||||||
@@ -123,9 +101,6 @@ private:
|
|||||||
|
|
||||||
bool fPrinting;
|
bool fPrinting;
|
||||||
int32 fPass;
|
int32 fPass;
|
||||||
|
|
||||||
// transport-related
|
|
||||||
PrintTransport fPrintTransport;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // #ifndef PRINTERDRIVER_H
|
#endif // #ifndef PRINTERDRIVER_H
|
||||||
|
|||||||
@@ -1,32 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2003-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2003 OpenBeOS.
|
* Authors:
|
||||||
|
* Philippe Houdoin
|
||||||
Authors:
|
* Simon Gauvin
|
||||||
Philippe Houdoin
|
* Michael Pfeiffer
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
|
|||||||
@@ -1,32 +1,11 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright 2003-2007, Haiku. All rights reserved.
|
||||||
Preview printer driver.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
Copyright (c) 2003 OpenBeOS.
|
* Authors:
|
||||||
|
* Philippe Houdoin
|
||||||
Authors:
|
* Simon Gauvin
|
||||||
Philippe Houdoin
|
* Michael Pfeiffer
|
||||||
Simon Gauvin
|
|
||||||
Michael Pfeiffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
|
||||||
of the Software, and to permit persons to whom the Software is furnished to do
|
|
||||||
so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef PRINTERSETUPWINDOW_H
|
#ifndef PRINTERSETUPWINDOW_H
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
SubDir HAIKU_TOP src add-ons print drivers shared ;
|
SubDir HAIKU_TOP src add-ons print drivers shared ;
|
||||||
|
|
||||||
|
SubInclude HAIKU_TOP src add-ons print drivers shared utils ;
|
||||||
SubInclude HAIKU_TOP src add-ons print drivers shared libprint ;
|
SubInclude HAIKU_TOP src add-ons print drivers shared libprint ;
|
||||||
|
|||||||
@@ -14,6 +14,7 @@
|
|||||||
#include <Region.h>
|
#include <Region.h>
|
||||||
#include <TextControl.h>
|
#include <TextControl.h>
|
||||||
#include <TextControl.h>
|
#include <TextControl.h>
|
||||||
|
#include <StopWatch.h>
|
||||||
#include <View.h>
|
#include <View.h>
|
||||||
#include <Directory.h>
|
#include <Directory.h>
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
@@ -34,12 +35,17 @@ using namespace std;
|
|||||||
#define std
|
#define std
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Measure printJob() time. Either true or false.
|
||||||
|
#define MEASURE_PRINT_JOB_TIME false
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
kMaxMemorySize = (4 *1024 *1024)
|
kMaxMemorySize = (4 *1024 *1024)
|
||||||
};
|
};
|
||||||
|
|
||||||
GraphicsDriver::GraphicsDriver(BMessage *msg, PrinterData *printer_data, const PrinterCap *printer_cap)
|
GraphicsDriver::GraphicsDriver(BMessage *msg, PrinterData *printer_data, const PrinterCap *printer_cap)
|
||||||
: fMsg(msg), fPrinterData(printer_data), fPrinterCap(printer_cap)
|
: fMsg(msg)
|
||||||
|
, fPrinterData(printer_data)
|
||||||
|
, fPrinterCap(printer_cap)
|
||||||
{
|
{
|
||||||
fView = NULL;
|
fView = NULL;
|
||||||
fBitmap = NULL;
|
fBitmap = NULL;
|
||||||
@@ -60,9 +66,29 @@ static BRect RotateRect(BRect rect)
|
|||||||
return rotated;
|
return rotated;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
bool
|
||||||
GraphicsDriver::setupData(BFile *spool_file, long page_count)
|
GraphicsDriver::setupData(BFile *spool_file)
|
||||||
{
|
{
|
||||||
|
if (fOrgJobData != NULL) {
|
||||||
|
// already initialized
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
print_file_header pfh;
|
||||||
|
|
||||||
|
spool_file->Seek(0, SEEK_SET);
|
||||||
|
spool_file->Read(&pfh, sizeof(pfh));
|
||||||
|
|
||||||
|
DBGMSG(("print_file_header::version = 0x%x\n", pfh.version));
|
||||||
|
DBGMSG(("print_file_header::page_count = %d\n", pfh.page_count));
|
||||||
|
DBGMSG(("print_file_header::first_page = 0x%x\n", (int)pfh.first_page));
|
||||||
|
|
||||||
|
if (pfh.page_count <= 0) {
|
||||||
|
// nothing to print
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
fPageCount = (uint32) pfh.page_count;
|
||||||
BMessage *msg = new BMessage();
|
BMessage *msg = new BMessage();
|
||||||
msg->Unflatten(spool_file);
|
msg->Unflatten(spool_file);
|
||||||
fOrgJobData = new JobData(msg, fPrinterCap, JobData::kJobSettings);
|
fOrgJobData = new JobData(msg, fPrinterCap, JobData::kJobSettings);
|
||||||
@@ -87,7 +113,7 @@ GraphicsDriver::setupData(BFile *spool_file, long page_count)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fOrgJobData->getCollate() && page_count > 1) {
|
if (fOrgJobData->getCollate() && fPageCount > 1) {
|
||||||
fRealJobData->setCopies(1);
|
fRealJobData->setCopies(1);
|
||||||
fInternalCopies = fOrgJobData->getCopies();
|
fInternalCopies = fOrgJobData->getCopies();
|
||||||
} else {
|
} else {
|
||||||
@@ -95,6 +121,7 @@ GraphicsDriver::setupData(BFile *spool_file, long page_count)
|
|||||||
}
|
}
|
||||||
|
|
||||||
fSpoolMetaData = new SpoolMetaData(spool_file);
|
fSpoolMetaData = new SpoolMetaData(spool_file);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -159,8 +186,8 @@ GraphicsDriver::cleanupBitmap()
|
|||||||
fView = NULL;
|
fView = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static
|
BPoint
|
||||||
BPoint get_scale(JobData *org_job_data)
|
GraphicsDriver::getScale(int32 nup, BRect physicalRect, float scaling)
|
||||||
{
|
{
|
||||||
float width;
|
float width;
|
||||||
float height;
|
float height;
|
||||||
@@ -168,13 +195,13 @@ BPoint get_scale(JobData *org_job_data)
|
|||||||
|
|
||||||
scale.x = scale.y = 1.0f;
|
scale.x = scale.y = 1.0f;
|
||||||
|
|
||||||
switch (org_job_data->getNup()) {
|
switch (nup) {
|
||||||
case 1:
|
case 1:
|
||||||
scale.x = scale.y = 1.0f;
|
scale.x = scale.y = 1.0f;
|
||||||
break;
|
break;
|
||||||
case 2: /* 1x2 or 2x1 */
|
case 2: /* 1x2 or 2x1 */
|
||||||
width = org_job_data->getPhysicalRect().Width();
|
width = physicalRect.Width();
|
||||||
height = org_job_data->getPhysicalRect().Height();
|
height = physicalRect.Height();
|
||||||
if (width < height) { // portrait
|
if (width < height) { // portrait
|
||||||
scale.x = height / 2.0f / width;
|
scale.x = height / 2.0f / width;
|
||||||
scale.y = width / height;
|
scale.y = width / height;
|
||||||
@@ -184,8 +211,8 @@ BPoint get_scale(JobData *org_job_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8: /* 2x4 or 4x2 */
|
case 8: /* 2x4 or 4x2 */
|
||||||
width = org_job_data->getPhysicalRect().Width();
|
width = physicalRect.Width();
|
||||||
height = org_job_data->getPhysicalRect().Height();
|
height = physicalRect.Height();
|
||||||
if (width < height) {
|
if (width < height) {
|
||||||
scale.x = height / 4.0f / width;
|
scale.x = height / 4.0f / width;
|
||||||
scale.y = width / height / 2.0f;
|
scale.y = width / height / 2.0f;
|
||||||
@@ -195,8 +222,8 @@ BPoint get_scale(JobData *org_job_data)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 32: /* 4x8 or 8x4 */
|
case 32: /* 4x8 or 8x4 */
|
||||||
width = org_job_data->getPhysicalRect().Width();
|
width = physicalRect.Width();
|
||||||
height = org_job_data->getPhysicalRect().Height();
|
height = physicalRect.Height();
|
||||||
if (width < height) {
|
if (width < height) {
|
||||||
scale.x = height / 8.0f / width;
|
scale.x = height / 8.0f / width;
|
||||||
scale.y = width / height / 4.0f;
|
scale.y = width / height / 4.0f;
|
||||||
@@ -237,32 +264,30 @@ BPoint get_scale(JobData *org_job_data)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
scale.x = scale.x * org_job_data->getScaling() / 100.0;
|
scale.x = scale.x * scaling / 100.0;
|
||||||
scale.y = scale.y * org_job_data->getScaling() / 100.0;
|
scale.y = scale.y * scaling / 100.0;
|
||||||
|
|
||||||
DBGMSG(("real scale = %f, %f\n", scale.x, scale.y));
|
|
||||||
return scale;
|
return scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BPoint
|
BPoint
|
||||||
get_offset(
|
GraphicsDriver::getOffset(int32 nup, int index, JobData::Orientation orientation,
|
||||||
int index,
|
const BPoint *scale, BRect scaledPhysicalRect, BRect scaledPrintableRect,
|
||||||
const BPoint *scale,
|
BRect physicalRect)
|
||||||
JobData *org_job_data)
|
|
||||||
{
|
{
|
||||||
BPoint offset;
|
BPoint offset;
|
||||||
offset.x = 0;
|
offset.x = 0;
|
||||||
offset.y = 0;
|
offset.y = 0;
|
||||||
|
|
||||||
float width = org_job_data->getScaledPhysicalRect().Width();
|
float width = scaledPhysicalRect.Width();
|
||||||
float height = org_job_data->getScaledPhysicalRect().Height();
|
float height = scaledPhysicalRect.Height();
|
||||||
|
|
||||||
switch (org_job_data->getNup()) {
|
switch (nup) {
|
||||||
case 1:
|
case 1:
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
if (index == 1) {
|
if (index == 1) {
|
||||||
if (JobData::kPortrait == org_job_data->getOrientation()) {
|
if (JobData::kPortrait == orientation) {
|
||||||
offset.x = width;
|
offset.x = width;
|
||||||
} else {
|
} else {
|
||||||
offset.y = height;
|
offset.y = height;
|
||||||
@@ -270,7 +295,7 @@ get_offset(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8:
|
case 8:
|
||||||
if (JobData::kPortrait == org_job_data->getOrientation()) {
|
if (JobData::kPortrait == orientation) {
|
||||||
offset.x = width * (index / 2);
|
offset.x = width * (index / 2);
|
||||||
offset.y = height * (index % 2);
|
offset.y = height * (index % 2);
|
||||||
} else {
|
} else {
|
||||||
@@ -279,7 +304,7 @@ get_offset(
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
if (JobData::kPortrait == org_job_data->getOrientation()) {
|
if (JobData::kPortrait == orientation) {
|
||||||
offset.x = width * (index / 4);
|
offset.x = width * (index / 4);
|
||||||
offset.y = height * (index % 4);
|
offset.y = height * (index % 4);
|
||||||
} else {
|
} else {
|
||||||
@@ -330,10 +355,8 @@ get_offset(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// adjust margin
|
// adjust margin
|
||||||
offset.x += org_job_data->getScaledPrintableRect().left -
|
offset.x += scaledPrintableRect.left - physicalRect.left;
|
||||||
org_job_data->getPhysicalRect().left;
|
offset.y += scaledPrintableRect.top - physicalRect.top;
|
||||||
offset.y += org_job_data->getScaledPrintableRect().top -
|
|
||||||
org_job_data->getPhysicalRect().top;
|
|
||||||
|
|
||||||
float real_scale = min(scale->x, scale->y);
|
float real_scale = min(scale->x, scale->y);
|
||||||
if (real_scale != scale->x)
|
if (real_scale != scale->x)
|
||||||
@@ -348,7 +371,6 @@ get_offset(
|
|||||||
bool
|
bool
|
||||||
GraphicsDriver::printPage(PageDataList *pages)
|
GraphicsDriver::printPage(PageDataList *pages)
|
||||||
{
|
{
|
||||||
#ifndef USE_PREVIEW_FOR_DEBUG
|
|
||||||
BPoint offset;
|
BPoint offset;
|
||||||
offset.x = 0.0f;
|
offset.x = 0.0f;
|
||||||
offset.y = 0.0f;
|
offset.y = 0.0f;
|
||||||
@@ -364,8 +386,7 @@ GraphicsDriver::printPage(PageDataList *pages)
|
|||||||
fView->ConstrainClippingRegion(NULL);
|
fView->ConstrainClippingRegion(NULL);
|
||||||
fView->FillRect(fView->Bounds());
|
fView->FillRect(fView->Bounds());
|
||||||
|
|
||||||
|
BPoint scale = getScale(fOrgJobData->getNup(), fOrgJobData->getPhysicalRect(), fOrgJobData->getScaling());
|
||||||
BPoint scale = get_scale(fOrgJobData);
|
|
||||||
float real_scale = min(scale.x, scale.y) * fOrgJobData->getXres() / 72.0f;
|
float real_scale = min(scale.x, scale.y) * fOrgJobData->getXres() / 72.0f;
|
||||||
fView->SetScale(real_scale);
|
fView->SetScale(real_scale);
|
||||||
float x = offset.x / real_scale;
|
float x = offset.x / real_scale;
|
||||||
@@ -373,7 +394,7 @@ GraphicsDriver::printPage(PageDataList *pages)
|
|||||||
int page_index = 0;
|
int page_index = 0;
|
||||||
|
|
||||||
for (PageDataList::iterator it = pages->begin(); it != pages->end(); it++) {
|
for (PageDataList::iterator it = pages->begin(); it != pages->end(); it++) {
|
||||||
BPoint left_top(get_offset(page_index++, &scale, fOrgJobData));
|
BPoint left_top(getOffset(fOrgJobData->getNup(), page_index++, fOrgJobData->getOrientation(), &scale, fOrgJobData->getScaledPhysicalRect(), fOrgJobData->getScaledPrintableRect(), fOrgJobData->getPhysicalRect()));
|
||||||
left_top.x -= x;
|
left_top.x -= x;
|
||||||
left_top.y -= y;
|
left_top.y -= y;
|
||||||
BRect clip(fOrgJobData->getScaledPrintableRect());
|
BRect clip(fOrgJobData->getScaledPrintableRect());
|
||||||
@@ -398,45 +419,6 @@ GraphicsDriver::printPage(PageDataList *pages)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} while (offset.x >= 0.0f && offset.y >= 0.0f);
|
} while (offset.x >= 0.0f && offset.y >= 0.0f);
|
||||||
#else // !USE_PREVIEW_FOR_DEBUG
|
|
||||||
fView->SetScale(1.0);
|
|
||||||
fView->SetHighColor(255, 255, 255);
|
|
||||||
fView->ConstrainClippingRegion(NULL);
|
|
||||||
fView->FillRect(fView->Bounds());
|
|
||||||
|
|
||||||
BPoint scale = get_scale(fOrgJobData);
|
|
||||||
fView->SetScale(min(scale.x, scale.y));
|
|
||||||
|
|
||||||
int page_index = 0;
|
|
||||||
PageDataList::iterator it;
|
|
||||||
|
|
||||||
for (it = pages->begin() ; it != pages->end() ; it++) {
|
|
||||||
BPoint left_top(get_offset(page_index, &scale, fOrgJobData));
|
|
||||||
BRect clip(fOrgJobData->getScaledPrintableRect());
|
|
||||||
clip.OffsetTo(left_top);
|
|
||||||
BRegion *region = new BRegion();
|
|
||||||
region->Set(clip);
|
|
||||||
fView->ConstrainClippingRegion(region);
|
|
||||||
delete region;
|
|
||||||
if ((*it)->startEnum()) {
|
|
||||||
bool more;
|
|
||||||
do {
|
|
||||||
PictureData *picture_data;
|
|
||||||
more = (*it)->enumObject(&picture_data);
|
|
||||||
BPoint real_offset = left_top + picture_data->point;
|
|
||||||
fView->DrawPicture(picture_data->picture, real_offset);
|
|
||||||
fView->Sync();
|
|
||||||
delete picture_data;
|
|
||||||
} while (more);
|
|
||||||
}
|
|
||||||
page_index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
BRect rc(fRealJobData->getPhysicalRect());
|
|
||||||
rc.OffsetTo(30.0, 30.0);
|
|
||||||
PreviewWindow *preview = new PreviewWindow(rc, "Preview", fBitmap);
|
|
||||||
preview->Go();
|
|
||||||
#endif // USE_PREVIEW_FOR_DEBUG
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -484,6 +466,7 @@ GraphicsDriver::printDocument(SpoolData *spool_data)
|
|||||||
// send the page multiple times to the printer
|
// send the page multiple times to the printer
|
||||||
copies = fRealJobData->getCopies();
|
copies = fRealJobData->getCopies();
|
||||||
}
|
}
|
||||||
|
fStatusWindow -> SetPageCopies(copies); // inform fStatusWindow about number of copies
|
||||||
|
|
||||||
// printing of even/odd numbered pages only is valid in simplex mode
|
// printing of even/odd numbered pages only is valid in simplex mode
|
||||||
bool simplex = fRealJobData->getPrintStyle() == JobData::kSimplex;
|
bool simplex = fRealJobData->getPrintStyle() == JobData::kSimplex;
|
||||||
@@ -514,6 +497,11 @@ GraphicsDriver::printDocument(SpoolData *spool_data)
|
|||||||
|
|
||||||
// print each physical page "copies" of times
|
// print each physical page "copies" of times
|
||||||
for (copy = 0; success && copy < copies; copy ++) {
|
for (copy = 0; success && copy < copies; copy ++) {
|
||||||
|
|
||||||
|
// Update the status / cancel job
|
||||||
|
if (fStatusWindow->UpdateStatusBar(page_index, copy))
|
||||||
|
return false;
|
||||||
|
|
||||||
success = startPage(page_index);
|
success = startPage(page_index);
|
||||||
if (!success)
|
if (!success)
|
||||||
break;
|
break;
|
||||||
@@ -549,20 +537,19 @@ GraphicsDriver::printDocument(SpoolData *spool_data)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const JobData*
|
||||||
|
GraphicsDriver::getJobData(BFile *spoolFile)
|
||||||
|
{
|
||||||
|
setupData(spoolFile);
|
||||||
|
return fOrgJobData;
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
GraphicsDriver::printJob(BFile *spool_file)
|
GraphicsDriver::printJob(BFile *spool_file)
|
||||||
{
|
{
|
||||||
bool success = true;
|
bool success = true;
|
||||||
print_file_header pfh;
|
if (!setupData(spool_file)) {
|
||||||
|
// silently exit if there is nothing to print
|
||||||
spool_file->Seek(0, SEEK_SET);
|
|
||||||
spool_file->Read(&pfh, sizeof(pfh));
|
|
||||||
|
|
||||||
DBGMSG(("print_file_header::version = 0x%x\n", pfh.version));
|
|
||||||
DBGMSG(("print_file_header::page_count = %d\n", pfh.page_count));
|
|
||||||
DBGMSG(("print_file_header::first_page = 0x%x\n", (int)pfh.first_page));
|
|
||||||
|
|
||||||
if (pfh.page_count <= 0) {
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -571,11 +558,18 @@ GraphicsDriver::printJob(BFile *spool_file)
|
|||||||
if (fTransport->check_abort()) {
|
if (fTransport->check_abort()) {
|
||||||
success = false;
|
success = false;
|
||||||
} else if (!fTransport->is_print_to_file_canceled()) {
|
} else if (!fTransport->is_print_to_file_canceled()) {
|
||||||
setupData(spool_file, pfh.page_count);
|
BStopWatch stopWatch("printJob", !MEASURE_PRINT_JOB_TIME);
|
||||||
setupBitmap();
|
setupBitmap();
|
||||||
SpoolData spool_data(spool_file, pfh.page_count, fOrgJobData->getNup(), fOrgJobData->getReverse());
|
SpoolData spool_data(spool_file, fPageCount, fOrgJobData->getNup(), fOrgJobData->getReverse());
|
||||||
success = startDoc();
|
success = startDoc();
|
||||||
if (success) {
|
if (success) {
|
||||||
|
fStatusWindow = new StatusWindow(
|
||||||
|
fRealJobData->getPageSelection() == JobData::kOddNumberedPages,
|
||||||
|
fRealJobData->getPageSelection() == JobData::kEvenNumberedPages,
|
||||||
|
fRealJobData->getFirstPage(),
|
||||||
|
fPageCount,
|
||||||
|
fInternalCopies,fRealJobData->getNup());
|
||||||
|
|
||||||
while (fInternalCopies--) {
|
while (fInternalCopies--) {
|
||||||
success = printDocument(&spool_data);
|
success = printDocument(&spool_data);
|
||||||
if (success == false) {
|
if (success == false) {
|
||||||
@@ -583,6 +577,8 @@ GraphicsDriver::printJob(BFile *spool_file)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
endDoc(success);
|
endDoc(success);
|
||||||
|
|
||||||
|
fStatusWindow -> Quit();
|
||||||
}
|
}
|
||||||
cleanupBitmap();
|
cleanupBitmap();
|
||||||
cleanupData();
|
cleanupData();
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print libprint ] ;
|
|||||||
|
|
||||||
# for BeUtils.h
|
# for BeUtils.h
|
||||||
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print ] ;
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print ] ;
|
||||||
|
# for Utils.h, InterfaceUtils.h
|
||||||
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
StaticLibrary libprint.a :
|
StaticLibrary libprint.a :
|
||||||
AboutBox.cpp
|
AboutBox.cpp
|
||||||
@@ -18,7 +20,6 @@ StaticLibrary libprint.a :
|
|||||||
JSDSlider.cpp
|
JSDSlider.cpp
|
||||||
JobData.cpp
|
JobData.cpp
|
||||||
JobSetupDlg.cpp
|
JobSetupDlg.cpp
|
||||||
MarginView.cpp
|
|
||||||
PackBits.cpp
|
PackBits.cpp
|
||||||
PageSetupDlg.cpp
|
PageSetupDlg.cpp
|
||||||
PagesView.cpp
|
PagesView.cpp
|
||||||
@@ -28,6 +29,7 @@ StaticLibrary libprint.a :
|
|||||||
PrinterCap.cpp
|
PrinterCap.cpp
|
||||||
PrintProcess.cpp
|
PrintProcess.cpp
|
||||||
SpoolMetaData.cpp
|
SpoolMetaData.cpp
|
||||||
|
StatusWindow.cpp
|
||||||
Transport.cpp
|
Transport.cpp
|
||||||
UIDriver.cpp
|
UIDriver.cpp
|
||||||
ValidRect.cpp
|
ValidRect.cpp
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ static const char *kJDScaledPrintableRect = "printable_rect";
|
|||||||
static const char *kJDFirstPage = "first_page";
|
static const char *kJDFirstPage = "first_page";
|
||||||
static const char *kJDLastPage = "last_page";
|
static const char *kJDLastPage = "last_page";
|
||||||
|
|
||||||
|
static const char *kJDShowPreview = "JJJJ_showPreview";
|
||||||
static const char *kJDPaper = "JJJJ_paper";
|
static const char *kJDPaper = "JJJJ_paper";
|
||||||
static const char *kJDNup = "JJJJ_nup";
|
static const char *kJDNup = "JJJJ_nup";
|
||||||
static const char *kJDGamma = "JJJJ_gamma";
|
static const char *kJDGamma = "JJJJ_gamma";
|
||||||
@@ -49,6 +50,7 @@ JobData::~JobData()
|
|||||||
|
|
||||||
JobData::JobData(const JobData &job_data)
|
JobData::JobData(const JobData &job_data)
|
||||||
{
|
{
|
||||||
|
fShowPreview = job_data.fShowPreview;
|
||||||
fPaper = job_data.fPaper;
|
fPaper = job_data.fPaper;
|
||||||
fXRes = job_data.fXRes;
|
fXRes = job_data.fXRes;
|
||||||
fYRes = job_data.fYRes;
|
fYRes = job_data.fYRes;
|
||||||
@@ -82,6 +84,7 @@ JobData::JobData(const JobData &job_data)
|
|||||||
|
|
||||||
JobData &JobData::operator = (const JobData &job_data)
|
JobData &JobData::operator = (const JobData &job_data)
|
||||||
{
|
{
|
||||||
|
fShowPreview = job_data.fShowPreview;
|
||||||
fPaper = job_data.fPaper;
|
fPaper = job_data.fPaper;
|
||||||
fXRes = job_data.fXRes;
|
fXRes = job_data.fXRes;
|
||||||
fYRes = job_data.fYRes;
|
fYRes = job_data.fYRes;
|
||||||
@@ -121,6 +124,11 @@ void JobData::load(BMessage *msg, const PrinterCap *cap, Settings settings)
|
|||||||
|
|
||||||
const PaperCap *paperCap = NULL;
|
const PaperCap *paperCap = NULL;
|
||||||
|
|
||||||
|
if (msg->HasBool(kJDShowPreview))
|
||||||
|
fShowPreview = msg->FindBool(kJDShowPreview);
|
||||||
|
else
|
||||||
|
fShowPreview = false;
|
||||||
|
|
||||||
if (msg->HasInt32(kJDPaper))
|
if (msg->HasInt32(kJDPaper))
|
||||||
fPaper = (Paper)msg->FindInt32(kJDPaper);
|
fPaper = (Paper)msg->FindInt32(kJDPaper);
|
||||||
else if (cap->isSupport(PrinterCap::kPaper)) {
|
else if (cap->isSupport(PrinterCap::kPaper)) {
|
||||||
@@ -263,8 +271,10 @@ void JobData::load(BMessage *msg, const PrinterCap *cap, Settings settings)
|
|||||||
else
|
else
|
||||||
fPageOrder = kAcrossFromLeft;
|
fPageOrder = kAcrossFromLeft;
|
||||||
|
|
||||||
if (msg->HasBool(kJDColor))
|
if (msg->HasInt32(kJDColor))
|
||||||
fColor = msg->FindBool(kJDColor) ? kColor : kMonochrome;
|
fColor = (Color)msg->FindInt32(kJDColor);
|
||||||
|
else if (cap->isSupport(PrinterCap::kColor))
|
||||||
|
fColor = ((const ColorCap *)cap->getDefaultCap(PrinterCap::kColor))->color;
|
||||||
else
|
else
|
||||||
fColor = kMonochrome;
|
fColor = kMonochrome;
|
||||||
|
|
||||||
@@ -291,142 +301,108 @@ void JobData::save(BMessage *msg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// page settings
|
// page settings
|
||||||
if (msg->HasInt32(kJDPaper))
|
msg->RemoveName(kJDPaper);
|
||||||
msg->ReplaceInt32(kJDPaper, fPaper);
|
|
||||||
else
|
|
||||||
msg->AddInt32(kJDPaper, fPaper);
|
msg->AddInt32(kJDPaper, fPaper);
|
||||||
|
|
||||||
if (msg->HasInt64(kJDXRes))
|
msg->RemoveName(kJDXRes);
|
||||||
msg->ReplaceInt64(kJDXRes, fXRes);
|
|
||||||
else
|
|
||||||
msg->AddInt64(kJDXRes, fXRes);
|
msg->AddInt64(kJDXRes, fXRes);
|
||||||
|
|
||||||
if (msg->HasInt64(kJDYRes))
|
msg->RemoveName(kJDYRes);
|
||||||
msg->ReplaceInt64(kJDYRes, fYRes);
|
|
||||||
else
|
|
||||||
msg->AddInt64(kJDYRes, fYRes);
|
msg->AddInt64(kJDYRes, fYRes);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDOrientation))
|
msg->RemoveName(kJDOrientation);
|
||||||
msg->ReplaceInt32(kJDOrientation, fOrientation);
|
|
||||||
else
|
|
||||||
msg->AddInt32(kJDOrientation, fOrientation);
|
msg->AddInt32(kJDOrientation, fOrientation);
|
||||||
|
|
||||||
if (msg->HasFloat(kJDScaling))
|
msg->RemoveName(kJDScaling);
|
||||||
msg->ReplaceFloat(kJDScaling, fScaling);
|
|
||||||
else
|
|
||||||
msg->AddFloat(kJDScaling, fScaling);
|
msg->AddFloat(kJDScaling, fScaling);
|
||||||
|
|
||||||
if (msg->HasRect(kJDPaperRect))
|
msg->RemoveName(kJDPaperRect);
|
||||||
msg->ReplaceRect(kJDPaperRect, fPaperRect);
|
|
||||||
else
|
|
||||||
msg->AddRect(kJDPaperRect, fPaperRect);
|
msg->AddRect(kJDPaperRect, fPaperRect);
|
||||||
|
|
||||||
if (msg->HasRect(kJDScaledPaperRect))
|
msg->RemoveName(kJDScaledPaperRect);
|
||||||
msg->ReplaceRect(kJDScaledPaperRect, fScaledPaperRect);
|
|
||||||
else
|
|
||||||
msg->AddRect(kJDScaledPaperRect, fScaledPaperRect);
|
msg->AddRect(kJDScaledPaperRect, fScaledPaperRect);
|
||||||
|
|
||||||
if (msg->HasRect(kJDPrintableRect))
|
msg->RemoveName(kJDPrintableRect);
|
||||||
msg->ReplaceRect(kJDPrintableRect, fPrintableRect);
|
|
||||||
else
|
|
||||||
msg->AddRect(kJDPrintableRect, fPrintableRect);
|
msg->AddRect(kJDPrintableRect, fPrintableRect);
|
||||||
|
|
||||||
if (msg->HasRect(kJDScaledPrintableRect))
|
msg->RemoveName(kJDScaledPrintableRect);
|
||||||
msg->ReplaceRect(kJDScaledPrintableRect, fScaledPrintableRect);
|
|
||||||
else
|
|
||||||
msg->AddRect(kJDScaledPrintableRect, fScaledPrintableRect);
|
msg->AddRect(kJDScaledPrintableRect, fScaledPrintableRect);
|
||||||
|
|
||||||
if (msg->HasRect(kJDPhysicalRect))
|
msg->RemoveName(kJDPhysicalRect);
|
||||||
msg->ReplaceRect(kJDPhysicalRect, fPhysicalRect);
|
|
||||||
else
|
|
||||||
msg->AddRect(kJDPhysicalRect, fPhysicalRect);
|
msg->AddRect(kJDPhysicalRect, fPhysicalRect);
|
||||||
|
|
||||||
if (msg->HasRect(kJDScaledPhysicalRect))
|
msg->RemoveName(kJDScaledPhysicalRect);
|
||||||
msg->ReplaceRect(kJDScaledPhysicalRect, fScaledPhysicalRect);
|
|
||||||
else
|
|
||||||
msg->AddRect(kJDScaledPhysicalRect, fScaledPhysicalRect);
|
msg->AddRect(kJDScaledPhysicalRect, fScaledPhysicalRect);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDMarginUnit))
|
msg->RemoveName(kJDMarginUnit);
|
||||||
msg->ReplaceInt32(kJDMarginUnit, fMarginUnit);
|
|
||||||
else
|
|
||||||
msg->AddInt32(kJDMarginUnit, fMarginUnit);
|
msg->AddInt32(kJDMarginUnit, fMarginUnit);
|
||||||
|
|
||||||
// page settings end here; don't store job settings in message
|
// page settings end here
|
||||||
if (fSettings == kPageSettings) return;
|
|
||||||
|
|
||||||
// job settings
|
// job settings
|
||||||
if (msg->HasInt32(kJDNup))
|
|
||||||
msg->ReplaceInt32(kJDNup, fNup);
|
// make sure job settings are not present in page settings
|
||||||
else
|
msg->RemoveName(kJDShowPreview);
|
||||||
|
if (fSettings == kJobSettings)
|
||||||
|
msg->AddBool(kJDShowPreview, fShowPreview);
|
||||||
|
|
||||||
|
msg->RemoveName(kJDNup);
|
||||||
|
if (fSettings == kJobSettings)
|
||||||
msg->AddInt32(kJDNup, fNup);
|
msg->AddInt32(kJDNup, fNup);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDFirstPage))
|
msg->RemoveName(kJDFirstPage);
|
||||||
msg->ReplaceInt32(kJDFirstPage, fFirstPage);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDFirstPage, fFirstPage);
|
msg->AddInt32(kJDFirstPage, fFirstPage);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDLastPage))
|
msg->RemoveName(kJDLastPage);
|
||||||
msg->ReplaceInt32(kJDLastPage, fLastPage);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDLastPage, fLastPage);
|
msg->AddInt32(kJDLastPage, fLastPage);
|
||||||
|
|
||||||
if (msg->HasFloat(kJDGamma))
|
msg->RemoveName(kJDGamma);
|
||||||
msg->ReplaceFloat(kJDGamma, fGamma);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddFloat(kJDGamma, fGamma);
|
msg->AddFloat(kJDGamma, fGamma);
|
||||||
|
|
||||||
if (msg->HasFloat(kJDInkDensity))
|
msg->RemoveName(kJDInkDensity);
|
||||||
msg->ReplaceFloat(kJDInkDensity, fInkDensity);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddFloat(kJDInkDensity, fInkDensity);
|
msg->AddFloat(kJDInkDensity, fInkDensity);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDPaperSource))
|
msg->RemoveName(kJDPaperSource);
|
||||||
msg->ReplaceInt32(kJDPaperSource, fPaperSource);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDPaperSource, fPaperSource);
|
msg->AddInt32(kJDPaperSource, fPaperSource);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDCopies))
|
msg->RemoveName(kJDCopies);
|
||||||
msg->ReplaceInt32(kJDCopies, fCopies);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDCopies, fCopies);
|
msg->AddInt32(kJDCopies, fCopies);
|
||||||
|
|
||||||
if (msg->HasBool(kJDCollate))
|
msg->RemoveName(kJDCollate);
|
||||||
msg->ReplaceBool(kJDCollate, fCollate);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddBool(kJDCollate, fCollate);
|
msg->AddBool(kJDCollate, fCollate);
|
||||||
|
|
||||||
if (msg->HasBool(kJDReverse))
|
msg->RemoveName(kJDReverse);
|
||||||
msg->ReplaceBool(kJDReverse, fReverse);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddBool(kJDReverse, fReverse);
|
msg->AddBool(kJDReverse, fReverse);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDPrintStyle))
|
msg->RemoveName(kJDPrintStyle);
|
||||||
msg->ReplaceInt32(kJDPrintStyle, fPrintStyle);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDPrintStyle, fPrintStyle);
|
msg->AddInt32(kJDPrintStyle, fPrintStyle);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDBindingLocation))
|
msg->RemoveName(kJDBindingLocation);
|
||||||
msg->ReplaceInt32(kJDBindingLocation, fBindingLocation);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDBindingLocation, fBindingLocation);
|
msg->AddInt32(kJDBindingLocation, fBindingLocation);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDPageOrder))
|
msg->RemoveName(kJDPageOrder);
|
||||||
msg->ReplaceInt32(kJDPageOrder, fPageOrder);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDPageOrder, fPageOrder);
|
msg->AddInt32(kJDPageOrder, fPageOrder);
|
||||||
|
|
||||||
if (msg->HasBool(kJDColor))
|
msg->RemoveName(kJDColor);
|
||||||
msg->ReplaceBool(kJDColor, fColor == kColor);
|
if (fSettings == kJobSettings)
|
||||||
else
|
msg->AddInt32(kJDColor, fColor);
|
||||||
msg->AddBool(kJDColor, fColor == kColor);
|
|
||||||
|
|
||||||
if (msg->HasInt32(kJDDitherType))
|
msg->RemoveName(kJDDitherType);
|
||||||
msg->ReplaceInt32(kJDDitherType, fDitherType);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDDitherType, fDitherType);
|
msg->AddInt32(kJDDitherType, fDitherType);
|
||||||
|
|
||||||
if (msg->HasInt32(kJDPageSelection))
|
msg->RemoveName(kJDPageSelection);
|
||||||
msg->ReplaceInt32(kJDPageSelection, fPageSelection);
|
if (fSettings == kJobSettings)
|
||||||
else
|
|
||||||
msg->AddInt32(kJDPageSelection, fPageSelection);
|
msg->AddInt32(kJDPageSelection, fPageSelection);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ using namespace std;
|
|||||||
#define TO_HEIGHT FROM_HEIGHT
|
#define TO_HEIGHT FROM_HEIGHT
|
||||||
|
|
||||||
#define PRINT_WIDTH 365
|
#define PRINT_WIDTH 365
|
||||||
#define PRINT_HEIGHT QUALITY_HEIGHT + PAGERABGE_HEIGHT + 20 // 210
|
#define PRINT_HEIGHT QUALITY_HEIGHT + PAGERABGE_HEIGHT + 60
|
||||||
|
|
||||||
#define PAPERFEED_H QUALITY_H + QUALITY_WIDTH + 10
|
#define PAPERFEED_H QUALITY_H + QUALITY_WIDTH + 10
|
||||||
#define PAPERFEED_V QUALITY_V + 5
|
#define PAPERFEED_V QUALITY_V + 5
|
||||||
@@ -173,7 +173,10 @@ using namespace std;
|
|||||||
#define PRINT_OK_BUTTON_H (PRINT_WIDTH - PRINT_BUTTON_WIDTH - 10)
|
#define PRINT_OK_BUTTON_H (PRINT_WIDTH - PRINT_BUTTON_WIDTH - 10)
|
||||||
#define PRINT_OK_BUTTON_V (PRINT_HEIGHT - PRINT_BUTTON_HEIGHT - 11)
|
#define PRINT_OK_BUTTON_V (PRINT_HEIGHT - PRINT_BUTTON_HEIGHT - 11)
|
||||||
|
|
||||||
#define PRINT_CANCEL_BUTTON_H (PRINT_OK_BUTTON_H - PRINT_BUTTON_WIDTH - 12)
|
#define PREVIEW_H (PRINT_OK_BUTTON_H - PRINT_BUTTON_WIDTH - 12)
|
||||||
|
#define PREVIEW_V (PRINT_OK_BUTTON_V)
|
||||||
|
|
||||||
|
#define PRINT_CANCEL_BUTTON_H (PREVIEW_H - PRINT_BUTTON_WIDTH - 12)
|
||||||
#define PRINT_CANCEL_BUTTON_V PRINT_OK_BUTTON_V
|
#define PRINT_CANCEL_BUTTON_V PRINT_OK_BUTTON_V
|
||||||
|
|
||||||
const BRect quality_rect(
|
const BRect quality_rect(
|
||||||
@@ -320,6 +323,14 @@ const BRect cancel_rect(
|
|||||||
PRINT_CANCEL_BUTTON_H + PRINT_BUTTON_WIDTH,
|
PRINT_CANCEL_BUTTON_H + PRINT_BUTTON_WIDTH,
|
||||||
PRINT_CANCEL_BUTTON_V + PRINT_BUTTON_HEIGHT);
|
PRINT_CANCEL_BUTTON_V + PRINT_BUTTON_HEIGHT);
|
||||||
|
|
||||||
|
const BRect preview_rect(
|
||||||
|
PREVIEW_H,
|
||||||
|
PREVIEW_V,
|
||||||
|
PREVIEW_H + PRINT_BUTTON_WIDTH,
|
||||||
|
PREVIEW_V + PRINT_BUTTON_HEIGHT);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct SurfaceCap : public BaseCap {
|
struct SurfaceCap : public BaseCap {
|
||||||
color_space surface_type;
|
color_space surface_type;
|
||||||
SurfaceCap(const string &s, bool d, color_space cs) : BaseCap(s, d), surface_type(cs) {}
|
SurfaceCap(const string &s, bool d, color_space cs) : BaseCap(s, d), surface_type(cs) {}
|
||||||
@@ -384,6 +395,7 @@ const DitherCap *gDitherTypes[] = {
|
|||||||
enum {
|
enum {
|
||||||
kMsgRangeAll = 'JSdl',
|
kMsgRangeAll = 'JSdl',
|
||||||
kMsgRangeSelection,
|
kMsgRangeSelection,
|
||||||
|
kMsgPreview,
|
||||||
kMsgCancel,
|
kMsgCancel,
|
||||||
kMsgOK,
|
kMsgOK,
|
||||||
kMsgQuality,
|
kMsgQuality,
|
||||||
@@ -525,7 +537,7 @@ JobSetupView::AttachedToWindow()
|
|||||||
|
|
||||||
fHalftone = new HalftoneView(rect.OffsetToCopy(1, 1), "halftone", B_FOLLOW_ALL, B_WILL_DRAW);
|
fHalftone = new HalftoneView(rect.OffsetToCopy(1, 1), "halftone", B_FOLLOW_ALL, B_WILL_DRAW);
|
||||||
halftoneBorder->AddChild(fHalftone);
|
halftoneBorder->AddChild(fHalftone);
|
||||||
fHalftone->preview(fJobData->getGamma(), fJobData->getInkDensity(), fJobData->getDitherType(), fJobData->getColor() == JobData::kColor);
|
fHalftone->preview(fJobData->getGamma(), fJobData->getInkDensity(), fJobData->getDitherType(), fJobData->getColor() != JobData::kMonochrome);
|
||||||
|
|
||||||
/* gamma */
|
/* gamma */
|
||||||
fGamma = new JSDSlider(gamma_rect, "gamma", "Gamma", new BMessage(kMsgQuality), -300, 300, B_BLOCK_THUMB);
|
fGamma = new JSDSlider(gamma_rect, "gamma", "Gamma", new BMessage(kMsgQuality), -300, 300, B_BLOCK_THUMB);
|
||||||
@@ -702,6 +714,14 @@ JobSetupView::AttachedToWindow()
|
|||||||
fOddNumberedPages = AddPageSelectionItem(pageSelectionBox, page_selection_odd_pages_rect, "oddPages", "Odd-Numbered Pages", JobData::kOddNumberedPages);
|
fOddNumberedPages = AddPageSelectionItem(pageSelectionBox, page_selection_odd_pages_rect, "oddPages", "Odd-Numbered Pages", JobData::kOddNumberedPages);
|
||||||
fEvenNumberedPages = AddPageSelectionItem(pageSelectionBox, page_selection_even_pages_rect, "evenPages", "Even-Numbered Pages", JobData::kEvenNumberedPages);
|
fEvenNumberedPages = AddPageSelectionItem(pageSelectionBox, page_selection_even_pages_rect, "evenPages", "Even-Numbered Pages", JobData::kEvenNumberedPages);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* preview */
|
||||||
|
|
||||||
|
button = new BButton(preview_rect, "preview", "Preview ...", new BMessage(kMsgPreview));
|
||||||
|
AddChild(button);
|
||||||
|
|
||||||
|
|
||||||
/* cancel */
|
/* cancel */
|
||||||
|
|
||||||
button = new BButton(cancel_rect, "cancel", "Cancel", new BMessage(kMsgCancel));
|
button = new BButton(cancel_rect, "cancel", "Cancel", new BMessage(kMsgCancel));
|
||||||
@@ -709,6 +729,7 @@ JobSetupView::AttachedToWindow()
|
|||||||
|
|
||||||
/* ok */
|
/* ok */
|
||||||
|
|
||||||
|
// TODO OK or "Print"?
|
||||||
button = new BButton(ok_rect, "ok", "OK", new BMessage(kMsgOK));
|
button = new BButton(ok_rect, "ok", "OK", new BMessage(kMsgOK));
|
||||||
AddChild(button);
|
AddChild(button);
|
||||||
button->MakeDefault(true);
|
button->MakeDefault(true);
|
||||||
@@ -741,7 +762,7 @@ JobSetupView::MessageReceived(BMessage *msg)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case kMsgQuality:
|
case kMsgQuality:
|
||||||
fHalftone->preview(getGamma(), getInkDensity(), getDitherType(), getColor() == JobData::kColor);
|
fHalftone->preview(getGamma(), getInkDensity(), getDitherType(), getColor() != JobData::kMonochrome);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case kMsgCollateChanged:
|
case kMsgCollateChanged:
|
||||||
@@ -799,7 +820,7 @@ JobSetupView::getInkDensity()
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
JobSetupView::UpdateJobData()
|
JobSetupView::UpdateJobData(bool showPreview)
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
@@ -815,6 +836,7 @@ JobSetupView::UpdateJobData()
|
|||||||
surface_cap++;
|
surface_cap++;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
fJobData->setShowPreview(showPreview);
|
||||||
fJobData->setColor(getColor());
|
fJobData->setColor(getColor());
|
||||||
fJobData->setGamma(getGamma());
|
fJobData->setGamma(getGamma());
|
||||||
fJobData->setInkDensity(getInkDensity());
|
fJobData->setInkDensity(getInkDensity());
|
||||||
@@ -895,7 +917,8 @@ JobSetupDlg::MessageReceived(BMessage *msg)
|
|||||||
{
|
{
|
||||||
switch (msg->what) {
|
switch (msg->what) {
|
||||||
case kMsgOK:
|
case kMsgOK:
|
||||||
fJobSetup->UpdateJobData();
|
case kMsgPreview:
|
||||||
|
fJobSetup->UpdateJobData(msg->what == kMsgPreview);
|
||||||
SetResult(B_NO_ERROR);
|
SetResult(B_NO_ERROR);
|
||||||
PostMessage(B_QUIT_REQUESTED);
|
PostMessage(B_QUIT_REQUESTED);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -354,10 +354,20 @@ PageSetupView::UpdateJobData()
|
|||||||
resolution_cap++;
|
resolution_cap++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rotate paper and physical rectangle if landscape orientation
|
||||||
|
if (JobData::kLandscape == fJobData->getOrientation()) {
|
||||||
|
swap(&paper_rect.left, &paper_rect.top);
|
||||||
|
swap(&paper_rect.right, &paper_rect.bottom);
|
||||||
|
swap(&physical_rect.left, &physical_rect.top);
|
||||||
|
swap(&physical_rect.right, &physical_rect.bottom);
|
||||||
|
}
|
||||||
|
|
||||||
// adjust printable rect by margin
|
// adjust printable rect by margin
|
||||||
fJobData->setMarginUnit(fMarginView->GetMarginUnit());
|
fJobData->setMarginUnit(fMarginView->GetMarginUnit());
|
||||||
BRect margin = fMarginView->GetMargin();
|
BRect margin = fMarginView->GetMargin();
|
||||||
BRect printable_rect = margin;
|
BRect printable_rect;
|
||||||
|
printable_rect.left = paper_rect.left + margin.left;
|
||||||
|
printable_rect.top = paper_rect.top + margin.top;
|
||||||
printable_rect.right = paper_rect.right - margin.right;
|
printable_rect.right = paper_rect.right - margin.right;
|
||||||
printable_rect.bottom = paper_rect.bottom - margin.bottom;
|
printable_rect.bottom = paper_rect.bottom - margin.bottom;
|
||||||
|
|
||||||
@@ -366,16 +376,6 @@ PageSetupView::UpdateJobData()
|
|||||||
printable_rect.right = min_c(printable_rect.right, physical_rect.right);
|
printable_rect.right = min_c(printable_rect.right, physical_rect.right);
|
||||||
printable_rect.bottom = min_c(printable_rect.bottom, physical_rect.bottom);
|
printable_rect.bottom = min_c(printable_rect.bottom, physical_rect.bottom);
|
||||||
|
|
||||||
|
|
||||||
if (JobData::kLandscape == fJobData->getOrientation()) {
|
|
||||||
swap(&paper_rect.left, &paper_rect.top);
|
|
||||||
swap(&paper_rect.right, &paper_rect.bottom);
|
|
||||||
swap(&printable_rect.left, &printable_rect.top);
|
|
||||||
swap(&printable_rect.right, &printable_rect.bottom);
|
|
||||||
swap(&physical_rect.left, &physical_rect.top);
|
|
||||||
swap(&physical_rect.right, &physical_rect.bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
float scaling = atoi(fScaling->Text());
|
float scaling = atoi(fScaling->Text());
|
||||||
if (scaling <= 0.0) { // sanity check
|
if (scaling <= 0.0) { // sanity check
|
||||||
scaling = 100.0;
|
scaling = 100.0;
|
||||||
@@ -427,11 +427,6 @@ PageSetupDlg::PageSetupDlg(JobData *job_data, PrinterData *printer_data, const P
|
|||||||
"Page Setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
|
"Page Setup", B_TITLED_WINDOW_LOOK, B_MODAL_APP_WINDOW_FEEL,
|
||||||
B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE)
|
B_NOT_RESIZABLE | B_NOT_MINIMIZABLE | B_NOT_ZOOMABLE)
|
||||||
{
|
{
|
||||||
/*
|
|
||||||
ostringstream oss;
|
|
||||||
oss << printer_data->get_printer_name() << " Setup";
|
|
||||||
SetTitle(title.str().c_str());
|
|
||||||
*/
|
|
||||||
AddShortcut('W',B_COMMAND_KEY,new BMessage(B_QUIT_REQUESTED));
|
AddShortcut('W',B_COMMAND_KEY,new BMessage(B_QUIT_REQUESTED));
|
||||||
|
|
||||||
PageSetupView *view = new PageSetupView(Bounds(), job_data, printer_data, printer_cap);
|
PageSetupView *view = new PageSetupView(Bounds(), job_data, printer_data, printer_cap);
|
||||||
|
|||||||
@@ -1,53 +1,619 @@
|
|||||||
/*
|
/*
|
||||||
* Preview.cpp
|
* Copyright 2002-2007, Haiku. All rights reserved.
|
||||||
* Copyright 1999-2000 Y.Takagi. All Rights Reserved.
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Michael Pfeiffer
|
||||||
|
* Hartmut Reh
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <View.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <Debug.h>
|
||||||
|
#include <String.h>
|
||||||
|
#include "BeUtils.h"
|
||||||
|
#include "Utils.h"
|
||||||
|
|
||||||
|
#include "GraphicsDriver.h"
|
||||||
#include "Preview.h"
|
#include "Preview.h"
|
||||||
|
|
||||||
#ifdef USE_PREVIEW_FOR_DEBUG
|
// Implementation of PreviewPage
|
||||||
|
PreviewPage::PreviewPage(int32 page, PrintJobPage* pjp)
|
||||||
class PreviewView : public BView {
|
: fPage(page)
|
||||||
public:
|
, fPictures(NULL)
|
||||||
PreviewView(BRect, BBitmap *);
|
, fPoints(NULL)
|
||||||
void Draw(BRect);
|
, fRects(NULL)
|
||||||
private:
|
|
||||||
BBitmap *fBitmap;
|
|
||||||
};
|
|
||||||
|
|
||||||
PreviewView::PreviewView(BRect frame, BBitmap *bitmap)
|
|
||||||
: BView(frame, "preview", B_FOLLOW_ALL, B_WILL_DRAW)
|
|
||||||
{
|
{
|
||||||
fBitmap = bitmap;
|
fNumberOfPictures = pjp->NumberOfPictures();
|
||||||
|
fPictures = new BPicture[fNumberOfPictures];
|
||||||
|
fPoints = new BPoint[fNumberOfPictures];
|
||||||
|
fRects = new BRect[fNumberOfPictures];
|
||||||
|
status_t rc = B_ERROR;
|
||||||
|
for (int32 i = 0; i < fNumberOfPictures &&
|
||||||
|
(rc = pjp->NextPicture(fPictures[i], fPoints[i], fRects[i])) == B_OK; i ++);
|
||||||
|
fStatus = rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PreviewView::Draw(BRect)
|
PreviewPage::~PreviewPage() {
|
||||||
{
|
delete []fPictures;
|
||||||
DrawBitmap(fBitmap);
|
delete []fPoints;
|
||||||
|
delete []fRects;
|
||||||
}
|
}
|
||||||
|
|
||||||
PreviewWindow::PreviewWindow(BRect frame, const char *title, BBitmap *bitmap)
|
status_t PreviewPage::InitCheck() const {
|
||||||
: BWindow(frame, title, B_TITLED_WINDOW, 0)
|
return fStatus;
|
||||||
{
|
|
||||||
AddChild(new PreviewView(Bounds(), bitmap));
|
|
||||||
fSemaphore = create_sem(0, "PreviewSem");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PreviewWindow::QuitRequested()
|
void PreviewPage::Draw(BView* view)
|
||||||
{
|
{
|
||||||
release_sem(fSemaphore);
|
ASSERT(fStatus == B_OK);
|
||||||
return true;
|
for (int32 i = 0; i < fNumberOfPictures; i ++)
|
||||||
|
{
|
||||||
|
view->DrawPicture(&fPictures[i], fPoints[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int PreviewWindow::Go()
|
// Implementation of PreviewView
|
||||||
|
|
||||||
|
const float kPreviewTopMargin = 10;
|
||||||
|
const float kPreviewBottomMargin = 30;
|
||||||
|
const float kPreviewLeftMargin = 10;
|
||||||
|
const float kPreviewRightMargin = 30;
|
||||||
|
|
||||||
|
// TODO share constant with JobData
|
||||||
|
static const char *kJDOrientation = "orientation";
|
||||||
|
static const char *kJDNup = "JJJJ_nup";
|
||||||
|
static const char *kJDReverse = "JJJJ_reverse";
|
||||||
|
static const char* kJDPageSelection = "JJJJ_page_selection";
|
||||||
|
|
||||||
|
static BRect RotateRect(BRect rect)
|
||||||
{
|
{
|
||||||
Show();
|
BRect rotated(rect.top, rect.left, rect.bottom, rect.right);
|
||||||
acquire_sem(fSemaphore);
|
return rotated;
|
||||||
delete_sem(fSemaphore);
|
}
|
||||||
Lock();
|
|
||||||
|
PreviewView::PreviewView(BFile* jobFile, BRect rect)
|
||||||
|
: BView(rect, "PreviewView", B_FOLLOW_ALL, B_WILL_DRAW | B_FRAME_EVENTS)
|
||||||
|
, fPage(0)
|
||||||
|
, fZoom(0)
|
||||||
|
, fReader(jobFile)
|
||||||
|
, fNumberOfPagesPerPage(1)
|
||||||
|
, fReverse(false)
|
||||||
|
, fOrientation(JobData::kPortrait)
|
||||||
|
, fPageSelection(JobData::kAllPages)
|
||||||
|
, fCachedPage(NULL)
|
||||||
|
{
|
||||||
|
int32 value32;
|
||||||
|
if (fReader.JobSettings()->FindInt32(kJDOrientation, &value32) == B_OK) {
|
||||||
|
fOrientation = (JobData::Orientation)value32;
|
||||||
|
}
|
||||||
|
if (fReader.JobSettings()->FindInt32(kJDPageSelection, &value32) == B_OK) {
|
||||||
|
fPageSelection = (JobData::PageSelection)value32;
|
||||||
|
}
|
||||||
|
fReader.JobSettings()->FindInt32(kJDNup, &fNumberOfPagesPerPage);
|
||||||
|
fReader.JobSettings()->FindBool(kJDReverse, &fReverse);
|
||||||
|
fNumberOfPages = (fReader.NumberOfPages() + fNumberOfPagesPerPage - 1) / fNumberOfPagesPerPage;
|
||||||
|
if (fPageSelection == JobData::kOddNumberedPages) {
|
||||||
|
fNumberOfPages = (fNumberOfPages + 1) / 2;
|
||||||
|
}
|
||||||
|
else if (fPageSelection == JobData::kEvenNumberedPages) {
|
||||||
|
fNumberOfPages /= 2;
|
||||||
|
}
|
||||||
|
fPageRect = fReader.PaperRect();
|
||||||
|
switch (fNumberOfPagesPerPage) {
|
||||||
|
case 2:
|
||||||
|
case 8:
|
||||||
|
case 32:
|
||||||
|
case 128:
|
||||||
|
fPageRect = RotateRect(fPageRect);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
PreviewView::~PreviewView() {
|
||||||
|
delete fCachedPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns 2 ^ fZoom
|
||||||
|
float PreviewView::ZoomFactor() const {
|
||||||
|
const int32 b = 4;
|
||||||
|
int32 zoom;
|
||||||
|
if (fZoom > 0) {
|
||||||
|
zoom = (1 << b) << fZoom;
|
||||||
|
} else {
|
||||||
|
zoom = (1 << b) >> -fZoom;
|
||||||
|
}
|
||||||
|
float factor = zoom / (float)(1 << b);
|
||||||
|
return factor * fReader.GetScale() / 100.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BRect PreviewView::PageRect() const {
|
||||||
|
float f = ZoomFactor();
|
||||||
|
BRect r(fPageRect);
|
||||||
|
return ScaleRect(r, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
BRect PreviewView::PrintableRect() const {
|
||||||
|
float f = ZoomFactor();
|
||||||
|
BRect r = fReader.PrintableRect();
|
||||||
|
return ScaleRect(r, f);
|
||||||
|
}
|
||||||
|
|
||||||
|
BRect PreviewView::ViewRect() const {
|
||||||
|
BRect r(PageRect());
|
||||||
|
r.right += kPreviewLeftMargin + kPreviewRightMargin;
|
||||||
|
r.bottom += kPreviewTopMargin + kPreviewBottomMargin;
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t PreviewView::InitCheck() const {
|
||||||
|
return fReader.InitCheck();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PreviewView::IsPageLoaded(int32 page) const {
|
||||||
|
return fCachedPage != NULL && fCachedPage->Page() == page;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PreviewView::IsPageValid() const {
|
||||||
|
return fCachedPage && fCachedPage->InitCheck() == B_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::LoadPage(int32 page) {
|
||||||
|
delete fCachedPage;
|
||||||
|
fCachedPage = NULL;
|
||||||
|
PrintJobPage pjp;
|
||||||
|
if (fReader.GetPage(page, pjp) == B_OK) {
|
||||||
|
fCachedPage = new PreviewPage(page, &pjp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::DrawPageFrame(BRect rect) {
|
||||||
|
const float kShadowIndent = 3;
|
||||||
|
const float kShadowWidth = 3;
|
||||||
|
float x, y;
|
||||||
|
float right, bottom;
|
||||||
|
rgb_color frameColor = {0, 0, 0, 0};
|
||||||
|
rgb_color shadowColor = {90, 90, 90, 0};
|
||||||
|
BRect r(PageRect());
|
||||||
|
|
||||||
|
PushState();
|
||||||
|
// draw page border around page
|
||||||
|
r.InsetBy(-1, -1);
|
||||||
|
r.OffsetTo(kPreviewLeftMargin-1, kPreviewTopMargin-1);
|
||||||
|
SetHighColor(frameColor);
|
||||||
|
StrokeRect(r);
|
||||||
|
|
||||||
|
// draw page shadow
|
||||||
|
SetHighColor(shadowColor);
|
||||||
|
|
||||||
|
x = r.right + 1;
|
||||||
|
right = x + kShadowWidth;
|
||||||
|
bottom = r.bottom + 1 + kShadowWidth;
|
||||||
|
y = r.top + kShadowIndent;
|
||||||
|
FillRect(BRect(x, y, right, bottom));
|
||||||
|
|
||||||
|
x = r.left + kShadowIndent;
|
||||||
|
y = r.bottom + 1;
|
||||||
|
FillRect(BRect(x, y, r.right, bottom));
|
||||||
|
PopState();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int32 PreviewView::GetPageNumber(int32 index) const
|
||||||
|
{
|
||||||
|
int page = fPage;
|
||||||
|
if (fReverse) {
|
||||||
|
page = fNumberOfPages - fPage - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fPageSelection == JobData::kOddNumberedPages) {
|
||||||
|
page *= 2; // 0, 2, 4, ...
|
||||||
|
}
|
||||||
|
else if (fPageSelection == JobData::kEvenNumberedPages) {
|
||||||
|
page = 2 * page + 1; // 1, 3, 5, ...
|
||||||
|
}
|
||||||
|
|
||||||
|
return page * fNumberOfPagesPerPage + index;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::DrawPage(BRect rect)
|
||||||
|
{
|
||||||
|
|
||||||
|
BRect physicalRect = fReader.PaperRect();
|
||||||
|
BRect scaledPhysicalRect = physicalRect;
|
||||||
|
BRect scaledPrintableRect = fReader.PrintableRect();
|
||||||
|
|
||||||
|
for (int32 index = 0; index < fNumberOfPagesPerPage; index ++) {
|
||||||
|
int32 pageNumber = GetPageNumber(index);
|
||||||
|
if (pageNumber < 0) {
|
||||||
|
// no page at index
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!IsPageLoaded(pageNumber)) {
|
||||||
|
LoadPage(pageNumber);
|
||||||
|
}
|
||||||
|
if (!IsPageValid()) {
|
||||||
|
// TODO show feedback
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
BPoint scalingXY = GraphicsDriver::getScale(fNumberOfPagesPerPage, physicalRect, 100.0);
|
||||||
|
float scaling = min_c(scalingXY.x, scalingXY.y);
|
||||||
|
BPoint offset = GraphicsDriver::getOffset(fNumberOfPagesPerPage, index, fOrientation, &scalingXY,
|
||||||
|
scaledPhysicalRect, scaledPrintableRect, physicalRect);
|
||||||
|
|
||||||
|
// draw page contents
|
||||||
|
PushState();
|
||||||
|
|
||||||
|
// print job coordinates are relative to the printable rect
|
||||||
|
SetScale(ZoomFactor() * scaling);
|
||||||
|
|
||||||
|
BPoint leftTopMargin(BPoint(kPreviewLeftMargin, kPreviewTopMargin));
|
||||||
|
leftTopMargin.x /= ZoomFactor() * scaling;
|
||||||
|
leftTopMargin.y /= ZoomFactor() * scaling;
|
||||||
|
offset += leftTopMargin;
|
||||||
|
SetOrigin(offset);
|
||||||
|
|
||||||
|
// constrain clipping region to printable rectangle
|
||||||
|
BRect clipRect(fReader.PrintableRect());
|
||||||
|
clipRect.OffsetTo(0, 0);
|
||||||
|
BRegion clip(clipRect);
|
||||||
|
ConstrainClippingRegion(&clip);
|
||||||
|
|
||||||
|
fCachedPage->Draw(this);
|
||||||
|
|
||||||
|
PopState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::Draw(BRect rect) {
|
||||||
|
if (fReader.InitCheck() == B_OK) {
|
||||||
|
DrawPageFrame(rect);
|
||||||
|
DrawPage(rect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::FrameResized(float width, float height) {
|
||||||
|
FixScrollbars();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PreviewView::ShowsFirstPage() const {
|
||||||
|
return fPage == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PreviewView::ShowsLastPage() const {
|
||||||
|
return fPage == NumberOfPages() - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int PreviewView::NumberOfPages() const {
|
||||||
|
return fNumberOfPages;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::ShowNextPage() {
|
||||||
|
if (!ShowsLastPage()) {
|
||||||
|
fPage ++;
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::ShowPrevPage() {
|
||||||
|
if (!ShowsFirstPage()) {
|
||||||
|
fPage --;
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::ShowFirstPage() {
|
||||||
|
if (!ShowsFirstPage()) {
|
||||||
|
fPage = 0;
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::ShowLastPage() {
|
||||||
|
if (!ShowsLastPage()) {
|
||||||
|
fPage = NumberOfPages()-1;
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::ShowFindPage(int page) {
|
||||||
|
page --;
|
||||||
|
|
||||||
|
if (page < 0) {
|
||||||
|
page = 0;
|
||||||
|
} else if (page > (NumberOfPages()-1)) {
|
||||||
|
page = NumberOfPages()-1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fPage = (int32)page;
|
||||||
|
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PreviewView::CanZoomIn() const {
|
||||||
|
return fZoom < 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PreviewView::CanZoomOut() const {
|
||||||
|
return fZoom > -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::ZoomIn() {
|
||||||
|
if (CanZoomIn()) {
|
||||||
|
fZoom ++; FixScrollbars();
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::ZoomOut() {
|
||||||
|
if (CanZoomOut()) {
|
||||||
|
fZoom --; FixScrollbars();
|
||||||
|
Invalidate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewView::FixScrollbars() {
|
||||||
|
BRect frame = Bounds();
|
||||||
|
BScrollBar * scroll;
|
||||||
|
float x, y;
|
||||||
|
float bigStep, smallStep;
|
||||||
|
float width = PageRect().Width() + kPreviewLeftMargin + kPreviewRightMargin;
|
||||||
|
float height = PageRect().Height() + kPreviewTopMargin + kPreviewBottomMargin;
|
||||||
|
x = width - frame.Width();
|
||||||
|
if (x < 0.0) {
|
||||||
|
x = 0.0;
|
||||||
|
}
|
||||||
|
y = height - frame.Height();
|
||||||
|
if (y < 0.0) {
|
||||||
|
y = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
scroll = ScrollBar (B_HORIZONTAL);
|
||||||
|
scroll->SetRange (0.0, x);
|
||||||
|
scroll->SetProportion ((width - x) / width);
|
||||||
|
bigStep = frame.Width() - 2;
|
||||||
|
smallStep = bigStep / 10.;
|
||||||
|
scroll->SetSteps (smallStep, bigStep);
|
||||||
|
|
||||||
|
scroll = ScrollBar (B_VERTICAL);
|
||||||
|
scroll->SetRange (0.0, y);
|
||||||
|
scroll->SetProportion ((height - y) / height);
|
||||||
|
bigStep = frame.Height() - 2;
|
||||||
|
smallStep = bigStep / 10.;
|
||||||
|
scroll->SetSteps (smallStep, bigStep);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implementation of PreviewWindow
|
||||||
|
|
||||||
|
PreviewWindow::PreviewWindow(BFile* jobFile, bool showOkAndCancelButtons)
|
||||||
|
: BlockingWindow(BRect(20, 24, 400, 600), "Preview", B_DOCUMENT_WINDOW, 0)
|
||||||
|
{
|
||||||
|
const float kButtonDistance = 15;
|
||||||
|
const float kPageTextDistance = 10;
|
||||||
|
const float kVerticalIndent = 7;
|
||||||
|
const float kHorizontalIndent = 20;
|
||||||
|
|
||||||
|
float top = kVerticalIndent;
|
||||||
|
float left = kHorizontalIndent;
|
||||||
|
float width, height;
|
||||||
|
|
||||||
|
BRect r = Frame();
|
||||||
|
r.right = r.IntegerWidth() - B_V_SCROLL_BAR_WIDTH; r.left = 0;
|
||||||
|
r.bottom = r.IntegerHeight() - B_H_SCROLL_BAR_HEIGHT; r.top = 0;
|
||||||
|
|
||||||
|
// add navigation and zoom buttons
|
||||||
|
fFirst = new BButton(BRect(left, top, left+10, top+10), "First", "First Page", new BMessage(MSG_FIRST_PAGE));
|
||||||
|
AddChild(fFirst);
|
||||||
|
|
||||||
|
fPrev = new BButton(BRect(left, top, left+10, top+10), "Prev", "Previous Page", new BMessage(MSG_PREV_PAGE));
|
||||||
|
AddChild(fPrev);
|
||||||
|
fPrev->ResizeToPreferred();
|
||||||
|
// remember size of largest button
|
||||||
|
width = fPrev->Bounds().Width()+1;
|
||||||
|
height = fPrev->Bounds().Height()+1;
|
||||||
|
|
||||||
|
fFirst->ResizeTo(width, height);
|
||||||
|
left = fFirst->Frame().right + kButtonDistance;
|
||||||
|
|
||||||
|
// move Previous Page button after First Page button
|
||||||
|
fPrev->MoveTo(left, top);
|
||||||
|
left = fPrev->Frame().right + kButtonDistance;
|
||||||
|
|
||||||
|
fNext = new BButton(BRect(left, top, left+10, top+10), "Next", "Next Page", new BMessage(MSG_NEXT_PAGE));
|
||||||
|
AddChild(fNext);
|
||||||
|
fNext->ResizeTo(width, height);
|
||||||
|
left = fNext->Frame().right + kButtonDistance;
|
||||||
|
|
||||||
|
fLast = new BButton(BRect(left, top, left+10, top+10), "Last", "Last Page", new BMessage(MSG_LAST_PAGE));
|
||||||
|
AddChild(fLast);
|
||||||
|
fLast->ResizeTo(width, height);
|
||||||
|
left = fLast->Frame().right + kPageTextDistance;
|
||||||
|
|
||||||
|
// page number text
|
||||||
|
fPageNumber = new BTextControl(BRect(left, top+3, left+10, top+10), "FindPage", "", "", new BMessage(MSG_FIND_PAGE));
|
||||||
|
fPageNumber->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_RIGHT);
|
||||||
|
int num;
|
||||||
|
for (num = 0; num <= 255; num++) {
|
||||||
|
fPageNumber->TextView()->DisallowChar(num);
|
||||||
|
}
|
||||||
|
for (num = 0; num <= 9; num++) {
|
||||||
|
fPageNumber->TextView()->AllowChar('0' + num);
|
||||||
|
}
|
||||||
|
fPageNumber->TextView()-> SetMaxBytes(5);
|
||||||
|
AddChild(fPageNumber);
|
||||||
|
fPageNumber->ResizeTo(be_plain_font->StringWidth("999999") + 10, height);
|
||||||
|
left = fPageNumber->Frame().right + 5;
|
||||||
|
|
||||||
|
// number of pages text
|
||||||
|
fPageText = new BStringView(BRect(left, top, left + 100, top + 15), "pageText", "");
|
||||||
|
AddChild(fPageText);
|
||||||
|
// estimate max. width
|
||||||
|
float pageTextWidth = fPageText->StringWidth("of 99999 Pages");
|
||||||
|
// estimate height
|
||||||
|
BFont font;
|
||||||
|
fPageText->GetFont(&font);
|
||||||
|
float pageTextHeight = font.Size() + 2;
|
||||||
|
// resize to estimated size
|
||||||
|
fPageText->ResizeTo(pageTextWidth, pageTextHeight);
|
||||||
|
left += pageTextWidth + kPageTextDistance;
|
||||||
|
fPageText->MoveBy(0, (height - font.Size()) / 2);
|
||||||
|
|
||||||
|
|
||||||
|
fZoomIn = new BButton(BRect(left, top, left+10, top+10), "ZoomIn", "Zoom In", new BMessage(MSG_ZOOM_IN));
|
||||||
|
AddChild(fZoomIn);
|
||||||
|
fZoomIn->ResizeTo(width, height);
|
||||||
|
left = fZoomIn->Frame().right + kButtonDistance;
|
||||||
|
|
||||||
|
fZoomOut = new BButton(BRect(left, top, left+10, top+10), "ZoomOut", "Zoom Out", new BMessage(MSG_ZOOM_OUT));
|
||||||
|
AddChild(fZoomOut);
|
||||||
|
fZoomOut->ResizeTo(width, height);
|
||||||
|
|
||||||
|
fButtonBarHeight = fZoomOut->Frame().bottom + 7;
|
||||||
|
float bottomOfTopButtonBar = fButtonBarHeight;
|
||||||
|
|
||||||
|
if (showOkAndCancelButtons) {
|
||||||
|
// cancel printing if user closes the preview window
|
||||||
|
SetUserQuitResult(B_ERROR);
|
||||||
|
|
||||||
|
// add another button bar at bottom of window
|
||||||
|
r.bottom -= fButtonBarHeight;
|
||||||
|
// update the total height of both bars
|
||||||
|
fButtonBarHeight *= 2;
|
||||||
|
|
||||||
|
// right align buttons
|
||||||
|
left = r.Width() - width - kHorizontalIndent;
|
||||||
|
top = r.Height() + kVerticalIndent + B_H_SCROLL_BAR_HEIGHT;
|
||||||
|
|
||||||
|
left -= width + kButtonDistance;
|
||||||
|
BButton *printJob = new BButton(BRect(left, top+2, left+10, top+12), "PrintJob", "Print", new BMessage(MSG_PRINT_JOB), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
|
||||||
|
printJob->MakeDefault(true);
|
||||||
|
AddChild(printJob);
|
||||||
|
printJob->ResizeTo(width+4, height+4);
|
||||||
|
|
||||||
|
left += width + kButtonDistance;
|
||||||
|
BButton *cancelJob = new BButton(BRect(left, top, left+10, top+10), "CancelJob", "Cancel", new BMessage(MSG_CANCEL_JOB), B_FOLLOW_RIGHT | B_FOLLOW_BOTTOM);
|
||||||
|
AddChild(cancelJob);
|
||||||
|
cancelJob->ResizeTo(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// add preview view
|
||||||
|
r.top = bottomOfTopButtonBar;
|
||||||
|
fPreview = new PreviewView(jobFile, r);
|
||||||
|
|
||||||
|
|
||||||
|
fPreviewScroller = new BScrollView("PreviewScroller", fPreview, B_FOLLOW_ALL, 0, true, true, B_FANCY_BORDER);
|
||||||
|
fPreviewScroller->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||||
|
AddChild(fPreviewScroller);
|
||||||
|
|
||||||
|
if (fPreview->InitCheck() == B_OK) {
|
||||||
|
ResizeToPage(true);
|
||||||
|
fPreview->FixScrollbars();
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewWindow::ResizeToPage(bool allowShrinking) {
|
||||||
|
BScreen screen;
|
||||||
|
BRect r(fPreview->ViewRect());
|
||||||
|
float width, height;
|
||||||
|
float maxWidth, maxHeight, minWidth;
|
||||||
|
const float windowBorderWidth = 5;
|
||||||
|
const float windowBorderHeight = 5;
|
||||||
|
|
||||||
|
if (screen.Frame().right == 0.0) {
|
||||||
|
return; // invalid screen object
|
||||||
|
}
|
||||||
|
|
||||||
|
width = r.Width() + 1 + B_V_SCROLL_BAR_WIDTH;
|
||||||
|
height = r.Height() + 1 + fButtonBarHeight + B_H_SCROLL_BAR_HEIGHT;
|
||||||
|
|
||||||
|
// dimensions so that window does not reach outside of screen
|
||||||
|
maxWidth = screen.Frame().Width() + 1 - windowBorderWidth - Frame().left;
|
||||||
|
maxHeight = screen.Frame().Height() + 1 - windowBorderHeight - Frame().top;
|
||||||
|
|
||||||
|
// width so that all buttons are visible
|
||||||
|
minWidth = fZoomOut->Frame().right + 10;
|
||||||
|
|
||||||
|
if (width < minWidth) width = minWidth;
|
||||||
|
|
||||||
|
if (width > maxWidth) width = maxWidth;
|
||||||
|
if (height > maxHeight) height = maxHeight;
|
||||||
|
|
||||||
|
if (!allowShrinking) {
|
||||||
|
if (Bounds().Width() > width) width = Bounds().Width();
|
||||||
|
if (Bounds().Height() > height) height = Bounds().Height();
|
||||||
|
}
|
||||||
|
ResizeTo(width, height);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PreviewWindow::UpdateControls() {
|
||||||
|
fFirst->SetEnabled(!fPreview->ShowsFirstPage());
|
||||||
|
fPrev->SetEnabled(!fPreview->ShowsFirstPage());
|
||||||
|
fNext->SetEnabled(!fPreview->ShowsLastPage());
|
||||||
|
fLast->SetEnabled(!fPreview->ShowsLastPage());
|
||||||
|
fZoomIn->SetEnabled(fPreview->CanZoomIn());
|
||||||
|
fZoomOut->SetEnabled(fPreview->CanZoomOut());
|
||||||
|
|
||||||
|
BString page;
|
||||||
|
page << fPreview->CurrentPage();
|
||||||
|
fPageNumber->SetText(page.String());
|
||||||
|
|
||||||
|
BString text;
|
||||||
|
text << "of "
|
||||||
|
<< fPreview->NumberOfPages();
|
||||||
|
if (fPreview->NumberOfPages() == 1) {
|
||||||
|
text << " Page";
|
||||||
|
} else {
|
||||||
|
text << " Pages";
|
||||||
|
}
|
||||||
|
fPageText->SetText(text.String());}
|
||||||
|
|
||||||
|
void PreviewWindow::MessageReceived(BMessage* m) {
|
||||||
|
switch (m->what) {
|
||||||
|
case MSG_FIRST_PAGE:
|
||||||
|
fPreview->ShowFirstPage();
|
||||||
|
break;
|
||||||
|
case MSG_NEXT_PAGE:
|
||||||
|
fPreview->ShowNextPage();
|
||||||
|
break;
|
||||||
|
case MSG_PREV_PAGE:
|
||||||
|
fPreview->ShowPrevPage();
|
||||||
|
break;
|
||||||
|
case MSG_LAST_PAGE:
|
||||||
|
fPreview->ShowLastPage();
|
||||||
|
break;
|
||||||
|
case MSG_FIND_PAGE:
|
||||||
|
fPreview->ShowFindPage(atoi(fPageNumber->Text())) ;
|
||||||
|
break;
|
||||||
|
case MSG_ZOOM_IN:
|
||||||
|
fPreview->ZoomIn();
|
||||||
|
ResizeToPage();
|
||||||
|
break;
|
||||||
|
case MSG_ZOOM_OUT:
|
||||||
|
fPreview->ZoomOut();
|
||||||
|
ResizeToPage();
|
||||||
|
break;
|
||||||
|
case MSG_CANCEL_JOB:
|
||||||
|
Quit(B_ERROR);
|
||||||
|
break;
|
||||||
|
case MSG_PRINT_JOB:
|
||||||
|
Quit(B_OK);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
inherited::MessageReceived(m); return;
|
||||||
|
}
|
||||||
|
UpdateControls();
|
||||||
|
}
|
||||||
|
|
||||||
|
status_t PreviewWindow::Go() {
|
||||||
|
status_t st = InitCheck();
|
||||||
|
if (st == B_OK) {
|
||||||
|
return inherited::Go();
|
||||||
|
} else {
|
||||||
Quit();
|
Quit();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
return st;
|
||||||
#endif /* USE_PREVIEW_FOR_DEBUG */
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ void PrinterData::load()
|
|||||||
char buffer[512];
|
char buffer[512];
|
||||||
|
|
||||||
fNode->ReadAttr(PD_DRIVER_NAME, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
fNode->ReadAttr(PD_DRIVER_NAME, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
||||||
|
// TODO fix possible buffer overrun (not terminated string).
|
||||||
fDriverName = buffer;
|
fDriverName = buffer;
|
||||||
fNode->ReadAttr(PD_PRINTER_NAME, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
fNode->ReadAttr(PD_PRINTER_NAME, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
||||||
fPrinterName = buffer;
|
fPrinterName = buffer;
|
||||||
@@ -41,14 +42,18 @@ void PrinterData::load()
|
|||||||
fComments = buffer;
|
fComments = buffer;
|
||||||
fNode->ReadAttr(PD_TRANSPORT, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
fNode->ReadAttr(PD_TRANSPORT, B_STRING_TYPE, 0, buffer, sizeof(buffer));
|
||||||
fTransport = buffer;
|
fTransport = buffer;
|
||||||
fNode->ReadAttr(PD_PROTOCOL_CLASS, B_BOOL_TYPE, 0, &fProtocolClass, sizeof(fProtocolClass));
|
|
||||||
|
int32 valueI32;
|
||||||
|
fNode->ReadAttr(PD_PROTOCOL_CLASS, B_INT32_TYPE, 0, &valueI32, sizeof(valueI32));
|
||||||
|
fProtocolClass = (int)valueI32;
|
||||||
}
|
}
|
||||||
|
|
||||||
void PrinterData::save()
|
void PrinterData::save()
|
||||||
{
|
{
|
||||||
if (fNode == NULL) return;
|
if (fNode == NULL) return;
|
||||||
|
|
||||||
fNode->WriteAttr(PD_PROTOCOL_CLASS, B_BOOL_TYPE, 0, &fProtocolClass, sizeof(fProtocolClass));
|
int32 valueI32 = (int32)fProtocolClass;
|
||||||
|
fNode->WriteAttr(PD_PROTOCOL_CLASS, B_INT32_TYPE, 0, &valueI32, sizeof(valueI32));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PrinterData::getPath(string &path) const
|
bool PrinterData::getPath(string &path) const
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "PrinterCap.h"
|
#include "PrinterCap.h"
|
||||||
#include "PrinterData.h"
|
#include "PrinterData.h"
|
||||||
#include "UIDriver.h"
|
#include "UIDriver.h"
|
||||||
|
#include "Preview.h"
|
||||||
|
|
||||||
|
|
||||||
// Implementation of PrinterDriver
|
// Implementation of PrinterDriver
|
||||||
@@ -138,6 +139,13 @@ PrinterDriver::TakeJob(BFile* printJob, BMessage* settings)
|
|||||||
DUMP_BNODE(fSpoolFolder);
|
DUMP_BNODE(fSpoolFolder);
|
||||||
|
|
||||||
fGraphicsDriver = InstantiateGraphicsDriver(settings, fPrinterData, fPrinterCap);
|
fGraphicsDriver = InstantiateGraphicsDriver(settings, fPrinterData, fPrinterCap);
|
||||||
|
const JobData* jobData = fGraphicsDriver->getJobData(printJob);
|
||||||
|
if (jobData != NULL && jobData->getShowPreview()) {
|
||||||
|
PreviewWindow *preview = new PreviewWindow(printJob, true);
|
||||||
|
if (preview->Go() != B_OK) {
|
||||||
|
return new BMessage('okok');
|
||||||
|
}
|
||||||
|
}
|
||||||
BMessage *result = fGraphicsDriver->takeJob(printJob);
|
BMessage *result = fGraphicsDriver->takeJob(printJob);
|
||||||
|
|
||||||
DUMP_BMESSAGE(result);
|
DUMP_BMESSAGE(result);
|
||||||
|
|||||||
@@ -0,0 +1,182 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2005-2006, Haiku. All rights reserved.
|
||||||
|
* Distributed under the terms of the MIT License.
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Dr.H.Reh
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "StatusWindow.h"
|
||||||
|
#include <Message.h>
|
||||||
|
#include <View.h>
|
||||||
|
#include <StatusBar.h>
|
||||||
|
#include <Button.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, 650, 270), "Print Status", B_DOCUMENT_WINDOW, B_NOT_RESIZABLE | B_NOT_CLOSABLE | B_NOT_ZOOMABLE)
|
||||||
|
{
|
||||||
|
// oddPages - if true, only print odd umbered pages
|
||||||
|
// evenPages - if true, only print even umbered pages
|
||||||
|
// firstPage - number of first page
|
||||||
|
// numPages - total number of pages (must be recalculate if odd/even is used)
|
||||||
|
// numCopies - total number of document copies
|
||||||
|
|
||||||
|
BRect frame = Frame();
|
||||||
|
// the status view
|
||||||
|
frame.OffsetTo(B_ORIGIN);
|
||||||
|
fStatusView = new BView(frame,"Status View",B_FOLLOW_ALL, B_WILL_DRAW);
|
||||||
|
fStatusView->SetViewColor(216,216,216);
|
||||||
|
AddChild(fStatusView);
|
||||||
|
|
||||||
|
// the status bar
|
||||||
|
fStatusBar = new BStatusBar(BRect(10, 15, 245, 50),"Status Bar","Page: ");
|
||||||
|
fStatusView->AddChild(fStatusBar);
|
||||||
|
|
||||||
|
// the cancel button
|
||||||
|
fHideButton = new BButton(BRect(260, 25, 330,50),"Hide Button","Hide Status", new BMessage(HIDE_MSG));
|
||||||
|
fHideButton->ResizeToPreferred();
|
||||||
|
fStatusView->AddChild(fHideButton);
|
||||||
|
|
||||||
|
fCancelButton = new BButton(BRect(260, 25, 330,50),"Cancel Button","Cancel", new BMessage(CANCEL_MSG));
|
||||||
|
fCancelButton->ResizeToPreferred();
|
||||||
|
fCancelButton->MoveBy(90,0);
|
||||||
|
|
||||||
|
fStatusView->AddChild(fCancelButton);
|
||||||
|
|
||||||
|
fCancelBar = false;
|
||||||
|
|
||||||
|
// calculate the real number of pages
|
||||||
|
fNops = numPages;
|
||||||
|
|
||||||
|
bool evenFirstPage = (firstPage % 2) == 0;
|
||||||
|
bool evenNumPages = (numPages % 2) == 0;
|
||||||
|
|
||||||
|
// recalculate page numbers if even or odd is used
|
||||||
|
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;
|
||||||
|
// recalculate page numbers nup-pages-up
|
||||||
|
|
||||||
|
fStatusBar->SetMaxValue ((float)fNops);
|
||||||
|
// max value of status bar = real number of pages
|
||||||
|
fDelta = 1.0/numCopies;
|
||||||
|
// reduce step width of status bar
|
||||||
|
fStatusDelta = fDelta;
|
||||||
|
fDocCopies = numCopies;
|
||||||
|
|
||||||
|
fDocumentCopy = fDocCopies > 1;
|
||||||
|
|
||||||
|
fDocCopies++;
|
||||||
|
|
||||||
|
ResetStatusBar();
|
||||||
|
Show();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
StatusWindow::~StatusWindow(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StatusWindow::ResetStatusBar(void)
|
||||||
|
{
|
||||||
|
Lock();
|
||||||
|
fStatusBar->Reset("Page: ");
|
||||||
|
Unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
StatusWindow::UpdateStatusBar(uint32 page, uint32 copy)
|
||||||
|
{
|
||||||
|
Lock();
|
||||||
|
Activate(true);
|
||||||
|
// Frontmost Window
|
||||||
|
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);
|
||||||
|
Unlock();
|
||||||
|
return fCancelBar;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
StatusWindow::SetPageCopies(uint32 copies)
|
||||||
|
{
|
||||||
|
fCopies = copies;
|
||||||
|
fStatusDelta = fDelta/(float)fCopies;
|
||||||
|
fDocCopies--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Handling of user interface and other events
|
||||||
|
void
|
||||||
|
StatusWindow::MessageReceived(BMessage *message)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch(message->what) {
|
||||||
|
case CANCEL_MSG: // 'CancelButton' is pressed...
|
||||||
|
{
|
||||||
|
fCancelBar = true;
|
||||||
|
fCancelButton->SetEnabled(false);
|
||||||
|
fCancelButton->SetLabel("Job cancelled");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case HIDE_MSG: // 'HideButton' is pressed...
|
||||||
|
{
|
||||||
|
Hide();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
inherited::MessageReceived(message);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+13
-2
@@ -74,7 +74,12 @@ HWindow::MessageReceived(BMessage* msg)
|
|||||||
void
|
void
|
||||||
HWindow::AboutRequested()
|
HWindow::AboutRequested()
|
||||||
{
|
{
|
||||||
BAlert *about = new BAlert("About Preview", kAbout, "Cool");
|
const char* aboutText = AboutText();
|
||||||
|
if (aboutText == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
BAlert *about = new BAlert("About", aboutText, "Cool");
|
||||||
BTextView *v = about->TextView();
|
BTextView *v = about->TextView();
|
||||||
if (v) {
|
if (v) {
|
||||||
rgb_color red = {255, 0, 51, 255};
|
rgb_color red = {255, 0, 51, 255};
|
||||||
@@ -123,6 +128,7 @@ BlockingWindow::~BlockingWindow()
|
|||||||
void
|
void
|
||||||
BlockingWindow::Init(const char* title)
|
BlockingWindow::Init(const char* title)
|
||||||
{
|
{
|
||||||
|
fUserQuitResult = B_OK;
|
||||||
fResult = NULL;
|
fResult = NULL;
|
||||||
fExitSem = create_sem(0, title);
|
fExitSem = create_sem(0, title);
|
||||||
fReadyToQuit = false;
|
fReadyToQuit = false;
|
||||||
@@ -134,7 +140,7 @@ BlockingWindow::QuitRequested() {
|
|||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
// user requested to quit the window
|
// user requested to quit the window
|
||||||
*fResult = B_OK;
|
*fResult = fUserQuitResult;
|
||||||
release_sem(fExitSem);
|
release_sem(fExitSem);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -154,6 +160,11 @@ BlockingWindow::Quit(status_t result) {
|
|||||||
release_sem(fExitSem);
|
release_sem(fExitSem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
BlockingWindow::SetUserQuitResult(status_t result) {
|
||||||
|
fUserQuitResult = result;
|
||||||
|
}
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BlockingWindow::Go() {
|
BlockingWindow::Go() {
|
||||||
status_t result = B_ERROR;
|
status_t result = B_ERROR;
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
SubDir HAIKU_TOP src add-ons print drivers shared utils ;
|
||||||
|
|
||||||
|
SetSubDirSupportedPlatformsBeOSCompatible ;
|
||||||
|
|
||||||
|
SubDirHdrs [ FDirName $(HAIKU_TOP) headers private print utils ] ;
|
||||||
|
|
||||||
|
StaticLibrary libprintutils.a :
|
||||||
|
InterfaceUtils.cpp
|
||||||
|
MarginView.cpp
|
||||||
|
Utils.cpp
|
||||||
|
;
|
||||||
|
|
||||||
+4
-4
@@ -33,9 +33,7 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MARGIN_VIEW_H
|
|
||||||
#include "MarginView.h"
|
#include "MarginView.h"
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <AppKit.h>
|
#include <AppKit.h>
|
||||||
#include <SupportKit.h>
|
#include <SupportKit.h>
|
||||||
@@ -659,8 +657,10 @@ MarginView::CalculateViewSize(uint32 msg)
|
|||||||
float fleft = atof(fLeft->Text()) * fUnitValue;
|
float fleft = atof(fLeft->Text()) * fUnitValue;
|
||||||
|
|
||||||
// Check that the margins don't overlap each other...
|
// Check that the margins don't overlap each other...
|
||||||
float ph = fPageHeight;
|
float delta = 72.0;
|
||||||
float pw = fPageWidth;
|
// minimum printable rect = 1 inch * 1 inch
|
||||||
|
float ph = fPageHeight-delta;
|
||||||
|
float pw = fPageWidth-delta;
|
||||||
BString str;
|
BString str;
|
||||||
|
|
||||||
// Bounds calculation rules:
|
// Bounds calculation rules:
|
||||||
-53
@@ -30,9 +30,7 @@ THE SOFTWARE.
|
|||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
// --------------------------------------------------
|
||||||
EscapeMessageFilter::EscapeMessageFilter(BWindow *window, int32 what)
|
EscapeMessageFilter::EscapeMessageFilter(BWindow *window, int32 what)
|
||||||
@@ -56,49 +54,6 @@ EscapeMessageFilter::Filter(BMessage *msg, BHandler **target)
|
|||||||
return B_DISPATCH_MESSAGE;
|
return B_DISPATCH_MESSAGE;
|
||||||
}
|
}
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
// copied from BeUtils.cpp
|
|
||||||
static bool InList(const char* list[], const char* name) {
|
|
||||||
for (int i = 0; list[i] != NULL; i ++) {
|
|
||||||
if (strcmp(list[i], name) == 0) return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
// --------------------------------------------------
|
|
||||||
// copied from BeUtils.cpp
|
|
||||||
void AddFields(BMessage* to, const BMessage* from, const char* excludeList[], const char* includeList[]) {
|
|
||||||
if (to == from) return;
|
|
||||||
char* name;
|
|
||||||
type_code type;
|
|
||||||
int32 count;
|
|
||||||
for (int32 i = 0; from->GetInfo(B_ANY_TYPE, i, &name, &type, &count) == B_OK; i ++) {
|
|
||||||
if (excludeList && InList(excludeList, name)) continue;
|
|
||||||
if (includeList && !InList(includeList, name)) continue;
|
|
||||||
// replace existing data
|
|
||||||
to->RemoveName(name);
|
|
||||||
|
|
||||||
const void* data;
|
|
||||||
ssize_t size;
|
|
||||||
for (int32 j = 0; j < count; j ++) {
|
|
||||||
if (from->FindData(name, type, j, &data, &size) == B_OK) {
|
|
||||||
// WTF why works AddData not for B_STRING_TYPE in R5.0.3?
|
|
||||||
if (type == B_STRING_TYPE) {
|
|
||||||
to->AddString(name, (const char*)data);
|
|
||||||
} else if (type == B_MESSAGE_TYPE) {
|
|
||||||
BMessage m;
|
|
||||||
from->FindMessage(name, j, &m);
|
|
||||||
to->AddMessage(name, &m);
|
|
||||||
} else {
|
|
||||||
to->AddData(name, type, data, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void AddString(BMessage* m, const char* name, const char* value) {
|
void AddString(BMessage* m, const char* name, const char* value) {
|
||||||
if (m->HasString(name, 0)) {
|
if (m->HasString(name, 0)) {
|
||||||
m->ReplaceString(name, value);
|
m->ReplaceString(name, value);
|
||||||
@@ -130,11 +85,3 @@ void SetInt32(BMessage* msg, const char* name, int32 value) {
|
|||||||
msg->AddInt32(name, value);
|
msg->AddInt32(name, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BRect ScaleRect(BRect rect, float scale) {
|
|
||||||
rect.left *= scale;
|
|
||||||
rect.right *= scale;
|
|
||||||
rect.top *= scale;
|
|
||||||
rect.bottom *= scale;
|
|
||||||
return rect;
|
|
||||||
}
|
|
||||||
@@ -5,7 +5,7 @@ SetSubDirSupportedPlatformsBeOSCompatible ;
|
|||||||
UsePrivateHeaders interface print ;
|
UsePrivateHeaders interface print ;
|
||||||
|
|
||||||
StaticLibrary
|
StaticLibrary
|
||||||
libprint.a
|
libprintutils.a
|
||||||
:
|
:
|
||||||
PicturePrinter.cpp
|
PicturePrinter.cpp
|
||||||
PrintJobReader.cpp
|
PrintJobReader.cpp
|
||||||
|
|||||||
@@ -96,13 +96,15 @@ void LprSetupView::AttachedToWindow()
|
|||||||
|
|
||||||
/* server name box */
|
/* server name box */
|
||||||
|
|
||||||
server = new BTextControl(SERVER_RECT, "", SERVER_TEXT, "", NULL);
|
// TODO remember previous value
|
||||||
|
server = new BTextControl(SERVER_RECT, "", SERVER_TEXT, "192.168.0.0", NULL);
|
||||||
AddChild(server);
|
AddChild(server);
|
||||||
server->SetDivider(width);
|
server->SetDivider(width);
|
||||||
|
|
||||||
/* queue name box */
|
/* queue name box */
|
||||||
|
|
||||||
queue = new BTextControl(QUEUE_RECT, "", QUEUE_TEXT, "", NULL);
|
// TODO remember previous value
|
||||||
|
queue = new BTextControl(QUEUE_RECT, "", QUEUE_TEXT, "LPT1_PASSTHRU", NULL);
|
||||||
AddChild(queue);
|
AddChild(queue);
|
||||||
queue->SetDivider(width);
|
queue->SetDivider(width);
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ LinkAgainst
|
|||||||
be
|
be
|
||||||
root
|
root
|
||||||
translation
|
translation
|
||||||
libprint.a
|
libprintutils.a
|
||||||
;
|
;
|
||||||
|
|
||||||
Package haiku-printingkit-cvs :
|
Package haiku-printingkit-cvs :
|
||||||
|
|||||||
@@ -101,27 +101,35 @@ static bool InList(const char* list[], const char* name) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddFields(BMessage* to, const BMessage* from, const char* excludeList[], const char* includeList[]) {
|
void AddFields(BMessage* to, const BMessage* from, const char* excludeList[], const char* includeList[], bool overwrite) {
|
||||||
if (to == from) return;
|
if (to == from) return;
|
||||||
char* name;
|
char* name;
|
||||||
type_code type;
|
type_code type;
|
||||||
int32 count;
|
int32 count;
|
||||||
for (int32 i = 0; from->GetInfo(B_ANY_TYPE, i, &name, &type, &count) == B_OK; i ++) {
|
for (int32 i = 0; from->GetInfo(B_ANY_TYPE, i, &name, &type, &count) == B_OK; i ++) {
|
||||||
|
const void* data;
|
||||||
|
ssize_t size;
|
||||||
|
|
||||||
if (excludeList && InList(excludeList, name)) continue;
|
if (excludeList && InList(excludeList, name)) continue;
|
||||||
if (includeList && !InList(includeList, name)) continue;
|
if (includeList && !InList(includeList, name)) continue;
|
||||||
|
|
||||||
|
if (!overwrite && to->FindData(name, type, 0, &data, &size) == B_OK) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
// replace existing data
|
// replace existing data
|
||||||
to->RemoveName(name);
|
to->RemoveName(name);
|
||||||
|
|
||||||
const void* data;
|
|
||||||
ssize_t size;
|
|
||||||
for (int32 j = 0; j < count; j ++) {
|
for (int32 j = 0; j < count; j ++) {
|
||||||
if (from->FindData(name, type, j, &data, &size) == B_OK) {
|
if (from->FindData(name, type, j, &data, &size) == B_OK) {
|
||||||
if (type == B_STRING_TYPE) to->AddString(name, (const char*)data);
|
if (type == B_STRING_TYPE) {
|
||||||
else if (type == B_MESSAGE_TYPE) {
|
to->AddString(name, (const char*)data);
|
||||||
|
} else if (type == B_MESSAGE_TYPE) {
|
||||||
BMessage m;
|
BMessage m;
|
||||||
from->FindMessage(name, j, &m);
|
from->FindMessage(name, j, &m);
|
||||||
to->AddMessage(name, &m);
|
to->AddMessage(name, &m);
|
||||||
} else to->AddData(name, type, data, size);
|
} else {
|
||||||
|
to->AddData(name, type, data, size);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ SetSubDirSupportedPlatformsBeOSCompatible ;
|
|||||||
UsePrivateHeaders shared interface print ;
|
UsePrivateHeaders shared interface print ;
|
||||||
|
|
||||||
StaticLibrary
|
StaticLibrary
|
||||||
libprint.a
|
libprintutils.a
|
||||||
:
|
:
|
||||||
BeUtils.cpp
|
BeUtils.cpp
|
||||||
BeUtilsTranslation.cpp
|
BeUtilsTranslation.cpp
|
||||||
|
|||||||
Reference in New Issue
Block a user