vcomp: Use RtlIsCriticalSectionLockedByThread to check lock owner.
[wine.git] / programs / oleview / pane.c
blob9e4cd2837594f72ba738d5c621484cd9d2cf7a23
1 /*
2 * OleView (pane.c)
4 * Copyright 2006 Piotr Caban
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "main.h"
23 static int GetSplitPos(HWND hWnd)
25 PANE *pane = (PANE *)GetMenu(hWnd);
27 if(pane->pos < pane->size/2+1) pane->pos = pane->size/2+1;
29 return (pane->width>pane->pos+pane->size/2+1 ?
30 pane->pos : pane->width-pane->size/2-1);
33 static void DrawSplitMoving(HWND hWnd, int x)
35 RECT rt;
36 HDC hdc = GetDC(hWnd);
37 PANE *pane = (PANE *)GetMenu(hWnd);
39 GetClientRect(hWnd, &rt);
41 if(pane->last!=-1)
43 rt.left = pane->last-pane->size/2;
44 rt.right = pane->last+pane->size/2;
45 InvertRect(hdc, &rt);
48 pane->pos = x>MAX_WINDOW_WIDTH ? -1 : x;
49 x = GetSplitPos(hWnd);
51 pane->pos = x;
52 rt.left = x-pane->size/2;
53 rt.right = x+pane->size/2;
54 pane->last = x;
55 InvertRect(hdc, &rt);
57 ReleaseDC(hWnd, hdc);
60 static LRESULT CALLBACK PaneProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
62 POINT pt;
63 PANE *pane = (PANE*)GetMenu(hWnd);
65 switch(uMsg)
67 case WM_SETCURSOR:
68 GetCursorPos(&pt);
69 ScreenToClient(hWnd, &pt);
71 if(pt.x >= GetSplitPos(hWnd)-pane->size/2 &&
72 pt.x <= GetSplitPos(hWnd)+pane->size/2)
73 SetCursor(LoadCursorW(0, (LPWSTR)IDC_SIZEWE));
74 break;
75 case WM_LBUTTONDOWN:
76 if((short)LOWORD(lParam) >= GetSplitPos(hWnd)-pane->size/2 &&
77 (short)LOWORD(lParam) <= GetSplitPos(hWnd)+pane->size/2)
79 pane->last = -1;
80 DrawSplitMoving(hWnd, (short)LOWORD(lParam));
81 SetCapture(hWnd);
83 break;
84 case WM_LBUTTONUP:
85 if(GetCapture() == hWnd)
87 pane->last = -1;
88 DrawSplitMoving(hWnd, (short)LOWORD(lParam));
90 MoveWindow(pane->left, 0, 0,
91 GetSplitPos(hWnd)-pane->size/2, pane->height, TRUE);
92 MoveWindow(pane->right, GetSplitPos(hWnd)+pane->size/2, 0,
93 pane->width-GetSplitPos(hWnd)-pane->size/2, pane->height, TRUE);
95 ReleaseCapture();
97 break;
98 case WM_MOUSEMOVE:
99 if(GetCapture() == hWnd)
100 DrawSplitMoving(hWnd, (short)LOWORD(lParam));
101 break;
102 case WM_NOTIFY:
103 if((int)wParam != TYPELIB_TREE) break;
104 switch(((LPNMHDR)lParam)->code)
106 case TVN_SELCHANGEDW:
107 UpdateData(((NMTREEVIEWW *)lParam)->itemNew.hItem);
108 break;
110 break;
111 case WM_SIZE:
112 if(wParam == SIZE_MINIMIZED) break;
113 pane->width = LOWORD(lParam);
114 pane->height = HIWORD(lParam);
116 MoveWindow(pane->left, 0, 0,
117 GetSplitPos(hWnd)-pane->size/2, HIWORD(lParam), TRUE);
118 MoveWindow(pane->right, GetSplitPos(hWnd)+pane->size/2, 0,
119 LOWORD(lParam)-GetSplitPos(hWnd)-pane->size/2,
120 HIWORD(lParam), TRUE);
121 break;
122 case WM_DESTROY:
123 HeapFree(GetProcessHeap(), 0, pane);
124 break;
125 default:
126 return DefWindowProcW(hWnd, uMsg, wParam, lParam);
128 return 0;
131 BOOL PaneRegisterClassW(void)
133 WNDCLASSW wcc;
134 const WCHAR wszPaneClass[] = { 'P','A','N','E','\0' };
136 memset(&wcc, 0, sizeof(WNDCLASSW));
137 wcc.lpfnWndProc = PaneProc;
138 wcc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
139 wcc.hCursor = LoadCursorW(0, (LPCWSTR)IDC_ARROW);
140 wcc.lpszClassName = wszPaneClass;
142 if(!RegisterClassW(&wcc))
143 return FALSE;
144 return TRUE;
147 BOOL CreatePanedWindow(HWND hWnd, HWND *hWndCreated, HINSTANCE hInst)
149 const WCHAR wszPaneClass[] = { 'P','A','N','E','\0' };
150 PANE *pane;
152 pane = HeapAlloc(GetProcessHeap(), 0, sizeof(PANE));
153 *hWndCreated = CreateWindowW(wszPaneClass, NULL, WS_CHILD|WS_VISIBLE,
154 CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hWnd, (HMENU)pane, hInst, NULL);
155 if(!*hWndCreated)
157 HeapFree(GetProcessHeap(), 0, pane);
158 return FALSE;
161 pane->left = NULL;
162 pane->right = NULL;
163 pane->pos = 300;
164 pane->size = 5;
166 return TRUE;
169 void SetLeft(HWND hParent, HWND hWnd)
171 PANE *pane = (PANE *)GetMenu(hParent);
172 pane->left = hWnd;
175 void SetRight(HWND hParent, HWND hWnd)
177 PANE *pane = (PANE *)GetMenu(hParent);
178 pane->right = hWnd;