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

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

First import

File size: 6.0 KB
Line 
1/*
2 *
3 *  Copyrights? Public domain, nah!
4 *
5 */
6
7#define INCL_DOS
8#define INCL_WIN
9#define INCL_GPI
10#include <os2.h>
11
12#include <string.h>
13#include <malloc.h>
14
15
16#define MAXTEXTLEN 256
17
18static HPOINTER handPtr = NULLHANDLE;
19static char browserExe[ CCHMAXPATH ] = "";
20static char browserDir[ CCHMAXPATH ] = "";
21
22typedef struct
23{
24    PFNWP labelProc;
25    RECTL textRect;
26    char  *url;
27} linkData;
28
29static MRESULT EXPENTRY LinkLabelProc( HWND hwnd, ULONG msg, MPARAM mp1, MPARAM mp2 )
30{
31    linkData *ld = (linkData *)WinQueryWindowULong( hwnd, QWL_USER );
32    switch ( msg )
33    {
34        case WM_PAINT:
35            {
36                FONTMETRICS fm;
37                FATTRS fat;
38                HPS hps;
39                ULONG style;
40                char *text = (char *)malloc( MAXTEXTLEN );
41                WinQueryWindowText( hwnd, MAXTEXTLEN, text);
42                hps = WinBeginPaint( hwnd , 0L , 0L );
43                GpiQueryFontMetrics( hps , sizeof( FONTMETRICS ) , &fm );
44                memset( &fat , 0 , sizeof( fat ) );
45                fat.usRecordLength = sizeof( FATTRS );
46                fat.lMatch = fm.lMatch;
47                fat.fsSelection = FATTR_SEL_UNDERSCORE;
48                strcpy( fat.szFacename , fm.szFacename );
49                GpiDeleteSetId( hps , 1 );
50                GpiCreateLogFont( hps , 0 , 1 , &fat );
51                GpiSetCharSet( hps , 1 );
52                WinQueryWindowRect( hwnd , &ld->textRect );
53                style = WinQueryWindowULong( hwnd, QWL_STYLE );
54                style &= DT_LEFT|DT_CENTER|DT_RIGHT|DT_TOP|DT_VCENTER|DT_BOTTOM;
55                WinDrawText( hps, -1, text, &ld->textRect,
56                             CLR_BLUE, SYSCLR_DIALOGBACKGROUND,
57                             style | DT_ERASERECT | DT_UNDERSCORE );
58                WinDrawText( hps, -1, text, &ld->textRect,
59                             CLR_BLUE, SYSCLR_DIALOGBACKGROUND,
60                             style | DT_QUERYEXTENT | DT_UNDERSCORE );
61                WinEndPaint( hps );
62                free( text );
63            }
64            return (MRESULT)FALSE;
65
66        case WM_MOUSEMOVE:
67            {
68                if ( handPtr != NULLHANDLE )
69                {
70                    POINTL ptl;
71                    ptl.x = SHORT1FROMMP( mp1 );
72                    ptl.y = SHORT2FROMMP( mp1 );
73                    if ( WinPtInRect( WinQueryAnchorBlock( hwnd ), &ld->textRect, &ptl) )
74                    {
75                        WinSetPointer( HWND_DESKTOP, handPtr );
76                        return (MRESULT)FALSE;
77                    }
78                }
79            }
80            break;
81
82        case WM_BUTTON1CLICK:
83            {
84                PROGDETAILS pd;
85                char *text;
86                POINTL ptl;
87
88                if ( strcmp( browserExe, "" ) == 0 )  break;
89
90                ptl.x = SHORT1FROMMP( mp1 );
91                ptl.y = SHORT2FROMMP( mp1 );
92                if ( !WinPtInRect( WinQueryAnchorBlock( hwnd ), &ld->textRect, &ptl) )
93                    break;
94
95                if ( ld->url == NULL )
96                {
97                    text = (char *)malloc( MAXTEXTLEN );
98                    WinQueryWindowText( hwnd, MAXTEXTLEN, text);
99                }
100                else  text = strdup( ld->url );
101
102                pd.Length          = sizeof( PROGDETAILS );
103                pd.progt.progc     = PROG_DEFAULT;
104                pd.progt.fbVisible = SHE_VISIBLE;
105                pd.pszTitle        = NULL;
106                pd.pszExecutable   = browserExe;
107                pd.pszParameters   = NULL;
108                pd.pszStartupDir   = ( browserDir[0] == 0 ) ? NULL : browserDir;
109                pd.pszIcon         = NULL;
110                pd.pszEnvironment  = NULL;
111                pd.swpInitial.fl   = SWP_ACTIVATE;
112                pd.swpInitial.cy   = 0;
113                pd.swpInitial.cx   = 0;
114                pd.swpInitial.y    = 0;
115                pd.swpInitial.x    = 0;
116                pd.swpInitial.hwndInsertBehind = HWND_TOP;
117                pd.swpInitial.hwnd             = NULLHANDLE;
118                pd.swpInitial.ulReserved1      = 0;
119                pd.swpInitial.ulReserved2      = 0;
120                WinStartApp( NULLHANDLE , &pd , text , NULL , 0 );
121                free( text );
122            }
123            break;
124
125        case WM_DESTROY:
126            ld->labelProc( hwnd, msg, mp1, mp2 );
127            if ( ld->url != NULL )  free( ld->url );
128            free( ld );
129            return (MRESULT)FALSE;
130    }
131    return ld->labelProc( hwnd, msg, mp1, mp2 );
132}
133
134static void detectBrowser( void )
135{
136    char *prfApp = "WPURLDEFAULTSETTINGS";
137
138    if ( strcmp( browserExe, "" ) == 0 )
139    {
140        PrfQueryProfileString( HINI_USER, prfApp, "DefaultBrowserExe", "",
141                               browserExe, CCHMAXPATH );
142        PrfQueryProfileString( HINI_USER, prfApp, "DefaultWorkingDir", "",
143                               browserDir, CCHMAXPATH );
144    }
145
146    if ( strcmp( browserExe, "" ) == 0 )
147    {
148        APIRET rc;
149        rc = DosSearchPath( SEARCH_CUR_DIRECTORY | SEARCH_ENVIRONMENT | SEARCH_IGNORENETERRS ,
150                            "PATH", "NETSCAPE.EXE", browserExe, CCHMAXPATH );
151        if ( rc != 0 )  strcpy( browserExe , "" );
152    }
153}
154
155void setLinkPointer( HPOINTER hp )
156{
157    handPtr = hp;
158}
159
160
161void toLink( HWND hwnd )
162{
163    linkData *ld;
164    detectBrowser();
165    ld = (linkData *)malloc( sizeof( linkData ) );
166    memset( ld, 0, sizeof( linkData ) );
167    ld->labelProc = WinSubclassWindow( hwnd, LinkLabelProc );
168    WinSetWindowULong( hwnd, QWL_USER, (ULONG)ld );
169    WinInvalidateRect( hwnd, NULL, FALSE );
170}
171
172void toLinkWithUrl( HWND hwnd, char *url )
173{
174    linkData *ld;
175    detectBrowser();
176    ld = (linkData *)malloc( sizeof( linkData ) );
177    memset( ld, 0, sizeof( linkData ) );
178    ld->url = strdup( url );
179    ld->labelProc = WinSubclassWindow( hwnd, LinkLabelProc );
180    WinSetWindowULong( hwnd, QWL_USER, (ULONG)ld );
181    WinInvalidateRect( hwnd, NULL, FALSE );
182}
183
Note: See TracBrowser for help on using the repository browser.