Module: wine Branch: refs/heads/master Commit: b33f95e65259b3d8a0ef01ca2660c91deabc0540 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=b33f95e65259b3d8a0ef01ca...
Author: Piotr Caban piotr.caban@gmail.com Date: Wed Jun 14 19:51:27 2006 +0200
oleview: Added pane bar.
---
programs/oleview/Makefile.in | 3 + programs/oleview/main.h | 17 ++++ programs/oleview/oleview.c | 8 ++ programs/oleview/pane.c | 159 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 185 insertions(+), 2 deletions(-) create mode 100644 programs/oleview/pane.c
diff --git a/programs/oleview/Makefile.in b/programs/oleview/Makefile.in index 8c2fb93..f976743 100644 --- a/programs/oleview/Makefile.in +++ b/programs/oleview/Makefile.in @@ -9,7 +9,8 @@ EXTRALIBS = -luuid EXTRADEFS = -DUNICODE
C_SRCS = \ - oleview.c + oleview.c \ + pane.c
RC_SRCS = rsrc.rc RC_BINSRC = rsrc.rc diff --git a/programs/oleview/main.h b/programs/oleview/main.h index 0c6fc09..870d436 100644 --- a/programs/oleview/main.h +++ b/programs/oleview/main.h @@ -29,15 +29,32 @@ #include <wine/unicode.h> #include "resource.h"
#define MAX_LOAD_STRING 256 +#define MAX_WINDOW_WIDTH 30000
#define STATUS_WINDOW 2000
typedef struct { HWND hMainWnd; + HWND hPaneWnd; HWND hStatusBar; HWND hToolBar; HINSTANCE hMainInst; }GLOBALS;
+typedef struct +{ + HWND left; + HWND right; + INT pos; + INT size; + INT width; + INT height; + INT last; +}PANE; + extern GLOBALS globals; + +/* Predefinitions: */ +/* pane.c */ +BOOL CreatePanedWindow(HWND hWnd, HWND *hWndCreated, HINSTANCE hInst); diff --git a/programs/oleview/oleview.c b/programs/oleview/oleview.c index 76fe1c9..c248055 100644 --- a/programs/oleview/oleview.c +++ b/programs/oleview/oleview.c @@ -24,7 +24,7 @@ GLOBALS globals;
void ResizeChild(void) { - RECT stat, tool; + RECT client, stat, tool;
MoveWindow(globals.hStatusBar, 0, 0, 0, 0, TRUE); MoveWindow(globals.hToolBar, 0, 0, 0, 0, TRUE); @@ -39,6 +39,10 @@ void ResizeChild(void) tool.bottom += 2; } else tool.bottom = 0; + + GetClientRect(globals.hMainWnd, &client); + MoveWindow(globals.hPaneWnd, 0, tool.bottom, + client.right, client.bottom-tool.bottom-stat.bottom, TRUE); }
void UpdateStatusBar(int itemID) @@ -58,6 +62,8 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT { case WM_CREATE: OleInitialize(NULL); + if(!CreatePanedWindow(hWnd, &globals.hPaneWnd, globals.hMainInst)) + PostQuitMessage(0); break; case WM_DESTROY: OleUninitialize(); diff --git a/programs/oleview/pane.c b/programs/oleview/pane.c new file mode 100644 index 0000000..6e5ab62 --- /dev/null +++ b/programs/oleview/pane.c @@ -0,0 +1,159 @@ +/* + * 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" + +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); +} + +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(LOWORD(lParam) >= GetSplitPos(hWnd)-pane->size/2 && + LOWORD(lParam) <= GetSplitPos(hWnd)+pane->size/2) + { + pane->last = -1; + DrawSplitMoving(hWnd, LOWORD(lParam)); + SetCapture(hWnd); + } + break; + case WM_LBUTTONUP: + if(GetCapture() == hWnd) + { + pane->last = -1; + DrawSplitMoving(hWnd, 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, LOWORD(lParam)); + 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 CreatePanedWindow(HWND hWnd, HWND *hWndCreated, HINSTANCE hInst) +{ + WNDCLASS wcc; + const WCHAR wszPaneClass[] = { 'P','A','N','E','\0' }; + PANE *pane; + + memset(&wcc, 0, sizeof(WNDCLASS)); + wcc.lpfnWndProc = PaneProc; + wcc.hbrBackground = (HBRUSH)(COLOR_WINDOW); + wcc.lpszClassName = wszPaneClass; + + if(!RegisterClass(&wcc)) + return FALSE; + + 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) 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; +}