source: trunk/Lucide/SOURCE/gui/wwbtn.c @ 94

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

added licence block to source files

File size: 7.8 KB
Line 
1/*
2 *  Transfer a labels and buttons into multi-line with word-wrap.
3 *  Useful for internationalization.
4 *  by Eugene Romanenko
5 *
6 *  This code is in the public domain and has no copyright.
7 */
8
9#define INCL_WIN
10#define INCL_GPI
11#include <os2.h>
12
13#include <stdio.h>
14#include <string.h>
15#include <malloc.h>
16
17#include "wwbtn.h"
18
19#define MAXTEXTLEN 256
20
21/*static void adjustSize( HWND hwnd, LONG height )
22{
23    RECTL rect;
24    LONG adjustment, halfadj;
25
26    WinQueryWindowRect( hwnd , &rect );
27
28    adjustment = height - rect.yTop;
29    halfadj = adjustment / 2;
30
31    WinMapWindowPoints( hwnd, WinQueryWindow( hwnd, QW_PARENT ), (PPOINTL)&rect, 2 );
32
33    rect.yTop += ( adjustment - halfadj );
34    rect.yBottom -= halfadj;
35
36    WinSetWindowPos( hwnd, NULLHANDLE, rect.xLeft, rect.yBottom,
37         rect.xRight - rect.xLeft + 1, height, SWP_SIZE | SWP_MOVE );
38} */
39
40static void DrawWWText( HWND hwnd, HPS hps, const char *text, PRECTL rect,
41                        BOOL disabled, LONG color )
42{
43    ULONG style;
44    LONG lChars = 0, charsdrawn = 0, height = 0, drawpos, lineoffs;
45    RECTL rect1;
46    char *text1;
47    int lines = 0;
48    const int len = strlen( text );
49    ULONG alignStyle = WinQueryWindowULong( hwnd, QWL_STYLE ) & 
50                                        ( DT_LEFT | DT_CENTER | DT_RIGHT );
51
52    // ®¯à¥€¥«šâì ª®«šç¥á⢮ áâப š šå ᮢ®ªã¯­ãî ¢ëá®âã
53    text1 = (char *)text;
54    while ( charsdrawn < len )
55    {
56        memcpy( &rect1, rect, sizeof( RECTL ) );
57        style=DT_MNEMONIC|DT_TOP|DT_WORDBREAK|DT_QUERYEXTENT|alignStyle;
58        lChars = WinDrawText( hps, -1, text1, &rect1,
59                              color, SYSCLR_DIALOGBACKGROUND, style );
60        lines++;
61        //printf( "text: %s, height: %d, charsdrawn: %d\n",
62        //        text1, ( rect1.yTop - rect1.yBottom ), lChars );
63        height += ( rect1.yTop - rect1.yBottom );
64        text1 += lChars;
65        charsdrawn += lChars;
66    }
67
68    //if ( height > rect->yTop )
69    //{
70    //    adjustSize( hwnd, height );
71    //    rect->yTop = height;
72    //}
73
74    // draw lines
75    text1 = (char *)text;
76    charsdrawn = 0;
77    lineoffs = 0;
78    while ( charsdrawn < strlen( text ) )
79    {
80        memcpy( &rect1, rect, sizeof( RECTL ) );
81
82        //printf( "xLeft: %d, yBottom: %d, xRight: %d, yTop: %d\n",
83        //        rect->xLeft, rect->yBottom, rect->xRight, rect->yTop );
84
85        drawpos = ( ( rect->yTop - rect->yBottom ) + height ) / 2;
86        //printf( "drawpos 1 : %d \n", drawpos );
87        drawpos += rect->yBottom;
88        //printf( "drawpos 2 : %d \n", drawpos );
89        drawpos -= lineoffs;
90        //printf( "drawpos 3 : %d \n", drawpos );
91        rect1.yTop = drawpos;
92
93        style=DT_MNEMONIC|DT_TOP|DT_WORDBREAK|DT_ERASERECT|alignStyle;
94        if ( disabled )
95            style |= DT_HALFTONE;
96        lChars = WinDrawText( hps, -1, text1, &rect1,
97                              color, SYSCLR_DIALOGBACKGROUND, style );
98        if ( lChars == 0 )
99            break;
100
101        style=DT_MNEMONIC|DT_TOP|DT_WORDBREAK|DT_QUERYEXTENT|alignStyle;
102        WinDrawText( hps, -1, text1, &rect1,
103                     color, SYSCLR_DIALOGBACKGROUND, style );
104
105        //WinDrawBorder( hps, &rect1, 1, 1,CLR_BLUE,CLR_YELLOW,DB_PATCOPY);
106
107        lineoffs += ( rect1.yTop - rect1.yBottom );
108        text1 += lChars;
109        charsdrawn += lChars;
110    }
111}
112
113static void halftoneDraw( HPS hps , PRECTL r )
114{
115    POINTL ptl;
116    LONG i , j;
117    GpiSetColor( hps , SYSCLR_DIALOGBACKGROUND );
118    for ( i = 0 ; i <= ( r->xRight - r->xLeft ) ; i++ )
119    {
120        ptl.x = i + r->xLeft;
121        for ( j = 0 ; j <= ( r->yTop - r->yBottom ) ; j++ )
122        {
123            ptl.y = j + r->yBottom;
124            if ( !( j & 1 ) )
125            {
126                if ( i & 1 )  ptl.y++;
127                GpiSetPel( hps , &ptl );
128            }
129        }
130    }
131}
132
133static void DrawCheckBitmap( HPS hps, PRECTL rect, int buttonType,
134                             ULONG state, USHORT checkstate )
135{
136    RECTL subrect, htrect;
137    LONG bwidth, bheight;
138    BITMAPINFOHEADER2 bhdr;
139    POINTL pos;
140    HBITMAP bitmap = WinGetSysBitmap( HWND_DESKTOP, SBMP_CHECKBOXES );
141
142    bhdr.cbFix = 16;
143    GpiQueryBitmapInfoHeader( bitmap, &bhdr );
144    bwidth = bhdr.cx / 4;
145    bheight = bhdr.cy / 3;
146    subrect.xLeft = bwidth * checkstate;
147
148    if ( state & BDS_HILITED )
149        subrect.xLeft += (bwidth * 2);
150
151    subrect.yBottom = bheight * buttonType;
152    subrect.xRight = subrect.xLeft + bwidth;
153    subrect.yTop = subrect.yBottom + bheight;
154    pos.x = 0;
155    pos.y = ( ( rect->yTop - rect->yBottom ) / 2 ) - ( ( bheight / 2 ) + 1 );
156    WinDrawBitmap( hps, bitmap, &subrect, &pos, 0, 0, DBM_NORMAL );
157    if ( state & BDS_DISABLED )
158    {
159        htrect.xLeft = pos.x;
160        htrect.yBottom = pos.y;
161        htrect.xRight = pos.x + bwidth;
162        htrect.yTop = pos.y + bheight;
163        halftoneDraw( hps , &htrect );
164    }
165    GpiDeleteBitmap( bitmap );
166    rect->xLeft += ( bwidth + 2 );
167}
168
169static void DrawWordWrapButton( PUSERBUTTON ubtn, int buttonType, USHORT checkstate )
170{
171    RECTL rect;
172    char *text = (char *)malloc( MAXTEXTLEN );
173    WinQueryWindowText( ubtn->hwnd, MAXTEXTLEN, text);
174    WinQueryWindowRect( ubtn->hwnd , &rect );
175    DrawCheckBitmap( ubtn->hps, &rect, buttonType, ubtn->fsState, checkstate );
176    DrawWWText( ubtn->hwnd, ubtn->hps, text, &rect,
177                ubtn->fsState & BDS_DISABLED, SYSCLR_WINDOWTEXT );
178    free(text);
179}
180
181
182void UButtonJob( HWND owner, MPARAM mp1, MPARAM mp2, int buttonType, PUSHORT group )
183{
184    HWND btn = WinWindowFromID( owner, SHORT1FROMMP( mp1 ) );
185    int ncode = SHORT2FROMMP( mp1 );
186    USHORT checkstate = SHORT1FROMMR( WinSendMsg( btn, BM_QUERYCHECK, MPVOID, MPVOID ) );
187
188    switch ( ncode )
189    {
190        case BN_CLICKED:
191            if ( ( buttonType == UBTNTYPE_RADIOBUTTON ) && ( group != NULL ) )
192            {
193                USHORT i;
194                for ( i = 0; i < group[0]; i++ )
195                {
196                    WinCheckButton( owner, group[ i + 1 ], FALSE );
197                }
198                WinSendMsg( btn, BM_SETCHECK, MPFROMSHORT( TRUE ), MPVOID );
199            }
200            else  WinSendMsg( btn, BM_SETCHECK, MPFROMSHORT( !checkstate ), MPVOID );
201            break;
202        case BN_PAINT:
203            DrawWordWrapButton( (PUSERBUTTON)mp2, buttonType, checkstate );
204            break;
205    }
206}
207
208
209typedef struct
210{
211    PFNWP labelProc;
212} wwlData;
213
214static MRESULT EXPENTRY WordWrapLabelProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
215{
216    wwlData *ld = (wwlData *)WinQueryWindowULong( hwnd, QWL_USER );
217    switch ( msg )
218    {
219        case WM_PAINT:
220            {
221                HPS hps;
222                RECTL rect;
223                ULONG style;
224                char *text = (char *)malloc( MAXTEXTLEN );
225                WinQueryWindowText( hwnd, MAXTEXTLEN, text);
226                WinQueryWindowRect( hwnd , &rect );
227                style = WinQueryWindowULong( hwnd, QWL_STYLE );
228                hps = WinBeginPaint( hwnd , 0L , 0L );
229
230                DrawWWText( hwnd, hps, text, &rect, style & WS_DISABLED,
231                            SYSCLR_WINDOWSTATICTEXT );
232
233                WinEndPaint( hps );
234                free( text );
235            }
236            return (MRESULT)FALSE;
237        case WM_DESTROY:
238            ld->labelProc( hwnd, msg, mp1, mp2 );
239            free( ld );
240            return (MRESULT)FALSE;
241    }
242    return ld->labelProc( hwnd, msg, mp1, mp2 );
243}
244
245void toWordWrapLabel( HWND hwnd )
246{
247    wwlData *ld;
248    ld = (wwlData *)malloc( sizeof( wwlData ) );
249    memset( ld, 0, sizeof( wwlData ) );
250    ld->labelProc = WinSubclassWindow( hwnd, WordWrapLabelProc );
251    WinSetWindowULong( hwnd, QWL_USER, (ULONG)ld );
252    WinInvalidateRect( hwnd, NULL, FALSE );
253}
254
Note: See TracBrowser for help on using the repository browser.