Split window control, listview and treeview moved to child window.
authorRobert Dickenson <robd@reactos.org>
Sun, 14 Jul 2002 21:03:10 +0000 (21:03 +0000)
committerRobert Dickenson <robd@reactos.org>
Sun, 14 Jul 2002 21:03:10 +0000 (21:03 +0000)
svn path=/trunk/; revision=3222

rosapps/regedit/childwnd.c [new file with mode: 0644]
rosapps/regedit/childwnd.h [new file with mode: 0644]

diff --git a/rosapps/regedit/childwnd.c b/rosapps/regedit/childwnd.c
new file mode 100644 (file)
index 0000000..d4e1049
--- /dev/null
@@ -0,0 +1,285 @@
+/*
+ *  ReactOS regedit
+ *
+ *  childwnd.c
+ *
+ *  Copyright (C) 2002  Robert Dickenson <robd@reactos.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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 General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifdef _MSC_VER
+#include "stdafx.h"
+#else
+#define WIN32_LEAN_AND_MEAN     // Exclude rarely-used stuff from Windows headers
+#include <windows.h>
+#include <commctrl.h>
+#include <stdlib.h>
+#include <malloc.h>
+#include <memory.h>
+#include <tchar.h>
+#include <process.h>
+#include <stdio.h>
+#endif
+    
+#include <assert.h>
+#define ASSERT assert
+
+#include "main.h"
+#include "framewnd.h"
+#include "childwnd.h"
+#include "treeview.h"
+#include "listview.h"
+
+//HWND hLeftWnd;                   // Tree Control Window
+//HWND hRightWnd;                   // List Control Window
+
+#define hLeftWnd hTreeWnd
+#define hRightWnd hListWnd
+
+
+HWND hTreeWnd;                   // Tree Control Window
+HWND hListWnd;                   // List Control Window
+
+static int nSplitPos = 250;
+static int nFocusPanel;
+
+////////////////////////////////////////////////////////////////////////////////
+
+static void draw_splitbar(HWND hWnd, int x)
+{
+       RECT rt;
+       HDC hdc = GetDC(hWnd);
+
+       GetClientRect(hWnd, &rt);
+       rt.left = x - SPLIT_WIDTH/2;
+       rt.right = x + SPLIT_WIDTH/2+1;
+       InvertRect(hdc, &rt);
+       ReleaseDC(hWnd, hdc);
+}
+
+#define _NO_EXTENSIONS
+
+static void ResizeWnd(int cx, int cy)
+{
+       HDWP hdwp = BeginDeferWindowPos(2);
+       RECT rt = {0, 0, cx, cy};
+
+       cx = nSplitPos + SPLIT_WIDTH/2;
+    DeferWindowPos(hdwp, hTreeWnd, 0, rt.left, rt.top, nSplitPos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
+       DeferWindowPos(hdwp, hListWnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
+       EndDeferWindowPos(hdwp);
+}
+
+static void OnSize(WPARAM wParam, LPARAM lParam)
+{
+    if (wParam != SIZE_MINIMIZED) {
+               ResizeWnd(LOWORD(lParam), HIWORD(lParam));
+    }
+}
+
+static void OnPaint(HWND hWnd)
+{
+    PAINTSTRUCT ps;
+    RECT rt;
+    HDC hdc;
+
+    GetClientRect(hWnd, &rt);
+    hdc = BeginPaint(hWnd, &ps);
+    FillRect(ps.hdc, &rt, GetStockObject(LTGRAY_BRUSH));
+    EndPaint(hWnd, &ps);
+}
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  FUNCTION: _CmdWndProc(HWND, unsigned, WORD, LONG)
+//
+//  PURPOSE:  Processes WM_COMMAND messages for the main frame window.
+//
+//
+
+static BOOL _CmdWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+       switch (LOWORD(wParam)) {
+    // Parse the menu selections:
+    case ID_REGISTRY_EXIT:
+        DestroyWindow(hWnd);
+        break;
+    case ID_VIEW_REFRESH:
+        // TODO:
+        break;
+    default:
+        return FALSE;
+    }
+       return TRUE;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+//  FUNCTION: ChildWndProc(HWND, unsigned, WORD, LONG)
+//
+//  PURPOSE:  Processes messages for the child windows.
+//
+//  WM_COMMAND  - process the application menu
+//  WM_PAINT    - Paint the main window
+//  WM_DESTROY  - post a quit message and return
+//
+//
+LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+    static int last_split;
+//    ChildWnd* pChildWnd = (ChildWnd*)GetWindowLong(hWnd, GWL_USERDATA);
+//    ASSERT(pChildWnd);
+
+    switch (message) {
+    case WM_CREATE:
+        //HWND CreateListView(HWND hwndParent/*, Pane* pane*/, int id, LPTSTR lpszPathName);
+        hTreeWnd = CreateTreeView(hWnd, 1000, _T("c:\\foobar.txt"));
+        hListWnd = CreateListView(hWnd, 1001, _T(""));
+        break;
+    case WM_COMMAND:
+        if (!_CmdWndProc(hWnd, message, wParam, lParam)) {
+                   return DefWindowProc(hWnd, message, wParam, lParam);
+        }
+               break;
+    case WM_PAINT:
+        OnPaint(hWnd);
+        return 0;
+       case WM_SETCURSOR:
+               if (LOWORD(lParam) == HTCLIENT) {
+                       POINT pt;
+                       GetCursorPos(&pt);
+                       ScreenToClient(hWnd, &pt);
+                       if (pt.x>=nSplitPos-SPLIT_WIDTH/2 && pt.x<nSplitPos+SPLIT_WIDTH/2+1) {
+                               SetCursor(LoadCursor(0, IDC_SIZEWE));
+                               return TRUE;
+                       }
+               }
+               goto def;
+        //break;
+
+    case WM_DESTROY:
+        PostQuitMessage(0);
+        break;
+       case WM_LBUTTONDOWN: {
+               RECT rt;
+               int x = LOWORD(lParam);
+               GetClientRect(hWnd, &rt);
+               if (x>=nSplitPos-SPLIT_WIDTH/2 && x<nSplitPos+SPLIT_WIDTH/2+1) {
+                       last_split = nSplitPos;
+#ifdef _NO_EXTENSIONS
+                       draw_splitbar(hWnd, last_split);
+#endif
+                       SetCapture(hWnd);
+               }
+               break;}
+
+       case WM_LBUTTONUP:
+               if (GetCapture() == hWnd) {
+#ifdef _NO_EXTENSIONS
+                       RECT rt;
+                       int x = LOWORD(lParam);
+                       draw_splitbar(hWnd, last_split);
+                       last_split = -1;
+                       GetClientRect(hWnd, &rt);
+                       nSplitPos = x;
+                       ResizeWnd(rt.right, rt.bottom);
+#endif
+                       ReleaseCapture();
+               }
+               break;
+
+#ifdef _NO_EXTENSIONS
+       case WM_CAPTURECHANGED:
+               if (GetCapture()==hWnd && last_split>=0)
+                       draw_splitbar(hWnd, last_split);
+               break;
+#endif
+       case WM_KEYDOWN:
+               if (wParam == VK_ESCAPE)
+                       if (GetCapture() == hWnd) {
+                               RECT rt;
+#ifdef _NO_EXTENSIONS
+                               draw_splitbar(hWnd, last_split);
+#else
+                               nSplitPos = last_split;
+#endif
+                               GetClientRect(hWnd, &rt);
+                ResizeWnd(rt.right, rt.bottom);
+                               last_split = -1;
+                               ReleaseCapture();
+                               SetCursor(LoadCursor(0, IDC_ARROW));
+                       }
+               break;
+
+       case WM_MOUSEMOVE:
+               if (GetCapture() == hWnd) {
+                       RECT rt;
+                       int x = LOWORD(lParam);
+#ifdef _NO_EXTENSIONS
+                       HDC hdc = GetDC(hWnd);
+                       GetClientRect(hWnd, &rt);
+                       rt.left = last_split-SPLIT_WIDTH/2;
+                       rt.right = last_split+SPLIT_WIDTH/2+1;
+                       InvertRect(hdc, &rt);
+                       last_split = x;
+                       rt.left = x-SPLIT_WIDTH/2;
+                       rt.right = x+SPLIT_WIDTH/2+1;
+                       InvertRect(hdc, &rt);
+                       ReleaseDC(hWnd, hdc);
+#else
+                       GetClientRect(hWnd, &rt);
+                       if (x>=0 && x<rt.right) {
+                               nSplitPos = x;
+                               //resize_tree(pChildWnd, rt.right, rt.bottom);
+                               rt.left = x-SPLIT_WIDTH/2;
+                               rt.right = x+SPLIT_WIDTH/2+1;
+                               InvalidateRect(hWnd, &rt, FALSE);
+                               UpdateWindow(hLeftWnd);
+                               UpdateWindow(hWnd);
+                               UpdateWindow(hRightWnd);
+                       }
+#endif
+               }
+               break;
+
+#ifndef _NO_EXTENSIONS
+       case WM_GETMINMAXINFO:
+               DefWindowProc(hWnd, message, wParam, lParam);
+               {LPMINMAXINFO lpmmi = (LPMINMAXINFO)lParam;
+               lpmmi->ptMaxTrackSize.x <<= 1;//2*GetSystemMetrics(SM_CXSCREEN) / SM_CXVIRTUALSCREEN
+               lpmmi->ptMaxTrackSize.y <<= 1;//2*GetSystemMetrics(SM_CYSCREEN) / SM_CYVIRTUALSCREEN
+               break;}
+#endif
+
+       case WM_SETFOCUS:
+//             SetCurrentDirectory(szPath);
+               SetFocus(nFocusPanel? hRightWnd: hLeftWnd);
+               break;
+
+    case WM_TIMER:
+        break;
+
+       case WM_SIZE:
+        if (wParam != SIZE_MINIMIZED) {
+            OnSize(wParam, lParam);
+        }
+        // fall through
+    default: def:
+        return DefWindowProc(hWnd, message, wParam, lParam);
+   }
+   return 0;
+}
diff --git a/rosapps/regedit/childwnd.h b/rosapps/regedit/childwnd.h
new file mode 100644 (file)
index 0000000..454a982
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ *  ReactOS regedit
+ *
+ *  childwnd.h
+ *
+ *  Copyright (C) 2002  Robert Dickenson <robd@reactos.org>
+ *
+ *  This program is free software; you can redistribute it and/or modify
+ *  it under the terms of the GNU General Public License as published by
+ *  the Free Software Foundation; either version 2 of the License, or
+ *  (at your option) any later version.
+ *
+ *  This program 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 General Public License for more details.
+ *
+ *  You should have received a copy of the GNU General Public License
+ *  along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#ifndef __CHILDWND_H__
+#define __CHILDWND_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#if _MSC_VER > 1000
+#pragma once
+#endif // _MSC_VER > 1000
+
+
+LRESULT CALLBACK ChildWndProc(HWND, UINT, WPARAM, LPARAM);
+    
+
+#ifdef __cplusplus
+};
+#endif
+
+#endif // __CHILDWND_H__