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

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

First import

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