source: branches/kmk/Lucide/gui/linklab.c @ 334

Last change on this file since 334 was 334, checked in by dmik, 11 years ago

branches/kmk: Renamed private os2.h to os2all.h to avoid the clash with the toolkit one.

File size: 4.3 KB
Line 
1/*
2 *  Transfer a label into link.
3 *  by Eugene Romanenko
4 *
5 *  This code is in the public domain and has no copyright.
6 */
7
8#include "os2all.h"
9
10#include <string.h>
11#include <malloc.h>
12
13
14int startBrowser( const char *url );
15
16
17#define MAXTEXTLEN 256
18
19static HPOINTER handPtr = NULLHANDLE;
20
21typedef struct
22{
23    PFNWP labelProc;
24    RECTL textRect;
25    char  *url;
26} linkData;
27
28static MRESULT EXPENTRY LinkLabelProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
29{
30    linkData *ld = (linkData *)WinQueryWindowULong( hwnd, QWL_USER );
31    switch ( msg )
32    {
33        case WM_PAINT:
34            {
35                FONTMETRICS fm;
36                FATTRS fat;
37                HPS hps;
38                ULONG style;
39                char *text = (char *)malloc( MAXTEXTLEN );
40                WinQueryWindowText( hwnd, MAXTEXTLEN, text);
41                hps = WinBeginPaint( hwnd, 0L, 0L );
42                GpiQueryFontMetrics( hps, sizeof( FONTMETRICS ), &fm );
43                memset( &fat, 0, sizeof( fat ) );
44                fat.usRecordLength = sizeof( FATTRS );
45                fat.lMatch = fm.lMatch;
46                fat.fsSelection = FATTR_SEL_UNDERSCORE;
47                strcpy( fat.szFacename, fm.szFacename );
48                GpiDeleteSetId( hps, 1 );
49                GpiCreateLogFont( hps, 0, 1, &fat );
50                GpiSetCharSet( hps, 1 );
51                WinQueryWindowRect( hwnd, &ld->textRect );
52                style = WinQueryWindowULong( hwnd, QWL_STYLE );
53                style &= DT_LEFT|DT_CENTER|DT_RIGHT|DT_TOP|DT_VCENTER|DT_BOTTOM;
54                WinDrawText( hps, -1, text, &ld->textRect,
55                             CLR_BLUE, SYSCLR_DIALOGBACKGROUND,
56                             style | DT_ERASERECT | DT_UNDERSCORE );
57                WinDrawText( hps, -1, text, &ld->textRect,
58                             CLR_BLUE, SYSCLR_DIALOGBACKGROUND,
59                             style | DT_QUERYEXTENT | DT_UNDERSCORE );
60                WinEndPaint( hps );
61                free( text );
62            }
63            return (MRESULT)FALSE;
64
65        case WM_MOUSEMOVE:
66            {
67                if ( handPtr != NULLHANDLE )
68                {
69                    POINTL ptl;
70                    ptl.x = SHORT1FROMMP( mp1 );
71                    ptl.y = SHORT2FROMMP( mp1 );
72                    if ( WinPtInRect( WinQueryAnchorBlock( hwnd ), &ld->textRect, &ptl) )
73                    {
74                        WinSetPointer( HWND_DESKTOP, handPtr );
75                        return (MRESULT)FALSE;
76                    }
77                }
78            }
79            break;
80
81        case WM_BUTTON1CLICK:
82            {
83                char *text;
84                POINTL ptl;
85
86                ptl.x = SHORT1FROMMP( mp1 );
87                ptl.y = SHORT2FROMMP( mp1 );
88                if ( !WinPtInRect( WinQueryAnchorBlock( hwnd ), &ld->textRect, &ptl) ) {
89                    break;
90                }
91
92                if ( ld->url == NULL ) {
93                    text = (char *)malloc( MAXTEXTLEN );
94                    WinQueryWindowText( hwnd, MAXTEXTLEN, text);
95                }
96                else {
97                    text = strdup( ld->url );
98                }
99
100                startBrowser( text );
101
102                free( text );
103            }
104            break;
105
106        case WM_DESTROY:
107            ld->labelProc( hwnd, msg, mp1, mp2 );
108            if ( ld->url != NULL ) {
109                free( ld->url );
110            }
111            free( ld );
112            return (MRESULT)FALSE;
113    }
114
115    return ld->labelProc( hwnd, msg, mp1, mp2 );
116}
117
118
119void setLinkPointer( HPOINTER hp )
120{
121    handPtr = hp;
122}
123
124
125void toLink( HWND hwnd )
126{
127    linkData *ld;
128    ld = (linkData *)malloc( sizeof( linkData ) );
129    memset( ld, 0, sizeof( linkData ) );
130    ld->labelProc = WinSubclassWindow( hwnd, LinkLabelProc );
131    WinSetWindowULong( hwnd, QWL_USER, (ULONG)ld );
132    WinInvalidateRect( hwnd, NULL, FALSE );
133}
134
135void toLinkWithUrl( HWND hwnd, char *url )
136{
137    linkData *ld;
138    ld = (linkData *)malloc( sizeof( linkData ) );
139    memset( ld, 0, sizeof( linkData ) );
140    ld->url = strdup( url );
141    ld->labelProc = WinSubclassWindow( hwnd, LinkLabelProc );
142    WinSetWindowULong( hwnd, QWL_USER, (ULONG)ld );
143    WinInvalidateRect( hwnd, NULL, FALSE );
144}
145
Note: See TracBrowser for help on using the repository browser.