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

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

added licence block to source files

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