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

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

added licence block to source files

File size: 6.1 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_DOS
9#define INCL_WIN
10#define INCL_GPI
11#include <os2.h>
12
13#include <string.h>
14#include <malloc.h>
15
16
17#define MAXTEXTLEN 256
18
19static HPOINTER handPtr = NULLHANDLE;
20static char browserExe[ CCHMAXPATH ] = "";
21static char browserDir[ CCHMAXPATH ] = "";
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                PROGDETAILS pd;
86                char *text;
87                POINTL ptl;
88
89                if ( strcmp( browserExe, "" ) == 0 )  break;
90
91                ptl.x = SHORT1FROMMP( mp1 );
92                ptl.y = SHORT2FROMMP( mp1 );
93                if ( !WinPtInRect( WinQueryAnchorBlock( hwnd ), &ld->textRect, &ptl) )
94                    break;
95
96                if ( ld->url == NULL )
97                {
98                    text = (char *)malloc( MAXTEXTLEN );
99                    WinQueryWindowText( hwnd, MAXTEXTLEN, text);
100                }
101                else  text = strdup( ld->url );
102
103                pd.Length          = sizeof( PROGDETAILS );
104                pd.progt.progc     = PROG_DEFAULT;
105                pd.progt.fbVisible = SHE_VISIBLE;
106                pd.pszTitle        = NULL;
107                pd.pszExecutable   = browserExe;
108                pd.pszParameters   = NULL;
109                pd.pszStartupDir   = ( browserDir[0] == 0 ) ? NULL : browserDir;
110                pd.pszIcon         = NULL;
111                pd.pszEnvironment  = NULL;
112                pd.swpInitial.fl   = SWP_ACTIVATE;
113                pd.swpInitial.cy   = 0;
114                pd.swpInitial.cx   = 0;
115                pd.swpInitial.y    = 0;
116                pd.swpInitial.x    = 0;
117                pd.swpInitial.hwndInsertBehind = HWND_TOP;
118                pd.swpInitial.hwnd             = NULLHANDLE;
119                pd.swpInitial.ulReserved1      = 0;
120                pd.swpInitial.ulReserved2      = 0;
121                WinStartApp( NULLHANDLE , &pd , text , NULL , 0 );
122                free( text );
123            }
124            break;
125
126        case WM_DESTROY:
127            ld->labelProc( hwnd, msg, mp1, mp2 );
128            if ( ld->url != NULL )  free( ld->url );
129            free( ld );
130            return (MRESULT)FALSE;
131    }
132    return ld->labelProc( hwnd, msg, mp1, mp2 );
133}
134
135static void detectBrowser( void )
136{
137    char *prfApp = "WPURLDEFAULTSETTINGS";
138
139    if ( strcmp( browserExe, "" ) == 0 )
140    {
141        PrfQueryProfileString( HINI_USER, prfApp, "DefaultBrowserExe", "",
142                               browserExe, CCHMAXPATH );
143        PrfQueryProfileString( HINI_USER, prfApp, "DefaultWorkingDir", "",
144                               browserDir, CCHMAXPATH );
145    }
146
147    if ( strcmp( browserExe, "" ) == 0 )
148    {
149        APIRET rc;
150        rc = DosSearchPath( SEARCH_CUR_DIRECTORY | SEARCH_ENVIRONMENT | SEARCH_IGNORENETERRS ,
151                            "PATH", "NETSCAPE.EXE", browserExe, CCHMAXPATH );
152        if ( rc != 0 )  strcpy( browserExe , "" );
153    }
154}
155
156void setLinkPointer( HPOINTER hp )
157{
158    handPtr = hp;
159}
160
161
162void toLink( HWND hwnd )
163{
164    linkData *ld;
165    detectBrowser();
166    ld = (linkData *)malloc( sizeof( linkData ) );
167    memset( ld, 0, sizeof( linkData ) );
168    ld->labelProc = WinSubclassWindow( hwnd, LinkLabelProc );
169    WinSetWindowULong( hwnd, QWL_USER, (ULONG)ld );
170    WinInvalidateRect( hwnd, NULL, FALSE );
171}
172
173void toLinkWithUrl( HWND hwnd, char *url )
174{
175    linkData *ld;
176    detectBrowser();
177    ld = (linkData *)malloc( sizeof( linkData ) );
178    memset( ld, 0, sizeof( linkData ) );
179    ld->url = strdup( url );
180    ld->labelProc = WinSubclassWindow( hwnd, LinkLabelProc );
181    WinSetWindowULong( hwnd, QWL_USER, (ULONG)ld );
182    WinInvalidateRect( hwnd, NULL, FALSE );
183}
184
Note: See TracBrowser for help on using the repository browser.