winfs.o \
shellfs.o \
mainframe.o \
- filechild.o \
- pane.o \
shellbrowser.o \
desktop.o \
desktopbar.o \
winfs.o \
shellfs.o \
mainframe.o \
- filechild.o \
- pane.o \
shellbrowser.o \
desktop.o \
desktopbar.o \
#include "../utility/utility.h"
-#include "../utility/shellclasses.h"
-#include "../utility/shellbrowserimpl.h"
-#include "../utility/dragdropimpl.h"
-#include "../utility/window.h"
+
+#include "../explorer.h" // for MainFrame::OpenShellFolders()
+#include "desktop.h"
#include "../globals.h"
#include "../externals.h"
-#include "../explorer_intres.h"
-#include "desktop.h"
#include "../taskbar/desktopbar.h"
-#include "../shell/mainframe.h" // for MainFrame::Create()
+
+#include "../explorer_intres.h"
static BOOL (WINAPI*SetShellWindow)(HWND);
//
// =Memo for future Japanese maintainer=
// For future ease of maintenance, I marked "FIXME?" on strings I suspect I have
-// mistranslated or I haven't translated(especially, "IDM_WINEFILE" have many
-// suspected strings because I haven't tested under WINE). Others are set as is in
+// mistranslated or I haven't translated. Others are set as is in
// purpose. BTW, I feel it strange that the word;"directory" turns into "folder" for
// Japanese Windows(..or English Windows also use "folder" instead of "directory"? I
// have no idea). I obeyed as the MS do. Also, there might be some menus which have
POPUP "\83E\83B\83\93\83h\83E(&W)"
BEGIN
MENUITEM "\90V\82µ\82¢\83E\83B\83\93\83h\83E(&W)", ID_WINDOW_NEW
- MENUITEM "\83J\83X\83P\81[\83h\tShift+F5", ID_WINDOW_CASCADE
- MENUITEM "\90\85\95½\82É\90®\97ñ(&H)", ID_WINDOW_TILE_HORZ
- MENUITEM "\90\82\92¼\82É\90®\97ñ(&V)\tShift+F4", ID_WINDOW_TILE_VERT
- MENUITEM "\8e©\93®\90®\97ñ", ID_WINDOW_AUTOSORT
- MENUITEM "\8dÅ\8f¬\89»\82³\82ê\82½\8eq\83E\83B\83\93\83h\83E\82ð\90®\97ñ(&S)", ID_WINDOW_ARRANGE //FIXME?
MENUITEM "\8dÅ\90V\82Ì\8fî\95ñ\82É\8dX\90V(&R)\tF5", ID_REFRESH
END
POPUP "\83w\83\8b\83v(&H)"
END
END
-IDM_WINEFILE MENU FIXED IMPURE
-BEGIN
- POPUP "\83t\83@\83C\83\8b(&F)"
- BEGIN
- MENUITEM "\8aJ\82(&O)\tEnter", 101
- MENUITEM "\88Ú\93®(&M)...\tF7", 106
- MENUITEM "\83R\83s\81[(&C)...\tF8", 107
- MENUITEM "\83N\83\8a\83b\83v\83{\81[\83h\82Ö(&I)...\tF9", 118 //FIXME?
- MENUITEM "\8dí\8f\9c(&D)\tDel", 108
- MENUITEM "\96¼\91O\82Ì\95Ï\8dX(&N)...", 109
- MENUITEM "\83v\83\8d\83p\83e\83B(&I)...\tAlt+Enter", ID_EDIT_PROPERTIES
- MENUITEM SEPARATOR
- MENUITEM "\88³\8fk(&O)...", 119
- MENUITEM "\93W\8aJ(&O)...", 120
- MENUITEM SEPARATOR
- MENUITEM "\8eÀ\8ds(&R)...", ID_EXECUTE
- MENUITEM "\88ó\8dü(&P)...", 102
- MENUITEM "\8aÖ\98A\95t\82¯...", 103 //FIXME?
- MENUITEM SEPARATOR
- MENUITEM "\83t\83H\83\8b\83_\82ð\8dì\90¬(&E)...", ID_EXECUTE //FIXME?
- MENUITEM "\8c\9f\8dõ(&H)...", 104
- MENUITEM "\83t\83@\83C\83\8b\82ð\91I\91ð(&S)...", 116
- MENUITEM SEPARATOR
- MENUITEM "\8fI\97¹(&X)\tAlt+X", ID_FILE_EXIT
- END
- POPUP "\83f\83B\83X\83N(&D)"
- BEGIN
- MENUITEM "\83f\83B\83X\83N\82ð\83R\83s\81[(&C)...", 201
- MENUITEM "\83f\83B\83X\83N\82É\83\89\83x\83\8b\82ð\82Â\82¯\82é(&L)...", 202
- MENUITEM SEPARATOR
- MENUITEM "\83t\83H\81[\83}\83b\83g(&F)...", 203
- MENUITEM SEPARATOR
- MENUITEM "\83l\83b\83g\83\8f\81[\83N\83h\83\89\83C\83u\82ð\90Ú\91±(&N)", 252
- MENUITEM "\83l\83b\83g\83\8f\81[\83N\83h\83\89\83C\83u\82ð\90Ø\92f(&D)", 253
- MENUITEM SEPARATOR
- MENUITEM "\96¼\91O\82ð\95t\82¯\82Ä\8b¤\97L...", 254
- MENUITEM "\8b¤\97L\89ð\8f\9c(&R)...", 255
- MENUITEM SEPARATOR
- MENUITEM "\83h\83\89\83C\83u\82ð\91I\91ð(&S)...", 251
- END
- POPUP "\83f\83B\83\8c\83N\83g\83\8a(&D)"
- BEGIN
- MENUITEM "\8e\9f\82Ì\8aK\91w\82Ö(&N)\t+", 301 //FIXME?
- MENUITEM "\83c\83\8a\81[\82ð\93W\8aJ(&T)\t*", 302
- MENUITEM "\91S\82Ä\93W\8aJ(&A)\tStrg+*", 303
- MENUITEM "\83c\83\8a\81[\82ð\8fô\82Þ(&T)\t-", 304
- MENUITEM SEPARATOR
- MENUITEM "\8eq\83m\81[\83h\82ð\83}\81[\83N(&M)", 505 //FIXME?
- END
- POPUP "\95\\\8e¦(&V)"
- BEGIN
- MENUITEM "\83c\83\8a\81[\82Æ\83t\83H\83\8b\83_(&R)", 413
- MENUITEM "\83c\83\8a\81[\82Ì\82Ý(&E)", 411
- MENUITEM "\83t\83H\83\8b\83_\82Ì\82Ý(&O)", 412
- MENUITEM SEPARATOR
- MENUITEM "\95ª\8a\84(&L)", 414 //FIXME?
- MENUITEM SEPARATOR
- MENUITEM "\96¼\91O(&N)", ID_VIEW_NAME //FIXME?
- MENUITEM "\83t\83@\83C\83\8b\82Ì\91S\8fÚ\8d×(&A)", ID_VIEW_ALL_ATTRIBUTES
- , CHECKED
- MENUITEM "\8fÚ\8d×\82ð\91I\91ð\95\\\8e¦(&P)...", ID_VIEW_SELECTED_ATTRIBUTES //FIXME?
- MENUITEM SEPARATOR
- MENUITEM "\96¼\91O\8f\87\82É\90®\97ñ(&S)", 404
- MENUITEM "\8eí\97Þ\8f\87\82É\90®\97ñ(&B)", 405
- MENUITEM "\83T\83C\83Y\8f\87\82É\90®\97ñ(&Z)", 406
- MENUITEM "\93ú\95t\8f\87\82É\90®\97ñ(&D)", 407
- MENUITEM SEPARATOR
- MENUITEM "\8fÚ\8d×\82ð\8ew\92è\82µ\82Ä\90®\97ñ&...", 409 //FIXME?
- END
- POPUP "\83I\83v\83V\83\87\83\93(&O)"
- BEGIN
- MENUITEM "\8am\94F(&C)...", 65535 //FIXME?
- MENUITEM "\83t\83H\83\93\83g(&F)...", 65535
- MENUITEM "\83c\81[\83\8b\83o\81[\82ð\83J\83X\83^\83}\83C\83Y(&B)...", 65535
- MENUITEM SEPARATOR
- MENUITEM "\83c\81[\83\8b\83o\81[(&T)", ID_VIEW_TOOL_BAR, CHECKED
- MENUITEM "\83h\83\89\83C\83u\83o\81[(&D)", ID_VIEW_DRIVE_BAR, CHECKED
- MENUITEM "\83X\83e\81[\83^\83X\83o\81[(&S)", ID_VIEW_STATUSBAR, CHECKED
- MENUITEM "\91S\89æ\96Ê\95\\\8e¦(&U)\tCtrl+Shift+S", ID_VIEW_FULLSCREEN
- MENUITEM SEPARATOR
- MENUITEM "\83A\83v\83\8a\83P\81[\83V\83\87\83\93\8bN\93®\8cã\82É\83G\83N\83X\83v\83\8d\81[\83\89\82ð\8dÅ\8f¬\89»(&S)", 65535 //FIXME?
- MENUITEM "\8fI\97¹\8e\9e\82Ì\90Ý\92è\82ð\95Û\91¶(&E)", 511 //FIXME?
- END
- POPUP "\83Z\83L\83\85\83\8a\83e\83B(&S)"
- BEGIN
- MENUITEM "\83A\83N\83Z\83X(&A)...", 605
- MENUITEM "\83\8d\83O(&L)...", 606 //FIXME?
- MENUITEM "\8f\8a\97L\8eÒ(&O)...", 607 //FIXME?
- END
- POPUP "\83E\83B\83\93\83h\83E(&W)"
- BEGIN
- MENUITEM "\90V\82µ\82¢\83E\83B\83\93\83h\83E(&W)", ID_WINDOW_NEW
- MENUITEM "\83J\83X\83P\81[\83h\tCtrl+F5", ID_WINDOW_CASCADE
- MENUITEM "\90\85\95½\82É\90®\97ñ(&H)", ID_WINDOW_TILE_HORZ
- MENUITEM "\90\82\92¼\82É\95À\97ñ(&V)\tCtrl+F4", ID_WINDOW_TILE_VERT
- MENUITEM "\8e©\93®\90®\97ñ", ID_WINDOW_AUTOSORT
- MENUITEM "\8dÅ\8f¬\89»\82³\82ê\82½\8eq\83E\83B\83\93\83h\83E\82ð\90®\97ñ(&S)", ID_WINDOW_ARRANGE
- MENUITEM "\8dÅ\90V\82Ì\8fî\95ñ\82É\8dX\90V(&R)\tF5", ID_REFRESH
- END
- POPUP "&?"
- BEGIN
- MENUITEM "\83w\83\8b\83v\83g\83s\83b\83N(&H)\tF1", ID_HELP
- MENUITEM "\83w\83\8b\83v\82Ì\8c\9f\8dõ(&S)...\tF1", ID_HELP
- MENUITEM "\83w\83\8b\83v\82Ì\8eg\82¢\95û(&U)\tF1", ID_HELP_USING //FIXME?
- MENUITEM SEPARATOR
- MENUITEM "&Winefile\82É\8aÖ\82·\82é\8fî\95ñ...", ID_ABOUT_WINEFILE
- END
-END
-
IDM_DESKTOPBAR MENU DISCARDABLE
BEGIN
POPUP ""
# End Source File
# Begin Source File
-SOURCE=.\shell\filechild.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\shell\filechild.h
-# End Source File
-# Begin Source File
-
SOURCE=.\shell\mainframe.cpp
# End Source File
# Begin Source File
# End Source File
# Begin Source File
-SOURCE=.\shell\pane.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=.\shell\pane.h
-# End Source File
-# Begin Source File
-
SOURCE=.\shell\shellbrowser.cpp
# End Source File
# Begin Source File
#define IDW_FIRST_CHILD 0xC000 /*0x200*/
-#define PM_GET_FILEWND_PTR (WM_APP+0x05)
-#define PM_GET_SHELLBROWSER_PTR (WM_APP+0x06)
-
#define PM_GET_CONTROLWINDOW (WM_APP+0x16)
#define PM_RESIZE_CHILDREN (WM_APP+0x17)
#define CLASSNAME_WINEFILETREE TEXT("WFS_Tree")
-#include "shell/mainframe.h"
-#include "shell/pane.h"
-#include "shell/filechild.h"
#include "shell/shellbrowser.h"
+#include "shell/mainframe.h"
#define ID_VIEW_ALL_ATTRIBUTES 402
#define ID_VIEW_SELECTED_ATTRIBUTES 403
#define ID_VIEW_STATUSBAR 503
-#define ID_VIEW_DRIVE_BAR 507
#define ID_VIEW_TOOL_BAR 508
#define IDC_ROS_EXPLORER 1000
#define IDC_WWW 1012
#define IDC_FILETREE 10001
#define ID_EXPLORER_FAQ 10002
#define ID_WINDOW_AUTOSORT 0x8003
-#define ID_VIEW_FULLSCREEN 0x8004
#define ID_PREFERED_SIZES 0x8005
-#define ID_DRIVE_DESKTOP 0x9000
-#define ID_DRIVE_FIRST 0x9006
#define ID_ABOUT_WINDOWS 40002
#define ID_ABOUT_EXPLORER 40003
#define ID_DESKTOPBAR_SETTINGS 40004
#define ID_EXPLORE 40011
#define ID_SWITCH_DESKTOP_1 40012
#define ID_WINDOW_NEW 0xE130
-#define ID_WINDOW_ARRANGE 0xE131
-#define ID_WINDOW_CASCADE 0xE132
-#define ID_WINDOW_TILE_HORZ 0xE133
-#define ID_WINDOW_TILE_VERT 0xE134
-#define ID_WINDOW_SPLIT 0xE135
#define ID_EDIT_PROPERTIES 57656
#define ID_FILE_EXIT 0xE141
#define ID_HELP_USING 0xE144
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 162
+#define _APS_NEXT_RESOURCE_VALUE 165
#define _APS_NEXT_COMMAND_VALUE 40015
#define _APS_NEXT_CONTROL_VALUE 1003
#define _APS_NEXT_SYMED_VALUE 101
POPUP "&Fereastrã"
BEGIN
MENUITEM "&Fereastrã Nouã", ID_WINDOW_NEW
- MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE
- MENUITEM "Aliniazã &Orizontal", ID_WINDOW_TILE_HORZ
- MENUITEM "Aliniazã &Vertical\tShift+F4", ID_WINDOW_TILE_VERT
- MENUITEM "Aranjeazã automat", ID_WINDOW_AUTOSORT
- MENUITEM "Aranjeazã &Simbolurile", ID_WINDOW_ARRANGE
MENUITEM "&Resetare\tF5", ID_REFRESH
END
POPUP "&Ajutor"
IDA_EXPLORER ACCELERATORS DISCARDABLE
BEGIN
"X", ID_FILE_EXIT, VIRTKEY, ALT, NOINVERT
- "S", ID_VIEW_FULLSCREEN, VIRTKEY, SHIFT, CONTROL,
- NOINVERT
END
IDA_SEARCH_PROGRAM ACCELERATORS DISCARDABLE
POPUP "&Fenster"
BEGIN
MENUITEM "Neues &Fenster", ID_WINDOW_NEW
- MENUITEM "Über&lappend\tUmschalt+F5", ID_WINDOW_CASCADE
- MENUITEM "&Untereinander", ID_WINDOW_TILE_HORZ
- MENUITEM "&Nebeneinander\tUmschalt+F4", ID_WINDOW_TILE_VERT
- MENUITEM "au&tomatisch anordnen", ID_WINDOW_AUTOSORT
- MENUITEM "&Symbole anordnen", ID_WINDOW_ARRANGE
MENUITEM "&Aktualisieren\tF5", ID_REFRESH
END
POPUP "&Help"
POPUP "&Window"
BEGIN
MENUITEM "New &Window", ID_WINDOW_NEW
- MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE
- MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ
- MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT
- MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT
- MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE
MENUITEM "&Refresh\tF5", ID_REFRESH
END
POPUP "&Help"
POPUP "&Window"
BEGIN
MENUITEM "New &Window", ID_WINDOW_NEW
- MENUITEM "Cascading\tShift+F5", ID_WINDOW_CASCADE
- MENUITEM "Tile &Horizontally", ID_WINDOW_TILE_HORZ
- MENUITEM "Tile &Vertically\tShift+F4", ID_WINDOW_TILE_VERT
- MENUITEM "Arrange Automatically", ID_WINDOW_AUTOSORT
- MENUITEM "Arrange &Symbols", ID_WINDOW_ARRANGE
MENUITEM "&Refresh\tF5", ID_REFRESH
END
POPUP "A&ide"
+++ /dev/null
-/*
- * Copyright 2003 Martin Fuchs
- *
- * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-
- //
- // Explorer clone
- //
- // filechild.cpp
- //
- // Martin Fuchs, 23.07.2003
- //
-
-
-#include "../utility/utility.h"
-
-#include "../explorer.h"
-#include "../globals.h"
-
-#include "../explorer_intres.h"
-
-
-FileChildWndInfo::FileChildWndInfo(HWND hmdiclient, LPCTSTR path, ENTRY_TYPE etype)
- : super(hmdiclient),
- _etype(etype)
-{
- if (etype == ET_UNKNOWN)
- _etype = ET_WINDOWS;
-
- _path = path;
-
- _pos.length = sizeof(WINDOWPLACEMENT);
- _pos.flags = 0;
- _pos.showCmd = SW_SHOWNORMAL;
- _pos.rcNormalPosition.left = CW_USEDEFAULT;
- _pos.rcNormalPosition.top = CW_USEDEFAULT;
- _pos.rcNormalPosition.right = CW_USEDEFAULT;
- _pos.rcNormalPosition.bottom = CW_USEDEFAULT;
-
- _open_mode = OWM_EXPLORE|OWM_DETAILS;
-}
-
-
-ShellChildWndInfo::ShellChildWndInfo(HWND hmdiclient, LPCTSTR path, const ShellPath& root_shell_path)
- : FileChildWndInfo(hmdiclient, path, ET_SHELL),
- _shell_path(path&&*path? path: root_shell_path),
- _root_shell_path(root_shell_path)
-{
-}
-
-
-FileChildWindow::FileChildWindow(HWND hwnd, const FileChildWndInfo& info)
- : ChildWindow(hwnd, info)
-{
- CONTEXT("FileChildWindow::FileChildWindow()");
-
- TCHAR drv[_MAX_DRIVE+1];
- Entry* entry;
-
- //assert(info._etype==ET_WINDOWS);
- _root._drive_type = GetDriveType(info._path);
-
- _tsplitpath(info._path, drv, NULL, NULL, NULL);
- lstrcat(drv, TEXT("\\"));
- GetVolumeInformation(drv, _root._volname, _MAX_FNAME, 0, 0, &_root._fs_flags, _root._fs, _MAX_DIR);
- lstrcpy(_root._path, drv);
- _root._entry = new WinDirectory(_root._path);
- entry = _root._entry->read_tree(info._path, SORT_NAME);
-
- if (info._etype != ET_SHELL)
- wsprintf(_root._entry->_data.cFileName, TEXT("%s - %s"), drv, _root._fs);
-/*@@else
- lstrcpy(_root._entry->_data.cFileName, TEXT("GetDesktopFolder"));*/
-
- _root._entry->_data.dwFileAttributes = FILE_ATTRIBUTE_DIRECTORY;
-
-
- if (info._open_mode & OWM_EXPLORE) ///@todo Is not-explore-mode for FileChildWindow completely implemented?
- _left_hwnd = *(_left=new Pane(_hwnd, IDW_TREE_LEFT, IDW_HEADER_LEFT, _root._entry, true, COL_CONTENT));
-
- _right_hwnd = *(_right=new Pane(_hwnd, IDW_TREE_RIGHT, IDW_HEADER_RIGHT, NULL, false,
- COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_INDEX|COL_LINKS|COL_CONTENT));
-
- _sortOrder = SORT_NAME;
- _header_wdths_ok = false;
-
- set_curdir(entry, hwnd);
-
- if (_left_hwnd) {
- int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), _left->_cur);
- ListBox_SetCurSel(_left_hwnd, idx);
- }
-
- ///@todo scroll to visibility
-
-}
-
-FileChildWindow::~FileChildWindow()
-{
-}
-
-
-void FileChildWindow::set_curdir(Entry* entry, HWND hwnd)
-{
- CONTEXT("FileChildWindow::set_curdir()");
-
- _path[0] = TEXT('\0');
-
- _left->_cur = entry;
- _right->_root = entry&&entry->_down? entry->_down: entry;
- _right->_cur = entry;
-
- if (entry) {
- if (!entry->_scanned)
- scan_entry(entry, hwnd);
- else {
- ListBox_ResetContent(_right_hwnd);
- _right->insert_entries(entry->_down, -1);
- _right->calc_widths(false);
- _right->set_header();
- }
-
- entry->get_path(_path);
- }
-
- if (hwnd) // only change window title, if the window already exists
- SetWindowText(hwnd, _path);
-
- if (_path[0])
- if (!SetCurrentDirectory(_path))
- _path[0] = TEXT('\0');
-}
-
-
- // expand a directory entry
-
-bool FileChildWindow::expand_entry(Entry* dir)
-{
- int idx;
- Entry* p;
-
- if (!dir || dir->_expanded || !dir->_down)
- return false;
-
- p = dir->_down;
-
- if (p->_data.cFileName[0]=='.' && p->_data.cFileName[1]=='\0' && p->_next) {
- p = p->_next;
-
- if (p->_data.cFileName[0]=='.' && p->_data.cFileName[1]=='.' &&
- p->_data.cFileName[2]=='\0' && p->_next)
- p = p->_next;
- }
-
- // no subdirectories ?
- if (!(p->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && // not a directory?
- !p->_down) // not a file with NTFS sub-streams?
- return FALSE;
-
- idx = ListBox_FindItemData(_left_hwnd, 0, dir);
-
- dir->_expanded = true;
-
- // insert entries in left pane
- _left->insert_entries(p, idx);
-
- if (!_header_wdths_ok) {
- if (_left->calc_widths(false)) {
- _left->set_header();
-
- _header_wdths_ok = true;
- }
- }
-
- return true;
-}
-
-
-void FileChildWindow::collapse_entry(Pane* pane, Entry* dir)
-{
- int idx = ListBox_FindItemData(*pane, 0, dir);
-
- SendMessage(*pane, WM_SETREDRAW, FALSE, 0); //ShowWindow(*pane, SW_HIDE);
-
- // hide sub entries
- for(;;) {
- LRESULT res = ListBox_GetItemData(*pane, idx+1);
- Entry* sub = (Entry*) res;
-
- if (res==LB_ERR || !sub || sub->_level<=dir->_level)
- break;
-
- ListBox_DeleteString(*pane, idx+1);
- }
-
- dir->_expanded = false;
-
- SendMessage(*pane, WM_SETREDRAW, TRUE, 0); //ShowWindow(*pane, SW_SHOW);
-}
-
-
-FileChildWindow* FileChildWindow::create(const FileChildWndInfo& info)
-{
- CONTEXT("FileChildWindow::create()");
-
- MDICREATESTRUCT mcs;
-
- mcs.szClass = CLASSNAME_WINEFILETREE;
- mcs.szTitle = (LPTSTR)info._path;
- mcs.hOwner = g_Globals._hInstance;
- mcs.x = info._pos.rcNormalPosition.left;
- mcs.y = info._pos.rcNormalPosition.top;
- mcs.cx = info._pos.rcNormalPosition.right - info._pos.rcNormalPosition.left;
- mcs.cy = info._pos.rcNormalPosition.bottom - info._pos.rcNormalPosition.top;
- mcs.style = 0;
- mcs.lParam = 0;
-
- FileChildWindow* child = static_cast<FileChildWindow*>(
- create_mdi_child(info, mcs, WINDOW_CREATOR_INFO(FileChildWindow,FileChildWndInfo)));
-
- return child;
-}
-
-
-void FileChildWindow::resize_children(int cx, int cy)
-{
- HDWP hdwp = BeginDeferWindowPos(4);
- RECT rt;
-
- rt.left = 0;
- rt.top = 0;
- rt.right = cx;
- rt.bottom = cy;
-
- cx = _split_pos + SPLIT_WIDTH/2;
-
- {
- WINDOWPOS wp;
- HD_LAYOUT hdl;
-
- hdl.prc = &rt;
- hdl.pwpos = ℘
-
- Header_Layout(_left->_hwndHeader, &hdl);
-
- hdwp = DeferWindowPos(hdwp, _left->_hwndHeader, wp.hwndInsertAfter,
- wp.x-1, wp.y, _split_pos-SPLIT_WIDTH/2+1, wp.cy, wp.flags);
-
- hdwp = DeferWindowPos(hdwp, _right->_hwndHeader, wp.hwndInsertAfter,
- rt.left+cx+1, wp.y, wp.cx-cx+2, wp.cy, wp.flags);
- }
-
- if (_left_hwnd)
- hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, rt.left, rt.top, _split_pos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
-
- hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
-
- EndDeferWindowPos(hdwp);
-}
-
-
-LRESULT FileChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
-{
- switch(nmsg) {
- case WM_DRAWITEM: {
- LPDRAWITEMSTRUCT dis = (LPDRAWITEMSTRUCT)lparam;
- Entry* entry = (Entry*) dis->itemData;
-
- if (dis->CtlID == IDW_TREE_LEFT)
- _left->draw_item(dis, entry);
- else
- _right->draw_item(dis, entry);
-
- return TRUE;}
-
- case WM_SIZE:
- if (wparam != SIZE_MINIMIZED)
- resize_children(LOWORD(lparam), HIWORD(lparam));
- return DefMDIChildProc(_hwnd, nmsg, wparam, lparam);
-
- case PM_GET_FILEWND_PTR:
- return (LRESULT)this;
-
- case WM_SETFOCUS: {
- TCHAR path[MAX_PATH];
-
- if (_left->_cur) {
- _left->_cur->get_path(path);
- SetCurrentDirectory(path);
- }
-
- SetFocus(_focus_pane? _right_hwnd: _left_hwnd);
- goto def;}
-
- case PM_DISPATCH_COMMAND: {
- Pane* pane = GetFocus()==_left_hwnd? _left: _right;
-
- switch(LOWORD(wparam)) {
- case ID_WINDOW_NEW: {CONTEXT("FileChildWindow PM_DISPATCH_COMMAND ID_WINDOW_NEW");
- if (_root._entry->_etype == ET_SHELL)
- FileChildWindow::create(ShellChildWndInfo(GetParent(_hwnd)/*_hmdiclient*/, _path, DesktopFolderPath()));
- else
- FileChildWindow::create(FileChildWndInfo(GetParent(_hwnd)/*_hmdiclient*/, _path));
- break;}
-
- case ID_REFRESH: {CONTEXT("ID_REFRESH");
- bool expanded = _left->_cur->_expanded;
-
- scan_entry(_left->_cur, _hwnd);
-
- if (expanded)
- expand_entry(_left->_cur);
- break;}
-
- case ID_ACTIVATE: {CONTEXT("ID_ACTIVATE");
- activate_entry(pane, _hwnd);
- break;}
-
- default:
- return pane->command(LOWORD(wparam));
- }
-
- return TRUE;}
-
- case WM_CONTEXTMENU: {
- // first select the current item in the listbox
- HWND hpanel = (HWND) wparam;
- POINTS& pos = MAKEPOINTS(lparam);
- POINT pt; POINTSTOPOINT(pt, pos);
- ScreenToClient(hpanel, &pt);
- SendMessage(hpanel, WM_LBUTTONDOWN, 0, MAKELONG(pt.x, pt.y));
- SendMessage(hpanel, WM_LBUTTONUP, 0, MAKELONG(pt.x, pt.y));
-
- // now create the popup menu using shell namespace and IContextMenu
- Pane* pane = GetFocus()==_left_hwnd? _left: _right;
- int idx = ListBox_GetCurSel(*pane);
- if (idx != -1) {
- Entry* entry = (Entry*) ListBox_GetItemData(*pane, idx);
-
- ShellPath shell_path = entry->create_absolute_pidl();
- LPCITEMIDLIST pidl_abs = shell_path;
-
- IShellFolder* parentFolder;
- LPCITEMIDLIST pidlLast;
-
- static DynamicFct<HRESULT(WINAPI*)(LPCITEMIDLIST, REFIID, LPVOID*, LPCITEMIDLIST*)> SHBindToParent(TEXT("SHELL32"), "SHBindToParent");
-
- if (SHBindToParent) {
- // get and use the parent folder to display correct context menu in all cases -> correct "Properties" dialog for directories, ...
- if (SUCCEEDED((*SHBindToParent)(pidl_abs, IID_IShellFolder, (LPVOID*)&parentFolder, &pidlLast))) {
- HRESULT hr = ShellFolderContextMenu(parentFolder, _hwnd, 1, &pidlLast, pos.x, pos.y);
-
- parentFolder->Release();
-
- CHECKERROR(hr);
- }
- } else {
- CHECKERROR(ShellFolderContextMenu(GetDesktopFolder(), _hwnd, 1, &pidl_abs, pos.x, pos.y));
- }
- }
- break;}
-
- default: def:
- return super::WndProc(nmsg, wparam, lparam);
- }
-
- return 0;
-}
-
-
-int FileChildWindow::Command(int id, int code)
-{
- Pane* pane = GetFocus()==_left_hwnd? _left: _right;
-
- switch(code) {
- case LBN_SELCHANGE: {
- int idx = ListBox_GetCurSel(*pane);
- Entry* entry = (Entry*) ListBox_GetItemData(*pane, idx);
-
- if (pane == _left)
- set_curdir(entry, _hwnd);
- else
- pane->_cur = entry;
- break;}
-
- case LBN_DBLCLK:
- activate_entry(pane, _hwnd);
- break;
- }
-
- return 0;
-}
-
-
-void FileChildWindow::activate_entry(Pane* pane, HWND hwnd)
-{
- Entry* entry = pane->_cur;
-
- if (!entry)
- return;
-
- if ((entry->_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || // a directory?
- entry->_down) // a file with NTFS sub-streams?
- {
- int scanned_old = entry->_scanned;
-
- if (!scanned_old)
- scan_entry(entry, hwnd);
-
- if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('\0'))
- return;
-
- if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('.') && entry->_data.cFileName[2]==TEXT('\0')) {
- entry = _left->_cur->_up;
- collapse_entry(_left, entry);
- goto focus_entry;
- } else if (entry->_expanded)
- collapse_entry(pane, _left->_cur);
- else {
- expand_entry(_left->_cur);
-
- if (!pane->_treePane) focus_entry: {
- int idx = ListBox_FindItemData(_left_hwnd, ListBox_GetCurSel(_left_hwnd), entry);
- ListBox_SetCurSel(_left_hwnd, idx);
- set_curdir(entry, _hwnd);
- }
- }
-
- if (!scanned_old) {
- pane->calc_widths(FALSE);
-
- pane->set_header();
- }
- } else {
- entry->launch_entry(_hwnd);
- }
-}
-
-
-void FileChildWindow::scan_entry(Entry* entry, HWND hwnd)
-{
- CONTEXT("FileChildWindow::scan_entry()");
-
- int idx = ListBox_GetCurSel(_left_hwnd);
- HCURSOR old_cursor = SetCursor(LoadCursor(0, IDC_WAIT));
-
- // delete sub entries in left pane
- for(;;) {
- LRESULT res = ListBox_GetItemData(_left_hwnd, idx+1);
- Entry* sub = (Entry*) res;
-
- if (res==LB_ERR || !sub || sub->_level<=entry->_level)
- break;
-
- ListBox_DeleteString(_left_hwnd, idx+1);
- }
-
- // empty right pane
- ListBox_ResetContent(_right_hwnd);
-
- // release memory
- entry->free_subentries();
- entry->_expanded = false;
-
- // read contents from disk
- entry->read_directory(_sortOrder);
-
- // insert found entries in right pane
- _right->insert_entries(entry->_down, -1);
-
- _right->calc_widths(false);
- _right->set_header();
-
- _header_wdths_ok = FALSE;
-
- SetCursor(old_cursor);
-}
-
-
-int FileChildWindow::Notify(int id, NMHDR* pnmh)
-{
- return (pnmh->idFrom==IDW_HEADER_LEFT? _left: _right)->Notify(id, pnmh);
-}
-
-
-BOOL CALLBACK ExecuteDialog::WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam)
-{
- static struct ExecuteDialog* dlg;
-
- switch(nmsg) {
- case WM_INITDIALOG:
- dlg = (struct ExecuteDialog*) lparam;
- return 1;
-
- case WM_COMMAND: {
- int id = (int)wparam;
-
- if (id == IDOK) {
- GetWindowText(GetDlgItem(hwnd, 201), dlg->cmd, MAX_PATH);
- dlg->cmdshow = Button_GetState(GetDlgItem(hwnd,214))&BST_CHECKED?
- SW_SHOWMINIMIZED: SW_SHOWNORMAL;
- EndDialog(hwnd, id);
- } else if (id == IDCANCEL)
- EndDialog(hwnd, id);
-
- return 1;}
- }
-
- return 0;
-}
+++ /dev/null
-/*
- * Copyright 2003 Martin Fuchs
- *
- * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-
- //
- // Explorer clone
- //
- // filechild.h
- //
- // Martin Fuchs, 23.07.2003
- //
-
-
- /// information structure for creation of FileChildWindow
-struct FileChildWndInfo : public ChildWndInfo
-{
- typedef ChildWndInfo super;
-
- FileChildWndInfo(HWND hmdiclient, LPCTSTR path, ENTRY_TYPE etype=ET_UNKNOWN);
-
- ENTRY_TYPE _etype;
- LPCTSTR _path;
-
- WINDOWPLACEMENT _pos;
- int _open_mode; //OPEN_WINDOW_MODE
-};
-
- /// information structure for creation of ShellBrowserChild
-struct ShellChildWndInfo : public FileChildWndInfo
-{
- typedef FileChildWndInfo super;
-
- ShellChildWndInfo(HWND hmdiclient, LPCTSTR path, const ShellPath& root_shell_path);
-
- ShellPath _shell_path;
- ShellPath _root_shell_path;
-};
-
- /// information structure for creation of FileChildWindow for NT object namespace
-struct NtObjChildWndInfo : public FileChildWndInfo
-{
- typedef FileChildWndInfo super;
-
- NtObjChildWndInfo(HWND hmdiclient, LPCTSTR path);
-};
-
- /// information structure for creation of FileChildWindow for the Registry
-struct RegistryChildWndInfo : public FileChildWndInfo
-{
- typedef FileChildWndInfo super;
-
- RegistryChildWndInfo(HWND hmdiclient, LPCTSTR path);
-};
-
- /// information structure for creation of FileChildWindow
-struct FATChildWndInfo : public FileChildWndInfo
-{
- typedef FileChildWndInfo super;
-
- FATChildWndInfo(HWND hmdiclient, LPCTSTR path);
-};
-
- /// information structure for creation of WebChildWindow
-struct WebChildWndInfo : public FileChildWndInfo
-{
- typedef FileChildWndInfo super;
-
- WebChildWndInfo(HWND hmdiclient, LPCTSTR url);
-};
-
-
- /// MDI child window displaying file lists
-struct FileChildWindow : public ChildWindow
-{
- typedef ChildWindow super;
-
- FileChildWindow(HWND hwnd, const FileChildWndInfo& info);
- ~FileChildWindow();
-
- static FileChildWindow* create(const FileChildWndInfo& info);
-
-protected:
- LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
- int Command(int id, int code);
- int Notify(int id, NMHDR* pnmh);
-
- virtual void resize_children(int cx, int cy);
-
- void scan_entry(Entry* entry, HWND hwnd);
-
- bool expand_entry(Entry* dir);
- static void collapse_entry(Pane* pane, Entry* dir);
-
- void set_curdir(Entry* entry, HWND hwnd);
- void activate_entry(Pane* pane, HWND hwnd);
-
-protected:
- Root _root;
- Pane* _left;
- Pane* _right;
- SORT_ORDER _sortOrder;
- TCHAR _path[MAX_PATH];
- bool _header_wdths_ok;
-
-public:
- const Root& get_root() const {return _root;}
-
- void set_focus_pane(Pane* pane)
- {_focus_pane = pane==_right? 1: 0;}
-
- void switch_focus_pane()
- {SetFocus(_focus_pane? *_left: *_right);}
-};
-
-
- /// The "Execute..."-dialog lets the user enter a command line to launch.
-struct ExecuteDialog { ///@todo use class Dialog
- TCHAR cmd[MAX_PATH];
- int cmdshow;
-
- static BOOL CALLBACK WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
-};
_hAccel = LoadAccelerators(g_Globals._hInstance, MAKEINTRESOURCE(IDA_EXPLORER));
-
CLIENTCREATESTRUCT ccs;
ccs.hWindowMenu = _hMenuWindow;
ccs.idFirstChild = IDW_FIRST_CHILD;
-#ifndef _NO_MDI
- _hmdiclient = CreateWindowEx(0, TEXT("MDICLIENT"), NULL,
- WS_CHILD|WS_CLIPCHILDREN|WS_VSCROLL|WS_HSCROLL|WS_VISIBLE|WS_BORDER,
- 0, 0, 0, 0,
- hwnd, 0, g_Globals._hInstance, &ccs);
-#endif
-
TBBUTTON toolbarBtns[] = {
{0, 0, 0, BTNS_SEP, {0, 0}, 0, 0},
{0, ID_WINDOW_NEW, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
- {1, ID_WINDOW_CASCADE, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
- {2, ID_WINDOW_TILE_HORZ, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
- {3, ID_WINDOW_TILE_VERT, TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
/*TODO
{4, ID_... , TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
{5, ID_... , TBSTATE_ENABLED, BTNS_BUTTON, {0, 0}, 0, 0},
CheckMenuItem(_menu_info._hMenuOptions, ID_VIEW_TOOL_BAR, MF_BYCOMMAND|MF_CHECKED);
- TBBUTTON drivebarBtn = {0, 0, TBSTATE_ENABLED, BTNS_SEP, {0, 0}, 0, 0};
- int btn = 1;
- PTSTR p;
-
- _hdrivebar = CreateToolbarEx(hwnd, WS_CHILD|WS_VISIBLE|CCS_NOMOVEY|TBSTYLE_LIST,
- IDW_DRIVEBAR, 2, g_Globals._hInstance, IDB_DRIVEBAR, &drivebarBtn,
- 1, 16, 13, 16, 13, sizeof(TBBUTTON));
- CheckMenuItem(_menu_info._hMenuOptions, ID_VIEW_DRIVE_BAR, MF_BYCOMMAND|MF_CHECKED);
-
-
- GetLogicalDriveStrings(BUFFER_LEN, _drives);
-
- drivebarBtn.fsStyle = BTNS_BUTTON;
-
- // insert explorer window button
- SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)TEXT("Explore\0"));
-
- drivebarBtn.idCommand = ID_DRIVE_DESKTOP;
- SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn);
- ++drivebarBtn.iString;
+ _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR);
+ CheckMenuItem(_menu_info._hMenuOptions, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED);
- // register windows drive root strings
- SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)_drives);
+ update_explorer_view();
+}
- drivebarBtn.idCommand = ID_DRIVE_FIRST;
+void MainFrame::update_explorer_view()
+{
+ int split_pos = DEFAULT_SPLIT_POS; //@@
- for(p=_drives; *p; ) {
- // insert drive letter
- TCHAR b[3] = {tolower(*p)};
- SendMessage(_hdrivebar, TB_ADDSTRING, 0, (LPARAM)b);
+ if (_shellBrowser.get()) {
+ split_pos = _shellBrowser->_split_pos;
+ delete _shellBrowser.release();
+ }
- switch(GetDriveType(p)) {
- case DRIVE_REMOVABLE: drivebarBtn.iBitmap = 1; break;
- case DRIVE_CDROM: drivebarBtn.iBitmap = 3; break;
- case DRIVE_REMOTE: drivebarBtn.iBitmap = 4; break;
- case DRIVE_RAMDISK: drivebarBtn.iBitmap = 5; break;
- default:/*DRIVE_FIXED*/ drivebarBtn.iBitmap = 2;
+ // create explorer treeview
+ if (_create_info._open_mode & OWM_EXPLORE) {
+ if (!_left_hwnd) {
+ WindowCanvas canvas(_hwnd);
+ RECT rect = {0, 0, 0, 0};
+ DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT);
+
+ _left_hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, NULL,
+ WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_NOTOOLTIPS|TVS_SHOWSELALWAYS,
+ 0, rect.top, split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top,
+ _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0);
+ }
+ } else {
+ if (_left_hwnd) {
+ DestroyWindow(_left_hwnd);
+ _left_hwnd = 0;
}
-
- SendMessage(_hdrivebar, TB_INSERTBUTTON, btn++, (LPARAM)&drivebarBtn);
- ++drivebarBtn.idCommand;
- ++drivebarBtn.iString;
-
- while(*p++);
}
+ _shellBrowser = auto_ptr<ShellBrowserChild>(new ShellBrowserChild(_hwnd, _left_hwnd, _right_hwnd, _create_info));
- // address & command bar
- WindowCanvas canvas(hwnd);
- RECT rect = {0, 0, 0, 0};
- DrawText(canvas, TEXT("My"), -1, &rect, DT_SINGLELINE|DT_NOPREFIX|DT_CALCRECT);
-
- /* CreateStatusWindow does not accept WS_BORDER
- _hstatusbar = CreateWindowEx(WS_EX_NOPARENTNOTIFY, STATUSCLASSNAME, 0,
- WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_BORDER|CCS_NODIVIDER, 0,0,0,0,
- hwnd, (HMENU)IDW_STATUSBAR, g_Globals._hInstance, 0);*/
-
- _hstatusbar = CreateStatusWindow(WS_CHILD|WS_VISIBLE, 0, hwnd, IDW_STATUSBAR);
- CheckMenuItem(_menu_info._hMenuOptions, ID_VIEW_STATUSBAR, MF_BYCOMMAND|MF_CHECKED);
+ // update _shellBrowser->_clnt_rect
+ ClientRect rect(_hwnd);
+ resize_frame(rect.right, rect.bottom);
}
MainFrame* pMainFrame = GET_WINDOW(MainFrame, hMainFrame);
if (pMainFrame)
- pMainFrame->CreateChild(path, mode);
+ pMainFrame->jump_to(path, mode);
return hMainFrame;
}
MainFrame* pMainFrame = GET_WINDOW(MainFrame, hMainFrame);
if (pMainFrame)
- pMainFrame->CreateChild(pidl, mode);
+ pMainFrame->jump_to(pidl, mode);
return hMainFrame;
}
-ChildWindow* MainFrame::CreateChild(LPCTSTR path, int mode)
+void MainFrame::jump_to(LPCTSTR path, int mode)
{
- return reinterpret_cast<ChildWindow*>(SendMessage(_hwnd, PM_OPEN_WINDOW, mode, (LPARAM)path));
+ _create_info._open_mode = mode;
+ _create_info._shell_path = path;
+ _create_info._root_shell_path = SpecialFolderPath(CSIDL_DRIVES, _hwnd); //@@
+
+ update_explorer_view();
}
-ChildWindow* MainFrame::CreateChild(LPCITEMIDLIST pidl, int mode)
+void MainFrame::jump_to(LPCITEMIDLIST path, int mode)
{
- return reinterpret_cast<ChildWindow*>(SendMessage(_hwnd, PM_OPEN_WINDOW, mode|OWM_PIDL, (LPARAM)pidl));
+ _create_info._open_mode = mode;
+ _create_info._shell_path = path;
+ _create_info._root_shell_path = DesktopFolderPath(); //@@
+
+ update_explorer_view();
}
} catch(COMException& e) {
HandleException(e, g_Globals._hMainWnd);
}
- }/*TEST
- else { // !(attribs & SFGAO_FOLDER))
- SHELLEXECUTEINFOA shexinfo;
-
- shexinfo.cbSize = sizeof(SHELLEXECUTEINFOA);
- shexinfo.fMask = SEE_MASK_INVOKEIDLIST;
- shexinfo.hwnd = NULL;
- shexinfo.lpVerb = NULL;
- shexinfo.lpFile = NULL;
- shexinfo.lpParameters = NULL;
- shexinfo.lpDirectory = NULL;
- shexinfo.nShow = SW_NORMAL;
- shexinfo.lpIDList = ILCombine(parent_pidl, pidl);
-
- if (ShellExecuteExA(&shexinfo))
- ++cnt;
-
- ILFree((LPITEMIDLIST)shexinfo.lpIDList);
- }*/
+ }
}
return cnt;
case PM_TRANSLATE_MSG: {
MSG* pmsg = (MSG*) lparam;
-#ifndef _NO_MDI
- if (_hmdiclient && TranslateMDISysAccel(_hmdiclient, pmsg))
- return TRUE;
-#endif
-
if (TranslateAccelerator(_hwnd, _hAccel, pmsg))
return TRUE;
case WM_SIZE:
resize_frame(LOWORD(lparam), HIWORD(lparam));
- break; // do not pass message to DefFrameProc
+ break;
case WM_GETMINMAXINFO: {
LPMINMAXINFO lpmmi = (LPMINMAXINFO)lparam;
path = buffer;
}
- {
- OBJ_CONTEXT("create ShellChildWndInfo", path);
-
- // Shell Namespace as default view
- ShellChildWndInfo create_info(_hmdiclient, path, shell_path);
-
- create_info._pos.showCmd = SW_SHOWMAXIMIZED;
- create_info._pos.rcNormalPosition.left = 0;
- create_info._pos.rcNormalPosition.top = 0;
- create_info._pos.rcNormalPosition.right = 600;
- create_info._pos.rcNormalPosition.bottom = 280;
-
- create_info._open_mode = (OPEN_WINDOW_MODE)wparam;
-
- // FileChildWindow::create(_hmdiclient, create_info);
- return (LRESULT)ShellBrowserChild::create(create_info);
- }
+ jump_to(shell_path, (OPEN_WINDOW_MODE)wparam);
break;}
case PM_GET_CONTROLWINDOW:
return (LRESULT)(HWND)_hstatusbar;
break;
- case PM_SETSTATUSTEXT:
- SendMessage(_hstatusbar, SB_SETTEXT, 0, lparam);
- break;
default:
-#ifndef _NO_MDI
- return DefFrameProc(_hwnd, _hmdiclient, nmsg, wparam, lparam);
-#else
- return super::WNdProc(nmsg, wparam, lparam);
-#endif
+ if (_shellBrowser.get())
+ return _shellBrowser->WndProc(nmsg, wparam, lparam);
+ else
+ return super::WndProc(nmsg, wparam, lparam);
}
return 0;
}
-int MainFrame::Command(int id, int code)
+int MainFrame::Notify(int id, NMHDR* pnmh)
{
- CONTEXT("MainFrame::Command()");
-
-#ifndef _NO_MDI
- HWND hwndClient = (HWND) SendMessage(_hmdiclient, WM_MDIGETACTIVE, 0, 0);
-
- if (SendMessage(hwndClient, PM_DISPATCH_COMMAND, MAKELONG(id,code), 0))
- return 0;
-#endif
+ if (_shellBrowser.get())
+ return _shellBrowser->Notify(id, pnmh);
- if (id>=ID_DRIVE_FIRST && id<=ID_DRIVE_FIRST+0xFF) {
- TCHAR drv[_MAX_DRIVE], path[MAX_PATH];
- LPCTSTR root = _drives;
-
- for(int i=id-ID_DRIVE_FIRST; i--; root++)
- while(*root)
- ++root;
-
- if (activate_drive_window(root))
- return 0;
-
- _tsplitpath(root, drv, 0, 0, 0);
-
- if (!SetCurrentDirectory(drv)) {
- display_error(_hwnd, GetLastError());
- return 0;
- }
+ return super::Notify(id, pnmh);
+}
- GetCurrentDirectory(MAX_PATH, path); ///@todo store last directory per drive
-#ifndef _NO_MDI
- FileChildWindow::create(FileChildWndInfo(_hmdiclient, path));
-#else
- ///@todo SDI implementation
-#endif
- return 1;
- }
+int MainFrame::Command(int id, int code)
+{
+ CONTEXT("MainFrame::Command()");
switch(id) {
case ID_FILE_EXIT:
GetCurrentDirectory(MAX_PATH, path);
-#ifndef _NO_MDI
- FileChildWindow::create(FileChildWndInfo(_hmdiclient, path));
-#else
- ///@todo SDI implementation
-#endif
+ MainFrame::Create(path);
break;}
-#ifndef _NO_MDI
- case ID_WINDOW_CASCADE:
- SendMessage(_hmdiclient, WM_MDICASCADE, 0, 0);
- break;
-
- case ID_WINDOW_TILE_HORZ:
- SendMessage(_hmdiclient, WM_MDITILE, MDITILE_HORIZONTAL, 0);
- break;
-
- case ID_WINDOW_TILE_VERT:
- SendMessage(_hmdiclient, WM_MDITILE, MDITILE_VERTICAL, 0);
- break;
-
- case ID_WINDOW_ARRANGE:
- SendMessage(_hmdiclient, WM_MDIICONARRANGE, 0, 0);
- break;
-#endif
-
case ID_VIEW_TOOL_BAR:
toggle_child(_hwnd, id, _htoolbar);
break;
- case ID_VIEW_DRIVE_BAR:
- toggle_child(_hwnd, id, _hdrivebar);
- break;
-
case ID_VIEW_STATUSBAR:
toggle_child(_hwnd, id, _hstatusbar);
break;
WinHelp(_hwnd, TEXT("explorer")/*file explorer.hlp*/, HELP_INDEX, 0);
break;
- case ID_VIEW_FULLSCREEN:
- CheckMenuItem(_menu_info._hMenuOptions, id, toggle_fullscreen()?MF_CHECKED:0);
- break;
-
- case ID_DRIVE_DESKTOP: {
- TCHAR path[MAX_PATH];
-
- if (activate_child_window(TEXT("Desktop")))
- break;
-
- GetCurrentDirectory(MAX_PATH, path);
-
- ShellBrowserChild::create(ShellChildWndInfo(_hmdiclient, path, DesktopFolderPath()));
- break;}
-
///@todo There are even more menu items!
case ID_ABOUT_WINDOWS:
break;
default:
-#ifndef _NO_MDI
- return DefFrameProc(_hwnd, _hmdiclient, WM_COMMAND, MAKELONG(id,code), 0);
-#else
return 1;
-#endif
}
return 0;
void MainFrame::resize_frame_rect(PRECT prect)
{
- int new_top;
-
if (IsWindowVisible(_htoolbar)) {
SendMessage(_htoolbar, WM_SIZE, 0, 0);
ClientRect rt(_htoolbar);
- prect->top = rt.bottom+3;
-// prect->bottom -= rt.bottom+3;
- }
-
- if (IsWindowVisible(_hdrivebar)) {
- SendMessage(_hdrivebar, WM_SIZE, 0, 0);
- ClientRect rt(_hdrivebar);
- new_top = --prect->top + rt.bottom+3;
- MoveWindow(_hdrivebar, 0, prect->top, rt.right, new_top, TRUE);
- prect->top = new_top;
+ prect->top = rt.bottom+2;
// prect->bottom -= rt.bottom+2;
}
ClientRect rt(_hstatusbar);
prect->bottom -= rt.bottom;
}
-
- if (IsWindowVisible(_haddressedit) || IsWindowVisible(_hcommandedit)) {
- ClientRect rt(_haddressedit);
- prect->bottom -= rt.bottom;
-
- int mid = (prect->right-prect->left) / 2; ///@todo use split bar
- SetWindowPos(_haddressedit, 0, 0, prect->bottom, mid, rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER);
- SetWindowPos(_hcommandedit, 0, mid+1, prect->bottom, prect->right-(mid+1), rt.bottom, SWP_NOACTIVATE|SWP_NOZORDER);
- }
-
-#ifndef _NO_MDI
- MoveWindow(_hmdiclient, prect->left-1,prect->top-1,prect->right-prect->left+2,prect->bottom-prect->top+1, TRUE);
-#endif
}
void MainFrame::resize_frame(int cx, int cy)
rect.bottom = cy;
resize_frame_rect(&rect);
+
+ if (_shellBrowser.get()) {
+ _shellBrowser->_clnt_rect = rect;
+ _shellBrowser->resize_children();
+ }
}
void MainFrame::resize_frame_client()
prect->top += rt.bottom+2;
}
- if (IsWindowVisible(_hdrivebar)) {
- ClientRect rt(_hdrivebar);
- prect->top += rt.bottom+2;
- }
-
if (IsWindowVisible(_hstatusbar)) {
ClientRect rt(_hstatusbar);
prect->bottom -= rt.bottom;
}
}
-BOOL MainFrame::toggle_fullscreen()
-{
- RECT rt;
-
- if ((_fullscreen._mode=!_fullscreen._mode)) {
- GetWindowRect(_hwnd, &_fullscreen._orgPos);
- _fullscreen._wasZoomed = IsZoomed(_hwnd);
-
- Frame_CalcFrameClient(_hwnd, &rt);
- ClientToScreen(_hwnd, (LPPOINT)&rt.left);
- ClientToScreen(_hwnd, (LPPOINT)&rt.right);
-
- rt.left = _fullscreen._orgPos.left-rt.left;
- rt.top = _fullscreen._orgPos.top-rt.top;
- rt.right = GetSystemMetrics(SM_CXSCREEN)+_fullscreen._orgPos.right-rt.right;
- rt.bottom = GetSystemMetrics(SM_CYSCREEN)+_fullscreen._orgPos.bottom-rt.bottom;
-
- MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
- } else {
- MoveWindow(_hwnd, _fullscreen._orgPos.left, _fullscreen._orgPos.top,
- _fullscreen._orgPos.right-_fullscreen._orgPos.left,
- _fullscreen._orgPos.bottom-_fullscreen._orgPos.top, TRUE);
-
- if (_fullscreen._wasZoomed)
- ShowWindow(_hwnd, WS_MAXIMIZE);
- }
-
- return _fullscreen._mode;
-}
-
-void MainFrame::fullscreen_move()
-{
- RECT rt, pos;
- GetWindowRect(_hwnd, &pos);
-
- Frame_CalcFrameClient(_hwnd, &rt);
- ClientToScreen(_hwnd, (LPPOINT)&rt.left);
- ClientToScreen(_hwnd, (LPPOINT)&rt.right);
-
- rt.left = pos.left-rt.left;
- rt.top = pos.top-rt.top;
- rt.right = GetSystemMetrics(SM_CXSCREEN)+pos.right-rt.right;
- rt.bottom = GetSystemMetrics(SM_CYSCREEN)+pos.bottom-rt.bottom;
-
- MoveWindow(_hwnd, rt.left, rt.top, rt.right-rt.left, rt.bottom-rt.top, TRUE);
-}
-
-
void MainFrame::toggle_child(HWND hwnd, UINT cmd, HWND hchild)
{
BOOL vis = IsWindowVisible(hchild);
ShowWindow(hchild, vis?SW_HIDE:SW_SHOW);
- if (_fullscreen._mode)
- fullscreen_move();
-
resize_frame_client();
}
-#ifndef _NO_MDI
-bool MainFrame::activate_drive_window(LPCTSTR path)
-{
- TCHAR drv1[_MAX_DRIVE], drv2[_MAX_DRIVE];
- HWND child_wnd;
-
- _tsplitpath(path, drv1, 0, 0, 0);
-
- // search for a already open window for the same drive
- for(child_wnd=::GetNextWindow(_hmdiclient,GW_CHILD); child_wnd; child_wnd=::GetNextWindow(child_wnd, GW_HWNDNEXT)) {
- FileChildWindow* child = (FileChildWindow*) SendMessage(child_wnd, PM_GET_FILEWND_PTR, 0, 0);
-
- if (child) {
- _tsplitpath(child->get_root()._path, drv2, 0, 0, 0);
- if (!lstrcmpi(drv2, drv1)) {
- SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
-
- if (IsMinimized(child_wnd))
- ShowWindow(child_wnd, SW_SHOWNORMAL);
-
- return true;
- }
- }
- }
-
- return false;
-}
-
-bool MainFrame::activate_child_window(LPCTSTR filesys)
+BOOL CALLBACK ExecuteDialog::WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam)
{
- HWND child_wnd;
+ static struct ExecuteDialog* dlg;
- // search for a already open window of the given file system name
- for(child_wnd=::GetNextWindow(_hmdiclient,GW_CHILD); child_wnd; child_wnd=::GetNextWindow(child_wnd, GW_HWNDNEXT)) {
- FileChildWindow* child = (FileChildWindow*) SendMessage(child_wnd, PM_GET_FILEWND_PTR, 0, 0);
-
- if (child) {
- if (!lstrcmpi(child->get_root()._fs, filesys)) {
- SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
-
- if (IsMinimized(child_wnd))
- ShowWindow(child_wnd, SW_SHOWNORMAL);
-
- return true;
- }
- } else {
- ShellBrowserChild* shell_child = (ShellBrowserChild*) SendMessage(child_wnd, PM_GET_SHELLBROWSER_PTR, 0, 0);
+ switch(nmsg) {
+ case WM_INITDIALOG:
+ dlg = (struct ExecuteDialog*) lparam;
+ return 1;
- if (shell_child) {
- if (!lstrcmpi(shell_child->get_root()._fs, filesys)) {
- SendMessage(_hmdiclient, WM_MDIACTIVATE, (WPARAM)child_wnd, 0);
+ case WM_COMMAND: {
+ int id = (int)wparam;
- if (IsMinimized(child_wnd))
- ShowWindow(child_wnd, SW_SHOWNORMAL);
+ if (id == IDOK) {
+ GetWindowText(GetDlgItem(hwnd, 201), dlg->cmd, MAX_PATH);
+ dlg->cmdshow = Button_GetState(GetDlgItem(hwnd,214))&BST_CHECKED?
+ SW_SHOWMINIMIZED: SW_SHOWNORMAL;
+ EndDialog(hwnd, id);
+ } else if (id == IDCANCEL)
+ EndDialog(hwnd, id);
- return true;
- }
- }
- }
+ return 1;}
}
- return false;
+ return 0;
}
-#endif
static HWND Create(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL);
static int OpenShellFolders(LPIDA pida, HWND hFrameWnd);
- ChildWindow* CreateChild(LPCTSTR path=NULL, int mode=OWM_EXPLORE|OWM_DETAILS);
- ChildWindow* CreateChild(LPCITEMIDLIST pidl, int mode=OWM_EXPLORE|OWM_DETAILS|OWM_PIDL);
-
protected:
- FullScreenParameters _fullscreen;
-
-#ifndef _NO_MDI
- HWND _hmdiclient;
-#endif
-
WindowHandle _hstatusbar;
WindowHandle _htoolbar;
- WindowHandle _hdrivebar;
- WindowHandle _haddressedit;
- WindowHandle _hcommandedit;
HMENU _hMenuFrame;
HMENU _hMenuWindow;
MenuInfo _menu_info;
+ auto_ptr<ShellBrowserChild> _shellBrowser;
+
protected:
LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
+ int Notify(int id, NMHDR* pnmh);
int Command(int id, int code);
void toggle_child(HWND hwnd, UINT cmd, HWND hchild);
- bool activate_drive_window(LPCTSTR path);
- bool activate_child_window(LPCTSTR filesys);
void resize_frame_rect(PRECT prect);
void resize_frame(int cx, int cy);
void resize_frame_client();
void frame_get_clientspace(PRECT prect);
- BOOL toggle_fullscreen();
- void fullscreen_move();
HACCEL _hAccel;
- TCHAR _drives[BUFFER_LEN];
+
+
+ // SDI integration
+
+ ShellPathInfo _create_info;
+
+ WindowHandle _left_hwnd;
+ WindowHandle _right_hwnd;
+ //@@int _focus_pane; // 0: left 1: right
+
+ void update_explorer_view();
+ void jump_to(LPCTSTR path, int mode);
+ void jump_to(LPCITEMIDLIST path, int mode);
+};
+
+
+ /// The "Execute..."-dialog lets the user enter a command line to launch.
+struct ExecuteDialog { ///@todo use class Dialog
+ TCHAR cmd[MAX_PATH];
+ int cmdshow;
+
+ static BOOL CALLBACK WndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
};
+++ /dev/null
-/*
- * Copyright 2003 Martin Fuchs
- *
- * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-
- //
- // Explorer clone
- //
- // pane.cpp
- //
- // Martin Fuchs, 23.07.2003
- //
-
-
-#include "../utility/utility.h"
-
-#include "../explorer.h"
-#include "../globals.h"
-
-#include "../explorer_intres.h"
-
-
-enum IMAGE {
- IMG_NONE=-1, IMG_FILE=0, IMG_DOCUMENT, IMG_EXECUTABLE,
- IMG_FOLDER, IMG_OPEN_FOLDER, IMG_FOLDER_PLUS,IMG_OPEN_PLUS, IMG_OPEN_MINUS,
- IMG_FOLDER_UP, IMG_FOLDER_CUR
-};
-
-
-#define IMAGE_WIDTH 16
-#define IMAGE_HEIGHT 13
-
-
-static const LPTSTR g_pos_names[COLUMNS] = {
- TEXT(""), /* symbol */
- TEXT("Name"),
- TEXT("Type"),
- TEXT("Size"),
- TEXT("CDate"),
- TEXT("ADate"),
- TEXT("MDate"),
- TEXT("Index/Inode"),
- TEXT("Links"),
- TEXT("Attributes"),
- TEXT("Security"),
- TEXT("Content")
-};
-
-static const int g_pos_align[] = {
- 0,
- HDF_LEFT, /* Name */
- HDF_LEFT, /* Type */
- HDF_RIGHT, /* Size */
- HDF_LEFT, /* CDate */
- HDF_LEFT, /* ADate */
- HDF_LEFT, /* MDate */
- HDF_LEFT, /* Index */
- HDF_RIGHT, /* Links */
- HDF_CENTER, /* Attributes */
- HDF_LEFT, /* Security */
- HDF_LEFT /* Content / Description */
-};
-
-
-Pane::Pane(HWND hparent, int id, int id_header, Entry* root, bool treePane, int visible_cols)
- : super(CreateWindow(TEXT("ListBox"), TEXT(""), WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|
- LBS_DISABLENOSCROLL|LBS_NOINTEGRALHEIGHT|LBS_OWNERDRAWFIXED|LBS_NOTIFY,
- 0, 0, 0, 0, hparent, (HMENU)id, g_Globals._hInstance, 0)),
- _root(root),
- _visible_cols(visible_cols),
- _treePane(treePane)
-{
- // insert entries into listbox
- Entry* entry = _root;
-
- if (entry)
- insert_entries(entry, -1);
-
- init();
-
- create_header(hparent, id_header);
-}
-
-
-LRESULT Pane::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
-{
- switch(nmsg) {
- case WM_HSCROLL:
- set_header();
- break;
-
- case WM_SETFOCUS: {
- FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), PM_GET_FILEWND_PTR, 0, 0);
-
- child->set_focus_pane(this);
- ListBox_SetSel(_hwnd, TRUE, 1);
- /*@todo check menu items */
- break;}
-
- case WM_KEYDOWN: {
- FileChildWindow* child = (FileChildWindow*) SendMessage(GetParent(_hwnd), PM_GET_FILEWND_PTR, 0, 0);
-
- if (wparam == VK_TAB) {
- /*@todo SetFocus(g_Globals.hdrivebar) */
- child->switch_focus_pane();
- }
- break;}
- }
-
- return super::WndProc(nmsg, wparam, lparam);
-}
-
-
-bool Pane::create_header(HWND hparent, int id)
-{
- HWND hwnd = CreateWindow(WC_HEADER, 0, WS_CHILD|WS_VISIBLE|HDS_HORZ/*@todo |HDS_BUTTONS + sort orders*/,
- 0, 0, 0, 0, hparent, (HMENU)id, g_Globals._hInstance, 0);
- if (!hwnd)
- return false;
-
- SetWindowFont(hwnd, GetStockFont(DEFAULT_GUI_FONT), FALSE);
-
- HD_ITEM hdi;
-
- hdi.mask = HDI_TEXT|HDI_WIDTH|HDI_FORMAT;
-
- for(int idx=0; idx<COLUMNS; idx++) {
- hdi.pszText = g_pos_names[idx];
- hdi.fmt = HDF_STRING | g_pos_align[idx];
- hdi.cxy = _widths[idx];
- Header_InsertItem(hwnd, idx, &hdi);
- }
-
- _hwndHeader = hwnd;
-
- return true;
-}
-
-
-void Pane::init()
-{
- _himl = ImageList_LoadBitmap(g_Globals._hInstance, MAKEINTRESOURCE(IDB_IMAGES), 16, 0, RGB(0,255,0));
-
- SetWindowFont(_hwnd, _out_wrkr._hfont, FALSE);
-
- // read the color for compressed files from registry
- HKEY hkeyExplorer = 0;
- DWORD len = sizeof(_clrCompressed);
-
- if (RegOpenKey(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"), &hkeyExplorer) ||
- RegQueryValueEx(hkeyExplorer, TEXT("AltColor"), 0, NULL, (LPBYTE)&_clrCompressed, &len) || len!=sizeof(_clrCompressed))
- _clrCompressed = RGB(0,0,255);
-
- if (hkeyExplorer)
- RegCloseKey(hkeyExplorer);
-
- // calculate column widths
- _out_wrkr.init_output(_hwnd);
- calc_widths(true);
-}
-
-
- // calculate prefered width for all visible columns
-
-bool Pane::calc_widths(bool anyway)
-{
- int col, x, cx, spc=3*_out_wrkr._spaceSize.cx;
- int entries = ListBox_GetCount(_hwnd);
- int orgWidths[COLUMNS];
- int orgPositions[COLUMNS+1];
- HFONT hfontOld;
- HDC hdc;
- int cnt;
-
- if (!anyway) {
- memcpy(orgWidths, _widths, sizeof(orgWidths));
- memcpy(orgPositions, _positions, sizeof(orgPositions));
- }
-
- for(col=0; col<COLUMNS; col++)
- _widths[col] = 0;
-
- hdc = GetDC(_hwnd);
- hfontOld = SelectFont(hdc, _out_wrkr._hfont);
-
- for(cnt=0; cnt<entries; cnt++) {
- Entry* entry = (Entry*) ListBox_GetItemData(_hwnd, cnt);
-
- DRAWITEMSTRUCT dis;
-
- dis.CtlType = 0;
- dis.CtlID = 0;
- dis.itemID = 0;
- dis.itemAction = 0;
- dis.itemState = 0;
- dis.hwndItem = _hwnd;
- dis.hDC = hdc;
- dis.rcItem.left = 0;
- dis.rcItem.top = 0;
- dis.rcItem.right = 0;
- dis.rcItem.bottom = 0;
- /*dis.itemData = 0; */
-
- draw_item(&dis, entry, COLUMNS);
- }
-
- SelectObject(hdc, hfontOld);
- ReleaseDC(_hwnd, hdc);
-
- x = 0;
- for(col=0; col<COLUMNS; col++) {
- _positions[col] = x;
- cx = _widths[col];
-
- if (cx) {
- cx += spc;
-
- if (cx < IMAGE_WIDTH)
- cx = IMAGE_WIDTH;
-
- _widths[col] = cx;
- }
-
- x += cx;
- }
-
- _positions[COLUMNS] = x;
-
- ListBox_SetHorizontalExtent(_hwnd, x);
-
- // no change?
- if (!memcmp(orgWidths, _widths, sizeof(orgWidths)))
- return FALSE;
-
- // don't move, if only collapsing an entry
- if (!anyway && _widths[0]<orgWidths[0] &&
- !memcmp(orgWidths+1, _widths+1, sizeof(orgWidths)-sizeof(int))) {
- _widths[0] = orgWidths[0];
- memcpy(_positions, orgPositions, sizeof(orgPositions));
-
- return FALSE;
- }
-
- InvalidateRect(_hwnd, 0, TRUE);
-
- return TRUE;
-}
-
-
-static void format_date(const FILETIME* ft, TCHAR* buffer, int visible_cols)
-{
- SYSTEMTIME systime;
- FILETIME lft;
- int len = 0;
-
- *buffer = TEXT('\0');
-
- if (!ft->dwLowDateTime && !ft->dwHighDateTime)
- return;
-
- if (!FileTimeToLocalFileTime(ft, &lft))
- {err: lstrcpy(buffer,TEXT("???")); return;}
-
- if (!FileTimeToSystemTime(&lft, &systime))
- goto err;
-
- if (visible_cols & COL_DATE) {
- len = GetDateFormat(LOCALE_USER_DEFAULT, 0, &systime, 0, buffer, BUFFER_LEN);
- if (!len)
- goto err;
- }
-
- if (visible_cols & COL_TIME) {
- if (len)
- buffer[len-1] = ' ';
-
- buffer[len++] = ' ';
-
- if (!GetTimeFormat(LOCALE_USER_DEFAULT, 0, &systime, 0, buffer+len, BUFFER_LEN-len))
- buffer[len] = TEXT('\0');
- }
-}
-
-
-void Pane::draw_item(LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol)
-{
- TCHAR buffer[BUFFER_LEN];
- DWORD attrs;
- int visible_cols = _visible_cols;
- COLORREF bkcolor, textcolor;
- RECT focusRect = dis->rcItem;
- enum IMAGE img;
- int img_pos, cx;
- int col = 0;
-
- if (entry) {
- attrs = entry->_data.dwFileAttributes;
-
- if (attrs & FILE_ATTRIBUTE_DIRECTORY) {
- if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('.')
- && entry->_data.cFileName[2]==TEXT('\0'))
- img = IMG_FOLDER_UP;
- else if (entry->_data.cFileName[0]==TEXT('.') && entry->_data.cFileName[1]==TEXT('\0'))
- img = IMG_FOLDER_CUR;
- else if ((_treePane && (dis->itemState&ODS_FOCUS)))
- img = IMG_OPEN_FOLDER;
- else
- img = IMG_FOLDER;
- } else {
- if (attrs & ATTRIBUTE_EXECUTABLE)
- img = IMG_EXECUTABLE;
- else if (entry->_type_name)
- img = IMG_DOCUMENT;
- else
- img = IMG_FILE;
- }
- } else {
- attrs = 0;
- img = IMG_NONE;
- }
-
- if (_treePane) {
- if (entry) {
- img_pos = dis->rcItem.left + entry->_level*(IMAGE_WIDTH+_out_wrkr._spaceSize.cx);
-
- if (calcWidthCol == -1) {
- int x;
- int y = dis->rcItem.top + IMAGE_HEIGHT/2;
- Entry* up;
- RECT rt_clip;
- HRGN hrgn_org = CreateRectRgn(0, 0, 0, 0);
- HRGN hrgn;
-
- rt_clip.left = dis->rcItem.left;
- rt_clip.top = dis->rcItem.top;
- rt_clip.right = dis->rcItem.left+_widths[col];
- rt_clip.bottom = dis->rcItem.bottom;
-
- hrgn = CreateRectRgnIndirect(&rt_clip);
-
- if (!GetClipRgn(dis->hDC, hrgn_org)) {
- DeleteObject(hrgn_org);
- hrgn_org = 0;
- }
-
- //HGDIOBJ holdPen = SelectObject(dis->hDC, GetStockObject(BLACK_PEN));
- ExtSelectClipRgn(dis->hDC, hrgn, RGN_AND);
- DeleteObject(hrgn);
-
- if ((up=entry->_up) != NULL) {
- MoveToEx(dis->hDC, img_pos-IMAGE_WIDTH/2, y, 0);
- LineTo(dis->hDC, img_pos-2, y);
-
- x = img_pos - IMAGE_WIDTH/2;
-
- do {
- x -= IMAGE_WIDTH+_out_wrkr._spaceSize.cx;
-
- if (up->_next) {
-#ifndef _LEFT_FILES
- bool following_child = (up->_next->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0; // a directory?
-
- if (!following_child)
- for(Entry*n=up->_next; n; n=n->_next)
- if (n->_down) { // any file with NTFS sub-streams?
- following_child = true;
- break;
- }
-
- if (following_child)
-#endif
- {
- MoveToEx(dis->hDC, x, dis->rcItem.top, 0);
- LineTo(dis->hDC, x, dis->rcItem.bottom);
- }
- }
- } while((up=up->_up) != NULL);
- }
-
- x = img_pos - IMAGE_WIDTH/2;
-
- MoveToEx(dis->hDC, x, dis->rcItem.top, 0);
- LineTo(dis->hDC, x, y);
-
- if (entry->_next) {
-#ifndef _LEFT_FILES
- bool following_child = (entry->_next->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)!=0; // a directory?
-
- if (!following_child)
- for(Entry*n=entry->_next; n; n=n->_next)
- if (n->_down) { // any file with NTFS sub-streams?
- following_child = true;
- break;
- }
-
- if (following_child)
-#endif
- LineTo(dis->hDC, x, dis->rcItem.bottom);
- }
-
- if (entry->_down && entry->_expanded) {
- x += IMAGE_WIDTH + _out_wrkr._spaceSize.cx;
- MoveToEx(dis->hDC, x, dis->rcItem.top+IMAGE_HEIGHT, 0);
- LineTo(dis->hDC, x, dis->rcItem.bottom);
- }
-
- SelectClipRgn(dis->hDC, hrgn_org);
- if (hrgn_org) DeleteObject(hrgn_org);
- //SelectObject(dis->hDC, holdPen);
- } else if (calcWidthCol==col || calcWidthCol==COLUMNS) {
- int right = img_pos + IMAGE_WIDTH - _out_wrkr._spaceSize.cx;
-
- if (right > _widths[col])
- _widths[col] = right;
- }
- } else {
- img_pos = dis->rcItem.left;
- }
- } else {
- img_pos = dis->rcItem.left;
-
- if (calcWidthCol==col || calcWidthCol==COLUMNS)
- _widths[col] = IMAGE_WIDTH;
- }
-
- if (calcWidthCol == -1) {
- focusRect.left = img_pos -2;
-
- if (attrs & FILE_ATTRIBUTE_COMPRESSED)
- textcolor = _clrCompressed;
- else
- textcolor = RGB(0,0,0);
-
- if (dis->itemState & ODS_FOCUS) {
- textcolor = GetSysColor(COLOR_HIGHLIGHTTEXT);
- bkcolor = GetSysColor(COLOR_HIGHLIGHT);
- } else {
- bkcolor = GetSysColor(COLOR_WINDOW);
- }
-
- HBRUSH hbrush = CreateSolidBrush(bkcolor);
- FillRect(dis->hDC, &focusRect, hbrush);
- DeleteObject(hbrush);
-
- SetBkMode(dis->hDC, TRANSPARENT);
- SetTextColor(dis->hDC, textcolor);
-
- cx = _widths[col];
-
- if (cx && img!=IMG_NONE) {
- if (cx > IMAGE_WIDTH)
- cx = IMAGE_WIDTH;
-
- if (entry->_icon_id > ICID_NONE)
- g_Globals._icon_cache.get_icon(entry->_icon_id).draw(dis->hDC, img_pos, dis->rcItem.top, cx, GetSystemMetrics(SM_CYSMICON), bkcolor, 0);
- else
- ImageList_DrawEx(_himl, img, dis->hDC,
- img_pos, dis->rcItem.top, cx,
- IMAGE_HEIGHT, bkcolor, CLR_DEFAULT, ILD_NORMAL);
- }
- }
-
- if (!entry)
- return;
-
- ++col;
-
- // output file name
- if (calcWidthCol == -1)
- _out_wrkr.output_text(dis, _positions, col, entry->_display_name, 0);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, entry->_display_name);
- ++col;
-
- // output type/class name
- if (visible_cols & COL_TYPE) {
- if (calcWidthCol == -1)
- _out_wrkr.output_text(dis, _positions, col, entry->_type_name? entry->_type_name: TEXT(""), 0);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, entry->_type_name? entry->_type_name: TEXT(""));
- }
- ++col;
-
- // display file size
- if (visible_cols & COL_SIZE) {
- ULONGLONG size = ((ULONGLONG)entry->_data.nFileSizeHigh << 32) | entry->_data.nFileSizeLow;
-
- _stprintf(buffer, TEXT("%") LONGLONGARG TEXT("d"), size);
-
- if (calcWidthCol == -1)
- _out_wrkr.output_number(dis, _positions, col, buffer);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, buffer); ///@todo not in every case time enough
- }
- ++col;
-
- // display file date
- if (visible_cols & (COL_DATE|COL_TIME)) {
- format_date(&entry->_data.ftCreationTime, buffer, visible_cols);
- if (calcWidthCol == -1)
- _out_wrkr.output_text(dis, _positions, col, buffer, 0);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, buffer);
- ++col;
-
- format_date(&entry->_data.ftLastAccessTime, buffer, visible_cols);
- if (calcWidthCol == -1)
- _out_wrkr.output_text(dis,_positions, col, buffer, 0);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, buffer);
- ++col;
-
- format_date(&entry->_data.ftLastWriteTime, buffer, visible_cols);
- if (calcWidthCol == -1)
- _out_wrkr.output_text(dis, _positions, col, buffer, 0);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, buffer);
- ++col;
- } else
- col += 3;
-
- if (entry->_bhfi_valid) {
- ULONGLONG index = ((ULONGLONG)entry->_bhfi.nFileIndexHigh << 32) | entry->_bhfi.nFileIndexLow;
-
- if (visible_cols & COL_INDEX) {
- _stprintf(buffer, TEXT("%") LONGLONGARG TEXT("X"), index);
- if (calcWidthCol == -1)
- _out_wrkr.output_text(dis, _positions, col, buffer, DT_RIGHT);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, buffer);
- ++col;
- }
-
- if (visible_cols & COL_LINKS) {
- wsprintf(buffer, TEXT("%d"), entry->_bhfi.nNumberOfLinks);
- if (calcWidthCol == -1)
- _out_wrkr.output_text(dis, _positions, col, buffer, DT_RIGHT);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, buffer);
- ++col;
- }
- } else
- col += 2;
-
- // show file attributes
- if (visible_cols & COL_ATTRIBUTES) {
- lstrcpy(buffer, TEXT(" \t \t \t \t \t \t \t \t \t \t \t \t \t \t "));
-
- if (attrs & FILE_ATTRIBUTE_NORMAL) buffer[ 0] = 'N';
- else {
- if (attrs & FILE_ATTRIBUTE_READONLY) buffer[ 2] = 'R';
- if (attrs & FILE_ATTRIBUTE_HIDDEN) buffer[ 4] = 'H';
- if (attrs & FILE_ATTRIBUTE_SYSTEM) buffer[ 6] = 'S';
- if (attrs & FILE_ATTRIBUTE_ARCHIVE) buffer[ 8] = 'A';
- if (attrs & FILE_ATTRIBUTE_COMPRESSED) buffer[10] = 'C';
- if (attrs & FILE_ATTRIBUTE_DIRECTORY) buffer[12] = 'D';
- if (attrs & FILE_ATTRIBUTE_ENCRYPTED) buffer[14] = 'E';
- if (attrs & FILE_ATTRIBUTE_TEMPORARY) buffer[16] = 'T';
- if (attrs & FILE_ATTRIBUTE_SPARSE_FILE) buffer[18] = 'P';
- if (attrs & FILE_ATTRIBUTE_REPARSE_POINT) buffer[20] = 'Q';
- if (attrs & FILE_ATTRIBUTE_OFFLINE) buffer[22] = 'O';
- if (attrs & FILE_ATTRIBUTE_NOT_CONTENT_INDEXED) buffer[24] = 'X';
- if (attrs & ATTRIBUTE_EXECUTABLE) buffer[26] = 'x';
- if (attrs & ATTRIBUTE_SYMBOLIC_LINK) buffer[28] = 'L';
- }
-
- if (calcWidthCol == -1)
- _out_wrkr.output_tabbed_text(dis, _positions, col, buffer);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_tabbed_width(dis, col, buffer);
- }
- ++col;
-
-/*TODO
- if (flags.security) {
- DWORD rights = get_access_mask();
-
- tcscpy(buffer, TEXT(" \t \t \t \t \t \t \t \t \t \t \t "));
-
- if (rights & FILE_READ_DATA) buffer[ 0] = 'R';
- if (rights & FILE_WRITE_DATA) buffer[ 2] = 'W';
- if (rights & FILE_APPEND_DATA) buffer[ 4] = 'A';
- if (rights & FILE_READ_EA) {buffer[6] = 'entry'; buffer[ 7] = 'R';}
- if (rights & FILE_WRITE_EA) {buffer[9] = 'entry'; buffer[10] = 'W';}
- if (rights & FILE_EXECUTE) buffer[12] = 'X';
- if (rights & FILE_DELETE_CHILD) buffer[14] = 'D';
- if (rights & FILE_READ_ATTRIBUTES) {buffer[16] = 'a'; buffer[17] = 'R';}
- if (rights & FILE_WRITE_ATTRIBUTES) {buffer[19] = 'a'; buffer[20] = 'W';}
- if (rights & WRITE_DAC) buffer[22] = 'C';
- if (rights & WRITE_OWNER) buffer[24] = 'O';
- if (rights & SYNCHRONIZE) buffer[26] = 'S';
-
- output_text(dis, col++, buffer, DT_LEFT, 3, psize);
- }
-
- if (flags.description) {
- get_description(buffer);
- output_text(dis, col++, buffer, 0, psize);
- }
-*/
- ++col;
-
- // output content / symbolic link target / comment
- if (visible_cols & COL_CONTENT) {
- if (calcWidthCol == -1)
- _out_wrkr.output_text(dis, _positions, col, entry->_content? entry->_content: TEXT(""), 0);
- else if (calcWidthCol==col || calcWidthCol==COLUMNS)
- calc_width(dis, col, entry->_content? entry->_content: TEXT(""));
- }
-}
-
-
-void Pane::calc_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str)
-{
- RECT rt = {0, 0, 0, 0};
-
- DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX);
-
- if (rt.right > _widths[col])
- _widths[col] = rt.right;
-}
-
-void Pane::calc_tabbed_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str)
-{
- RECT rt = {0, 0, 0, 0};
-
-/* DRAWTEXTPARAMS dtp = {sizeof(DRAWTEXTPARAMS), 2};
- DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/
-
- DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_CALCRECT|DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8));
- //FIXME rt (0,0) ???
-
- if (rt.right > _widths[col])
- _widths[col] = rt.right;
-}
-
-
- // insert listbox entries after index idx
-
-void Pane::insert_entries(Entry* dir, int idx)
-{
- Entry* entry = dir;
-
- if (!entry)
- return;
-
- SendMessage(_hwnd, WM_SETREDRAW, FALSE, 0); //ShowWindow(_hwnd, SW_HIDE);
-
- for(; entry; entry=entry->_next) {
-#ifndef _LEFT_FILES
- if (_treePane &&
- !(entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && // not a directory?
- !entry->_down) // not a file with NTFS sub-streams?
- continue;
-#endif
-
- // don't display entries "." and ".." in the left pane
- if (_treePane && (entry->_data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
- && entry->_data.cFileName[0]==TEXT('.'))
- if (entry->_data.cFileName[1]==TEXT('\0') ||
- (entry->_data.cFileName[1]==TEXT('.') && entry->_data.cFileName[2]==TEXT('\0')))
- continue;
-
- if (idx != -1)
- ++idx;
-
- ListBox_InsertItemData(_hwnd, idx, entry);
-
- if (_treePane && entry->_expanded)
- insert_entries(entry->_down, idx);
- }
-
- SendMessage(_hwnd, WM_SETREDRAW, TRUE, 0); //ShowWindow(_hwnd, SW_SHOW);
-}
-
-
-void Pane::set_header()
-{
- HD_ITEM item;
- int scroll_pos = GetScrollPos(_hwnd, SB_HORZ);
- int i=0, x=0;
-
- item.mask = HDI_WIDTH;
- item.cxy = 0;
-
- for(; x+_widths[i]<scroll_pos && i<COLUMNS; i++) {
- x += _widths[i];
- Header_SetItem(_hwndHeader, i, &item);
- }
-
- if (i < COLUMNS) {
- x += _widths[i];
- item.cxy = x - scroll_pos;
- Header_SetItem(_hwndHeader, i++, &item);
-
- for(; i<COLUMNS; i++) {
- item.cxy = _widths[i];
- x += _widths[i];
- Header_SetItem(_hwndHeader, i, &item);
- }
- }
-}
-
-
- // calculate one prefered column width
-
-void Pane::calc_single_width(int col)
-{
- HFONT hfontOld;
- int x, cx;
- int cnt;
- HDC hdc;
-
- int entries = ListBox_GetCount(_hwnd);
-
- _widths[col] = 0;
-
- hdc = GetDC(_hwnd);
- hfontOld = SelectFont(hdc, _out_wrkr._hfont);
-
- for(cnt=0; cnt<entries; cnt++) {
- Entry* entry = (Entry*) ListBox_GetItemData(_hwnd, cnt);
-
- DRAWITEMSTRUCT dis;
-
- dis.CtlType = 0;
- dis.CtlID = 0;
- dis.itemID = 0;
- dis.itemAction = 0;
- dis.itemState = 0;
- dis.hwndItem = _hwnd;
- dis.hDC = hdc;
- dis.rcItem.left = 0;
- dis.rcItem.top = 0;
- dis.rcItem.right = 0;
- dis.rcItem.bottom = 0;
- /*dis.itemData = 0; */
-
- draw_item(&dis, entry, col);
- }
-
- SelectObject(hdc, hfontOld);
- ReleaseDC(_hwnd, hdc);
-
- cx = _widths[col];
-
- if (cx) {
- cx += 3*_out_wrkr._spaceSize.cx;
-
- if (cx < IMAGE_WIDTH)
- cx = IMAGE_WIDTH;
- }
-
- _widths[col] = cx;
-
- x = _positions[col] + cx;
-
- for(; col<COLUMNS; ) {
- _positions[++col] = x;
- x += _widths[col];
- }
-
- ListBox_SetHorizontalExtent(_hwnd, x);
-}
-
-
-int Pane::Notify(int id, NMHDR* pnmh)
-{
- switch(pnmh->code) {
- case HDN_TRACK:
- case HDN_ENDTRACK: {
- HD_NOTIFY* phdn = (HD_NOTIFY*) pnmh;
- int idx = phdn->iItem;
- int dx = phdn->pitem->cxy - _widths[idx];
- int i;
-
- ClientRect clnt(_hwnd);
-
- // move immediate to simulate HDS_FULLDRAG (for now [04/2000] not realy needed with WINELIB)
- Header_SetItem(_hwndHeader, idx, phdn->pitem);
-
- _widths[idx] += dx;
-
- for(i=idx; ++i<=COLUMNS; )
- _positions[i] += dx;
-
- {
- int scroll_pos = GetScrollPos(_hwnd, SB_HORZ);
- RECT rt_scr;
- RECT rt_clip;
-
- rt_scr.left = _positions[idx+1]-scroll_pos;
- rt_scr.top = 0;
- rt_scr.right = clnt.right;
- rt_scr.bottom = clnt.bottom;
-
- rt_clip.left = _positions[idx]-scroll_pos;
- rt_clip.top = 0;
- rt_clip.right = clnt.right;
- rt_clip.bottom = clnt.bottom;
-
- if (rt_scr.left < 0) rt_scr.left = 0;
- if (rt_clip.left < 0) rt_clip.left = 0;
-
- ScrollWindowEx(_hwnd, dx, 0, &rt_scr, &rt_clip, 0, 0, SW_INVALIDATE);
-
- rt_clip.right = _positions[idx+1];
- RedrawWindow(_hwnd, &rt_clip, 0, RDW_INVALIDATE|RDW_UPDATENOW);
-
- if (pnmh->code == HDN_ENDTRACK) {
- ListBox_SetHorizontalExtent(_hwnd, _positions[COLUMNS]);
-
- if (GetScrollPos(_hwnd, SB_HORZ) != scroll_pos)
- set_header();
- }
- }
-
- return 0;
- }
-
- case HDN_DIVIDERDBLCLICK: {
- HD_NOTIFY* phdn = (HD_NOTIFY*) pnmh;
- HD_ITEM item;
-
- calc_single_width(phdn->iItem);
- item.mask = HDI_WIDTH;
- item.cxy = _widths[phdn->iItem];
-
- Header_SetItem(_hwndHeader, phdn->iItem, &item);
- InvalidateRect(_hwnd, 0, TRUE);
- break;}
-
- default:
- return super::Notify(id, pnmh);
- }
-
- return 0;
-}
-
-
-OutputWorker::OutputWorker()
-{
- _hfont = CreateFont(-MulDiv(8,GetDeviceCaps(WindowCanvas(0),LOGPIXELSY),72), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, TEXT("MS Sans Serif"));
-}
-
-void OutputWorker::init_output(HWND hwnd)
-{
- TCHAR b[16];
-
- WindowCanvas canvas(hwnd);
-
- if (GetNumberFormat(LOCALE_USER_DEFAULT, 0, TEXT("1000"), 0, b, 16) > 4)
- _num_sep = b[1];
- else
- _num_sep = TEXT('.');
-
- FontSelection font(canvas, _hfont);
- GetTextExtentPoint32(canvas, TEXT(" "), 1, &_spaceSize);
-}
-
-
-void OutputWorker::output_text(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str, DWORD flags)
-{
- int x = dis->rcItem.left;
- RECT rt;
-
- rt.left = x+positions[col]+_spaceSize.cx;
- rt.top = dis->rcItem.top;
- rt.right = x+positions[col+1]-_spaceSize.cx;
- rt.bottom = dis->rcItem.bottom;
-
- DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_NOPREFIX|flags);
-}
-
-void OutputWorker::output_tabbed_text(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str)
-{
- int x = dis->rcItem.left;
- RECT rt;
-
- rt.left = x+positions[col]+_spaceSize.cx;
- rt.top = dis->rcItem.top;
- rt.right = x+positions[col+1]-_spaceSize.cx;
- rt.bottom = dis->rcItem.bottom;
-
-/* DRAWTEXTPARAMS dtp = {sizeof(DRAWTEXTPARAMS), 2};
- DrawTextEx(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_NOPREFIX|DT_EXPANDTABS|DT_TABSTOP, &dtp);*/
-
- DrawText(dis->hDC, (LPTSTR)str, -1, &rt, DT_SINGLELINE|DT_EXPANDTABS|DT_TABSTOP|(2<<8));
-}
-
-void OutputWorker::output_number(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str)
-{
- int x = dis->rcItem.left;
- RECT rt;
- LPCTSTR s = str;
- TCHAR b[128];
- LPTSTR d = b;
- int pos;
-
- rt.left = x+positions[col]+_spaceSize.cx;
- rt.top = dis->rcItem.top;
- rt.right = x+positions[col+1]-_spaceSize.cx;
- rt.bottom = dis->rcItem.bottom;
-
- if (*s)
- *d++ = *s++;
-
- // insert number separator characters
- pos = lstrlen(s) % 3;
-
- while(*s)
- if (pos--)
- *d++ = *s++;
- else {
- *d++ = _num_sep;
- pos = 3;
- }
-
- DrawText(dis->hDC, b, d-b, &rt, DT_RIGHT|DT_SINGLELINE|DT_NOPREFIX|DT_END_ELLIPSIS);
-}
-
-
-BOOL Pane::command(UINT cmd)
-{
- switch(cmd) {
- case ID_VIEW_NAME:
- if (_visible_cols) {
- _visible_cols = 0;
- calc_widths(true);
- set_header();
- InvalidateRect(_hwnd, 0, TRUE);
- MenuInfo* menu_info = Frame_GetMenuInfo(GetParent(_hwnd));
- if (menu_info) {
- CheckMenuItem(menu_info->_hMenuView, ID_VIEW_NAME, MF_BYCOMMAND|MF_CHECKED);
- CheckMenuItem(menu_info->_hMenuView, ID_VIEW_ALL_ATTRIBUTES, MF_BYCOMMAND);
- CheckMenuItem(menu_info->_hMenuView, ID_VIEW_SELECTED_ATTRIBUTES, MF_BYCOMMAND);
- }
- }
- break;
-
- case ID_VIEW_ALL_ATTRIBUTES:
- if (_visible_cols != COL_ALL) {
- _visible_cols = COL_ALL;
- calc_widths(true);
- set_header();
- InvalidateRect(_hwnd, 0, TRUE);
- MenuInfo* menu_info = Frame_GetMenuInfo(GetParent(_hwnd));
- if (menu_info) {
- CheckMenuItem(menu_info->_hMenuView, ID_VIEW_NAME, MF_BYCOMMAND);
- CheckMenuItem(menu_info->_hMenuView, ID_VIEW_ALL_ATTRIBUTES, MF_BYCOMMAND|MF_CHECKED);
- CheckMenuItem(menu_info->_hMenuView, ID_VIEW_SELECTED_ATTRIBUTES, MF_BYCOMMAND);
- }
- }
- break;
-
- case ID_PREFERED_SIZES: {
- calc_widths(true);
- set_header();
- InvalidateRect(_hwnd, 0, TRUE);
- break;}
-
- /*@todo more command ids... */
-
- default:
- return FALSE;
- }
-
- return TRUE;
-}
-
-MainFrame* Pane::get_frame()
-{
- HWND owner = GetParent(_hwnd);
-
- return (MainFrame*)owner;
-}
+++ /dev/null
-/*
- * Copyright 2003 Martin Fuchs
- *
- * 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-
- //
- // Explorer clone
- //
- // pane.h
- //
- // Martin Fuchs, 23.07.2003
- //
-
-
-#define IDW_TREE_LEFT 3
-#define IDW_TREE_RIGHT 6
-#define IDW_HEADER_LEFT 2
-#define IDW_HEADER_RIGHT 5
-
-
-enum COLUMN_FLAGS {
- COL_TYPE = 0x0001,
- COL_SIZE = 0x0002,
- COL_DATE = 0x0004,
- COL_TIME = 0x0008,
- COL_ATTRIBUTES = 0x0010,
- COL_DOSNAMES = 0x0020,
- COL_INDEX = 0x0040,
- COL_LINKS = 0x0080,
- COL_CONTENT = 0x0100,
- COL_ALL = COL_TYPE|COL_SIZE|COL_DATE|COL_TIME|COL_ATTRIBUTES|COL_DOSNAMES|COL_INDEX|COL_LINKS|COL_CONTENT
-};
-
-
- /// Worker for drawing contents of file lists in child pane
-struct OutputWorker
-{
- OutputWorker();
-
- void init_output(HWND hwnd);
- void output_text(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str, DWORD flags);
- void output_tabbed_text(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str);
- void output_number(LPDRAWITEMSTRUCT dis, int* positions, int col, LPCTSTR str);
-
- SIZE _spaceSize;
- TCHAR _num_sep;
- HFONT _hfont;
-};
-
-
- /// child window pane for displaying file lists
-struct Pane : public SubclassedWindow
-{
- typedef SubclassedWindow super;
-
- Pane(HWND hparent, int id, int id_header, Entry* rool, bool treePane, int visible_cols);
-
-#define COLUMNS 12
- int _widths[COLUMNS];
- int _positions[COLUMNS+1];
-
- WindowHandle _hwndHeader;
-
- Entry* _root;
- Entry* _cur;
-
- COLORREF _clrCompressed;
-
- int _visible_cols;
- bool _treePane;
-
- void init();
- void set_header();
- bool create_header(HWND parent, int id);
-
- bool calc_widths(bool anyway);
- void calc_single_width(int col);
- void draw_item(LPDRAWITEMSTRUCT dis, Entry* entry, int calcWidthCol=-1);
-
- void insert_entries(Entry* dir, int idx);
- BOOL command(UINT cmd);
- int Notify(int id, NMHDR* pnmh);
-
-protected:
- LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
-
- void calc_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str);
- void calc_tabbed_width(LPDRAWITEMSTRUCT dis, int col, LPCTSTR str);
- MainFrame* get_frame();
-
-protected:
- HIMAGELIST _himl;
- OutputWorker _out_wrkr;
-};
-
}
-ShellBrowserChild::ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info)
- : super(hwnd, info),
- _create_info(info)
+ShellBrowserChild::ShellBrowserChild(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info)
+ : _hwnd(hwnd),
+ _left_hwnd(left_hwnd),
+ _right_hwnd(right_hwnd),
+ _create_info(create_info)
{
_pShellView = NULL;
_pDropTarget = NULL;
_himlSmall = 0;
_last_sel = 0;
+
+ // SDI integration
+ _split_pos = DEFAULT_SPLIT_POS;
+ _last_split = DEFAULT_SPLIT_POS;
+
+ Init(hwnd);
}
ShellBrowserChild::~ShellBrowserChild()
_pDropTarget->Release();
_pDropTarget = NULL;
}
+
+ if (_right_hwnd) {
+ DestroyWindow(_right_hwnd);
+ _right_hwnd = 0;
+ }
}
-LRESULT ShellBrowserChild::Init(LPCREATESTRUCT pcs)
+LRESULT ShellBrowserChild::Init(HWND hWndFrame)
{
CONTEXT("ShellBrowserChild::Init()");
- if (super::Init(pcs))
- return 1;
-
- _hWndFrame = GetParent(pcs->hwndParent);
+ _hWndFrame = hWndFrame;
ClientRect rect(_hwnd);
// _himlLarge = (HIMAGELIST)SHGetFileInfo(TEXT("C:\\"), 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX|SHGFI_LARGEICON);
- // create explorer treeview
- if (_create_info._open_mode & OWM_EXPLORE)
- _left_hwnd = CreateWindowEx(0, WC_TREEVIEW, NULL,
- WS_CHILD|WS_TABSTOP|WS_VISIBLE|WS_CHILD|TVS_HASLINES|TVS_LINESATROOT|TVS_HASBUTTONS|TVS_NOTOOLTIPS|TVS_SHOWSELALWAYS,
- 0, rect.top, _split_pos-SPLIT_WIDTH/2, rect.bottom-rect.top,
- _hwnd, (HMENU)IDC_FILETREE, g_Globals._hInstance, 0);
-
if (_left_hwnd) {
InitializeTree();
InitDragDrop();
- } else
- UpdateFolderView(_create_info._shell_path.get_folder());
+ }
+
+ UpdateFolderView(_create_info._shell_path.get_folder());
return 0;
}
pLastShellView->GetCurrentInfo(&fs);
else {
fs.ViewMode = _create_info._open_mode&OWM_DETAILS? FVM_DETAILS: FVM_ICON;
- fs.fFlags = FWF_NOCLIENTEDGE|FWF_BESTFITWINDOW;
+ fs.fFlags = FWF_BESTFITWINDOW;
}
HRESULT hr = folder->CreateViewObject(_hwnd, IID_IShellView, (void**)&_pShellView);
pLastShellView->DestroyViewWindow();
pLastShellView->Release();
- ClientRect clnt(_hwnd);
- resize_children(clnt.right, clnt.bottom);
+ resize_children();
}
_pShellView->UIActivate(SVUIA_ACTIVATE_NOFOCUS);
}
+void ShellBrowserChild::resize_children()
+{
+ RECT rect = _clnt_rect;
+
+ HDWP hdwp = BeginDeferWindowPos(2);
+
+ int cx = rect.left;
+
+ if (_left_hwnd) {
+ cx = _split_pos + SPLIT_WIDTH/2;
+
+ hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, rect.left, rect.top, _split_pos-SPLIT_WIDTH/2-rect.left, rect.bottom-rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
+ } else {
+ _split_pos = 0;
+ cx = 0;
+ }
+
+ if (_right_hwnd)
+ hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rect.left+cx+1, rect.top, rect.right-cx, rect.bottom-rect.top, SWP_NOZORDER|SWP_NOACTIVATE);
+
+ EndDeferWindowPos(hdwp);
+}
+
+
LRESULT ShellBrowserChild::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
{
switch(nmsg) {
case WM_GETISHELLBROWSER: // for Registry Explorer Plugin
return (LRESULT)static_cast<IShellBrowser*>(this);
- case PM_GET_SHELLBROWSER_PTR:
- return (LRESULT)this;
- case PM_DISPATCH_COMMAND: {
- switch(LOWORD(wparam)) {
- case ID_WINDOW_NEW: {CONTEXT("ShellBrowserChild PM_DISPATCH_COMMAND ID_WINDOW_NEW");
- ShellBrowserChild::create(_create_info);
- break;}
+ // SDI integration:
+
+ case WM_PAINT: {
+ PaintCanvas canvas(_hwnd);
+ ClientRect rt(_hwnd);
+ rt.left = _split_pos-SPLIT_WIDTH/2;
+ rt.right = _split_pos+SPLIT_WIDTH/2+1;
+
+ if (_right_hwnd) {
+ WindowRect right_rect(_right_hwnd);
+ ScreenToClient(_hwnd, &right_rect);
+ rt.top = right_rect.top;
+ rt.bottom = right_rect.bottom;
+ }
+
+ HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(COLOR_SPLITBAR));
+ Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1);
+ SelectObject(canvas, lastBrush);
+ break;}
+
+ case WM_SETCURSOR:
+ if (LOWORD(lparam) == HTCLIENT) {
+ POINT pt;
+ GetCursorPos(&pt);
+ ScreenToClient(_hwnd, &pt);
+
+ if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) {
+ SetCursor(LoadCursor(0, IDC_SIZEWE));
+ return TRUE;
+ }
+ }
+ goto def;
+
+ case WM_LBUTTONDOWN: {
+ int x = GET_X_LPARAM(lparam);
+
+ ClientRect rt(_hwnd);
- default:
- return FALSE;
+ if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) {
+ _last_split = _split_pos;
+ SetCapture(_hwnd);
}
- return TRUE;}
-
- default:
- return super::WndProc(nmsg, wparam, lparam);
+
+ break;}
+
+ case WM_LBUTTONUP:
+ if (GetCapture() == _hwnd)
+ ReleaseCapture();
+ break;
+
+ case WM_KEYDOWN:
+ if (wparam == VK_ESCAPE)
+ if (GetCapture() == _hwnd) {
+ _split_pos = _last_split;
+ resize_children();
+ _last_split = -1;
+ ReleaseCapture();
+ SetCursor(LoadCursor(0, IDC_ARROW));
+ }
+ break;
+
+ case WM_MOUSEMOVE:
+ if (GetCapture() == _hwnd) {
+ int x = LOWORD(lparam);
+
+ ClientRect rt(_hwnd);
+
+ if (x>=0 && x<rt.right) {
+ _split_pos = x;
+ resize_children();
+ rt.left = x-SPLIT_WIDTH/2;
+ rt.right = x+SPLIT_WIDTH/2+1;
+ InvalidateRect(_hwnd, &rt, FALSE);
+ UpdateWindow(_left_hwnd);
+ UpdateWindow(_hwnd);
+ UpdateWindow(_right_hwnd);
+ }
+ }
+ break;
+
+
+ default: def:
+ return DefWindowProc(_hwnd, nmsg, wparam, lparam);
}
return 0;
case TVN_ITEMEXPANDING: OnTreeItemExpanding(id, (LPNMTREEVIEW)pnmh); break;
case TVN_SELCHANGED: OnTreeItemSelected(id, (LPNMTREEVIEW)pnmh); break;
case NM_RCLICK: OnTreeItemRClick(id, pnmh); break;
- default: return super::Notify(id, pnmh);
}
return 0;
#include "../utility/shellbrowserimpl.h"
- /// Implementation of IShellBrowserImpl interface in explorer child windows
-struct ShellBrowserChild : public ChildWindow, public IShellBrowserImpl
+ /// information structure to hold current shell folder information
+struct ShellPathInfo
{
- typedef ChildWindow super;
+ ShellPathInfo(int mode=0) : _open_mode(mode) {}
- ShellBrowserChild(HWND hwnd, const ShellChildWndInfo& info);
- ~ShellBrowserChild();
+ ShellPath _shell_path;
+ ShellPath _root_shell_path;
- static ShellBrowserChild* create(const FileChildWndInfo& info)
- {
-#ifndef _NO_MDI
- ChildWindow* child = ChildWindow::create(info, info._pos.rcNormalPosition,
- WINDOW_CREATOR_INFO(ShellBrowserChild,ShellChildWndInfo), CLASSNAME_CHILDWND, NULL);
-#else
- ///@todo SDI implementation
-#endif
+ int _open_mode; //OPEN_WINDOW_MODE
+};
- ShowWindow(*child, info._pos.showCmd);
- return static_cast<ShellBrowserChild*>(child);
- }
+ /// Implementation of IShellBrowserImpl interface in explorer child windows
+struct ShellBrowserChild : public IShellBrowserImpl
+{
+ ShellBrowserChild(HWND hwnd, HWND left_hwnd, WindowHandle& right_hwnd, ShellPathInfo& create_info);
+ ~ShellBrowserChild();
//IOleWindow
virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND* lphwnd)
const Root& get_root() const {return _root;}
protected:
- Root _root;
+ HWND _hwnd;
+ HWND _left_hwnd;
+ WindowHandle& _right_hwnd;
+ ShellPathInfo& _create_info;
+
+ Root _root;
WindowHandle _hWndFrame;
- ShellChildWndInfo _create_info;
ShellFolder _folder;
IShellView* _pShellView; // current hosted shellview
HTREEITEM _last_sel;
+public:
LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
int Notify(int id, NMHDR* pnmh);
- LRESULT Init(LPCREATESTRUCT);
- void InitializeTree(/*const FileChildWndInfo& info*/);
+ LRESULT Init(HWND hWndFrame);
+ void InitializeTree();
int InsertSubitems(HTREEITEM hParentItem, Entry* entry, IShellFolder* pParentFolder);
bool InitDragDrop();
void UpdateFolderView(IShellFolder* folder);
void Tree_DoItemMenu(HWND hwndTreeView, HTREEITEM hItem, LPPOINT pptScreen);
bool expand_folder(ShellDirectory* entry);
+
+ // SDI integration
+public:
+ int _split_pos;
+ int _last_split;
+ RECT _clnt_rect;
+
+ void resize_children();
};
{::ScreenToClient(hwnd,(LPPOINT)&prect->left); ::ScreenToClient(hwnd,(LPPOINT)&prect->right);}
- /// structure containing information about full screen display of the frame window
-struct FullScreenParameters
-{
- FullScreenParameters()
- : _mode(FALSE)
- {
- }
-
- BOOL _mode;
- RECT _orgPos;
- BOOL _wasZoomed;
-};
-
-
// drawing utilities
/// PaintCanvas is a encapsulation of device contexts managed by BeginPaint()/EndPaint().
}
-Window* Window::create_mdi_child(const ChildWndInfo& info, const MDICREATESTRUCT& mcs, CREATORFUNC_INFO creator)
-{
- Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
-
- s_window_creator = (CREATORFUNC) creator;
- s_new_info = &info;
-
- s_hcbtHook = SetWindowsHookEx(WH_CBT, MDICBTHookProc, 0, GetCurrentThreadId());
-
- HWND hwnd = (HWND) SendMessage(info._hmdiclient, WM_MDICREATE, 0, (LPARAM)&mcs);
-
- UnhookWindowsHookEx(s_hcbtHook);
-
- Window* child = get_window(hwnd);
- s_new_info = NULL;
-
- if (child && (!hwnd || !child->_hwnd))
- child = NULL;
-
- return child;
-}
-
-LRESULT CALLBACK Window::MDICBTHookProc(int code, WPARAM wparam, LPARAM lparam)
-{
- if (code == HCBT_CREATEWND) {
- HWND hwnd = (HWND)wparam;
-
- // create Window controller and associate it with the window handle
- Window* child = get_window(hwnd);
-
- if (!child)
- child = create_controller(hwnd);
- }
-
- return CallNextHookEx(s_hcbtHook, code, wparam, lparam);
-}
-
-
-/*
-Window* Window::create_property_sheet(PropertySheetDialog* ppsd, CREATORFUNC creator, const void* info)
-{
- Lock lock(GetStaticWindowData()._create_crit_sect); // protect access to s_window_creator and s_new_info
-
- s_window_creator = creator;
- s_new_info = info;
-
- s_hcbtHook = SetWindowsHookEx(WH_CBT, PropSheetCBTHookProc, 0, GetCurrentThreadId());
-
- HWND hwnd = (HWND) PropertySheet(ppsd);
-
- UnhookWindowsHookEx(s_hcbtHook);
-
- Window* child = get_window(hwnd);
- s_new_info = NULL;
-
- if (child && (!hwnd || !child->_hwnd))
- child = NULL;
-
- return child;
-}
-*/
-
LRESULT CALLBACK Window::PropSheetCBTHookProc(int code, WPARAM wparam, LPARAM lparam)
{
if (code == HCBT_CREATEWND) {
}
-ChildWindow::ChildWindow(HWND hwnd, const ChildWndInfo& info)
- : super(hwnd),
- _hwndFrame(GetParent(info._hmdiclient))
-{
- _focus_pane = 0;
- _split_pos = DEFAULT_SPLIT_POS;
- _last_split = DEFAULT_SPLIT_POS;
-}
-
-
-ChildWindow* ChildWindow::create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator,
- LPCTSTR classname, LPCTSTR title)
-{
- MDICREATESTRUCT mcs;
-
- mcs.szClass = classname;
- mcs.szTitle = title;
- mcs.hOwner = g_Globals._hInstance;
- mcs.x = rect.left,
- mcs.y = rect.top;
- mcs.cx = rect.right - rect.left;
- mcs.cy = rect.bottom - rect.top;
- mcs.style = 0;
- mcs.lParam = 0;
-
- return static_cast<ChildWindow*>(create_mdi_child(info, mcs, creator));
-}
-
-
-LRESULT ChildWindow::WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam)
-{
- switch(nmsg) {
- case WM_PAINT: {
- PaintCanvas canvas(_hwnd);
- ClientRect rt(_hwnd);
- rt.left = _split_pos-SPLIT_WIDTH/2;
- rt.right = _split_pos+SPLIT_WIDTH/2+1;
- HBRUSH lastBrush = SelectBrush(canvas, GetStockBrush(COLOR_SPLITBAR));
- Rectangle(canvas, rt.left, rt.top-1, rt.right, rt.bottom+1);
- SelectObject(canvas, lastBrush);
- break;}
-
- case WM_SETCURSOR:
- if (LOWORD(lparam) == HTCLIENT) {
- POINT pt;
- GetCursorPos(&pt);
- ScreenToClient(_hwnd, &pt);
-
- if (pt.x>=_split_pos-SPLIT_WIDTH/2 && pt.x<_split_pos+SPLIT_WIDTH/2+1) {
- SetCursor(LoadCursor(0, IDC_SIZEWE));
- return TRUE;
- }
- }
- goto def;
-
- case WM_SIZE:
- if (wparam != SIZE_MINIMIZED)
- resize_children(LOWORD(lparam), HIWORD(lparam));
- goto def;
-
- case WM_GETMINMAXINFO:
- DefMDIChildProc(_hwnd, nmsg, 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;}
-
- case WM_LBUTTONDOWN: {
- int x = GET_X_LPARAM(lparam);
-
- ClientRect rt(_hwnd);
-
- if (x>=_split_pos-SPLIT_WIDTH/2 && x<_split_pos+SPLIT_WIDTH/2+1) {
- _last_split = _split_pos;
- SetCapture(_hwnd);
- }
-
- break;}
-
- case WM_LBUTTONUP:
- if (GetCapture() == _hwnd)
- ReleaseCapture();
- break;
-
- case WM_KEYDOWN:
- if (wparam == VK_ESCAPE)
- if (GetCapture() == _hwnd) {
- _split_pos = _last_split;
- ClientRect rt(_hwnd);
- resize_children(rt.right, rt.bottom);
- _last_split = -1;
- ReleaseCapture();
- SetCursor(LoadCursor(0, IDC_ARROW));
- }
- break;
-
- case WM_MOUSEMOVE:
- if (GetCapture() == _hwnd) {
- int x = LOWORD(lparam);
-
- ClientRect rt(_hwnd);
-
- if (x>=0 && x<rt.right) {
- _split_pos = x;
- resize_children(rt.right, rt.bottom);
- rt.left = x-SPLIT_WIDTH/2;
- rt.right = x+SPLIT_WIDTH/2+1;
- InvalidateRect(_hwnd, &rt, FALSE);
- UpdateWindow(_left_hwnd);
- UpdateWindow(_hwnd);
- UpdateWindow(_right_hwnd);
- }
- }
- break;
-
- case PM_DISPATCH_COMMAND:
- return FALSE;
-
- case WM_MDIACTIVATE:
- if ((HWND)lparam == _hwnd)
- SendMessage(_hwndFrame, PM_SETSTATUSTEXT, 0, (LPARAM)_statusText.c_str());
- break;
-
- default: def:
- return DefMDIChildProc(_hwnd, nmsg, wparam, lparam);
- }
-
- return 0;
-}
-
-
-void ChildWindow::resize_children(int cx, int cy)
-{
- HDWP hdwp = BeginDeferWindowPos(4);
- RECT rt;
-
- rt.left = 0;
- rt.top = 0;
- rt.right = cx;
- rt.bottom = cy;
-
- if (_left_hwnd) {
- cx = _split_pos + SPLIT_WIDTH/2;
-
- hdwp = DeferWindowPos(hdwp, _left_hwnd, 0, rt.left, rt.top, _split_pos-SPLIT_WIDTH/2-rt.left, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
- } else {
- _split_pos = 0;
- cx = 0;
- }
-
- hdwp = DeferWindowPos(hdwp, _right_hwnd, 0, rt.left+cx+1, rt.top, rt.right-cx, rt.bottom-rt.top, SWP_NOZORDER|SWP_NOACTIVATE);
-
- EndDeferWindowPos(hdwp);
-}
-
-
WindowSet Window::s_pretranslate_windows;
void Window::register_pretranslate(HWND hwnd)
*/
- /// information structure for creation of a MDI child window
-struct ChildWndInfo
-{
- ChildWndInfo(HWND hmdiclient)
- : _hmdiclient(hmdiclient) {}
-
- HWND _hmdiclient;
-};
-
-
/**
Class Window is the base class for several C++ window wrapper classes.
Window objects are allocated from the heap. They are automatically freed
DWORD dwStyle, int x, int y, int w, int h,
HWND hwndParent=0, HMENU hMenu=0/*, LPVOID lpParam=0*/);
- static Window* create_mdi_child(const ChildWndInfo& info, const MDICREATESTRUCT& mcs, CREATORFUNC_INFO creator);
-// static Window* create_property_sheet(struct PropertySheetDialog* ppsd, CREATORFUNC creator, const void* info);
-
static LRESULT CALLBACK WindowWndProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
static INT_PTR CALLBACK DialogProc(HWND hwnd, UINT nmsg, WPARAM wparam, LPARAM lparam);
static StaticWindowData& GetStaticWindowData();
- // MDI child creation
static HHOOK s_hcbtHook;
- static LRESULT CALLBACK MDICBTHookProc(int code, WPARAM wparam, LPARAM lparam);
static LRESULT CALLBACK PropSheetCBTHookProc(int code, WPARAM wparam, LPARAM lparam);
static WindowSet s_pretranslate_windows;
// private message constants
-#define PM_DISPATCH_COMMAND (WM_APP+0x00)
#define PM_TRANSLATE_MSG (WM_APP+0x01)
#define COLOR_SPLITBAR LTGRAY_BRUSH
- /// menu info structure for MDI child windows
+ /// menu info structure
struct MenuInfo
{
HMENU _hMenuView;
#define Frame_GetMenuInfo(hwnd) ((MenuInfo*)SNDMSG(hwnd, PM_FRM_GET_MENUINFO, 0, 0))
- /**
- Class ChildWindow represents MDI child windows.
- It is used with class MainFrame.
- */
-struct ChildWindow : public Window
-{
- typedef Window super;
-
- ChildWindow(HWND hwnd, const ChildWndInfo& info);
-
- static ChildWindow* create(const ChildWndInfo& info, const RECT& rect, CREATORFUNC_INFO creator,
- LPCTSTR classname, LPCTSTR title=NULL);
-
-protected:
- LRESULT WndProc(UINT nmsg, WPARAM wparam, LPARAM lparam);
-
- virtual void resize_children(int cx, int cy);
-
-protected:
- MenuInfo*_menu_info;
-
- WindowHandle _left_hwnd;
- WindowHandle _right_hwnd;
- int _focus_pane; // 0: left 1: right
-
- int _split_pos;
- int _last_split;
-
- HWND _hwndFrame;
- String _statusText;
-};
-
-#define PM_SETSTATUSTEXT (WM_APP+0x1D)
-
-
/**
PreTranslateWindow is used to register windows to be called by Window::pretranslate_msg().
This way you get PM_TRANSLATE_MSG messages before the message loop dispatches messages.