source: trunk/Lucide/SOURCE/gui/docInfoDlg.cpp @ 20

Last change on this file since 20 was 2, checked in by Eugene Romanenko, 16 years ago

First import

File size: 6.2 KB
Line 
1#define INCL_WIN
2#include <os2.h>
3
4#include <string>
5
6#include <ludoc.xh>
7
8#include "luutils.h"
9#include "docInfoDlg.h"
10#include "Lucide_res.h"
11#include "messages.h"
12
13
14DocInfoDlg::DocInfoDlg( HWND hWndFrame, LuDocumentInfo *_dinfo )
15{
16    hFrame   = hWndFrame;
17    dinfo    = _dinfo;
18}
19
20DocInfoDlg::~DocInfoDlg()
21{
22}
23
24void DocInfoDlg::doDialog()
25{
26    WinDlgBox( HWND_DESKTOP, hFrame, docInfoDlgProc,
27               NULLHANDLE, IDD_DOCINFO, this );
28    delete this;
29}
30
31
32struct ListRec
33{
34    MINIRECORDCORE miniRecordCore;
35    PSZ value;
36};
37
38
39void DocInfoDlg::insertPair( HWND cntr, const char *key, const char *value )
40{
41    ListRec *r = (ListRec *)WinSendMsg( cntr, CM_ALLOCRECORD,
42        MPFROMLONG( ( sizeof( ListRec ) - sizeof( MINIRECORDCORE ) ) ),
43                                MPFROMSHORT( 1 ) );
44
45    r->miniRecordCore.cb = sizeof( MINIRECORDCORE );
46    r->miniRecordCore.flRecordAttr = 0;
47    r->miniRecordCore.ptlIcon.x = 0;
48    r->miniRecordCore.ptlIcon.y = 0;
49    r->miniRecordCore.pszIcon = newstrdupL( key );
50    r->miniRecordCore.hptrIcon = NULLHANDLE;
51    r->value = newstrdup( value );
52
53    RECORDINSERT ri;
54    ri.cb = sizeof( RECORDINSERT );
55    ri.pRecordParent= NULL;
56    ri.pRecordOrder = (PRECORDCORE)CMA_END;
57    ri.zOrder = (USHORT)CMA_TOP;
58    ri.cRecordsInsert = 1;
59    ri.fInvalidateRecord = TRUE;
60    WinSendMsg( cntr, CM_INSERTRECORD, MPFROMP( r ), MPFROMP( &ri ) );
61}
62
63
64void DocInfoDlg::loadValues( HWND cntr )
65{
66    if ( dinfo == NULL ) {
67        return;
68    }
69
70    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_TITLE ) {
71        insertPair( cntr, DOCINFO_TITLE, dinfo->title );
72    }
73    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_FORMAT ) {
74        insertPair( cntr, DOCINFO_FORMAT, dinfo->format );
75    }
76    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_AUTHOR ) {
77        insertPair( cntr, DOCINFO_AUTHOR, dinfo->author );
78    }
79    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_SUBJECT ) {
80        insertPair( cntr, DOCINFO_SUBJECT, dinfo->subject );
81    }
82    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_KEYWORDS ) {
83        insertPair( cntr, DOCINFO_KEYWORDS, dinfo->keywords );
84    }
85    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_CREATOR ) {
86        insertPair( cntr, DOCINFO_CREATOR, dinfo->creator );
87    }
88    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_PRODUCER ) {
89        insertPair( cntr, DOCINFO_PRODUCER, dinfo->producer );
90    }
91    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_CREATION_DATE ) {
92        insertPair( cntr, DOCINFO_CREATION_DATE,
93                    time2string( dinfo->creation_date ).c_str() );
94    }
95    if ( dinfo->fields_mask & LU_DOCUMENT_INFO_MOD_DATE ) {
96        insertPair( cntr, DOCINFO_MOD_DATE,
97                    time2string( dinfo->modified_date ).c_str() );
98    }
99}
100
101
102MRESULT EXPENTRY DocInfoDlg::docInfoDlgProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
103{
104    // This is a static method, so we don't know which instantiation we're
105    // dealing with. But we can get a pseudo-this from the parameter to
106    // WM_INITDLG, which we therafter store with the window and retrieve
107    // as follows:
108    DocInfoDlg *_this = (DocInfoDlg *)WinQueryWindowULong( hwnd, QWL_USER );
109
110    switch (msg)
111    {
112
113        // Dialog has just been created
114        case WM_INITDLG:
115        {
116            // Save the mp2 into our user data so that subsequent calls have
117            // access to the parent C++ object
118            WinSetWindowULong( hwnd, QWL_USER, (ULONG)mp2 );
119            _this = (DocInfoDlg *)mp2;
120            localizeDialog( hwnd );
121            centerWindow( _this->hFrame, hwnd );
122
123            // init container
124            HWND cntr = WinWindowFromID( hwnd, IDC_PROPSLIST );
125            CNRINFO ci;
126            ci.cb = sizeof( CNRINFO );
127            WinSendMsg( cntr, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
128            ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON | CA_DETAILSVIEWTITLES );
129            ci.flWindowAttr |= ( CV_DETAIL | CV_MINI );
130            WinSendMsg( cntr, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
131
132            PFIELDINFO pFieldInfo = (PFIELDINFO)WinSendMsg( cntr, CM_ALLOCDETAILFIELDINFO,
133                                             MPFROMSHORT( 2 ), MPVOID );
134            PFIELDINFO pFldInfo = pFieldInfo;
135            pFldInfo->cb = sizeof( FIELDINFO );
136            pFldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR;
137            pFldInfo->flTitle = CFA_CENTER;
138            pFldInfo->pTitleData = NULL;
139            pFldInfo->offStruct = FIELDOFFSET( ListRec, miniRecordCore.pszIcon );
140            pFldInfo = pFldInfo->pNextFieldInfo;
141            pFldInfo->cb = sizeof( FIELDINFO );
142            pFldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR;
143            pFldInfo->flTitle = CFA_CENTER;
144            pFldInfo->pTitleData = NULL;
145            pFldInfo->offStruct = FIELDOFFSET( ListRec, value );
146
147            FIELDINFOINSERT fieldInfoInsert;
148            fieldInfoInsert.cb = sizeof( FIELDINFOINSERT );
149            fieldInfoInsert.pFieldInfoOrder = (PFIELDINFO)CMA_FIRST;
150            fieldInfoInsert.cFieldInfoInsert = 2;
151            fieldInfoInsert.fInvalidateFieldInfo = TRUE;
152            WinSendMsg( cntr, CM_INSERTDETAILFIELDINFO,
153                   MPFROMP( pFieldInfo ), MPFROMP( &fieldInfoInsert ) );
154
155            _this->loadValues( cntr );
156
157            return (MRESULT)FALSE;
158        }
159
160        case WM_DESTROY:
161        {
162            HWND cntr = WinWindowFromID( hwnd, IDC_PROPSLIST );
163            ListRec *pRecords = (ListRec *)WinSendMsg( cntr, CM_QUERYRECORD,
164                                MPFROMP( NULL ), MPFROM2SHORT( CMA_FIRST, CMA_ITEMORDER ) );
165            ListRec *pr = pRecords;
166
167            while ( pr != NULL )
168            {
169                delete pr->miniRecordCore.pszIcon;
170                delete pr->value;
171                pr = (ListRec *)WinSendMsg( cntr, CM_QUERYRECORD,
172                                    MPFROMP( pr ), MPFROM2SHORT( CMA_NEXT, CMA_ITEMORDER ) );
173            }
174            WinSendMsg( cntr, CM_REMOVERECORD, MPFROMP( NULL ), MPFROM2SHORT( 0, CMA_FREE ) );
175        }
176        break;
177
178    }
179    return WinDefDlgProc( hwnd, msg, mp1, mp2 );
180}
181
182
Note: See TracBrowser for help on using the repository browser.