romlib  1.0
include/romlib.h
00001 /* $Id: romlib.h,v 1.4 2006-06-06 19:37:14 roma Exp $ 
00002 
00003         Report Object Management Library
00004 
00005         Version 2.0
00006 */
00007 
00008 #include <extern.h>
00009 #include <stdio.h>
00010 #include <windows.h>
00011 #include <xole.h>
00012 
00013 #ifndef _ROMLIB_
00014 #define _ROMLIB_
00015 
00016 #ifdef _ROMLIB_WX_
00017 #else
00018 #include "win32/point.h"
00019 #endif
00020 
00021 #ifdef _ROMLIB_XML_
00022 typedef XERCES_CPP_NAMESPACE::DOMDocument       rom_XMLDocument;
00023 typedef XERCES_CPP_NAMESPACE::DOMElement        rom_XMLElement;
00024 #endif
00025 
00027 enum rom_PaperSize 
00028 { 
00029         rom_PAPER_SIZE_UNKNOWN = -1, 
00030         rom_PAPER_SIZE_A3, 
00031         rom_PAPER_SIZE_A4 
00032 };
00033 
00034 _EXTERN_        int rom_GetStandardPaperWidth(rom_PaperSize _size);
00035 
00036 _EXTERN_        int rom_GetStandardPaperHeight(rom_PaperSize _size);
00037 
00039 enum rom_PaperOrientation 
00040 { 
00041         rom_PAPER_ORIENTATION_UNKNOWN = -1, 
00042         rom_PAPER_ORIENTATION_PORTRAIT, 
00043         rom_PAPER_ORIENTATION_LANDSCAPE 
00044 };
00045 
00047 enum rom_BrushStyle
00048 {
00049         rom_BRUSH_SOLID         = 0,
00050         rom_BRUSH_DIAGONAL      = 1,
00051         rom_BRUSH_CROSS         = 2,
00052         rom_BRUSH_DIAGCROSS     = 3,
00053         rom_BRUSH_FDIAGONAL     = 4,
00054         rom_BRUSH_HORIZONTAL= 5,
00055         rom_BRUSH_VERTICAL      = 6,
00056         rom_BRUSH_NONE          = 7,
00057         rom_BRUSH_STOP,
00058 };
00059 
00061 enum rom_PenStyle
00062 {
00063         rom_PEN_NONE            = 0,
00064         rom_PEN_SOLID_0,
00065         rom_PEN_SOLID_1,
00066         rom_PEN_SOLID_2,
00067         rom_PEN_SOLID_3,
00068         rom_PEN_DOT,
00069         rom_PEN_DASH,
00070         rom_PEN_STOP,
00071 };
00072 
00073 _EXTERN_ int rom_GetPenWidth(rom_PenStyle _style);
00074 _EXTERN_ int rom_GetPenImage(rom_PenStyle _style);
00075 _EXTERN_ rom_PenStyle rom_GetPenStyle(int _width, int _image);
00076 
00078 enum rom_TextOrientation
00079 {       
00080         rom_TEXT_HORIZONTAL     = 0,
00081         rom_TEXT_UP                     = 1,
00082         rom_TEXT_DOWN           = 2,
00083         rom_TEXT_VERTICAL       = 3
00084 };
00085 
00087 enum rom_TextHAlignment
00088 {
00089         rom_LEFT        = 0,    
00090         rom_RIGHT       = 1,    
00091         rom_HCENTER     = 2,    
00092 };
00093 
00095 enum rom_TextVAlignment
00096 {
00097         rom_TOP         = 0,    
00098         rom_BOTTOM      = 1,    
00099         rom_VCENTER     = 2,    
00100         rom_WRAP        = 3,    
00101 };
00102 
00104 enum rom_FontCharset
00105 {
00106         rom_CHARSET_ANSI                = ANSI_CHARSET,
00107         rom_CHARSET_BALTIC              = BALTIC_CHARSET,
00108         rom_CHARSET_CHINESEBIG5 = CHINESEBIG5_CHARSET,
00109         rom_CHARSET_DEFAULT             = DEFAULT_CHARSET,
00110         rom_CHARSET_EASTEUROPE  = EASTEUROPE_CHARSET,
00111         rom_CHARSET_GB2312              = GB2312_CHARSET,
00112         rom_CHARSET_GREEK               = GREEK_CHARSET,
00113         rom_CHARSET_HANGUL              = HANGUL_CHARSET,
00114         rom_CHARSET_MAC                 = MAC_CHARSET,
00115         rom_CHARSET_OEM                 = OEM_CHARSET,
00116         rom_CHARSET_RUSSIAN             = RUSSIAN_CHARSET,
00117         rom_CHARSET_SHIFTJIS    = SHIFTJIS_CHARSET,
00118         rom_CHARSET_SYMBOL              = SYMBOL_CHARSET,
00119         rom_CHARSET_TURKISH             = TURKISH_CHARSET,
00120         rom_CHARSET_VIETNAMESE  = VIETNAMESE_CHARSET,    
00121 };
00122 
00123 enum rom_FontWeight
00124 {
00125 
00126         rom_WEIGHT_DONTCARE             = FW_DONTCARE, 
00127         rom_WEIGHT_THIN                 = FW_THIN, 
00128         rom_WEIGHT_EXTRALIGHT   = FW_EXTRALIGHT, 
00129         rom_WEIGHT_ULTRALIGHT   = FW_ULTRALIGHT, 
00130         rom_WEIGHT_LIGHT                = FW_LIGHT, 
00131         rom_WEIGHT_NORMAL               = FW_NORMAL, 
00132         rom_WEIGHT_REGULAR              = FW_REGULAR, 
00133         rom_WEIGHT_MEDIUM               = FW_MEDIUM, 
00134         rom_WEIGHT_SEMIBOLD             = FW_SEMIBOLD, 
00135         rom_WEIGHT_DEMIBOLD             = FW_DEMIBOLD, 
00136         rom_WEIGHT_BOLD                 = FW_BOLD, 
00137         rom_WEIGHT_EXTRABOLD    = FW_EXTRABOLD, 
00138         rom_WEIGHT_ULTRABOLD    = FW_ULTRABOLD, 
00139         rom_WEIGHT_HEAVY                = FW_HEAVY, 
00140         rom_WEIGHT_BLACK                = FW_BLACK, 
00141 };
00142 
00143 enum rom_DuplexMode
00144 {
00145         rom_DUPLEX_NONE                 = DMDUP_SIMPLEX,
00146         rom_DUPLEX_SHORT_EDGE   = DMDUP_HORIZONTAL,
00147         rom_DUPLEX_LONG_EDGE    = DMDUP_VERTICAL,
00148         rom_DUPLEX_DRIVER               = 0
00149 };
00150 
00151 class _EXTERN_ rom_String
00152 /*
00153         Цепочка символов
00154 */
00155 {
00156         char* Buf;      // динамический буфер под цепочку
00157 
00158 public:
00159 
00160         ~rom_String();  
00161 
00162         rom_String();
00163         /*
00164                 Создание пустой цепочки
00165         */
00166 
00167         rom_String(const char* _s);
00168         /*
00169                 Создание дубликата строки
00170         */
00171 
00172         rom_String(int _c);
00173         /*
00174                 Создание дубликата символа
00175         */
00176 
00177         rom_String(const rom_String& _s);
00178         /*
00179                 Создание дубликата цепочки
00180         */
00181 
00182         int CompareI(const char* _s);
00183         /*
00184                 Сравнение без учета регистра
00185         */
00186 
00187         const char* CStr() const;
00188         /*
00189                 Возвращает ссылку на буфер (не должен меняться).
00190         */
00191 
00192         void Format(const char* _fmt, ...);
00193         /*
00194                 Присвоение строки по формату (предельная длина органичена 8192).
00195         */
00196 
00197         void Assign(const char* _s);
00198         /*
00199                 Присвоение строки.
00200         */
00201 
00202         void Assign(const rom_String& _s);
00203         /*
00204                 Присвоение цепочки.
00205         */
00206 
00207         void Assign(const char* _s, int _len);
00208         /*
00209                 Присвоение цепочки заданной длины.
00210         */
00211 
00212         rom_String& operator =(const char* _s);
00213         /*
00214                 Операторный вариант присвоения
00215         */
00216 
00217         rom_String& operator =(const rom_String& _s);
00218         /*
00219                 Опареторный вариант присвоения
00220         */
00221 
00222         int operator[](int _i) const;
00223         /*
00224                 Доступ к отдельному символу
00225         */
00226 
00227         int Delete(int _i, int _l);
00228         /*
00229                 Удаление указанного количества символов _l, начиная
00230                 с заданной позиции _i.
00231         */
00232 
00233         int Insert(int _i, const char* _s);
00234         /*
00235                 Вставка строки _s в указанную позицию цепочки.
00236         */
00237 
00238         int GetLength() const;
00239         /*
00240                 Возвращает длину строки.
00241         */
00242 
00243         rom_String SubStr(int _i, int _l) const;
00244         /*
00245                 Возвращает подстроку от _i длиной _l.
00246         */
00247 
00248         BOOL IsEmpty() const;
00249 
00250         void Empty();
00251 
00252         void ToUpper();
00253 };
00254 
00255 class rom_DC;
00256 class rom_DCPrinter;
00257 
00258 #ifdef _ROMLIB_WX_
00259 #else
00260 
00261 /*class _EXTERN_ rom_Point:public POINT
00262 {
00263 public:
00264 
00265         rom_Point(){}
00266 
00267         rom_Point(const rom_Point& _pt);
00268 
00269         rom_Point(int _x, int _y);
00270 
00271         rom_Point(POINT _pt);
00272 };*/
00273 
00274 class _EXTERN_ rom_Rect:public RECT
00275 {
00276 public:
00277 
00278         rom_Rect(){::SetRectEmpty(this);}
00279 
00280         rom_Rect(const rom_Rect& _rc, int _h, int _v);
00281 
00282         rom_Rect(const rom_Rect& _rc);
00283 
00284         rom_Rect(int _left, int _top, int _right, int _bottom);
00285 
00286         rom_Rect(const RECT& _rc);
00287                 
00288         rom_Point GetLeftTop() const;
00289 
00290         rom_Point GetLeftBottom() const;
00291 
00292         rom_Point GetRightTop() const;
00293 
00294         rom_Point GetRightBottom() const;
00295 
00296         bool Contains(const rom_Point& _pt) const;
00297 
00298         int Width() const;
00299 
00300         int Height() const;
00301 
00302         operator LPCRECT(){return this;}
00303 };
00304 
00305 _EXTERN_ rom_Rect operator+(const rom_Rect& _rc, const rom_Point& _pt);
00306 
00307 _EXTERN_ rom_Rect operator-(const rom_Rect& _rc, const rom_Point& _pt);
00308 
00309 _EXTERN_ rom_Rect operator+(const rom_Rect& _rc1, const rom_Rect& _rc2);
00310 
00311 class _EXTERN_ rom_Colour
00312 {
00313 public:
00314 
00315         rom_Colour(const rom_Colour& _c):m_Colour(_c.m_Colour){}
00316 
00317         rom_Colour(int _c):m_Colour((COLORREF)_c){}
00318 
00319         rom_Colour(int _r, int _g, int _b):m_Colour(RGB(_r, _g, _b)){}
00320 
00321         rom_Colour():m_Colour(RGB(0, 0, 0)){}
00322 
00323         operator int() const throw(){return (int)m_Colour;}
00324 
00325 private:
00326 
00327         COLORREF        m_Colour;
00328 
00329 };
00330 
00331 class _EXTERN_ rom_Brush
00332 {
00333 public:
00334 
00335         rom_Brush(rom_BrushStyle _style, const rom_Colour& _colour);
00336 
00337         ~rom_Brush();
00338 
00339         operator HBRUSH() const throw(){return m_hBrush;}
00340 
00341 private:
00342 
00343         HBRUSH m_hBrush;
00344 
00345 };
00346 
00347 class _EXTERN_ rom_Pen
00348 {
00349 public:
00350 
00351         rom_Pen(rom_PenStyle _style, const rom_Colour& _colour);
00352 
00353         rom_Pen(rom_PenStyle _style, const rom_Colour& _colour, int _width);
00354 
00355         ~rom_Pen();
00356 
00357         operator HPEN() const throw(){return m_hPen;}
00358 
00359 private:
00360 
00361         HPEN m_hPen;
00362 
00363 };
00364 
00365 class rom_RepFrameRectangle;
00366 
00367 class _EXTERN_ rom_Font
00368 {
00369 public:
00370 
00371         rom_Font
00372                 (
00373                         const char*                     _name,
00374                         rom_FontCharset         _charset,
00375                         int                                     _height,
00376                         rom_FontWeight          _weight,
00377                         bool                            _italic,
00378                         bool                            _strikeout,
00379                         bool                            _underline,
00380                         rom_TextOrientation _orient
00381                 );
00382 
00383         rom_Font(const rom_RepFrameRectangle& _r);
00384 
00385         ~rom_Font();
00386 
00387         operator HFONT() const{return m_hFont;}
00388 
00389 private:
00390 
00391         HFONT m_hFont;
00392 
00393         void  Create
00394                 (
00395                         const char*                     _name,
00396                         rom_FontCharset         _charset,
00397                         int                                     _height,
00398                         rom_FontWeight          _weight,
00399                         bool                            _italic,
00400                         bool                            _strikeout,
00401                         bool                            _underline,
00402                         rom_TextOrientation _orient
00403                 );
00404 
00405 };
00406 
00407 class _EXTERN_ rom_DC
00408 {
00409 public:
00410 
00411         rom_DC():DC(NULL){}
00412 
00413         rom_DC(HDC _hdc):DC(_hdc){}
00414 
00415         ~rom_DC(){}
00416 
00417         bool IsOk() const{return DC != NULL;}
00418 
00419         int GetLogPixelsX() const;
00420 
00421         int GetLogPixelsY() const;
00422 
00423         rom_Point OffsetViewportOrg(int _x, int _y);
00424 
00425         rom_Point OffsetViewportOrg(const rom_Point& _p);
00426         
00427         rom_Point SetViewportOrg(const rom_Point& _org);
00428 
00429         bool RectVisible(const rom_Rect& _rc) const;
00430 
00431         void FillRect(const rom_Rect& _rc, const rom_Brush& _brush);
00432 
00433         void DrawLine(const rom_Point& _pt1, const rom_Point& _pt2, const rom_Pen& _pen);
00434 
00435         void FrameRect(const rom_Rect& _rc, const rom_Brush& _brush);   
00436 
00437         int MMVToPix(int _mm) const;
00438 
00439         int MMHToPix(int _mm) const;
00440 
00441         rom_Point MMToPix(const rom_Point&_pt) const;
00442 
00443         rom_Rect  MMToPix(const rom_Rect& _rc) const;
00444 
00445         int PixToMMH(int _v) const;
00446 
00447         int PixToMMV(int _v) const;
00448 
00449         rom_Point PixToMM(const rom_Point& _pt) const;
00450 
00451         rom_Rect PixToMM(const rom_Rect& _rc) const;
00452 
00453         void DrawText
00454                 (       
00455                         const char*                             _text, 
00456                         const rom_Rect&                 _rc, 
00457                         rom_TextHAlignment              _halign,
00458                         rom_TextVAlignment              _valign,
00459                         rom_TextOrientation             _orient,
00460                         const rom_Colour&               _colour,
00461                         const rom_Font&                 _font
00462                 );
00463 
00464         void DrawBitmap
00465                 (
00466                         const char*     _file,
00467                         const rom_Rect& _rc,
00468                         bool _stretch
00469                 );
00470 
00471         void DrawCircle
00472                 (
00473                         const rom_Rect& _rc,
00474                         const rom_Pen& _pen
00475                 );
00476 
00477         operator HDC() throw(){return DC;}
00478 
00479 protected:
00480 
00481         HDC DC;
00482 
00483         static int LogPixelsSx;
00484 
00485         static int LogPixelsSy;
00486 };
00487 
00488 class _EXTERN_ rom_DCAuto:public rom_DC
00489 {
00490 public:
00491 
00492         rom_DCAuto(HDC _dc):rom_DC(_dc){}
00493 
00494         rom_DCAuto(){}
00495 
00496         ~rom_DCAuto()
00497         {
00498                 if(DC)
00499                         DeleteDC(DC);
00500         }
00501 
00502 };
00503 
00504 class _EXTERN_ rom_Printer
00505 {
00506         friend class rom_DCPrinter;
00507 
00508         char* m_PrinterName;
00509         char* m_DriverName;
00510         char* m_PortName;
00511         HGLOBAL m_hPrinterMode;
00512 
00513         void Detach();
00514 
00515         HGLOBAL GetPrinterMode() const;
00516 
00517 protected:
00518 
00519         void Attach(const char* _name);
00520 
00521         void AttachDefault();
00522 
00532         static HGLOBAL GetPrinterInfo
00533                 (
00534                         const char* _name,
00535                         char** _driver,
00536                         char** _port
00537                 );
00538 
00539 public:
00540 
00542         rom_Printer():m_hPrinterMode(NULL), m_PrinterName(NULL), m_DriverName(NULL), m_PortName(NULL)
00543         {
00544                 AttachDefault();
00545         }
00546 
00547 
00556         rom_Printer(rom_PaperSize _size):m_hPrinterMode(NULL), m_PrinterName(NULL), m_DriverName(NULL), m_PortName(NULL)
00557         {
00558                 Attach(_size);
00559         }
00560 
00561         ~rom_Printer()
00562         {
00563                 Detach();
00564         }
00565 
00572         bool Setup(HWND _owner = NULL) throw(...);
00573 
00578         void SetPaperSize(rom_PaperSize size) throw();
00579 
00585         rom_PaperSize                   GetPaperSize() const throw();
00586 
00587         void SetDuplexMode(rom_DuplexMode _mode) throw();
00588 
00589         rom_DuplexMode GetDuplexMode() const throw();
00590 
00591 
00599         const char* GetName() const throw();
00600 
00605         rom_PaperOrientation    GetPaperOrientation() const throw();
00606 
00611         void SetPaperOrientation(rom_PaperOrientation _orient) throw();
00612 
00613 
00622         static const char* GetPrinterName(rom_PaperSize _size, char* _name, size_t _cap);
00623 
00624 
00633         static void     SetPrinterName(rom_PaperSize _size, const char* _name);
00634 
00640         static bool SelectPrinters(HWND _owner = NULL);
00641 
00650         void Attach(rom_PaperSize _size);
00651 
00652 };
00653 
00655 class _EXTERN_ rom_DCPrinter:public rom_DCAuto
00656 {
00657         void ThrowSpoolException(int _r) const;
00658 
00659 public:
00660 
00661         rom_DCPrinter(HDC _dc):rom_DCAuto(_dc){}
00662 
00663         rom_DCPrinter(rom_Printer& _printer);
00664 
00665         void StartPage();
00666 
00667         void EndPage();
00668 
00669         void StartDoc(const char* _job_name);
00670 
00671         void EndDoc();
00672 
00673         void AbortDoc();
00674 
00675 };
00676 
00677 #endif
00678 
00679 class rom_Printer;
00680 
00681 #ifdef _ROMLIB_WX_
00682 #else
00683 
00684 
00685 #endif
00686 
00687 
00688 class _EXTERN_ rom_RepDrawContext;
00689 
00690 /******************************************************************************
00691         В рабочем каталоге находится настроечный файл ROM.INI. По умолчанию
00692         используется системный каталог Windows (см. ::GetWindowsDirectory).
00693         Процесс может изменит рабочий каталог с помощью romSetWorkingDirectory
00694         (это не влияет на системный каталог). Изменение действительно до завершения
00695         процесса.
00696  ******************************************************************************/
00697 
00698 _EXTERN_ char* rom_GetWorkingDirectory(char* _path);
00699 /*
00700         Получение рабочего каталога (без завершающего слеш).
00701 
00702         _path[_MAX_PATH] -- возвращаемый путь.
00703 
00704         Возвращаемое значение:
00705 
00706         _path
00707 */
00708 
00709 _EXTERN_ const char* rom_SetWorkingDirectory(const char* _path);
00710 /*
00711         Изменение рабочего каталога.
00712 
00713         _path[_MAX_PATH] -- новый рабочий каталог (без завершающего слеш).
00714 
00715         Возвращаемое значение:
00716 
00717         _path
00718 
00719 */
00720 
00721 _EXTERN_ char* rom_GetIniPath(char* _path);
00722 /*
00723         Получение полного пути к настроечному файлу.
00724 
00725         _path[_MAX_PATH + _MAX_FNAME] -- возвращаемый путь к настроечному фалу
00726                                                 (...\\ROM.INI)
00727 
00728         Возвращаемое значение:
00729 
00730         _path
00731 */
00732 
00733 _EXTERN_ void rom_SetDefaultSxSy(const rom_DC& _dc) throw();
00734 /*
00735    Функция устанавливает значения по умолчанию для
00736    вычислений с контекстом устройства
00737    MMHToPix, MMVToPix, PixToMMV, PixToMMH.
00738 */
00739 
00740 
00741 class _EXTERN_ rom_InStream
00742 /*
00743         Базовый абстрактный класс для потоков ввода отчета. Разбивает поток символов на лексемы.
00744 */
00745 {
00746         void    EatWhite();
00747         /*
00748                 Пропуск разделителей ('\t', ' ' и '\n'). Символ '\n' пропускается
00749                 только в том случае, если m_KeepLineFeed == FALSE.
00750         */
00751 
00752 protected:
00753         BOOL    m_Oem;                                  // признак перекодировки строковых лексем в 866
00754         char*   m_Token;                                // буфер накопление строковых лексем (AddToToken,ClearToken,DetachToken)
00755         int             m_TokenLen;                             // текущий размер строковой лексемы
00756         int             m_TokenSize;                    // размер буффера под строковую лексему
00757 
00758         /*
00759                 Функции организации ввода символов.
00760                 Должны быть переписаны конкретной реалиацией.
00761         */
00762         virtual int             GetC() = 0;
00763         virtual int             GetI() = 0;
00764         virtual long    Tell() = 0;
00765         virtual BOOL    Seek(long rbpos) = 0;
00766         virtual BOOL    UngetC(int ch) = 0;
00767 
00768         void    AddToToken(int _ch);
00769         /*
00770                 Добавление символа в лексему (m_Token).
00771         */
00772 
00773         void    ClearToken();
00774         /*
00775                 Удаление лексемы. Освобождение памяти и обнуление счетчиков.
00776         */
00777 
00787         char*   DetachToken();
00788 
00797         int GetCh();
00798 
00799 public:
00800         BOOL    m_KeepLineFeed;
00801         /*
00802                 Управляет поведением EatWhite.
00803         */
00804 
00805         rom_InStream(BOOL oem):m_Oem(oem), m_KeepLineFeed(TRUE), m_Token(NULL), m_TokenLen(0), m_TokenSize(0){}
00806         /*
00807                 Конструирование потока с учетом перекодировки.
00808         */
00809 
00810         void    GetString(char** _s);
00811         /*
00812                 Получение строковой лексемы.
00813                 Строковая лексема, это любой поток символов, не пересекающий
00814                 границу строк.
00815 
00816                 *_s -- указатель на память, где находится лексема. Вызывающая программа должна
00817                 освобождать эту память (free).
00818         */
00819 
00820         BOOL    GetQuotedString(char** _s);
00821         /*
00822                 Получение лексемы "строка в кавычках".
00823                 "Строка в кавычках" -- это любая последовательность символов, которая может пересекать
00824                 границу строк. Кавычка внутри строки обозначается парой \".
00825 
00826                 *_s -- указатель на память, где находится лексема. Вызывающая программа должна
00827                 освобождать эту память (free).
00828 
00829                 Возвращает FALSE, когда кавычки не закрыты.
00830         */
00831 
00832         int             GetInt();
00833         /*
00834                 Получение лексемы для целого.
00835 
00836                 Возвращает значение лексемы.
00837         */
00838 
00839         int             GetPrefix(long& rbpos);
00840         /*
00841                 Возвращает символ префикса элемента отчета (фрейма, праямоугольника и проч.).
00842                 Возвращает 0, если последовательность симполов не может быть префиксом
00843                 ({{<символ>). При этом поток остается в том состоянии, в каком он был до
00844                 чтения префикса.
00845 
00846                 rbpos -- возвращаемая позиция в потоке непосредственно перед префиксом.
00847         */
00848 
00849         int             GetPostfix();
00850         /*
00851                 Возвращает символ постфикса элемента отчета. Возвращает 0, если последовательность
00852                 символов не может быть постфиксом (<символ>}}). Пои этом поток остается в состоянии,
00853                 как он быть до чтения постфикса.
00854         */
00855 
00856         virtual BOOL    IsOpen() = 0;
00857         /*
00858                 Возвращет признак, что поток открыт.
00859         */
00860 
00861         BOOL    RollBack(long rbpos);
00862         /*
00863                 Откат на заданную позицию потока.
00864         */
00865 };
00866 
00867 class _EXTERN_ rom_InFileStream:public rom_InStream
00868 /*
00869         Поток для ввода отчета из файла.
00870 */
00871 {
00872         FILE*   m_Stream;
00873         BOOL    m_DoFreeStream;
00874 
00875         int             GetC();
00876         int             GetI();
00877         long    Tell();
00878         BOOL    Seek(long rbpos);
00879         BOOL    UngetC(int ch);
00880 
00881 public:
00882 
00883         rom_InFileStream(const char* file, BOOL oem);
00884 
00885         rom_InFileStream(FILE *, BOOL oem);
00886 
00887         ~rom_InFileStream();
00888 
00889         BOOL IsOpen();
00890 };
00891 
00892 class _EXTERN_ rom_InMemoryStream:public rom_InStream
00893 /*
00894         Поток для ввода отчета из блока памяти
00895 */
00896 {
00897         HGLOBAL m_Stream;
00898         UCHAR*  m_Buffer;
00899         int             m_Pos;
00900 
00901         int             GetC();
00902         int             GetI();
00903         long    Tell();
00904         BOOL    Seek(long rbpos);
00905         BOOL    UngetC(int ch);
00906 
00907 protected:
00908 
00909         rom_InMemoryStream(BOOL oem);
00910 
00911         void    SetStream(HGLOBAL stream);
00912 
00913 public:
00914 
00915         rom_InMemoryStream(HGLOBAL stream, BOOL oem);
00916 
00917         ~rom_InMemoryStream();
00918 
00919         BOOL IsOpen();
00920 };
00921 
00922 class _EXTERN_ rom_InClipboardStream:public rom_InMemoryStream
00923 /*
00924         Поток для ввода отчета из буфера обмена
00925 */
00926 {
00927         HWND    m_Owner;
00928 
00929 public:
00930 
00931         rom_InClipboardStream(HWND owner, UINT cf);
00932 
00933         ~rom_InClipboardStream();
00934 };
00935 
00936 class _EXTERN_ rom_OutStream
00937 /*
00938         Базовый абстрактный класс для вывода отчета (см. производные классы).
00939 */
00940 {
00941 protected:
00942         BOOL    m_Oem;  // признак перекодирования в 866 при выводе
00943 
00944         rom_OutStream(BOOL oem):m_Oem(oem){}
00945 
00946         virtual BOOL PutC(int c) = 0;
00947         /*
00948                 Абстрактная функция для вывода символа.
00949                 Возвращает FALSE в случае ошибки.
00950         */
00951 
00952         BOOL PutW(const char* _s);
00953         /*
00954                 Вывод слова _s (строки без разделителей).
00955                 Возвращает FALSE, если один из вызовов PutC
00956                 вернул FALSE.
00957         */
00958 
00959 public:
00960 
00961         virtual BOOL IsOpen() = 0;
00962         /*
00963                 Признак готовности потока для вывода.
00964         */
00965 
00966         BOOL PutChar(char ch);
00967         /*
00968                 Вывод символа.
00969                 Использует PutC для вывода одиночного символа.
00970                 Возвращает FALSE, если PutC вернул FALSE.
00971         */
00972 
00973         BOOL PutString(const char* _s);
00974         /*
00975                 Вывод строки символов (не содержащей кавычек и переносов строки).
00976                 Возвращает FALSE, если один из вызовов PutC вернул
00977                 FALSE.
00978         */
00979 
00980         BOOL PutQuotedString(const char* _s);
00981         BOOL PutQuotedString(const rom_String& _s);
00982         /*
00983                 Вывод строки символов (может содержать кавычки и переносы).
00984                 Внутренние кавычки заменяет парой \".
00985                 Возвращает FALSE, если вызов PutC вернул FALSE.
00986         */
00987 
00988 
00989         BOOL PutInt(int v);
00990         /*
00991                 Вывод целого числа.
00992                 Возвращает FALSE, если PutW вернул FALSE.
00993         */
00994 
00995         BOOL PutPrefix(int prefix);
00996         /*
00997                 Вывод префикса элемента отчета (фрейма, прямоугольника и проч).
00998                 prefix -- код символа префикса.
00999                 Возвращает FALSE, если PutW вернул FALSE.
01000         */
01001 
01002         BOOL PutPostfix(int postfix);
01003         /*
01004                 Вывод постфикса элемента отчета.
01005                 postfix -- код символа постфикса.
01006                 Возвращает FALSE, если PutW вернул FALSE.
01007         */
01008 };
01009 
01010 class _EXTERN_ rom_OutFileStream:public rom_OutStream
01011 {
01012         FILE*   m_Stream;               // файл вывода
01013         BOOL    m_DoFreeStream; // признак собственного файла вывода
01014 
01015         BOOL PutC(int _c);
01016         /*
01017                 см. OutStream
01018         */
01019 
01020 public:
01021 
01022         rom_OutFileStream(const char* _file, BOOL _oem);
01023         /*
01024                 Открытие потока с собственным файлом вывода.
01025                 _file -- путь к файлу;
01026                 _oem -- признак перекодировки в 866.
01027                 При удалении объекта файл вывода будет закрыт.
01028         */
01029 
01030         rom_OutFileStream(FILE *_file, BOOL _oem);
01031         /*
01032                 Открытие потока с присоединенным файлом вывода.
01033                 _file -- открытый на запись файл;
01034                 _oem -- признак перекодировки в _oem.
01035                 Удаление объекта не влияет на присоединенный файл.
01036         */
01037 
01038         ~rom_OutFileStream();
01039 
01040         BOOL    IsOpen();
01041         /*
01042                 см. OutStream
01043         */
01044 };
01045 
01046 class _EXTERN_ rom_OutMemoryStream:public rom_OutStream
01047 /*
01048         Поток для вывода отчета в память.    
01049 */
01050 {
01051         enum {Released, Owned, Locked} m_State; // состояние блока памяти
01052         
01053         BOOL PutC(int c);                                               
01054         /*
01055                 Вывод символа в блок и при необходимости расширение блока.
01056         */
01057 
01058         BOOL ExtentMemory();
01059         /*
01060                 Расширение блока.
01061                 Возвращает FALSE, если произошла ошибка выделения памяти.
01062         */
01063 
01064 protected:
01065         HGLOBAL m_Stream;               // блок памяти для вывода
01066         char*   m_Buffer;               // указатель на блок памяти вывода (GlobalLock(m_Stream))
01067         int         m_Size;                     // размер m_Stream
01068         int             m_Pos;                  // текущая позиция вывода
01069         BOOL    m_CRLF;                 // признак разворачивания \n -> \r\n
01070 
01071         void    Release();
01072         /*
01073                 Перевод памяти в состояние Release (GlobalUnlock(m_Stream)).
01074         */
01075 
01076         void    Close();
01077         /*
01078                 Освобождение памяти.
01079         */
01080 
01081         void    Open();
01082         /*
01083                 Начальное размещеие памяти.
01084         */
01085 
01086 public:
01087         rom_OutMemoryStream(BOOL oem = FALSE, BOOL crlf = TRUE);
01088         /*
01089                 Создание потока:
01090                 oem -- признак перекодирования вывода в 866
01091                 crlf -- признак замены \n -> \r\n
01092         */
01093 
01094         virtual ~rom_OutMemoryStream();
01095 
01096         virtual BOOL IsOpen();
01097         /*
01098                 см. OutStream
01099         */
01100 
01101         int GetSize()
01102         /*
01103                 Возвращает текущий размер выделенной памяти.
01104         */
01105         {
01106                 return m_Size;
01107         }
01108 
01109         int GetPos() 
01110         /*
01111                 Возвращает текущую позиций вывода.
01112         */
01113         {
01114                 return m_Pos;
01115         }
01116 
01117         void Copy(LPSTR _dest)
01118         /*
01119                 Копирует содержимое буфера вывода в строку. Размер строки должен соответствовать
01120                 размеру выводимых данных и буфер вывода должен завершаться \0.
01121         */
01122         {
01123                 strcpy(_dest, m_Buffer);
01124         }
01125 
01126         BOOL SetCRLF(BOOL crlf)
01127         /*
01128                 Изменяет текущее состояние признака замены \n -> \r\n.
01129                 Возвращает старое значение признака.
01130         */
01131         {
01132                 BOOL ret = m_CRLF;
01133                 m_CRLF = crlf;
01134                 return ret;
01135         }
01136 
01137         HGLOBAL GetBuffer()
01138         /*
01139                 Возвращает ссылку на блок памяти вывода.
01140                 Поток переводится в состояние Release, в котором блок памяти отторгается
01141                 от потока и должен освобождаться вызывающим окружением.
01142         */
01143         {
01144                 Release();
01145                 return m_Stream;
01146         }
01147 
01148 };
01149 
01150 class _EXTERN_ rom_OutClipboardStream:public rom_OutMemoryStream
01151 /*
01152         Поток вывода в буфер обмена.
01153 */
01154 {
01155         HWND    m_Owner;        // окно-владелец буфера обмена
01156         UINT    m_CF;           // формат вывода
01157         BOOL    m_IsOpen;       // признак доступности буфера
01158 
01159 public:
01160         rom_OutClipboardStream(HWND owner, UINT cf);
01161         /*
01162                 Открытие буфера обмена для заданного формата.
01163                 owner -- окно-владалец
01164                 cf -- формат вывода
01165         */
01166 
01167         ~rom_OutClipboardStream();
01168 
01169         BOOL IsOpen();
01170         /*      
01171                 см. OutStream
01172         */
01173 
01174         void ChangeFormat(UINT cf);
01175         /*
01176                 Смена формата вывода.
01177                 cf -- новый формат.
01178         */
01179 
01180         static void DoEmptyClipboard();
01181 
01182         static void Empty(HWND owner);
01183 };
01184 
01185 _EXTERN_ UINT rom_GetRepCF();
01186 /*
01187         Получение зарегистрированного формата буффера обмена
01188         отчета.
01189 */
01190 
01191 _EXTERN_ UINT rom_GetRepFrameRectangleCF();
01192 /*
01193         Получение зарегистрированного формата прямоугольника.
01194 */
01195 
01196 class rom_Report;
01197 class rom_RepPage;
01198 class rom_RepFrame;
01199 class rom_RepFrameItem;
01200 
01201 class _EXTERN_ rom_RepItem
01202 /*
01203         Базовый класс для всех элементов отчета.
01204         Представляет интерфейс для отрисовки и проч.
01205         Все элемента объединяются в двунаправленный список
01206         в рамках отчета.
01207 */
01208 {
01209         friend class rom_Report;
01210 
01211         rom_RepItem     *Next, *Prev;
01212         /*
01213                 Ссылки списка элементов отчета.
01214         */
01215 
01216         rom_RepItem()
01217         /*
01218                 Только для использования в качестве головы списка элементов
01219                 (Report::m_ItemList).
01220         */
01221         {
01222                 m_Rep = NULL;
01223                 Next = Prev = this;
01224         }
01225 
01226 public:
01227 
01228         rom_Report      *m_Rep; // ссылка на отчет
01229 
01230         enum ItemType   // возможные типы элементов
01231         {
01232                 Line,           // строка текста (программы)
01233                 Frame,          // фрейм (графика отчета)
01234                 PageBreak,      // принудительный разрыв страницы
01235                 Dummy           // ничто
01236         };
01237 
01238         rom_RepItem(rom_Report* _rep, rom_RepItem* _before);
01239         /*
01240                 Создание очередного элемента в отчете (_rep) и вставка его перед указанным элементом (_before).
01241                 Если _before == NULL, то элемент вставляется в конец отчета.
01242         */
01243 
01244         virtual ~rom_RepItem();
01245 
01246         virtual ItemType Type() const
01247         /*
01248                 Возвращает тип элемента
01249         */
01250         {
01251                 return Dummy;
01252         }
01253 
01254         virtual bool In(rom_InStream& _in)
01255         /*
01256                 Ввод элемента из потока
01257         */
01258         {
01259                 return true;
01260         }
01261 
01262         virtual bool Out(rom_OutStream& _out)
01263         /*
01264                 Вывод элемента в поток
01265         */
01266         {
01267                 return true;
01268         }
01269 
01270         virtual rom_RepItem* Clone(rom_Report* _rep, rom_RepItem* _before)
01271         /*
01272                 Дублирование элемента в отчете (_rep).
01273         */
01274         {
01275                 return new rom_RepItem(_rep, _before);
01276         }
01277 
01281         virtual int Height() const
01282         {
01283                 return 0;
01284         }
01285 
01292         virtual void Draw(rom_DC& _dc, word4 _flags, rom_RepDrawContext* _dx = NULL) const throw(){}
01293 
01297         virtual int     MinHeight() const
01298         {
01299                 return 0;
01300         }
01301 
01306         virtual void Scale(unsigned int _a, unsigned int _b) throw(){}
01307         
01308 };
01309 
01310 struct _EXTERN_ rom_RepPageItem
01311 /*
01312         Элемент постраничной разбивки отчета
01313 */
01314 {
01315                 rom_RepItem* m_Item;                    // элемент отчета
01316                 int     m_Offset;                               // смещение от начала страницы
01317                 rom_RepPage* m_Page;                    // страница
01318                 rom_RepPageItem *Next, *Prev;   // двунаправленный список элементов разбивки
01319 };
01320 
01321 class _EXTERN_ rom_RepPage
01322 /*
01323    Страница отчета в постраничной разбивке.
01324 */
01325 {
01326    rom_Report* m_Rep;  // отчет
01327    int m_Number;       // номер страницы
01328    rom_RepPageItem m_ItemList; // список элементов на странице
01329 
01330 public:
01331 
01332    rom_RepPage(rom_Report* rep);
01333    /*
01334        Добавление новой страницы в конец списка страниц.
01335    */
01336 
01337    ~rom_RepPage();
01338 
01339    rom_RepPageItem* GetFirstItem();
01340    /*
01341        Получние первого элемента на странице (NULL если страница пуста).
01342    */
01343 
01344    rom_RepPageItem* GetLastItem() const throw();
01345    /*
01346        Получение последнего элемента на странице (NULL если страница пуста).
01347    */
01348 
01349    rom_RepPageItem* GetNextItem(rom_RepPageItem* _item);
01350    /*
01351        Получение следующего элемента на странице (NULL для последнего элемента).
01352    */
01353 
01354    rom_RepPageItem* GetPrevItem(rom_RepPageItem* _item);
01355    /*
01356        Получение предыдущего элемента на странице (NULL для первого элемента).
01357    */
01358 
01359    BOOL IsEmpty();
01360    /*
01361        Признак пустой страницы
01362    */
01363 
01364    /*  \brief Проверяет наличие свободного пространства на странице для
01365                           размещение одного или нескольких элементов отчета. 
01366                           
01367            Список элементов задается начиная с параметра _item и должен завершаться NULL.
01368        Подстчет свободного пространства начинается с последнего размещенного
01369        на странице элемента.
01370 
01371            \param       _dc             Контекст устройства.
01372            \param       _item   Начало списка элементов.
01373    */
01374    BOOL HasSpaceFor(rom_DC& _dc, rom_RepItem* _item, ...);
01375 
01376    void Add(rom_RepItem* _item);
01377    /*
01378        Размещение элемента отчета _item на странице (элемент добавляется
01379        в конец страницы).
01380    */
01381 
01382    int GetTopMargin();
01383    /*
01384        Размер верхнего поля (1/100 мм).
01385    */
01386 
01387    int GetBottomMargin();
01388    /*
01389        Размер нижнего поля (1/100 мм).
01390    */
01391 
01392    int GetLeftMargin();
01393    /*
01394        Размер левого поля (1/100 мм).
01395    */
01396 
01397    int GetRightMargin();
01398    /*
01399        Размер правого поля (1/100 мм).
01400    */
01401 
01402    int GetLength();
01403    /*
01404        Высота страницы без учета полей (1/100 мм).
01405    */
01406 
01407    int GetWidth();
01408    /*
01409        Ширина страницы без учета полей (1/100 мм).
01410    */
01411 
01416    int GetFreeWorkspace(rom_DC& _dc) const throw();
01417 
01422    void DrawContents(rom_DC& _dc, rom_RepDrawContext* _dx = NULL);
01423 
01424    /*   \brief  Вывод страницы на печать.
01425 
01426                 \param  _dc     Контекст устройства вывода.
01427    */
01428    void Print(rom_DCPrinter& _hdc, rom_RepDrawContext* _dx = NULL);
01429 
01430    int GetNumber() const
01431    /* 
01432         Получение номера страницы.
01433    */
01434    {
01435        return m_Number;
01436    }
01437 
01438 };
01439 
01440 class _EXTERN_ rom_RepLine:public rom_RepItem
01441 /*
01442         Строка программного текста в отчете.
01443 */
01444 {
01445         rom_String m_Line;      // содержимое строки
01446 
01447 public:
01448 
01449         rom_RepLine(rom_Report* _rep, rom_RepItem* _before):rom_RepItem(_rep, _before)
01450         /*
01451                 Конструктор пустой строки.
01452                 При создании строка вставляется в отчет _rep перед элементом _before.
01453                 (NULL -- конец отчета).
01454         */
01455         {
01456         }
01457 
01458         rom_RepLine(rom_Report* _rep, const char* _s, rom_RepItem* _before):rom_RepItem(_rep, _before), m_Line(_s)
01459         /*
01460                 Контсруктор строки с заданным содержимым.
01461                 При создании строка вставляется в отчет _rep перед заданной строкой _before
01462                 (NULL -- конец отчета).
01463         */
01464         {
01465         }
01466 
01467         ~rom_RepLine()
01468         {
01469         }
01470 
01471    ItemType Type() const
01472    /*
01473       См. RepItem.
01474    */
01475    {
01476       return Line;
01477    }
01478 
01479         bool            In(rom_InStream& in);
01480         /*
01481                 Ввод строки из потока (строк не должна быть заковычена).
01482         */
01483 
01484         bool            Out(rom_OutStream& out);
01485         /*
01486                 Вывод строки в поток.
01487         */
01488 
01489         const char* CStr()
01490         /*
01491                 Возвращает ссылку на буфер строки.
01492                 Строка возвращается только на чтение.
01493         */
01494         {
01495                 return m_Line.CStr();
01496         }
01497 
01498         rom_RepItem* Clone(rom_Report* _rep, rom_RepItem* _before);
01499         /*
01500                 Создание копии строки в другом (или том же) отчете
01501                 (см. RomItem::Clone).
01502         */
01503 
01504         /************************************************************/
01505         /* Эти функции -- рудимент, который в ближайшее время       */
01506         /* отпадет и на него лучше не расчитывать :)                            */
01507 
01508         void Insert(const char* _s, int p = -1);
01509 
01510         void Insert(int _c , int _p = -1)
01511         {
01512                 char s[2];
01513 
01514                 s[0] = _c;
01515                 s[1] = '\0';
01516                 Insert(s, _p);
01517         }
01518 
01519         void Remove(int p, int l = -1);
01520 
01521         rom_String Substr(int p, int l = -1);
01522 
01523         /* Конец рудимента                                          */
01524         /************************************************************/
01525 
01526         int GetLength() const
01527         /*
01528                 Возвращает длину строки.
01529         */
01530         {
01531                 return m_Line.GetLength();
01532         }
01533 
01534         int Height() const
01535         /*
01536                 Высота завивт от шрифта, а мы его сейчас не знаем -- потому 0.
01537         */
01538         {
01539                 return 0;
01540         }
01541 };
01542 
01544 class _EXTERN_ rom_RepFrameItem
01545 {
01546         friend class rom_RepFrame;
01547 
01548         rom_RepFrameItem *Next, *Prev;  
01549 
01551         rom_RepFrameItem();
01552 
01553 protected:
01554 
01555         rom_RepFrame*   m_Frame;                
01556 
01557 public:
01558 
01559         rom_String              m_Name;         
01560         rom_Rect                m_Rc;           
01561 
01563         enum itemType
01564         {
01565                 itemNone,                               
01566                 itemRectangle,                  
01567                 itemBitmap,                             
01568                 itemCircle,                             
01569                 itemDiagonal                    
01570         };
01571 
01575         virtual int Type()
01576         {
01577                 return itemNone;
01578         }
01579 
01586         rom_RepFrameItem(rom_RepFrame* _frame, rom_RepFrameItem* _before = NULL);
01587 
01589         virtual ~rom_RepFrameItem();
01590 
01595         virtual bool In(rom_InStream& _in);
01596 
01601         virtual bool Out(rom_OutStream& _out);
01602 
01607         virtual rom_RepFrameItem* Clone(rom_RepFrame* _frame);
01608 
01615         virtual void Draw(rom_DC& _dc, word4 _flags, rom_RepDrawContext* _dx = NULL) const throw(){}
01616 
01622     void MoveBefore(rom_RepFrameItem* _before);
01623 
01628         virtual void Scale(unsigned int _a, unsigned int _b) throw();
01629 
01630 };
01631 
01633 class _EXTERN_ rom_RepFrameRectangle:public rom_RepFrameItem
01634 {
01635         void DrawBorders(rom_DC& _dc, const rom_Rect& _rc) const throw();
01636         void FillRectangle(rom_DC& _dc, const rom_Rect& _rc) const throw();
01637         void DrawText(rom_DC& _hdc, const rom_Rect& _rc) const;
01638 
01652         unsigned char m_Border[4];
01653 
01654         int PackBorderWidths() const throw();
01655 
01656         int PackBorderStyles() const throw();
01657 
01658 public:
01659         rom_String              m_Text;                 
01660         rom_TextHAlignment      m_HorzAlign;    
01661         rom_TextVAlignment      m_VertAlign;    
01662         rom_String              m_FontName;             
01663         rom_FontCharset m_CharSet;              
01664         int                             m_FontSize;             
01665         rom_FontWeight  m_FontWeight;   
01666         bool                    m_Italic;               
01667         bool                    m_StrikeOut;    
01668         bool                    m_Underline;    
01669         rom_Colour              m_TextColor;    
01670         rom_TextOrientation     m_Orient;               
01671 //      int                             m_Borders;              //!< Обрамление: 0x1 - up, 0x2 - bot, 0x4 - left, 0x8 - right.
01672         int                             m_BordersStyle; 
01673         rom_Colour              m_TopColor;             
01674         rom_Colour              m_BotColor;             
01675         rom_Colour              m_LeftColor;    
01676         rom_Colour              m_RightColor;   
01677         rom_BrushStyle  m_FillStyle;    
01678         rom_Colour              m_FillColor;    
01679 
01680         void SetBorder(int _flags, int _widths);
01681 
01682         void SetBorder(int _styles) throw();
01683 
01684         void SetBorder(int _i, rom_PenStyle _s);
01685 
01686         rom_PenStyle GetBorder(int _i) const{return (rom_PenStyle)m_Border[_i];}
01687 
01690         int Type()
01691         {
01692                 return itemRectangle;
01693         }
01694         
01697         rom_RepFrameRectangle(rom_RepFrame* _frame, rom_RepFrameItem* _before = NULL);
01698 
01701         bool In(rom_InStream& _in);
01702 
01705         bool Out(rom_OutStream& _out);
01706 
01709         rom_RepFrameItem* Clone(rom_RepFrame* _frame);
01710 
01717         void Draw(rom_DC& _dc, word4 _flags, rom_RepDrawContext* _dx) const throw();
01718 
01721         HBRUSH CreateBrush() const;
01722 
01723 
01724         int PackBorderFlags() const throw();
01725 
01730         void Scale(unsigned int _a, unsigned int _b) throw();
01731 
01732 };
01733 
01734 class _EXTERN_ rom_RepFrameBitmap:public rom_RepFrameItem
01735 /*
01736         Графический примитив -- изображение
01737 */
01738 {
01739 public:
01740 
01741         rom_String      m_FileName;     // файл с изображением
01742         bool    m_Stretch;      // признак растяжения
01743 
01744         int Type()
01745         /*
01746                 См. RepFrameItem
01747         */
01748         {
01749                 return itemBitmap;
01750         }
01751 
01752         rom_RepFrameBitmap(rom_RepFrame* _frame, rom_RepFrameItem* _before = NULL):rom_RepFrameItem(_frame, _before){}
01753         /*
01754                 Добавление изображения к фрейму
01755         */
01756 
01757         bool In(rom_InStream& _in);
01758         /*
01759                 Ввод изображения из потока
01760         */
01761 
01762         bool Out(rom_OutStream &_out);
01763         /*
01764                 Вывод изображения в поток
01765         */
01766 
01767         rom_RepFrameItem* Clone(rom_RepFrame* _frame);
01768         /*
01769                 Копирование изображения
01770         */
01771 
01772         void Draw(rom_DC& _hdc, word4 _flags, rom_RepDrawContext* _dx = NULL) const;
01773         /*
01774                 Отрисовка изображения
01775         */
01776 };
01777 
01778 class _EXTERN_ rom_RepFrameCircle:public rom_RepFrameItem
01779 /*
01780         Графический примитив -- круг
01781 */
01782 {
01783 public:
01784 
01785         rom_Colour m_Color;             // цвет рисования
01786         rom_PenStyle m_LineStyle;       // 0 - сплошная линия, 1 - пунктир, 2 - точками
01787 
01788         int Type()
01789         /*
01790                 См. RepFrameItem
01791         */
01792         {
01793                 return itemCircle;
01794         }
01795 
01796         rom_RepFrameCircle(rom_RepFrame* _frame, rom_RepFrameItem* _before = NULL):rom_RepFrameItem(_frame, _before)
01797         /*
01798                 Добавление круга к фрейму :)
01799         */
01800         {
01801         }
01802 
01803         bool In(rom_InStream & _in);
01804         /*
01805                 Ввод из потока
01806         */
01807 
01808         bool Out(rom_OutStream &_out);
01809         /*
01810                 Вывод в поток
01811         */
01812 
01813         rom_RepFrameItem* Clone(rom_RepFrame* _frame);
01814         /*
01815                 Копирование
01816         */
01817 
01818         void Draw(rom_DC& _dc, word4 _flags, rom_RepDrawContext* _dx) const;
01819         /*
01820                 Отрисовка
01821         */
01822 };
01823 
01824 class _EXTERN_ rom_RepFrameDiagonal:public rom_RepFrameItem
01825 /*
01826         Графический примитив -- перечеркивание
01827 */
01828 {
01829 public:
01830 
01831         rom_Colour              m_Color;        // цвет
01832 //      byte                    m_Width;        // толстота
01833 //      rom_PenStyle    m_Style;        // стиль: 0 - сплошная линия, 1 - пунктир, 2 - точками
01834         byte                    m_Dir;          // 0 - (top_left, bottom_right), 1 - (bottom_left, top_right)
01835         rom_PenStyle    m_Style;
01836 
01837         int Type()
01838         /*
01839                 См. RepFrameItem
01840         */
01841         {
01842                 return itemDiagonal;
01843         }
01844 
01845         rom_RepFrameDiagonal(rom_RepFrame *_frame, rom_RepFrameItem* _before = NULL):rom_RepFrameItem(_frame, _before)
01846         /*
01847                 Добавление к фрейму
01848         */
01849         {
01850         }
01851 
01852         bool In(rom_InStream &_in);
01853         /*
01854                 См. RepFrameItem
01855         */
01856 
01857         bool Out(rom_OutStream &_out);
01858         /*
01859                 См. RepFrameItem
01860         */
01861 
01862         rom_RepFrameItem* Clone(rom_RepFrame *_frame);
01863         /*
01864                 См. RepFrameItem
01865         */
01866 
01867         void Draw(rom_DC& _dc, word4 _flags, rom_RepDrawContext* _dx) const;
01868         /*
01869                 См. RepFrameItem
01870         */
01871 };
01872 
01874 class _EXTERN_ rom_RepFrame:public rom_RepItem
01875 {
01876         friend class rom_RepFrameItem;
01877 
01878 protected:
01879 
01880         rom_RepFrameItem m_ItemList;    
01881 
01882 public:
01883 
01884         int     m_Height;       
01885 
01894         rom_RepFrame(rom_Report* _rep, rom_RepItem* _before) throw():rom_RepItem(_rep, _before){}
01895 
01896         ~rom_RepFrame();
01897 
01904         ItemType Type()const
01905         {
01906            return Frame;
01907         }
01908 
01914         bool In(rom_InStream& _in);
01915 
01921         bool Out(rom_OutStream& out);
01922 
01927         rom_RepFrameItem* GetFirstItem(rom_RepFrameItem::itemType _type = rom_RepFrameItem::itemNone) const;
01928         
01935         rom_RepFrameItem* GetLastItem(rom_RepFrameItem::itemType type = rom_RepFrameItem::itemNone) const;
01936         
01942         rom_RepFrameItem* GetNextItem(rom_RepFrameItem* _item, rom_RepFrameItem::itemType type = rom_RepFrameItem::itemNone) const;
01943 
01949         rom_RepFrameItem* GetPrevItem(rom_RepFrameItem* _item, rom_RepFrameItem::itemType type = rom_RepFrameItem::itemNone) const;
01950 
01955         rom_RepFrameItem* FindItem(const char* _name);
01956 
01960         int     GetItemsCount() const;
01961 
01968         rom_RepItem* Clone(rom_Report* _rep, rom_RepItem* _before);
01969 
01974         int     Height() const
01975         {
01976                 return m_Height;
01977         }
01978 
01987         void Draw(rom_DC& _dc, word4 _flag, rom_RepDrawContext* _dx = NULL) const throw();
01988 
01997         rom_RepFrame* SubFrame(rom_Report* _rep, LPRECT _rc, rom_RepItem* _before);
01998 
02004         int     MinHeight() const;
02005 
02008         void Clear();
02009 
02015         void Scale(unsigned int _a, unsigned int _b) throw();
02016 
02017 };
02018 
02019 class _EXTERN_ rom_RepPageBreak:public rom_RepItem
02020 /*
02021         Принудительный разрыв страницы
02022 */
02023 {
02024         static int      m_Height;               // высота символа при выводе (некая константа)
02025 
02026 public:
02027 
02028         rom_RepPageBreak(rom_Report* _rep, rom_RepItem* _before):rom_RepItem(_rep, _before){}
02029         /*
02030                 Создание разрыва страницы в отчете _rep и добавление его перед указанным элементом
02031                 _before.
02032         */
02033 
02034    ItemType Type() const
02035    /*
02036       См. RepItem
02037    */
02038    {
02039       return PageBreak;
02040    }
02041 
02042         bool In(rom_InStream& _in);
02043         /*
02044                 См. RepItem
02045         */
02046 
02047         bool Out(rom_OutStream& _out);
02048         /*
02049                 См. RepItem
02050         */
02051 
02052         rom_RepItem* Clone(rom_Report* _rep, rom_RepItem* _before);
02053         /*
02054                 См. RepItem
02055         */
02056         
02057         int Height() const;
02058         /*
02059                 См. RepItem
02060         */
02061 };
02062 
02065 class _EXTERN_ rom_Report
02066 {
02067         friend class rom_RepItem;
02068         friend class rom_RepPage;
02069 
02070         rom_RepItem     m_ItemList;
02071         rom_RepPage** m_PageArray;
02072         int m_PageArrayLength;  
02073         int m_PageArraySize;
02074 
02075         void ExtendPageArray();
02076         int AppendPage(rom_RepPage* _page);
02077         void RemovePage(int _number);
02078 
02079 public:
02080 
02081         rom_PaperOrientation    m_Orient;               
02082         rom_PaperSize                   m_PaperSize;    
02083         int             m_TopMargin;                                    
02084         int             m_LeftMargin;                                   
02085         int             m_BottomMargin;                                 
02086         int             m_RightMargin;                                  
02087 
02094         rom_Report();   
02095 
02096         ~rom_Report();  
02097 
02098         BOOL            Open(const char* _file, BOOL _oem = FALSE);
02099 
02100         BOOL            Save(const char* file, BOOL oem = FALSE);
02101 
02102         BOOL            Save(rom_OutStream& out);
02103 
02104         BOOL            SaveHeader(rom_OutStream &out);
02105 
02106         BOOL            Open(rom_InStream& _in);
02107 
02108         BOOL            SendToClipboard(HWND);
02109 
02110         BOOL            GetFromClipboard(HWND);
02111 
02112         void            Clear();        
02113 
02114         void            ClearPages();   
02115 
02116         rom_RepItem* GetFirstItem();
02117 
02118         rom_RepItem* GetNextItem(rom_RepItem* _item);
02119 
02120         int                     GetItemsCount();
02121 
02122         rom_RepPage* GetPage(int i);    
02123 
02124         int                     GetTotalPages();        
02125 
02126         int                     GetWorkspaceLength(rom_DC& _dc);
02127 
02128         int                     GetPageWidth();
02129 
02130         int                     GetPageLength();
02131 
02132         BOOL            SetupPageProperties(HWND _pParent);
02133 
02134         void            Make(ole_excel::data *_cells);
02135 
02143    void Paginate(rom_DC& _hdc);
02144  
02155    void Print
02156            (
02157                         rom_DCPrinter& _dc, 
02158                         const char* _job_name, 
02159                         int (*_monit)(rom_RepPage* _page, void* _ptr) = NULL, 
02160                         void* _ptr = NULL,
02161                         rom_RepDrawContext* _dx = NULL
02162                 );
02163 
02164 #ifdef _ROMLIB_XML_
02165 
02176         rom_XMLElement* ConvertToXML
02177                 (
02178                         rom_XMLDocument* _parent,
02179                         bool _comment_rep_line = true
02180                 ) throw(...);
02181 
02182 #endif
02183 
02192         void Scale(unsigned int _a, unsigned int _b) throw();
02193 
02202         void Scale(rom_PaperSize _size, rom_PaperOrientation _orient) throw();
02203 
02204 };
02205 
02206 class _EXTERN_ rom_RepDrawContext
02207 {
02208 public:
02209 
02210         bool            m_PageContentsBorderFlag;               
02211 
02212         rom_Colour      m_PageContentsBorderColor;              
02213 
02214         rom_RepDrawContext();
02215 
02223         virtual void DrawPageContents(rom_DC& _dc, rom_RepPage* _page);
02224 
02231         virtual void DrawPageItem(rom_DC& _dc, rom_RepPageItem* _item);
02232 
02233         virtual void OnDrawFrameRectangle(rom_DC& _hdc, const rom_RepFrameRectangle* _item, const rom_Rect& _rc){};
02234 };
02235 
02236 #endif
02237 
 Указатель Классы Функции Переменные Перечисления Элементы перечислений