| /* |
| * OleView (pane.c) |
| * |
| * Copyright 2006 Piotr Caban |
| * |
| * This library is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU Lesser General Public |
| * License as published by the Free Software Foundation; either |
| * version 2.1 of the License, or (at your option) any later version. |
| * |
| * This library is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| * Lesser General Public License for more details. |
| * |
| * You should have received a copy of the GNU Lesser General Public |
| * License along with this library; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA |
| */ |
| |
| #include "main.h" |
| |
| static int GetSplitPos(HWND hWnd) |
| { |
| PANE *pane = (PANE *)GetMenu(hWnd); |
| |
| if(pane->pos < pane->size/2+1) pane->pos = pane->size/2+1; |
| |
| return (pane->width>pane->pos+pane->size/2+1 ? |
| pane->pos : pane->width-pane->size/2-1); |
| } |
| |
| static void DrawSplitMoving(HWND hWnd, int x) |
| { |
| RECT rt; |
| HDC hdc = GetDC(hWnd); |
| PANE *pane = (PANE *)GetMenu(hWnd); |
| |
| GetClientRect(hWnd, &rt); |
| |
| if(pane->last!=-1) |
| { |
| rt.left = pane->last-pane->size/2; |
| rt.right = pane->last+pane->size/2; |
| InvertRect(hdc, &rt); |
| } |
| |
| pane->pos = x>MAX_WINDOW_WIDTH ? -1 : x; |
| x = GetSplitPos(hWnd); |
| |
| pane->pos = x; |
| rt.left = x-pane->size/2; |
| rt.right = x+pane->size/2; |
| pane->last = x; |
| InvertRect(hdc, &rt); |
| |
| ReleaseDC(hWnd, hdc); |
| } |
| |
| LRESULT CALLBACK PaneProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) |
| { |
| POINT pt; |
| PANE *pane = (PANE*)GetMenu(hWnd); |
| |
| switch(uMsg) |
| { |
| case WM_SETCURSOR: |
| GetCursorPos(&pt); |
| ScreenToClient(hWnd, &pt); |
| |
| if(pt.x >= GetSplitPos(hWnd)-pane->size/2 && |
| pt.x <= GetSplitPos(hWnd)+pane->size/2) |
| SetCursor(LoadCursor(0, IDC_SIZEWE)); |
| break; |
| case WM_LBUTTONDOWN: |
| if((short)LOWORD(lParam) >= GetSplitPos(hWnd)-pane->size/2 && |
| (short)LOWORD(lParam) <= GetSplitPos(hWnd)+pane->size/2) |
| { |
| pane->last = -1; |
| DrawSplitMoving(hWnd, (short)LOWORD(lParam)); |
| SetCapture(hWnd); |
| } |
| break; |
| case WM_LBUTTONUP: |
| if(GetCapture() == hWnd) |
| { |
| pane->last = -1; |
| DrawSplitMoving(hWnd, (short)LOWORD(lParam)); |
| |
| MoveWindow(pane->left, 0, 0, |
| GetSplitPos(hWnd)-pane->size/2, pane->height, TRUE); |
| MoveWindow(pane->right, GetSplitPos(hWnd)+pane->size/2, 0, |
| pane->width-GetSplitPos(hWnd)-pane->size/2, pane->height, TRUE); |
| |
| ReleaseCapture(); |
| } |
| break; |
| case WM_MOUSEMOVE: |
| if(GetCapture() == hWnd) |
| DrawSplitMoving(hWnd, (short)LOWORD(lParam)); |
| break; |
| case WM_NOTIFY: |
| if((int)wParam != TYPELIB_TREE) break; |
| switch(((LPNMHDR)lParam)->code) |
| { |
| case TVN_SELCHANGED: |
| UpdateData(((NMTREEVIEW *)lParam)->itemNew.hItem); |
| break; |
| } |
| break; |
| case WM_SIZE: |
| if(wParam == SIZE_MINIMIZED) break; |
| pane->width = LOWORD(lParam); |
| pane->height = HIWORD(lParam); |
| |
| MoveWindow(pane->left, 0, 0, |
| GetSplitPos(hWnd)-pane->size/2, HIWORD(lParam), TRUE); |
| MoveWindow(pane->right, GetSplitPos(hWnd)+pane->size/2, 0, |
| LOWORD(lParam)-GetSplitPos(hWnd)-pane->size/2, |
| HIWORD(lParam), TRUE); |
| break; |
| case WM_DESTROY: |
| HeapFree(GetProcessHeap(), 0, pane); |
| break; |
| default: |
| return DefWindowProc(hWnd, uMsg, wParam, lParam); |
| } |
| return 0; |
| } |
| |
| BOOL PaneRegisterClass(void) |
| { |
| WNDCLASS wcc; |
| const WCHAR wszPaneClass[] = { 'P','A','N','E','\0' }; |
| |
| memset(&wcc, 0, sizeof(WNDCLASS)); |
| wcc.lpfnWndProc = PaneProc; |
| wcc.hbrBackground = (HBRUSH)(COLOR_WINDOW); |
| wcc.lpszClassName = wszPaneClass; |
| |
| if(!RegisterClass(&wcc)) |
| return FALSE; |
| return TRUE; |
| } |
| |
| BOOL CreatePanedWindow(HWND hWnd, HWND *hWndCreated, HINSTANCE hInst) |
| { |
| const WCHAR wszPaneClass[] = { 'P','A','N','E','\0' }; |
| PANE *pane; |
| |
| pane = HeapAlloc(GetProcessHeap(), 0, sizeof(PANE)); |
| *hWndCreated = CreateWindow(wszPaneClass, NULL, WS_CHILD|WS_VISIBLE, |
| CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hWnd, (HMENU)pane, hInst, NULL); |
| if(!hWndCreated) |
| { |
| HeapFree(GetProcessHeap(), 0, pane); |
| return FALSE; |
| } |
| |
| pane->left = NULL; |
| pane->right = NULL; |
| pane->pos = 300; |
| pane->size = 5; |
| |
| return TRUE; |
| } |
| |
| void SetLeft(HWND hParent, HWND hWnd) |
| { |
| PANE *pane = (PANE *)GetMenu(hParent); |
| pane->left = hWnd; |
| } |
| |
| void SetRight(HWND hParent, HWND hWnd) |
| { |
| PANE *pane = (PANE *)GetMenu(hParent); |
| pane->right = hWnd; |
| } |