source: trunk/Lucide/SOURCE/gui/luutils.cpp @ 24

Last change on this file since 24 was 24, checked in by Eugene Romanenko, 15 years ago

open file: remember last used directory

File size: 11.8 KB
RevLine 
[2]1#define INCL_DOS
2#define INCL_WIN
3#define INCL_GPI
4#include <os2.h>
5
6#include <time.h>
7#include <stdio.h>
8#include <string.h>
9#include <strstrea.h>
10#include <string>
11
12#include "luutils.h"
13
14bool initCountryInfo();
15
16static COUNTRYINFO CtryInfo;
17static bool countryInfoLoaded = initCountryInfo();
18
19
20afbuf::afbuf( unsigned int s )
21{
22    size = s;
23    buffer = new char[ s ];
24    memset( buffer, 0, s );
25}
26
27void DestroyGraphicsBuffer( HPS hpsBuffer, HDC hdcBuffer )
28{
29    if( hpsBuffer && hdcBuffer )
30    {
31        HBITMAP hbm = GpiSetBitmap( hpsBuffer, NULLHANDLE );
32
33        if ( hbm != NULLHANDLE ) {
34            GpiDeleteBitmap( hbm );
35        }
36
37        GpiDestroyPS( hpsBuffer );
38        DevCloseDC( hdcBuffer );
39
40        hpsBuffer = hdcBuffer = NULLHANDLE;
41    }
42}
43
44void BlitGraphicsBuffer( HPS hps, HPS hpsBuffer, PRECTL prclPaint )
45{
46    POINTL aptl[ 3 ];
47
48    aptl[ 0 ].x = prclPaint->xLeft;
49    aptl[ 0 ].y = prclPaint->yBottom;
50    aptl[ 1 ].x = prclPaint->xRight;
51    aptl[ 1 ].y = prclPaint->yTop;
52    aptl[ 2 ].x = prclPaint->xLeft;
53    aptl[ 2 ].y = prclPaint->yBottom;
54
55    GpiBitBlt( hps, hpsBuffer, 3L, aptl, ROP_SRCCOPY, BBO_IGNORE );
56}
57
58BOOL CreateGraphicsBuffer( HAB hab, PRECTL prectl, HPS hps,
59                           HPS *phpsBuffer, HDC *phdcBuffer )
60{
61    LONG cPlanes;
62    LONG cBitCount;
63    ULONG ulFlags;
64    HBITMAP hbm;
65    BITMAPINFOHEADER bmp;
66    SIZEL sizl;
67    FONTMETRICS fm;
68    FATTRS fat;
69    SIZEF sizf;
70    HPS hpsBuffer;
71    HDC hdc, hdcBuffer;
72    hdc = GpiQueryDevice( hps );
73    ulFlags = GpiQueryPS( hps, &sizl );
74
75    hdcBuffer = DevOpenDC( hab, OD_MEMORY, "*",  0L, NULL, hdc );
76    if ( hdcBuffer )
77    {
78        sizl.cx = sizl.cy = 0;
79
80        hpsBuffer = GpiCreatePS( hab, hdcBuffer, &sizl, ulFlags | GPIA_ASSOC );
81
82        *phpsBuffer = hpsBuffer;
83        *phdcBuffer = hdcBuffer;
84
85        DevQueryCaps( hdc, CAPS_COLOR_PLANES, 1L, &cPlanes );
86        DevQueryCaps( hdc, CAPS_COLOR_BITCOUNT, 1L, &cBitCount );
87
88        bmp.cbFix     = sizeof( BITMAPINFOHEADER );
89        bmp.cx        = (SHORT)( prectl->xRight - prectl->xLeft );
90        bmp.cy        = (SHORT)( prectl->yTop - prectl->yBottom );
91        bmp.cPlanes   = (SHORT)cPlanes;
92        bmp.cBitCount = (SHORT)cBitCount;
93
94        hbm = GpiCreateBitmap( hpsBuffer, (PBITMAPINFOHEADER2)&bmp,
95                               0x0000, NULL, NULL );
96        if ( hbm )
97        {
98            GpiSetBitmap( hpsBuffer, hbm );
99            GpiQueryFontMetrics( hps, sizeof( FONTMETRICS ), &fm );
100
101            memset( &fat, 0, sizeof( fat ) );
102
103            fat.usRecordLength = sizeof( FATTRS );
104            fat.lMatch = fm.lMatch;
105            strcpy( fat.szFacename, fm.szFacename );
106
107            GpiDeleteSetId( hpsBuffer, 1L );
108            GpiCreateLogFont( hpsBuffer, 0, 1L, &fat );
109            GpiSetCharSet( hpsBuffer, 1L );
110
111            sizf.cx = MAKEFIXED( fm.lEmInc, 0 );
112            sizf.cy = MAKEFIXED( fm.lMaxBaselineExt, 0 );
113            GpiSetCharBox( hpsBuffer, &sizf );
114
115            return TRUE;
116        }
117
118        GpiDestroyPS( hpsBuffer );
119        DevCloseDC( hdcBuffer );
120        hpsBuffer = hdcBuffer = NULLHANDLE;
121    }
122
123    return FALSE;
124}
125
126
127char *newstrdup( const char *s )
128{
129    if ( s == NULL ) {
130        return NULL;
131    }
132    char *temp = new char[ strlen( s ) + 1 ];
133    strcpy( temp, s );
134    return temp;
135}
136
137
138struct ER_WINDOW_POS
139{
140    SWP    Swp;
141    USHORT XRestore;
142    USHORT YRestore;
143    USHORT CXRestore;
144    USHORT CYRestore;
145    USHORT XMinimize;
146    USHORT YMinimize;
147};
148
149
150BOOL PMRestoreWindowPos( PCSZ pIniName, PCSZ pAppName, PCSZ pKeyName,
151                         HWND hwnd, BOOL activate, BOOL chkCoord,
152                         BOOL min, BOOL max, BOOL hide )
153{
154    HINI          hini;
155    ER_WINDOW_POS wp;
156    ULONG         ulWpSize = sizeof( ER_WINDOW_POS );
157    ULONG         SwpOptions = SWP_MOVE | SWP_SIZE | SWP_SHOW;
158    BOOL          rval = FALSE;
159
160    if ( activate && !hide ) {
161        SwpOptions |= SWP_ACTIVATE;
162    }
163
164    if ( pIniName == NULL )  // ¯šè¥¬ ¢ user profile
165    {
166        hini = HINI_USER;
167    }
168    else
169    {
170        hini = PrfOpenProfile( WinQueryAnchorBlock( hwnd ), pIniName );
171    }
172
173    if ( hini != NULLHANDLE )
174    {
175        if ( PrfQueryProfileData( hini, pAppName, pKeyName, &wp, &ulWpSize ) )
176        {
177            if ( wp.Swp.fl & SWP_MAXIMIZE )  SwpOptions |= SWP_MAXIMIZE;
178            else if ( wp.Swp.fl & SWP_MINIMIZE )  SwpOptions |= SWP_MINIMIZE;
179
180            if ( min ) {
181                SwpOptions &= ~SWP_MAXIMIZE;
182                SwpOptions |= SWP_MINIMIZE;
183            }
184            if ( max ) {
185                SwpOptions &= ~SWP_MINIMIZE;
186                SwpOptions |= SWP_MAXIMIZE;
187            }
188            if ( hide ) {
189                SwpOptions &= ~SWP_SHOW;
190                SwpOptions |= SWP_HIDE;
191            }
192
193            if ( chkCoord )
194            {
195                LONG sx, sy;
196                sx = WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN );
197                sy = WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN );
198
199                if ( wp.Swp.x > sx )  wp.Swp.x = sx - wp.Swp.cx;
200                if ( wp.Swp.y > sy )  wp.Swp.y = sy - wp.Swp.cy;
201            }
202
203            WinSetWindowPos( hwnd, NULLHANDLE,
204                             wp.Swp.x, wp.Swp.y, wp.Swp.cx, wp.Swp.cy,
205                             SwpOptions );
206
207            WinSetWindowUShort( hwnd, QWS_XRESTORE,  wp.XRestore );
208            WinSetWindowUShort( hwnd, QWS_YRESTORE,  wp.YRestore );
209            WinSetWindowUShort( hwnd, QWS_CXRESTORE, wp.CXRestore );
210            WinSetWindowUShort( hwnd, QWS_CYRESTORE, wp.CYRestore );
211            WinSetWindowUShort( hwnd, QWS_XMINIMIZE, wp.XMinimize );
212            WinSetWindowUShort( hwnd, QWS_YMINIMIZE, wp.YMinimize );
213            rval = TRUE;
214        }
215
216        if ( pIniName != NULL )  PrfCloseProfile( hini );
217    }
218    return rval;
219}
220
221void PMStoreWindowPosI( HINI ini, PCSZ pAppName, PCSZ pKeyName, HWND hwnd )
222{
223    ER_WINDOW_POS wp;
224
225    WinQueryWindowPos( hwnd, &wp.Swp );
226    wp.XRestore  = WinQueryWindowUShort( hwnd, QWS_XRESTORE );
227    wp.YRestore  = WinQueryWindowUShort( hwnd, QWS_YRESTORE );
228    wp.CXRestore = WinQueryWindowUShort( hwnd, QWS_CXRESTORE );
229    wp.CYRestore = WinQueryWindowUShort( hwnd, QWS_CYRESTORE );
230    wp.XMinimize = WinQueryWindowUShort( hwnd, QWS_XMINIMIZE );
231    wp.YMinimize = WinQueryWindowUShort( hwnd, QWS_YMINIMIZE );
232
233    PrfWriteProfileData( ini, pAppName, pKeyName, &wp, sizeof( wp ) );
234}
235
236BOOL PMStoreWindowPos( PCSZ pIniName, PCSZ pAppName, PCSZ pKeyName, HWND hwnd )
237{
238    HAB           hab = WinQueryAnchorBlock( hwnd );
239    HINI          hini;
240    BOOL          rval = FALSE;
241
242    if ( pIniName == NULL )
243    {
244        PMStoreWindowPosI( HINI_USER, pAppName, pKeyName, hwnd );
245        rval = TRUE;
246    }
247    else
248    {
249        if ( ( hini = PrfOpenProfile( hab, pIniName ) ) != NULLHANDLE )
250        {
251            PMStoreWindowPosI( hini, pAppName, pKeyName, hwnd );
252            PrfCloseProfile( hini );
253            rval = TRUE;
254        }
255    }
256    return rval;
257}
258
259
260SHORT getStringPixSize( HPS hps, PCSZ str )
261{
262    POINTL ptl[ 3 ] = { 0 };
263    GpiQueryTextBox( hps, strlen( str ), (PSZ)str, 3, ptl );
264    return (SHORT)( ptl[ 2 ].x - ptl[ 0 ].x );
265}
266
267
268static void end_zeros_trim( char *s )
269{
270    size_t l = strlen( s );
271    char *end_str = ( s + l ) - 1;
272
273    while ( *end_str == '0' ) {
274        *end_str-- = 0;
275    }
276
277    if ( *end_str == '.' ) {
278        *end_str = 0;
279    }
280}
281
282std::string str( double n )
283{
284    char *pt;
285    char buf[ 60 ];
286    memset( buf, 0, sizeof buf );
287
288    ostrstream o( buf, sizeof buf );
289    o.flags( ios::dec | ios::showpoint | ios::fixed );
290    o << n;
291    end_zeros_trim( buf );
292
293    return buf;
294}
295
296
297void centerWindow( HWND parent, HWND hwnd )
298{
299    SWP swpf;
300    WinQueryWindowPos( parent, &swpf );
301    SWP swp;
302    WinQueryWindowPos( hwnd, &swp );
303    POINTL ptl = { ( swpf.cx - swp.cx ) / 2, ( swpf.cy - swp.cy ) / 2 };
304    WinMapWindowPoints( parent, HWND_DESKTOP, &ptl, 1 );
305    WinSetWindowPos( hwnd, HWND_TOP, ptl.x, ptl.y, 0, 0, SWP_MOVE );
306}
307
308
309static bool initCountryInfo()
310{
311    static const char *pmnkey = "PM_National";
312
313    memset( &CtryInfo, 0, sizeof( COUNTRYINFO ) );
314    COUNTRYCODE Country   = {0};
315    ULONG       ulInfoLen = 0;
316
317    DosQueryCtryInfo( sizeof( CtryInfo ), &Country, &CtryInfo, &ulInfoLen );
318
319    char buf[ 10 ];
320    PrfQueryProfileString( HINI_USERPROFILE, pmnkey, "sDate",
321                           CtryInfo.szDateSeparator, buf, sizeof( buf ) );
322    CtryInfo.szDateSeparator[ 0 ] = buf[ 0 ];
323    PrfQueryProfileString( HINI_USERPROFILE, pmnkey, "sTime",
324                           CtryInfo.szTimeSeparator, buf, sizeof( buf ) );
325    CtryInfo.szTimeSeparator[ 0 ] = buf[ 0 ];
326    PrfQueryProfileString( HINI_USERPROFILE, pmnkey, "sDecimal",
327                           CtryInfo.szDecimal, buf, sizeof( buf ) );
328    CtryInfo.szDecimal[ 0 ] = buf[ 0 ];
329    PrfQueryProfileString( HINI_USERPROFILE, pmnkey, "sThousand",
330                           CtryInfo.szThousandsSeparator, buf, sizeof( buf ) );
331    CtryInfo.szThousandsSeparator[ 0 ] = buf[ 0 ];
332    PrfQueryProfileString( HINI_USERPROFILE, pmnkey, "sList",
333                           CtryInfo.szDataSeparator, buf, sizeof( buf ) );
334    CtryInfo.szDataSeparator[ 0 ] = buf[ 0 ];
335
336    return true;
337}
338
339
340static const char *format01 = "%02d%s%02d%s%04d";
341static const char *format23 = "%04d%s%02d%s%02d";
342
343static void dateToStr( struct tm *tmbuf, char *buf, int buflen )
344{
345    switch ( CtryInfo.fsDateFmt )
346    {
347        case 0:
348            snprintf( buf, buflen, format01,
349                      tmbuf->tm_mon + 1, CtryInfo.szDateSeparator, tmbuf->tm_mday,
350                      CtryInfo.szDateSeparator, tmbuf->tm_year + 1900 );
351            break;
352        case 1:
353            snprintf( buf, buflen, format01,
354                      tmbuf->tm_mday, CtryInfo.szDateSeparator, tmbuf->tm_mon + 1,
355                      CtryInfo.szDateSeparator, tmbuf->tm_year + 1900 );
356            break;
357        case 2:
358            snprintf( buf, buflen, format23,
359                      tmbuf->tm_year + 1900, CtryInfo.szDateSeparator,
360                      tmbuf->tm_mon + 1, CtryInfo.szDateSeparator, tmbuf->tm_mday );
361            break;
362        case 3:
363            snprintf( buf, buflen, format23,
364                      tmbuf->tm_year + 1900, CtryInfo.szDateSeparator,
365                      tmbuf->tm_mday, CtryInfo.szDateSeparator, tmbuf->tm_mon + 1 );
366            break;
367    }
368}
369
370static const char *format0 = "%d%s%02d%s%02d %s";
371static const char *format1 = "%02d%s%02d%s%02d";
372
373static void timeToStr( struct tm *tmbuf, char *buf, int buflen )
374{
375    switch ( CtryInfo.fsTimeFmt )
376    {
377        case 0:
378            snprintf( buf, buflen, format0,
379                      (int)( ( tmbuf->tm_hour > 12 ) ? ( tmbuf->tm_hour - 12 ) :
380                                                         tmbuf->tm_hour ),
381                      CtryInfo.szTimeSeparator, (int)tmbuf->tm_min,
382                      CtryInfo.szTimeSeparator, (int)tmbuf->tm_sec,
383                      (char *)( ( tmbuf->tm_hour < 12 ) ? "AM" : "PM" ) );
384            break;
385        case 1:
386            snprintf( buf, buflen, format1, tmbuf->tm_hour,
387                      CtryInfo.szTimeSeparator, tmbuf->tm_min,
388                      CtryInfo.szTimeSeparator, tmbuf->tm_sec );
389            break;
390    }
391}
392
393std::string time2string( unsigned long time )
394{
395    struct tm tmbuf = { 0 };
396    _localtime( &time, &tmbuf );
397    char datbuf[ 16 ] = "";
398    char timbuf[ 16 ] = "";
399    dateToStr( &tmbuf, datbuf, sizeof( datbuf ) );
400    timeToStr( &tmbuf, timbuf, sizeof( timbuf ) );
401
402    std::string s = datbuf;
403    s += "  ";
404    s += timbuf;
405
406    return s;
407}
[24]408
Note: See TracBrowser for help on using the repository browser.