Piotr Caban : oleview: Added pane bar.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Jun 21 05:25:33 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: b33f95e65259b3d8a0ef01ca2660c91deabc0540
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=b33f95e65259b3d8a0ef01ca2660c91deabc0540
Author: Piotr Caban <piotr.caban at 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;
+}
More information about the wine-cvs
mailing list