source: trunk/Lucide/SOURCE/gui/pluginViewDlg.cpp @ 26

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

First import

File size: 5.8 KB
Line 
1#define INCL_WIN
2#include <os2.h>
3
4#include "luutils.h"
5#include "pluginViewDlg.h"
6#include "Lucide_res.h"
7#include "messages.h"
8
9
10PluginViewDlg::PluginViewDlg( HWND hWndFrame, PluginInfoList *plist )
11{
12    hFrame   = hWndFrame;
13    plugins  = plist;
14    pname    = newstrdupL( PLUGLIST_PLUGIN_NAME );
15    suppexts = newstrdupL( PLUGLIST_SUPP_EXTS );
16    pdesc    = newstrdupL( PLUGLIST_PLUGIN_DESC );
17}
18
19PluginViewDlg::~PluginViewDlg()
20{
21    delete pname;
22    delete suppexts;
23    delete pdesc;
24}
25
26void PluginViewDlg::doDialog()
27{
28    WinDlgBox( HWND_DESKTOP, hFrame, pluginViewDlgProc,
29               NULLHANDLE, IDD_VIEWPLUGINS, this );
30    delete this;
31}
32
33
34struct ListRec
35{
36    MINIRECORDCORE miniRecordCore;
37    PSZ extensions;
38    PSZ description;
39};
40
41
42MRESULT EXPENTRY PluginViewDlg::pluginViewDlgProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
43{
44    // This is a static method, so we don't know which instantiation we're
45    // dealing with. But we can get a pseudo-this from the parameter to
46    // WM_INITDLG, which we therafter store with the window and retrieve
47    // as follows:
48    PluginViewDlg *_this = (PluginViewDlg *)WinQueryWindowULong( hwnd, QWL_USER );
49
50    switch (msg)
51    {
52
53        // Dialog has just been created
54        case WM_INITDLG:
55        {
56            // Save the mp2 into our user data so that subsequent calls have
57            // access to the parent C++ object
58            WinSetWindowULong( hwnd, QWL_USER, (ULONG)mp2 );
59            _this = (PluginViewDlg *)mp2;
60            localizeDialog( hwnd );
61            centerWindow( _this->hFrame, hwnd );
62
63            // init container
64            HWND cntr = WinWindowFromID( hwnd, IDC_PLUGINSLIST );
65            CNRINFO ci;
66            ci.cb = sizeof( CNRINFO );
67            WinSendMsg( cntr, CM_QUERYCNRINFO, MPFROMP( &ci ), MPFROMSHORT( ci.cb ) );
68            ci.flWindowAttr &= ~( CV_NAME | CV_FLOW | CV_TEXT | CV_ICON );
69            ci.flWindowAttr |= ( CV_DETAIL | CV_MINI | CA_DETAILSVIEWTITLES );
70            WinSendMsg( cntr, CM_SETCNRINFO, MPFROMP( &ci ), MPFROMLONG( CMA_FLWINDOWATTR ) );
71
72            PFIELDINFO pFieldInfo = (PFIELDINFO)WinSendMsg( cntr, CM_ALLOCDETAILFIELDINFO,
73                                             MPFROMSHORT( 3 ), MPVOID );
74            PFIELDINFO pFldInfo = pFieldInfo;
75            pFldInfo->cb = sizeof( FIELDINFO );
76            pFldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
77            pFldInfo->flTitle = CFA_CENTER;
78            pFldInfo->pTitleData = (PVOID)_this->pname;
79            pFldInfo->offStruct = FIELDOFFSET( ListRec, miniRecordCore.pszIcon );
80            pFldInfo = pFldInfo->pNextFieldInfo;
81            pFldInfo->cb = sizeof( FIELDINFO );
82            pFldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
83            pFldInfo->flTitle = CFA_CENTER;
84            pFldInfo->pTitleData = (PVOID)_this->suppexts;
85            pFldInfo->offStruct = FIELDOFFSET( ListRec, extensions );
86            pFldInfo = pFldInfo->pNextFieldInfo;
87            pFldInfo->cb = sizeof( FIELDINFO );
88            pFldInfo->flData = CFA_STRING | CFA_HORZSEPARATOR | CFA_SEPARATOR;
89            pFldInfo->flTitle = CFA_CENTER;
90            pFldInfo->pTitleData = (PVOID)_this->pdesc;
91            pFldInfo->offStruct = FIELDOFFSET( ListRec, description );
92
93            FIELDINFOINSERT fieldInfoInsert;
94            fieldInfoInsert.cb = sizeof( FIELDINFOINSERT );
95            fieldInfoInsert.pFieldInfoOrder = (PFIELDINFO)CMA_FIRST;
96            fieldInfoInsert.cFieldInfoInsert = 3;
97            fieldInfoInsert.fInvalidateFieldInfo = TRUE;
98            WinSendMsg( cntr, CM_INSERTDETAILFIELDINFO, MPFROMP( pFieldInfo ), MPFROMP( &fieldInfoInsert ) );
99
100            for ( int i = 0; i < _this->plugins->size(); i++ )
101            {
102                PluginInfo *pi = &(*_this->plugins)[ i ];
103
104                ListRec *r = (ListRec *)WinSendMsg( cntr, CM_ALLOCRECORD,
105                    MPFROMLONG( ( sizeof( ListRec ) - sizeof( MINIRECORDCORE ) ) ),
106                                            MPFROMSHORT( 1 ) );
107
108                r->miniRecordCore.cb = sizeof( MINIRECORDCORE );
109                r->miniRecordCore.flRecordAttr = 0;
110                r->miniRecordCore.ptlIcon.x = 0;
111                r->miniRecordCore.ptlIcon.y = 0;
112                r->miniRecordCore.pszIcon = newstrdup( pi->name.c_str() );
113                r->miniRecordCore.hptrIcon = NULLHANDLE;
114                r->extensions = newstrdup( pi->extensions.c_str() );
115                r->description = newstrdup( pi->description.c_str() );
116
117                RECORDINSERT ri;
118                ri.cb = sizeof( RECORDINSERT );
119                ri.pRecordParent= NULL;
120                ri.pRecordOrder = (PRECORDCORE)CMA_END;
121                ri.zOrder = (USHORT)CMA_TOP;
122                ri.cRecordsInsert = 1;
123                ri.fInvalidateRecord = TRUE;
124                WinSendMsg( cntr, CM_INSERTRECORD, MPFROMP( r ), MPFROMP( &ri ) );
125            }
126
127            return (MRESULT)FALSE;
128        }
129
130        case WM_DESTROY:
131        {
132            HWND cntr = WinWindowFromID( hwnd, IDC_PLUGINSLIST );
133            ListRec *pRecords = (ListRec *)WinSendMsg( cntr, CM_QUERYRECORD,
134                                MPFROMP( NULL ), MPFROM2SHORT( CMA_FIRST, CMA_ITEMORDER ) );
135            ListRec *pr = pRecords;
136
137            while ( pr != NULL )
138            {
139                delete pr->miniRecordCore.pszIcon;
140                delete pr->extensions;
141                delete pr->description;
142                pr = (ListRec *)WinSendMsg( cntr, CM_QUERYRECORD,
143                                    MPFROMP( pr ), MPFROM2SHORT( CMA_NEXT, CMA_ITEMORDER ) );
144            }
145            WinSendMsg( cntr, CM_REMOVERECORD, MPFROMP( NULL ), MPFROM2SHORT( 0, CMA_FREE ) );
146        }
147        break;
148
149    }
150    return WinDefDlgProc( hwnd, msg, mp1, mp2 );
151}
152
153
Note: See TracBrowser for help on using the repository browser.