source: trunk/Lucide/SOURCE/gui/intern.cpp @ 27

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

First import

File size: 6.9 KB
Line 
1#define INCL_DOS
2#define INCL_WIN
3#include <os2.h>
4
5#include <fstream>
6#include <map>
7#include <string>
8using namespace std;
9
10#include <stdlib.h>
11#include <stdio.h>
12#include <string.h>
13#include <io.h>
14
15#include "lucide.h"
16#include "wwbtn.h"
17#include "luutils.h"
18
19#define LINEBUF_LEN     4096
20
21static bool langLoaded = false;
22
23static map<string,string> *langDefault = NULL;
24static map<string,string> *langCurrent = NULL;
25
26#define NUM_ESCAPES     2
27static const char *escapes[NUM_ESCAPES][2] = { { "\\t", "\t" }, { "\\r", "\r" } };
28
29static string unescapeControls( const char *s )
30{
31    string r = s;
32    for ( int i = 0; i < NUM_ESCAPES; i++ )
33    {
34        const char *r_c = r.c_str();
35        char *p = strstr( r_c, escapes[i][0] );
36        if ( p != NULL )
37        {
38            int len = strlen( r_c ) + 1;
39            char *tmp = new char[ len ];
40            memset( tmp, 0, len );
41            memcpy( tmp, r_c, p - r_c );
42            strcat( tmp, escapes[i][1] );
43            strcat( tmp, p + strlen( escapes[i][0] ) );
44            r = tmp;
45            delete tmp;
46        }
47    }
48    return r;
49}
50
51
52static void loadLng( map<string,string> *array, const char *file, bool exitOnError )
53{
54    ifstream lngFile( file );
55    if ( !lngFile )
56    {
57        if ( exitOnError )
58        {
59            char msgbuf1[ 500 ];
60            char msgbuf2[ 100 ];
61            snprintf( msgbuf1, sizeof( msgbuf1 ),
62                      "Default language file \"%s\" not found!", file );
63            snprintf( msgbuf2, sizeof( msgbuf2 ), "%s error!", appName );
64
65            WinMessageBox( HWND_DESKTOP, HWND_DESKTOP, msgbuf1, msgbuf2,
66                           10000, MB_CANCEL | MB_ERROR | MB_ICONHAND | MB_MOVEABLE );
67
68            DosExit( EXIT_PROCESS, 1 );  // ??? exit() crashes
69        }
70        return;
71    }
72    else
73    {
74        char *line = new char[ LINEBUF_LEN ];
75
76        while ( !lngFile.eof() )
77        {
78            char ch;
79            lngFile.get( line, LINEBUF_LEN );
80            lngFile.get( ch );
81            if ( ( line[ 0 ] != '#' ) && ( line[ 0 ] != ' ' ) )
82            {
83                char *eqpos = NULL;
84                if ( ( eqpos = strchr( line, '=' ) ) != NULL )
85                {
86                    *eqpos = '\0';
87                    string key   = line;
88                    string value = unescapeControls( eqpos + 1 );
89                    (*array)[ key ] = value;
90                }
91            }
92        }
93
94        /*map<string,string>::const_iterator iter;
95        for ( iter=array->begin(); iter != array->end(); iter++ )
96        {
97            cout << "K:" << (*iter).first.c_str()
98                 << " V:" << (*iter).second.c_str() << endl;
99        }*/
100    }
101}
102
103static const char *lfilespec1 = "%sLUCIDE_%s.LNG";
104static const char *lfilespec2 = "%sLUCIDE.LNG";
105
106void loadLang()
107{
108    if ( langLoaded ) {
109        return;
110    }
111    langLoaded = true;
112
113    char appdir[ _MAX_PATH ];
114    char drive[ _MAX_DRIVE ];
115    char dir[ _MAX_DIR ];
116    _splitpath( __argv[0], drive, dir, NULL, NULL );
117    _makepath( appdir, drive, dir, NULL, NULL );
118
119    langDefault = new map<string,string>;
120    langCurrent = new map<string,string>;
121
122    afbuf lfile( _MAX_PATH );
123
124    snprintf( lfile.buffer, lfile.getSize(), lfilespec1, appdir, "EN" );
125    if ( access( lfile.buffer, F_OK ) == 0 ) {
126        loadLng( langDefault, lfile.buffer, true );
127    }
128    else {
129        snprintf( lfile.buffer, lfile.getSize(), lfilespec2, appdir );
130        loadLng( langDefault, lfile.buffer, true );
131    }
132
133    char *lng = getenv( "LANG" );
134    if ( lng == NULL ) {
135        return;
136    }
137    char *upos = strchr( lng, '_' );
138    if ( upos == NULL ) {
139        return;
140    }
141    int lngSpecLen = upos - lng;
142    if ( lngSpecLen > 2 ) {
143        return;
144    }
145    char lngSpec[ 4 ];
146    memset( lngSpec, 0, sizeof( lngSpec ) );
147    strncpy( lngSpec, lng, lngSpecLen );
148    if ( stricmp( lngSpec, "EN" ) != 0 )
149    {
150        snprintf( lfile.buffer, lfile.getSize(), lfilespec1, appdir, lngSpec );
151        loadLng( langCurrent, lfile.buffer, false );
152    }
153}
154
155void localizeMenu( HWND hmenu )
156{
157    if ( hmenu == NULLHANDLE ) {
158        return;
159    }
160
161    afbuf mtext( 1024 );
162
163    SHORT id, len;
164    SHORT cnt = (SHORT)WinSendMsg( hmenu, MM_QUERYITEMCOUNT, MPVOID, MPVOID );
165    for ( SHORT i = 0; i < cnt; i++ )
166    {
167        id = (SHORT)WinSendMsg( hmenu, MM_ITEMIDFROMPOSITION, MPFROMSHORT( i ), MPVOID );
168
169        len = (SHORT)WinSendMsg( hmenu, MM_QUERYITEMTEXT, MPFROM2SHORT( id, mtext.getSize() ),
170                                 MPFROMP( mtext.buffer ) );
171
172        if ( len > 0 )
173        {
174            string r = getLocalizedString( mtext.buffer );
175            if ( r != mtext.buffer ) {
176                WinSendMsg( hmenu, MM_SETITEMTEXT, MPFROMSHORT( id ), MPFROMP( r.c_str() ) );
177            }
178        }
179
180        MENUITEM mitem = { 0 };
181        BOOL itemQueried = (BOOL)WinSendMsg( hmenu, MM_QUERYITEM, MPFROM2SHORT( id, FALSE ),
182                                             MPFROMP( &mitem ) );
183        if ( itemQueried )
184        {
185            if ( mitem.afStyle & MIS_SUBMENU ) {
186                localizeMenu( mitem.hwndSubMenu );
187            }
188        }
189    }
190}
191
192void localizeDialog( HWND hdlg )
193{
194    if ( hdlg == NULLHANDLE ) {
195        return;
196    }
197
198    afbuf itemtext( 256 );
199
200    HWND  hwndNext;
201    LONG  lText;
202    HENUM henum = WinBeginEnumWindows( hdlg );
203
204    while ( ( hwndNext = WinGetNextWindow( henum ) ) != NULLHANDLE )
205    {
206        char clname[ 5 ];
207        WinQueryClassName( hwndNext, sizeof( clname ), clname );
208
209        if ( clname[0] == '#' )
210        {
211            lText = WinQueryWindowText( hwndNext, itemtext.getSize(), itemtext.buffer );
212            if ( lText )
213            {
214                string r = getLocalizedString( itemtext.buffer );
215                if ( r != itemtext.buffer )
216                {
217                    if ( clname[1] == '5' ) { // static
218                        if ( WinQueryWindowULong( hwndNext, QWL_STYLE ) & SS_TEXT ) {
219                            toWordWrapLabel( hwndNext );
220                        }
221                    }
222
223                    WinSetWindowText( hwndNext, r.c_str() );
224                }
225            }
226        }
227    }
228    WinEndEnumWindows( henum );
229}
230
231string getLocalizedString( const char *t )
232{
233    map<string,string>::const_iterator iter;
234
235    if ( ( iter = langCurrent->find( t ) ) == langCurrent->end() )
236    {
237        if ( ( iter = langDefault->find( t ) ) == langDefault->end() ) {
238            return t;
239        }
240    }
241
242    return (*iter).second;
243}
244
245void getLocalizedString( const char *key, LONG maxLen, char *buf )
246{
247    strncpy( buf, getLocalizedString( key ).c_str(), maxLen - 1 );
248}
249
250char *newstrdupL( const char *key )
251{
252    return newstrdup( getLocalizedString( key ).c_str() );
253}
254
Note: See TracBrowser for help on using the repository browser.