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

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

bitmap printing, preliminary postscript printing, export to PS for djvu plugin, other improvements

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 "globals.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.