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

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

added licence block to source files

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