set most of trunk svn property eol-style:native
[reactos.git] / reactos / dll / cpl / sysdm / custclicklink.c
1 /*
2 * PROJECT: ReactOS System Control Panel Applet
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/cpl/sysdm/custclicklink.c
5 * PURPOSE: Subclass static control to link to apps
6 * COPYRIGHT: Copyright 2006 Ged Murphy <gedmurphy@gmail.com>
7 *
8 */
9
10 #include "precomp.h"
11
12 #define LINK_COLOR RGB(0,0,128)
13 #define MAX_PARAMS 256
14
15 typedef struct _LINKCTL
16 {
17 HWND hSelf;
18 WNDPROC OldProc;
19 TCHAR szApp[MAX_PATH];
20 TCHAR szParams[MAX_PARAMS];
21 HFONT hFont;
22 BOOL bClicked;
23 } LINKCTL, *PLINKCTL;
24
25
26
27 static VOID
28 DoLButtonUp(PLINKCTL pLink, LPARAM lParam)
29 {
30 ReleaseCapture();
31 if (pLink->bClicked)
32 {
33 POINT pt;
34 RECT rc;
35
36 pt.x = (short)LOWORD(lParam);
37 pt.y = (short)HIWORD(lParam);
38 ClientToScreen(pLink->hSelf, &pt);
39 GetWindowRect(pLink->hSelf, &rc);
40 if (PtInRect(&rc, pt))
41 {
42 ShellExecute(NULL,
43 _T("open"),
44 pLink->szApp,
45 pLink->szParams,
46 NULL,
47 SW_SHOWNORMAL);
48 }
49
50 pLink->bClicked = FALSE;
51 }
52 }
53
54
55 static VOID
56 DoPaint(PLINKCTL pLink, HDC hdc)
57 {
58 TCHAR szText[MAX_PATH];
59 DWORD WinStyle, DrawStyle;
60 RECT rc;
61 HANDLE hOld;
62
63 WinStyle = GetWindowLongPtr(pLink->hSelf, GWL_STYLE);
64 DrawStyle = DT_SINGLELINE;
65
66 if (WinStyle & SS_CENTER)
67 DrawStyle |= DT_CENTER;
68 if (WinStyle & SS_RIGHT)
69 DrawStyle |= DT_RIGHT;
70 if (WinStyle & SS_CENTERIMAGE)
71 DrawStyle |= DT_VCENTER;
72
73 SetTextColor(hdc, LINK_COLOR);
74 SetBkMode(hdc, TRANSPARENT);
75 hOld = SelectObject(hdc, pLink->hFont);
76 SetBkColor(hdc, GetSysColor(COLOR_3DFACE));
77
78 GetClientRect(pLink->hSelf, &rc);
79
80 GetWindowText(pLink->hSelf, szText, sizeof(szText));
81 DrawText(hdc, szText, -1, &rc, DrawStyle);
82
83 }
84
85
86 static LRESULT CALLBACK
87 LinkCtlWndProc(HWND hwnd,
88 UINT msg,
89 WPARAM wParam,
90 LPARAM lParam)
91 {
92 PLINKCTL pLink = (PLINKCTL)GetWindowLongPtr(hwnd, GWL_USERDATA);
93 WNDPROC oldproc = pLink->OldProc;
94
95 switch(msg)
96 {
97 case WM_PAINT:
98 {
99 PAINTSTRUCT ps;
100 HDC hdc;
101
102 hdc = BeginPaint(hwnd, &ps);
103 DoPaint(pLink, hdc);
104 EndPaint(hwnd, &ps);
105 return 0;
106 }
107
108 case WM_SETCURSOR:
109 {
110 HCURSOR hCur = LoadCursor(NULL, IDC_HAND);
111 SetCursor(hCur);
112 return TRUE;
113 }
114
115 case WM_SETFONT:
116 {
117 LOGFONT LogFont;
118 HFONT hOldFont;
119
120 hOldFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
121 GetObject(hOldFont, sizeof(LogFont), &LogFont);
122 LogFont.lfUnderline = TRUE;
123 if (pLink->hFont) DeleteObject(hwnd);
124 pLink->hFont = CreateFontIndirect(&LogFont);
125
126 CallWindowProc(pLink->OldProc, hwnd, msg, wParam, lParam);
127
128 if (LOWORD(lParam))
129 {
130 InvalidateRect(hwnd, NULL, TRUE);
131 UpdateWindow(hwnd);
132 }
133 return 0;
134 }
135
136 case WM_NCHITTEST:
137 return HTCLIENT;
138
139 case WM_LBUTTONDOWN:
140 {
141 SetFocus(hwnd);
142 SetCapture(hwnd);
143 pLink->bClicked = TRUE;
144 }
145 break;
146
147 case WM_LBUTTONUP:
148 {
149 DoLButtonUp(pLink, lParam);
150 }
151 break;
152
153 case WM_NCDESTROY:
154 {
155 HeapFree(GetProcessHeap(),
156 0,
157 pLink);
158 }
159 break;
160 }
161
162 return CallWindowProc(oldproc,
163 hwnd,
164 msg,
165 wParam,
166 lParam);
167 }
168
169
170 BOOL
171 TextToLink(HWND hwnd,
172 LPTSTR lpApp,
173 LPTSTR lpParams)
174 {
175 PLINKCTL pLink;
176 HFONT hFont;
177
178 /* error checking */
179 if (lstrlen(lpApp) >= (MAX_PATH - 1) ||
180 lstrlen(lpParams) >= (MAX_PARAMS -1))
181 {
182 return FALSE;
183 }
184
185 pLink = (PLINKCTL)HeapAlloc(GetProcessHeap(),
186 0,
187 sizeof(LINKCTL));
188 if (pLink == NULL)
189 return FALSE;
190
191 pLink->hSelf = hwnd;
192 lstrcpyn(pLink->szApp, lpApp, MAX_PATH);
193 lstrcpyn(pLink->szParams, lpParams, MAX_PARAMS);
194 pLink->bClicked = FALSE;
195
196 hFont=(HFONT)SendMessage(hwnd, WM_GETFONT, 0, 0);
197
198
199 pLink->OldProc = (WNDPROC)SetWindowLongPtr(hwnd,
200 GWL_WNDPROC,
201 (LONG_PTR)LinkCtlWndProc);
202 SetWindowLongPtr(hwnd,
203 GWL_USERDATA,
204 (LONG_PTR)pLink);
205
206 SendMessage(hwnd, WM_SETFONT, (WPARAM)hFont, 0);
207
208 return TRUE;
209 }