romlib
1.0
|
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