source: trunk/Lucide/SOURCE/gui/linklab.c @ 127

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

start browser with external links

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