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