From 89c5b2369413025e1fe7dfe5c5d0bf3bedd8558d Mon Sep 17 00:00:00 2001 From: Kirill Volinsky Date: Mon, 23 Jul 2012 13:52:57 +0000 Subject: git-svn-id: http://svn.miranda-ng.org/main/trunk@1123 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/SmartAutoReplier/ActionsHandler.cpp | 31 - plugins/SmartAutoReplier/ActionsHandler.h | 30 - plugins/SmartAutoReplier/AggressiveOptimize.h | 59 - plugins/SmartAutoReplier/Crc32Static.cpp | 139 - plugins/SmartAutoReplier/Crc32Static.h | 33 - plugins/SmartAutoReplier/CrushLog.cpp | 165 - plugins/SmartAutoReplier/CrushLog.h | 54 - plugins/SmartAutoReplier/GUI/AddRuleDlg.cpp | 219 - plugins/SmartAutoReplier/GUI/AddRuleDlg.h | 67 - plugins/SmartAutoReplier/GUI/EditReplyDlg.cpp | 88 - plugins/SmartAutoReplier/GUI/EditReplyDlg.h | 55 - plugins/SmartAutoReplier/GUI/OptionsDlg.cpp | 528 - plugins/SmartAutoReplier/GUI/OptionsDlg.h | 119 - plugins/SmartAutoReplier/GUI/SelectUserDlg.cpp | 109 - plugins/SmartAutoReplier/GUI/SelectUserDlg.h | 58 - plugins/SmartAutoReplier/GUI/SettingsDlgHolder.cpp | 207 - plugins/SmartAutoReplier/GUI/SettingsDlgHolder.h | 69 - plugins/SmartAutoReplier/Interfaces/ISettings.h | 34 - plugins/SmartAutoReplier/Interfaces/ISingletone.h | 35 - plugins/SmartAutoReplier/LuaBridge.cpp | 127 - plugins/SmartAutoReplier/LuaBridge.h | 96 - plugins/SmartAutoReplier/LuaScript.cpp | 215 - plugins/SmartAutoReplier/LuaScript.h | 68 - plugins/SmartAutoReplier/MessagesHandler.cpp | 469 - plugins/SmartAutoReplier/MessagesHandler.h | 72 - plugins/SmartAutoReplier/ModeMessHandler.cpp | 119 - plugins/SmartAutoReplier/ModeMessHandler.h | 34 - plugins/SmartAutoReplier/RuleItem.h | 47 - plugins/SmartAutoReplier/RulesStorage.cpp | 536 - plugins/SmartAutoReplier/RulesStorage.h | 63 - plugins/SmartAutoReplier/SAR.cpp | 462 - plugins/SmartAutoReplier/SAR.rc | 274 - plugins/SmartAutoReplier/SAR.vcxproj | 189 - plugins/SmartAutoReplier/SAR.vcxproj.filters | 77 - plugins/SmartAutoReplier/SarLuaScript.cpp | 358 - plugins/SmartAutoReplier/SarLuaScript.h | 57 - plugins/SmartAutoReplier/ScriptsReader.cpp | 175 - plugins/SmartAutoReplier/ScriptsReader.h | 57 - plugins/SmartAutoReplier/SettingsHandler.cpp | 204 - plugins/SmartAutoReplier/SettingsHandler.h | 96 - plugins/SmartAutoReplier/comfunc.cpp | 74 - plugins/SmartAutoReplier/comfunc.h | 26 - plugins/SmartAutoReplier/comlogging.h | 42 - plugins/SmartAutoReplier/luainc.h | 31 - plugins/SmartAutoReplier/lualib/ReadMe.txt | 37 - plugins/SmartAutoReplier/lualib/lapi.c | 922 -- plugins/SmartAutoReplier/lualib/lapi.h | 16 - plugins/SmartAutoReplier/lualib/lauxlib.c | 591 -- plugins/SmartAutoReplier/lualib/lauxlib.h | 145 - plugins/SmartAutoReplier/lualib/lbaselib.c | 674 -- plugins/SmartAutoReplier/lualib/lcode.c | 714 -- plugins/SmartAutoReplier/lualib/lcode.h | 74 - plugins/SmartAutoReplier/lualib/ldblib.c | 299 - plugins/SmartAutoReplier/lualib/ldebug.c | 585 -- plugins/SmartAutoReplier/lualib/ldebug.h | 31 - plugins/SmartAutoReplier/lualib/ldo.c | 458 - plugins/SmartAutoReplier/lualib/ldo.h | 60 - plugins/SmartAutoReplier/lualib/ldump.c | 170 - plugins/SmartAutoReplier/lualib/lfunc.c | 135 - plugins/SmartAutoReplier/lualib/lfunc.h | 25 - plugins/SmartAutoReplier/lualib/lgc.c | 493 - plugins/SmartAutoReplier/lualib/lgc.h | 25 - plugins/SmartAutoReplier/lualib/liolib.c | 750 -- plugins/SmartAutoReplier/lualib/llex.c | 417 - plugins/SmartAutoReplier/lualib/llex.h | 75 - plugins/SmartAutoReplier/lualib/llimits.h | 185 - plugins/SmartAutoReplier/lualib/lmathlib.c | 246 - plugins/SmartAutoReplier/lualib/lmem.c | 91 - plugins/SmartAutoReplier/lualib/lmem.h | 44 - plugins/SmartAutoReplier/lualib/loadlib.c | 205 - plugins/SmartAutoReplier/lualib/lobject.c | 195 - plugins/SmartAutoReplier/lualib/lobject.h | 336 - plugins/SmartAutoReplier/lualib/lopcodes.c | 102 - plugins/SmartAutoReplier/lualib/lopcodes.h | 238 - plugins/SmartAutoReplier/lualib/lparser.c | 1329 --- plugins/SmartAutoReplier/lualib/lparser.h | 71 - plugins/SmartAutoReplier/lualib/lstate.c | 220 - plugins/SmartAutoReplier/lualib/lstate.h | 195 - plugins/SmartAutoReplier/lualib/lstring.c | 102 - plugins/SmartAutoReplier/lualib/lstring.h | 33 - plugins/SmartAutoReplier/lualib/lstrlib.c | 770 -- plugins/SmartAutoReplier/lualib/ltable.c | 509 - plugins/SmartAutoReplier/lualib/ltable.h | 31 - plugins/SmartAutoReplier/lualib/ltablib.c | 250 - plugins/SmartAutoReplier/lualib/ltests.c | 852 -- plugins/SmartAutoReplier/lualib/ltm.c | 70 - plugins/SmartAutoReplier/lualib/ltm.h | 51 - plugins/SmartAutoReplier/lualib/lua.h | 391 - plugins/SmartAutoReplier/lualib/luainc.h | 12 - plugins/SmartAutoReplier/lualib/lualib.h | 56 - plugins/SmartAutoReplier/lualib/lualib.vcxproj | 138 - .../SmartAutoReplier/lualib/lualib.vcxproj.filters | 186 - plugins/SmartAutoReplier/lualib/lundump.c | 286 - plugins/SmartAutoReplier/lualib/lundump.h | 34 - plugins/SmartAutoReplier/lualib/lvm.c | 780 -- plugins/SmartAutoReplier/lualib/lvm.h | 35 - plugins/SmartAutoReplier/lualib/lzio.c | 81 - plugins/SmartAutoReplier/lualib/lzio.h | 64 - plugins/SmartAutoReplier/lualib/targetver.h | 8 - plugins/SmartAutoReplier/resource.h | 52 - plugins/SmartAutoReplier/sar.ico | Bin 318 -> 0 bytes plugins/SmartAutoReplier/stdafx.cpp | 27 - plugins/SmartAutoReplier/stdafx.h | 74 - plugins/SmartAutoReplier/wtl/atlapp.h | 2035 ---- plugins/SmartAutoReplier/wtl/atlcrack.h | 2384 ----- plugins/SmartAutoReplier/wtl/atlctrls.h | 10041 ------------------- plugins/SmartAutoReplier/wtl/atlctrlw.h | 4157 -------- plugins/SmartAutoReplier/wtl/atlctrlx.h | 5004 --------- plugins/SmartAutoReplier/wtl/atlddx.h | 679 -- plugins/SmartAutoReplier/wtl/atldlgs.h | 6403 ------------ plugins/SmartAutoReplier/wtl/atldwm.h | 461 - plugins/SmartAutoReplier/wtl/atlfind.h | 1032 -- plugins/SmartAutoReplier/wtl/atlframe.h | 3688 ------- plugins/SmartAutoReplier/wtl/atlgdi.h | 3891 ------- plugins/SmartAutoReplier/wtl/atlmisc.h | 3817 ------- plugins/SmartAutoReplier/wtl/atlprint.h | 1109 -- plugins/SmartAutoReplier/wtl/atlres.h | 263 - plugins/SmartAutoReplier/wtl/atlresce.h | 93 - plugins/SmartAutoReplier/wtl/atlribbon.h | 3446 ------- plugins/SmartAutoReplier/wtl/atlscrl.h | 2011 ---- plugins/SmartAutoReplier/wtl/atlsplit.h | 917 -- plugins/SmartAutoReplier/wtl/atltheme.h | 1218 --- plugins/SmartAutoReplier/wtl/atluser.h | 1391 --- plugins/SmartAutoReplier/wtl/atlwince.h | 2987 ------ plugins/SmartAutoReplier/wtl/atlwinx.h | 525 - 125 files changed, 78664 deletions(-) delete mode 100644 plugins/SmartAutoReplier/ActionsHandler.cpp delete mode 100644 plugins/SmartAutoReplier/ActionsHandler.h delete mode 100644 plugins/SmartAutoReplier/AggressiveOptimize.h delete mode 100644 plugins/SmartAutoReplier/Crc32Static.cpp delete mode 100644 plugins/SmartAutoReplier/Crc32Static.h delete mode 100644 plugins/SmartAutoReplier/CrushLog.cpp delete mode 100644 plugins/SmartAutoReplier/CrushLog.h delete mode 100644 plugins/SmartAutoReplier/GUI/AddRuleDlg.cpp delete mode 100644 plugins/SmartAutoReplier/GUI/AddRuleDlg.h delete mode 100644 plugins/SmartAutoReplier/GUI/EditReplyDlg.cpp delete mode 100644 plugins/SmartAutoReplier/GUI/EditReplyDlg.h delete mode 100644 plugins/SmartAutoReplier/GUI/OptionsDlg.cpp delete mode 100644 plugins/SmartAutoReplier/GUI/OptionsDlg.h delete mode 100644 plugins/SmartAutoReplier/GUI/SelectUserDlg.cpp delete mode 100644 plugins/SmartAutoReplier/GUI/SelectUserDlg.h delete mode 100644 plugins/SmartAutoReplier/GUI/SettingsDlgHolder.cpp delete mode 100644 plugins/SmartAutoReplier/GUI/SettingsDlgHolder.h delete mode 100644 plugins/SmartAutoReplier/Interfaces/ISettings.h delete mode 100644 plugins/SmartAutoReplier/Interfaces/ISingletone.h delete mode 100644 plugins/SmartAutoReplier/LuaBridge.cpp delete mode 100644 plugins/SmartAutoReplier/LuaBridge.h delete mode 100644 plugins/SmartAutoReplier/LuaScript.cpp delete mode 100644 plugins/SmartAutoReplier/LuaScript.h delete mode 100644 plugins/SmartAutoReplier/MessagesHandler.cpp delete mode 100644 plugins/SmartAutoReplier/MessagesHandler.h delete mode 100644 plugins/SmartAutoReplier/ModeMessHandler.cpp delete mode 100644 plugins/SmartAutoReplier/ModeMessHandler.h delete mode 100644 plugins/SmartAutoReplier/RuleItem.h delete mode 100644 plugins/SmartAutoReplier/RulesStorage.cpp delete mode 100644 plugins/SmartAutoReplier/RulesStorage.h delete mode 100644 plugins/SmartAutoReplier/SAR.cpp delete mode 100644 plugins/SmartAutoReplier/SAR.rc delete mode 100644 plugins/SmartAutoReplier/SAR.vcxproj delete mode 100644 plugins/SmartAutoReplier/SAR.vcxproj.filters delete mode 100644 plugins/SmartAutoReplier/SarLuaScript.cpp delete mode 100644 plugins/SmartAutoReplier/SarLuaScript.h delete mode 100644 plugins/SmartAutoReplier/ScriptsReader.cpp delete mode 100644 plugins/SmartAutoReplier/ScriptsReader.h delete mode 100644 plugins/SmartAutoReplier/SettingsHandler.cpp delete mode 100644 plugins/SmartAutoReplier/SettingsHandler.h delete mode 100644 plugins/SmartAutoReplier/comfunc.cpp delete mode 100644 plugins/SmartAutoReplier/comfunc.h delete mode 100644 plugins/SmartAutoReplier/comlogging.h delete mode 100644 plugins/SmartAutoReplier/luainc.h delete mode 100644 plugins/SmartAutoReplier/lualib/ReadMe.txt delete mode 100644 plugins/SmartAutoReplier/lualib/lapi.c delete mode 100644 plugins/SmartAutoReplier/lualib/lapi.h delete mode 100644 plugins/SmartAutoReplier/lualib/lauxlib.c delete mode 100644 plugins/SmartAutoReplier/lualib/lauxlib.h delete mode 100644 plugins/SmartAutoReplier/lualib/lbaselib.c delete mode 100644 plugins/SmartAutoReplier/lualib/lcode.c delete mode 100644 plugins/SmartAutoReplier/lualib/lcode.h delete mode 100644 plugins/SmartAutoReplier/lualib/ldblib.c delete mode 100644 plugins/SmartAutoReplier/lualib/ldebug.c delete mode 100644 plugins/SmartAutoReplier/lualib/ldebug.h delete mode 100644 plugins/SmartAutoReplier/lualib/ldo.c delete mode 100644 plugins/SmartAutoReplier/lualib/ldo.h delete mode 100644 plugins/SmartAutoReplier/lualib/ldump.c delete mode 100644 plugins/SmartAutoReplier/lualib/lfunc.c delete mode 100644 plugins/SmartAutoReplier/lualib/lfunc.h delete mode 100644 plugins/SmartAutoReplier/lualib/lgc.c delete mode 100644 plugins/SmartAutoReplier/lualib/lgc.h delete mode 100644 plugins/SmartAutoReplier/lualib/liolib.c delete mode 100644 plugins/SmartAutoReplier/lualib/llex.c delete mode 100644 plugins/SmartAutoReplier/lualib/llex.h delete mode 100644 plugins/SmartAutoReplier/lualib/llimits.h delete mode 100644 plugins/SmartAutoReplier/lualib/lmathlib.c delete mode 100644 plugins/SmartAutoReplier/lualib/lmem.c delete mode 100644 plugins/SmartAutoReplier/lualib/lmem.h delete mode 100644 plugins/SmartAutoReplier/lualib/loadlib.c delete mode 100644 plugins/SmartAutoReplier/lualib/lobject.c delete mode 100644 plugins/SmartAutoReplier/lualib/lobject.h delete mode 100644 plugins/SmartAutoReplier/lualib/lopcodes.c delete mode 100644 plugins/SmartAutoReplier/lualib/lopcodes.h delete mode 100644 plugins/SmartAutoReplier/lualib/lparser.c delete mode 100644 plugins/SmartAutoReplier/lualib/lparser.h delete mode 100644 plugins/SmartAutoReplier/lualib/lstate.c delete mode 100644 plugins/SmartAutoReplier/lualib/lstate.h delete mode 100644 plugins/SmartAutoReplier/lualib/lstring.c delete mode 100644 plugins/SmartAutoReplier/lualib/lstring.h delete mode 100644 plugins/SmartAutoReplier/lualib/lstrlib.c delete mode 100644 plugins/SmartAutoReplier/lualib/ltable.c delete mode 100644 plugins/SmartAutoReplier/lualib/ltable.h delete mode 100644 plugins/SmartAutoReplier/lualib/ltablib.c delete mode 100644 plugins/SmartAutoReplier/lualib/ltests.c delete mode 100644 plugins/SmartAutoReplier/lualib/ltm.c delete mode 100644 plugins/SmartAutoReplier/lualib/ltm.h delete mode 100644 plugins/SmartAutoReplier/lualib/lua.h delete mode 100644 plugins/SmartAutoReplier/lualib/luainc.h delete mode 100644 plugins/SmartAutoReplier/lualib/lualib.h delete mode 100644 plugins/SmartAutoReplier/lualib/lualib.vcxproj delete mode 100644 plugins/SmartAutoReplier/lualib/lualib.vcxproj.filters delete mode 100644 plugins/SmartAutoReplier/lualib/lundump.c delete mode 100644 plugins/SmartAutoReplier/lualib/lundump.h delete mode 100644 plugins/SmartAutoReplier/lualib/lvm.c delete mode 100644 plugins/SmartAutoReplier/lualib/lvm.h delete mode 100644 plugins/SmartAutoReplier/lualib/lzio.c delete mode 100644 plugins/SmartAutoReplier/lualib/lzio.h delete mode 100644 plugins/SmartAutoReplier/lualib/targetver.h delete mode 100644 plugins/SmartAutoReplier/resource.h delete mode 100644 plugins/SmartAutoReplier/sar.ico delete mode 100644 plugins/SmartAutoReplier/stdafx.cpp delete mode 100644 plugins/SmartAutoReplier/stdafx.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlapp.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlcrack.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlctrls.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlctrlw.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlctrlx.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlddx.h delete mode 100644 plugins/SmartAutoReplier/wtl/atldlgs.h delete mode 100644 plugins/SmartAutoReplier/wtl/atldwm.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlfind.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlframe.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlgdi.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlmisc.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlprint.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlres.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlresce.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlribbon.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlscrl.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlsplit.h delete mode 100644 plugins/SmartAutoReplier/wtl/atltheme.h delete mode 100644 plugins/SmartAutoReplier/wtl/atluser.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlwince.h delete mode 100644 plugins/SmartAutoReplier/wtl/atlwinx.h (limited to 'plugins/SmartAutoReplier') diff --git a/plugins/SmartAutoReplier/ActionsHandler.cpp b/plugins/SmartAutoReplier/ActionsHandler.cpp deleted file mode 100644 index 53bf7d2aea..0000000000 --- a/plugins/SmartAutoReplier/ActionsHandler.cpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "actionshandler.h" - -CActionsHandler::CActionsHandler(void) -{ -} - -CActionsHandler::~CActionsHandler(void) -{ -} diff --git a/plugins/SmartAutoReplier/ActionsHandler.h b/plugins/SmartAutoReplier/ActionsHandler.h deleted file mode 100644 index cb2e996111..0000000000 --- a/plugins/SmartAutoReplier/ActionsHandler.h +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -/// manager that executes actions... -class CActionsHandler -{ -public: - CActionsHandler(void); - ~CActionsHandler(void); -}; diff --git a/plugins/SmartAutoReplier/AggressiveOptimize.h b/plugins/SmartAutoReplier/AggressiveOptimize.h deleted file mode 100644 index 076d96d920..0000000000 --- a/plugins/SmartAutoReplier/AggressiveOptimize.h +++ /dev/null @@ -1,59 +0,0 @@ - -////////////////////////////// -// Version 1.10 -// Jan 23rd, 2000 -// Version 1.00 -// May 20th, 1999 -// Todd C. Wilson, Fresh Ground Software -// (todd@nopcode.com) -// This header file will kick in settings for Visual C++ 5 and 6 that will (usually) -// result in smaller exe's. -// The "trick" is to tell the compiler to not pad out the function calls; this is done -// by not using the /O1 or /O2 option - if you do, you implicitly use /Gy, which pads -// out each and every function call. In one single 500k dll, I managed to cut out 120k -// by this alone! -// The other two "tricks" are telling the Linker to merge all data-type segments together -// in the exe file. The relocation, read-only (constants) data, and code section (.text) -// sections can almost always be merged. Each section merged can save 4k in exe space, -// since each section is padded out to 4k chunks. This is very noticable with smaller -// exes, since you could have only 700 bytes of data, 300 bytes of code, 94 bytes of -// strings - padded out, this could be 12k of runtime, for 1094 bytes of stuff! -// Note that if you're using MFC static or some other 3rd party libs, you may get poor -// results with merging the readonly (.rdata) section - the exe may grow larger. -// To use this feature, define _MERGE_DATA_ in your project or before this header is used. -// With Visual C++ 5, the program uses a file alignement of 512 bytes, which results -// in a small exe. Under VC6, the program instead uses 4k, which is the same as the -// section size. The reason (from what I understand) is that 4k is the chunk size of -// the virtual memory manager, and that WinAlign (an end-user tuning tool for Win98) -// will re-align the programs on this boundary. The problem with this is that all of -// Microsoft's system exes and dlls are not tuned like this, and using 4k causes serious -// exe bloat. Very noticable for smaller programs. -// The "trick" for this is to use the undocumented FILEALIGN linker parm to change the -// padding from 4k to 1/2k, which results in a much smaller exe - anywhere from 20%-75% -// depending on the size. - - -#ifdef NDEBUG -#pragma message( "Using AggressiveOptimise" ) -// /Og (global optimizations), /Os (favor small code), /Oy (no frame pointers) -#pragma optimize("gsy",on) - -#pragma comment(linker,"/RELEASE") - -// Note that merging the .rdata section will result in LARGER exe's if you using -// MFC (esp. static link). If this is desirable, define _MERGE_RDATA_ in your project. -#ifdef _MERGE_RDATA_ -#pragma comment(linker,"/merge:.rdata=.data") -#endif // _MERGE_RDATA_ - -#pragma comment(linker,"/merge:.text=.data") -//#pragma comment(linker,"/merge:.reloc=.data") - -#if _MSC_VER >= 1000 -// Only supported/needed with VC6; VC5 already does 0x200 for release builds. -// Totally undocumented! And if you set it lower than 512 bytes, the program crashes. -// Either leave at 0x200 or 0x1000 -#pragma comment(linker,"/FILEALIGN:0x200") -#endif // _MSC_VER >= 1000 - -#endif // NDEBUG diff --git a/plugins/SmartAutoReplier/Crc32Static.cpp b/plugins/SmartAutoReplier/Crc32Static.cpp deleted file mode 100644 index 89646ec0bb..0000000000 --- a/plugins/SmartAutoReplier/Crc32Static.cpp +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "Crc32Static.h" - -// Static CRC table -DWORD CCrc32Static::s_arrdwCrc32Table[256] = -{ - 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, - 0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3, - 0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988, - 0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91, - 0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE, - 0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7, - 0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC, - 0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5, - 0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172, - 0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B, - 0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940, - 0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59, - 0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116, - 0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F, - 0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924, - 0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D, - - 0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A, - 0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433, - 0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818, - 0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01, - 0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E, - 0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457, - 0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C, - 0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65, - 0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2, - 0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB, - 0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0, - 0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9, - 0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086, - 0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F, - 0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4, - 0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD, - - 0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A, - 0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683, - 0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8, - 0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1, - 0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE, - 0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7, - 0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC, - 0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5, - 0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252, - 0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B, - 0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60, - 0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79, - 0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236, - 0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F, - 0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04, - 0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D, - - 0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A, - 0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713, - 0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38, - 0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21, - 0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E, - 0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777, - 0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C, - 0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45, - 0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2, - 0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB, - 0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0, - 0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9, - 0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6, - 0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF, - 0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94, - 0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D, -}; - -/// ctor -CCrc32Static::CCrc32Static() -{ -} - -/// dtor -CCrc32Static::~CCrc32Static() -{ -} - -/// calculating crc32 -inline void CCrc32Static::CalcCrc32(const BYTE byte, DWORD &dwCrc32) -{ - dwCrc32 = ((dwCrc32) >> 8) ^ s_arrdwCrc32Table[(byte) ^ ((dwCrc32) & 0x000000FF)]; -} - -/// getting crc32 for a string -DWORD CCrc32Static::StringCrc32(LPCTSTR szString, DWORD &dwCrc32) -{ - _ASSERTE(szString); - - DWORD dwErrorCode = NO_ERROR; - - dwCrc32 = 0xFFFFFFFF; - - try - { - while(*szString != _T('\0')) - { - CalcCrc32((BYTE)*szString, dwCrc32); - szString++; - } - } - catch(...) - { - // An unknown exception happened - dwErrorCode = ERROR_CRC; - } - - dwCrc32 = ~dwCrc32; - - return dwErrorCode; -} diff --git a/plugins/SmartAutoReplier/Crc32Static.h b/plugins/SmartAutoReplier/Crc32Static.h deleted file mode 100644 index 4039822cae..0000000000 --- a/plugins/SmartAutoReplier/Crc32Static.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -class CCrc32Static -{ -public: - CCrc32Static(); - virtual ~CCrc32Static(); - static DWORD StringCrc32(LPCTSTR szString, DWORD &dwCrc32); -protected: - static inline void CalcCrc32(const BYTE byte, DWORD &dwCrc32); - static DWORD s_arrdwCrc32Table[256]; -}; diff --git a/plugins/SmartAutoReplier/CrushLog.cpp b/plugins/SmartAutoReplier/CrushLog.cpp deleted file mode 100644 index 639e4965ff..0000000000 --- a/plugins/SmartAutoReplier/CrushLog.cpp +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "crushlog.h" -#include "shlobj.h" - -extern HINSTANCE hInst; -extern CCrushLog CRUSHLOGOBJ; - -/// init static members -TCHAR CCrushLog::m_szLogPath[MAX_PATH] = {0}; -CRITICAL_SECTION CCrushLog::m_critSect; - -/// ctor -CCrushLog::CCrushLog(void) -{/// nothing for now -BEGIN_PROTECT_AND_LOG_CODE -END_PROTECT_AND_LOG_CODE -} - -/// d'ctor -CCrushLog::~CCrushLog(void) -{ -BEGIN_PROTECT_AND_LOG_CODE -END_PROTECT_AND_LOG_CODE -} - -/// deinit internal data... -void CCrushLog::DeInit(void) -{ - DeleteCriticalSection(&m_critSect); -} - -/// init internal data... -void CCrushLog::Init(void) -{ - HRESULT hr = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, m_szLogPath); - size_t nLen = _tcslen(m_szLogPath); - - if (m_szLogPath[nLen - 1] != TEXT('\\')) - { - _tcscat(m_szLogPath, TEXT("\\Sar\\")); - } - else - { - _tcscat(m_szLogPath, TEXT("Sar\\")); - } - - CreateDirectory(m_szLogPath, NULL); - - _tcscat(m_szLogPath, LOG_FILENAME); - - /*if (_tcslen(m_szLogPath) == 0) /// let's get path to log file - { - GetModuleFileName(hInst, m_szLogPath, sizeof(m_szLogPath) * sizeof(TCHAR)); - - TCHAR *ptrPos = _tcsrchr(m_szLogPath, '\\'); - if (ptrPos) - { - ptrPos++; - _tcscpy(ptrPos, LOG_FILENAME); - } - else - { - _RPT0(_CRT_WARN, "CCrushLog::CCrushLog - unable to form path"); - } - }*/ - - InitializeCriticalSection(&m_critSect); -} - -/// provides forming data struct and saving it to log -void CCrushLog::InternalProtect(CHAR* FunctionName, CHAR* FileName, - CHAR* CompilationDate, INT LineNumber, - INT LastError) -{ - CRUSHLOG_ITEM item = {0}; - - item.CompilationDate = CompilationDate; - item.FileName = FileName; - item.FunctionName = FunctionName; - item.LineNumber = LineNumber; - item.LastError = LastError; - g_crushLog.SaveToLog(item); - - TCHAR tch[MAX_PATH * 3] = {0}; - _tcscpy(tch, TranslateTS(TEXT("Exception has occured please, analize or just send log file\n\r "))); - _tcscat(tch, CCrushLog::m_szLogPath); - _tcscat(tch, TranslateTS(TEXT("\r\n to developer."))); - - ::MessageBox (NULL, tch, TranslateTS(TEXT("Smart Auto Replier crash. Send the log file to http://shcherbyna.com/forum/viewforum.php?f=8")), MB_OK); -} - -/// saving log information -void CCrushLog::SaveToLog(CRUSHLOG_ITEM & item) -{ - EnterCriticalSection(&m_critSect); - - HANDLE hFile = NULL; - hFile = CreateFile (m_szLogPath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); - - if (hFile == INVALID_HANDLE_VALUE) - { - LeaveCriticalSection(&m_critSect); - - return; - } - - { - DWORD dwRetVal = 0; - DWORD dw = GetFileSize(hFile, &dwRetVal); - SetFilePointer(hFile, dw, NULL, FILE_BEGIN); - } - - int nSize = strlen(item.CompilationDate); - nSize += strlen(item.FileName); - nSize += strlen(item.FunctionName); - nSize *= 2; - - CHAR *tsz = new CHAR[nSize]; - - if (tsz) - { - strcpy(tsz, ("******\n")); - strcat(tsz, item.CompilationDate); - strcat(tsz, ("\n")); - strcat(tsz, item.FileName); - strcat(tsz, ("\n")); - strcat(tsz, item.FunctionName); - strcat(tsz, ("\n")); - CHAR tchtemp[MAX_PATH] = {0}; - itoa(item.LineNumber, tchtemp, 10); - strcat(tsz, tchtemp); - strcat(tsz, ("\n")); - itoa(item.LastError, tchtemp, 10); - strcat(tsz, tchtemp); - strcat(tsz, ("\n")); - DWORD dw = 0; - WriteFile (hFile, tsz, strlen(tsz), &dw, NULL); - - delete tsz; - } - - CloseHandle (hFile); - LeaveCriticalSection(&m_critSect); -} diff --git a/plugins/SmartAutoReplier/CrushLog.h b/plugins/SmartAutoReplier/CrushLog.h deleted file mode 100644 index 1a595d055b..0000000000 --- a/plugins/SmartAutoReplier/CrushLog.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -/// crash item that is written in file... -typedef struct _CRUSHLOG_ITEM -{ - CHAR* CompilationDate; /// compilation date of the source file - CHAR* FileName; /// file name where exception has occured - CHAR* FunctionName; /// function name where exception has occured - INT LineNumber; /// line number - INT LastError; /// last error -}CRUSHLOG_ITEM, *PCRUSHLOG_ITEM; - -#define LOG_FILENAME TEXT("sarcrushes.log") - -/// class that handles all crushes -/// occured between BEGIN_LOG_AND_PRO.. and END_LOG.. -class CCrushLog -{ -public: /// ctors, dtors section... - CCrushLog(void); - ~CCrushLog(void); -public: - static void Init(void); /// inits internal data.. - static void DeInit(void); /// deinits internal data.. - static void SaveToLog(CRUSHLOG_ITEM & item); /// saves data to log file - static void InternalProtect(CHAR* FunctionName, CHAR* FileName, - CHAR* CompilationDate, INT LineNumber, - INT LastError); -public: - static TCHAR m_szLogPath[MAX_PATH]; /// path to log file -private: - static CRITICAL_SECTION m_critSect; /// sync object... -}; diff --git a/plugins/SmartAutoReplier/GUI/AddRuleDlg.cpp b/plugins/SmartAutoReplier/GUI/AddRuleDlg.cpp deleted file mode 100644 index 0d76db3210..0000000000 --- a/plugins/SmartAutoReplier/GUI/AddRuleDlg.cpp +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "../resource.h" -#include "addruledlg.h" -#include "addruledlg.h" -#include "selectuserdlg.h" - -extern LPTSTR g_strPluginName; -extern CMessagesHandler *g_pMessHandler; -extern CCrushLog CRUSHLOGOBJ; - -CAddRuleDlg::CAddRuleDlg(void) : m_dwCRC32(NULL), m_baur2thisMode(false), m_bEditing(false) -{ -BEGIN_PROTECT_AND_LOG_CODE - ZeroMemory(&m_item, sizeof(m_item)); -END_PROTECT_AND_LOG_CODE -} - -CAddRuleDlg::~CAddRuleDlg(void) -{ -BEGIN_PROTECT_AND_LOG_CODE -END_PROTECT_AND_LOG_CODE -} - -LRESULT CAddRuleDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - TranslateDialogDefault(m_hWnd); - m_editRuleName = GetDlgItem(IDC_ED_RULENAME); - m_editContactName = GetDlgItem(IDC_ED_RULECNAME); - m_editReplyText = GetDlgItem(IDC_ED_RULEREPLY); - //m_editReplyAction = GetDlgItem(IDC_ED_RULEACTION); - m_btnSelUser = GetDlgItem(IDC_BTN_SELUSER); - - CenterWindow(); - - if (m_dwCRC32) - { - SetWindowText(TranslateTS(TEXT("Edit rule"))); - m_editRuleName.SetWindowText(m_item.RuleName); - m_editContactName.SetWindowText(m_item.ContactName); - m_editReplyText.SetWindowText(m_item.ReplyText); - //m_editReplyAction.SetWindowText(m_item.ReplyAction); - m_bEditing = true; - } - else if (m_baur2thisMode) - { - m_editRuleName.SetWindowText(m_item.RuleName); - m_editContactName.SetWindowText(m_item.ContactName); - m_editReplyText.SetWindowText(m_item.ReplyText); - //m_editReplyAction.SetWindowText(m_item.ReplyAction); - - m_btnSelUser.EnableWindow(FALSE); - m_editContactName.EnableWindow(FALSE); - m_editReplyText.SetSel(0, _tcslen(m_item.ReplyText), FALSE); - m_editReplyText.SetFocus(); - } - else - { - m_editRuleName.SetWindowText(SETTINGS_DEF_RULE_NAME); - m_editReplyText.SetWindowText(SETTINGS_DEF_MESSAGE_RULE); - } - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT CAddRuleDlg::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - return FALSE; -END_PROTECT_AND_LOG_CODE -} - -BOOL CAddRuleDlg::PreTranslateMessage(MSG* pMsg) -{ -BEGIN_PROTECT_AND_LOG_CODE - return FALSE; -END_PROTECT_AND_LOG_CODE -} - -LRESULT CAddRuleDlg::OnBtnOKClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE -#define ON_ERROR_1BYTE(x) if (x == 1) { \ - MessageBox(TranslateTS(TEXT("Please, specify longer contact name")), g_strPluginName, MB_OK); \ - return FALSE; } - -#define ON_ERROR(x) MessageBox(TranslateTS(x), g_strPluginName, MB_OK); \ - return FALSE; - - int nLength = m_editRuleName.GetWindowTextLength(); - if (nLength) - { - nLength++; - m_item.RuleName = new TCHAR[nLength]; - - if (m_item.RuleName != NULL) - { - memset(m_item.RuleName, 0, nLength * sizeof(TCHAR)); - m_editRuleName.GetWindowText(m_item.RuleName, nLength); - } - } - else - { - ON_ERROR(TEXT("Please, specify Rule Name")) - } - - nLength = m_editContactName.GetWindowTextLength(); - if (nLength) - { - ON_ERROR_1BYTE(nLength) - nLength++; - m_item.ContactName = new TCHAR[nLength]; - - if (m_item.ContactName != NULL) - { - memset(m_item.ContactName, 0, nLength * sizeof(TCHAR)); - m_editContactName.GetWindowText(m_item.ContactName, nLength); - } - } - else - { - ON_ERROR(TEXT("Please, specify Contact Name")) - } - - nLength = m_editReplyText.GetWindowTextLength(); - if (nLength) - { - if (nLength > SETTINGS_MESSAGE_MAXVALENGTH) - { - MessageBox(TranslateTS(TEXT("header is too big")), g_strPluginName, MB_OK); - return FALSE; - } - - nLength++; - m_item.ReplyText = new TCHAR[nLength]; - - if (m_item.ContactName != NULL) - { - memset(m_item.ReplyText, 0, nLength * sizeof(TCHAR)); - m_editReplyText.GetWindowText(m_item.ReplyText, nLength); - } - } - else - { - ON_ERROR(TEXT("Please, specify Reply Text")) - } - - { - if (m_bEditing) - {/// delete prev item from storage... - g_pMessHandler->getSettings().getStorage().RemReplyAction(m_dwCRC32); - } - - bool b; - DWORD dwCrc = g_pMessHandler->getSettings().AddReplyAction(m_item, b); - if (b) - { - MessageBox(TranslateTS(TEXT("Rule with the same contact name already exists")), g_strPluginName, MB_OK); - return FALSE; - } - - m_bAddedOk = ((b == false) && dwCrc); - m_dwCRC32 = dwCrc; - } - - EndDialog(0); -#undef ON_ERROR -#undef ON_ERROR_1BYTE -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT CAddRuleDlg::OnBtnCancelClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_bAddedOk = false; - EndDialog(0); -END_PROTECT_AND_LOG_CODE - return FALSE; -} -LRESULT CAddRuleDlg::OnBnClickedBtnSeluser(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - CSelectUserDlg dlg; - dlg.DoModal(m_hWnd); - if (dlg.m_bAllOk == true) - { - m_editContactName.SetWindowText(dlg.m_szRetVal); - m_editReplyText.SetFocus(); - } - else - { - m_editContactName.SetFocus(); - } -END_PROTECT_AND_LOG_CODE - return 0; -} diff --git a/plugins/SmartAutoReplier/GUI/AddRuleDlg.h b/plugins/SmartAutoReplier/GUI/AddRuleDlg.h deleted file mode 100644 index d02fde733c..0000000000 --- a/plugins/SmartAutoReplier/GUI/AddRuleDlg.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include -#include -#include -#include - -#include "../RuleItem.h" - -class CAddRuleDlg : public CDialogImpl, public CMessageFilter -{ -public: - CAddRuleDlg(void); - virtual ~CAddRuleDlg(void); -public: - enum {IDD = IDD_ADDRULE_DLG}; - BEGIN_MSG_MAP(COptionsDlg) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - - COMMAND_ID_HANDLER(IDOK, OnBtnOKClicked) - COMMAND_ID_HANDLER(IDCANCEL, OnBtnCancelClicked) - COMMAND_HANDLER(IDC_BTN_SELUSER, BN_CLICKED, OnBnClickedBtnSeluser) - END_MSG_MAP() -protected: - virtual BOOL PreTranslateMessage(MSG* pMsg); - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnBtnOKClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnBtnCancelClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnBnClickedBtnSeluser(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); -protected: - CEdit m_editRuleName; - CEdit m_editContactName; - CEdit m_editReplyText; - //CEdit m_editReplyAction; - CButton m_btnSelUser; -public: - RULE_ITEM m_item; - bool m_bAddedOk; - DWORD m_dwCRC32; -private: - bool m_bEditing; -public: - bool m_baur2thisMode; -}; diff --git a/plugins/SmartAutoReplier/GUI/EditReplyDlg.cpp b/plugins/SmartAutoReplier/GUI/EditReplyDlg.cpp deleted file mode 100644 index 5dbc6989bc..0000000000 --- a/plugins/SmartAutoReplier/GUI/EditReplyDlg.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "editreplydlg.h" - -extern LPTSTR g_strPluginName; - -CEditReplyDlg::CEditReplyDlg(void) -{ -} - -CEditReplyDlg::~CEditReplyDlg(void) -{ -} - -BOOL CEditReplyDlg::PreTranslateMessage(MSG* pMsg) -{ - return IsDialogMessage(pMsg); -} - -LRESULT CEditReplyDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ - TranslateDialogDefault(m_hWnd); - m_editReplyText = GetDlgItem(IDC_ED_TEXT); - - if (m_commRule.Message) - { - m_editReplyText.SetWindowText(m_commRule.Message); - } - - CenterWindow(GetDesktopWindow()); - - return FALSE; -} - -LRESULT CEditReplyDlg::OnBtnOKClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - int nLength = 0; - - delete m_commRule.Message; - - nLength = m_editReplyText.GetWindowTextLength(); - - if (nLength > SETTINGS_MESSAGE_MAXVALENGTH) - { - MessageBox(TranslateTS(TEXT("message is too big")), g_strPluginName, MB_OK); - - return FALSE; - } - nLength++; - m_commRule.Message = new TCHAR[nLength]; - - if (!m_commRule.Message) - return FALSE; - - memset(m_commRule.Message, 0, nLength * sizeof(TCHAR)); - m_editReplyText.GetWindowText((LPTSTR)m_commRule.Message, nLength); - - m_bAllOk = true; - EndDialog(1); - return FALSE; -} - -LRESULT CEditReplyDlg::OnBtnCancelClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ - m_bAllOk = false; - EndDialog(0); - return FALSE; -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/GUI/EditReplyDlg.h b/plugins/SmartAutoReplier/GUI/EditReplyDlg.h deleted file mode 100644 index 0b4a5fb94a..0000000000 --- a/plugins/SmartAutoReplier/GUI/EditReplyDlg.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "..\resource.h" - -#include -#include -#include -#include - -class CEditReplyDlg : public CDialogImpl, public CMessageFilter -{ -public: - CEditReplyDlg(void); - ~CEditReplyDlg(void); -public: - enum {IDD = IDD_SET_AURMESSAGEDLG}; - BEGIN_MSG_MAP(CEditReplyDlg) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_ID_HANDLER(IDOK, OnBtnOKClicked) - COMMAND_ID_HANDLER(IDCANCEL, OnBtnCancelClicked) - END_MSG_MAP() -protected: - virtual BOOL PreTranslateMessage(MSG* pMsg); - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnBtnOKClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnBtnCancelClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); -public: - REPLYER_SETTINGS m_settings; - COMMON_RULE_ITEM m_commRule; - bool m_bAllOk; -protected: - CEdit m_editReplyText; - CEdit m_editReplyHeader; -}; diff --git a/plugins/SmartAutoReplier/GUI/OptionsDlg.cpp b/plugins/SmartAutoReplier/GUI/OptionsDlg.cpp deleted file mode 100644 index 1f25812101..0000000000 --- a/plugins/SmartAutoReplier/GUI/OptionsDlg.cpp +++ /dev/null @@ -1,528 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "optionsdlg.h" -#include "addruledlg.h" - -/// need ptr to get/set info -extern CMessagesHandler *g_pMessHandler; -extern CCrushLog CRUSHLOGOBJ; -extern LPTSTR g_strPluginName; - -//COptionsDlg g_optionsDlg; - -BOOL CALLBACK COptionsDlg::DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ -BEGIN_PROTECT_AND_LOG_CODE - - /*if (g_optionsDlg.m_bDestroying) - return FALSE; - - if (g_optionsDlg.m_hWnd == NULL) - g_optionsDlg.Attach(hwndDlg); - - LRESULT lre = {0}; - DWORD dwId = {0}; - return g_optionsDlg.ProcessWindowMessage(hwndDlg, msg, wParam, lParam, lre, dwId);*/ - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -COptionsDlg::COptionsDlg(void) : m_bShown(false), m_szMessage(NULL) -{ -BEGIN_PROTECT_AND_LOG_CODE -///g_optionsDlg.m_bDestroying = false; -m_bDestroying = false; -END_PROTECT_AND_LOG_CODE -} - -COptionsDlg::~COptionsDlg(void) -{ -BEGIN_PROTECT_AND_LOG_CODE -END_PROTECT_AND_LOG_CODE -} - -BOOL COptionsDlg::PreTranslateMessage(MSG* pMsg) -{ -BEGIN_PROTECT_AND_LOG_CODE - return ::IsDialogMessage(m_hWnd, pMsg); -END_PROTECT_AND_LOG_CODE -} - -/// process OnInitDialog -LRESULT COptionsDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - TranslateDialogDefault(m_hWnd); - - if (!g_pMessHandler) - return FALSE; - - m_listRules = GetDlgItem(IDC_LIST_RULES); - m_editReplayDelay = GetDlgItem(IDC_EDIT_REPLAYDELAY); -// m_editHeaderMessage = GetDlgItem(IDC_EDIT_HEADER); - m_editMessageText = GetDlgItem(IDC_EDIT_MESSAGE); - m_btnAdd = GetDlgItem(IDC_BTN_ADDRULE); - m_btnDel = GetDlgItem(IDC_BTN_DELRULE); - m_btnChange = GetDlgItem(IDC_BTN_EDITRULE); - m_wndCheckDOnSOn = GetDlgItem(IDC_CHECK_DISABLEWMON); - m_wndCheckModeTypes = GetDlgItem(IDC_CH_ENABLE_WSCH); - m_cbModeTypes = GetDlgItem(IDC_CB_ENWSC); - m_chbShowAurWhmc = GetDlgItem(IDC_CH_SHOWCG); - m_cbDisWMBTypes = GetDlgItem(IDC_CB_DWSB); - m_chDisWMB = GetDlgItem(IDC_CH_DISWHSB); - m_chSaveAURSToHist = GetDlgItem(IDC_CH_SAVE_AURS); - - m_cbModeTypes.AddString(TranslateTS(TEXT("DND/NA/Away/Occupied modes"))); - m_cbModeTypes.AddString(TranslateTS(TEXT("DND mode"))); - m_cbModeTypes.AddString(TranslateTS(TEXT("NA mode"))); - m_cbModeTypes.AddString(TranslateTS(TEXT("Away mode"))); - m_cbModeTypes.AddString(TranslateTS(TEXT("Occupied mode"))); - - m_cbDisWMBTypes.AddString(TranslateTS(TEXT("Online/Free for chat modes"))); - m_cbDisWMBTypes.AddString(TranslateTS(TEXT("Online mode"))); - m_cbDisWMBTypes.AddString(TranslateTS(TEXT("Free for chat mode"))); - - COMMON_RULE_ITEM & commRules = g_pMessHandler->getSettings().getStorage().getCommonRule(); - REPLYER_SETTINGS & settings = g_pMessHandler->getSettings().getSettings(); - - if (settings.ModeValue > m_cbModeTypes.GetCount()) - m_cbModeTypes.SetCurSel(0); - else - m_cbModeTypes.SetCurSel(settings.ModeValue); - if (settings.ModeDisValue > m_cbDisWMBTypes.GetCount()) - m_cbDisWMBTypes.SetCurSel(0); - else - m_cbDisWMBTypes.SetCurSel(settings.ModeDisValue); - - m_cbDisWMBTypes.EnableWindow(settings.bDisableWhenModeIsSet); - - if (settings.bDisableWhenModeIsSet) - { - m_chDisWMB.SendMessage(BM_SETCHECK, BST_CHECKED, 0); - } - else - { - m_chDisWMB.SendMessage(BM_SETCHECK, BST_UNCHECKED, 0); - } - - if (settings.bShowAURDlgWhenModeChanges) - { - m_chbShowAurWhmc.SendMessage(BM_SETCHECK, BST_CHECKED, 0); - } - else - { - m_chbShowAurWhmc.SendMessage(BST_UNCHECKED, BST_CHECKED, 0); - } - - if (settings.bEnableWhenModeIsSet) - { - m_wndCheckModeTypes.SendMessage(BM_SETCHECK, BST_CHECKED, 0); - } - else - { - m_wndCheckModeTypes.SendMessage(BST_UNCHECKED, BST_CHECKED, 0); - } - - if (settings.bSaveToHistory) - { - m_chSaveAURSToHist.SendMessage(BM_SETCHECK, BST_CHECKED, 0); - } - else - { - m_chSaveAURSToHist.SendMessage(BST_UNCHECKED, BST_CHECKED, 0); - } - - m_cbModeTypes.EnableWindow(settings.bEnableWhenModeIsSet); - - int nLength = settings.ReplayDelay; - if (nLength == 0) - nLength = SETTINGS_DEF_COMMON_VALREPDELAY; - - if (settings.bDisableWhenMirandaIsOn) - m_wndCheckDOnSOn.SendMessage(BM_SETCHECK, BST_CHECKED, 0); - else - m_wndCheckDOnSOn.SendMessage(BM_SETCHECK, BST_UNCHECKED, 0); - - TCHAR strNumber[MAX_PATH] = {0}; - m_editReplayDelay.SetWindowText(_itot(nLength, strNumber, 10)); - m_nReplayDelay = nLength; - - TCHAR* str = commRules.Message; - m_editMessageText.SetWindowText(str); - - if (m_szMessage) - { - delete m_szMessage; - m_szMessage = NULL; - } - - m_szMessage = new TCHAR[SETTINGS_MESSAGE_MAXVALENGTH]; - - if (!m_szMessage) - return FALSE; - - memset(m_szMessage, 0, SETTINGS_MESSAGE_MAXVALENGTH * sizeof(TCHAR)); - - m_editMessageText.GetWindowText(m_szMessage, SETTINGS_MESSAGE_MAXVALENGTH); - - { /// filling listbox with rule names... - RulesHash::iterator it; - RulesHash & hash = g_pMessHandler->getSettings().getStorage().getHashTable(); - int nPos = 0; - - bool bAdded = false; - for (it = hash.begin(); it != hash.end(); it++) - { - nPos = m_listRules.AddString(it->second.RuleName); - if (nPos != -1) - { - m_listRules.SetItemData(nPos, it->first); - if (!bAdded) - bAdded = true; - } - } - if (bAdded) - { - OnSetSelInRulesList(0); - } - } -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -/// process WM_DESTROY -LRESULT COptionsDlg::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_bDestroying = true; - ///g_optionsDlg.m_bDestroying = true; - ///::DestroyWindow(m_hWnd); - ///g_optionsDlg.m_hWnd = NULL; - //m_hWnd = NULL; - m_szMessage = NULL; - // m_bDestroying = false; - ///g_optionsDlg.m_bDestroying = false; - return FALSE; -END_PROTECT_AND_LOG_CODE -} - -void COptionsDlg::OnNotifyAboutChanges(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - SendMessage(m_hwndHolder, PSM_CHANGED, 0, 0); -END_PROTECT_AND_LOG_CODE -} - -/// handler of typing in replay delay edit box -LRESULT COptionsDlg::OnEditReply(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - if (m_bShown) - { - m_bShown = false; - return FALSE; - } - TCHAR tch[MAX_PATH] = {0}; - GetDlgItemText (IDC_EDIT_REPLAYDELAY, tch, sizeof(tch)); - int nValue = _tstoi(tch); - - if (nValue != m_nReplayDelay) - { - m_nReplayDelay = nValue; - OnNotifyAboutChanges(); - } - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - switch (((LPNMHDR)lParam)->code) - { - case PSN_APPLY: - { /// apply our changes... - REPLYER_SETTINGS sett; - COMMON_RULE_ITEM commrule; - - commrule.Message = m_szMessage; - - sett.bEnabled = g_pMessHandler->getSettings().getSettings().bEnabled; - sett.ReplayDelay = m_nReplayDelay; - - LRESULT lres = m_wndCheckDOnSOn.SendMessage(BM_GETCHECK, 0, 0); - sett.bDisableWhenMirandaIsOn = (lres == BST_CHECKED); - lres = m_wndCheckModeTypes.SendMessage(BM_GETCHECK, 0, 0); - sett.bEnableWhenModeIsSet = (lres == BST_CHECKED); - lres = m_chbShowAurWhmc.SendMessage(BM_GETCHECK, 0, 0); - sett.bShowAURDlgWhenModeChanges = (lres == BST_CHECKED); - lres = m_chSaveAURSToHist.SendMessage(BM_GETCHECK, 0, 0); - sett.bSaveToHistory = (lres == BST_CHECKED); - sett.ModeValue = m_cbModeTypes.GetCurSel(); - lres = m_chDisWMB.SendMessage(BM_GETCHECK, 0, 0); - sett.bDisableWhenModeIsSet = (lres == BST_CHECKED); - sett.ModeDisValue = m_cbDisWMBTypes.GetCurSel(); - - CSettingsHandler & handler = g_pMessHandler->getSettings(); - handler.setSettings(sett, &commrule); - //handler.getStorage().Flush(); /// flush all unflushed rules into hdd - } - } - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnEditHeader(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnEditMessage(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - if (!m_szMessage) - return FALSE; - - int nLength = m_editMessageText.GetWindowTextLength(); - - if (nLength > SETTINGS_MESSAGE_MAXVALENGTH) - { - MessageBox(TranslateTS(TEXT("too big size")), g_strPluginName, MB_OK); - m_editMessageText.SetWindowText(m_szMessage); - - return FALSE; - } - nLength++; - LPTSTR str2 = new TCHAR[nLength]; - - if (!str2) - return FALSE; - - memset(str2, 0, nLength * sizeof(TCHAR)); - m_editMessageText.GetWindowText(str2, nLength); - - if (_tcscmp(m_szMessage, str2) != 0) - { - _tcscpy(m_szMessage, str2); - OnNotifyAboutChanges(); - } - - delete str2; -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -void COptionsDlg::OnSetSelInRulesList(int nIndex) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_listRules.SetCurSel(nIndex); - BOOL b; - OnListBoxSelChanged(0, 0, 0, b); -END_PROTECT_AND_LOG_CODE -} - -LRESULT COptionsDlg::OnBtnAddRuleClick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - CAddRuleDlg dlg; - dlg.DoModal(m_hWnd, 0); - if (dlg.m_bAddedOk) - { - int npos = m_listRules.AddString(dlg.m_item.RuleName); - if (npos != -1) - { - m_listRules.SetItemData(npos, dlg.m_dwCRC32); - OnSetSelInRulesList(npos); - OnNotifyAboutChanges(); - } - } -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnBtnEditRuleClick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - int nIndex = m_listRules.GetCurSel(); - if (nIndex >= 0) - { - DWORD dwCrc32 = static_cast(m_listRules.GetItemData(nIndex)); - if (dwCrc32) - { - CAddRuleDlg dlgEdit; - RulesHash::iterator it; - RulesHash & hash = g_pMessHandler->getSettings().getStorage().getHashTable(); - it = hash.find(dwCrc32); - if (it != hash.end()) - { - dlgEdit.m_item = it->second; - dlgEdit.m_dwCRC32 = dwCrc32; - dlgEdit.DoModal(); - if (dlgEdit.m_bAddedOk) - {/// the rule is edited... - m_listRules.DeleteString(nIndex); - nIndex = m_listRules.AddString(dlgEdit.m_item.RuleName); - m_listRules.SetItemData(nIndex, dlgEdit.m_dwCRC32); - OnSetSelInRulesList(nIndex); - OnNotifyAboutChanges(); - } - } - } - } -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnBtnDeleteRuleClick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - int nIndex = m_listRules.GetCurSel(); - if (nIndex >= 0) - { - DWORD dwptr = static_cast(m_listRules.GetItemData(nIndex)); - if (dwptr)/// we have ptr - { - if (MessageBox(TranslateTS(TEXT("Do you really want delete selected rule ?")), g_strPluginName, MB_YESNO) == IDNO) - return FALSE; - - CRulesStorage & hash = g_pMessHandler->getSettings().getStorage(); - - if (hash.RemReplyAction(dwptr)) - {/// we found item in storage list... - int nCount = m_listRules.DeleteString(nIndex); - if (nCount != LB_ERR) - { /// set sel to prev one - if (nIndex == 0 && nCount) - OnSetSelInRulesList(0); - else - if ( (nIndex - 1) <= nCount) - { - OnSetSelInRulesList(nIndex - 1); - } - } - - OnNotifyAboutChanges(); - } - } - } - - BOOL b; - OnListBoxSelChanged(0, 0, 0, b); - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnListBoxSelChanged(WORD wParam, WORD w2Param, HWND hwnd, BOOL & bHandled) -{ -BEGIN_PROTECT_AND_LOG_CODE - int nCount = m_listRules.GetCurSel(); - //m_btnChange.EnableWindow((nCount >= 0)); - BOOL bEnable = (nCount >= 0); - m_btnDel.EnableWindow(bEnable); - m_btnChange.EnableWindow(bEnable); - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnBnClickedCheck(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - OnNotifyAboutChanges(); - - return FALSE; -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnBnCheckEnableWhenModeIsOn(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - LRESULT lres = m_wndCheckModeTypes.SendMessage(BM_GETCHECK, 0, 0); - m_cbModeTypes.EnableWindow(lres == BST_CHECKED); - OnNotifyAboutChanges(); -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnCbnSelchangeCbEnwsc(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - OnNotifyAboutChanges(); - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnCheckSaveToHistory(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - OnNotifyAboutChanges(); -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnBnCheckDisableWhenModeIsOn(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - LRESULT lres = m_chDisWMB.SendMessage(BM_GETCHECK, 0, 0); - m_cbDisWMBTypes.EnableWindow(lres == BST_CHECKED); - OnNotifyAboutChanges(); - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnCbnSelchangeCbDisnwsc(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - OnNotifyAboutChanges(); - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -/// options are changed in another place... -/// so just update them all... -LRESULT COptionsDlg::OnRefreshOptions(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - MessageBox (TranslateTS(TEXT("Options are changed in another dialog")), g_strPluginName, MB_OK); - ///OnNotifyAboutChanges(); -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT COptionsDlg::OnLbnDblclkListRules(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) -{ -BEGIN_PROTECT_AND_LOG_CODE - return OnBtnEditRuleClick(wNotifyCode, wID, hWndCtl, bHandled); -END_PROTECT_AND_LOG_CODE -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/GUI/OptionsDlg.h b/plugins/SmartAutoReplier/GUI/OptionsDlg.h deleted file mode 100644 index 0e2e91f191..0000000000 --- a/plugins/SmartAutoReplier/GUI/OptionsDlg.h +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -/// #warning: redeclaring....quick programming ;) -/// look at stdafx.h -#ifndef REFRESH_OPTS_MSG - #define REFRESH_OPTS_MSG WM_USER + 666 -#endif - -#include -#include -#include -#include -#include - -/// here is a wrapper on options dlg -class COptionsDlg : public CDialogImpl, public CMessageFilter -{ -public: - COptionsDlg(void); - virtual ~COptionsDlg(void); -public: - enum {IDD = IDD_OPTIONS}; - BEGIN_MSG_MAP(COptionsDlg) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_HANDLER(WM_NOTIFY, OnNotify) - MESSAGE_HANDLER(REFRESH_OPTS_MSG, OnRefreshOptions) - COMMAND_ID_HANDLER(IDC_BTN_ADDRULE, OnBtnAddRuleClick) - COMMAND_ID_HANDLER(IDC_BTN_DELRULE, OnBtnDeleteRuleClick) - COMMAND_ID_HANDLER(IDC_BTN_EDITRULE, OnBtnEditRuleClick) - COMMAND_ID_HANDLER(IDC_EDIT_REPLAYDELAY, OnEditReply) - COMMAND_ID_HANDLER(IDC_EDIT_HEADER, OnEditHeader) - COMMAND_ID_HANDLER(IDC_EDIT_MESSAGE, OnEditMessage) - COMMAND_CODE_HANDLER(LBN_SELCHANGE, OnListBoxSelChanged) - COMMAND_HANDLER(IDC_LIST_RULES, LBN_DBLCLK, OnLbnDblclkListRules) - COMMAND_HANDLER(IDC_CHECK_DISABLEWMON, BN_CLICKED, OnBnClickedCheck) - COMMAND_HANDLER(IDC_CH_ENABLE_WSCH, BN_CLICKED, OnBnCheckEnableWhenModeIsOn) - COMMAND_HANDLER(IDC_CH_SHOWCG, BN_CLICKED, OnBnCheckEnableWhenModeIsOn) - COMMAND_HANDLER(IDC_CH_SAVE_AURS, BN_CLICKED, OnCheckSaveToHistory) - COMMAND_HANDLER(IDC_CB_ENWSC, CBN_SELENDOK, OnCbnSelchangeCbEnwsc) - COMMAND_HANDLER(IDC_CH_DISWHSB, BN_CLICKED, OnBnCheckDisableWhenModeIsOn) - COMMAND_HANDLER(IDC_CB_DWSB, CBN_SELENDOK, OnCbnSelchangeCbDisnwsc) - END_MSG_MAP() - virtual BOOL PreTranslateMessage(MSG* pMsg); -protected: - /// messages handlers prototypes - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnRefreshOptions(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - - /// commands handlers prototypes - LRESULT OnBtnAddRuleClick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnBtnDeleteRuleClick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnBtnEditRuleClick(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnEditReply(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnEditHeader(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnEditMessage(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnListBoxSelChanged(WORD wParam, WORD wParam2, HWND hwnd, BOOL & bHandled); - LRESULT OnBnClickedCheck(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnBnCheckEnableWhenModeIsOn(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnCbnSelchangeCbEnwsc(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnBnCheckDisableWhenModeIsOn(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnCheckSaveToHistory(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnCbnSelchangeCbDisnwsc(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnLbnDblclkListRules(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); -public: - static BOOL CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -private: - void OnNotifyAboutChanges(void); - void OnSetSelInRulesList(int nIndex); -protected: - CEdit m_editReplayDelay; /// edit box where reply delay is specifyed - CEdit m_editMessageText; /// edit box where message text is specifyed - CListBox m_listRules; /// list box where all rules are specifyed - CButton m_btnAdd; /// button add rule - CButton m_btnDel; /// button delete rule - CButton m_btnChange; /// button change rule - CWindow m_wndCheckDOnSOn; /// checkbox that specifyes dis of plug. when mir is on - CComboBox m_cbModeTypes; /// cb mode types - CWindow m_wndCheckModeTypes; /// ch mode types - CWindow m_chbShowAurWhmc; /// ch show edit reply message - CWindow m_chDisWMB; /// ch disable when mode becomes... - CWindow m_chSaveAURSToHist; /// save aurs to history - CComboBox m_cbDisWMBTypes; /// cb disable when mode becomes... -private: - LPTSTR m_szMessage; - int m_nReplayDelay; - bool m_bDestroying; -protected: - bool m_bShown; -public: - HWND m_hwndHolder; -}; - -/// here is static dlg proc for options dialog.. -/// very bad but mirand can accept only this function -BOOL CALLBACK DlgProcCluiOpts(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); \ No newline at end of file diff --git a/plugins/SmartAutoReplier/GUI/SelectUserDlg.cpp b/plugins/SmartAutoReplier/GUI/SelectUserDlg.cpp deleted file mode 100644 index 6a51ccae19..0000000000 --- a/plugins/SmartAutoReplier/GUI/SelectUserDlg.cpp +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "selectuserdlg.h" -#include "selectuserdlg.h" - -extern LPTSTR g_strPluginName; -extern CMessagesHandler * g_pMessHandler; - - -CSelectUserDlg::CSelectUserDlg(void) : m_bAllOk(false) -{ -} - -CSelectUserDlg::~CSelectUserDlg(void) -{ -} - -BOOL CSelectUserDlg::PreTranslateMessage(MSG* pMsg) -{ - return IsDialogMessage(pMsg); -} - -LRESULT CSelectUserDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - TranslateDialogDefault(m_hWnd); - m_listUsers = GetDlgItem(IDC_LIST_USERS); - RebuildCL(); -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -void CSelectUserDlg::RebuildCL() -{ -BEGIN_PROTECT_AND_LOG_CODE - HANDLE hContact= reinterpret_cast (CallService(MS_DB_CONTACT_FINDFIRST, 0, 0)); - TCHAR* szContactName = NULL; - TCHAR* szProto = NULL; - DWORD wId = 0; - while (hContact != NULL) - { - szContactName = g_pMessHandler->GetContactName(hContact); - szProto = (TCHAR*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); - if (szProto) - { - size_t nPos = -1; - if (szContactName) - { - nPos = m_listUsers.AddString(szContactName); - } - - /*DBVARIANT db = {0}; - DBGetContactSetting(hContact, szProto, "uin", &db); - DBGetContactSetting(hContact, szProto, "UIN", &db);*/ - //m_listUsers.SetItemData(nPos, ) - } - - hContact = reinterpret_cast (CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM) hContact, 0)); - } -END_PROTECT_AND_LOG_CODE -} - -LRESULT CSelectUserDlg::OnBtnOKClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - INT nsel = m_listUsers.GetCurSel(); - m_bAllOk = (nsel != -1); - if (m_bAllOk == true) - { - m_listUsers.GetText(nsel, m_szRetVal); - EndDialog(0); - } -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT CSelectUserDlg::OnBtnCancelClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_bAllOk = false; - EndDialog(0); -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT CSelectUserDlg::OnLbnDblclkListUsers(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled) -{ - return OnBtnOKClicked(wNotifyCode, wID, hWndCtl, bHandled); -} diff --git a/plugins/SmartAutoReplier/GUI/SelectUserDlg.h b/plugins/SmartAutoReplier/GUI/SelectUserDlg.h deleted file mode 100644 index 1756e7a4b8..0000000000 --- a/plugins/SmartAutoReplier/GUI/SelectUserDlg.h +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "..\resource.h" - -#include -#include -#include -#include - -class CSelectUserDlg : public CDialogImpl, public CMessageFilter -{ -public: - CSelectUserDlg(void); - ~CSelectUserDlg(void); -public: - enum {IDD = IDD_SEL_USER}; - BEGIN_MSG_MAP(CSelectUserDlg) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_ID_HANDLER(IDOK, OnBtnOKClicked) - COMMAND_ID_HANDLER(IDCANCEL, OnBtnCancelClicked) - COMMAND_HANDLER(IDC_LIST_USERS, LBN_DBLCLK, OnLbnDblclkListUsers) - END_MSG_MAP() -protected: - virtual BOOL PreTranslateMessage(MSG* pMsg); - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnBtnOKClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); - LRESULT OnBtnCancelClicked(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); -private: - void RebuildCL(); -public: - bool m_bAllOk; - TCHAR m_szRetVal[MAX_PATH]; -protected: - CListBox m_listUsers; -public: - LRESULT OnLbnDblclkListUsers(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/); -}; diff --git a/plugins/SmartAutoReplier/GUI/SettingsDlgHolder.cpp b/plugins/SmartAutoReplier/GUI/SettingsDlgHolder.cpp deleted file mode 100644 index 4a9eae542a..0000000000 --- a/plugins/SmartAutoReplier/GUI/SettingsDlgHolder.cpp +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "settingsdlgholder.h" - -/// #warning -/// dont make Translate each time -/// instead once fill list of translated strings -/// and use them - -extern LPTSTR g_strPluginName; -extern CMessagesHandler * g_pMessHandler; -CSettingsDlgHolder * CSettingsDlgHolder::m_pThis = NULL; - -CSettingsDlgHolder::CSettingsDlgHolder(void) : -IMSingeltone(this), -m_bTabSelected(false), -m_bDestroying(false) -{ -} - -CSettingsDlgHolder::~CSettingsDlgHolder(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - BOOL b; - OnDestroy(NULL, NULL, NULL, b); -END_PROTECT_AND_LOG_CODE -} - -BOOL CSettingsDlgHolder::PreTranslateMessage(MSG* pMsg) -{ - return IsDialogMessage(pMsg); -} - -LRESULT CSettingsDlgHolder::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - TranslateDialogDefault(m_hWnd); - - m_tabCtrl = GetDlgItem(IDC_TABSHOLDER); - m_statusMsg = GetDlgItem(IDC_STATUSMSG); - - TCITEM ti = {0}; - ti.mask = TCIF_TEXT; - ti.pszText = TranslateTS(TEXT("General")); - ti.cchTextMax = _tcslen(ti.pszText); - m_tabCtrl.InsertItem(0, &ti); - /*ti.pszText = Translate("About"); - ti.cchTextMax = _tcslen(ti.pszText); - m_tabCtrl.InsertItem(1, &ti);*/ - - m_generalOpt.Create(m_tabCtrl, NULL); - m_generalOpt.m_hwndHolder = this->m_hWnd; - m_tabCtrl.SetCurSel(0); - - /// #warning - /// copy paste from OnNotify(), fix later - /*m_statusMsg.SetWindowText(Translate("General options, provides basic functionality."));*/ - m_statusMsg.SetWindowText(TranslateTS(TEXT(""))); - m_generalOpt.SetWindowPos(NULL, 7, 23, NULL, NULL, SWP_NOSIZE); - m_generalOpt.ShowWindow(SW_SHOW); - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -void CSettingsDlgHolder::OnNotifyParents(LPNMHDR lpnmhdr, int nCode) -{ -BEGIN_PROTECT_AND_LOG_CODE - lpnmhdr->code = nCode; - m_generalOpt.SendMessage(WM_NOTIFY, 0, reinterpret_cast(lpnmhdr)); -END_PROTECT_AND_LOG_CODE -} - -LRESULT CSettingsDlgHolder::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - LPNMHDR lpnmhdr = NULL; - lpnmhdr = (LPNMHDR)lParam; - if (lpnmhdr == NULL) - { - return FALSE; - } - - if (m_bTabSelected == false) - { - m_bTabSelected = true; - return FALSE; - } - - switch (lpnmhdr->code) - { - case PSN_APPLY: - OnNotifyParents(lpnmhdr, PSN_APPLY); - break; - } - - int nSel = -1; - if (lpnmhdr->hwndFrom == m_tabCtrl) - { - nSel = m_tabCtrl.GetCurSel(); - /// let's make a switch by dialogs... - if (nSel == 0) - { - m_statusMsg.SetWindowText(TranslateTS(TEXT("General options, provides basic functionality."))); - m_generalOpt.ShowWindow(SW_SHOW); - m_generalOpt.SetWindowPos(NULL, 7, 23, NULL, NULL, SWP_NOSIZE); - } - else - m_generalOpt.ShowWindow(SW_HIDE); - } - - m_bTabSelected = false; - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -BOOL CALLBACK CSettingsDlgHolder::FakeDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) -{ -BEGIN_PROTECT_AND_LOG_CODE - CSettingsDlgHolder *pHandler = CSettingsDlgHolder::GetObject(); - - if (pHandler == NULL) - return FALSE; - - if (pHandler->m_bDestroying == true) - return FALSE; - - if (pHandler->m_hWnd == NULL) - pHandler->Attach(hwndDlg); - - LRESULT lr = 0; - DWORD dwid = 0; - BOOL bRetVal = pHandler->ProcessWindowMessage(hwndDlg, msg, wParam, lParam, lr, dwid); - return bRetVal; - END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT CSettingsDlgHolder::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_bDestroying = true; - - if (m_tabCtrl.IsWindow()) - { - m_tabCtrl.DeleteAllItems(); - m_tabCtrl.DestroyWindow(); - } - if (m_statusMsg.IsWindow()) - m_statusMsg.DestroyWindow(); - - if (m_generalOpt.IsWindow()) - { - /*try - {*/ - //OSVERSIONINFO ver = {0}; - //ver.dwOSVersionInfoSize = sizeof(ver); - - //if (GetVersionEx(&ver) == TRUE) - //{ - // if (ver.dwMajorVersion > 4) - // { - NMHDR h = {0}; - h.code = PSN_APPLY; - OnNotifyParents(&h, PSN_APPLY); - // } - //} - m_generalOpt.DestroyWindow(); - //} - //catch (...) - //{/// win9x will die here - //} - } - m_hWnd = NULL; - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -LRESULT CSettingsDlgHolder::OnSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) -{ -BEGIN_PROTECT_AND_LOG_CODE - return SendMessage(GetParent(), PSM_CHANGED, 0, 0); -END_PROTECT_AND_LOG_CODE - return FALSE; -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/GUI/SettingsDlgHolder.h b/plugins/SmartAutoReplier/GUI/SettingsDlgHolder.h deleted file mode 100644 index 61fb460e5b..0000000000 --- a/plugins/SmartAutoReplier/GUI/SettingsDlgHolder.h +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "..\resource.h" - -#include -#include -#include -#include - -#include "optionsdlg.h" - -/// dialog that holds all -/// gui dialogs.. -class CSettingsDlgHolder : public CDialogImpl, - public CMessageFilter, - public IMSingeltone -{ -public: /// ctors - CSettingsDlgHolder(void); - /// dctors - ~CSettingsDlgHolder(void); -public: - enum {IDD = IDD_SDLGHOLDER}; - BEGIN_MSG_MAP(CSettingsDlgHolder) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - MESSAGE_HANDLER(WM_NOTIFY, OnNotify) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_HANDLER(PSM_CHANGED, OnSettingsChanged) - END_MSG_MAP() -protected: - virtual BOOL PreTranslateMessage(MSG* pMsg); - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); - LRESULT OnSettingsChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/); -private: - void OnNotifyParents(LPNMHDR lpnmhdr, int nCode); -private: - bool m_bTabSelected; -public: - static BOOL CALLBACK FakeDlgProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam); -protected: - CTabCtrl m_tabCtrl; /// holder of all settings dlg - CStatic m_statusMsg; - COptionsDlg m_generalOpt; /// general options dlg -public: - bool m_bDestroying; -}; diff --git a/plugins/SmartAutoReplier/Interfaces/ISettings.h b/plugins/SmartAutoReplier/Interfaces/ISettings.h deleted file mode 100644 index 4a789be694..0000000000 --- a/plugins/SmartAutoReplier/Interfaces/ISettings.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -/// base for settings data... -interface ISettingsStream -{ -}; - -/// base interface for settings managers... -interface ISettings -{ - virtual bool Serialize(ISettingsStream *pStream, DWORD & ObjectSize) = NULL; - virtual bool Deserialize(DWORD & ObjectSize) = NULL; -}; \ No newline at end of file diff --git a/plugins/SmartAutoReplier/Interfaces/ISingletone.h b/plugins/SmartAutoReplier/Interfaces/ISingletone.h deleted file mode 100644 index 7474127e89..0000000000 --- a/plugins/SmartAutoReplier/Interfaces/ISingletone.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -/// base class for singletones in plugin -template -class IMSingeltone -{ -public: - IMSingeltone(){}; - IMSingeltone(T * ptclass) {m_pThis = ptclass;} - static void SetObject(T* pObj) {m_pThis = pObj;}; - static T* GetObject(){return m_pThis;}; -protected: - static T* m_pThis; -}; \ No newline at end of file diff --git a/plugins/SmartAutoReplier/LuaBridge.cpp b/plugins/SmartAutoReplier/LuaBridge.cpp deleted file mode 100644 index 764dec3381..0000000000 --- a/plugins/SmartAutoReplier/LuaBridge.cpp +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This code is inspired by article of RichardS at http://www.codeproject.com/Articles/11508/Integrating-Lua-into-C - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "LuaBridge.h" - -CLuaBridge::CLuaBridge(void) : m_pLuaContext(NULL) -{ - m_pLuaContext = lua_open(); - - if (m_pLuaContext != NULL) - { - lua_pushcclosure(m_pLuaContext, LuaDebugMessage, 0); - lua_setglobal(m_pLuaContext, "trace"); - - lua_atpanic(m_pLuaContext, (lua_CFunction)HandleLuaAsssert); - - luaopen_io(m_pLuaContext); - luaopen_math(m_pLuaContext); - luaopen_base(m_pLuaContext); - luaopen_loadlib(m_pLuaContext); - luaopen_table(m_pLuaContext); - luaopen_string(m_pLuaContext); - luaopen_debug(m_pLuaContext); - } -} - -CLuaBridge::~CLuaBridge(void) -{ - if (m_pLuaContext != NULL) - { - lua_close(m_pLuaContext); - } -} - -int CLuaBridge::LuaDebugMessage(lua_State *pContext) -{ - const char *szFunction = NULL; - const char *szMessage = NULL; - lua_Debug LuaDebug = {0}; - - int n = lua_tonumber(pContext, 1); - szMessage = lua_tostring(pContext, 1); - - if (szMessage == NULL) - { - return FALSE; - } - - lua_getstack(pContext, 1, &LuaDebug); - lua_getinfo (pContext, "Snl", &LuaDebug); - - szFunction = LuaDebug.source; - - if (szFunction == NULL) - { - return FALSE; - } - - OutputDebugStringA("Smart Auto Replier : "); - OutputDebugStringA("("); - OutputDebugStringA(szFunction); - OutputDebugStringA("): "); - OutputDebugStringA(szMessage); - OutputDebugStringA("\r\n"); - - return TRUE; -} - -void CLuaBridge::HandleLuaAsssert(lua_State * pContext) -{ - DebugBreak(); -} - -bool CLuaBridge::RunScript(const char *szScript, size_t nLength, const char *szFuncName) -{ - bool bRetVal = false; - - if (szFuncName == NULL) - { - szFuncName = "SarFakeProcedure"; - } - - if (luaL_loadbuffer(m_pLuaContext, szScript, nLength, szFuncName) == 0) - { - bRetVal = (lua_pcall(m_pLuaContext, 0, LUA_MULTRET, 0) == 0); - } - - return bRetVal; -} - -bool CLuaBridge::ExecuteFunction(int nArgs, int nReturns) -{ - bool bRetVal = false; - - if (lua_isfunction(m_pLuaContext, -nArgs - 1)) - { - bRetVal = (lua_pcall(m_pLuaContext, nArgs, nReturns, 0) == FALSE); - } - - return bRetVal; -} - -CLuaBridge::operator lua_State *() -{ - return m_pLuaContext; -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/LuaBridge.h b/plugins/SmartAutoReplier/LuaBridge.h deleted file mode 100644 index f012a55db4..0000000000 --- a/plugins/SmartAutoReplier/LuaBridge.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This code is inspired by article of RichardS at http://www.codeproject.com/Articles/11508/Integrating-Lua-into-C - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "luainc.h" - -class CLuaBridge -{ -public: - CLuaBridge(void); - ~CLuaBridge(void); - -public: - static int LuaDebugMessage(lua_State * pContext); - static void HandleLuaAsssert(lua_State * pContext); - - bool RunScript(const char *szScript, size_t nLength, const char *szFuncName = NULL); - bool ExecuteFunction(int nArgs, int nReturns = 0); - operator lua_State *(); - -protected: - lua_State *m_pLuaContext; -}; - -class CLuaStack -{ -public: - CLuaStack(CLuaBridge & luaBridge) : m_pState(NULL), m_nTopIndex(0) - { - m_pState = (lua_State*)luaBridge; - m_nTopIndex = lua_gettop(m_pState); - } - - virtual ~CLuaStack() - { - lua_settop(m_pState, m_nTopIndex); - } - -protected: - - lua_State *m_pState; - int m_nTopIndex; -}; - -class CLuaTableThis -{ -public: - CLuaTableThis(CLuaBridge & luaBridge, int nRef) : m_nOldRef(0), m_luaBridge(luaBridge) - { - lua_State *state = (lua_State*)m_luaBridge; - - lua_getglobal(state, "this"); - m_nOldRef = luaL_ref(state, LUA_REGISTRYINDEX); - - lua_rawgeti(state, LUA_REGISTRYINDEX, nRef); - lua_setglobal(state, "this"); - } - - virtual ~CLuaTableThis() - { - lua_State *state = (lua_State*)m_luaBridge; - - if (m_nOldRef > 0) - { - lua_rawgeti(state, LUA_REGISTRYINDEX, m_nOldRef); - lua_setglobal (state, "this"); - luaL_unref(state, LUA_REGISTRYINDEX, m_nOldRef); - } - } - -protected: - int m_nOldRef; - CLuaBridge & m_luaBridge; -}; - diff --git a/plugins/SmartAutoReplier/LuaScript.cpp b/plugins/SmartAutoReplier/LuaScript.cpp deleted file mode 100644 index 5ad1508d99..0000000000 --- a/plugins/SmartAutoReplier/LuaScript.cpp +++ /dev/null @@ -1,215 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This code is inspired by article of RichardS at http://www.codeproject.com/Articles/11508/Integrating-Lua-into-C - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" - -#include -#include "luainc.h" -#include "luascript.h" - -#define LUA_CODE_CHUNK_ENTER(luaBridge) lua_State *state = (lua_State*)luaBridge; - -#define LUA_CODE_CHUNK_LEAVE - -CLuaScript::CLuaScript(CLuaBridge & luaBridge) : m_luaBridge(luaBridge), m_nMethods(DEFAULT_INDEX_INITIALIZER), m_nThisRef(DEFAULT_INDEX_INITIALIZER), m_nArgs(DEFAULT_INDEX_INITIALIZER) -{ -LUA_CODE_CHUNK_ENTER(luaBridge) - - lua_newtable(state); - m_nThisRef = luaL_ref(state, LUA_REGISTRYINDEX); - - CLuaStack luaStack(luaBridge); - lua_rawgeti(state, LUA_REGISTRYINDEX, m_nThisRef); - lua_pushlightuserdata(state, reinterpret_cast(this)); - lua_rawseti(state, -2, 0); - -LUA_CODE_CHUNK_LEAVE -} - -CLuaScript::~CLuaScript(void) -{ - CLuaStack luaStack(m_luaBridge); - -LUA_CODE_CHUNK_ENTER(m_luaBridge) - - lua_rawgeti(state, LUA_REGISTRYINDEX, m_nThisRef); - lua_pushnil(state); - lua_rawseti(state, -2, 0); - -LUA_CODE_CHUNK_LEAVE -} - -int CLuaScript::LuaCallback(lua_State *lua) -{ - int iNumberIdx = lua_upvalueindex(1); - int nRetsOnStack = 0; - - bool bRetVal = false; - - if (lua_istable(lua, 1)) - { - lua_rawgeti(lua, 1, 0); - - if (lua_islightuserdata(lua, -1)) - { - CLuaScript *pThis = reinterpret_cast(lua_touserdata(lua, -1)); - int nMethod = static_cast(lua_tonumber(lua, iNumberIdx)); - - assert(!(nMethod > pThis->MethodsCount())); - - lua_remove(lua, 1); lua_remove(lua, -1); - - nRetsOnStack = pThis->ScriptCalling(pThis->Bridge(), nMethod); - - bRetVal = true; - } - } - - if (bRetVal == false) - { - lua_error(lua); - } - - return nRetsOnStack; -} - -bool CLuaScript::CompileScript(const char *szScript, size_t nLength) -{ - CLuaTableThis luaThisTable(m_luaBridge, m_nThisRef); - - return m_luaBridge.RunScript(szScript, nLength); -} - -int CLuaScript::RegisterFunction(const char *szFuncName) -{ - int nMethod = -1; - - CLuaStack luaStack(m_luaBridge); - -LUA_CODE_CHUNK_ENTER(m_luaBridge) - - nMethod = ++m_nMethods; - - lua_rawgeti(state, LUA_REGISTRYINDEX, m_nThisRef); - lua_pushstring(state, szFuncName); - lua_pushnumber(state, (lua_Number)nMethod); - lua_pushcclosure(state, CLuaScript::LuaCallback, 1); - lua_settable(state, -3); - -LUA_CODE_CHUNK_LEAVE - - return nMethod; -} - -bool CLuaScript::SelectScriptFunction(const char *szFunction) -{ - bool bRetVal = true; - -LUA_CODE_CHUNK_ENTER(m_luaBridge) - - lua_rawgeti(state, LUA_REGISTRYINDEX, m_nThisRef); - lua_pushstring(state, szFunction); - lua_rawget(state, -2); - lua_remove(state, -2); - - lua_rawgeti(state, LUA_REGISTRYINDEX, m_nThisRef); - - if (!lua_isfunction(state, -2)) - { - bRetVal = false; - lua_pop(state, 2); - } - else - { - m_nArgs = 0; - m_szFunction = szFunction; - } - -LUA_CODE_CHUNK_LEAVE - - return bRetVal; -} - -bool CLuaScript::ScriptHasFunction(const char * szFunction) -{ - CLuaStack luaStack(m_luaBridge); - - bool bRetVal = false; - -LUA_CODE_CHUNK_ENTER(m_luaBridge) - - lua_rawgeti(state, LUA_REGISTRYINDEX, m_nThisRef); - lua_pushstring(state, szFunction); - lua_rawget(state, -2); - lua_remove(state, -2); - - bRetVal = (lua_isfunction(state, -1) != FALSE); - -LUA_CODE_CHUNK_LEAVE - - return bRetVal; -} - -void CLuaScript::AddParam(char * szValue) -{ -LUA_CODE_CHUNK_ENTER(m_luaBridge) - lua_pushstring(state, szValue); ++m_nArgs; -LUA_CODE_CHUNK_LEAVE -} - -void CLuaScript::AddParam(int nValue) -{ -LUA_CODE_CHUNK_ENTER(m_luaBridge) - lua_pushnumber(state, (lua_Number)nValue); ++m_nArgs; -LUA_CODE_CHUNK_LEAVE -} - -void CLuaScript::AddParam(float fValue) -{ -LUA_CODE_CHUNK_ENTER(m_luaBridge) - lua_pushnumber(state, (lua_Number)fValue); ++m_nArgs; -LUA_CODE_CHUNK_LEAVE -} - -bool CLuaScript::Run(int nRetValues) -{ - bool bRetVal = m_luaBridge.ExecuteFunction((m_nArgs + 1), nRetValues); - - if (bRetVal == true && nRetValues > 0) - { - HandleReturns(m_luaBridge, m_szFunction); - lua_pop(static_cast(m_luaBridge), nRetValues); - } - - return bRetVal; -} - -CLuaBridge & CLuaScript::Bridge() -{ - return m_luaBridge; -} - -int CLuaScript::MethodsCount() -{ - return m_nMethods; -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/LuaScript.h b/plugins/SmartAutoReplier/LuaScript.h deleted file mode 100644 index 73c29c0a3f..0000000000 --- a/plugins/SmartAutoReplier/LuaScript.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This code is inspired by article of RichardS at http://www.codeproject.com/Articles/11508/Integrating-Lua-into-C - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "luainc.h" -#include "LuaBridge.h" - -/// -#define DEFAULT_INDEX_INITIALIZER 0 - -class CLuaScript -{ -public: - CLuaScript(CLuaBridge & luaBridge); - virtual ~CLuaScript(); - -public: - - static int LuaCallback (lua_State *lua); - bool CompileScript(const char *szScript, size_t nLength); - int RegisterFunction(const char *szFuncName); - bool SelectScriptFunction(const char *szFunction); - bool ScriptHasFunction(const char *szFunction); - bool Run(int nRetValues = 0); - -public: - void AddParam(int nValue); - void AddParam(float fValue); - void AddParam(char *szValue); - CLuaBridge & Bridge(); - - int MethodsCount(); - -public: - virtual int ScriptCalling(CLuaBridge & luaBridge, int nFunction) = 0; - virtual void HandleReturns(CLuaBridge & luaBridge, const char * szFunction) = 0; - -protected: - - CLuaBridge & m_luaBridge; - - const char * m_szFunction; - - int m_nMethods, - m_nThisRef, - m_nArgs; -}; \ No newline at end of file diff --git a/plugins/SmartAutoReplier/MessagesHandler.cpp b/plugins/SmartAutoReplier/MessagesHandler.cpp deleted file mode 100644 index 3f3e8e5ad5..0000000000 --- a/plugins/SmartAutoReplier/MessagesHandler.cpp +++ /dev/null @@ -1,469 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "messageshandler.h" -#include "SarLuaScript.h" -#include - -extern CCrushLog CRUSHLOGOBJ; - -/// init static members... -CMessagesHandler * CMessagesHandler::m_pThis = NULL; - -/// thread that is checking -/// users that sent messages, -/// analize sent time and if -/// reply delay is greater then -/// difference between current time and -/// sent time thread deletes item. -INT WINAPI ContactsFetcherThread(LPVOID lp) -{ -BEGIN_PROTECT_AND_LOG_CODE -#define SLEEP_TIME 50 - CMessagesHandler *pHolder = CMessagesHandler::GetObject(); - if (pHolder) - { - while (pHolder->m_bShouldWork) - { - WaitForSingleObject(pHolder->m_hEnableEvent, INFINITE); - if (!pHolder->m_bShouldWork) - break; - - EnterCriticalSection(&pHolder->m_critSect); - - if (pHolder->m_contacts.size() == 0) - { - LeaveCriticalSection(&pHolder->m_critSect); - Sleep (SLEEP_TIME); - continue; - } - - SYSTEMTIME sysTime = {0}; - FILETIME ft = {0}; - LARGE_INTEGER liNow = {0}; - - GetLocalTime (&sysTime); - SystemTimeToFileTime(&sysTime, &ft); - memcpy(&liNow, &ft, sizeof(liNow)); - - ContactsMap::iterator it; - - CONTACT_METAINFO rawm = {0}; - LARGE_INTEGER liDiff = {0}; - - for (it = pHolder->m_contacts.begin(); it != pHolder->m_contacts.end(); it++) - { - if (pHolder->m_contacts.size() == 0) - { - break; - } - rawm = it->second; - liDiff.QuadPart = liNow.QuadPart - rawm.StartTime.QuadPart; - if (liDiff.QuadPart >= rawm.DiffTime.QuadPart) - { - if (pHolder->m_contacts.size() == 1) - { - pHolder->m_contacts.clear(); - break; - } - else - pHolder->m_contacts.erase(it); - } - } - - LeaveCriticalSection(&pHolder->m_critSect); - - Sleep (SLEEP_TIME); - } - } -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -/// ctor of main plugin manager -CMessagesHandler::CMessagesHandler(void) : IMSingeltone(this), -m_hFetcherThread(NULL), -m_hEnableEvent(NULL), -m_bShouldWork(true), -m_bInited(false) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_settings.Init(); -END_PROTECT_AND_LOG_CODE -} - -/// dtor of main plugin manager -CMessagesHandler::~CMessagesHandler(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_settings.DeInit(); - m_bShouldWork = false; - CMessagesHandler::m_pThis = NULL; -END_PROTECT_AND_LOG_CODE -} - -/// enables or disables feature -void CMessagesHandler::MakeAction(bool bEnable) -{ -BEGIN_PROTECT_AND_LOG_CODE - REPLYER_SETTINGS & s = m_settings.getSettings(); - s.bEnabled = bEnable; - m_settings.setSettings(s); - - if (bEnable) - { - HookEvents(); - SetEvent (m_hEnableEvent); - } - else - UnHookEvents(); -END_PROTECT_AND_LOG_CODE -} - -bool CMessagesHandler::AllowReply(HANDLE hContact) -{ -BEGIN_PROTECT_AND_LOG_CODE - if (!m_settings.getSettings().bEnabled) - return FALSE; - ContactsMap::iterator it; - bool bRetVal = false; - - EnterCriticalSection(&m_critSect); - - it = m_contacts.find(hContact); - - SYSTEMTIME sysTime = {0}; - FILETIME ft = {0}; - GetLocalTime (&sysTime); - SystemTimeToFileTime(&sysTime, &ft); - - if (it == m_contacts.end()) - { /// no such contact... - CONTACT_METAINFO cm = {0}; - - memcpy(&cm.StartTime, &ft, sizeof(cm.StartTime)); - cm.DiffTime.QuadPart = m_settings.getSettings().ReplayDelay * nano100SecInSec; - ContactsPair p(hContact, cm); - - m_contacts.insert(p); - bRetVal = true; - } - else - { /// there is one... - memcpy(&it->second.StartTime, &ft, sizeof(it->second.StartTime)); - } - - LeaveCriticalSection(&m_critSect); - - return bRetVal; -END_PROTECT_AND_LOG_CODE - return false; -} - -void CMessagesHandler::HookEvents(void) -{ -BEGIN_PROTECT_AND_LOG_CODE -#ifdef _DEBUG -#endif - - InitializeCriticalSection(&m_critSect); - m_settings.Init(); -#ifdef _DEBUG - bool bEnabled = m_settings.getSettings().bEnabled; -#endif - m_hEnableEvent = CreateEvent(NULL, TRUE, m_settings.getSettings().bEnabled, NULL); - - DWORD dw = 0; - m_bShouldWork = true; - m_hFetcherThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ContactsFetcherThread, NULL, NULL, &dw); - m_hEvents[0] = HookEvent(ME_DB_EVENT_ADDED, CMessagesHandler::EventAddHook); - m_bInited = true; -END_PROTECT_AND_LOG_CODE -} - -void CMessagesHandler::UnHookEvents(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_bShouldWork = false; - if (!m_bInited) - return; - SetEvent(m_hEnableEvent); - - for (size_t i = 0; i < HOOKS_NUM; i++) - UnhookEvent(m_hEvents[i]); - - WaitForSingleObject(m_hFetcherThread, INFINITE); - DeleteCriticalSection(&m_critSect); - CloseHandle(m_hEnableEvent); - //m_settings.DeInit(); - - m_hEnableEvent = NULL; - m_hFetcherThread = NULL; - -END_PROTECT_AND_LOG_CODE -} - -LPTSTR CMessagesHandler::GetContactName(HANDLE hContact) -{ - LPARAM lFlags = GCDNF_NOMYHANDLE; - -#ifdef _UNICODE - lFlags |= GCDNF_UNICODE; -#endif -BEGIN_PROTECT_AND_LOG_CODE - return reinterpret_cast(CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, lFlags)); -END_PROTECT_AND_LOG_CODE - return NULL; -} - -int CMessagesHandler::SendProtoMess(HANDLE hContact, LPCSTR szMess) -{ -BEGIN_PROTECT_AND_LOG_CODE - return CallContactService(hContact, PSS_MESSAGE, 0, reinterpret_cast(szMess)); -END_PROTECT_AND_LOG_CODE - return 0; -} - -/** Convert unicode to ansi (utf16 to utf8) - - * @return ansi string or null -*/ -char* Utf16toUtf8(LPCWSTR lpwszStrIn, UINT & nSize) -{ - LPSTR pszOut = NULL; - - if (lpwszStrIn != NULL) - { - -#define SAFE_DELTA 2 - - int nInputStrLen = (int)wcslen(lpwszStrIn); - int nOutputStrLen = WideCharToMultiByte(CP_UTF8, 0, lpwszStrIn, nInputStrLen, NULL, 0, 0, 0); - - if (nOutputStrLen == 0) - { - return NULL; - } - - nOutputStrLen += SAFE_DELTA; - - pszOut = (LPSTR)malloc(nOutputStrLen); - - if (pszOut) - { - nSize = nOutputStrLen - SAFE_DELTA; - memset(pszOut, 0x00, nOutputStrLen); - - WideCharToMultiByte(CP_UTF8, 0, lpwszStrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0); - } - } - - return pszOut; -} - -/** Convert unicode to ansi (utf16 to utf8) - - * @return ansi string or null -*/ -wchar_t* Utf8toUtf16(CHAR * szStrIn, UINT & nSize) -{ - wchar_t * pszOut = NULL; - - if (szStrIn != NULL) - { - -#define SAFE_DELTA 2 - - int nInputStrLen = (int)nSize; - int nOutputStrLen = MultiByteToWideChar(CP_UTF8, 0, szStrIn, nInputStrLen, NULL, 0); - - if (nOutputStrLen == 0) - { - return NULL; - } - - nOutputStrLen += SAFE_DELTA; - - pszOut = (wchar_t*)malloc(nOutputStrLen * sizeof(wchar_t)); - - if (pszOut) - { - nSize = nOutputStrLen - SAFE_DELTA; - memset(pszOut, 0x00, nOutputStrLen * sizeof(wchar_t)); - - MultiByteToWideChar(CP_UTF8, 0, szStrIn, nInputStrLen, pszOut, nOutputStrLen); - } - } - - return pszOut; -} - -/// this handle is invoked wnen -/// event is added to db -int CMessagesHandler::EventAddHook(WPARAM wp, LPARAM lp) -{ -BEGIN_PROTECT_AND_LOG_CODE - DWORD dwOffset = static_cast (lp); - HANDLE hContact = reinterpret_cast(wp); - DBEVENTINFO dbei; - - if (!hContact || !dwOffset) - { - return FALSE; /// unspecifyed error - } - - ZeroMemory(&dbei, sizeof(dbei)); - dbei.cbSize = sizeof(dbei); - dbei.cbBlob = 0; - - CallService(MS_DB_EVENT_GET, lp, (LPARAM)&dbei); /// detect size of msg - - if ((dbei.eventType != EVENTTYPE_MESSAGE) || (dbei.flags == DBEF_READ) || (dbei.flags == DBEF_SENT) ) - { - return FALSE; /// we need EVENTTYPE_MESSAGE event.. - } - else - { /// needed event has occured.. - if (!dbei.cbBlob) /// invalid size - { - return FALSE; - } - - dbei.pBlob = new BYTE[dbei.cbBlob]; - - if (dbei.pBlob) - { - LPARAM lParam = GCDNF_NOMYHANDLE; - -#ifdef _UNICODE - lParam |= GCDNF_UNICODE; -#endif - CallService(MS_DB_EVENT_GET, lp, reinterpret_cast(&dbei)); - - TCHAR * szMessage = DbGetEventTextT(&dbei, 0); - - TCHAR * szContactName = reinterpret_cast(CallService(MS_CLIST_GETCONTACTDISPLAYNAME, wp, lParam)); - - CMessagesHandler *ptrHolder = NULL; - ptrHolder = CMessagesHandler::GetObject(); - - if (!szContactName || !ptrHolder) - { - return FALSE; - } - - if (!ptrHolder->AllowReply(hContact)) - { - return FALSE; - } - - TCHAR * lpMessage = NULL; - - { - RULE_METAINFO inf = {0}; - inf.ContactName = szContactName; - - /// analizes all rules and formes autoreply - /// message - it's stored in lpMessage - /// then - just sent it to user - CSettingsHandler & settingsManager = ptrHolder->getSettings(); - settingsManager.getStorage().IsRuleMatch(inf, lpMessage, szMessage); - - { - /// do the lua trick - CLuaBridge luaBridge; - CSarLuaScript script(luaBridge); - - UINT nReplyScriptLength = 0; - CHAR * szReplyScript = NULL; - - szReplyScript = Utf16toUtf8(lpMessage, nReplyScriptLength); - - if (szReplyScript != NULL) - { - UINT nUserMessage = 0; - CHAR * szUserMessage = Utf16toUtf8(szMessage, nUserMessage); - - UINT nUserName = 0; - CHAR * szUserName = Utf16toUtf8(szContactName, nUserName); - - script.CompileScript(szReplyScript, nReplyScriptLength); - - script.SelectScriptFunction("SAR"); - script.AddParam((int)hContact); - script.AddParam(szUserMessage); - script.AddParam(szUserName); - script.AddParam((char*)dbei.szModule); - script.Run(); - - free(szReplyScript); - free(szUserMessage); - free(szUserName); - } - } - - mir_free(szMessage); - - delete lpMessage; - delete dbei.pBlob; - - return FALSE; - } - } - } - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -void CMessagesHandler::WriteToHistory(LPTSTR lpMsg, HANDLE hContact) -{ - LPTSTR lp1 = TranslateTS(TEXT("Generated autoreply:\r\n")); - - LPTSTR lpszMess = new TCHAR[_tcslen(lpMsg) + _tcslen(lp1)]; - if (lpszMess == NULL) - return; - - memset(lpszMess, 0, (_tcslen(lpMsg) + _tcslen(lp1)) * sizeof(TCHAR)); - _tcscpy(lpszMess, lp1); - _tcscat(lpszMess, lpMsg); - - DBEVENTINFO dbei = {0}; - dbei.cbSize = sizeof(dbei); - dbei.eventType = EVENTTYPE_MESSAGE; - dbei.flags = DBEF_READ; - dbei.szModule = (char*)CallService(MS_PROTO_GETCONTACTBASEPROTO,(WPARAM)hContact, 0); - dbei.timestamp = time(NULL); - dbei.cbBlob = _tcslen(lpszMess) + 1; - dbei.pBlob = (PBYTE)lpszMess; - CallService(MS_DB_EVENT_ADD, (WPARAM)hContact, (LPARAM)&dbei); - - delete lpszMess; -} - -/// getting settings.. -CSettingsHandler & CMessagesHandler::getSettings(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - return m_settings; -END_PROTECT_AND_LOG_CODE -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/MessagesHandler.h b/plugins/SmartAutoReplier/MessagesHandler.h deleted file mode 100644 index 2d9240f0d5..0000000000 --- a/plugins/SmartAutoReplier/MessagesHandler.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "settingshandler.h" -#include "interfaces\ISingletone.h" - -#include -using namespace std; - -typedef struct _CONTACT_METAINFO -{ - LARGE_INTEGER StartTime; - LARGE_INTEGER DiffTime; -}CONTACT_METAINFO,*PCONTACT_METAINFO; - -typedef std::map ContactsMap; -typedef std::pair ContactsPair; -const __int64 nano100SecInSec = (__int64)10000000; - -/// hooks def... -#define HOOKS_NUM 1 - -INT WINAPI ContactsFetcherThread(LPVOID lp); - -class CMessagesHandler : public IMSingeltone -{ - friend INT WINAPI ContactsFetcherThread(LPVOID lp); -public: - CMessagesHandler(void); - ~CMessagesHandler(void); -public: - void HookEvents(void); - void UnHookEvents(void); - void WriteToHistory(LPTSTR lpMsg, HANDLE hContact); - CSettingsHandler & getSettings(void); - bool AllowReply(HANDLE hContact); - void MakeAction(bool bEnable); - static LPTSTR GetContactName(HANDLE hContact); - static int SendProtoMess(HANDLE hContact, LPCSTR szMess); -protected: // hooks procs - static int EventAddHook(WPARAM wp, LPARAM lp); -private: - bool m_bInited; -private: - HANDLE m_hEvents[HOOKS_NUM]; - CSettingsHandler m_settings; - ContactsMap m_contacts; - CRITICAL_SECTION m_critSect; - HANDLE m_hFetcherThread; - HANDLE m_hEnableEvent; - bool m_bShouldWork; -}; \ No newline at end of file diff --git a/plugins/SmartAutoReplier/ModeMessHandler.cpp b/plugins/SmartAutoReplier/ModeMessHandler.cpp deleted file mode 100644 index 5509bea091..0000000000 --- a/plugins/SmartAutoReplier/ModeMessHandler.cpp +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "modemesshandler.h" - -/// TODO: add comments and change char* to TCHAR* !!! - -/// ctor -CModeMessHandler::CModeMessHandler(void) -{ -} - -/// dtor -CModeMessHandler::~CModeMessHandler(void) -{ -} - -TCHAR * CModeMessHandler::StatusModeToDbSetting(int status, TCHAR *suffix) -{ - LPTSTR prefix; - static TCHAR str[64] = {0}; - - switch(status) { - case ID_STATUS_AWAY: prefix = TEXT("Away"); break; - case ID_STATUS_NA: prefix = TEXT("Na"); break; - case ID_STATUS_DND: prefix = TEXT("Dnd"); break; - case ID_STATUS_OCCUPIED: prefix = TEXT("Occupied"); break; - case ID_STATUS_FREECHAT: prefix = TEXT("FreeChat"); break; - case ID_STATUS_ONLINE: prefix = TEXT("On"); break; - case ID_STATUS_OFFLINE: prefix = TEXT("Off"); break; - case ID_STATUS_INVISIBLE: prefix = TEXT("Inv"); break; - case ID_STATUS_ONTHEPHONE: prefix = TEXT("Otp"); break; - case ID_STATUS_OUTTOLUNCH: prefix = TEXT("Otl"); break; - default: - return NULL; - } - lstrcpy(str, prefix); - _tcscat(str, suffix); - - return str; -} - -LPTSTR CModeMessHandler::GetDefaultMessage(INT status) -{ - switch (status) - { - case ID_STATUS_AWAY: return TranslateTS(TEXT("I've been away since %time%.")); - case ID_STATUS_NA: return TranslateTS(TEXT("Give it up, I'm not in!")); - case ID_STATUS_OCCUPIED: return TranslateTS(TEXT("Not right now.")); - case ID_STATUS_DND: return TranslateTS(TEXT("Give a guy some peace, would ya?")); - case ID_STATUS_FREECHAT: return TranslateTS(TEXT("Well, I would talk to you if Miranda IM supported chat")); - case ID_STATUS_ONLINE: return TranslateTS(TEXT("Yep, I'm here.")); - case ID_STATUS_OFFLINE: return TranslateTS(TEXT("Nope, not here.")); - case ID_STATUS_INVISIBLE: return TranslateTS(TEXT("I'm hiding from the mafia.")); - case ID_STATUS_ONTHEPHONE: return TranslateTS(TEXT("That'll be the phone.")); - case ID_STATUS_OUTTOLUNCH: return TranslateTS(TEXT("Mmm...food.")); - } - return NULL; -} - -/// returnes mode message -/// looks like ret. val should be free(), but -/// read notes in the place where this func is used -LPTSTR CModeMessHandler::GetModeMessage(INT statusMode) -{ - /*DBVARIANT dbv = {0}; - INT nretVal = {0}; /// suppose failure.. - - nretVal = DBGetContactSetting(NULL, TCHAR("SRAway"), StatusModeToDbSetting(statusMode, TCHAR("Msg")), &dbv); - if (nretVal) /// unable to get away msg... - { - dbv.pszVal = _tcsdup(GetDefaultMessage(statusMode)); - if (dbv.pszVal == NULL) /// maybe will occure ;) - { - DBGetContactSetting(NULL, TCHAR("SRAway"), StatusModeToDbSetting(statusMode, TCHAR("Default")), &dbv); - } - } - - int i; - TCHAR substituteStr[128] = {0}; - for(i = 0; dbv.pszVal[i]; i++) - { - if (dbv.pszVal[i] != '%') - continue; - if (!_tcsncicmp((TCHAR*)dbv.pszVal+i, TEXT("%time%"), 6)) - GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, NULL, NULL, substituteStr, sizeof(substituteStr) / sizeof (TCHAR)); - else if (!_tcsncicmp((TCHAR*)dbv.pszVal+i, TEXT("%date%"), 6)) - GetDateFormat(LOCALE_USER_DEFAULT, DATE_SHORTDATE, NULL, NULL, substituteStr, sizeof(substituteStr) / sizeof(TCHAR)); - else - continue; - if (_tcslen(substituteStr) > 6) - dbv.pszVal = ((TCHAR*))realloc((TCHAR*)dbv.pszVal, _tcslen((TCHAR*)dbv.pszVal) + 1 + _tcslen(substituteStr) - 6); - MoveMemory(dbv.pszVal + i + _tcslen(substituteStr), dbv.pszVal + i + 6, _tcslen(dbv.pszVal) - i - 5); - CopyMemory(dbv.pszVal + i, substituteStr, _tcslen(substituteStr)); - }*/ - - //return dbv.pszVal; - - return NULL; -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/ModeMessHandler.h b/plugins/SmartAutoReplier/ModeMessHandler.h deleted file mode 100644 index 87931ba487..0000000000 --- a/plugins/SmartAutoReplier/ModeMessHandler.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -class CModeMessHandler -{ -public: - CModeMessHandler(void); - ~CModeMessHandler(void); -public: - static LPTSTR GetModeMessage(INT nMode); -private: - static LPTSTR GetDefaultMessage(INT status); - static TCHAR *StatusModeToDbSetting(int status, TCHAR *suffix); -}; diff --git a/plugins/SmartAutoReplier/RuleItem.h b/plugins/SmartAutoReplier/RuleItem.h deleted file mode 100644 index dd7bfa7549..0000000000 --- a/plugins/SmartAutoReplier/RuleItem.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "interfaces\isettings.h" - -/// a typical rule item -/// contains info to reply to specific user -typedef struct _RULE_ITEM : ISettingsStream -{ - LPTSTR RuleName, /// item name - ContactName, /// contact name - ReplyText; /// reply text - /*ReplyAction; /// reply action*/ -}RULE_ITEM, *PRULE_ITEM; - -/// common item... - a rule that is -/// applied to all users. -typedef struct _COMMON_RULE_ITEM : ISettingsStream -{ - //LPTSTR Header; - LPTSTR Message; -}COMMON_RULE_ITEM, *P_COMMON_RULE_ITEM; - -typedef struct _RULE_METAINFO -{ - LPTSTR ContactName; -}RULE_METAINFO, *PRULE_METAINFO; diff --git a/plugins/SmartAutoReplier/RulesStorage.cpp b/plugins/SmartAutoReplier/RulesStorage.cpp deleted file mode 100644 index 6b4f6a2ab0..0000000000 --- a/plugins/SmartAutoReplier/RulesStorage.cpp +++ /dev/null @@ -1,536 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "rulesstorage.h" -#include "crc32static.h" - -extern HINSTANCE hInst; -extern CCrushLog CRUSHLOGOBJ; -extern CMessagesHandler * g_pMessHandler; - -/// ctor... -CRulesStorage::CRulesStorage(void) : m_hFile(NULL) -{ - m_comItem.Message = NULL; -BEGIN_PROTECT_AND_LOG_CODE - MakeFullPath(m_szSettFileName, sizeof(m_szSettFileName), STORAGE_NAME); - InitializeCriticalSection(&m_critSect); -END_PROTECT_AND_LOG_CODE -} - -/// dtor... -CRulesStorage::~CRulesStorage(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - DeleteCriticalSection(&m_critSect); - DeInit(); -END_PROTECT_AND_LOG_CODE -} - -bool CRulesStorage::Serialize(ISettingsStream *pSettings, DWORD & ObjectSize) -{ -BEGIN_PROTECT_AND_LOG_CODE - Flush(); -END_PROTECT_AND_LOG_CODE - return true; -} - -bool CRulesStorage::Deserialize(DWORD & ObjectSize) -{ -BEGIN_PROTECT_AND_LOG_CODE - Init(); -END_PROTECT_AND_LOG_CODE - return false; -} - -/// deiniting... -void CRulesStorage::DeInit(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - if (m_hFile && m_hFile != INVALID_HANDLE_VALUE) - CloseHandle(m_hFile); - - m_hFile = NULL; - - /// now release memory... - for (RulesHash::iterator it = m_hashTable.begin(); it != m_hashTable.end(); it++) - { - RULE_ITEM & i = it->second; - - delete i.ContactName; - delete i.ReplyText; - delete i.RuleName; - } - - m_hashTable.clear(); - - if (m_comItem.Message != NULL) - { - delete m_comItem.Message; - m_comItem.Message = NULL; - } - -END_PROTECT_AND_LOG_CODE -} - -/// writing a string into a file.. -void CRulesStorage::RawWriteDataBufByChunk(LPTSTR str) -{ -BEGIN_PROTECT_AND_LOG_CODE - int nLength = _tcslen(str) * sizeof(TCHAR); - DWORD dwWritten = 0; - BOOL bVal = FALSE; - - bVal = WriteFile(m_hFile, &nLength, sizeof(nLength), &dwWritten, NULL); - - if (!bVal || dwWritten != sizeof(nLength)) - throw bVal; - - bVal = WriteFile(m_hFile, str, nLength, &dwWritten, NULL); - if (!bVal || nLength != dwWritten) - { - throw bVal; - } -END_PROTECT_AND_LOG_CODE -} - -/// flushing all data from memory into a file... -void CRulesStorage::Flush(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - RulesHash::iterator it; - - SetFilePointer(m_hFile, NULL, NULL, FILE_BEGIN); - SetEndOfFile(m_hFile); /// clear old data - - SetCommonMessages(); - - for (it = m_hashTable.begin(); it != m_hashTable.end(); it++) - { - FlushItem(it->second); - } - -END_PROTECT_AND_LOG_CODE -} - -/// n.c. -bool CRulesStorage::IsRuleMatch(RULE_METAINFO & info, LPTSTR & strMess, LPTSTR & lpIncomingMsg) -{ -BEGIN_PROTECT_AND_LOG_CODE - EnterCriticalSection(&m_critSect); - - RulesHash::iterator iter; - bool bExists = false; - DWORD dwCRC32 = 0; - CCrc32Static::StringCrc32(info.ContactName, dwCRC32); - iter = m_hashTable.find(dwCRC32); - - CScriptsReader & screader = g_pMessHandler->getSettings().getScriptsReader(); - - if (iter != m_hashTable.end()) - { - /// I have to make copy of ReplyText, - /// cause GetReturnedMessage will release ptr - /// that is stored rule - /// found this bug after 20 min. of debugging ;( - strMess = new TCHAR[_tcslen(iter->second.ReplyText) + (1 * sizeof(TCHAR))]; - - if (strMess == NULL) /// ooops... - { - //screader.GetReturnMessage(info.ContactName, strMess, lpIncomingMsg); - LeaveCriticalSection(&m_critSect); - - return false; - } - - memset(strMess, 0, _tcslen(iter->second.ReplyText) * sizeof(TCHAR) + (1 * sizeof(TCHAR))); - _tcscpy(strMess, iter->second.ReplyText); - bExists = true; - //screader.GetReturnMessage(iter->second.ContactName, strMess, lpIncomingMsg); - } - else - screader.GetReturnMessage(info.ContactName, strMess, lpIncomingMsg); - - LeaveCriticalSection(&m_critSect); - return bExists; -END_PROTECT_AND_LOG_CODE - return false; -} - -/// adding rule into memory... -DWORD CRulesStorage::AddRuleItem(RULE_ITEM item, bool & bExists) -{ -BEGIN_PROTECT_AND_LOG_CODE - DWORD dwCRC32 = NULL; - CCrc32Static::StringCrc32(item.ContactName, dwCRC32); - RulesHash::iterator iter; - iter = m_hashTable.find(dwCRC32); - - if (iter != m_hashTable.end()) - { - bExists = true; - return 0; - } - - bExists = false; - - m_hashTable.insert(RulesHash::value_type(dwCRC32, item)); - return dwCRC32; -END_PROTECT_AND_LOG_CODE - return 0; -} - -/// flushing item... -void CRulesStorage::FlushItem(RULE_ITEM & item) -{ -BEGIN_PROTECT_AND_LOG_CODE - RawWriteDataBufByChunk(item.RuleName); - RawWriteDataBufByChunk(item.ContactName); - RawWriteDataBufByChunk(item.ReplyText); - //RawWriteDataBufByChunk(item.ReplyAction); -END_PROTECT_AND_LOG_CODE -} - -/// initing rules manager... -void CRulesStorage::Init(void) -{ -#ifdef _DEBUG - //MessageBox (NULL, __FUNCTION__, __FILE__, MB_OK); -#endif -BEGIN_PROTECT_AND_LOG_CODE - if (m_hFile) - CloseHandle (m_hFile); - - bool bFileExists = true; - if (!PathFileExists(m_szSettFileName)) - {/// file does not exists... - /// need to fill it with common rules... - bFileExists = false; - } - - m_hFile = CreateFile (m_szSettFileName, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, (bFileExists ? OPEN_ALWAYS : CREATE_ALWAYS), FILE_ATTRIBUTE_NORMAL, NULL); - - if (m_hFile == INVALID_HANDLE_VALUE) - {/// show notification msg to user.. - throw INVALID_HANDLE_VALUE; - } - - if (bFileExists == false) - { - ClearCommonMessages(); - m_comItem.Message = new TCHAR[sizeof(SETTINGS_DEF_MESSAGE) / sizeof(TCHAR) + sizeof(TCHAR)]; - - if (m_comItem.Message != NULL) - { - memset(m_comItem.Message, 0, sizeof(SETTINGS_DEF_MESSAGE) / sizeof(TCHAR) + sizeof(TCHAR)); - _tcscpy(m_comItem.Message, SETTINGS_DEF_MESSAGE); - SetCommonMessages(); - } - } - - DWORD dwSize = 0; - dwSize = GetFileSize(m_hFile, &dwSize); - - DWORD dwReaded = 0, - dwCrc32 = 0; - - int nLength = 0; - - /// suppose that func is failed - BOOL bReaded = FALSE; - bool bFailed = false; - - if (bFileExists) - { - dwSize -= GetCommonMessages(); - } - else - { - dwSize -= _tcslen(SETTINGS_DEF_MESSAGE) * sizeof(TCHAR); - dwSize -= 1 * sizeof(int); - } - - while (dwSize) - { - RULE_ITEM it; - - bReaded = ReadFile(m_hFile, &nLength, sizeof(nLength), &dwReaded, NULL); - - if (bReaded == FALSE || dwReaded != sizeof(nLength)) - { - bFailed = true; - break; - } - - dwSize -= sizeof(nLength); - it.RuleName = new TCHAR[nLength / sizeof(TCHAR) + (1 * sizeof(TCHAR))]; - - if (it.RuleName == NULL) - { - bFailed = true; - break; - } - - memset(it.RuleName, 0, (nLength + (1 * sizeof(TCHAR)))); - - bReaded = ReadFile(m_hFile, it.RuleName, nLength, &dwReaded, NULL); - if (bReaded == FALSE || dwReaded != (nLength)) - { - delete it.RuleName; - bFailed = true; - break; - } - - dwSize -= dwReaded; - bReaded = ReadFile(m_hFile, &nLength, sizeof(nLength), &dwReaded, NULL); - - if (bReaded == FALSE || dwReaded != sizeof(nLength)) - { - delete it.RuleName; - bFailed = true; - break; - } - - dwSize -= sizeof(nLength); - it.ContactName = new TCHAR[nLength / sizeof(TCHAR) + (1 * sizeof(TCHAR))]; - - if (it.ContactName == NULL) - { - delete it.RuleName; - bFailed = true; - break; - } - - memset(it.ContactName, 0, (nLength + (1 * sizeof(TCHAR)))); - bReaded = ReadFile(m_hFile, it.ContactName, nLength, &dwReaded, NULL); - - if (bReaded == FALSE || dwReaded != (nLength)) - { - delete it.RuleName; - delete it.ContactName; - bFailed = true; - break; - } - - dwSize -= dwReaded; - bReaded = ReadFile (m_hFile, &nLength, sizeof(nLength), &dwReaded, NULL); - - if (bReaded == FALSE || dwReaded != sizeof(nLength)) - { - delete it.RuleName; - delete it.ContactName; - bFailed = true; - break; - } - - dwSize -= sizeof(nLength); - it.ReplyText = new TCHAR[nLength / sizeof(TCHAR) + (1 * sizeof(TCHAR))]; - - if (it.ReplyText == NULL) - { - delete it.RuleName; - delete it.ContactName; - bFailed = true; - break; - } - - memset(it.ReplyText, 0, (nLength + (1 * sizeof(TCHAR)))); - bReaded = ReadFile (m_hFile, it.ReplyText, nLength, &dwReaded, NULL); - - if (bReaded == FALSE || dwReaded != (nLength)) - { - delete it.RuleName; - delete it.ContactName; - delete it.ReplyText; - - bFailed = true; - break; - } - - dwSize -= dwReaded; - - dwCrc32 = NULL; - CCrc32Static::StringCrc32(it.ContactName, dwCrc32); - m_hashTable.insert(RulesHash::value_type(dwCrc32, it) ); /// filling list - } - - if (bFailed) - { /// upps... - bool bdelete = NotifyAboutWrongSettings(m_szSettFileName); - - if (bdelete) - { - CloseHandle (m_hFile); - m_hFile = NULL; - DeleteFile (m_szSettFileName); - DeInit(); - Init(); - } - } - -END_PROTECT_AND_LOG_CODE -} - -/// reading an data from file storage... -UINT CRulesStorage::RawReadDataBufByChunk(LPTSTR & szData) -{ -BEGIN_PROTECT_AND_LOG_CODE - UINT nRetVal = 0; - - if (m_hFile == NULL || m_hFile == INVALID_HANDLE_VALUE) - { - return nRetVal; - } - - int nSizeOf = 0; - DWORD dwReaded = 0; - const int nsizeof = sizeof(nSizeOf); - BOOL bReaded = ReadFile(m_hFile, &nSizeOf, nsizeof, &dwReaded, NULL); - nRetVal += dwReaded; - - if (bReaded == FALSE || dwReaded != nsizeof) - { - return nRetVal; - } - - szData = new TCHAR[(nSizeOf / sizeof(TCHAR)) + (1 * sizeof(TCHAR))]; - - if (szData == NULL) - { - return nRetVal + dwReaded; - } - - memset(szData, 0, nSizeOf + (1 * sizeof(TCHAR))); - bReaded = ReadFile(m_hFile, szData, nSizeOf, &dwReaded, NULL); - nRetVal += dwReaded; - - if (bReaded == FALSE || dwReaded != nSizeOf) - { - delete szData; - szData = NULL; - return nRetVal; - } - - return nRetVal; -END_PROTECT_AND_LOG_CODE -} - -/// -void CRulesStorage::SetCommonMessages(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - RawWriteDataBufByChunk(m_comItem.Message); -END_PROTECT_AND_LOG_CODE -} - -void CRulesStorage::ClearCommonMessages(void) -{ - if (m_comItem.Message) - { - delete m_comItem.Message; - m_comItem.Message = NULL; - } -} - -/// reads from storage common rules - header and -/// message that is replyed to all users... -UINT CRulesStorage::GetCommonMessages(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - ClearCommonMessages(); - UINT nRetVal = 0; - - nRetVal += RawReadDataBufByChunk(m_comItem.Message); - - return nRetVal; -END_PROTECT_AND_LOG_CODE -#undef RAW_DATACLEAR - return 0; -} - -void CRulesStorage::setCommonRule(COMMON_RULE_ITEM r) /// n.c. -{ -BEGIN_PROTECT_AND_LOG_CODE - memcpy (&m_comItem, &r, sizeof(COMMON_RULE_ITEM)); -END_PROTECT_AND_LOG_CODE -} - -COMMON_RULE_ITEM & CRulesStorage::getCommonRule(void) /// n.c. -{ -BEGIN_PROTECT_AND_LOG_CODE - return m_comItem; -END_PROTECT_AND_LOG_CODE -} - -/// getting hash table -RulesHash & CRulesStorage::getHashTable(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - return m_hashTable; -END_PROTECT_AND_LOG_CODE -} - -/// remove rule by its id -bool CRulesStorage::RemReplyAction(DWORD dwCrc32) -{ - bool bRetVal = false; -BEGIN_PROTECT_AND_LOG_CODE - EnterCriticalSection(&m_critSect); - RulesHash::iterator it; - it = m_hashTable.find(dwCrc32); - if (it != m_hashTable.end()) - { - delete it->second.ContactName; - delete it->second.ReplyText; - delete it->second.RuleName; - - m_hashTable.erase(it); - bRetVal = true; - } - LeaveCriticalSection(&m_critSect); -END_PROTECT_AND_LOG_CODE - return bRetVal; -} - -bool CRulesStorage::RuleIsRegistered(LPTSTR lpContactName) -{ -BEGIN_PROTECT_AND_LOG_CODE - bool bRetVal = false; - if (lpContactName == NULL) - return bRetVal; - DWORD dwCRC32 = NULL; - CCrc32Static::StringCrc32(lpContactName, dwCRC32); - RulesHash::iterator iter; - - EnterCriticalSection(&m_critSect); - iter = m_hashTable.find(dwCRC32); - - if (iter != m_hashTable.end()) - { - bRetVal = true; - } - LeaveCriticalSection(&m_critSect); - - return bRetVal; -END_PROTECT_AND_LOG_CODE - return false; -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/RulesStorage.h b/plugins/SmartAutoReplier/RulesStorage.h deleted file mode 100644 index 25cbec2942..0000000000 --- a/plugins/SmartAutoReplier/RulesStorage.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "RuleItem.h" -#include - -#define STORAGE_NAME TEXT("sar.rsu") /// a def. name of a file that is storing settings -typedef std::map RulesHash; /// storage representation in memory - -/// storage manager.. -class CRulesStorage : ISettings -{ -public: /// ctor'rs, dtors.. - CRulesStorage(void); - ~CRulesStorage(void); -public: /// ISettings interface... - bool Serialize(ISettingsStream *pSettings, DWORD & ObjectSize); - bool Deserialize(DWORD & ObjectSize); -public: - void Init(void); /// initing state of an object - void DeInit(void); /// deiniting state of an object - DWORD AddRuleItem(RULE_ITEM item, bool & bExists); /// n.c. - bool RemReplyAction(DWORD dwCrc32); /// n.c. - RulesHash & getHashTable(void); /// n.c. - COMMON_RULE_ITEM & getCommonRule(void); /// n.c. - void setCommonRule(COMMON_RULE_ITEM r); /// n.c. - void Flush(void); /// flushes all from memory to a file - void FlushItem(RULE_ITEM & item); /// flushes an item into file from memory - bool IsRuleMatch(RULE_METAINFO & info, LPTSTR & strMess, LPTSTR & lpIncomingMsg); /// n.c. - void ClearCommonMessages(void); /// releases memory that is commited for comm. rule - bool RuleIsRegistered(LPTSTR lpContactName); -private: - void RawWriteDataBufByChunk(LPTSTR); /// writes string to a file - UINT RawReadDataBufByChunk(LPTSTR & szData); /// reads string from file - UINT GetCommonMessages(void); /// gets common rules from file to memory - void SetCommonMessages(void); /// sets common rules from memory to file -private: - COMMON_RULE_ITEM m_comItem; /// common rule item.. - RulesHash m_hashTable; /// main storage... - HANDLE m_hFile; /// handle to file that is storing data - TCHAR m_szSettFileName[MAX_PATH]; /// path to a file... - CRITICAL_SECTION m_critSect; /// needed for sync -}; \ No newline at end of file diff --git a/plugins/SmartAutoReplier/SAR.cpp b/plugins/SmartAutoReplier/SAR.cpp deleted file mode 100644 index a2617b496b..0000000000 --- a/plugins/SmartAutoReplier/SAR.cpp +++ /dev/null @@ -1,462 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "resource.h" - -/// these dlg are necessary here.. -#include "gui\settingsdlgholder.h" -#include "gui\EditReplyDlg.h" -#include "gui\addruledlg.h" - -#include "../updater/m_updater.h" - -/// let's advertise myselft and this plugin ;) -#define ICQPROTONAME "SAR" -#if defined( _UNICODE ) -#define ICQPROTODECRSHORT "Smart Auto Replier" -#else -#define ICQPROTODECRSHORT "Smart Auto Replier" -#endif -#define ICQPROTODECR "Plugin is able to reply on all incoming messages, making possible use of rules that are applied to specific contacts. Plugin allows to use Lua scripts as a rules, thus allowing user to make virtually any type of customizations." -#define DEVNAME "Volodymyr M. Shcherbyna" -#define DEVMAIL "volodymyr@shcherbyna.com" -#define DEVCOPYRIGHT "© 2004-2012 Volodymyr M. Shcherbyna, www.shcherbyna.com" -#define DEVWWW "http://www.shcherbyna.com/forum/viewforum.php?f=8" -#define GLOB_HOOKS 3 - -/// global menu items strings... -#define MENU_ITEM_DISABLE_CAPTION TranslateTS(TEXT("Disable Smart Auto Replier")) -#define MENU_ITEM_ENABLE_CAPTION TranslateTS(TEXT("Enable Smart Auto Replier")) - -//#define -/// global data... -HINSTANCE hInst = NULL; /// hinstance -PLUGINLINK *pluginLink = NULL; /// ptr to plugin object -CMessagesHandler *g_pMessHandler = NULL; /// ptr to "main" global manager object -CSettingsDlgHolder *g_pSettingsDlg = NULL; -static HANDLE g_hHook[GLOB_HOOKS] = {NULL}; /// global hooks -CLISTMENUITEM g_mi = {NULL}; /// handle to menu item that is used to switch on/off plugin -CLISTMENUITEM g_miAUR2This = {NULL}; /// handle to menu item that is used to add user to aur -bool g_bEnableMItem = true; /// flag for menu item.. -HANDLE g_hMenuItem; /// global handle to menu service -CCrushLog CRUSHLOGOBJ; /// global object that handles all crushes -LPTSTR g_strPluginName = TEXT(ICQPROTONAME); /// global string that represents plugin name... -INT g_nCurrentMode = 0; /// current mode of a protocol == i duno which exactly protocol... -HANDLE g_hAUR2User = NULL; /// handle to proto service of "autoreply to this user" - -struct MM_INTERFACE mmi; - -/// forming an info structure -PLUGININFOEX pluginInfo = -{ - sizeof(PLUGININFOEX), - ICQPROTODECRSHORT, - PLUGIN_MAKE_VERSION(2, 0, 0, 3), - ICQPROTODECR, - DEVNAME, - DEVMAIL, - DEVCOPYRIGHT, - DEVWWW, - UNICODE_AWARE, - 0, -//#if defined( _UNICODE ) -// // {B9C9AC38-9D81-45D3-A9D7-67A7D8EA9D29} -// { 0xb9c9ac38, 0x9d81, 0x45d3, { 0xa9, 0xd7, 0x67, 0xa7, 0xd8, 0xea, 0x9d, 0x29 } } -//#else - // {9E536082-017E-423B-BF4F-DEDFEB9B3B60} - { 0x9e536082, 0x17e, 0x423b, { 0xbf, 0x4f, 0xde, 0xdf, 0xeb, 0x9b, 0x3b, 0x60 } } -//#endif -}; - -/// mapping into mirandaim.exe -BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) -{ -BEGIN_PROTECT_AND_LOG_CODE - hInst = hinstDLL; - DisableThreadLibraryCalls(hinstDLL); - return TRUE; -END_PROTECT_AND_LOG_CODE -} - -__declspec(dllexport) PLUGININFOEX* MirandaPluginInfoEx(DWORD mirandaVersion) -{ - return &pluginInfo; -} - -extern "C" __declspec(dllexport) const MUUID interfaces[] = {MIID_CHAT, MIID_SRMM, MIID_LAST}; - -__declspec(dllexport) const MUUID * MirandaPluginInterfaces(void) -{ - return interfaces; -} - -/// handler of event when the options are choosed -static int OptionsInitialized(WPARAM wp, LPARAM lp) -{ -BEGIN_PROTECT_AND_LOG_CODE - LPTSTR lpszGroup = TranslateTS(TEXT("Plugins")); - OPTIONSDIALOGPAGE optsDialog = {0}; - optsDialog.cbSize = sizeof(OPTIONSDIALOGPAGE); - optsDialog.hInstance = hInst; - optsDialog.position = 910000000; - optsDialog.pszTemplate = (char*)MAKEINTRESOURCE(IDD_SDLGHOLDER); - TCHAR szMax[MAX_PATH] = {0}; - _tcscpy(szMax, TranslateTS(TEXT(ICQPROTODECRSHORT))); - -#ifdef _UNICODE - optsDialog.ptszGroup = lpszGroup; - optsDialog.ptszTitle = szMax; -#else - optsDialog.pszTitle = (char*)szMax; - optsDialog.pszGroup = lpszGroup; -#endif - optsDialog.pfnDlgProc = (DLGPROC)&CSettingsDlgHolder::FakeDlgProc; - optsDialog.flags = ODPF_BOLDGROUPS/*|ODPF_EXPERTONLY*/; /// some lames are scaring that option... -#ifdef _UNICODE - optsDialog.flags |= ODPF_UNICODE; -#endif - - g_pSettingsDlg->m_bDestroying = false; - CallService(MS_OPT_ADDPAGE, wp, reinterpret_cast(&optsDialog)); -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -/// pre building menu item for a contact.. -static int AURContactPreBuildMenu(WPARAM wParam, LPARAM lParam) -{ - LPTSTR lpContactName = g_pMessHandler->GetContactName(reinterpret_cast(wParam)); - CRulesStorage & storage = g_pMessHandler->getSettings().getStorage(); - bool bval = storage.RuleIsRegistered(lpContactName); - - if (bval) - { - g_miAUR2This.flags = CMIM_FLAGS | CMIF_GRAYED; - } - else - { - g_miAUR2This.flags = CMIM_FLAGS; - } - - CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)g_hAUR2User, (LPARAM)&g_miAUR2This); - - return 0; -} - -/// handler of clicking on menu item -/// aur to this user... -static int AUR2User(WPARAM wParam, LPARAM lParam) -{ - CAddRuleDlg dlg; - RULE_ITEM item; - item.ContactName = g_pMessHandler->GetContactName(reinterpret_cast(wParam)); - //item.ReplyAction = " "; - item.ReplyText = SETTINGS_DEF_MESSAGE_RULE; - TCHAR rulename[MAX_PATH * 5] = {0}; - _tcscat(rulename, TEXT("reply to ")); - _tcscat(rulename, item.ContactName); - item.RuleName = rulename; - - dlg.m_baur2thisMode = true; - dlg.m_item = item; - dlg.DoModal(); - if (dlg.m_bAddedOk) - { /// already added... - OnRefreshSettings(); - } - - return 0; -} - -/// handler of clicking on menu item enablr/disable plugin... -static int PluginMenuCommand(WPARAM wParam, LPARAM lParam) -{ -BEGIN_PROTECT_AND_LOG_CODE - if (!g_pMessHandler) - return 0; - - if (g_bEnableMItem) - {/// lets handle enabling of AUR feature - g_pMessHandler->MakeAction(true); /// this will enable plugin - } - else - {/// lets handle disabling of AUR feature - g_pMessHandler->MakeAction(false); /// this will disable plugin - } - - /// put here stuff to do - TCHAR sz[MAX_PATH] = {0}; - _tcscpy(sz, (g_bEnableMItem == true ? MENU_ITEM_DISABLE_CAPTION : MENU_ITEM_ENABLE_CAPTION)); - g_mi.pszName = (char*)TranslateTS(sz); - g_mi.flags = CMIM_NAME; - -#ifdef _UNICODE - g_mi.flags |= CMIF_UNICODE; -#endif - -#ifdef _DEBUG - int nretval = -#endif - CallService(MS_CLIST_MODIFYMENUITEM, (WPARAM)g_hMenuItem, (LPARAM)&g_mi); - - g_bEnableMItem = !g_bEnableMItem; -END_PROTECT_AND_LOG_CODE - return 0; -} - -/// handler that is invoked when mode is changed -static int OnStatusModeChanged(WPARAM wp, LPARAM lp) -{ -BEGIN_PROTECT_AND_LOG_CODE - g_nCurrentMode = static_cast(wp); - if (!g_pMessHandler) - return FALSE; - - bool bNonOnOffLine = (wp != ID_STATUS_ONLINE && - wp != ID_STATUS_OFFLINE && - wp != ID_STATUS_FREECHAT); - - REPLYER_SETTINGS & s = g_pMessHandler->getSettings().getSettings(); - COMMON_RULE_ITEM & r = g_pMessHandler->getSettings().getStorage().getCommonRule(); - - if (!bNonOnOffLine && s.bDisableWhenModeIsSet) - { - if (s.bEnabled) /// plugin is enabled... we have a chance to disable it - { - bool bDisableIt = false; - - if (s.ModeDisValue == 0) - bDisableIt = true; - else if (s.ModeDisValue == 1 && wp == ID_STATUS_ONLINE) - bDisableIt = true; - else if (s.ModeDisValue == 2 && wp == ID_STATUS_FREECHAT) - bDisableIt = true; - - if (bDisableIt) - { /// disable plugin... - PluginMenuCommand(0, 0); - } - } - return FALSE; - } - - if (s.bShowAURDlgWhenModeChanges) - { - CEditReplyDlg dlg; - dlg.m_commRule = r; - - dlg.DoModal(); - if (dlg.m_bAllOk) - { - r = dlg.m_commRule; - } - } - if (s.bEnableWhenModeIsSet) - { - if (!s.bEnabled) - { - bool bEnable = false; - if (s.ModeValue == 0 && bNonOnOffLine) - bEnable = true; - else if (s.ModeValue == 1 && wp == ID_STATUS_DND) - bEnable = true; - else if (s.ModeValue == 2 && wp == ID_STATUS_NA) - bEnable = true; - else if (s.ModeValue == 3 && wp == ID_STATUS_AWAY) - bEnable = true; - else if (s.ModeValue == 4 && wp == ID_STATUS_OCCUPIED) - bEnable = true; - - if (bEnable) /// enabling plugin... (I realize that enabling and disabling is made via ass but i am lazy today) - PluginMenuCommand(0, 0); - } - } - - return FALSE; -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -#ifndef _DEBUG -LPTOP_LEVEL_EXCEPTION_FILTER UnhandledExceptionFilter( - LPTOP_LEVEL_EXCEPTION_FILTER lpTopLevelExceptionFilter -) -{ - LPTOP_LEVEL_EXCEPTION_FILTER f = {0}; -BEGIN_PROTECT_AND_LOG_CODE - throw f; /// show msgbox to user and store inf to file -END_PROTECT_AND_LOG_CODE - return f; /// let compiler shut ups... -} -#endif - -int OnModulesLoaded(WPARAM wParam, LPARAM lParam) -{ - Update update = {0}; // for c you'd use memset or ZeroMemory... - char szVersion[16]; - - update.cbSize = sizeof(Update); - - update.szComponentName = pluginInfo.shortName; - update.pbVersion = (BYTE*)CreateVersionStringPluginEx(&pluginInfo, szVersion); - update.cpbVersion = strlen((char*)update.pbVersion); - - // these are the three lines that matter - the archive, the page containing the version string, and the text (or data) - // before the version that we use to locate it on the page - // (note that if the update URL and the version URL point to standard file listing entries, the backend xml - // data will be used to check for updates rather than the actual web page - this is not true for beta urls) - //update.szUpdateURL = "http://www.shcherbyna.com/files/sar/SAR.zip"; - //update.szVersionURL = "http://www.shcherbyna.com/files/sar/SAR.html"; - - update.szUpdateURL = "http://addons.miranda-im.org/details.php?action=viewfile&id=1609"; - - //update.pbVersionPrefix = (BYTE *)"SAR version "; - - //update.cpbVersionPrefix = strlen((char *)update.pbVersionPrefix); - - // do the same for the beta versions of the above struct members if you wish to allow beta updates from another URL - - CallService(MS_UPDATE_REGISTER, 0, (WPARAM)&update); - - // Alternatively, to register a plugin with e.g. file ID 2254 on the file listing... - // CallService(MS_UPDATE_REGISTERFL, (WPARAM)2254, (LPARAM)&pluginInfo); - - return 0; -} - -/// loading plugin -extern "C" int __declspec(dllexport) Load(PLUGINLINK *link) -{ -#ifndef _DEBUG - SetUnhandledExceptionFilter(UnhandledExceptionFilter); -#endif -#ifdef _DEBUG - //MessageBox (NULL, __FUNCTION__, __FILE__, MB_OK); -#endif - - CCrushLog::Init(); /// crushes manager should be inited first - int nRetVal = 0; -BEGIN_PROTECT_AND_LOG_CODE - pluginLink = link; - -#ifndef _DEBUG - /// creates help file near plugin - /// if it is absent... - /// note: originally help is in recources of plugin - //CheckForHelpFile(); -#endif - /// main manager... - g_pMessHandler = new CMessagesHandler(); - g_pSettingsDlg = new CSettingsDlgHolder(); - - if (g_pMessHandler) - { /// is inited - REPLYER_SETTINGS & s = g_pMessHandler->getSettings().getSettings(); - if (s.bDisableWhenMirandaIsOn) - { - s.bEnabled = false; - } - else - { - if (s.bEnabled) - g_pMessHandler->HookEvents(); - } - - /// hook main events - //HookEvent(MS_AWAYMSG_SHOWAWAYMSG, OnShow - g_hHook[0] = HookEvent(ME_OPT_INITIALISE, OptionsInitialized); - g_hHook[1] = HookEvent(ME_CLIST_STATUSMODECHANGE, OnStatusModeChanged); - g_hHook[2] = HookEvent(ME_SYSTEM_MODULESLOADED, OnModulesLoaded); - - /// Yushenko Tak, Yanukovich - Mudak. (Orange revolution) - /// this was written in 2004-2005 in Kiev :) - - /// create menu item for disabling / enabling plugin - CreateServiceFunction("AUR/MenuCommand", PluginMenuCommand); - ZeroMemory(&g_mi, sizeof(g_mi)); - g_mi.cbSize = sizeof(g_mi); - g_mi.position = -0x7FFFFFFF; - g_mi.flags = 0; - g_mi.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_SAR_ICON)); //LoadSkinnedIcon(IDI_AUR_ICON/*SKINICON_OTHER_MIRANDA*/); - bool bVal = g_pMessHandler->getSettings().getSettings().bEnabled; - TCHAR sz[MAX_PATH] = {0}; - _tcscpy(sz, bVal ? MENU_ITEM_DISABLE_CAPTION : MENU_ITEM_ENABLE_CAPTION); -#ifdef _UNICODE - g_mi.ptszName = TranslateTS(sz); - g_mi.flags = CMIF_UNICODE; -#else - g_mi.pszName = (char*)TranslateTS(sz); -#endif - g_mi.pszService = "AUR/MenuCommand"; - - g_hMenuItem = (HANDLE)CallService(MS_CLIST_ADDMAINMENUITEM, 0, (LPARAM)&g_mi); - g_bEnableMItem = !bVal; - - /// creating menu item for a contact - ZeroMemory(&g_miAUR2This, sizeof(g_miAUR2This)); - g_miAUR2This.cbSize = sizeof(g_miAUR2This); - g_miAUR2This.position = -2000010000; - g_miAUR2This.flags = 0; - g_miAUR2This.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_SAR_ICON)); - g_miAUR2This.pszContactOwner = NULL; -#ifdef _UNICODE - g_miAUR2This.ptszName = TranslateTS(TEXT("&Smart Auto Reply to this user ...")); - g_miAUR2This.flags = CMIF_UNICODE; -#else - g_miAUR2This.pszName = TranslateTS(TEXT("&Smart Auto Reply to this user ...")); -#endif - CreateServiceFunction("AUR/AURToThis", AUR2User); - g_miAUR2This.pszService = "AUR/AURToThis"; - g_hAUR2User = (HANDLE)CallService(MS_CLIST_ADDCONTACTMENUITEM, 0, (LPARAM)&g_miAUR2This); - HookEvent(ME_CLIST_PREBUILDCONTACTMENU, AURContactPreBuildMenu); - } - - CallService(MS_SYSTEM_GET_MMI, 0, (LPARAM)&mmi); - -END_PROTECT_AND_LOG_CODE - return FALSE; -} - -/// unloading plugin -extern "C" int __declspec(dllexport) Unload(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - for (size_t i = 0; i < GLOB_HOOKS; i++) - UnhookEvent(g_hHook[i]); - - if (g_pSettingsDlg) - { - if (g_pSettingsDlg->IsWindow()) - g_pSettingsDlg->DestroyWindow(); - delete g_pSettingsDlg; - } - if (g_pMessHandler) - { /// unhook manager's events... - g_pMessHandler->UnHookEvents(); - delete g_pMessHandler; /// call dtor - g_pMessHandler = NULL; - } -END_PROTECT_AND_LOG_CODE - - CCrushLog::DeInit(); /// destroy crushes manager obj - return FALSE; -} diff --git a/plugins/SmartAutoReplier/SAR.rc b/plugins/SmartAutoReplier/SAR.rc deleted file mode 100644 index 5ae222d012..0000000000 --- a/plugins/SmartAutoReplier/SAR.rc +++ /dev/null @@ -1,274 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include "resource.h" - -#define APSTUDIO_READONLY_SYMBOLS -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 2 resource. -// -#include "afxres.h" - -///////////////////////////////////////////////////////////////////////////// -#undef APSTUDIO_READONLY_SYMBOLS - -///////////////////////////////////////////////////////////////////////////// -// Ukrainian (Ukraine) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_UKR) -LANGUAGE LANG_UKRAINIAN, SUBLANG_DEFAULT -#pragma code_page(1251) - -///////////////////////////////////////////////////////////////////////////// -// -// Dialog -// - -IDD_OPTIONS DIALOGEX 0, 0, 308, 208 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - EDITTEXT IDC_EDIT_REPLAYDELAY,68,10,29,13,ES_MULTILINE | ES_AUTOHSCROLL | ES_WANTRETURN | ES_NUMBER - EDITTEXT IDC_EDIT_MESSAGE,68,24,232,53,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL - LISTBOX IDC_LIST_RULES,60,84,236,61,LBS_SORT | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_GROUP | WS_TABSTOP - PUSHBUTTON "Add rule",IDC_BTN_ADDRULE,8,85,50,14 - PUSHBUTTON "Delete rule",IDC_BTN_DELRULE,8,101,50,14,WS_DISABLED - PUSHBUTTON "Edit rule",IDC_BTN_EDITRULE,8,117,50,14,WS_DISABLED - LTEXT "Action script:",IDC_STATIC_MESSAGE_TEXT,8,42,51,10 - GROUPBOX "Auto replier settings",IDC_STATIC,0,0,306,204 - LTEXT "Reply delay:",IDC_STATIC,9,12,41,8 - LTEXT "second(s)",IDC_STATIC,106,13,32,8 - GROUPBOX "Custom rules",IDC_STATIC,5,75,294,73 - CONTROL "Disable when Miranda is switched on",IDC_CHECK_DISABLEWMON, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,149,12,151,11 - CONTROL "Enable when status becomes",IDC_CH_ENABLE_WSCH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,152,125,10 - COMBOBOX IDC_CB_ENWSC,144,151,156,36,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Ask to set autoreply message when mode changes",IDC_CH_SHOWCG, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,180,266,10 - CONTROL "Disable when status becomes",IDC_CH_DISWHSB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,167,129,10 - COMBOBOX IDC_CB_DWSB,143,165,156,40,CBS_DROPDOWNLIST | WS_VSCROLL | WS_TABSTOP - CONTROL "Save autoreplies to history",IDC_CH_SAVE_AURS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,6,193,266,10 -END - -IDD_ADDRULE_DLG DIALOGEX 0, 0, 384, 250 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Add contact specific Smart Auto Replier action script" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - EDITTEXT IDC_ED_RULENAME,68,14,184,12,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL - EDITTEXT IDC_ED_RULECNAME,68,29,168,13,ES_MULTILINE | ES_WANTRETURN | WS_VSCROLL - EDITTEXT IDC_ED_RULEREPLY,21,54,342,166,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL - DEFPUSHBUTTON "OK",IDOK,325,231,50,14 - PUSHBUTTON "Cancel",IDCANCEL,273,231,50,14 - PUSHBUTTON "...",IDC_BTN_SELUSER,238,28,13,14 - GROUPBOX "Rule settings",IDC_STATIC,7,3,368,225 - LTEXT "Rule name:",IDC_STATIC,15,16,41,10 - LTEXT "Contact name",IDC_STATIC,15,31,46,10 - GROUPBOX "Action script",IDC_STATIC,14,42,355,182 -END - -IDD_SET_AURMESSAGEDLG DIALOGEX 0, 0, 291, 157 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Set Smart Auto Replier action script" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - EDITTEXT IDC_ED_TEXT,6,10,278,123,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL - DEFPUSHBUTTON "OK",IDOK,239,139,50,14 - PUSHBUTTON "Cancel",IDCANCEL,186,139,50,14 - GROUPBOX "Smart Auto Replier action script",IDC_STATIC,2,0,287,137 -END - -IDD_SEL_USER DIALOGEX 0, 0, 92, 194 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Select user from a list" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "Select",IDOK,51,178,40,14 - PUSHBUTTON "Exit",IDCANCEL,1,178,38,14 - LISTBOX IDC_LIST_USERS,1,2,89,174,LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP -END - -IDD_HISTORYLOGS DIALOGEX 0, 0, 186, 95 -STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU -CAPTION "Dialog" -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - DEFPUSHBUTTON "OK",IDOK,129,7,50,14 - PUSHBUTTON "Cancel",IDCANCEL,129,24,50,14 -END - -IDD_SDLGHOLDER DIALOGEX 0, 0, 326, 253 -STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_SYSMENU -FONT 8, "MS Shell Dlg", 400, 0, 0x1 -BEGIN - CONTROL "",IDC_TABSHOLDER,"SysTabControl32",0x0,4,13,316,224 - LTEXT "Static",IDC_STATUSMSG,7,3,300,8 -END - - -///////////////////////////////////////////////////////////////////////////// -// -// DESIGNINFO -// - -#ifdef APSTUDIO_INVOKED -GUIDELINES DESIGNINFO -BEGIN - IDD_OPTIONS, DIALOG - BEGIN - LEFTMARGIN, 7 - TOPMARGIN, 3 - BOTTOMMARGIN, 195 - END - - IDD_ADDRULE_DLG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 377 - TOPMARGIN, 7 - BOTTOMMARGIN, 247 - END - - IDD_SET_AURMESSAGEDLG, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 284 - TOPMARGIN, 7 - BOTTOMMARGIN, 150 - END - - IDD_SEL_USER, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 85 - TOPMARGIN, 7 - BOTTOMMARGIN, 187 - END - - IDD_HISTORYLOGS, DIALOG - BEGIN - LEFTMARGIN, 7 - RIGHTMARGIN, 179 - TOPMARGIN, 7 - BOTTOMMARGIN, 88 - END - - IDD_SDLGHOLDER, DIALOG - BEGIN - LEFTMARGIN, 2 - RIGHTMARGIN, 302 - TOPMARGIN, 3 - BOTTOMMARGIN, 237 - END -END -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Icon -// - -// Icon with lowest ID value placed first to ensure application icon -// remains consistent on all systems. -IDI_SAR_ICON ICON "sar.ico" -#endif // Ukrainian (Ukraine) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US -#pragma code_page(1252) - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "resource.h\0" -END - -2 TEXTINCLUDE -BEGIN - "#include ""afxres.h""\r\n" - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - -///////////////////////////////////////////////////////////////////////////// -// French (Switzerland) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRS) -LANGUAGE LANG_FRENCH, SUBLANG_FRENCH_SWISS -#pragma code_page(1252) - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION 2,0,0,3 - PRODUCTVERSION 2,0,0,3 - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x0L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "042204b0" - BEGIN - VALUE "CompanyName", "Volodymyr Shcherbyna, www.shcherbyna.com" - VALUE "FileDescription", "Smart Auto Replier plugin for Miranda IM, http://shcherbyna.com/forum/viewforum.php?f=8" - VALUE "FileVersion", "2.0.0.3" - VALUE "InternalName", "sar.dll" - VALUE "LegalCopyright", "Copyright (C) 2004 - 2012 by Volodymyr Shcherbyna" - VALUE "OriginalFilename", "sar.dll" - VALUE "ProductName", "sar.dll" - VALUE "ProductVersion", "2.0.0.3" - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x422, 1200 - END -END - -#endif // French (Switzerland) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED - diff --git a/plugins/SmartAutoReplier/SAR.vcxproj b/plugins/SmartAutoReplier/SAR.vcxproj deleted file mode 100644 index 3091d45ae8..0000000000 --- a/plugins/SmartAutoReplier/SAR.vcxproj +++ /dev/null @@ -1,189 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Template - Win32 - - - - {C71749EF-EBA8-4317-9F9E-327E1A7366EC} - Win32Proj - SAR - - - - DynamicLibrary - MultiByte - true - - - DynamicLibrary - Static - MultiByte - - - - - - - - - - - - - - - <_ProjectFileVersion>10.0.40219.1 - Debug\ - Debug\ - true - Release\ - Release\ - false - AllRules.ruleset - - - AllRules.ruleset - - - AllRules.ruleset - - - ..\lualib;..\wtl\Include;$(IncludePath) - ..\wtl\Include;$(IncludePath) - - - - Disabled - C:\Users\vshcherbyna\Downloads\aur\wtl\Include;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;SAR_EXPORTS;UNICODE;_UNICODE - true - EnableFastChecks - MultiThreadedDebug - Use - Level3 - EditAndContinue - - - D:\Projects\smart-auto-replier\sar\Debug\lualib.lib;shell32.lib;comctl32.lib;%(AdditionalDependencies) - C:\Program Files (x86)\Miranda IM\Plugins\Sar.dll - true - $(OutDir)SAR.pdb - Windows - 0x40000000 - false - - - $(OutDir)SAR.lib - MachineX86 - sar.def - - - - - MinSpace - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;SAR_EXPORTS;UNICODE;_UNICODE;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - - - $(OutDir)$(TargetName)$(TargetExt) - true - Windows - true - true - 0x40000000 - false - - - $(OutDir)SAR.lib - MachineX86 - D:\Projects\smart-auto-replier\sar\Release\lualib.lib;%(AdditionalDependencies) - sar.def - - - - - sar.def - - - - - - - - - - - - - - - - - - Create - Create - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/plugins/SmartAutoReplier/SAR.vcxproj.filters b/plugins/SmartAutoReplier/SAR.vcxproj.filters deleted file mode 100644 index 8c8e9d59f4..0000000000 --- a/plugins/SmartAutoReplier/SAR.vcxproj.filters +++ /dev/null @@ -1,77 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Lua - - - Lua - - - Lua - - - - - - - - - - - - - - - - - - - - - - - - - - Lua - - - Lua - - - Lua - - - Lua - - - - - - - - {f3d54a11-21ba-4f12-b8c0-8576228a1625} - - - - - - - \ No newline at end of file diff --git a/plugins/SmartAutoReplier/SarLuaScript.cpp b/plugins/SmartAutoReplier/SarLuaScript.cpp deleted file mode 100644 index d83f82c51d..0000000000 --- a/plugins/SmartAutoReplier/SarLuaScript.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This code is inspired by article of RichardS at http://www.codeproject.com/Articles/11508/Integrating-Lua-into-C - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "SarLuaScript.h" - -#include "../miranda32/m_protomod.h" -#include "../miranda32/m_protosvc.h" - -extern INT g_nCurrentMode; -extern CMessagesHandler *g_pMessHandler; - -wchar_t* Utf8toUtf16(CHAR * szStrIn, UINT & nSize); -char* Utf16toUtf8(LPCWSTR lpwszStrIn, UINT & nSize); - -CSarLuaScript::CSarLuaScript(CLuaBridge & luaBridge) : CLuaScript(luaBridge) -{ - m_nFuncBaseIndex = RegisterFunction("SendMessage"); - - RegisterFunction("GetMyStatus"); - RegisterFunction("SetMyStatus"); - RegisterFunction("Wait"); - RegisterFunction("FindUser"); - RegisterFunction("SetVariable"); - RegisterFunction("GetVariable"); -} - -CSarLuaScript::~CSarLuaScript(void) -{ -} - -int CSarLuaScript::ScriptCalling(CLuaBridge & luaBridge, int nFncNumber) -{ - switch (nFncNumber - m_nFuncBaseIndex) - { - case 0: - return SendMessage(luaBridge); - - case 1: - return GetMyStatus(luaBridge); - - case 2: - return SetMyStatus(luaBridge); - - case 3: - return Wait(luaBridge); - - case 4: - return FindUser(luaBridge); - - case 5: - return SetVariable(luaBridge); - - case 6: - return GetVariable(luaBridge); - } - - return FALSE; -} - -int CSarLuaScript::SendMessage(CLuaBridge & luaBridge) -{ - lua_State *pFunctionContext = (lua_State*)luaBridge; - - UINT nMessageLen = lua_strlen(pFunctionContext, -1); - const char * szMessage = lua_tostring(pFunctionContext, -1); - int hUserToken = (int)lua_tonumber(pFunctionContext, -2); - - if (szMessage == NULL) - { - return FALSE; - } - - int nRetVal = 0; - -#ifdef _UNICODE - /*/// as I am in unicode, I have to convert all strings from utf8 to utf16 :) - wchar_t * szwMessage = Utf8toUtf16((char*)szMessage, nMessageLen);*/ - - nRetVal = CallContactService((HANDLE)hUserToken, PSS_MESSAGE, PREF_UTF, reinterpret_cast(szMessage)); - - /*free(szwMessage);*/ -#else - nRetVal = CallContactService((HANDLE)hUserToken, PSS_MESSAGE, 0, reinterpret_cast(szMessage)); -#endif - - return FALSE; -} - -int CSarLuaScript::GetMyStatus(CLuaBridge & luaBridge) -{ - lua_State *pFunctionContext = (lua_State*)luaBridge; - int nStatusMode = CallService(MS_CLIST_GETSTATUSMODE, (WPARAM)0, (LPARAM)0); - - nStatusMode = g_nCurrentMode; - - switch (nStatusMode) - { - case ID_STATUS_ONLINE: - AddParam("Online"); - break; - - case ID_STATUS_OFFLINE: - AddParam("Offline"); - break; - - case ID_STATUS_AWAY: - AddParam("Away"); - break; - - case ID_STATUS_DND: - AddParam("DND"); - break; - - case ID_STATUS_NA: - AddParam("NA"); - break; - - case ID_STATUS_OCCUPIED: - AddParam("Occupied"); - break; - - case ID_STATUS_FREECHAT: - AddParam("FreeChat"); - break; - - case ID_STATUS_INVISIBLE: - AddParam("Invisible"); - break; - - case ID_STATUS_ONTHEPHONE: - AddParam("OnThePhone"); - break; - - case ID_STATUS_OUTTOLUNCH: - AddParam("OutToLunch"); - break; - - default: - AddParam("Unknown"); - break; - } - - return TRUE; -} - -int CSarLuaScript::SetMyStatus(CLuaBridge & luaBridge) -{ - int nNewStatus = 0; - lua_State *pFunctionContext = (lua_State*)luaBridge; - - const char * szStatus = lua_tostring(pFunctionContext, -1); - - if (szStatus == NULL) - { - return FALSE; - } - - if (strcmp(szStatus, "Online") == 0) - { - nNewStatus = ID_STATUS_ONLINE; - } - else if (strcmp(szStatus, "Offline") == 0) - { - nNewStatus = ID_STATUS_OFFLINE; - } - else if (strcmp(szStatus, "Away") == 0) - { - nNewStatus = ID_STATUS_AWAY; - } - else if (strcmp(szStatus, "DND") == 0) - { - nNewStatus = ID_STATUS_DND; - } - else if (strcmp(szStatus, "NA") == 0) - { - nNewStatus = ID_STATUS_NA; - } - else if (strcmp(szStatus, "Occupied") == 0) - { - nNewStatus = ID_STATUS_OCCUPIED; - } - else if (strcmp(szStatus, "FreeChat") == 0) - { - nNewStatus = ID_STATUS_FREECHAT; - } - else if (strcmp(szStatus, "Invisible") == 0) - { - nNewStatus = ID_STATUS_INVISIBLE; - } - else if (strcmp(szStatus, "OnThePhone") == 0) - { - nNewStatus = ID_STATUS_ONTHEPHONE; - } - else if (strcmp(szStatus, "OutToLunch") == 0) - { - nNewStatus = ID_STATUS_OUTTOLUNCH; - } - - CallService(MS_CLIST_SETSTATUSMODE, (WPARAM)nNewStatus, (LPARAM)0); - - return FALSE; -} - -typedef map MapOfStrings; - -MapOfStrings g_MapOfVariables; - -int CSarLuaScript::SetVariable(CLuaBridge & luaBridge) -{ - lua_State *pFunctionContext = (lua_State*)luaBridge; - - UINT nNameLength = lua_strlen(pFunctionContext, -2); - const char * szName = lua_tostring(pFunctionContext, -2); - - UINT nVariableLength = lua_strlen(pFunctionContext, -1); - const char * szVariable = lua_tostring(pFunctionContext, -1); - - if (szName == NULL || szVariable == NULL) - { - return FALSE; - } - - wchar_t * szwName = Utf8toUtf16((char*)szName, nNameLength); - wchar_t * szwVariable = Utf8toUtf16((char*)szVariable, nVariableLength); - - if (szwName && szwVariable) - { - g_MapOfVariables[szwName] = szwVariable; - } - - if (szwName) - { - free(szwName); - } - - if (szwVariable) - { - free(szwVariable); - } - - return FALSE; -} - -int CSarLuaScript::GetVariable(CLuaBridge & luaBridge) -{ - lua_State *pFunctionContext = (lua_State*)luaBridge; - - UINT nNameLength = lua_strlen(pFunctionContext, -1); - const char * szName = lua_tostring(pFunctionContext, -1); - - if (szName == NULL) - { - return FALSE; - } - - wchar_t * szwName = Utf8toUtf16((char*)szName, nNameLength); - - if (szwName) - { - MapOfStrings::iterator it = g_MapOfVariables.find(szwName); - - if (it != g_MapOfVariables.end()) - { - UINT nSize = 0; - char * szUtf = Utf16toUtf8(it->second.c_str(), nSize); - - if (szUtf != NULL) - { - AddParam(szUtf); - free(szUtf); - free(szwName); - - return TRUE; - } - } - } - - if (szwName) - { - free(szwName); - } - - return FALSE; -} - -int CSarLuaScript::Wait(CLuaBridge & luaBridge) -{ - lua_State *pFunctionContext = (lua_State*)luaBridge; - - int nSleepInterval = (int)lua_tonumber(pFunctionContext, -1); - - Sleep(1000 * nSleepInterval); - - return FALSE; -} - -int CSarLuaScript::FindUser(CLuaBridge & luaBridge) -{ - lua_State *pFunctionContext = (lua_State*)luaBridge; - - const CHAR * szUser = (CHAR*)lua_tostring(pFunctionContext, -2); - const CHAR * szProtocol = (CHAR*)lua_tostring(pFunctionContext, -1); - - if (szProtocol == NULL || szUser == NULL) - { - return FALSE; - } - - HANDLE hContact = reinterpret_cast(CallService(MS_DB_CONTACT_FINDFIRST, 0, 0)); - CHAR* szContactName = NULL; - CHAR* szProto = NULL; - DWORD wId = 0; - - while (hContact != NULL) - { - szContactName = reinterpret_cast(CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, GCDNF_NOMYHANDLE)); - szProto = (CHAR*)CallService(MS_PROTO_GETCONTACTBASEPROTO, (WPARAM)hContact, 0); - - if (szProto && szContactName) - { - if ( (strcmp(szUser, szContactName)) == 0 && (strcmp(szProto, szProtocol) == 0)) - { - AddParam((int)hContact); - return TRUE; - } - } - - hContact = reinterpret_cast (CallService(MS_DB_CONTACT_FINDNEXT,(WPARAM) hContact, 0)); - } - - return FALSE; -} - -void CSarLuaScript::HandleReturns(CLuaBridge & luaBridge, const char *szFunc) -{ - -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/SarLuaScript.h b/plugins/SmartAutoReplier/SarLuaScript.h deleted file mode 100644 index 26b9ba1a61..0000000000 --- a/plugins/SmartAutoReplier/SarLuaScript.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This code is inspired by article of RichardS at http://www.codeproject.com/Articles/11508/Integrating-Lua-into-C - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "LuaBridge.h" -#include "LuaScript.h" - -#include -#include - -using namespace std; - -class CSarLuaScript : public CLuaScript -{ -public: - CSarLuaScript(CLuaBridge & luaBridge); - ~CSarLuaScript(void); - -private: - int SendMessage(CLuaBridge & luaBridge); - int GetMyStatus(CLuaBridge & luaBridge); - int SetMyStatus(CLuaBridge & luaBridge); - int Wait(CLuaBridge & luaBridge); - int FindUser(CLuaBridge & luaBridge); - int SetVariable(CLuaBridge & luaBridge); - int GetVariable(CLuaBridge & luaBridge); - -protected: - int ScriptCalling(CLuaBridge & luaBridge, int nFncNumber); - - void HandleReturns(CLuaBridge & luaBridge, const char *szFunc); - -protected: - int m_nFuncBaseIndex; -}; - diff --git a/plugins/SmartAutoReplier/ScriptsReader.cpp b/plugins/SmartAutoReplier/ScriptsReader.cpp deleted file mode 100644 index 4bd45d22e6..0000000000 --- a/plugins/SmartAutoReplier/ScriptsReader.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "scriptsreader.h" -#include "messageshandler.h" -#include "modemesshandler.h" - -extern INT g_nCurrentMode; -extern CMessagesHandler * g_pMessHandler; - -/// ctor -CScriptsReader::CScriptsReader(void) -{ -} - -/// dtor -CScriptsReader::~CScriptsReader(void) -{ -} - -/// dtor -void CScriptsReader::InternalInit(void) -{ -} - -ACTIONS CScriptsReader::ParceString(LPTSTR & strMessage) -{ - ACTIONS act; - return act; -} - -bool CScriptsReader::Replace(LPSTR & lpString, LPSTR strReplWhat, LPSTR & strReplWith) -{ -BEGIN_PROTECT_AND_LOG_CODE - if (strcmp(lpString, strReplWhat) == 0) - { - strcpy(lpString, strReplWith); - return true; - } - char * ptr = strstr(lpString, strReplWhat); - if (ptr) - { - int nPos = static_cast(ptr - lpString + 1); - if (!nPos) - return false; - char *szPrev = new char[nPos]; - - if (!szPrev) - return false; - strncpy(szPrev, lpString, nPos - 1); - int nPos2 = static_cast(nPos + strlen(strReplWhat)); - int nLength = static_cast(strlen(lpString)); - int nSize2 = nLength - nPos2 + 1; - if (nSize2 == 0) - nSize2++; - char *szPost = new char[nSize2]; - if (!szPost) - { - delete szPrev; - return false; - } - ptr += strlen(strReplWhat); - if (nPos == 1) - { - ptr++; - } - strncpy(szPost, ptr, nSize2); - strcpy(lpString, szPrev); - strcat(lpString, strReplWith); - if (nPos == 1) - strcat(lpString, " "); - strcat(lpString, szPost); - delete szPrev; - delete szPost; - - return Replace(lpString, strReplWhat, strReplWith); - } - else - return false; -END_PROTECT_AND_LOG_CODE - return false; -} - -/// returnes message that is replied to contact. -/// the core of a plugin ;) (a joke..) -bool CScriptsReader::GetReturnMessage(LPTSTR lpContactName, LPTSTR & lpMsg, LPTSTR & lpIncomingMsg) -{ -BEGIN_PROTECT_AND_LOG_CODE - DWORD dwSizeOfMess = SETTINGS_MESSAGE_MAXVALENGTH + SETTINGS_HEADER_MAXVALENGTH; - dwSizeOfMess += _tcslen(lpIncomingMsg); - LPTSTR szOwnNick = g_pMessHandler->GetContactName(NULL); - if (szOwnNick) - dwSizeOfMess += _tcslen(szOwnNick); - - bool bspecific = (lpMsg != NULL); - dwSizeOfMess = dwSizeOfMess * 3; /// Any replacing can cause increasing size of data - LPTSTR lpPrev = NULL; - if (bspecific) - { - dwSizeOfMess += _tcslen(lpMsg); - lpPrev = lpMsg; - } - - lpMsg = new TCHAR[dwSizeOfMess]; - - memset(lpMsg, 0, dwSizeOfMess * sizeof(TCHAR)); - - COMMON_RULE_ITEM & commRule = g_pMessHandler->getSettings().getStorage().getCommonRule(); - - if (!bspecific) - { - _tcscpy(lpMsg, commRule.Message); - } - else - { - _tcscpy(lpMsg, lpPrev); - VirtualFree (lpPrev, NULL, MEM_RELEASE); - } - - /*TCHAR strDate[0x100] = {0}; - SYSTEMTIME t = {0}; - GetLocalTime(&t); - sprintf(strDate, "[%d-%d-%d %d-%d-%d]", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); - LPSTR lp = strDate; - if (!bspecific) - { - _tcscat(lpMsg, "\r\n"); - _tcscat(lpMsg, commRule.Message); - } - - Replace(lpMsg, SETTINGS_SCRIPT_CURRDATA, lp); - Replace(lpMsg, SETTINGS_SCRIPT_USERNAME, lpContactName); - Replace(lpMsg, SETTINGS_SCRIPT_OWNNICKNAME, szOwnNick); - - LPTSTR lptMMess = CModeMessHandler::GetModeMessage(g_nCurrentMode); - - if (lptMMess) - { - Replace(lpMsg, SETTINGS_SCRIPT_MODEMESSAGE, lptMMess); - /// seems like i should free this ptr - /// but when this is done heap is corrupted - /// so better we have a leak of small amount - /// of memory then corrupted heap. (imho).Sad - /// free (lptMMess); - } - - Replace(lpMsg, SETTINGS_SCRIPT_INCOMMINGMESSAGE, lpIncomingMsg);*/ - - if (lpMsg) - return true; - else - return false; - -END_PROTECT_AND_LOG_CODE - return false; -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/ScriptsReader.h b/plugins/SmartAutoReplier/ScriptsReader.h deleted file mode 100644 index c2b89c3d0f..0000000000 --- a/plugins/SmartAutoReplier/ScriptsReader.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include - -/// class that converts all scripts -/// into an actions or raw text - -/// replacing commands -#define SETTINGS_SCRIPT_USERNAME "%username%" -#define SETTINGS_SCRIPT_CURRDATA "%currdate%" -#define SETTINGS_SCRIPT_MODEMESSAGE "%modemessage%" -#define SETTINGS_SCRIPT_INCOMMINGMESSAGE "%incomingmessage%" -#define SETTINGS_SCRIPT_OWNNICKNAME "%ownnickname%" - -/// actios commands - -typedef struct _ACTION -{ - LPTSTR ActionCode; -}ACTION, *PACTION; - -typedef std::list ACTIONS; - -class CScriptsReader -{ -public: - CScriptsReader(void); - ~CScriptsReader(void); -public: - ACTIONS ParceString(LPTSTR & strMessage); - bool GetReturnMessage(LPTSTR lpContactName, LPTSTR & lpMsg, LPTSTR & lpIncomingMsg); - static bool Replace(LPSTR & lpString, LPSTR strReplWhat, LPSTR & strReplWith); -private: - void InternalInit(void); -private: -}; \ No newline at end of file diff --git a/plugins/SmartAutoReplier/SettingsHandler.cpp b/plugins/SmartAutoReplier/SettingsHandler.cpp deleted file mode 100644 index c95ea0c539..0000000000 --- a/plugins/SmartAutoReplier/SettingsHandler.cpp +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "settingshandler.h" -#include "modemesshandler.h" - -/// we need hinst -extern HINSTANCE hInst; -extern CCrushLog CRUSHLOGOBJ; -extern INT g_nCurrentMode; - -/// ctor -CSettingsHandler::CSettingsHandler(void) : m_bResettings(false), -m_replSize(sizeof(REPLYER_SETTINGS)) -{ -BEGIN_PROTECT_AND_LOG_CODE - MakeFullPath(m_szSettFileName, sizeof(m_szSettFileName), SETTINGS_DB); - m_rulesStorage.Init(); -END_PROTECT_AND_LOG_CODE -} - -/// d'ctor -CSettingsHandler::~CSettingsHandler(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - DeInit(); - m_rulesStorage.Flush(); -END_PROTECT_AND_LOG_CODE -} - -/// changing settings... -void CSettingsHandler::setSettings(REPLYER_SETTINGS & settings, COMMON_RULE_ITEM * pcommrule) -{ -BEGIN_PROTECT_AND_LOG_CODE - m_Settings = settings; -#ifdef _DEBUG - bool bflushed = -#endif - Serialize(&m_Settings, m_replSize); - if (pcommrule) - { - m_rulesStorage.setCommonRule(*pcommrule); - DWORD dw = NULL; - m_rulesStorage.Serialize(NULL, dw); - } -END_PROTECT_AND_LOG_CODE -} - -bool CSettingsHandler::Serialize(ISettingsStream *pSettings, DWORD & ObjectSize) -{ -BEGIN_PROTECT_AND_LOG_CODE - bool bRetVal = false; - HANDLE hFile = CreateFile (m_szSettFileName, GENERIC_WRITE, - FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == NULL || hFile == INVALID_HANDLE_VALUE) - return bRetVal; /// - else - { /// check ptr for null - bool bValid = (pSettings != NULL); - if (bValid) /// for readibility.. - bValid = (IsBadReadPtr(pSettings, sizeof(pSettings)) == TRUE ? false : true); - - DWORD dwWritten = NULL; - bRetVal = (WriteFile (hFile, (bValid ? pSettings : &m_Settings), sizeof(REPLYER_SETTINGS), &dwWritten, NULL) == TRUE ? true : false); - CloseHandle (hFile); - return bRetVal; - } -END_PROTECT_AND_LOG_CODE - return false; -} - -bool CSettingsHandler::Deserialize(DWORD & ObjectSize) -{ -BEGIN_PROTECT_AND_LOG_CODE - bool bRetVal = false; - HANDLE hFile = CreateFile (m_szSettFileName, GENERIC_READ, - FILE_SHARE_READ, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, NULL); - if (hFile == NULL || hFile == INVALID_HANDLE_VALUE) - return bRetVal; /// - else - { - DWORD dwSizeHigh = 0; - DWORD dwSize = GetFileSize(hFile, &dwSizeHigh); - - if (dwSize != ObjectSize) - { - bool bDel = NotifyAboutWrongSettings(m_szSettFileName); - if (bDel) - { - CloseHandle (hFile); - DeleteFile (m_szSettFileName); - m_bResettings = true; - Init(); - m_bResettings = false; - return true; - } - } - DWORD dwReaded = NULL; - bRetVal = (ReadFile (hFile, &m_Settings, ObjectSize, &dwReaded, NULL) == TRUE ? true : false); - CloseHandle (hFile); - - return bRetVal; - } -END_PROTECT_AND_LOG_CODE - return false; -} - -void CSettingsHandler::Init(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - - if (!PathFileExists(m_szSettFileName)) - { /// create file with def settings... - /// create def. configuration and store it to file... - m_Settings.bDisableWhenModeIsSet = SETTINGS_DEF_COMMON_EN_DISONMODEON; - m_Settings.ModeDisValue = SETTINGS_DEF_COMMON_EN_ONMODEDISVAL; - m_Settings.bShowAURDlgWhenModeChanges = false; - m_Settings.bEnableWhenModeIsSet = SETTINGS_DEF_COMMON_EN_ONMODEON; - m_Settings.ModeValue = SETTINGS_DEF_COMMON_EN_ONMODEONVAL; - - m_Settings.bDisableWhenMirandaIsOn = SETTINGS_DEF_COMMON_DWMION; - m_Settings.ReplayDelay = SETTINGS_DEF_COMMON_VALREPDELAY; - m_Settings.bEnabled = true; - m_Settings.bFirstRun = !m_bResettings; - m_Settings.bSaveToHistory = false; - - Serialize(&m_Settings, m_replSize); - - if (m_Settings.bFirstRun) - { /// show only once to user readme file... - m_Settings.bFirstRun = false; - TCHAR * szreadme = NULL; - szreadme = new TCHAR[MAX_PATH + 1]; - if (szreadme) - { - //MakeFullPath(szreadme, MAX_PATH, READMEFILE); - ::ShellExecute(NULL, TEXT("open"), TEXT("http://www.shcherbyna.com/?page_id=1747"), NULL, NULL, SW_SHOW); - //::ShellExecute(NULL, "open", TEXT("http://shcherbyna.com/forum/viewforum.php?f=8"), NULL, NULL, SW_SHOW); - - delete szreadme; - } - } - } - else - { - Deserialize(m_replSize); - } -END_PROTECT_AND_LOG_CODE -} - -void CSettingsHandler::DeInit(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - Serialize(&m_Settings, m_replSize); -END_PROTECT_AND_LOG_CODE -} - -CScriptsReader & CSettingsHandler::getScriptsReader(void) -{ - return m_scriptsReader; -} - -REPLYER_SETTINGS & CSettingsHandler::getSettings(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - return m_Settings; -END_PROTECT_AND_LOG_CODE -} - -DWORD CSettingsHandler::AddReplyAction(RULE_ITEM item, bool & bExists) -{ -BEGIN_PROTECT_AND_LOG_CODE - return m_rulesStorage.AddRuleItem(item, bExists); -END_PROTECT_AND_LOG_CODE - return 0; -} - -CRulesStorage & CSettingsHandler::getStorage(void) -{ -BEGIN_PROTECT_AND_LOG_CODE - return m_rulesStorage; -END_PROTECT_AND_LOG_CODE -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/SettingsHandler.h b/plugins/SmartAutoReplier/SettingsHandler.h deleted file mode 100644 index 9e0a859796..0000000000 --- a/plugins/SmartAutoReplier/SettingsHandler.h +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "RuleItem.h" -#include "RulesStorage.h" -#include "interfaces\ISettings.h" -#include "comfunc.h" -#include "scriptsreader.h" - -/// settings defs... -#define SETTINGS_DB TEXT("sar.csu") -#define READMEFILE TEXT("sar.html") - -#define SETTINGS_HEADER_MAXVALENGTH 1024 * 1 /// 1 kb by def -#define SETTINGS_MESSAGE_MAXVALENGTH 1024 * 3 /// 3 kb by def - -#define SETTINGS_DEF_COMMON_DWMION 1 -#define SETTINGS_DEF_COMMVALUE 0 - -#define SETTINGS_DEF_MESSAGE TEXT("function this.SAR(this, hUser, szMessage, szUser, szProtocol)\r\n this:SendMessage(hUser, \"Here is my autoreply!\")\r\nend") -#define SETTINGS_DEF_MESSAGE_RULE TEXT("-- Main handler function written in Lua:\r\n\r\nfunction this.SAR(this, hUser, szMessage, szUser, szProtocol)\r\n this:SendMessage(hUser, \"Here is my specific to user autoreply!\")\r\nend") -#define SETTINGS_DEF_RULE_NAME TEXT("Some generic rule name") - -#define SETTINGS_DEF_COMMON_VALREPDELAY 2 -#define SETTINGS_DEF_COMMON_EN_ONMODEON 0 -#define SETTINGS_DEF_COMMON_EN_DISONMODEON 0 - -#define SETTINGS_DEF_COMMON_EN_ONMODEDISVAL 0 -#define SETTINGS_DEF_COMMON_EN_ONMODEONVAL 0 -#define SETTINGS_DEF_COMMON_SHOWAURDLGWMC 0 - -/// settings that are stored in file... -/// serialized -typedef struct _REPLYER_SETTINGS : ISettingsStream -{ - bool bEnabled; - bool bDisableWhenMirandaIsOn; - int ReplayDelay; - bool bEnableWhenModeIsSet; - bool bDisableWhenModeIsSet; - int ModeValue; - int ModeDisValue; - bool bShowAURDlgWhenModeChanges; - bool bFirstRun; - bool bSaveToHistory; -}REPLYER_SETTINGS, *PREPLYER_SETTINGS; - -#ifndef MAX_PATH - #define MAX_PATH 260 -#endif - -/// manager that handles settings of a plugin... -class CSettingsHandler : ISettings -{ -public: - CSettingsHandler(void); - ~CSettingsHandler(void); -public: /// ISettings interface... - bool Serialize(ISettingsStream *pSettings, DWORD & ObjectSize); - bool Deserialize(DWORD & ObjectSize); -public: - void Init(void); /// deserialize... - void DeInit(void); /// serialize... - REPLYER_SETTINGS & getSettings(void); - CScriptsReader & getScriptsReader(void); - CRulesStorage & getStorage(void); - void setSettings(REPLYER_SETTINGS & settings, COMMON_RULE_ITEM * pcommrule = NULL); - DWORD AddReplyAction(RULE_ITEM item, bool & bExists); -private: - REPLYER_SETTINGS m_Settings; - TCHAR m_szSettFileName[MAX_PATH]; - bool m_bResettings; - CRulesStorage m_rulesStorage; - CScriptsReader m_scriptsReader; - DWORD m_replSize; -}; \ No newline at end of file diff --git a/plugins/SmartAutoReplier/comfunc.cpp b/plugins/SmartAutoReplier/comfunc.cpp deleted file mode 100644 index 0f79871fbb..0000000000 --- a/plugins/SmartAutoReplier/comfunc.cpp +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" -#include "comfunc.h" -#include "shlobj.h" - -extern LPTSTR g_strPluginName; -extern HINSTANCE hInst; - -/// show to user msgbox that settings -/// file is corrupted... -bool NotifyAboutWrongSettings(LPTSTR szFile) -{ - TCHAR szTxt[MAX_PATH * 2] = {0}; - _tcscpy(szTxt, TEXT("Settings file: ")); - _tcscat(szTxt, szFile); - _tcscat(szTxt, TEXT(" is corrupted !\n")); - _tcscat(szTxt, TEXT("As a result plugin can crush.\n")); - _tcscat(szTxt, TEXT("Reset settings to default ?")); - - DWORD dw = MessageBox(NULL, TranslateTS(szTxt), g_strPluginName, MB_YESNO); - return (dw == IDYES); -} - -/// forming path -bool MakeFullPath(LPTSTR lpRetval, DWORD dwSize, LPTSTR lpFile) -{ - HRESULT hr = SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, SHGFP_TYPE_CURRENT, lpRetval); - size_t nLen = _tcslen(lpRetval); - - if (lpRetval[nLen - 1] != TEXT('\\')) - { - _tcscat(lpRetval, TEXT("\\Sar\\")); - } - else - { - _tcscat(lpRetval, TEXT("Sar\\")); - } - - _tcscat(lpRetval, lpFile); - - /*GetModuleFileName(hInst, lpRetval, dwSize); - TCHAR *ptrPos = _tcsrchr(lpRetval, '\\'); - if (ptrPos) - { - ptrPos++; - _tcscpy (ptrPos, lpFile); - } - else - { - _RPT0(_CRT_WARN, "MakeFullPath - unable to form path"); - return false; - }*/ - return true; -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/comfunc.h b/plugins/SmartAutoReplier/comfunc.h deleted file mode 100644 index ab74a7e8ca..0000000000 --- a/plugins/SmartAutoReplier/comfunc.h +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -bool NotifyAboutWrongSettings(LPTSTR szFile); -bool MakeFullPath(LPTSTR lpRetval, DWORD dwSize, LPTSTR lpFile); -bool CheckForHelpFile(); \ No newline at end of file diff --git a/plugins/SmartAutoReplier/comlogging.h b/plugins/SmartAutoReplier/comlogging.h deleted file mode 100644 index ea8482a198..0000000000 --- a/plugins/SmartAutoReplier/comlogging.h +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -/// define hlobal object.. -#ifndef CRUSHLOGOBJ - #define CRUSHLOGOBJ g_crushLog -#endif - -/// this macro should be placed at the begining of any func of plugin.. -#ifndef BEGIN_PROTECT_AND_LOG_CODE - #define BEGIN_PROTECT_AND_LOG_CODE try { \ - SetLastError(0); -#endif - -/// this macro should be placed at the end of any func of plugin.. -#ifndef END_PROTECT_AND_LOG_CODE - #define END_PROTECT_AND_LOG_CODE } \ - catch (...) \ - { \ - CCrushLog::InternalProtect(__FUNCTION__, __FILE__, __DATE__, __LINE__, GetLastError());\ - } -#endif diff --git a/plugins/SmartAutoReplier/luainc.h b/plugins/SmartAutoReplier/luainc.h deleted file mode 100644 index 276c25bae5..0000000000 --- a/plugins/SmartAutoReplier/luainc.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This code is inspired by article of RichardS at http://www.codeproject.com/Articles/11508/Integrating-Lua-into-C - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -extern "C" -{ - #include "../lualib/lua.h" - #include "../lualib/lauxlib.h" - #include "../lualib/lualib.h" -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/lualib/ReadMe.txt b/plugins/SmartAutoReplier/lualib/ReadMe.txt deleted file mode 100644 index 457efed27e..0000000000 --- a/plugins/SmartAutoReplier/lualib/ReadMe.txt +++ /dev/null @@ -1,37 +0,0 @@ -======================================================================== - STATIC LIBRARY : lualib Project Overview -======================================================================== - -AppWizard has created this lualib library project for you. - -This file contains a summary of what you will find in each of the files that -make up your lualib application. - - -lualib.vcxproj - This is the main project file for VC++ projects generated using an Application Wizard. - It contains information about the version of Visual C++ that generated the file, and - information about the platforms, configurations, and project features selected with the - Application Wizard. - -lualib.vcxproj.filters - This is the filters file for VC++ projects generated using an Application Wizard. - It contains information about the association between the files in your project - and the filters. This association is used in the IDE to show grouping of files with - similar extensions under a specific node (for e.g. ".cpp" files are associated with the - "Source Files" filter). - - -///////////////////////////////////////////////////////////////////////////// - -StdAfx.h, StdAfx.cpp - These files are used to build a precompiled header (PCH) file - named lualib.pch and a precompiled types file named StdAfx.obj. - -///////////////////////////////////////////////////////////////////////////// -Other notes: - -AppWizard uses "TODO:" comments to indicate parts of the source code you -should add to or customize. - -///////////////////////////////////////////////////////////////////////////// diff --git a/plugins/SmartAutoReplier/lualib/lapi.c b/plugins/SmartAutoReplier/lualib/lapi.c deleted file mode 100644 index d5dd9ca465..0000000000 --- a/plugins/SmartAutoReplier/lualib/lapi.c +++ /dev/null @@ -1,922 +0,0 @@ -/* -** $Id: lapi.c,v 1.235 2003/04/07 14:36:08 roberto Exp $ -** Lua API -** See Copyright Notice in lua.h -*/ - - -#include -#include - -#define lapi_c - -#include "lua.h" - -#include "lapi.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lundump.h" -#include "lvm.h" - - -const char lua_ident[] = - "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n" - "$Authors: " LUA_AUTHORS " $\n" - "$URL: www.lua.org $\n"; - - - -#ifndef api_check -#define api_check(L, o) /*{ assert(o); }*/ -#endif - -#define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base)) - -#define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;} - - - - -static TObject *negindex (lua_State *L, int idx) { - if (idx > LUA_REGISTRYINDEX) { - api_check(L, idx != 0 && -idx <= L->top - L->base); - return L->top+idx; - } - else switch (idx) { /* pseudo-indices */ - case LUA_REGISTRYINDEX: return registry(L); - case LUA_GLOBALSINDEX: return gt(L); - default: { - TObject *func = (L->base - 1); - idx = LUA_GLOBALSINDEX - idx; - lua_assert(iscfunction(func)); - return (idx <= clvalue(func)->c.nupvalues) - ? &clvalue(func)->c.upvalue[idx-1] - : NULL; - } - } -} - - -static TObject *luaA_index (lua_State *L, int idx) { - if (idx > 0) { - api_check(L, idx <= L->top - L->base); - return L->base + idx - 1; - } - else { - TObject *o = negindex(L, idx); - api_check(L, o != NULL); - return o; - } -} - - -static TObject *luaA_indexAcceptable (lua_State *L, int idx) { - if (idx > 0) { - TObject *o = L->base+(idx-1); - api_check(L, idx <= L->stack_last - L->base); - if (o >= L->top) return NULL; - else return o; - } - else - return negindex(L, idx); -} - - -void luaA_pushobject (lua_State *L, const TObject *o) { - setobj2s(L->top, o); - incr_top(L); -} - - -LUA_API int lua_checkstack (lua_State *L, int size) { - int res; - lua_lock(L); - if ((L->top - L->base + size) > LUA_MAXCSTACK) - res = 0; /* stack overflow */ - else { - luaD_checkstack(L, size); - if (L->ci->top < L->top + size) - L->ci->top = L->top + size; - res = 1; - } - lua_unlock(L); - return res; -} - - -LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { - int i; - lua_lock(to); - api_checknelems(from, n); - from->top -= n; - for (i = 0; i < n; i++) { - setobj2s(to->top, from->top + i); - api_incr_top(to); - } - lua_unlock(to); -} - - -LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf) { - lua_CFunction old; - lua_lock(L); - old = G(L)->panic; - G(L)->panic = panicf; - lua_unlock(L); - return old; -} - - -LUA_API lua_State *lua_newthread (lua_State *L) { - lua_State *L1; - lua_lock(L); - luaC_checkGC(L); - L1 = luaE_newthread(L); - setthvalue(L->top, L1); - api_incr_top(L); - lua_unlock(L); - lua_userstateopen(L1); - return L1; -} - - - -/* -** basic stack manipulation -*/ - - -LUA_API int lua_gettop (lua_State *L) { - return (L->top - L->base); -} - - -LUA_API void lua_settop (lua_State *L, int idx) { - lua_lock(L); - if (idx >= 0) { - api_check(L, idx <= L->stack_last - L->base); - while (L->top < L->base + idx) - setnilvalue(L->top++); - L->top = L->base + idx; - } - else { - api_check(L, -(idx+1) <= (L->top - L->base)); - L->top += idx+1; /* `subtract' index (index is negative) */ - } - lua_unlock(L); -} - - -LUA_API void lua_remove (lua_State *L, int idx) { - StkId p; - lua_lock(L); - p = luaA_index(L, idx); - while (++p < L->top) setobjs2s(p-1, p); - L->top--; - lua_unlock(L); -} - - -LUA_API void lua_insert (lua_State *L, int idx) { - StkId p; - StkId q; - lua_lock(L); - p = luaA_index(L, idx); - for (q = L->top; q>p; q--) setobjs2s(q, q-1); - setobjs2s(p, L->top); - lua_unlock(L); -} - - -LUA_API void lua_replace (lua_State *L, int idx) { - lua_lock(L); - api_checknelems(L, 1); - setobj(luaA_index(L, idx), L->top - 1); /* write barrier */ - L->top--; - lua_unlock(L); -} - - -LUA_API void lua_pushvalue (lua_State *L, int idx) { - lua_lock(L); - setobj2s(L->top, luaA_index(L, idx)); - api_incr_top(L); - lua_unlock(L); -} - - - -/* -** access functions (stack -> C) -*/ - - -LUA_API int lua_type (lua_State *L, int idx) { - StkId o = luaA_indexAcceptable(L, idx); - return (o == NULL) ? LUA_TNONE : ttype(o); -} - - -LUA_API const char *lua_typename (lua_State *L, int t) { - UNUSED(L); - return (t == LUA_TNONE) ? "no value" : luaT_typenames[t]; -} - - -LUA_API int lua_iscfunction (lua_State *L, int idx) { - StkId o = luaA_indexAcceptable(L, idx); - return (o == NULL) ? 0 : iscfunction(o); -} - - -LUA_API int lua_isnumber (lua_State *L, int idx) { - TObject n; - const TObject *o = luaA_indexAcceptable(L, idx); - return (o != NULL && tonumber(o, &n)); -} - - -LUA_API int lua_isstring (lua_State *L, int idx) { - int t = lua_type(L, idx); - return (t == LUA_TSTRING || t == LUA_TNUMBER); -} - - -LUA_API int lua_isuserdata (lua_State *L, int idx) { - const TObject *o = luaA_indexAcceptable(L, idx); - return (o != NULL && (ttisuserdata(o) || ttislightuserdata(o))); -} - - -LUA_API int lua_rawequal (lua_State *L, int index1, int index2) { - StkId o1 = luaA_indexAcceptable(L, index1); - StkId o2 = luaA_indexAcceptable(L, index2); - return (o1 == NULL || o2 == NULL) ? 0 /* index out of range */ - : luaO_rawequalObj(o1, o2); -} - - -LUA_API int lua_equal (lua_State *L, int index1, int index2) { - StkId o1, o2; - int i; - lua_lock(L); /* may call tag method */ - o1 = luaA_indexAcceptable(L, index1); - o2 = luaA_indexAcceptable(L, index2); - i = (o1 == NULL || o2 == NULL) ? 0 /* index out of range */ - : equalobj(L, o1, o2); - lua_unlock(L); - return i; -} - - -LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { - StkId o1, o2; - int i; - lua_lock(L); /* may call tag method */ - o1 = luaA_indexAcceptable(L, index1); - o2 = luaA_indexAcceptable(L, index2); - i = (o1 == NULL || o2 == NULL) ? 0 /* index out-of-range */ - : luaV_lessthan(L, o1, o2); - lua_unlock(L); - return i; -} - - - -LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { - TObject n; - const TObject *o = luaA_indexAcceptable(L, idx); - if (o != NULL && tonumber(o, &n)) - return nvalue(o); - else - return 0; -} - - -LUA_API int lua_toboolean (lua_State *L, int idx) { - const TObject *o = luaA_indexAcceptable(L, idx); - return (o != NULL) && !l_isfalse(o); -} - - -LUA_API const char *lua_tostring (lua_State *L, int idx) { - StkId o = luaA_indexAcceptable(L, idx); - if (o == NULL) - return NULL; - else if (ttisstring(o)) - return svalue(o); - else { - const char *s; - lua_lock(L); /* `luaV_tostring' may create a new string */ - s = (luaV_tostring(L, o) ? svalue(o) : NULL); - luaC_checkGC(L); - lua_unlock(L); - return s; - } -} - - -LUA_API size_t lua_strlen (lua_State *L, int idx) { - StkId o = luaA_indexAcceptable(L, idx); - if (o == NULL) - return 0; - else if (ttisstring(o)) - return tsvalue(o)->tsv.len; - else { - size_t l; - lua_lock(L); /* `luaV_tostring' may create a new string */ - l = (luaV_tostring(L, o) ? tsvalue(o)->tsv.len : 0); - lua_unlock(L); - return l; - } -} - - -LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { - StkId o = luaA_indexAcceptable(L, idx); - return (o == NULL || !iscfunction(o)) ? NULL : clvalue(o)->c.f; -} - - -LUA_API void *lua_touserdata (lua_State *L, int idx) { - StkId o = luaA_indexAcceptable(L, idx); - if (o == NULL) return NULL; - switch (ttype(o)) { - case LUA_TUSERDATA: return (uvalue(o) + 1); - case LUA_TLIGHTUSERDATA: return pvalue(o); - default: return NULL; - } -} - - -LUA_API lua_State *lua_tothread (lua_State *L, int idx) { - StkId o = luaA_indexAcceptable(L, idx); - return (o == NULL || !ttisthread(o)) ? NULL : thvalue(o); -} - - -LUA_API const void *lua_topointer (lua_State *L, int idx) { - StkId o = luaA_indexAcceptable(L, idx); - if (o == NULL) return NULL; - else { - switch (ttype(o)) { - case LUA_TTABLE: return hvalue(o); - case LUA_TFUNCTION: return clvalue(o); - case LUA_TTHREAD: return thvalue(o); - case LUA_TUSERDATA: - case LUA_TLIGHTUSERDATA: - return lua_touserdata(L, idx); - default: return NULL; - } - } -} - - - -/* -** push functions (C -> stack) -*/ - - -LUA_API void lua_pushnil (lua_State *L) { - lua_lock(L); - setnilvalue(L->top); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushnumber (lua_State *L, lua_Number n) { - lua_lock(L); - setnvalue(L->top, n); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { - lua_lock(L); - luaC_checkGC(L); - setsvalue2s(L->top, luaS_newlstr(L, s, len)); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushstring (lua_State *L, const char *s) { - if (s == NULL) - lua_pushnil(L); - else - lua_pushlstring(L, s, strlen(s)); -} - - -LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, - va_list argp) { - const char *ret; - lua_lock(L); - luaC_checkGC(L); - ret = luaO_pushvfstring(L, fmt, argp); - lua_unlock(L); - return ret; -} - - -LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...) { - const char *ret; - va_list argp; - lua_lock(L); - luaC_checkGC(L); - va_start(argp, fmt); - ret = luaO_pushvfstring(L, fmt, argp); - va_end(argp); - lua_unlock(L); - return ret; -} - - -LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { - Closure *cl; - lua_lock(L); - luaC_checkGC(L); - api_checknelems(L, n); - cl = luaF_newCclosure(L, n); - cl->c.f = fn; - L->top -= n; - while (n--) - setobj2n(&cl->c.upvalue[n], L->top+n); - setclvalue(L->top, cl); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushboolean (lua_State *L, int b) { - lua_lock(L); - setbvalue(L->top, (b != 0)); /* ensure that true is 1 */ - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_pushlightuserdata (lua_State *L, void *p) { - lua_lock(L); - setpvalue(L->top, p); - api_incr_top(L); - lua_unlock(L); -} - - - -/* -** get functions (Lua -> stack) -*/ - - -LUA_API void lua_gettable (lua_State *L, int idx) { - StkId t; - lua_lock(L); - t = luaA_index(L, idx); - setobj2s(L->top - 1, luaV_gettable(L, t, L->top - 1, 0)); - lua_unlock(L); -} - - -LUA_API void lua_rawget (lua_State *L, int idx) { - StkId t; - lua_lock(L); - t = luaA_index(L, idx); - api_check(L, ttistable(t)); - setobj2s(L->top - 1, luaH_get(hvalue(t), L->top - 1)); - lua_unlock(L); -} - - -LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { - StkId o; - lua_lock(L); - o = luaA_index(L, idx); - api_check(L, ttistable(o)); - setobj2s(L->top, luaH_getnum(hvalue(o), n)); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API void lua_newtable (lua_State *L) { - lua_lock(L); - luaC_checkGC(L); - sethvalue(L->top, luaH_new(L, 0, 0)); - api_incr_top(L); - lua_unlock(L); -} - - -LUA_API int lua_getmetatable (lua_State *L, int objindex) { - const TObject *obj; - Table *mt = NULL; - int res; - lua_lock(L); - obj = luaA_indexAcceptable(L, objindex); - if (obj != NULL) { - switch (ttype(obj)) { - case LUA_TTABLE: - mt = hvalue(obj)->metatable; - break; - case LUA_TUSERDATA: - mt = uvalue(obj)->uv.metatable; - break; - } - } - if (mt == NULL || mt == hvalue(defaultmeta(L))) - res = 0; - else { - sethvalue(L->top, mt); - api_incr_top(L); - res = 1; - } - lua_unlock(L); - return res; -} - - -LUA_API void lua_getfenv (lua_State *L, int idx) { - StkId o; - lua_lock(L); - o = luaA_index(L, idx); - setobj2s(L->top, isLfunction(o) ? &clvalue(o)->l.g : gt(L)); - api_incr_top(L); - lua_unlock(L); -} - - -/* -** set functions (stack -> Lua) -*/ - - -LUA_API void lua_settable (lua_State *L, int idx) { - StkId t; - lua_lock(L); - api_checknelems(L, 2); - t = luaA_index(L, idx); - luaV_settable(L, t, L->top - 2, L->top - 1); - L->top -= 2; /* pop index and value */ - lua_unlock(L); -} - - -LUA_API void lua_rawset (lua_State *L, int idx) { - StkId t; - lua_lock(L); - api_checknelems(L, 2); - t = luaA_index(L, idx); - api_check(L, ttistable(t)); - setobj2t(luaH_set(L, hvalue(t), L->top-2), L->top-1); /* write barrier */ - L->top -= 2; - lua_unlock(L); -} - - -LUA_API void lua_rawseti (lua_State *L, int idx, int n) { - StkId o; - lua_lock(L); - api_checknelems(L, 1); - o = luaA_index(L, idx); - api_check(L, ttistable(o)); - setobj2t(luaH_setnum(L, hvalue(o), n), L->top-1); /* write barrier */ - L->top--; - lua_unlock(L); -} - - -LUA_API int lua_setmetatable (lua_State *L, int objindex) { - TObject *obj, *mt; - int res = 1; - lua_lock(L); - api_checknelems(L, 1); - obj = luaA_index(L, objindex); - mt = (!ttisnil(L->top - 1)) ? L->top - 1 : defaultmeta(L); - api_check(L, ttistable(mt)); - switch (ttype(obj)) { - case LUA_TTABLE: { - hvalue(obj)->metatable = hvalue(mt); /* write barrier */ - break; - } - case LUA_TUSERDATA: { - uvalue(obj)->uv.metatable = hvalue(mt); /* write barrier */ - break; - } - default: { - res = 0; /* cannot set */ - break; - } - } - L->top--; - lua_unlock(L); - return res; -} - - -LUA_API int lua_setfenv (lua_State *L, int idx) { - StkId o; - int res = 0; - lua_lock(L); - api_checknelems(L, 1); - o = luaA_index(L, idx); - L->top--; - api_check(L, ttistable(L->top)); - if (isLfunction(o)) { - res = 1; - clvalue(o)->l.g = *(L->top); - } - lua_unlock(L); - return res; -} - - -/* -** `load' and `call' functions (run Lua code) -*/ - -LUA_API void lua_call (lua_State *L, int nargs, int nresults) { - StkId func; - lua_lock(L); - api_checknelems(L, nargs+1); - func = L->top - (nargs+1); - luaD_call(L, func, nresults); - lua_unlock(L); -} - - - -/* -** Execute a protected call. -*/ -struct CallS { /* data to `f_call' */ - StkId func; - int nresults; -}; - - -static void f_call (lua_State *L, void *ud) { - struct CallS *c = cast(struct CallS *, ud); - luaD_call(L, c->func, c->nresults); -} - - - -LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc) { - struct CallS c; - int status; - ptrdiff_t func; - lua_lock(L); - func = (errfunc == 0) ? 0 : savestack(L, luaA_index(L, errfunc)); - c.func = L->top - (nargs+1); /* function to be called */ - c.nresults = nresults; - status = luaD_pcall(L, f_call, &c, savestack(L, c.func), func); - lua_unlock(L); - return status; -} - - -/* -** Execute a protected C call. -*/ -struct CCallS { /* data to `f_Ccall' */ - lua_CFunction func; - void *ud; -}; - - -static void f_Ccall (lua_State *L, void *ud) { - struct CCallS *c = cast(struct CCallS *, ud); - Closure *cl; - cl = luaF_newCclosure(L, 0); - cl->c.f = c->func; - setclvalue(L->top, cl); /* push function */ - incr_top(L); - setpvalue(L->top, c->ud); /* push only argument */ - incr_top(L); - luaD_call(L, L->top - 2, 0); -} - - -LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud) { - struct CCallS c; - int status; - lua_lock(L); - c.func = func; - c.ud = ud; - status = luaD_pcall(L, f_Ccall, &c, savestack(L, L->top), 0); - lua_unlock(L); - return status; -} - - -LUA_API int lua_load (lua_State *L, lua_Chunkreader reader, void *data, - const char *chunkname) { - ZIO z; - int status; - int c; - lua_lock(L); - if (!chunkname) chunkname = "?"; - luaZ_init(&z, reader, data, chunkname); - c = luaZ_lookahead(&z); - status = luaD_protectedparser(L, &z, (c == LUA_SIGNATURE[0])); - lua_unlock(L); - return status; -} - - -LUA_API int lua_dump (lua_State *L, lua_Chunkwriter writer, void *data) { - int status; - TObject *o; - lua_lock(L); - api_checknelems(L, 1); - o = L->top - 1; - if (isLfunction(o) && clvalue(o)->l.nupvalues == 0) { - luaU_dump(L, clvalue(o)->l.p, writer, data); - status = 1; - } - else - status = 0; - lua_unlock(L); - return status; -} - - -/* -** Garbage-collection functions -*/ - -/* GC values are expressed in Kbytes: #bytes/2^10 */ -#define GCscalel(x) ((x)>>10) -#define GCscale(x) (cast(int, GCscalel(x))) -#define GCunscale(x) (cast(lu_mem, x)<<10) - -LUA_API int lua_getgcthreshold (lua_State *L) { - int threshold; - lua_lock(L); - threshold = GCscale(G(L)->GCthreshold); - lua_unlock(L); - return threshold; -} - -LUA_API int lua_getgccount (lua_State *L) { - int count; - lua_lock(L); - count = GCscale(G(L)->nblocks); - lua_unlock(L); - return count; -} - -LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold) { - lua_lock(L); - if (cast(lu_mem, newthreshold) > GCscalel(MAX_LUMEM)) - G(L)->GCthreshold = MAX_LUMEM; - else - G(L)->GCthreshold = GCunscale(newthreshold); - luaC_checkGC(L); - lua_unlock(L); -} - - -/* -** miscellaneous functions -*/ - - -LUA_API const char *lua_version (void) { - return LUA_VERSION; -} - - -LUA_API int lua_error (lua_State *L) { - lua_lock(L); - api_checknelems(L, 1); - luaG_errormsg(L); - lua_unlock(L); - return 0; /* to avoid warnings */ -} - - -LUA_API int lua_next (lua_State *L, int idx) { - StkId t; - int more; - lua_lock(L); - t = luaA_index(L, idx); - api_check(L, ttistable(t)); - more = luaH_next(L, hvalue(t), L->top - 1); - if (more) { - api_incr_top(L); - } - else /* no more elements */ - L->top -= 1; /* remove key */ - lua_unlock(L); - return more; -} - - -LUA_API void lua_concat (lua_State *L, int n) { - lua_lock(L); - luaC_checkGC(L); - api_checknelems(L, n); - if (n >= 2) { - luaV_concat(L, n, L->top - L->base - 1); - L->top -= (n-1); - } - else if (n == 0) { /* push empty string */ - setsvalue2s(L->top, luaS_newlstr(L, NULL, 0)); - api_incr_top(L); - } - /* else n == 1; nothing to do */ - lua_unlock(L); -} - - -LUA_API void *lua_newuserdata (lua_State *L, size_t size) { - Udata *u; - lua_lock(L); - luaC_checkGC(L); - u = luaS_newudata(L, size); - setuvalue(L->top, u); - api_incr_top(L); - lua_unlock(L); - return u + 1; -} - - -LUA_API int lua_pushupvalues (lua_State *L) { - Closure *func; - int n, i; - lua_lock(L); - api_check(L, iscfunction(L->base - 1)); - func = clvalue(L->base - 1); - n = func->c.nupvalues; - luaD_checkstack(L, n + LUA_MINSTACK); - for (i=0; itop, &func->c.upvalue[i]); - L->top++; - } - lua_unlock(L); - return n; -} - - -static const char *aux_upvalue (lua_State *L, int funcindex, int n, - TObject **val) { - Closure *f; - StkId fi = luaA_index(L, funcindex); - if (!ttisfunction(fi)) return NULL; - f = clvalue(fi); - if (f->c.isC) { - if (n > f->c.nupvalues) return NULL; - *val = &f->c.upvalue[n-1]; - return ""; - } - else { - Proto *p = f->l.p; - if (n > p->sizeupvalues) return NULL; - *val = f->l.upvals[n-1]->v; - return getstr(p->upvalues[n-1]); - } -} - - -LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { - const char *name; - TObject *val; - lua_lock(L); - name = aux_upvalue(L, funcindex, n, &val); - if (name) { - setobj2s(L->top, val); - api_incr_top(L); - } - lua_unlock(L); - return name; -} - - -LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { - const char *name; - TObject *val; - lua_lock(L); - api_checknelems(L, 1); - name = aux_upvalue(L, funcindex, n, &val); - if (name) { - L->top--; - setobj(val, L->top); /* write barrier */ - } - lua_unlock(L); - return name; -} - diff --git a/plugins/SmartAutoReplier/lualib/lapi.h b/plugins/SmartAutoReplier/lualib/lapi.h deleted file mode 100644 index d12612f304..0000000000 --- a/plugins/SmartAutoReplier/lualib/lapi.h +++ /dev/null @@ -1,16 +0,0 @@ -/* -** $Id: lapi.h,v 1.21 2002/03/04 21:29:41 roberto Exp $ -** Auxiliary functions from Lua API -** See Copyright Notice in lua.h -*/ - -#ifndef lapi_h -#define lapi_h - - -#include "lobject.h" - - -void luaA_pushobject (lua_State *L, const TObject *o); - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lauxlib.c b/plugins/SmartAutoReplier/lualib/lauxlib.c deleted file mode 100644 index ee2d1339b0..0000000000 --- a/plugins/SmartAutoReplier/lualib/lauxlib.c +++ /dev/null @@ -1,591 +0,0 @@ -/* -** $Id: lauxlib.c,v 1.100 2003/04/07 14:35:00 roberto Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include -#include - - -/* This file uses only the official API of Lua. -** Any function declared here could be written as an application function. -*/ - -#define lauxlib_c - -#include "lua.h" - -#include "lauxlib.h" - - -/* number of prereserved references (for internal use) */ -#define RESERVED_REFS 2 - -/* reserved references */ -#define FREELIST_REF 1 /* free list of references */ -#define ARRAYSIZE_REF 2 /* array sizes */ - - -/* convert a stack index to positive */ -#define abs_index(L, i) ((i) > 0 || (i) <= LUA_REGISTRYINDEX ? (i) : \ - lua_gettop(L) + (i) + 1) - - -/* -** {====================================================== -** Error-report functions -** ======================================================= -*/ - - -LUALIB_API int luaL_argerror (lua_State *L, int narg, const char *extramsg) { - lua_Debug ar; - lua_getstack(L, 0, &ar); - lua_getinfo(L, "n", &ar); - if (strcmp(ar.namewhat, "method") == 0) { - narg--; /* do not count `self' */ - if (narg == 0) /* error is in the self argument itself? */ - return luaL_error(L, "calling `%s' on bad self (%s)", ar.name, extramsg); - } - if (ar.name == NULL) - ar.name = "?"; - return luaL_error(L, "bad argument #%d to `%s' (%s)", - narg, ar.name, extramsg); -} - - -LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname) { - const char *msg = lua_pushfstring(L, "%s expected, got %s", - tname, lua_typename(L, lua_type(L,narg))); - return luaL_argerror(L, narg, msg); -} - - -static void tag_error (lua_State *L, int narg, int tag) { - luaL_typerror(L, narg, lua_typename(L, tag)); -} - - -LUALIB_API void luaL_where (lua_State *L, int level) { - lua_Debug ar; - if (lua_getstack(L, level, &ar)) { /* check function at level */ - lua_getinfo(L, "Snl", &ar); /* get info about it */ - if (ar.currentline > 0) { /* is there info? */ - lua_pushfstring(L, "%s:%d: ", ar.short_src, ar.currentline); - return; - } - } - lua_pushliteral(L, ""); /* else, no information available... */ -} - - -LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...) { - va_list argp; - va_start(argp, fmt); - luaL_where(L, 1); - lua_pushvfstring(L, fmt, argp); - va_end(argp); - lua_concat(L, 2); - return lua_error(L); -} - -/* }====================================================== */ - - -LUALIB_API int luaL_findstring (const char *name, const char *const list[]) { - int i; - for (i=0; list[i]; i++) - if (strcmp(list[i], name) == 0) - return i; - return -1; /* name not found */ -} - - -LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname) { - lua_pushstring(L, tname); - lua_rawget(L, LUA_REGISTRYINDEX); /* get registry.name */ - if (!lua_isnil(L, -1)) /* name already in use? */ - return 0; /* leave previous value on top, but return 0 */ - lua_pop(L, 1); - lua_newtable(L); /* create metatable */ - lua_pushstring(L, tname); - lua_pushvalue(L, -2); - lua_rawset(L, LUA_REGISTRYINDEX); /* registry.name = metatable */ - lua_pushvalue(L, -1); - lua_pushstring(L, tname); - lua_rawset(L, LUA_REGISTRYINDEX); /* registry[metatable] = name */ - return 1; -} - - -LUALIB_API void luaL_getmetatable (lua_State *L, const char *tname) { - lua_pushstring(L, tname); - lua_rawget(L, LUA_REGISTRYINDEX); -} - - -LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname) { - const char *tn; - if (!lua_getmetatable(L, ud)) return NULL; /* no metatable? */ - lua_rawget(L, LUA_REGISTRYINDEX); /* get registry[metatable] */ - tn = lua_tostring(L, -1); - if (tn && (strcmp(tn, tname) == 0)) { - lua_pop(L, 1); - return lua_touserdata(L, ud); - } - else { - lua_pop(L, 1); - return NULL; - } -} - - -LUALIB_API void luaL_checkstack (lua_State *L, int space, const char *mes) { - if (!lua_checkstack(L, space)) - luaL_error(L, "stack overflow (%s)", mes); -} - - -LUALIB_API void luaL_checktype (lua_State *L, int narg, int t) { - if (lua_type(L, narg) != t) - tag_error(L, narg, t); -} - - -LUALIB_API void luaL_checkany (lua_State *L, int narg) { - if (lua_type(L, narg) == LUA_TNONE) - luaL_argerror(L, narg, "value expected"); -} - - -LUALIB_API const char *luaL_checklstring (lua_State *L, int narg, size_t *len) { - const char *s = lua_tostring(L, narg); - if (!s) tag_error(L, narg, LUA_TSTRING); - if (len) *len = lua_strlen(L, narg); - return s; -} - - -LUALIB_API const char *luaL_optlstring (lua_State *L, int narg, - const char *def, size_t *len) { - if (lua_isnoneornil(L, narg)) { - if (len) - *len = (def ? strlen(def) : 0); - return def; - } - else return luaL_checklstring(L, narg, len); -} - - -LUALIB_API lua_Number luaL_checknumber (lua_State *L, int narg) { - lua_Number d = lua_tonumber(L, narg); - if (d == 0 && !lua_isnumber(L, narg)) /* avoid extra test when d is not 0 */ - tag_error(L, narg, LUA_TNUMBER); - return d; -} - - -LUALIB_API lua_Number luaL_optnumber (lua_State *L, int narg, lua_Number def) { - if (lua_isnoneornil(L, narg)) return def; - else return luaL_checknumber(L, narg); -} - - -LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *event) { - if (!lua_getmetatable(L, obj)) /* no metatable? */ - return 0; - lua_pushstring(L, event); - lua_rawget(L, -2); - if (lua_isnil(L, -1)) { - lua_pop(L, 2); /* remove metatable and metafield */ - return 0; - } - else { - lua_remove(L, -2); /* remove only metatable */ - return 1; - } -} - - -LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *event) { - obj = abs_index(L, obj); - if (!luaL_getmetafield(L, obj, event)) /* no metafield? */ - return 0; - lua_pushvalue(L, obj); - lua_call(L, 1, 1); - return 1; -} - - -LUALIB_API void luaL_openlib (lua_State *L, const char *libname, - const luaL_reg *l, int nup) { - if (libname) { - lua_pushstring(L, libname); - lua_gettable(L, LUA_GLOBALSINDEX); /* check whether lib already exists */ - if (lua_isnil(L, -1)) { /* no? */ - lua_pop(L, 1); - lua_newtable(L); /* create it */ - lua_pushstring(L, libname); - lua_pushvalue(L, -2); - lua_settable(L, LUA_GLOBALSINDEX); /* register it with given name */ - } - lua_insert(L, -(nup+1)); /* move library table to below upvalues */ - } - for (; l->name; l++) { - int i; - lua_pushstring(L, l->name); - for (i=0; ifunc, nup); - lua_settable(L, -(nup+3)); - } - lua_pop(L, nup); /* remove upvalues */ -} - - - -/* -** {====================================================== -** getn-setn: size for arrays -** ======================================================= -*/ - -static int checkint (lua_State *L, int topop) { - int n = (int)lua_tonumber(L, -1); - if (n == 0 && !lua_isnumber(L, -1)) n = -1; - lua_pop(L, topop); - return n; -} - - -static void getsizes (lua_State *L) { - lua_rawgeti(L, LUA_REGISTRYINDEX, ARRAYSIZE_REF); - if (lua_isnil(L, -1)) { /* no `size' table? */ - lua_pop(L, 1); /* remove nil */ - lua_newtable(L); /* create it */ - lua_pushvalue(L, -1); /* `size' will be its own metatable */ - lua_setmetatable(L, -2); - lua_pushliteral(L, "__mode"); - lua_pushliteral(L, "k"); - lua_rawset(L, -3); /* metatable(N).__mode = "k" */ - lua_pushvalue(L, -1); - lua_rawseti(L, LUA_REGISTRYINDEX, ARRAYSIZE_REF); /* store in register */ - } -} - - -void luaL_setn (lua_State *L, int t, int n) { - t = abs_index(L, t); - lua_pushliteral(L, "n"); - lua_rawget(L, t); - if (checkint(L, 1) >= 0) { /* is there a numeric field `n'? */ - lua_pushliteral(L, "n"); /* use it */ - lua_pushnumber(L, (lua_Number)n); - lua_rawset(L, t); - } - else { /* use `sizes' */ - getsizes(L); - lua_pushvalue(L, t); - lua_pushnumber(L, (lua_Number)n); - lua_rawset(L, -3); /* sizes[t] = n */ - lua_pop(L, 1); /* remove `sizes' */ - } -} - - -int luaL_getn (lua_State *L, int t) { - int n; - t = abs_index(L, t); - lua_pushliteral(L, "n"); /* try t.n */ - lua_rawget(L, t); - if ((n = checkint(L, 1)) >= 0) return n; - getsizes(L); /* else try sizes[t] */ - lua_pushvalue(L, t); - lua_rawget(L, -2); - if ((n = checkint(L, 2)) >= 0) return n; - for (n = 1; ; n++) { /* else must count elements */ - lua_rawgeti(L, t, n); - if (lua_isnil(L, -1)) break; - lua_pop(L, 1); - } - lua_pop(L, 1); - return n - 1; -} - -/* }====================================================== */ - - - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - -#define bufflen(B) ((B)->p - (B)->buffer) -#define bufffree(B) ((size_t)(LUAL_BUFFERSIZE - bufflen(B))) - -#define LIMIT (LUA_MINSTACK/2) - - -static int emptybuffer (luaL_Buffer *B) { - size_t l = bufflen(B); - if (l == 0) return 0; /* put nothing on stack */ - else { - lua_pushlstring(B->L, B->buffer, l); - B->p = B->buffer; - B->lvl++; - return 1; - } -} - - -static void adjuststack (luaL_Buffer *B) { - if (B->lvl > 1) { - lua_State *L = B->L; - int toget = 1; /* number of levels to concat */ - size_t toplen = lua_strlen(L, -1); - do { - size_t l = lua_strlen(L, -(toget+1)); - if (B->lvl - toget + 1 >= LIMIT || toplen > l) { - toplen += l; - toget++; - } - else break; - } while (toget < B->lvl); - lua_concat(L, toget); - B->lvl = B->lvl - toget + 1; - } -} - - -LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B) { - if (emptybuffer(B)) - adjuststack(B); - return B->buffer; -} - - -LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l) { - while (l--) - luaL_putchar(B, *s++); -} - - -LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s) { - luaL_addlstring(B, s, strlen(s)); -} - - -LUALIB_API void luaL_pushresult (luaL_Buffer *B) { - emptybuffer(B); - lua_concat(B->L, B->lvl); - B->lvl = 1; -} - - -LUALIB_API void luaL_addvalue (luaL_Buffer *B) { - lua_State *L = B->L; - size_t vl = lua_strlen(L, -1); - if (vl <= bufffree(B)) { /* fit into buffer? */ - memcpy(B->p, lua_tostring(L, -1), vl); /* put it there */ - B->p += vl; - lua_pop(L, 1); /* remove from stack */ - } - else { - if (emptybuffer(B)) - lua_insert(L, -2); /* put buffer before new value */ - B->lvl++; /* add new value into B stack */ - adjuststack(B); - } -} - - -LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B) { - B->L = L; - B->p = B->buffer; - B->lvl = 0; -} - -/* }====================================================== */ - - -LUALIB_API int luaL_ref (lua_State *L, int t) { - int ref; - t = abs_index(L, t); - if (lua_isnil(L, -1)) { - lua_pop(L, 1); /* remove from stack */ - return LUA_REFNIL; /* `nil' has a unique fixed reference */ - } - lua_rawgeti(L, t, FREELIST_REF); /* get first free element */ - ref = (int)lua_tonumber(L, -1); /* ref = t[FREELIST_REF] */ - lua_pop(L, 1); /* remove it from stack */ - if (ref != 0) { /* any free element? */ - lua_rawgeti(L, t, ref); /* remove it from list */ - lua_rawseti(L, t, FREELIST_REF); /* (t[FREELIST_REF] = t[ref]) */ - } - else { /* no free elements */ - ref = luaL_getn(L, t); - if (ref < RESERVED_REFS) - ref = RESERVED_REFS; /* skip reserved references */ - ref++; /* create new reference */ - luaL_setn(L, t, ref); - } - lua_rawseti(L, t, ref); - return ref; -} - - -LUALIB_API void luaL_unref (lua_State *L, int t, int ref) { - if (ref >= 0) { - t = abs_index(L, t); - lua_rawgeti(L, t, FREELIST_REF); - lua_rawseti(L, t, ref); /* t[ref] = t[FREELIST_REF] */ - lua_pushnumber(L, (lua_Number)ref); - lua_rawseti(L, t, FREELIST_REF); /* t[FREELIST_REF] = ref */ - } -} - - - -/* -** {====================================================== -** Load functions -** ======================================================= -*/ - -typedef struct LoadF { - FILE *f; - char buff[LUAL_BUFFERSIZE]; -} LoadF; - - -static const char *getF (lua_State *L, void *ud, size_t *size) { - LoadF *lf = (LoadF *)ud; - (void)L; - if (feof(lf->f)) return NULL; - *size = fread(lf->buff, 1, LUAL_BUFFERSIZE, lf->f); - return (*size > 0) ? lf->buff : NULL; -} - - -static int errfile (lua_State *L, int fnameindex) { - const char *filename = lua_tostring(L, fnameindex) + 1; - lua_pushfstring(L, "cannot read %s: %s", filename, strerror(errno)); - lua_remove(L, fnameindex); - return LUA_ERRFILE; -} - - -LUALIB_API int luaL_loadfile (lua_State *L, const char *filename) { - LoadF lf; - int status, readstatus; - int c; - int fnameindex = lua_gettop(L) + 1; /* index of filename on the stack */ - if (filename == NULL) { - lua_pushliteral(L, "=stdin"); - lf.f = stdin; - } - else { - lua_pushfstring(L, "@%s", filename); - lf.f = fopen(filename, "r"); - } - if (lf.f == NULL) return errfile(L, fnameindex); /* unable to open file */ - c = ungetc(getc(lf.f), lf.f); - if (!(isspace(c) || isprint(c)) && lf.f != stdin) { /* binary file? */ - fclose(lf.f); - lf.f = fopen(filename, "rb"); /* reopen in binary mode */ - if (lf.f == NULL) return errfile(L, fnameindex); /* unable to reopen file */ - } - status = lua_load(L, getF, &lf, lua_tostring(L, -1)); - readstatus = ferror(lf.f); - if (lf.f != stdin) fclose(lf.f); /* close file (even in case of errors) */ - if (readstatus) { - lua_settop(L, fnameindex); /* ignore results from `lua_load' */ - return errfile(L, fnameindex); - } - lua_remove(L, fnameindex); - return status; -} - - -typedef struct LoadS { - const char *s; - size_t size; -} LoadS; - - -static const char *getS (lua_State *L, void *ud, size_t *size) { - LoadS *ls = (LoadS *)ud; - (void)L; - if (ls->size == 0) return NULL; - *size = ls->size; - ls->size = 0; - return ls->s; -} - - -LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t size, - const char *name) { - LoadS ls; - ls.s = buff; - ls.size = size; - return lua_load(L, getS, &ls, name); -} - -/* }====================================================== */ - - -/* -** {====================================================== -** compatibility code -** ======================================================= -*/ - - -static void callalert (lua_State *L, int status) { - if (status != 0) { - lua_getglobal(L, "_ALERT"); - if (lua_isfunction(L, -1)) { - lua_insert(L, -2); - lua_call(L, 1, 0); - } - else { /* no _ALERT function; print it on stderr */ - fprintf(stderr, "%s\n", lua_tostring(L, -2)); - lua_pop(L, 2); /* remove error message and _ALERT */ - } - } -} - - -static int aux_do (lua_State *L, int status) { - if (status == 0) { /* parse OK? */ - status = lua_pcall(L, 0, LUA_MULTRET, 0); /* call main */ - } - callalert(L, status); - return status; -} - - -LUALIB_API int lua_dofile (lua_State *L, const char *filename) { - return aux_do(L, luaL_loadfile(L, filename)); -} - - -LUALIB_API int lua_dobuffer (lua_State *L, const char *buff, size_t size, - const char *name) { - return aux_do(L, luaL_loadbuffer(L, buff, size, name)); -} - - -LUALIB_API int lua_dostring (lua_State *L, const char *str) { - return lua_dobuffer(L, str, strlen(str), str); -} - -/* }====================================================== */ diff --git a/plugins/SmartAutoReplier/lualib/lauxlib.h b/plugins/SmartAutoReplier/lualib/lauxlib.h deleted file mode 100644 index 450e16c720..0000000000 --- a/plugins/SmartAutoReplier/lualib/lauxlib.h +++ /dev/null @@ -1,145 +0,0 @@ -/* -** $Id: lauxlib.h,v 1.60 2003/04/03 13:35:34 roberto Exp $ -** Auxiliary functions for building Lua libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lauxlib_h -#define lauxlib_h - - -#include -#include - -#include "lua.h" - - -#ifndef LUALIB_API -#define LUALIB_API LUA_API -#endif - - - -typedef struct luaL_reg { - const char *name; - lua_CFunction func; -} luaL_reg; - - -LUALIB_API void luaL_openlib (lua_State *L, const char *libname, - const luaL_reg *l, int nup); -LUALIB_API int luaL_getmetafield (lua_State *L, int obj, const char *e); -LUALIB_API int luaL_callmeta (lua_State *L, int obj, const char *e); -LUALIB_API int luaL_typerror (lua_State *L, int narg, const char *tname); -LUALIB_API int luaL_argerror (lua_State *L, int numarg, const char *extramsg); -LUALIB_API const char *luaL_checklstring (lua_State *L, int numArg, size_t *l); -LUALIB_API const char *luaL_optlstring (lua_State *L, int numArg, - const char *def, size_t *l); -LUALIB_API lua_Number luaL_checknumber (lua_State *L, int numArg); -LUALIB_API lua_Number luaL_optnumber (lua_State *L, int nArg, lua_Number def); - -LUALIB_API void luaL_checkstack (lua_State *L, int sz, const char *msg); -LUALIB_API void luaL_checktype (lua_State *L, int narg, int t); -LUALIB_API void luaL_checkany (lua_State *L, int narg); - -LUALIB_API int luaL_newmetatable (lua_State *L, const char *tname); -LUALIB_API void luaL_getmetatable (lua_State *L, const char *tname); -LUALIB_API void *luaL_checkudata (lua_State *L, int ud, const char *tname); - -LUALIB_API void luaL_where (lua_State *L, int lvl); -LUALIB_API int luaL_error (lua_State *L, const char *fmt, ...); - -LUALIB_API int luaL_findstring (const char *st, const char *const lst[]); - -LUALIB_API int luaL_ref (lua_State *L, int t); -LUALIB_API void luaL_unref (lua_State *L, int t, int ref); - -LUALIB_API int luaL_getn (lua_State *L, int t); -LUALIB_API void luaL_setn (lua_State *L, int t, int n); - -LUALIB_API int luaL_loadfile (lua_State *L, const char *filename); -LUALIB_API int luaL_loadbuffer (lua_State *L, const char *buff, size_t sz, - const char *name); - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define luaL_argcheck(L, cond,numarg,extramsg) if (!(cond)) \ - luaL_argerror(L, numarg,extramsg) -#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL)) -#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL)) -#define luaL_checkint(L,n) ((int)luaL_checknumber(L, n)) -#define luaL_checklong(L,n) ((long)luaL_checknumber(L, n)) -#define luaL_optint(L,n,d) ((int)luaL_optnumber(L, n,(lua_Number)(d))) -#define luaL_optlong(L,n,d) ((long)luaL_optnumber(L, n,(lua_Number)(d))) - - -/* -** {====================================================== -** Generic Buffer manipulation -** ======================================================= -*/ - - -#ifndef LUAL_BUFFERSIZE -#define LUAL_BUFFERSIZE BUFSIZ -#endif - - -typedef struct luaL_Buffer { - char *p; /* current position in buffer */ - int lvl; /* number of strings in the stack (level) */ - lua_State *L; - char buffer[LUAL_BUFFERSIZE]; -} luaL_Buffer; - -#define luaL_putchar(B,c) \ - ((void)((B)->p < ((B)->buffer+LUAL_BUFFERSIZE) || luaL_prepbuffer(B)), \ - (*(B)->p++ = (char)(c))) - -#define luaL_addsize(B,n) ((B)->p += (n)) - -LUALIB_API void luaL_buffinit (lua_State *L, luaL_Buffer *B); -LUALIB_API char *luaL_prepbuffer (luaL_Buffer *B); -LUALIB_API void luaL_addlstring (luaL_Buffer *B, const char *s, size_t l); -LUALIB_API void luaL_addstring (luaL_Buffer *B, const char *s); -LUALIB_API void luaL_addvalue (luaL_Buffer *B); -LUALIB_API void luaL_pushresult (luaL_Buffer *B); - - -/* }====================================================== */ - - - -/* -** Compatibility macros and functions -*/ - -LUALIB_API int lua_dofile (lua_State *L, const char *filename); -LUALIB_API int lua_dostring (lua_State *L, const char *str); -LUALIB_API int lua_dobuffer (lua_State *L, const char *buff, size_t sz, - const char *n); - - -#define luaL_check_lstr luaL_checklstring -#define luaL_opt_lstr luaL_optlstring -#define luaL_check_number luaL_checknumber -#define luaL_opt_number luaL_optnumber -#define luaL_arg_check luaL_argcheck -#define luaL_check_string luaL_checkstring -#define luaL_opt_string luaL_optstring -#define luaL_check_int luaL_checkint -#define luaL_check_long luaL_checklong -#define luaL_opt_int luaL_optint -#define luaL_opt_long luaL_optlong - - -#endif - - diff --git a/plugins/SmartAutoReplier/lualib/lbaselib.c b/plugins/SmartAutoReplier/lualib/lbaselib.c deleted file mode 100644 index 7381cf3357..0000000000 --- a/plugins/SmartAutoReplier/lualib/lbaselib.c +++ /dev/null @@ -1,674 +0,0 @@ -/* -** $Id: lbaselib.c,v 1.130 2003/04/03 13:35:34 roberto Exp $ -** Basic library -** See Copyright Notice in lua.h -*/ - - - -#include -#include -#include -#include - -#define lbaselib_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - - -/* -** If your system does not support `stdout', you can just remove this function. -** If you need, you can define your own `print' function, following this -** model but changing `fputs' to put the strings at a proper place -** (a console window or a log file, for instance). -*/ -static int luaB_print (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - int i; - lua_getglobal(L, "tostring"); - for (i=1; i<=n; i++) { - const char *s; - lua_pushvalue(L, -1); /* function to be called */ - lua_pushvalue(L, i); /* value to print */ - lua_call(L, 1, 1); - s = lua_tostring(L, -1); /* get result */ - if (s == NULL) - return luaL_error(L, "`tostring' must return a string to `print'"); - if (i>1) fputs("\t", stdout); - fputs(s, stdout); - lua_pop(L, 1); /* pop result */ - } - fputs("\n", stdout); - return 0; -} - - -static int luaB_tonumber (lua_State *L) { - int base = luaL_optint(L, 2, 10); - if (base == 10) { /* standard conversion */ - luaL_checkany(L, 1); - if (lua_isnumber(L, 1)) { - lua_pushnumber(L, lua_tonumber(L, 1)); - return 1; - } - } - else { - const char *s1 = luaL_checkstring(L, 1); - char *s2; - unsigned long n; - luaL_argcheck(L, 2 <= base && base <= 36, 2, "base out of range"); - n = strtoul(s1, &s2, base); - if (s1 != s2) { /* at least one valid digit? */ - while (isspace((unsigned char)(*s2))) s2++; /* skip trailing spaces */ - if (*s2 == '\0') { /* no invalid trailing characters? */ - lua_pushnumber(L, (lua_Number)n); - return 1; - } - } - } - lua_pushnil(L); /* else not a number */ - return 1; -} - - -static int luaB_error (lua_State *L) { - int level = luaL_optint(L, 2, 1); - luaL_checkany(L, 1); - if (!lua_isstring(L, 1) || level == 0) - lua_pushvalue(L, 1); /* propagate error message without changes */ - else { /* add extra information */ - luaL_where(L, level); - lua_pushvalue(L, 1); - lua_concat(L, 2); - } - return lua_error(L); -} - - -static int luaB_getmetatable (lua_State *L) { - luaL_checkany(L, 1); - if (!lua_getmetatable(L, 1)) { - lua_pushnil(L); - return 1; /* no metatable */ - } - luaL_getmetafield(L, 1, "__metatable"); - return 1; /* returns either __metatable field (if present) or metatable */ -} - - -static int luaB_setmetatable (lua_State *L) { - int t = lua_type(L, 2); - luaL_checktype(L, 1, LUA_TTABLE); - luaL_argcheck(L, t == LUA_TNIL || t == LUA_TTABLE, 2, - "nil or table expected"); - if (luaL_getmetafield(L, 1, "__metatable")) - luaL_error(L, "cannot change a protected metatable"); - lua_settop(L, 2); - lua_setmetatable(L, 1); - return 1; -} - - -static void getfunc (lua_State *L) { - if (lua_isfunction(L, 1)) lua_pushvalue(L, 1); - else { - lua_Debug ar; - int level = luaL_optint(L, 1, 1); - luaL_argcheck(L, level >= 0, 1, "level must be non-negative"); - if (lua_getstack(L, level, &ar) == 0) - luaL_argerror(L, 1, "invalid level"); - lua_getinfo(L, "f", &ar); - if (lua_isnil(L, -1)) - luaL_error(L, "no function environment for tail call at level %d", - level); - } -} - - -static int aux_getfenv (lua_State *L) { - lua_getfenv(L, -1); - lua_pushliteral(L, "__fenv"); - lua_rawget(L, -2); - return !lua_isnil(L, -1); -} - - -static int luaB_getfenv (lua_State *L) { - getfunc(L); - if (!aux_getfenv(L)) /* __fenv not defined? */ - lua_pop(L, 1); /* remove it, to return real environment */ - return 1; -} - - -static int luaB_setfenv (lua_State *L) { - luaL_checktype(L, 2, LUA_TTABLE); - getfunc(L); - if (aux_getfenv(L)) /* __fenv defined? */ - luaL_error(L, "`setfenv' cannot change a protected environment"); - else - lua_pop(L, 2); /* remove __fenv and real environment table */ - lua_pushvalue(L, 2); - if (lua_isnumber(L, 1) && lua_tonumber(L, 1) == 0) - lua_replace(L, LUA_GLOBALSINDEX); - else if (lua_setfenv(L, -2) == 0) - luaL_error(L, "`setfenv' cannot change environment of given function"); - return 0; -} - - -static int luaB_rawequal (lua_State *L) { - luaL_checkany(L, 1); - luaL_checkany(L, 2); - lua_pushboolean(L, lua_rawequal(L, 1, 2)); - return 1; -} - - -static int luaB_rawget (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checkany(L, 2); - lua_rawget(L, 1); - return 1; -} - -static int luaB_rawset (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checkany(L, 2); - luaL_checkany(L, 3); - lua_rawset(L, 1); - return 1; -} - - -static int luaB_gcinfo (lua_State *L) { - lua_pushnumber(L, (lua_Number)lua_getgccount(L)); - lua_pushnumber(L, (lua_Number)lua_getgcthreshold(L)); - return 2; -} - - -static int luaB_collectgarbage (lua_State *L) { - lua_setgcthreshold(L, luaL_optint(L, 1, 0)); - return 0; -} - - -static int luaB_type (lua_State *L) { - luaL_checkany(L, 1); - lua_pushstring(L, lua_typename(L, lua_type(L, 1))); - return 1; -} - - -static int luaB_next (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 2); /* create a 2nd argument if there isn't one */ - if (lua_next(L, 1)) - return 2; - else { - lua_pushnil(L); - return 1; - } -} - - -static int luaB_pairs (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - lua_pushliteral(L, "next"); - lua_rawget(L, LUA_GLOBALSINDEX); /* return generator, */ - lua_pushvalue(L, 1); /* state, */ - lua_pushnil(L); /* and initial value */ - return 3; -} - - -static int luaB_ipairs (lua_State *L) { - lua_Number i = lua_tonumber(L, 2); - luaL_checktype(L, 1, LUA_TTABLE); - if (i == 0 && lua_isnone(L, 2)) { /* `for' start? */ - lua_pushliteral(L, "ipairs"); - lua_rawget(L, LUA_GLOBALSINDEX); /* return generator, */ - lua_pushvalue(L, 1); /* state, */ - lua_pushnumber(L, 0); /* and initial value */ - return 3; - } - else { /* `for' step */ - i++; /* next value */ - lua_pushnumber(L, i); - lua_rawgeti(L, 1, (int)i); - return (lua_isnil(L, -1)) ? 0 : 2; - } -} - - -static int load_aux (lua_State *L, int status) { - if (status == 0) /* OK? */ - return 1; - else { - lua_pushnil(L); - lua_insert(L, -2); /* put before error message */ - return 2; /* return nil plus error message */ - } -} - - -static int luaB_loadstring (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - const char *chunkname = luaL_optstring(L, 2, s); - return load_aux(L, luaL_loadbuffer(L, s, l, chunkname)); -} - - -static int luaB_loadfile (lua_State *L) { - const char *fname = luaL_optstring(L, 1, NULL); - return load_aux(L, luaL_loadfile(L, fname)); -} - - -static int luaB_dofile (lua_State *L) { - const char *fname = luaL_optstring(L, 1, NULL); - int status = luaL_loadfile(L, fname); - if (status != 0) lua_error(L); - lua_call(L, 0, LUA_MULTRET); - return lua_gettop(L) - 1; -} - - -static int luaB_assert (lua_State *L) { - luaL_checkany(L, 1); - if (!lua_toboolean(L, 1)) - return luaL_error(L, "%s", luaL_optstring(L, 2, "assertion failed!")); - lua_settop(L, 1); - return 1; -} - - -static int luaB_unpack (lua_State *L) { - int n, i; - luaL_checktype(L, 1, LUA_TTABLE); - n = luaL_getn(L, 1); - luaL_checkstack(L, n, "table too big to unpack"); - for (i=1; i<=n; i++) /* push arg[1...n] */ - lua_rawgeti(L, 1, i); - return n; -} - - -static int luaB_pcall (lua_State *L) { - int status; - luaL_checkany(L, 1); - status = lua_pcall(L, lua_gettop(L) - 1, LUA_MULTRET, 0); - lua_pushboolean(L, (status == 0)); - lua_insert(L, 1); - return lua_gettop(L); /* return status + all results */ -} - - -static int luaB_xpcall (lua_State *L) { - int status; - luaL_checkany(L, 2); - lua_settop(L, 2); - lua_insert(L, 1); /* put error function under function to be called */ - status = lua_pcall(L, 0, LUA_MULTRET, 1); - lua_pushboolean(L, (status == 0)); - lua_replace(L, 1); - return lua_gettop(L); /* return status + all results */ -} - - -static int luaB_tostring (lua_State *L) { - char buff[64]; - luaL_checkany(L, 1); - if (luaL_callmeta(L, 1, "__tostring")) /* is there a metafield? */ - return 1; /* use its value */ - switch (lua_type(L, 1)) { - case LUA_TNUMBER: - lua_pushstring(L, lua_tostring(L, 1)); - return 1; - case LUA_TSTRING: - lua_pushvalue(L, 1); - return 1; - case LUA_TBOOLEAN: - lua_pushstring(L, (lua_toboolean(L, 1) ? "true" : "false")); - return 1; - case LUA_TTABLE: - sprintf(buff, "table: %p", lua_topointer(L, 1)); - break; - case LUA_TFUNCTION: - sprintf(buff, "function: %p", lua_topointer(L, 1)); - break; - case LUA_TUSERDATA: - case LUA_TLIGHTUSERDATA: - sprintf(buff, "userdata: %p", lua_touserdata(L, 1)); - break; - case LUA_TTHREAD: - sprintf(buff, "thread: %p", (void *)lua_tothread(L, 1)); - break; - case LUA_TNIL: - lua_pushliteral(L, "nil"); - return 1; - } - lua_pushstring(L, buff); - return 1; -} - - -static int luaB_newproxy (lua_State *L) { - lua_settop(L, 1); - lua_newuserdata(L, 0); /* create proxy */ - if (lua_toboolean(L, 1) == 0) - return 1; /* no metatable */ - else if (lua_isboolean(L, 1)) { - lua_newtable(L); /* create a new metatable `m' ... */ - lua_pushvalue(L, -1); /* ... and mark `m' as a valid metatable */ - lua_pushboolean(L, 1); - lua_rawset(L, lua_upvalueindex(1)); /* weaktable[m] = true */ - } - else { - int validproxy = 0; /* to check if weaktable[metatable(u)] == true */ - if (lua_getmetatable(L, 1)) { - lua_rawget(L, lua_upvalueindex(1)); - validproxy = lua_toboolean(L, -1); - lua_pop(L, 1); /* remove value */ - } - luaL_argcheck(L, validproxy, 1, "boolean or proxy expected"); - lua_getmetatable(L, 1); /* metatable is valid; get it */ - } - lua_setmetatable(L, 2); - return 1; -} - - -/* -** {====================================================== -** `require' function -** ======================================================= -*/ - - -/* name of global that holds table with loaded packages */ -#define REQTAB "_LOADED" - -/* name of global that holds the search path for packages */ -#define LUA_PATH "LUA_PATH" - -#ifndef LUA_PATH_SEP -#define LUA_PATH_SEP ';' -#endif - -#ifndef LUA_PATH_MARK -#define LUA_PATH_MARK '?' -#endif - -#ifndef LUA_PATH_DEFAULT -#define LUA_PATH_DEFAULT "?;?.lua" -#endif - - -static const char *getpath (lua_State *L) { - const char *path; - lua_getglobal(L, LUA_PATH); /* try global variable */ - path = lua_tostring(L, -1); - lua_pop(L, 1); - if (path) return path; - path = getenv(LUA_PATH); /* else try environment variable */ - if (path) return path; - return LUA_PATH_DEFAULT; /* else use default */ -} - - -static const char *pushnextpath (lua_State *L, const char *path) { - const char *l; - if (*path == '\0') return NULL; /* no more paths */ - if (*path == LUA_PATH_SEP) path++; /* skip separator */ - l = strchr(path, LUA_PATH_SEP); /* find next separator */ - if (l == NULL) l = path+strlen(path); - lua_pushlstring(L, path, l - path); /* directory name */ - return l; -} - - -static void pushcomposename (lua_State *L) { - const char *path = lua_tostring(L, -1); - const char *wild; - int n = 1; - while ((wild = strchr(path, LUA_PATH_MARK)) != NULL) { - /* is there stack space for prefix, name, and eventual last sufix? */ - luaL_checkstack(L, 3, "too many marks in a path component"); - lua_pushlstring(L, path, wild - path); /* push prefix */ - lua_pushvalue(L, 1); /* push package name (in place of MARK) */ - path = wild + 1; /* continue after MARK */ - n += 2; - } - lua_pushstring(L, path); /* push last sufix (`n' already includes this) */ - lua_concat(L, n); -} - - -static int luaB_require (lua_State *L) { - const char *path; - int status = LUA_ERRFILE; /* not found (yet) */ - luaL_checkstring(L, 1); - lua_settop(L, 1); - lua_getglobal(L, REQTAB); - if (!lua_istable(L, 2)) return luaL_error(L, "`" REQTAB "' is not a table"); - path = getpath(L); - lua_pushvalue(L, 1); /* check package's name in book-keeping table */ - lua_rawget(L, 2); - if (lua_toboolean(L, -1)) /* is it there? */ - return 1; /* package is already loaded; return its result */ - else { /* must load it */ - while (status == LUA_ERRFILE) { - lua_settop(L, 3); /* reset stack position */ - if ((path = pushnextpath(L, path)) == NULL) break; - pushcomposename(L); - status = luaL_loadfile(L, lua_tostring(L, -1)); /* try to load it */ - } - } - switch (status) { - case 0: { - lua_getglobal(L, "_REQUIREDNAME"); /* save previous name */ - lua_insert(L, -2); /* put it below function */ - lua_pushvalue(L, 1); - lua_setglobal(L, "_REQUIREDNAME"); /* set new name */ - lua_call(L, 0, 1); /* run loaded module */ - lua_insert(L, -2); /* put result below previous name */ - lua_setglobal(L, "_REQUIREDNAME"); /* reset to previous name */ - if (lua_isnil(L, -1)) { /* no/nil return? */ - lua_pushboolean(L, 1); - lua_replace(L, -2); /* replace to true */ - } - lua_pushvalue(L, 1); - lua_pushvalue(L, -2); - lua_rawset(L, 2); /* mark it as loaded */ - return 1; /* return value */ - } - case LUA_ERRFILE: { /* file not found */ - return luaL_error(L, "could not load package `%s' from path `%s'", - lua_tostring(L, 1), getpath(L)); - } - default: { - return luaL_error(L, "error loading package `%s' (%s)", - lua_tostring(L, 1), lua_tostring(L, -1)); - } - } -} - -/* }====================================================== */ - - -static const luaL_reg base_funcs[] = { - {"error", luaB_error}, - {"getmetatable", luaB_getmetatable}, - {"setmetatable", luaB_setmetatable}, - {"getfenv", luaB_getfenv}, - {"setfenv", luaB_setfenv}, - {"next", luaB_next}, - {"ipairs", luaB_ipairs}, - {"pairs", luaB_pairs}, - {"print", luaB_print}, - {"tonumber", luaB_tonumber}, - {"tostring", luaB_tostring}, - {"type", luaB_type}, - {"assert", luaB_assert}, - {"unpack", luaB_unpack}, - {"rawequal", luaB_rawequal}, - {"rawget", luaB_rawget}, - {"rawset", luaB_rawset}, - {"pcall", luaB_pcall}, - {"xpcall", luaB_xpcall}, - {"collectgarbage", luaB_collectgarbage}, - {"gcinfo", luaB_gcinfo}, - {"loadfile", luaB_loadfile}, - {"dofile", luaB_dofile}, - {"loadstring", luaB_loadstring}, - {"require", luaB_require}, - {NULL, NULL} -}; - - -/* -** {====================================================== -** Coroutine library -** ======================================================= -*/ - -static int auxresume (lua_State *L, lua_State *co, int narg) { - int status; - if (!lua_checkstack(co, narg)) - luaL_error(L, "too many arguments to resume"); - lua_xmove(L, co, narg); - status = lua_resume(co, narg); - if (status == 0) { - int nres = lua_gettop(co); - if (!lua_checkstack(L, nres)) - luaL_error(L, "too many results to resume"); - lua_xmove(co, L, nres); /* move yielded values */ - return nres; - } - else { - lua_xmove(co, L, 1); /* move error message */ - return -1; /* error flag */ - } -} - - -static int luaB_coresume (lua_State *L) { - lua_State *co = lua_tothread(L, 1); - int r; - luaL_argcheck(L, co, 1, "coroutine expected"); - r = auxresume(L, co, lua_gettop(L) - 1); - if (r < 0) { - lua_pushboolean(L, 0); - lua_insert(L, -2); - return 2; /* return false + error message */ - } - else { - lua_pushboolean(L, 1); - lua_insert(L, -(r + 1)); - return r + 1; /* return true + `resume' returns */ - } -} - - -static int luaB_auxwrap (lua_State *L) { - lua_State *co = lua_tothread(L, lua_upvalueindex(1)); - int r = auxresume(L, co, lua_gettop(L)); - if (r < 0) { - if (lua_isstring(L, -1)) { /* error object is a string? */ - luaL_where(L, 1); /* add extra info */ - lua_insert(L, -2); - lua_concat(L, 2); - } - lua_error(L); /* propagate error */ - } - return r; -} - - -static int luaB_cocreate (lua_State *L) { - lua_State *NL = lua_newthread(L); - luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), 1, - "Lua function expected"); - lua_pushvalue(L, 1); /* move function to top */ - lua_xmove(L, NL, 1); /* move function from L to NL */ - return 1; -} - - -static int luaB_cowrap (lua_State *L) { - luaB_cocreate(L); - lua_pushcclosure(L, luaB_auxwrap, 1); - return 1; -} - - -static int luaB_yield (lua_State *L) { - return lua_yield(L, lua_gettop(L)); -} - - -static int luaB_costatus (lua_State *L) { - lua_State *co = lua_tothread(L, 1); - luaL_argcheck(L, co, 1, "coroutine expected"); - if (L == co) lua_pushliteral(L, "running"); - else { - lua_Debug ar; - if (lua_getstack(co, 0, &ar) == 0 && lua_gettop(co) == 0) - lua_pushliteral(L, "dead"); - else - lua_pushliteral(L, "suspended"); - } - return 1; -} - - -static const luaL_reg co_funcs[] = { - {"create", luaB_cocreate}, - {"wrap", luaB_cowrap}, - {"resume", luaB_coresume}, - {"yield", luaB_yield}, - {"status", luaB_costatus}, - {NULL, NULL} -}; - -/* }====================================================== */ - - - -static void base_open (lua_State *L) { - lua_pushliteral(L, "_G"); - lua_pushvalue(L, LUA_GLOBALSINDEX); - luaL_openlib(L, NULL, base_funcs, 0); /* open lib into global table */ - lua_pushliteral(L, "_VERSION"); - lua_pushliteral(L, LUA_VERSION); - lua_rawset(L, -3); /* set global _VERSION */ - /* `newproxy' needs a weaktable as upvalue */ - lua_pushliteral(L, "newproxy"); - lua_newtable(L); /* new table `w' */ - lua_pushvalue(L, -1); /* `w' will be its own metatable */ - lua_setmetatable(L, -2); - lua_pushliteral(L, "__mode"); - lua_pushliteral(L, "k"); - lua_rawset(L, -3); /* metatable(w).__mode = "k" */ - lua_pushcclosure(L, luaB_newproxy, 1); - lua_rawset(L, -3); /* set global `newproxy' */ - lua_rawset(L, -1); /* set global _G */ -} - - -LUALIB_API int luaopen_base (lua_State *L) { - base_open(L); - luaL_openlib(L, LUA_COLIBNAME, co_funcs, 0); - lua_newtable(L); - lua_setglobal(L, REQTAB); - return 0; -} - diff --git a/plugins/SmartAutoReplier/lualib/lcode.c b/plugins/SmartAutoReplier/lualib/lcode.c deleted file mode 100644 index d626ecd60e..0000000000 --- a/plugins/SmartAutoReplier/lualib/lcode.c +++ /dev/null @@ -1,714 +0,0 @@ -/* -** $Id: lcode.c,v 1.117 2003/04/03 13:35:34 roberto Exp $ -** Code generator for Lua -** See Copyright Notice in lua.h -*/ - - -#include - -#define lcode_c - -#include "lua.h" - -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "ltable.h" - - -#define hasjumps(e) ((e)->t != (e)->f) - - -void luaK_nil (FuncState *fs, int from, int n) { - Instruction *previous; - if (fs->pc > fs->lasttarget && /* no jumps to current position? */ - GET_OPCODE(*(previous = &fs->f->code[fs->pc-1])) == OP_LOADNIL) { - int pfrom = GETARG_A(*previous); - int pto = GETARG_B(*previous); - if (pfrom <= from && from <= pto+1) { /* can connect both? */ - if (from+n-1 > pto) - SETARG_B(*previous, from+n-1); - return; - } - } - luaK_codeABC(fs, OP_LOADNIL, from, from+n-1, 0); /* else no optimization */ -} - - -int luaK_jump (FuncState *fs) { - int jpc = fs->jpc; /* save list of jumps to here */ - int j; - fs->jpc = NO_JUMP; - j = luaK_codeAsBx(fs, OP_JMP, 0, NO_JUMP); - luaK_concat(fs, &j, jpc); /* keep them on hold */ - return j; -} - - -static int luaK_condjump (FuncState *fs, OpCode op, int A, int B, int C) { - luaK_codeABC(fs, op, A, B, C); - return luaK_jump(fs); -} - - -static void luaK_fixjump (FuncState *fs, int pc, int dest) { - Instruction *jmp = &fs->f->code[pc]; - int offset = dest-(pc+1); - lua_assert(dest != NO_JUMP); - if (abs(offset) > MAXARG_sBx) - luaX_syntaxerror(fs->ls, "control structure too long"); - SETARG_sBx(*jmp, offset); -} - - -/* -** returns current `pc' and marks it as a jump target (to avoid wrong -** optimizations with consecutive instructions not in the same basic block). -*/ -int luaK_getlabel (FuncState *fs) { - fs->lasttarget = fs->pc; - return fs->pc; -} - - -static int luaK_getjump (FuncState *fs, int pc) { - int offset = GETARG_sBx(fs->f->code[pc]); - if (offset == NO_JUMP) /* point to itself represents end of list */ - return NO_JUMP; /* end of list */ - else - return (pc+1)+offset; /* turn offset into absolute position */ -} - - -static Instruction *getjumpcontrol (FuncState *fs, int pc) { - Instruction *pi = &fs->f->code[pc]; - if (pc >= 1 && testOpMode(GET_OPCODE(*(pi-1)), OpModeT)) - return pi-1; - else - return pi; -} - - -/* -** check whether list has any jump that do not produce a value -** (or produce an inverted value) -*/ -static int need_value (FuncState *fs, int list, int cond) { - for (; list != NO_JUMP; list = luaK_getjump(fs, list)) { - Instruction i = *getjumpcontrol(fs, list); - if (GET_OPCODE(i) != OP_TEST || GETARG_C(i) != cond) return 1; - } - return 0; /* not found */ -} - - -static void patchtestreg (Instruction *i, int reg) { - if (reg == NO_REG) reg = GETARG_B(*i); - SETARG_A(*i, reg); -} - - -static void luaK_patchlistaux (FuncState *fs, int list, - int ttarget, int treg, int ftarget, int freg, int dtarget) { - while (list != NO_JUMP) { - int next = luaK_getjump(fs, list); - Instruction *i = getjumpcontrol(fs, list); - if (GET_OPCODE(*i) != OP_TEST) { - lua_assert(dtarget != NO_JUMP); - luaK_fixjump(fs, list, dtarget); /* jump to default target */ - } - else { - if (GETARG_C(*i)) { - lua_assert(ttarget != NO_JUMP); - patchtestreg(i, treg); - luaK_fixjump(fs, list, ttarget); - } - else { - lua_assert(ftarget != NO_JUMP); - patchtestreg(i, freg); - luaK_fixjump(fs, list, ftarget); - } - } - list = next; - } -} - - -static void luaK_dischargejpc (FuncState *fs) { - luaK_patchlistaux(fs, fs->jpc, fs->pc, NO_REG, fs->pc, NO_REG, fs->pc); - fs->jpc = NO_JUMP; -} - - -void luaK_patchlist (FuncState *fs, int list, int target) { - if (target == fs->pc) - luaK_patchtohere(fs, list); - else { - lua_assert(target < fs->pc); - luaK_patchlistaux(fs, list, target, NO_REG, target, NO_REG, target); - } -} - - -void luaK_patchtohere (FuncState *fs, int list) { - luaK_getlabel(fs); - luaK_concat(fs, &fs->jpc, list); -} - - -void luaK_concat (FuncState *fs, int *l1, int l2) { - if (l2 == NO_JUMP) return; - else if (*l1 == NO_JUMP) - *l1 = l2; - else { - int list = *l1; - int next; - while ((next = luaK_getjump(fs, list)) != NO_JUMP) /* find last element */ - list = next; - luaK_fixjump(fs, list, l2); - } -} - - -void luaK_checkstack (FuncState *fs, int n) { - int newstack = fs->freereg + n; - if (newstack > fs->f->maxstacksize) { - if (newstack >= MAXSTACK) - luaX_syntaxerror(fs->ls, "function or expression too complex"); - fs->f->maxstacksize = cast(lu_byte, newstack); - } -} - - -void luaK_reserveregs (FuncState *fs, int n) { - luaK_checkstack(fs, n); - fs->freereg += n; -} - - -static void freereg (FuncState *fs, int reg) { - if (reg >= fs->nactvar && reg < MAXSTACK) { - fs->freereg--; - lua_assert(reg == fs->freereg); - } -} - - -static void freeexp (FuncState *fs, expdesc *e) { - if (e->k == VNONRELOC) - freereg(fs, e->info); -} - - -static int addk (FuncState *fs, TObject *k, TObject *v) { - const TObject *idx = luaH_get(fs->h, k); - if (ttisnumber(idx)) { - lua_assert(luaO_rawequalObj(&fs->f->k[cast(int, nvalue(idx))], v)); - return cast(int, nvalue(idx)); - } - else { /* constant not found; create a new entry */ - Proto *f = fs->f; - luaM_growvector(fs->L, f->k, fs->nk, f->sizek, TObject, - MAXARG_Bx, "constant table overflow"); - setobj2n(&f->k[fs->nk], v); - setnvalue(luaH_set(fs->L, fs->h, k), cast(lua_Number, fs->nk)); - return fs->nk++; - } -} - - -int luaK_stringK (FuncState *fs, TString *s) { - TObject o; - setsvalue(&o, s); - return addk(fs, &o, &o); -} - - -int luaK_numberK (FuncState *fs, lua_Number r) { - TObject o; - setnvalue(&o, r); - return addk(fs, &o, &o); -} - - -static int nil_constant (FuncState *fs) { - TObject k, v; - setnilvalue(&v); - sethvalue(&k, fs->h); /* cannot use nil as key; instead use table itself */ - return addk(fs, &k, &v); -} - - -void luaK_setcallreturns (FuncState *fs, expdesc *e, int nresults) { - if (e->k == VCALL) { /* expression is an open function call? */ - SETARG_C(getcode(fs, e), nresults+1); - if (nresults == 1) { /* `regular' expression? */ - e->k = VNONRELOC; - e->info = GETARG_A(getcode(fs, e)); - } - } -} - - -void luaK_dischargevars (FuncState *fs, expdesc *e) { - switch (e->k) { - case VLOCAL: { - e->k = VNONRELOC; - break; - } - case VUPVAL: { - e->info = luaK_codeABC(fs, OP_GETUPVAL, 0, e->info, 0); - e->k = VRELOCABLE; - break; - } - case VGLOBAL: { - e->info = luaK_codeABx(fs, OP_GETGLOBAL, 0, e->info); - e->k = VRELOCABLE; - break; - } - case VINDEXED: { - freereg(fs, e->aux); - freereg(fs, e->info); - e->info = luaK_codeABC(fs, OP_GETTABLE, 0, e->info, e->aux); - e->k = VRELOCABLE; - break; - } - case VCALL: { - luaK_setcallreturns(fs, e, 1); - break; - } - default: break; /* there is one value available (somewhere) */ - } -} - - -static int code_label (FuncState *fs, int A, int b, int jump) { - luaK_getlabel(fs); /* those instructions may be jump targets */ - return luaK_codeABC(fs, OP_LOADBOOL, A, b, jump); -} - - -static void discharge2reg (FuncState *fs, expdesc *e, int reg) { - luaK_dischargevars(fs, e); - switch (e->k) { - case VNIL: { - luaK_nil(fs, reg, 1); - break; - } - case VFALSE: case VTRUE: { - luaK_codeABC(fs, OP_LOADBOOL, reg, e->k == VTRUE, 0); - break; - } - case VK: { - luaK_codeABx(fs, OP_LOADK, reg, e->info); - break; - } - case VRELOCABLE: { - Instruction *pc = &getcode(fs, e); - SETARG_A(*pc, reg); - break; - } - case VNONRELOC: { - if (reg != e->info) - luaK_codeABC(fs, OP_MOVE, reg, e->info, 0); - break; - } - default: { - lua_assert(e->k == VVOID || e->k == VJMP); - return; /* nothing to do... */ - } - } - e->info = reg; - e->k = VNONRELOC; -} - - -static void discharge2anyreg (FuncState *fs, expdesc *e) { - if (e->k != VNONRELOC) { - luaK_reserveregs(fs, 1); - discharge2reg(fs, e, fs->freereg-1); - } -} - - -static void luaK_exp2reg (FuncState *fs, expdesc *e, int reg) { - discharge2reg(fs, e, reg); - if (e->k == VJMP) - luaK_concat(fs, &e->t, e->info); /* put this jump in `t' list */ - if (hasjumps(e)) { - int final; /* position after whole expression */ - int p_f = NO_JUMP; /* position of an eventual LOAD false */ - int p_t = NO_JUMP; /* position of an eventual LOAD true */ - if (need_value(fs, e->t, 1) || need_value(fs, e->f, 0)) { - int fj = NO_JUMP; /* first jump (over LOAD ops.) */ - if (e->k != VJMP) - fj = luaK_jump(fs); - p_f = code_label(fs, reg, 0, 1); - p_t = code_label(fs, reg, 1, 0); - luaK_patchtohere(fs, fj); - } - final = luaK_getlabel(fs); - luaK_patchlistaux(fs, e->f, p_f, NO_REG, final, reg, p_f); - luaK_patchlistaux(fs, e->t, final, reg, p_t, NO_REG, p_t); - } - e->f = e->t = NO_JUMP; - e->info = reg; - e->k = VNONRELOC; -} - - -void luaK_exp2nextreg (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - freeexp(fs, e); - luaK_reserveregs(fs, 1); - luaK_exp2reg(fs, e, fs->freereg - 1); -} - - -int luaK_exp2anyreg (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - if (e->k == VNONRELOC) { - if (!hasjumps(e)) return e->info; /* exp is already in a register */ - if (e->info >= fs->nactvar) { /* reg. is not a local? */ - luaK_exp2reg(fs, e, e->info); /* put value on it */ - return e->info; - } - } - luaK_exp2nextreg(fs, e); /* default */ - return e->info; -} - - -void luaK_exp2val (FuncState *fs, expdesc *e) { - if (hasjumps(e)) - luaK_exp2anyreg(fs, e); - else - luaK_dischargevars(fs, e); -} - - -int luaK_exp2RK (FuncState *fs, expdesc *e) { - luaK_exp2val(fs, e); - switch (e->k) { - case VNIL: { - if (fs->nk + MAXSTACK <= MAXARG_C) { /* constant fit in argC? */ - e->info = nil_constant(fs); - e->k = VK; - return e->info + MAXSTACK; - } - else break; - } - case VK: { - if (e->info + MAXSTACK <= MAXARG_C) /* constant fit in argC? */ - return e->info + MAXSTACK; - else break; - } - default: break; - } - /* not a constant in the right range: put it in a register */ - return luaK_exp2anyreg(fs, e); -} - - -void luaK_storevar (FuncState *fs, expdesc *var, expdesc *exp) { - switch (var->k) { - case VLOCAL: { - freeexp(fs, exp); - luaK_exp2reg(fs, exp, var->info); - return; - } - case VUPVAL: { - int e = luaK_exp2anyreg(fs, exp); - luaK_codeABC(fs, OP_SETUPVAL, e, var->info, 0); - break; - } - case VGLOBAL: { - int e = luaK_exp2anyreg(fs, exp); - luaK_codeABx(fs, OP_SETGLOBAL, e, var->info); - break; - } - case VINDEXED: { - int e = luaK_exp2RK(fs, exp); - luaK_codeABC(fs, OP_SETTABLE, var->info, var->aux, e); - break; - } - default: { - lua_assert(0); /* invalid var kind to store */ - break; - } - } - freeexp(fs, exp); -} - - -void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { - int func; - luaK_exp2anyreg(fs, e); - freeexp(fs, e); - func = fs->freereg; - luaK_reserveregs(fs, 2); - luaK_codeABC(fs, OP_SELF, func, e->info, luaK_exp2RK(fs, key)); - freeexp(fs, key); - e->info = func; - e->k = VNONRELOC; -} - - -static void invertjump (FuncState *fs, expdesc *e) { - Instruction *pc = getjumpcontrol(fs, e->info); - lua_assert(testOpMode(GET_OPCODE(*pc), OpModeT) && - GET_OPCODE(*pc) != OP_TEST); - SETARG_A(*pc, !(GETARG_A(*pc))); -} - - -static int jumponcond (FuncState *fs, expdesc *e, int cond) { - if (e->k == VRELOCABLE) { - Instruction ie = getcode(fs, e); - if (GET_OPCODE(ie) == OP_NOT) { - fs->pc--; /* remove previous OP_NOT */ - return luaK_condjump(fs, OP_TEST, NO_REG, GETARG_B(ie), !cond); - } - /* else go through */ - } - discharge2anyreg(fs, e); - freeexp(fs, e); - return luaK_condjump(fs, OP_TEST, NO_REG, e->info, cond); -} - - -void luaK_goiftrue (FuncState *fs, expdesc *e) { - int pc; /* pc of last jump */ - luaK_dischargevars(fs, e); - switch (e->k) { - case VK: case VTRUE: { - pc = NO_JUMP; /* always true; do nothing */ - break; - } - case VFALSE: { - pc = luaK_jump(fs); /* always jump */ - break; - } - case VJMP: { - invertjump(fs, e); - pc = e->info; - break; - } - default: { - pc = jumponcond(fs, e, 0); - break; - } - } - luaK_concat(fs, &e->f, pc); /* insert last jump in `f' list */ -} - - -void luaK_goiffalse (FuncState *fs, expdesc *e) { - int pc; /* pc of last jump */ - luaK_dischargevars(fs, e); - switch (e->k) { - case VNIL: case VFALSE: { - pc = NO_JUMP; /* always false; do nothing */ - break; - } - case VTRUE: { - pc = luaK_jump(fs); /* always jump */ - break; - } - case VJMP: { - pc = e->info; - break; - } - default: { - pc = jumponcond(fs, e, 1); - break; - } - } - luaK_concat(fs, &e->t, pc); /* insert last jump in `t' list */ -} - - -static void codenot (FuncState *fs, expdesc *e) { - luaK_dischargevars(fs, e); - switch (e->k) { - case VNIL: case VFALSE: { - e->k = VTRUE; - break; - } - case VK: case VTRUE: { - e->k = VFALSE; - break; - } - case VJMP: { - invertjump(fs, e); - break; - } - case VRELOCABLE: - case VNONRELOC: { - discharge2anyreg(fs, e); - freeexp(fs, e); - e->info = luaK_codeABC(fs, OP_NOT, 0, e->info, 0); - e->k = VRELOCABLE; - break; - } - default: { - lua_assert(0); /* cannot happen */ - break; - } - } - /* interchange true and false lists */ - { int temp = e->f; e->f = e->t; e->t = temp; } -} - - -void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k) { - t->aux = luaK_exp2RK(fs, k); - t->k = VINDEXED; -} - - -void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e) { - if (op == OPR_MINUS) { - luaK_exp2val(fs, e); - if (e->k == VK && ttisnumber(&fs->f->k[e->info])) - e->info = luaK_numberK(fs, -nvalue(&fs->f->k[e->info])); - else { - luaK_exp2anyreg(fs, e); - freeexp(fs, e); - e->info = luaK_codeABC(fs, OP_UNM, 0, e->info, 0); - e->k = VRELOCABLE; - } - } - else /* op == NOT */ - codenot(fs, e); -} - - -void luaK_infix (FuncState *fs, BinOpr op, expdesc *v) { - switch (op) { - case OPR_AND: { - luaK_goiftrue(fs, v); - luaK_patchtohere(fs, v->t); - v->t = NO_JUMP; - break; - } - case OPR_OR: { - luaK_goiffalse(fs, v); - luaK_patchtohere(fs, v->f); - v->f = NO_JUMP; - break; - } - case OPR_CONCAT: { - luaK_exp2nextreg(fs, v); /* operand must be on the `stack' */ - break; - } - default: { - luaK_exp2RK(fs, v); - break; - } - } -} - - -static void codebinop (FuncState *fs, expdesc *res, BinOpr op, - int o1, int o2) { - if (op <= OPR_POW) { /* arithmetic operator? */ - OpCode opc = cast(OpCode, (op - OPR_ADD) + OP_ADD); /* ORDER OP */ - res->info = luaK_codeABC(fs, opc, 0, o1, o2); - res->k = VRELOCABLE; - } - else { /* test operator */ - static const OpCode ops[] = {OP_EQ, OP_EQ, OP_LT, OP_LE, OP_LT, OP_LE}; - int cond = 1; - if (op >= OPR_GT) { /* `>' or `>='? */ - int temp; /* exchange args and replace by `<' or `<=' */ - temp = o1; o1 = o2; o2 = temp; /* o1 <==> o2 */ - } - else if (op == OPR_NE) cond = 0; - res->info = luaK_condjump(fs, ops[op - OPR_NE], cond, o1, o2); - res->k = VJMP; - } -} - - -void luaK_posfix (FuncState *fs, BinOpr op, expdesc *e1, expdesc *e2) { - switch (op) { - case OPR_AND: { - lua_assert(e1->t == NO_JUMP); /* list must be closed */ - luaK_dischargevars(fs, e2); - luaK_concat(fs, &e1->f, e2->f); - e1->k = e2->k; e1->info = e2->info; e1->aux = e2->aux; e1->t = e2->t; - break; - } - case OPR_OR: { - lua_assert(e1->f == NO_JUMP); /* list must be closed */ - luaK_dischargevars(fs, e2); - luaK_concat(fs, &e1->t, e2->t); - e1->k = e2->k; e1->info = e2->info; e1->aux = e2->aux; e1->f = e2->f; - break; - } - case OPR_CONCAT: { - luaK_exp2val(fs, e2); - if (e2->k == VRELOCABLE && GET_OPCODE(getcode(fs, e2)) == OP_CONCAT) { - lua_assert(e1->info == GETARG_B(getcode(fs, e2))-1); - freeexp(fs, e1); - SETARG_B(getcode(fs, e2), e1->info); - e1->k = e2->k; e1->info = e2->info; - } - else { - luaK_exp2nextreg(fs, e2); - freeexp(fs, e2); - freeexp(fs, e1); - e1->info = luaK_codeABC(fs, OP_CONCAT, 0, e1->info, e2->info); - e1->k = VRELOCABLE; - } - break; - } - default: { - int o1 = luaK_exp2RK(fs, e1); - int o2 = luaK_exp2RK(fs, e2); - freeexp(fs, e2); - freeexp(fs, e1); - codebinop(fs, e1, op, o1, o2); - } - } -} - - -void luaK_fixline (FuncState *fs, int line) { - fs->f->lineinfo[fs->pc - 1] = line; -} - - -int luaK_code (FuncState *fs, Instruction i, int line) { - Proto *f = fs->f; - luaK_dischargejpc(fs); /* `pc' will change */ - /* put new instruction in code array */ - luaM_growvector(fs->L, f->code, fs->pc, f->sizecode, Instruction, - MAX_INT, "code size overflow"); - f->code[fs->pc] = i; - /* save corresponding line information */ - luaM_growvector(fs->L, f->lineinfo, fs->pc, f->sizelineinfo, int, - MAX_INT, "code size overflow"); - f->lineinfo[fs->pc] = line; - return fs->pc++; -} - - -int luaK_codeABC (FuncState *fs, OpCode o, int a, int b, int c) { - lua_assert(getOpMode(o) == iABC); - return luaK_code(fs, CREATE_ABC(o, a, b, c), fs->ls->lastline); -} - - -int luaK_codeABx (FuncState *fs, OpCode o, int a, unsigned int bc) { - lua_assert(getOpMode(o) == iABx || getOpMode(o) == iAsBx); - return luaK_code(fs, CREATE_ABx(o, a, bc), fs->ls->lastline); -} - diff --git a/plugins/SmartAutoReplier/lualib/lcode.h b/plugins/SmartAutoReplier/lualib/lcode.h deleted file mode 100644 index 74908c6580..0000000000 --- a/plugins/SmartAutoReplier/lualib/lcode.h +++ /dev/null @@ -1,74 +0,0 @@ -/* -** $Id: lcode.h,v 1.38 2002/12/11 12:34:22 roberto Exp $ -** Code generator for Lua -** See Copyright Notice in lua.h -*/ - -#ifndef lcode_h -#define lcode_h - -#include "llex.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" - - -/* -** Marks the end of a patch list. It is an invalid value both as an absolute -** address, and as a list link (would link an element to itself). -*/ -#define NO_JUMP (-1) - - -/* -** grep "ORDER OPR" if you change these enums -*/ -typedef enum BinOpr { - OPR_ADD, OPR_SUB, OPR_MULT, OPR_DIV, OPR_POW, - OPR_CONCAT, - OPR_NE, OPR_EQ, - OPR_LT, OPR_LE, OPR_GT, OPR_GE, - OPR_AND, OPR_OR, - OPR_NOBINOPR -} BinOpr; - -#define binopistest(op) ((op) >= OPR_NE) - -typedef enum UnOpr { OPR_MINUS, OPR_NOT, OPR_NOUNOPR } UnOpr; - - -#define getcode(fs,e) ((fs)->f->code[(e)->info]) - -#define luaK_codeAsBx(fs,o,A,sBx) luaK_codeABx(fs,o,A,(sBx)+MAXARG_sBx) - -int luaK_code (FuncState *fs, Instruction i, int line); -int luaK_codeABx (FuncState *fs, OpCode o, int A, unsigned int Bx); -int luaK_codeABC (FuncState *fs, OpCode o, int A, int B, int C); -void luaK_fixline (FuncState *fs, int line); -void luaK_nil (FuncState *fs, int from, int n); -void luaK_reserveregs (FuncState *fs, int n); -void luaK_checkstack (FuncState *fs, int n); -int luaK_stringK (FuncState *fs, TString *s); -int luaK_numberK (FuncState *fs, lua_Number r); -void luaK_dischargevars (FuncState *fs, expdesc *e); -int luaK_exp2anyreg (FuncState *fs, expdesc *e); -void luaK_exp2nextreg (FuncState *fs, expdesc *e); -void luaK_exp2val (FuncState *fs, expdesc *e); -int luaK_exp2RK (FuncState *fs, expdesc *e); -void luaK_self (FuncState *fs, expdesc *e, expdesc *key); -void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k); -void luaK_goiftrue (FuncState *fs, expdesc *e); -void luaK_goiffalse (FuncState *fs, expdesc *e); -void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e); -void luaK_setcallreturns (FuncState *fs, expdesc *var, int nresults); -int luaK_jump (FuncState *fs); -void luaK_patchlist (FuncState *fs, int list, int target); -void luaK_patchtohere (FuncState *fs, int list); -void luaK_concat (FuncState *fs, int *l1, int l2); -int luaK_getlabel (FuncState *fs); -void luaK_prefix (FuncState *fs, UnOpr op, expdesc *v); -void luaK_infix (FuncState *fs, BinOpr op, expdesc *v); -void luaK_posfix (FuncState *fs, BinOpr op, expdesc *v1, expdesc *v2); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/ldblib.c b/plugins/SmartAutoReplier/lualib/ldblib.c deleted file mode 100644 index 6dc9b64cfc..0000000000 --- a/plugins/SmartAutoReplier/lualib/ldblib.c +++ /dev/null @@ -1,299 +0,0 @@ -/* -** $Id: ldblib.c,v 1.80 2003/04/03 13:35:34 roberto Exp $ -** Interface from Lua to its debug API -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include - -#define ldblib_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - -static void settabss (lua_State *L, const char *i, const char *v) { - lua_pushstring(L, i); - lua_pushstring(L, v); - lua_rawset(L, -3); -} - - -static void settabsi (lua_State *L, const char *i, int v) { - lua_pushstring(L, i); - lua_pushnumber(L, (lua_Number)v); - lua_rawset(L, -3); -} - - -static int getinfo (lua_State *L) { - lua_Debug ar; - const char *options = luaL_optstring(L, 2, "flnSu"); - if (lua_isnumber(L, 1)) { - if (!lua_getstack(L, (int)(lua_tonumber(L, 1)), &ar)) { - lua_pushnil(L); /* level out of range */ - return 1; - } - } - else if (lua_isfunction(L, 1)) { - lua_pushfstring(L, ">%s", options); - options = lua_tostring(L, -1); - lua_pushvalue(L, 1); - } - else - return luaL_argerror(L, 1, "function or level expected"); - if (!lua_getinfo(L, options, &ar)) - return luaL_argerror(L, 2, "invalid option"); - lua_newtable(L); - for (; *options; options++) { - switch (*options) { - case 'S': - settabss(L, "source", ar.source); - settabss(L, "short_src", ar.short_src); - settabsi(L, "linedefined", ar.linedefined); - settabss(L, "what", ar.what); - break; - case 'l': - settabsi(L, "currentline", ar.currentline); - break; - case 'u': - settabsi(L, "nups", ar.nups); - break; - case 'n': - settabss(L, "name", ar.name); - settabss(L, "namewhat", ar.namewhat); - break; - case 'f': - lua_pushliteral(L, "func"); - lua_pushvalue(L, -3); - lua_rawset(L, -3); - break; - } - } - return 1; /* return table */ -} - - -static int getlocal (lua_State *L) { - lua_Debug ar; - const char *name; - if (!lua_getstack(L, luaL_checkint(L, 1), &ar)) /* level out of range? */ - return luaL_argerror(L, 1, "level out of range"); - name = lua_getlocal(L, &ar, luaL_checkint(L, 2)); - if (name) { - lua_pushstring(L, name); - lua_pushvalue(L, -2); - return 2; - } - else { - lua_pushnil(L); - return 1; - } -} - - -static int setlocal (lua_State *L) { - lua_Debug ar; - if (!lua_getstack(L, luaL_checkint(L, 1), &ar)) /* level out of range? */ - return luaL_argerror(L, 1, "level out of range"); - luaL_checkany(L, 3); - lua_pushstring(L, lua_setlocal(L, &ar, luaL_checkint(L, 2))); - return 1; -} - - -static int auxupvalue (lua_State *L, int get) { - const char *name; - int n = luaL_checkint(L, 2); - luaL_checktype(L, 1, LUA_TFUNCTION); - if (lua_iscfunction(L, 1)) return 0; /* cannot touch C upvalues from Lua */ - name = get ? lua_getupvalue(L, 1, n) : lua_setupvalue(L, 1, n); - if (name == NULL) return 0; - lua_pushstring(L, name); - lua_insert(L, -(get+1)); - return get + 1; -} - - -static int getupvalue (lua_State *L) { - return auxupvalue(L, 1); -} - - -static int setupvalue (lua_State *L) { - luaL_checkany(L, 3); - return auxupvalue(L, 0); -} - - - -static const char KEY_HOOK = 'h'; - - -static void hookf (lua_State *L, lua_Debug *ar) { - static const char *const hooknames[] = - {"call", "return", "line", "count", "tail return"}; - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_rawget(L, LUA_REGISTRYINDEX); - if (lua_isfunction(L, -1)) { - lua_pushstring(L, hooknames[(int)ar->event]); - if (ar->currentline >= 0) - lua_pushnumber(L, (lua_Number)ar->currentline); - else lua_pushnil(L); - lua_assert(lua_getinfo(L, "lS", ar)); - lua_call(L, 2, 0); - } - else - lua_pop(L, 1); /* pop result from gettable */ -} - - -static int makemask (const char *smask, int count) { - int mask = 0; - if (strchr(smask, 'c')) mask |= LUA_MASKCALL; - if (strchr(smask, 'r')) mask |= LUA_MASKRET; - if (strchr(smask, 'l')) mask |= LUA_MASKLINE; - if (count > 0) mask |= LUA_MASKCOUNT; - return mask; -} - - -static char *unmakemask (int mask, char *smask) { - int i = 0; - if (mask & LUA_MASKCALL) smask[i++] = 'c'; - if (mask & LUA_MASKRET) smask[i++] = 'r'; - if (mask & LUA_MASKLINE) smask[i++] = 'l'; - smask[i] = '\0'; - return smask; -} - - -static int sethook (lua_State *L) { - if (lua_isnoneornil(L, 1)) { - lua_settop(L, 1); - lua_sethook(L, NULL, 0, 0); /* turn off hooks */ - } - else { - const char *smask = luaL_checkstring(L, 2); - int count = luaL_optint(L, 3, 0); - luaL_checktype(L, 1, LUA_TFUNCTION); - lua_sethook(L, hookf, makemask(smask, count), count); - } - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_pushvalue(L, 1); - lua_rawset(L, LUA_REGISTRYINDEX); /* set new hook */ - return 0; -} - - -static int gethook (lua_State *L) { - char buff[5]; - int mask = lua_gethookmask(L); - lua_Hook hook = lua_gethook(L); - if (hook != NULL && hook != hookf) /* external hook? */ - lua_pushliteral(L, "external hook"); - else { - lua_pushlightuserdata(L, (void *)&KEY_HOOK); - lua_rawget(L, LUA_REGISTRYINDEX); /* get hook */ - } - lua_pushstring(L, unmakemask(mask, buff)); - lua_pushnumber(L, (lua_Number)lua_gethookcount(L)); - return 3; -} - - -static int debug (lua_State *L) { - for (;;) { - char buffer[250]; - fputs("lua_debug> ", stderr); - if (fgets(buffer, sizeof(buffer), stdin) == 0 || - strcmp(buffer, "cont\n") == 0) - return 0; - lua_dostring(L, buffer); - lua_settop(L, 0); /* remove eventual returns */ - } -} - - -#define LEVELS1 12 /* size of the first part of the stack */ -#define LEVELS2 10 /* size of the second part of the stack */ - -static int errorfb (lua_State *L) { - int level = 1; /* skip level 0 (it's this function) */ - int firstpart = 1; /* still before eventual `...' */ - lua_Debug ar; - if (lua_gettop(L) == 0) - lua_pushliteral(L, ""); - else if (!lua_isstring(L, 1)) return 1; /* no string message */ - else lua_pushliteral(L, "\n"); - lua_pushliteral(L, "stack traceback:"); - while (lua_getstack(L, level++, &ar)) { - if (level > LEVELS1 && firstpart) { - /* no more than `LEVELS2' more levels? */ - if (!lua_getstack(L, level+LEVELS2, &ar)) - level--; /* keep going */ - else { - lua_pushliteral(L, "\n\t..."); /* too many levels */ - while (lua_getstack(L, level+LEVELS2, &ar)) /* find last levels */ - level++; - } - firstpart = 0; - continue; - } - lua_pushliteral(L, "\n\t"); - lua_getinfo(L, "Snl", &ar); - lua_pushfstring(L, "%s:", ar.short_src); - if (ar.currentline > 0) - lua_pushfstring(L, "%d:", ar.currentline); - switch (*ar.namewhat) { - case 'g': /* global */ - case 'l': /* local */ - case 'f': /* field */ - case 'm': /* method */ - lua_pushfstring(L, " in function `%s'", ar.name); - break; - default: { - if (*ar.what == 'm') /* main? */ - lua_pushfstring(L, " in main chunk"); - else if (*ar.what == 'C' || *ar.what == 't') - lua_pushliteral(L, " ?"); /* C function or tail call */ - else - lua_pushfstring(L, " in function <%s:%d>", - ar.short_src, ar.linedefined); - } - } - lua_concat(L, lua_gettop(L)); - } - lua_concat(L, lua_gettop(L)); - return 1; -} - - -static const luaL_reg dblib[] = { - {"getlocal", getlocal}, - {"getinfo", getinfo}, - {"gethook", gethook}, - {"getupvalue", getupvalue}, - {"sethook", sethook}, - {"setlocal", setlocal}, - {"setupvalue", setupvalue}, - {"debug", debug}, - {"traceback", errorfb}, - {NULL, NULL} -}; - - -LUALIB_API int luaopen_debug (lua_State *L) { - luaL_openlib(L, LUA_DBLIBNAME, dblib, 0); - lua_pushliteral(L, "_TRACEBACK"); - lua_pushcfunction(L, errorfb); - lua_settable(L, LUA_GLOBALSINDEX); - return 1; -} - diff --git a/plugins/SmartAutoReplier/lualib/ldebug.c b/plugins/SmartAutoReplier/lualib/ldebug.c deleted file mode 100644 index 8e511e3bd9..0000000000 --- a/plugins/SmartAutoReplier/lualib/ldebug.c +++ /dev/null @@ -1,585 +0,0 @@ -/* -** $Id: ldebug.c,v 1.150 2003/03/19 21:24:04 roberto Exp $ -** Debug Interface -** See Copyright Notice in lua.h -*/ - - -#include -#include - -#define ldebug_c - -#include "lua.h" - -#include "lapi.h" -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - - -static const char *getfuncname (CallInfo *ci, const char **name); - - -#define isLua(ci) (!((ci)->state & CI_C)) - - -static int currentpc (CallInfo *ci) { - if (!isLua(ci)) return -1; /* function is not a Lua function? */ - if (ci->state & CI_HASFRAME) /* function has a frame? */ - ci->u.l.savedpc = *ci->u.l.pc; /* use `pc' from there */ - /* function's pc is saved */ - return pcRel(ci->u.l.savedpc, ci_func(ci)->l.p); -} - - -static int currentline (CallInfo *ci) { - int pc = currentpc(ci); - if (pc < 0) - return -1; /* only active lua functions have current-line information */ - else - return getline(ci_func(ci)->l.p, pc); -} - - -void luaG_inithooks (lua_State *L) { - CallInfo *ci; - for (ci = L->ci; ci != L->base_ci; ci--) /* update all `savedpc's */ - currentpc(ci); - L->hookinit = 1; -} - - -/* -** this function can be called asynchronous (e.g. during a signal) -*/ -LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count) { - if (func == NULL || mask == 0) { /* turn off hooks? */ - mask = 0; - func = NULL; - } - L->hook = func; - L->basehookcount = count; - resethookcount(L); - L->hookmask = cast(lu_byte, mask); - L->hookinit = 0; - return 1; -} - - -LUA_API lua_Hook lua_gethook (lua_State *L) { - return L->hook; -} - - -LUA_API int lua_gethookmask (lua_State *L) { - return L->hookmask; -} - - -LUA_API int lua_gethookcount (lua_State *L) { - return L->basehookcount; -} - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar) { - int status; - CallInfo *ci; - lua_lock(L); - for (ci = L->ci; level > 0 && ci > L->base_ci; ci--) { - level--; - if (!(ci->state & CI_C)) /* Lua function? */ - level -= ci->u.l.tailcalls; /* skip lost tail calls */ - } - if (level > 0 || ci == L->base_ci) status = 0; /* there is no such level */ - else if (level < 0) { /* level is of a lost tail call */ - status = 1; - ar->i_ci = 0; - } - else { - status = 1; - ar->i_ci = ci - L->base_ci; - } - lua_unlock(L); - return status; -} - - -static Proto *getluaproto (CallInfo *ci) { - return (isLua(ci) ? ci_func(ci)->l.p : NULL); -} - - -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n) { - const char *name; - CallInfo *ci; - Proto *fp; - lua_lock(L); - name = NULL; - ci = L->base_ci + ar->i_ci; - fp = getluaproto(ci); - if (fp) { /* is a Lua function? */ - name = luaF_getlocalname(fp, n, currentpc(ci)); - if (name) - luaA_pushobject(L, ci->base+(n-1)); /* push value */ - } - lua_unlock(L); - return name; -} - - -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n) { - const char *name; - CallInfo *ci; - Proto *fp; - lua_lock(L); - name = NULL; - ci = L->base_ci + ar->i_ci; - fp = getluaproto(ci); - L->top--; /* pop new value */ - if (fp) { /* is a Lua function? */ - name = luaF_getlocalname(fp, n, currentpc(ci)); - if (!name || name[0] == '(') /* `(' starts private locals */ - name = NULL; - else - setobjs2s(ci->base+(n-1), L->top); - } - lua_unlock(L); - return name; -} - - -static void funcinfo (lua_Debug *ar, StkId func) { - Closure *cl = clvalue(func); - if (cl->c.isC) { - ar->source = "=[C]"; - ar->linedefined = -1; - ar->what = "C"; - } - else { - ar->source = getstr(cl->l.p->source); - ar->linedefined = cl->l.p->lineDefined; - ar->what = (ar->linedefined == 0) ? "main" : "Lua"; - } - luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); -} - - -static const char *travglobals (lua_State *L, const TObject *o) { - Table *g = hvalue(gt(L)); - int i = sizenode(g); - while (i--) { - Node *n = gnode(g, i); - if (luaO_rawequalObj(o, gval(n)) && ttisstring(gkey(n))) - return getstr(tsvalue(gkey(n))); - } - return NULL; -} - - -static void info_tailcall (lua_State *L, lua_Debug *ar) { - ar->name = ar->namewhat = ""; - ar->what = "tail"; - ar->linedefined = ar->currentline = -1; - ar->source = "=(tail call)"; - luaO_chunkid(ar->short_src, ar->source, LUA_IDSIZE); - ar->nups = 0; - setnilvalue(L->top); -} - - -static int auxgetinfo (lua_State *L, const char *what, lua_Debug *ar, - StkId f, CallInfo *ci) { - int status = 1; - for (; *what; what++) { - switch (*what) { - case 'S': { - funcinfo(ar, f); - break; - } - case 'l': { - ar->currentline = (ci) ? currentline(ci) : -1; - break; - } - case 'u': { - ar->nups = clvalue(f)->c.nupvalues; - break; - } - case 'n': { - ar->namewhat = (ci) ? getfuncname(ci, &ar->name) : NULL; - if (ar->namewhat == NULL) { - /* try to find a global name */ - if ((ar->name = travglobals(L, f)) != NULL) - ar->namewhat = "global"; - else ar->namewhat = ""; /* not found */ - } - break; - } - case 'f': { - setobj2s(L->top, f); - break; - } - default: status = 0; /* invalid option */ - } - } - return status; -} - - -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar) { - int status = 1; - lua_lock(L); - if (*what == '>') { - StkId f = L->top - 1; - if (!ttisfunction(f)) - luaG_runerror(L, "value for `lua_getinfo' is not a function"); - status = auxgetinfo(L, what + 1, ar, f, NULL); - L->top--; /* pop function */ - } - else if (ar->i_ci != 0) { /* no tail call? */ - CallInfo *ci = L->base_ci + ar->i_ci; - lua_assert(ttisfunction(ci->base - 1)); - status = auxgetinfo(L, what, ar, ci->base - 1, ci); - } - else - info_tailcall(L, ar); - if (strchr(what, 'f')) incr_top(L); - lua_unlock(L); - return status; -} - - -/* -** {====================================================== -** Symbolic Execution and code checker -** ======================================================= -*/ - -#define check(x) if (!(x)) return 0; - -#define checkjump(pt,pc) check(0 <= pc && pc < pt->sizecode) - -#define checkreg(pt,reg) check((reg) < (pt)->maxstacksize) - - - -static int precheck (const Proto *pt) { - check(pt->maxstacksize <= MAXSTACK); - check(pt->sizelineinfo == pt->sizecode || pt->sizelineinfo == 0); - lua_assert(pt->numparams+pt->is_vararg <= pt->maxstacksize); - check(GET_OPCODE(pt->code[pt->sizecode-1]) == OP_RETURN); - return 1; -} - - -static int checkopenop (const Proto *pt, int pc) { - Instruction i = pt->code[pc+1]; - switch (GET_OPCODE(i)) { - case OP_CALL: - case OP_TAILCALL: - case OP_RETURN: { - check(GETARG_B(i) == 0); - return 1; - } - case OP_SETLISTO: return 1; - default: return 0; /* invalid instruction after an open call */ - } -} - - -static int checkRK (const Proto *pt, int r) { - return (r < pt->maxstacksize || (r >= MAXSTACK && r-MAXSTACK < pt->sizek)); -} - - -static Instruction luaG_symbexec (const Proto *pt, int lastpc, int reg) { - int pc; - int last; /* stores position of last instruction that changed `reg' */ - last = pt->sizecode-1; /* points to final return (a `neutral' instruction) */ - check(precheck(pt)); - for (pc = 0; pc < lastpc; pc++) { - const Instruction i = pt->code[pc]; - OpCode op = GET_OPCODE(i); - int a = GETARG_A(i); - int b = 0; - int c = 0; - checkreg(pt, a); - switch (getOpMode(op)) { - case iABC: { - b = GETARG_B(i); - c = GETARG_C(i); - if (testOpMode(op, OpModeBreg)) { - checkreg(pt, b); - } - else if (testOpMode(op, OpModeBrk)) - check(checkRK(pt, b)); - if (testOpMode(op, OpModeCrk)) - check(checkRK(pt, c)); - break; - } - case iABx: { - b = GETARG_Bx(i); - if (testOpMode(op, OpModeK)) check(b < pt->sizek); - break; - } - case iAsBx: { - b = GETARG_sBx(i); - break; - } - } - if (testOpMode(op, OpModesetA)) { - if (a == reg) last = pc; /* change register `a' */ - } - if (testOpMode(op, OpModeT)) { - check(pc+2 < pt->sizecode); /* check skip */ - check(GET_OPCODE(pt->code[pc+1]) == OP_JMP); - } - switch (op) { - case OP_LOADBOOL: { - check(c == 0 || pc+2 < pt->sizecode); /* check its jump */ - break; - } - case OP_LOADNIL: { - if (a <= reg && reg <= b) - last = pc; /* set registers from `a' to `b' */ - break; - } - case OP_GETUPVAL: - case OP_SETUPVAL: { - check(b < pt->nups); - break; - } - case OP_GETGLOBAL: - case OP_SETGLOBAL: { - check(ttisstring(&pt->k[b])); - break; - } - case OP_SELF: { - checkreg(pt, a+1); - if (reg == a+1) last = pc; - break; - } - case OP_CONCAT: { - /* `c' is a register, and at least two operands */ - check(c < MAXSTACK && b < c); - break; - } - case OP_TFORLOOP: - checkreg(pt, a+c+5); - if (reg >= a) last = pc; /* affect all registers above base */ - /* go through */ - case OP_FORLOOP: - checkreg(pt, a+2); - /* go through */ - case OP_JMP: { - int dest = pc+1+b; - check(0 <= dest && dest < pt->sizecode); - /* not full check and jump is forward and do not skip `lastpc'? */ - if (reg != NO_REG && pc < dest && dest <= lastpc) - pc += b; /* do the jump */ - break; - } - case OP_CALL: - case OP_TAILCALL: { - if (b != 0) { - checkreg(pt, a+b-1); - } - c--; /* c = num. returns */ - if (c == LUA_MULTRET) { - check(checkopenop(pt, pc)); - } - else if (c != 0) - checkreg(pt, a+c-1); - if (reg >= a) last = pc; /* affect all registers above base */ - break; - } - case OP_RETURN: { - b--; /* b = num. returns */ - if (b > 0) checkreg(pt, a+b-1); - break; - } - case OP_SETLIST: { - checkreg(pt, a + (b&(LFIELDS_PER_FLUSH-1)) + 1); - break; - } - case OP_CLOSURE: { - int nup; - check(b < pt->sizep); - nup = pt->p[b]->nups; - check(pc + nup < pt->sizecode); - for (; nup>0; nup--) { - OpCode op1 = GET_OPCODE(pt->code[pc+nup]); - check(op1 == OP_GETUPVAL || op1 == OP_MOVE); - } - break; - } - default: break; - } - } - return pt->code[last]; -} - -#undef check -#undef checkjump -#undef checkreg - -/* }====================================================== */ - - -int luaG_checkcode (const Proto *pt) { - return luaG_symbexec(pt, pt->sizecode, NO_REG); -} - - -static const char *kname (Proto *p, int c) { - c = c - MAXSTACK; - if (c >= 0 && ttisstring(&p->k[c])) - return svalue(&p->k[c]); - else - return "?"; -} - - -static const char *getobjname (CallInfo *ci, int stackpos, const char **name) { - if (isLua(ci)) { /* a Lua function? */ - Proto *p = ci_func(ci)->l.p; - int pc = currentpc(ci); - Instruction i; - *name = luaF_getlocalname(p, stackpos+1, pc); - if (*name) /* is a local? */ - return "local"; - i = luaG_symbexec(p, pc, stackpos); /* try symbolic execution */ - lua_assert(pc != -1); - switch (GET_OPCODE(i)) { - case OP_GETGLOBAL: { - int g = GETARG_Bx(i); /* global index */ - lua_assert(ttisstring(&p->k[g])); - *name = svalue(&p->k[g]); - return "global"; - } - case OP_MOVE: { - int a = GETARG_A(i); - int b = GETARG_B(i); /* move from `b' to `a' */ - if (b < a) - return getobjname(ci, b, name); /* get name for `b' */ - break; - } - case OP_GETTABLE: { - int k = GETARG_C(i); /* key index */ - *name = kname(p, k); - return "field"; - } - case OP_SELF: { - int k = GETARG_C(i); /* key index */ - *name = kname(p, k); - return "method"; - } - default: break; - } - } - return NULL; /* no useful name found */ -} - - -static const char *getfuncname (CallInfo *ci, const char **name) { - Instruction i; - if ((isLua(ci) && ci->u.l.tailcalls > 0) || !isLua(ci - 1)) - return NULL; /* calling function is not Lua (or is unknown) */ - ci--; /* calling function */ - i = ci_func(ci)->l.p->code[currentpc(ci)]; - if (GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL) - return getobjname(ci, GETARG_A(i), name); - else - return NULL; /* no useful name can be found */ -} - - -/* only ANSI way to check whether a pointer points to an array */ -static int isinstack (CallInfo *ci, const TObject *o) { - StkId p; - for (p = ci->base; p < ci->top; p++) - if (o == p) return 1; - return 0; -} - - -void luaG_typeerror (lua_State *L, const TObject *o, const char *op) { - const char *name = NULL; - const char *t = luaT_typenames[ttype(o)]; - const char *kind = (isinstack(L->ci, o)) ? - getobjname(L->ci, o - L->base, &name) : NULL; - if (kind) - luaG_runerror(L, "attempt to %s %s `%s' (a %s value)", - op, kind, name, t); - else - luaG_runerror(L, "attempt to %s a %s value", op, t); -} - - -void luaG_concaterror (lua_State *L, StkId p1, StkId p2) { - if (ttisstring(p1)) p1 = p2; - lua_assert(!ttisstring(p1)); - luaG_typeerror(L, p1, "concatenate"); -} - - -void luaG_aritherror (lua_State *L, const TObject *p1, const TObject *p2) { - TObject temp; - if (luaV_tonumber(p1, &temp) == NULL) - p2 = p1; /* first operand is wrong */ - luaG_typeerror(L, p2, "perform arithmetic on"); -} - - -int luaG_ordererror (lua_State *L, const TObject *p1, const TObject *p2) { - const char *t1 = luaT_typenames[ttype(p1)]; - const char *t2 = luaT_typenames[ttype(p2)]; - if (t1[2] == t2[2]) - luaG_runerror(L, "attempt to compare two %s values", t1); - else - luaG_runerror(L, "attempt to compare %s with %s", t1, t2); - return 0; -} - - -static void addinfo (lua_State *L, const char *msg) { - CallInfo *ci = L->ci; - if (isLua(ci)) { /* is Lua code? */ - char buff[LUA_IDSIZE]; /* add file:line information */ - int line = currentline(ci); - luaO_chunkid(buff, getstr(getluaproto(ci)->source), LUA_IDSIZE); - luaO_pushfstring(L, "%s:%d: %s", buff, line, msg); - } -} - - -void luaG_errormsg (lua_State *L) { - if (L->errfunc != 0) { /* is there an error handling function? */ - StkId errfunc = restorestack(L, L->errfunc); - if (!ttisfunction(errfunc)) luaD_throw(L, LUA_ERRERR); - setobjs2s(L->top, L->top - 1); /* move argument */ - setobjs2s(L->top - 1, errfunc); /* push function */ - incr_top(L); - luaD_call(L, L->top - 2, 1); /* call it */ - } - luaD_throw(L, LUA_ERRRUN); -} - - -void luaG_runerror (lua_State *L, const char *fmt, ...) { - va_list argp; - va_start(argp, fmt); - addinfo(L, luaO_pushvfstring(L, fmt, argp)); - va_end(argp); - luaG_errormsg(L); -} - diff --git a/plugins/SmartAutoReplier/lualib/ldebug.h b/plugins/SmartAutoReplier/lualib/ldebug.h deleted file mode 100644 index 7ff395839c..0000000000 --- a/plugins/SmartAutoReplier/lualib/ldebug.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -** $Id: ldebug.h,v 1.32 2002/11/18 11:01:55 roberto Exp $ -** Auxiliary functions from Debug Interface module -** See Copyright Notice in lua.h -*/ - -#ifndef ldebug_h -#define ldebug_h - - -#include "lstate.h" - - -#define pcRel(pc, p) (cast(int, (pc) - (p)->code) - 1) - -#define getline(f,pc) (((f)->lineinfo) ? (f)->lineinfo[pc] : 0) - -#define resethookcount(L) (L->hookcount = L->basehookcount) - - -void luaG_inithooks (lua_State *L); -void luaG_typeerror (lua_State *L, const TObject *o, const char *opname); -void luaG_concaterror (lua_State *L, StkId p1, StkId p2); -void luaG_aritherror (lua_State *L, const TObject *p1, const TObject *p2); -int luaG_ordererror (lua_State *L, const TObject *p1, const TObject *p2); -void luaG_runerror (lua_State *L, const char *fmt, ...); -void luaG_errormsg (lua_State *L); -int luaG_checkcode (const Proto *pt); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/ldo.c b/plugins/SmartAutoReplier/lualib/ldo.c deleted file mode 100644 index ae4f22fd44..0000000000 --- a/plugins/SmartAutoReplier/lualib/ldo.c +++ /dev/null @@ -1,458 +0,0 @@ -/* -** $Id: ldo.c,v 1.217 2003/04/03 13:35:34 roberto Exp $ -** Stack and Call structure of Lua -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include - -#define ldo_c - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lundump.h" -#include "lvm.h" -#include "lzio.h" - - - - -/* -** {====================================================== -** Error-recovery functions (based on long jumps) -** ======================================================= -*/ - - -/* chain list of long jump buffers */ -struct lua_longjmp { - struct lua_longjmp *previous; - jmp_buf b; - volatile int status; /* error code */ -}; - - -static void seterrorobj (lua_State *L, int errcode, StkId oldtop) { - switch (errcode) { - case LUA_ERRMEM: { - setsvalue2s(oldtop, luaS_new(L, MEMERRMSG)); - break; - } - case LUA_ERRERR: { - setsvalue2s(oldtop, luaS_new(L, "error in error handling")); - break; - } - case LUA_ERRSYNTAX: - case LUA_ERRRUN: { - setobjs2s(oldtop, L->top - 1); /* error message on current top */ - break; - } - } - L->top = oldtop + 1; -} - - -void luaD_throw (lua_State *L, int errcode) { - if (L->errorJmp) { - L->errorJmp->status = errcode; - longjmp(L->errorJmp->b, 1); - } - else { - G(L)->panic(L); - exit(EXIT_FAILURE); - } -} - - -int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) { - struct lua_longjmp lj; - lj.status = 0; - lj.previous = L->errorJmp; /* chain new error handler */ - L->errorJmp = &lj; - if (setjmp(lj.b) == 0) - (*f)(L, ud); - L->errorJmp = lj.previous; /* restore old error handler */ - return lj.status; -} - - -static void restore_stack_limit (lua_State *L) { - L->stack_last = L->stack+L->stacksize-1; - if (L->size_ci > LUA_MAXCALLS) { /* there was an overflow? */ - int inuse = (L->ci - L->base_ci); - if (inuse + 1 < LUA_MAXCALLS) /* can `undo' overflow? */ - luaD_reallocCI(L, LUA_MAXCALLS); - } -} - -/* }====================================================== */ - - -static void correctstack (lua_State *L, TObject *oldstack) { - CallInfo *ci; - GCObject *up; - L->top = (L->top - oldstack) + L->stack; - for (up = L->openupval; up != NULL; up = up->gch.next) - gcotouv(up)->v = (gcotouv(up)->v - oldstack) + L->stack; - for (ci = L->base_ci; ci <= L->ci; ci++) { - ci->top = (ci->top - oldstack) + L->stack; - ci->base = (ci->base - oldstack) + L->stack; - } - L->base = L->ci->base; -} - - -void luaD_reallocstack (lua_State *L, int newsize) { - TObject *oldstack = L->stack; - luaM_reallocvector(L, L->stack, L->stacksize, newsize, TObject); - L->stacksize = newsize; - L->stack_last = L->stack+newsize-1-EXTRA_STACK; - correctstack(L, oldstack); -} - - -void luaD_reallocCI (lua_State *L, int newsize) { - CallInfo *oldci = L->base_ci; - luaM_reallocvector(L, L->base_ci, L->size_ci, newsize, CallInfo); - L->size_ci = cast(unsigned short, newsize); - L->ci = (L->ci - oldci) + L->base_ci; - L->end_ci = L->base_ci + L->size_ci; -} - - -void luaD_growstack (lua_State *L, int n) { - if (n <= L->stacksize) /* double size is enough? */ - luaD_reallocstack(L, 2*L->stacksize); - else - luaD_reallocstack(L, L->stacksize + n + EXTRA_STACK); -} - - -static void luaD_growCI (lua_State *L) { - if (L->size_ci > LUA_MAXCALLS) /* overflow while handling overflow? */ - luaD_throw(L, LUA_ERRERR); - else { - luaD_reallocCI(L, 2*L->size_ci); - if (L->size_ci > LUA_MAXCALLS) - luaG_runerror(L, "stack overflow"); - } -} - - -void luaD_callhook (lua_State *L, int event, int line) { - lua_Hook hook = L->hook; - if (hook && L->allowhook) { - ptrdiff_t top = savestack(L, L->top); - ptrdiff_t ci_top = savestack(L, L->ci->top); - lua_Debug ar; - ar.event = event; - ar.currentline = line; - if (event == LUA_HOOKTAILRET) - ar.i_ci = 0; /* tail call; no debug information about it */ - else - ar.i_ci = L->ci - L->base_ci; - luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ - L->ci->top = L->top + LUA_MINSTACK; - L->allowhook = 0; /* cannot call hooks inside a hook */ - lua_unlock(L); - (*hook)(L, &ar); - lua_lock(L); - lua_assert(!L->allowhook); - L->allowhook = 1; - L->ci->top = restorestack(L, ci_top); - L->top = restorestack(L, top); - } -} - - -static void adjust_varargs (lua_State *L, int nfixargs, StkId base) { - int i; - Table *htab; - TObject nname; - int actual = L->top - base; /* actual number of arguments */ - if (actual < nfixargs) { - luaD_checkstack(L, nfixargs - actual); - for (; actual < nfixargs; ++actual) - setnilvalue(L->top++); - } - actual -= nfixargs; /* number of extra arguments */ - htab = luaH_new(L, actual, 1); /* create `arg' table */ - for (i=0; itop - actual + i); - /* store counter in field `n' */ - setsvalue(&nname, luaS_newliteral(L, "n")); - setnvalue(luaH_set(L, htab, &nname), cast(lua_Number, actual)); - L->top -= actual; /* remove extra elements from the stack */ - sethvalue(L->top, htab); - incr_top(L); -} - - -static StkId tryfuncTM (lua_State *L, StkId func) { - const TObject *tm = luaT_gettmbyobj(L, func, TM_CALL); - StkId p; - ptrdiff_t funcr = savestack(L, func); - if (!ttisfunction(tm)) - luaG_typeerror(L, func, "call"); - /* Open a hole inside the stack at `func' */ - for (p = L->top; p > func; p--) setobjs2s(p, p-1); - incr_top(L); - func = restorestack(L, funcr); /* previous call may change stack */ - setobj2s(func, tm); /* tag method is the new function to be called */ - return func; -} - - -StkId luaD_precall (lua_State *L, StkId func) { - LClosure *cl; - ptrdiff_t funcr = savestack(L, func); - if (!ttisfunction(func)) /* `func' is not a function? */ - func = tryfuncTM(L, func); /* check the `function' tag method */ - if (L->ci + 1 == L->end_ci) luaD_growCI(L); - else condhardstacktests(luaD_reallocCI(L, L->size_ci)); - cl = &clvalue(func)->l; - if (!cl->isC) { /* Lua function? prepare its call */ - CallInfo *ci; - Proto *p = cl->p; - if (p->is_vararg) /* varargs? */ - adjust_varargs(L, p->numparams, func+1); - luaD_checkstack(L, p->maxstacksize); - ci = ++L->ci; /* now `enter' new function */ - L->base = L->ci->base = restorestack(L, funcr) + 1; - ci->top = L->base + p->maxstacksize; - ci->u.l.savedpc = p->code; /* starting point */ - ci->u.l.tailcalls = 0; - ci->state = CI_SAVEDPC; - while (L->top < ci->top) - setnilvalue(L->top++); - L->top = ci->top; - return NULL; - } - else { /* if is a C function, call it */ - CallInfo *ci; - int n; - luaD_checkstack(L, LUA_MINSTACK); /* ensure minimum stack size */ - ci = ++L->ci; /* now `enter' new function */ - L->base = L->ci->base = restorestack(L, funcr) + 1; - ci->top = L->top + LUA_MINSTACK; - ci->state = CI_C; /* a C function */ - if (L->hookmask & LUA_MASKCALL) - luaD_callhook(L, LUA_HOOKCALL, -1); - lua_unlock(L); -#ifdef LUA_COMPATUPVALUES - lua_pushupvalues(L); -#endif - n = (*clvalue(L->base - 1)->c.f)(L); /* do the actual call */ - lua_lock(L); - return L->top - n; - } -} - - -static StkId callrethooks (lua_State *L, StkId firstResult) { - ptrdiff_t fr = savestack(L, firstResult); /* next call may change stack */ - luaD_callhook(L, LUA_HOOKRET, -1); - if (!(L->ci->state & CI_C)) { /* Lua function? */ - while (L->ci->u.l.tailcalls--) /* call hook for eventual tail calls */ - luaD_callhook(L, LUA_HOOKTAILRET, -1); - } - return restorestack(L, fr); -} - - -void luaD_poscall (lua_State *L, int wanted, StkId firstResult) { - StkId res; - if (L->hookmask & LUA_MASKRET) - firstResult = callrethooks(L, firstResult); - res = L->base - 1; /* res == final position of 1st result */ - L->ci--; - L->base = L->ci->base; /* restore base */ - /* move results to correct place */ - while (wanted != 0 && firstResult < L->top) { - setobjs2s(res++, firstResult++); - wanted--; - } - while (wanted-- > 0) - setnilvalue(res++); - L->top = res; -} - - -/* -** Call a function (C or Lua). The function to be called is at *func. -** The arguments are on the stack, right after the function. -** When returns, all the results are on the stack, starting at the original -** function position. -*/ -void luaD_call (lua_State *L, StkId func, int nResults) { - StkId firstResult; - lua_assert(!(L->ci->state & CI_CALLING)); - if (++L->nCcalls >= LUA_MAXCCALLS) { - if (L->nCcalls == LUA_MAXCCALLS) - luaG_runerror(L, "C stack overflow"); - else if (L->nCcalls >= (LUA_MAXCCALLS + (LUA_MAXCCALLS>>3))) - luaD_throw(L, LUA_ERRERR); /* error while handing stack error */ - } - firstResult = luaD_precall(L, func); - if (firstResult == NULL) /* is a Lua function? */ - firstResult = luaV_execute(L); /* call it */ - luaD_poscall(L, nResults, firstResult); - L->nCcalls--; - luaC_checkGC(L); -} - - -static void resume (lua_State *L, void *ud) { - StkId firstResult; - int nargs = *cast(int *, ud); - CallInfo *ci = L->ci; - if (ci == L->base_ci) { /* no activation record? */ - if (nargs >= L->top - L->base) - luaG_runerror(L, "cannot resume dead coroutine"); - luaD_precall(L, L->top - (nargs + 1)); /* start coroutine */ - } - else if (ci->state & CI_YIELD) { /* inside a yield? */ - if (ci->state & CI_C) { /* `common' yield? */ - /* finish interrupted execution of `OP_CALL' */ - int nresults; - lua_assert((ci-1)->state & CI_SAVEDPC); - lua_assert(GET_OPCODE(*((ci-1)->u.l.savedpc - 1)) == OP_CALL || - GET_OPCODE(*((ci-1)->u.l.savedpc - 1)) == OP_TAILCALL); - nresults = GETARG_C(*((ci-1)->u.l.savedpc - 1)) - 1; - luaD_poscall(L, nresults, L->top - nargs); /* complete it */ - if (nresults >= 0) L->top = L->ci->top; - } - else { /* yielded inside a hook: just continue its execution */ - ci->state &= ~CI_YIELD; - } - } - else - luaG_runerror(L, "cannot resume non-suspended coroutine"); - firstResult = luaV_execute(L); - if (firstResult != NULL) /* return? */ - luaD_poscall(L, LUA_MULTRET, firstResult); /* finalize this coroutine */ -} - - -LUA_API int lua_resume (lua_State *L, int nargs) { - int status; - lu_byte old_allowhooks; - lua_lock(L); - old_allowhooks = L->allowhook; - lua_assert(L->errfunc == 0 && L->nCcalls == 0); - status = luaD_rawrunprotected(L, resume, &nargs); - if (status != 0) { /* error? */ - L->ci = L->base_ci; /* go back to initial level */ - L->base = L->ci->base; - L->nCcalls = 0; - luaF_close(L, L->base); /* close eventual pending closures */ - seterrorobj(L, status, L->base); - L->allowhook = old_allowhooks; - restore_stack_limit(L); - } - lua_unlock(L); - return status; -} - - -LUA_API int lua_yield (lua_State *L, int nresults) { - CallInfo *ci; - lua_lock(L); - ci = L->ci; - if (L->nCcalls > 0) - luaG_runerror(L, "attempt to yield across metamethod/C-call boundary"); - if (ci->state & CI_C) { /* usual yield */ - if ((ci-1)->state & CI_C) - luaG_runerror(L, "cannot yield a C function"); - if (L->top - nresults > L->base) { /* is there garbage in the stack? */ - int i; - for (i=0; ibase + i, L->top - nresults + i); - L->top = L->base + nresults; - } - } /* else it's an yield inside a hook: nothing to do */ - ci->state |= CI_YIELD; - lua_unlock(L); - return -1; -} - - -int luaD_pcall (lua_State *L, Pfunc func, void *u, - ptrdiff_t old_top, ptrdiff_t ef) { - int status; - unsigned short oldnCcalls = L->nCcalls; - ptrdiff_t old_ci = saveci(L, L->ci); - lu_byte old_allowhooks = L->allowhook; - ptrdiff_t old_errfunc = L->errfunc; - L->errfunc = ef; - status = luaD_rawrunprotected(L, func, u); - if (status != 0) { /* an error occurred? */ - StkId oldtop = restorestack(L, old_top); - luaF_close(L, oldtop); /* close eventual pending closures */ - seterrorobj(L, status, oldtop); - L->nCcalls = oldnCcalls; - L->ci = restoreci(L, old_ci); - L->base = L->ci->base; - L->allowhook = old_allowhooks; - restore_stack_limit(L); - } - L->errfunc = old_errfunc; - return status; -} - - - -/* -** Execute a protected parser. -*/ -struct SParser { /* data to `f_parser' */ - ZIO *z; - Mbuffer buff; /* buffer to be used by the scanner */ - int bin; -}; - -static void f_parser (lua_State *L, void *ud) { - struct SParser *p; - Proto *tf; - Closure *cl; - luaC_checkGC(L); - p = cast(struct SParser *, ud); - tf = p->bin ? luaU_undump(L, p->z, &p->buff) : luaY_parser(L, p->z, &p->buff); - cl = luaF_newLclosure(L, 0, gt(L)); - cl->l.p = tf; - setclvalue(L->top, cl); - incr_top(L); -} - - -int luaD_protectedparser (lua_State *L, ZIO *z, int bin) { - struct SParser p; - int status; - ptrdiff_t oldtopr = savestack(L, L->top); /* save current top */ - p.z = z; p.bin = bin; - luaZ_initbuffer(L, &p.buff); - status = luaD_rawrunprotected(L, f_parser, &p); - luaZ_freebuffer(L, &p.buff); - if (status != 0) { /* error? */ - StkId oldtop = restorestack(L, oldtopr); - seterrorobj(L, status, oldtop); - } - return status; -} - - diff --git a/plugins/SmartAutoReplier/lualib/ldo.h b/plugins/SmartAutoReplier/lualib/ldo.h deleted file mode 100644 index 2a61bf5bb2..0000000000 --- a/plugins/SmartAutoReplier/lualib/ldo.h +++ /dev/null @@ -1,60 +0,0 @@ -/* -** $Id: ldo.h,v 1.56 2002/12/04 17:29:32 roberto Exp $ -** Stack and Call structure of Lua -** See Copyright Notice in lua.h -*/ - -#ifndef ldo_h -#define ldo_h - - -#include "lobject.h" -#include "lstate.h" -#include "lzio.h" - - -/* -** macro to control inclusion of some hard tests on stack reallocation -*/ -#ifndef HARDSTACKTESTS -#define condhardstacktests(x) { /* empty */ } -#else -#define condhardstacktests(x) x -#endif - - -#define luaD_checkstack(L,n) \ - if ((char *)L->stack_last - (char *)L->top <= (n)*(int)sizeof(TObject)) \ - luaD_growstack(L, n); \ - else condhardstacktests(luaD_reallocstack(L, L->stacksize)); - - -#define incr_top(L) {luaD_checkstack(L,1); L->top++;} - -#define savestack(L,p) ((char *)(p) - (char *)L->stack) -#define restorestack(L,n) ((TObject *)((char *)L->stack + (n))) - -#define saveci(L,p) ((char *)(p) - (char *)L->base_ci) -#define restoreci(L,n) ((CallInfo *)((char *)L->base_ci + (n))) - - -/* type of protected functions, to be ran by `runprotected' */ -typedef void (*Pfunc) (lua_State *L, void *ud); - -void luaD_resetprotection (lua_State *L); -int luaD_protectedparser (lua_State *L, ZIO *z, int bin); -void luaD_callhook (lua_State *L, int event, int line); -StkId luaD_precall (lua_State *L, StkId func); -void luaD_call (lua_State *L, StkId func, int nResults); -int luaD_pcall (lua_State *L, Pfunc func, void *u, - ptrdiff_t oldtop, ptrdiff_t ef); -void luaD_poscall (lua_State *L, int wanted, StkId firstResult); -void luaD_reallocCI (lua_State *L, int newsize); -void luaD_reallocstack (lua_State *L, int newsize); -void luaD_growstack (lua_State *L, int n); - -void luaD_throw (lua_State *L, int errcode); -int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/ldump.c b/plugins/SmartAutoReplier/lualib/ldump.c deleted file mode 100644 index 234b011f5f..0000000000 --- a/plugins/SmartAutoReplier/lualib/ldump.c +++ /dev/null @@ -1,170 +0,0 @@ -/* -** $Id: ldump.c,v 1.4 2003/02/11 23:52:12 lhf Exp $ -** save bytecodes -** See Copyright Notice in lua.h -*/ - -#include - -#define ldump_c - -#include "lua.h" - -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lundump.h" - -#define DumpVector(b,n,size,D) DumpBlock(b,(n)*(size),D) -#define DumpLiteral(s,D) DumpBlock("" s,(sizeof(s))-1,D) - -typedef struct { - lua_State* L; - lua_Chunkwriter write; - void* data; -} DumpState; - -static void DumpBlock(const void* b, size_t size, DumpState* D) -{ - lua_unlock(D->L); - (*D->write)(D->L,b,size,D->data); - lua_lock(D->L); -} - -static void DumpByte(int y, DumpState* D) -{ - char x=(char)y; - DumpBlock(&x,sizeof(x),D); -} - -static void DumpInt(int x, DumpState* D) -{ - DumpBlock(&x,sizeof(x),D); -} - -static void DumpSize(size_t x, DumpState* D) -{ - DumpBlock(&x,sizeof(x),D); -} - -static void DumpNumber(lua_Number x, DumpState* D) -{ - DumpBlock(&x,sizeof(x),D); -} - -static void DumpString(TString* s, DumpState* D) -{ - if (s==NULL || getstr(s)==NULL) - DumpSize(0,D); - else - { - size_t size=s->tsv.len+1; /* include trailing '\0' */ - DumpSize(size,D); - DumpBlock(getstr(s),size,D); - } -} - -static void DumpCode(const Proto* f, DumpState* D) -{ - DumpInt(f->sizecode,D); - DumpVector(f->code,f->sizecode,sizeof(*f->code),D); -} - -static void DumpLocals(const Proto* f, DumpState* D) -{ - int i,n=f->sizelocvars; - DumpInt(n,D); - for (i=0; ilocvars[i].varname,D); - DumpInt(f->locvars[i].startpc,D); - DumpInt(f->locvars[i].endpc,D); - } -} - -static void DumpLines(const Proto* f, DumpState* D) -{ - DumpInt(f->sizelineinfo,D); - DumpVector(f->lineinfo,f->sizelineinfo,sizeof(*f->lineinfo),D); -} - -static void DumpUpvalues(const Proto* f, DumpState* D) -{ - int i,n=f->sizeupvalues; - DumpInt(n,D); - for (i=0; iupvalues[i],D); -} - -static void DumpFunction(const Proto* f, const TString* p, DumpState* D); - -static void DumpConstants(const Proto* f, DumpState* D) -{ - int i,n; - DumpInt(n=f->sizek,D); - for (i=0; ik[i]; - DumpByte(ttype(o),D); - switch (ttype(o)) - { - case LUA_TNUMBER: - DumpNumber(nvalue(o),D); - break; - case LUA_TSTRING: - DumpString(tsvalue(o),D); - break; - case LUA_TNIL: - break; - default: - lua_assert(0); /* cannot happen */ - break; - } - } - DumpInt(n=f->sizep,D); - for (i=0; ip[i],f->source,D); -} - -static void DumpFunction(const Proto* f, const TString* p, DumpState* D) -{ - DumpString((f->source==p) ? NULL : f->source,D); - DumpInt(f->lineDefined,D); - DumpByte(f->nups,D); - DumpByte(f->numparams,D); - DumpByte(f->is_vararg,D); - DumpByte(f->maxstacksize,D); - DumpLines(f,D); - DumpLocals(f,D); - DumpUpvalues(f,D); - DumpConstants(f,D); - DumpCode(f,D); -} - -static void DumpHeader(DumpState* D) -{ - DumpLiteral(LUA_SIGNATURE,D); - DumpByte(VERSION,D); - DumpByte(luaU_endianness(),D); - DumpByte(sizeof(int),D); - DumpByte(sizeof(size_t),D); - DumpByte(sizeof(Instruction),D); - DumpByte(SIZE_OP,D); - DumpByte(SIZE_A,D); - DumpByte(SIZE_B,D); - DumpByte(SIZE_C,D); - DumpByte(sizeof(lua_Number),D); - DumpNumber(TEST_NUMBER,D); -} - -/* -** dump function as precompiled chunk -*/ -void luaU_dump (lua_State* L, const Proto* Main, lua_Chunkwriter w, void* data) -{ - DumpState D; - D.L=L; - D.write=w; - D.data=data; - DumpHeader(&D); - DumpFunction(Main,NULL,&D); -} - diff --git a/plugins/SmartAutoReplier/lualib/lfunc.c b/plugins/SmartAutoReplier/lualib/lfunc.c deleted file mode 100644 index 31044fa56b..0000000000 --- a/plugins/SmartAutoReplier/lualib/lfunc.c +++ /dev/null @@ -1,135 +0,0 @@ -/* -** $Id: lfunc.c,v 1.67 2003/03/18 12:50:04 roberto Exp $ -** Auxiliary functions to manipulate prototypes and closures -** See Copyright Notice in lua.h -*/ - - -#include - -#define lfunc_c - -#include "lua.h" - -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" - - -#define sizeCclosure(n) (cast(int, sizeof(CClosure)) + \ - cast(int, sizeof(TObject)*((n)-1))) - -#define sizeLclosure(n) (cast(int, sizeof(LClosure)) + \ - cast(int, sizeof(TObject *)*((n)-1))) - - - -Closure *luaF_newCclosure (lua_State *L, int nelems) { - Closure *c = cast(Closure *, luaM_malloc(L, sizeCclosure(nelems))); - luaC_link(L, valtogco(c), LUA_TFUNCTION); - c->c.isC = 1; - c->c.nupvalues = cast(lu_byte, nelems); - return c; -} - - -Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *e) { - Closure *c = cast(Closure *, luaM_malloc(L, sizeLclosure(nelems))); - luaC_link(L, valtogco(c), LUA_TFUNCTION); - c->l.isC = 0; - c->l.g = *e; - c->l.nupvalues = cast(lu_byte, nelems); - return c; -} - - -UpVal *luaF_findupval (lua_State *L, StkId level) { - GCObject **pp = &L->openupval; - UpVal *p; - UpVal *v; - while ((p = ngcotouv(*pp)) != NULL && p->v >= level) { - if (p->v == level) return p; - pp = &p->next; - } - v = luaM_new(L, UpVal); /* not found: create a new one */ - v->tt = LUA_TUPVAL; - v->marked = 1; /* open upvalues should not be collected */ - v->v = level; /* current value lives in the stack */ - v->next = *pp; /* chain it in the proper position */ - *pp = valtogco(v); - return v; -} - - -void luaF_close (lua_State *L, StkId level) { - UpVal *p; - while ((p = ngcotouv(L->openupval)) != NULL && p->v >= level) { - setobj(&p->value, p->v); /* save current value (write barrier) */ - p->v = &p->value; /* now current value lives here */ - L->openupval = p->next; /* remove from `open' list */ - luaC_link(L, valtogco(p), LUA_TUPVAL); - } -} - - -Proto *luaF_newproto (lua_State *L) { - Proto *f = luaM_new(L, Proto); - luaC_link(L, valtogco(f), LUA_TPROTO); - f->k = NULL; - f->sizek = 0; - f->p = NULL; - f->sizep = 0; - f->code = NULL; - f->sizecode = 0; - f->sizelineinfo = 0; - f->sizeupvalues = 0; - f->nups = 0; - f->upvalues = NULL; - f->numparams = 0; - f->is_vararg = 0; - f->maxstacksize = 0; - f->lineinfo = NULL; - f->sizelocvars = 0; - f->locvars = NULL; - f->lineDefined = 0; - f->source = NULL; - return f; -} - - -void luaF_freeproto (lua_State *L, Proto *f) { - luaM_freearray(L, f->code, f->sizecode, Instruction); - luaM_freearray(L, f->p, f->sizep, Proto *); - luaM_freearray(L, f->k, f->sizek, TObject); - luaM_freearray(L, f->lineinfo, f->sizelineinfo, int); - luaM_freearray(L, f->locvars, f->sizelocvars, struct LocVar); - luaM_freearray(L, f->upvalues, f->sizeupvalues, TString *); - luaM_freelem(L, f); -} - - -void luaF_freeclosure (lua_State *L, Closure *c) { - int size = (c->c.isC) ? sizeCclosure(c->c.nupvalues) : - sizeLclosure(c->l.nupvalues); - luaM_free(L, c, size); -} - - -/* -** Look for n-th local variable at line `line' in function `func'. -** Returns NULL if not found. -*/ -const char *luaF_getlocalname (const Proto *f, int local_number, int pc) { - int i; - for (i = 0; isizelocvars && f->locvars[i].startpc <= pc; i++) { - if (pc < f->locvars[i].endpc) { /* is variable active? */ - local_number--; - if (local_number == 0) - return getstr(f->locvars[i].varname); - } - } - return NULL; /* not found */ -} - diff --git a/plugins/SmartAutoReplier/lualib/lfunc.h b/plugins/SmartAutoReplier/lualib/lfunc.h deleted file mode 100644 index 5d5325076b..0000000000 --- a/plugins/SmartAutoReplier/lualib/lfunc.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -** $Id: lfunc.h,v 1.21 2003/03/18 12:50:04 roberto Exp $ -** Auxiliary functions to manipulate prototypes and closures -** See Copyright Notice in lua.h -*/ - -#ifndef lfunc_h -#define lfunc_h - - -#include "lobject.h" - - -Proto *luaF_newproto (lua_State *L); -Closure *luaF_newCclosure (lua_State *L, int nelems); -Closure *luaF_newLclosure (lua_State *L, int nelems, TObject *e); -UpVal *luaF_findupval (lua_State *L, StkId level); -void luaF_close (lua_State *L, StkId level); -void luaF_freeproto (lua_State *L, Proto *f); -void luaF_freeclosure (lua_State *L, Closure *c); - -const char *luaF_getlocalname (const Proto *func, int local_number, int pc); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lgc.c b/plugins/SmartAutoReplier/lualib/lgc.c deleted file mode 100644 index 4cc45e39d0..0000000000 --- a/plugins/SmartAutoReplier/lualib/lgc.c +++ /dev/null @@ -1,493 +0,0 @@ -/* -** $Id: lgc.c,v 1.171 2003/04/03 13:35:34 roberto Exp $ -** Garbage Collector -** See Copyright Notice in lua.h -*/ - -#include - -#define lgc_c - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - -typedef struct GCState { - GCObject *tmark; /* list of marked objects to be traversed */ - GCObject *wk; /* list of traversed key-weak tables (to be cleared) */ - GCObject *wv; /* list of traversed value-weak tables */ - GCObject *wkv; /* list of traversed key-value weak tables */ - global_State *g; -} GCState; - - -/* -** some userful bit tricks -*/ -#define setbit(x,b) ((x) |= (1<<(b))) -#define resetbit(x,b) ((x) &= cast(lu_byte, ~(1<<(b)))) -#define testbit(x,b) ((x) & (1<<(b))) - -#define unmark(x) resetbit((x)->gch.marked, 0) -#define ismarked(x) ((x)->gch.marked & ((1<<4)|1)) - -#define stringmark(s) setbit((s)->tsv.marked, 0) - - -#define isfinalized(u) (!testbit((u)->uv.marked, 1)) -#define markfinalized(u) resetbit((u)->uv.marked, 1) - - -#define KEYWEAKBIT 1 -#define VALUEWEAKBIT 2 -#define KEYWEAK (1<gch.marked, 0); /* mark object */ - switch (o->gch.tt) { - case LUA_TUSERDATA: { - markvalue(st, gcotou(o)->uv.metatable); - break; - } - case LUA_TFUNCTION: { - gcotocl(o)->c.gclist = st->tmark; - st->tmark = o; - break; - } - case LUA_TTABLE: { - gcotoh(o)->gclist = st->tmark; - st->tmark = o; - break; - } - case LUA_TTHREAD: { - gcototh(o)->gclist = st->tmark; - st->tmark = o; - break; - } - case LUA_TPROTO: { - gcotop(o)->gclist = st->tmark; - st->tmark = o; - break; - } - default: lua_assert(o->gch.tt == LUA_TSTRING); - } -} - - -static void marktmu (GCState *st) { - GCObject *u; - for (u = st->g->tmudata; u; u = u->gch.next) { - unmark(u); /* may be marked, if left from previous GC */ - reallymarkobject(st, u); - } -} - - -/* move `dead' udata that need finalization to list `tmudata' */ -void luaC_separateudata (lua_State *L) { - GCObject **p = &G(L)->rootudata; - GCObject *curr; - GCObject *collected = NULL; /* to collect udata with gc event */ - GCObject **lastcollected = &collected; - while ((curr = *p) != NULL) { - lua_assert(curr->gch.tt == LUA_TUSERDATA); - if (ismarked(curr) || isfinalized(gcotou(curr))) - p = &curr->gch.next; /* don't bother with them */ - - else if (fasttm(L, gcotou(curr)->uv.metatable, TM_GC) == NULL) { - markfinalized(gcotou(curr)); /* don't need finalization */ - p = &curr->gch.next; - } - else { /* must call its gc method */ - *p = curr->gch.next; - curr->gch.next = NULL; /* link `curr' at the end of `collected' list */ - *lastcollected = curr; - lastcollected = &curr->gch.next; - } - } - /* insert collected udata with gc event into `tmudata' list */ - *lastcollected = G(L)->tmudata; - G(L)->tmudata = collected; -} - - -static void removekey (Node *n) { - setnilvalue(gval(n)); /* remove corresponding value ... */ - if (iscollectable(gkey(n))) - setttype(gkey(n), LUA_TNONE); /* dead key; remove it */ -} - - -static void traversetable (GCState *st, Table *h) { - int i; - int weakkey = 0; - int weakvalue = 0; - const TObject *mode; - markvalue(st, h->metatable); - lua_assert(h->lsizenode || h->node == st->g->dummynode); - mode = gfasttm(st->g, h->metatable, TM_MODE); - if (mode && ttisstring(mode)) { /* is there a weak mode? */ - weakkey = (strchr(svalue(mode), 'k') != NULL); - weakvalue = (strchr(svalue(mode), 'v') != NULL); - if (weakkey || weakvalue) { /* is really weak? */ - GCObject **weaklist; - h->marked &= ~(KEYWEAK | VALUEWEAK); /* clear bits */ - h->marked |= cast(lu_byte, (weakkey << KEYWEAKBIT) | - (weakvalue << VALUEWEAKBIT)); - weaklist = (weakkey && weakvalue) ? &st->wkv : - (weakkey) ? &st->wk : - &st->wv; - h->gclist = *weaklist; /* must be cleared after GC, ... */ - *weaklist = valtogco(h); /* ... so put in the appropriate list */ - } - } - if (!weakvalue) { - i = h->sizearray; - while (i--) - markobject(st, &h->array[i]); - } - i = sizenode(h); - while (i--) { - Node *n = gnode(h, i); - if (!ttisnil(gval(n))) { - lua_assert(!ttisnil(gkey(n))); - condmarkobject(st, gkey(n), !weakkey); - condmarkobject(st, gval(n), !weakvalue); - } - } -} - - -static void traverseproto (GCState *st, Proto *f) { - int i; - stringmark(f->source); - for (i=0; isizek; i++) { /* mark literal strings */ - if (ttisstring(f->k+i)) - stringmark(tsvalue(f->k+i)); - } - for (i=0; isizeupvalues; i++) /* mark upvalue names */ - stringmark(f->upvalues[i]); - for (i=0; isizep; i++) /* mark nested protos */ - markvalue(st, f->p[i]); - for (i=0; isizelocvars; i++) /* mark local-variable names */ - stringmark(f->locvars[i].varname); - lua_assert(luaG_checkcode(f)); -} - - - -static void traverseclosure (GCState *st, Closure *cl) { - if (cl->c.isC) { - int i; - for (i=0; ic.nupvalues; i++) /* mark its upvalues */ - markobject(st, &cl->c.upvalue[i]); - } - else { - int i; - lua_assert(cl->l.nupvalues == cl->l.p->nups); - markvalue(st, hvalue(&cl->l.g)); - markvalue(st, cl->l.p); - for (i=0; il.nupvalues; i++) { /* mark its upvalues */ - UpVal *u = cl->l.upvals[i]; - if (!u->marked) { - markobject(st, &u->value); - u->marked = 1; - } - } - } -} - - -static void checkstacksizes (lua_State *L, StkId max) { - int used = L->ci - L->base_ci; /* number of `ci' in use */ - if (4*used < L->size_ci && 2*BASIC_CI_SIZE < L->size_ci) - luaD_reallocCI(L, L->size_ci/2); /* still big enough... */ - else condhardstacktests(luaD_reallocCI(L, L->size_ci)); - used = max - L->stack; /* part of stack in use */ - if (4*used < L->stacksize && 2*(BASIC_STACK_SIZE+EXTRA_STACK) < L->stacksize) - luaD_reallocstack(L, L->stacksize/2); /* still big enough... */ - else condhardstacktests(luaD_reallocstack(L, L->stacksize)); -} - - -static void traversestack (GCState *st, lua_State *L1) { - StkId o, lim; - CallInfo *ci; - markobject(st, gt(L1)); - lim = L1->top; - for (ci = L1->base_ci; ci <= L1->ci; ci++) { - lua_assert(ci->top <= L1->stack_last); - lua_assert(ci->state & (CI_C | CI_HASFRAME | CI_SAVEDPC)); - if (!(ci->state & CI_C) && lim < ci->top) - lim = ci->top; - } - for (o = L1->stack; o < L1->top; o++) - markobject(st, o); - for (; o <= lim; o++) - setnilvalue(o); - checkstacksizes(L1, lim); -} - - -static void propagatemarks (GCState *st) { - while (st->tmark) { /* traverse marked objects */ - switch (st->tmark->gch.tt) { - case LUA_TTABLE: { - Table *h = gcotoh(st->tmark); - st->tmark = h->gclist; - traversetable(st, h); - break; - } - case LUA_TFUNCTION: { - Closure *cl = gcotocl(st->tmark); - st->tmark = cl->c.gclist; - traverseclosure(st, cl); - break; - } - case LUA_TTHREAD: { - lua_State *th = gcototh(st->tmark); - st->tmark = th->gclist; - traversestack(st, th); - break; - } - case LUA_TPROTO: { - Proto *p = gcotop(st->tmark); - st->tmark = p->gclist; - traverseproto(st, p); - break; - } - default: lua_assert(0); - } - } -} - - -static int valismarked (const TObject *o) { - if (ttisstring(o)) - stringmark(tsvalue(o)); /* strings are `values', so are never weak */ - return !iscollectable(o) || testbit(o->value.gc->gch.marked, 0); -} - - -/* -** clear collected keys from weaktables -*/ -static void cleartablekeys (GCObject *l) { - while (l) { - Table *h = gcotoh(l); - int i = sizenode(h); - lua_assert(h->marked & KEYWEAK); - while (i--) { - Node *n = gnode(h, i); - if (!valismarked(gkey(n))) /* key was collected? */ - removekey(n); /* remove entry from table */ - } - l = h->gclist; - } -} - - -/* -** clear collected values from weaktables -*/ -static void cleartablevalues (GCObject *l) { - while (l) { - Table *h = gcotoh(l); - int i = h->sizearray; - lua_assert(h->marked & VALUEWEAK); - while (i--) { - TObject *o = &h->array[i]; - if (!valismarked(o)) /* value was collected? */ - setnilvalue(o); /* remove value */ - } - i = sizenode(h); - while (i--) { - Node *n = gnode(h, i); - if (!valismarked(gval(n))) /* value was collected? */ - removekey(n); /* remove entry from table */ - } - l = h->gclist; - } -} - - -static void freeobj (lua_State *L, GCObject *o) { - switch (o->gch.tt) { - case LUA_TPROTO: luaF_freeproto(L, gcotop(o)); break; - case LUA_TFUNCTION: luaF_freeclosure(L, gcotocl(o)); break; - case LUA_TUPVAL: luaM_freelem(L, gcotouv(o)); break; - case LUA_TTABLE: luaH_free(L, gcotoh(o)); break; - case LUA_TTHREAD: { - lua_assert(gcototh(o) != L && gcototh(o) != G(L)->mainthread); - luaE_freethread(L, gcototh(o)); - break; - } - case LUA_TSTRING: { - luaM_free(L, o, sizestring(gcotots(o)->tsv.len)); - break; - } - case LUA_TUSERDATA: { - luaM_free(L, o, sizeudata(gcotou(o)->uv.len)); - break; - } - default: lua_assert(0); - } -} - - -static int sweeplist (lua_State *L, GCObject **p, int limit) { - GCObject *curr; - int count = 0; /* number of collected items */ - while ((curr = *p) != NULL) { - if (curr->gch.marked > limit) { - unmark(curr); - p = &curr->gch.next; - } - else { - count++; - *p = curr->gch.next; - freeobj(L, curr); - } - } - return count; -} - - -static void sweepstrings (lua_State *L, int all) { - int i; - for (i=0; istrt.size; i++) { /* for each list */ - G(L)->strt.nuse -= sweeplist(L, &G(L)->strt.hash[i], all); - } -} - - -static void checkSizes (lua_State *L) { - /* check size of string hash */ - if (G(L)->strt.nuse < cast(ls_nstr, G(L)->strt.size/4) && - G(L)->strt.size > MINSTRTABSIZE*2) - luaS_resize(L, G(L)->strt.size/2); /* table is too big */ - /* check size of buffer */ - if (luaZ_sizebuffer(&G(L)->buff) > LUA_MINBUFFER*2) { /* buffer too big? */ - size_t newsize = luaZ_sizebuffer(&G(L)->buff) / 2; - luaZ_resizebuffer(L, &G(L)->buff, newsize); - } - G(L)->GCthreshold = 2*G(L)->nblocks; /* new threshold */ -} - - -static void do1gcTM (lua_State *L, Udata *udata) { - const TObject *tm = fasttm(L, udata->uv.metatable, TM_GC); - if (tm != NULL) { - setobj2s(L->top, tm); - setuvalue(L->top+1, udata); - L->top += 2; - luaD_call(L, L->top - 2, 0); - } -} - - -void luaC_callGCTM (lua_State *L) { - lu_byte oldah = L->allowhook; - L->allowhook = 0; /* stop debug hooks during GC tag methods */ - L->top++; /* reserve space to keep udata while runs its gc method */ - while (G(L)->tmudata != NULL) { - GCObject *o = G(L)->tmudata; - Udata *udata = gcotou(o); - G(L)->tmudata = udata->uv.next; /* remove udata from `tmudata' */ - udata->uv.next = G(L)->rootudata; /* return it to `root' list */ - G(L)->rootudata = o; - setuvalue(L->top - 1, udata); /* keep a reference to it */ - unmark(o); - markfinalized(udata); - do1gcTM(L, udata); - } - L->top--; - L->allowhook = oldah; /* restore hooks */ -} - - -void luaC_sweep (lua_State *L, int all) { - if (all) all = 256; /* larger than any mark */ - sweeplist(L, &G(L)->rootudata, all); - sweepstrings(L, all); - sweeplist(L, &G(L)->rootgc, all); -} - - -/* mark root set */ -static void markroot (GCState *st, lua_State *L) { - global_State *g = st->g; - markobject(st, defaultmeta(L)); - markobject(st, registry(L)); - traversestack(st, g->mainthread); - if (L != g->mainthread) /* another thread is running? */ - markvalue(st, L); /* cannot collect it */ -} - - -static void mark (lua_State *L) { - GCState st; - GCObject *wkv; - st.g = G(L); - st.tmark = NULL; - st.wkv = st.wk = st.wv = NULL; - markroot(&st, L); - propagatemarks(&st); /* mark all reachable objects */ - cleartablevalues(st.wkv); - cleartablevalues(st.wv); - wkv = st.wkv; /* keys must be cleared after preserving udata */ - st.wkv = NULL; - st.wv = NULL; - luaC_separateudata(L); /* separate userdata to be preserved */ - marktmu(&st); /* mark `preserved' userdata */ - propagatemarks(&st); /* remark, to propagate `preserveness' */ - cleartablekeys(wkv); - /* `propagatemarks' may resuscitate some weak tables; clear them too */ - cleartablekeys(st.wk); - cleartablevalues(st.wv); - cleartablekeys(st.wkv); - cleartablevalues(st.wkv); -} - - -void luaC_collectgarbage (lua_State *L) { - mark(L); - luaC_sweep(L, 0); - checkSizes(L); - luaC_callGCTM(L); -} - - -void luaC_link (lua_State *L, GCObject *o, lu_byte tt) { - o->gch.next = G(L)->rootgc; - G(L)->rootgc = o; - o->gch.marked = 0; - o->gch.tt = tt; -} - diff --git a/plugins/SmartAutoReplier/lualib/lgc.h b/plugins/SmartAutoReplier/lualib/lgc.h deleted file mode 100644 index 6ab6c91749..0000000000 --- a/plugins/SmartAutoReplier/lualib/lgc.h +++ /dev/null @@ -1,25 +0,0 @@ -/* -** $Id: lgc.h,v 1.19 2003/02/28 19:45:15 roberto Exp $ -** Garbage Collector -** See Copyright Notice in lua.h -*/ - -#ifndef lgc_h -#define lgc_h - - -#include "lobject.h" - - -#define luaC_checkGC(L) { lua_assert(!(L->ci->state & CI_CALLING)); \ - if (G(L)->nblocks >= G(L)->GCthreshold) luaC_collectgarbage(L); } - - -void luaC_separateudata (lua_State *L); -void luaC_callGCTM (lua_State *L); -void luaC_sweep (lua_State *L, int all); -void luaC_collectgarbage (lua_State *L); -void luaC_link (lua_State *L, GCObject *o, lu_byte tt); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/liolib.c b/plugins/SmartAutoReplier/lualib/liolib.c deleted file mode 100644 index 14bd7d9909..0000000000 --- a/plugins/SmartAutoReplier/lualib/liolib.c +++ /dev/null @@ -1,750 +0,0 @@ -/* -** $Id: liolib.c,v 2.39 2003/03/19 21:16:12 roberto Exp $ -** Standard I/O (and system) library -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include -#include -#include - -#define liolib_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - - -/* -** by default, gcc does not get `tmpname' -*/ -#ifndef USE_TMPNAME -#ifdef __GNUC__ -#define USE_TMPNAME 0 -#else -#define USE_TMPNAME 1 -#endif -#endif - - -/* -** by default, posix systems get `popen' -*/ -#ifndef USE_POPEN -#ifdef _POSIX_C_SOURCE -#if _POSIX_C_SOURCE >= 2 -#define USE_POPEN 1 -#endif -#endif -#endif - -#ifndef USE_POPEN -#define USE_POPEN 0 -#endif - - - - -/* -** {====================================================== -** FILE Operations -** ======================================================= -*/ - - -#if !USE_POPEN -#define pclose(f) (-1) -#endif - - -#define FILEHANDLE "FILE*" - -#define IO_INPUT "_input" -#define IO_OUTPUT "_output" - - -static int pushresult (lua_State *L, int i, const char *filename) { - if (i) { - lua_pushboolean(L, 1); - return 1; - } - else { - lua_pushnil(L); - if (filename) - lua_pushfstring(L, "%s: %s", filename, strerror(errno)); - else - lua_pushfstring(L, "%s", strerror(errno)); - lua_pushnumber(L, errno); - return 3; - } -} - - -static FILE **topfile (lua_State *L, int findex) { - FILE **f = (FILE **)luaL_checkudata(L, findex, FILEHANDLE); - if (f == NULL) luaL_argerror(L, findex, "bad file"); - return f; -} - - -static int io_type (lua_State *L) { - FILE **f = (FILE **)luaL_checkudata(L, 1, FILEHANDLE); - if (f == NULL) lua_pushnil(L); - else if (*f == NULL) - lua_pushliteral(L, "closed file"); - else - lua_pushliteral(L, "file"); - return 1; -} - - -static FILE *tofile (lua_State *L, int findex) { - FILE **f = topfile(L, findex); - if (*f == NULL) - luaL_error(L, "attempt to use a closed file"); - return *f; -} - - - -/* -** When creating file handles, always creates a `closed' file handle -** before opening the actual file; so, if there is a memory error, the -** file is not left opened. -*/ -static FILE **newfile (lua_State *L) { - FILE **pf = (FILE **)lua_newuserdata(L, sizeof(FILE *)); - *pf = NULL; /* file handle is currently `closed' */ - luaL_getmetatable(L, FILEHANDLE); - lua_setmetatable(L, -2); - return pf; -} - - -/* -** assumes that top of the stack is the `io' library, and next is -** the `io' metatable -*/ -static void registerfile (lua_State *L, FILE *f, const char *name, - const char *impname) { - lua_pushstring(L, name); - *newfile(L) = f; - if (impname) { - lua_pushstring(L, impname); - lua_pushvalue(L, -2); - lua_settable(L, -6); /* metatable[impname] = file */ - } - lua_settable(L, -3); /* io[name] = file */ -} - - -static int aux_close (lua_State *L) { - FILE *f = tofile(L, 1); - if (f == stdin || f == stdout || f == stderr) - return 0; /* file cannot be closed */ - else { - int ok = (pclose(f) != -1) || (fclose(f) == 0); - if (ok) - *(FILE **)lua_touserdata(L, 1) = NULL; /* mark file as closed */ - return ok; - } -} - - -static int io_close (lua_State *L) { - if (lua_isnone(L, 1)) { - lua_pushstring(L, IO_OUTPUT); - lua_rawget(L, lua_upvalueindex(1)); - } - return pushresult(L, aux_close(L), NULL); -} - - -static int io_gc (lua_State *L) { - FILE **f = topfile(L, 1); - if (*f != NULL) /* ignore closed files */ - aux_close(L); - return 0; -} - - -static int io_tostring (lua_State *L) { - char buff[32]; - FILE **f = topfile(L, 1); - if (*f == NULL) - strcpy(buff, "closed"); - else - sprintf(buff, "%p", lua_touserdata(L, 1)); - lua_pushfstring(L, "file (%s)", buff); - return 1; -} - - -static int io_open (lua_State *L) { - const char *filename = luaL_checkstring(L, 1); - const char *mode = luaL_optstring(L, 2, "r"); - FILE **pf = newfile(L); - *pf = fopen(filename, mode); - return (*pf == NULL) ? pushresult(L, 0, filename) : 1; -} - - -static int io_popen (lua_State *L) { -#if !USE_POPEN - luaL_error(L, "`popen' not supported"); - return 0; -#else - const char *filename = luaL_checkstring(L, 1); - const char *mode = luaL_optstring(L, 2, "r"); - FILE **pf = newfile(L); - *pf = popen(filename, mode); - return (*pf == NULL) ? pushresult(L, 0, filename) : 1; -#endif -} - - -static int io_tmpfile (lua_State *L) { - FILE **pf = newfile(L); - *pf = tmpfile(); - return (*pf == NULL) ? pushresult(L, 0, NULL) : 1; -} - - -static FILE *getiofile (lua_State *L, const char *name) { - lua_pushstring(L, name); - lua_rawget(L, lua_upvalueindex(1)); - return tofile(L, -1); -} - - -static int g_iofile (lua_State *L, const char *name, const char *mode) { - if (!lua_isnoneornil(L, 1)) { - const char *filename = lua_tostring(L, 1); - lua_pushstring(L, name); - if (filename) { - FILE **pf = newfile(L); - *pf = fopen(filename, mode); - if (*pf == NULL) { - lua_pushfstring(L, "%s: %s", filename, strerror(errno)); - luaL_argerror(L, 1, lua_tostring(L, -1)); - } - } - else { - tofile(L, 1); /* check that it's a valid file handle */ - lua_pushvalue(L, 1); - } - lua_rawset(L, lua_upvalueindex(1)); - } - /* return current value */ - lua_pushstring(L, name); - lua_rawget(L, lua_upvalueindex(1)); - return 1; -} - - -static int io_input (lua_State *L) { - return g_iofile(L, IO_INPUT, "r"); -} - - -static int io_output (lua_State *L) { - return g_iofile(L, IO_OUTPUT, "w"); -} - - -static int io_readline (lua_State *L); - - -static void aux_lines (lua_State *L, int idx, int close) { - lua_pushliteral(L, FILEHANDLE); - lua_rawget(L, LUA_REGISTRYINDEX); - lua_pushvalue(L, idx); - lua_pushboolean(L, close); /* close/not close file when finished */ - lua_pushcclosure(L, io_readline, 3); -} - - -static int f_lines (lua_State *L) { - tofile(L, 1); /* check that it's a valid file handle */ - aux_lines(L, 1, 0); - return 1; -} - - -static int io_lines (lua_State *L) { - if (lua_isnoneornil(L, 1)) { /* no arguments? */ - lua_pushstring(L, IO_INPUT); - lua_rawget(L, lua_upvalueindex(1)); /* will iterate over default input */ - return f_lines(L); - } - else { - const char *filename = luaL_checkstring(L, 1); - FILE **pf = newfile(L); - *pf = fopen(filename, "r"); - luaL_argcheck(L, *pf, 1, strerror(errno)); - aux_lines(L, lua_gettop(L), 1); - return 1; - } -} - - -/* -** {====================================================== -** READ -** ======================================================= -*/ - - -static int read_number (lua_State *L, FILE *f) { - lua_Number d; - if (fscanf(f, LUA_NUMBER_SCAN, &d) == 1) { - lua_pushnumber(L, d); - return 1; - } - else return 0; /* read fails */ -} - - -static int test_eof (lua_State *L, FILE *f) { - int c = getc(f); - ungetc(c, f); - lua_pushlstring(L, NULL, 0); - return (c != EOF); -} - - -static int read_line (lua_State *L, FILE *f) { - luaL_Buffer b; - luaL_buffinit(L, &b); - for (;;) { - size_t l; - char *p = luaL_prepbuffer(&b); - if (fgets(p, LUAL_BUFFERSIZE, f) == NULL) { /* eof? */ - luaL_pushresult(&b); /* close buffer */ - return (lua_strlen(L, -1) > 0); /* check whether read something */ - } - l = strlen(p); - if (p[l-1] != '\n') - luaL_addsize(&b, l); - else { - luaL_addsize(&b, l - 1); /* do not include `eol' */ - luaL_pushresult(&b); /* close buffer */ - return 1; /* read at least an `eol' */ - } - } -} - - -static int read_chars (lua_State *L, FILE *f, size_t n) { - size_t rlen; /* how much to read */ - size_t nr; /* number of chars actually read */ - luaL_Buffer b; - luaL_buffinit(L, &b); - rlen = LUAL_BUFFERSIZE; /* try to read that much each time */ - do { - char *p = luaL_prepbuffer(&b); - if (rlen > n) rlen = n; /* cannot read more than asked */ - nr = fread(p, sizeof(char), rlen, f); - luaL_addsize(&b, nr); - n -= nr; /* still have to read `n' chars */ - } while (n > 0 && nr == rlen); /* until end of count or eof */ - luaL_pushresult(&b); /* close buffer */ - return (n == 0 || lua_strlen(L, -1) > 0); -} - - -static int g_read (lua_State *L, FILE *f, int first) { - int nargs = lua_gettop(L) - 1; - int success; - int n; - if (nargs == 0) { /* no arguments? */ - success = read_line(L, f); - n = first+1; /* to return 1 result */ - } - else { /* ensure stack space for all results and for auxlib's buffer */ - luaL_checkstack(L, nargs+LUA_MINSTACK, "too many arguments"); - success = 1; - for (n = first; nargs-- && success; n++) { - if (lua_type(L, n) == LUA_TNUMBER) { - size_t l = (size_t)lua_tonumber(L, n); - success = (l == 0) ? test_eof(L, f) : read_chars(L, f, l); - } - else { - const char *p = lua_tostring(L, n); - luaL_argcheck(L, p && p[0] == '*', n, "invalid option"); - switch (p[1]) { - case 'n': /* number */ - success = read_number(L, f); - break; - case 'l': /* line */ - success = read_line(L, f); - break; - case 'a': /* file */ - read_chars(L, f, ~((size_t)0)); /* read MAX_SIZE_T chars */ - success = 1; /* always success */ - break; - case 'w': /* word */ - return luaL_error(L, "obsolete option `*w' to `read'"); - default: - return luaL_argerror(L, n, "invalid format"); - } - } - } - } - if (!success) { - lua_pop(L, 1); /* remove last result */ - lua_pushnil(L); /* push nil instead */ - } - return n - first; -} - - -static int io_read (lua_State *L) { - return g_read(L, getiofile(L, IO_INPUT), 1); -} - - -static int f_read (lua_State *L) { - return g_read(L, tofile(L, 1), 2); -} - - -static int io_readline (lua_State *L) { - FILE *f = *(FILE **)lua_touserdata(L, lua_upvalueindex(2)); - if (f == NULL) /* file is already closed? */ - luaL_error(L, "file is already closed"); - if (read_line(L, f)) return 1; - else { /* EOF */ - if (lua_toboolean(L, lua_upvalueindex(3))) { /* generator created file? */ - lua_settop(L, 0); - lua_pushvalue(L, lua_upvalueindex(2)); - aux_close(L); /* close it */ - } - return 0; - } -} - -/* }====================================================== */ - - -static int g_write (lua_State *L, FILE *f, int arg) { - int nargs = lua_gettop(L) - 1; - int status = 1; - for (; nargs--; arg++) { - if (lua_type(L, arg) == LUA_TNUMBER) { - /* optimization: could be done exactly as for strings */ - status = status && - fprintf(f, LUA_NUMBER_FMT, lua_tonumber(L, arg)) > 0; - } - else { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - status = status && (fwrite(s, sizeof(char), l, f) == l); - } - } - return pushresult(L, status, NULL); -} - - -static int io_write (lua_State *L) { - return g_write(L, getiofile(L, IO_OUTPUT), 1); -} - - -static int f_write (lua_State *L) { - return g_write(L, tofile(L, 1), 2); -} - - -static int f_seek (lua_State *L) { - static const int mode[] = {SEEK_SET, SEEK_CUR, SEEK_END}; - static const char *const modenames[] = {"set", "cur", "end", NULL}; - FILE *f = tofile(L, 1); - int op = luaL_findstring(luaL_optstring(L, 2, "cur"), modenames); - long offset = luaL_optlong(L, 3, 0); - luaL_argcheck(L, op != -1, 2, "invalid mode"); - op = fseek(f, offset, mode[op]); - if (op) - return pushresult(L, 0, NULL); /* error */ - else { - lua_pushnumber(L, ftell(f)); - return 1; - } -} - - -static int io_flush (lua_State *L) { - return pushresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL); -} - - -static int f_flush (lua_State *L) { - return pushresult(L, fflush(tofile(L, 1)) == 0, NULL); -} - - -static const luaL_reg iolib[] = { - {"input", io_input}, - {"output", io_output}, - {"lines", io_lines}, - {"close", io_close}, - {"flush", io_flush}, - {"open", io_open}, - {"popen", io_popen}, - {"read", io_read}, - {"tmpfile", io_tmpfile}, - {"type", io_type}, - {"write", io_write}, - {NULL, NULL} -}; - - -static const luaL_reg flib[] = { - {"flush", f_flush}, - {"read", f_read}, - {"lines", f_lines}, - {"seek", f_seek}, - {"write", f_write}, - {"close", io_close}, - {"__gc", io_gc}, - {"__tostring", io_tostring}, - {NULL, NULL} -}; - - -static void createmeta (lua_State *L) { - luaL_newmetatable(L, FILEHANDLE); /* create new metatable for file handles */ - /* file methods */ - lua_pushliteral(L, "__index"); - lua_pushvalue(L, -2); /* push metatable */ - lua_rawset(L, -3); /* metatable.__index = metatable */ - luaL_openlib(L, NULL, flib, 0); -} - -/* }====================================================== */ - - -/* -** {====================================================== -** Other O.S. Operations -** ======================================================= -*/ - -static int io_execute (lua_State *L) { - lua_pushnumber(L, system(luaL_checkstring(L, 1))); - return 1; -} - - -static int io_remove (lua_State *L) { - const char *filename = luaL_checkstring(L, 1); - return pushresult(L, remove(filename) == 0, filename); -} - - -static int io_rename (lua_State *L) { - const char *fromname = luaL_checkstring(L, 1); - const char *toname = luaL_checkstring(L, 2); - return pushresult(L, rename(fromname, toname) == 0, fromname); -} - - -static int io_tmpname (lua_State *L) { -#if !USE_TMPNAME - luaL_error(L, "`tmpname' not supported"); - return 0; -#else - char buff[L_tmpnam]; - if (tmpnam(buff) != buff) - return luaL_error(L, "unable to generate a unique filename in `tmpname'"); - lua_pushstring(L, buff); - return 1; -#endif -} - - -static int io_getenv (lua_State *L) { - lua_pushstring(L, getenv(luaL_checkstring(L, 1))); /* if NULL push nil */ - return 1; -} - - -static int io_clock (lua_State *L) { - lua_pushnumber(L, ((lua_Number)clock())/(lua_Number)CLOCKS_PER_SEC); - return 1; -} - - -/* -** {====================================================== -** Time/Date operations -** { year=%Y, month=%m, day=%d, hour=%H, min=%M, sec=%S, -** wday=%w+1, yday=%j, isdst=? } -** ======================================================= -*/ - -static void setfield (lua_State *L, const char *key, int value) { - lua_pushstring(L, key); - lua_pushnumber(L, value); - lua_rawset(L, -3); -} - -static void setboolfield (lua_State *L, const char *key, int value) { - lua_pushstring(L, key); - lua_pushboolean(L, value); - lua_rawset(L, -3); -} - -static int getboolfield (lua_State *L, const char *key) { - int res; - lua_pushstring(L, key); - lua_gettable(L, -2); - res = lua_toboolean(L, -1); - lua_pop(L, 1); - return res; -} - - -static int getfield (lua_State *L, const char *key, int d) { - int res; - lua_pushstring(L, key); - lua_gettable(L, -2); - if (lua_isnumber(L, -1)) - res = (int)(lua_tonumber(L, -1)); - else { - if (d == -2) - return luaL_error(L, "field `%s' missing in date table", key); - res = d; - } - lua_pop(L, 1); - return res; -} - - -static int io_date (lua_State *L) { - const char *s = luaL_optstring(L, 1, "%c"); - time_t t = (time_t)(luaL_optnumber(L, 2, -1)); - struct tm *stm; - if (t == (time_t)(-1)) /* no time given? */ - t = time(NULL); /* use current time */ - if (*s == '!') { /* UTC? */ - stm = gmtime(&t); - s++; /* skip `!' */ - } - else - stm = localtime(&t); - if (stm == NULL) /* invalid date? */ - lua_pushnil(L); - else if (strcmp(s, "*t") == 0) { - lua_newtable(L); - setfield(L, "sec", stm->tm_sec); - setfield(L, "min", stm->tm_min); - setfield(L, "hour", stm->tm_hour); - setfield(L, "day", stm->tm_mday); - setfield(L, "month", stm->tm_mon+1); - setfield(L, "year", stm->tm_year+1900); - setfield(L, "wday", stm->tm_wday+1); - setfield(L, "yday", stm->tm_yday+1); - setboolfield(L, "isdst", stm->tm_isdst); - } - else { - char b[256]; - if (strftime(b, sizeof(b), s, stm)) - lua_pushstring(L, b); - else - return luaL_error(L, "`date' format too long"); - } - return 1; -} - - -static int io_time (lua_State *L) { - if (lua_isnoneornil(L, 1)) /* called without args? */ - lua_pushnumber(L, time(NULL)); /* return current time */ - else { - time_t t; - struct tm ts; - luaL_checktype(L, 1, LUA_TTABLE); - lua_settop(L, 1); /* make sure table is at the top */ - ts.tm_sec = getfield(L, "sec", 0); - ts.tm_min = getfield(L, "min", 0); - ts.tm_hour = getfield(L, "hour", 12); - ts.tm_mday = getfield(L, "day", -2); - ts.tm_mon = getfield(L, "month", -2) - 1; - ts.tm_year = getfield(L, "year", -2) - 1900; - ts.tm_isdst = getboolfield(L, "isdst"); - t = mktime(&ts); - if (t == (time_t)(-1)) - lua_pushnil(L); - else - lua_pushnumber(L, t); - } - return 1; -} - - -static int io_difftime (lua_State *L) { - lua_pushnumber(L, difftime((time_t)(luaL_checknumber(L, 1)), - (time_t)(luaL_optnumber(L, 2, 0)))); - return 1; -} - -/* }====================================================== */ - - -static int io_setloc (lua_State *L) { - static const int cat[] = {LC_ALL, LC_COLLATE, LC_CTYPE, LC_MONETARY, - LC_NUMERIC, LC_TIME}; - static const char *const catnames[] = {"all", "collate", "ctype", "monetary", - "numeric", "time", NULL}; - const char *l = lua_tostring(L, 1); - int op = luaL_findstring(luaL_optstring(L, 2, "all"), catnames); - luaL_argcheck(L, l || lua_isnoneornil(L, 1), 1, "string expected"); - luaL_argcheck(L, op != -1, 2, "invalid option"); - lua_pushstring(L, setlocale(cat[op], l)); - return 1; -} - - -static int io_exit (lua_State *L) { - exit(luaL_optint(L, 1, EXIT_SUCCESS)); - return 0; /* to avoid warnings */ -} - -static const luaL_reg syslib[] = { - {"clock", io_clock}, - {"date", io_date}, - {"difftime", io_difftime}, - {"execute", io_execute}, - {"exit", io_exit}, - {"getenv", io_getenv}, - {"remove", io_remove}, - {"rename", io_rename}, - {"setlocale", io_setloc}, - {"time", io_time}, - {"tmpname", io_tmpname}, - {NULL, NULL} -}; - -/* }====================================================== */ - - - -LUALIB_API int luaopen_io (lua_State *L) { - luaL_openlib(L, LUA_OSLIBNAME, syslib, 0); - createmeta(L); - lua_pushvalue(L, -1); - luaL_openlib(L, LUA_IOLIBNAME, iolib, 1); - /* put predefined file handles into `io' table */ - registerfile(L, stdin, "stdin", IO_INPUT); - registerfile(L, stdout, "stdout", IO_OUTPUT); - registerfile(L, stderr, "stderr", NULL); - return 1; -} - diff --git a/plugins/SmartAutoReplier/lualib/llex.c b/plugins/SmartAutoReplier/lualib/llex.c deleted file mode 100644 index 045e999443..0000000000 --- a/plugins/SmartAutoReplier/lualib/llex.c +++ /dev/null @@ -1,417 +0,0 @@ -/* -** $Id: llex.c,v 1.119 2003/03/24 12:39:34 roberto Exp $ -** Lexical Analyzer -** See Copyright Notice in lua.h -*/ - - -#include -#include - -#define llex_c - -#include "lua.h" - -#include "ldo.h" -#include "llex.h" -#include "lobject.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" -#include "lzio.h" - - - -#define next(LS) (LS->current = zgetc(LS->z)) - - - -/* ORDER RESERVED */ -static const char *const token2string [] = { - "and", "break", "do", "else", "elseif", - "end", "false", "for", "function", "if", - "in", "local", "nil", "not", "or", "repeat", - "return", "then", "true", "until", "while", "*name", - "..", "...", "==", ">=", "<=", "~=", - "*number", "*string", "" -}; - - -void luaX_init (lua_State *L) { - int i; - for (i=0; itsv.reserved = cast(lu_byte, i+1); /* reserved word */ - } -} - - -#define MAXSRC 80 - - -void luaX_checklimit (LexState *ls, int val, int limit, const char *msg) { - if (val > limit) { - msg = luaO_pushfstring(ls->L, "too many %s (limit=%d)", msg, limit); - luaX_syntaxerror(ls, msg); - } -} - - -void luaX_errorline (LexState *ls, const char *s, const char *token, int line) { - lua_State *L = ls->L; - char buff[MAXSRC]; - luaO_chunkid(buff, getstr(ls->source), MAXSRC); - luaO_pushfstring(L, "%s:%d: %s near `%s'", buff, line, s, token); - luaD_throw(L, LUA_ERRSYNTAX); -} - - -static void luaX_error (LexState *ls, const char *s, const char *token) { - luaX_errorline(ls, s, token, ls->linenumber); -} - - -void luaX_syntaxerror (LexState *ls, const char *msg) { - const char *lasttoken; - switch (ls->t.token) { - case TK_NAME: - lasttoken = getstr(ls->t.seminfo.ts); - break; - case TK_STRING: - case TK_NUMBER: - lasttoken = luaZ_buffer(ls->buff); - break; - default: - lasttoken = luaX_token2str(ls, ls->t.token); - break; - } - luaX_error(ls, msg, lasttoken); -} - - -const char *luaX_token2str (LexState *ls, int token) { - if (token < FIRST_RESERVED) { - lua_assert(token == (unsigned char)token); - return luaO_pushfstring(ls->L, "%c", token); - } - else - return token2string[token-FIRST_RESERVED]; -} - - -static void luaX_lexerror (LexState *ls, const char *s, int token) { - if (token == TK_EOS) - luaX_error(ls, s, luaX_token2str(ls, token)); - else - luaX_error(ls, s, luaZ_buffer(ls->buff)); -} - - -static void inclinenumber (LexState *LS) { - next(LS); /* skip `\n' */ - ++LS->linenumber; - luaX_checklimit(LS, LS->linenumber, MAX_INT, "lines in a chunk"); -} - - -void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source) { - LS->L = L; - LS->lookahead.token = TK_EOS; /* no look-ahead token */ - LS->z = z; - LS->fs = NULL; - LS->linenumber = 1; - LS->lastline = 1; - LS->source = source; - next(LS); /* read first char */ - if (LS->current == '#') { - do { /* skip first line */ - next(LS); - } while (LS->current != '\n' && LS->current != EOZ); - } -} - - - -/* -** ======================================================= -** LEXICAL ANALYZER -** ======================================================= -*/ - - -/* use buffer to store names, literal strings and numbers */ - -/* extra space to allocate when growing buffer */ -#define EXTRABUFF 32 - -/* maximum number of chars that can be read without checking buffer size */ -#define MAXNOCHECK 5 - -#define checkbuffer(LS, len) \ - if (((len)+MAXNOCHECK)*sizeof(char) > luaZ_sizebuffer((LS)->buff)) \ - luaZ_openspace((LS)->L, (LS)->buff, (len)+EXTRABUFF) - -#define save(LS, c, l) \ - (luaZ_buffer((LS)->buff)[l++] = cast(char, c)) -#define save_and_next(LS, l) (save(LS, LS->current, l), next(LS)) - - -static size_t readname (LexState *LS) { - size_t l = 0; - checkbuffer(LS, l); - do { - checkbuffer(LS, l); - save_and_next(LS, l); - } while (isalnum(LS->current) || LS->current == '_'); - save(LS, '\0', l); - return l-1; -} - - -/* LUA_NUMBER */ -static void read_numeral (LexState *LS, int comma, SemInfo *seminfo) { - size_t l = 0; - checkbuffer(LS, l); - if (comma) save(LS, '.', l); - while (isdigit(LS->current)) { - checkbuffer(LS, l); - save_and_next(LS, l); - } - if (LS->current == '.') { - save_and_next(LS, l); - if (LS->current == '.') { - save_and_next(LS, l); - save(LS, '\0', l); - luaX_lexerror(LS, - "ambiguous syntax (decimal point x string concatenation)", - TK_NUMBER); - } - } - while (isdigit(LS->current)) { - checkbuffer(LS, l); - save_and_next(LS, l); - } - if (LS->current == 'e' || LS->current == 'E') { - save_and_next(LS, l); /* read `E' */ - if (LS->current == '+' || LS->current == '-') - save_and_next(LS, l); /* optional exponent sign */ - while (isdigit(LS->current)) { - checkbuffer(LS, l); - save_and_next(LS, l); - } - } - save(LS, '\0', l); - if (!luaO_str2d(luaZ_buffer(LS->buff), &seminfo->r)) - luaX_lexerror(LS, "malformed number", TK_NUMBER); -} - - -static void read_long_string (LexState *LS, SemInfo *seminfo) { - int cont = 0; - size_t l = 0; - checkbuffer(LS, l); - save(LS, '[', l); /* save first `[' */ - save_and_next(LS, l); /* pass the second `[' */ - if (LS->current == '\n') /* string starts with a newline? */ - inclinenumber(LS); /* skip it */ - for (;;) { - checkbuffer(LS, l); - switch (LS->current) { - case EOZ: - save(LS, '\0', l); - luaX_lexerror(LS, (seminfo) ? "unfinished long string" : - "unfinished long comment", TK_EOS); - break; /* to avoid warnings */ - case '[': - save_and_next(LS, l); - if (LS->current == '[') { - cont++; - save_and_next(LS, l); - } - continue; - case ']': - save_and_next(LS, l); - if (LS->current == ']') { - if (cont == 0) goto endloop; - cont--; - save_and_next(LS, l); - } - continue; - case '\n': - save(LS, '\n', l); - inclinenumber(LS); - if (!seminfo) l = 0; /* reset buffer to avoid wasting space */ - continue; - default: - save_and_next(LS, l); - } - } endloop: - save_and_next(LS, l); /* skip the second `]' */ - save(LS, '\0', l); - if (seminfo) - seminfo->ts = luaS_newlstr(LS->L, luaZ_buffer(LS->buff) + 2, l - 5); -} - - -static void read_string (LexState *LS, int del, SemInfo *seminfo) { - size_t l = 0; - checkbuffer(LS, l); - save_and_next(LS, l); - while (LS->current != del) { - checkbuffer(LS, l); - switch (LS->current) { - case EOZ: - save(LS, '\0', l); - luaX_lexerror(LS, "unfinished string", TK_EOS); - break; /* to avoid warnings */ - case '\n': - save(LS, '\0', l); - luaX_lexerror(LS, "unfinished string", TK_STRING); - break; /* to avoid warnings */ - case '\\': - next(LS); /* do not save the `\' */ - switch (LS->current) { - case 'a': save(LS, '\a', l); next(LS); break; - case 'b': save(LS, '\b', l); next(LS); break; - case 'f': save(LS, '\f', l); next(LS); break; - case 'n': save(LS, '\n', l); next(LS); break; - case 'r': save(LS, '\r', l); next(LS); break; - case 't': save(LS, '\t', l); next(LS); break; - case 'v': save(LS, '\v', l); next(LS); break; - case '\n': save(LS, '\n', l); inclinenumber(LS); break; - case EOZ: break; /* will raise an error next loop */ - default: { - if (!isdigit(LS->current)) - save_and_next(LS, l); /* handles \\, \", \', and \? */ - else { /* \xxx */ - int c = 0; - int i = 0; - do { - c = 10*c + (LS->current-'0'); - next(LS); - } while (++i<3 && isdigit(LS->current)); - if (c > UCHAR_MAX) { - save(LS, '\0', l); - luaX_lexerror(LS, "escape sequence too large", TK_STRING); - } - save(LS, c, l); - } - } - } - break; - default: - save_and_next(LS, l); - } - } - save_and_next(LS, l); /* skip delimiter */ - save(LS, '\0', l); - seminfo->ts = luaS_newlstr(LS->L, luaZ_buffer(LS->buff) + 1, l - 3); -} - - -int luaX_lex (LexState *LS, SemInfo *seminfo) { - for (;;) { - switch (LS->current) { - - case '\n': { - inclinenumber(LS); - continue; - } - case '-': { - next(LS); - if (LS->current != '-') return '-'; - /* else is a comment */ - next(LS); - if (LS->current == '[' && (next(LS), LS->current == '[')) - read_long_string(LS, NULL); /* long comment */ - else /* short comment */ - while (LS->current != '\n' && LS->current != EOZ) - next(LS); - continue; - } - case '[': { - next(LS); - if (LS->current != '[') return '['; - else { - read_long_string(LS, seminfo); - return TK_STRING; - } - } - case '=': { - next(LS); - if (LS->current != '=') return '='; - else { next(LS); return TK_EQ; } - } - case '<': { - next(LS); - if (LS->current != '=') return '<'; - else { next(LS); return TK_LE; } - } - case '>': { - next(LS); - if (LS->current != '=') return '>'; - else { next(LS); return TK_GE; } - } - case '~': { - next(LS); - if (LS->current != '=') return '~'; - else { next(LS); return TK_NE; } - } - case '"': - case '\'': { - read_string(LS, LS->current, seminfo); - return TK_STRING; - } - case '.': { - next(LS); - if (LS->current == '.') { - next(LS); - if (LS->current == '.') { - next(LS); - return TK_DOTS; /* ... */ - } - else return TK_CONCAT; /* .. */ - } - else if (!isdigit(LS->current)) return '.'; - else { - read_numeral(LS, 1, seminfo); - return TK_NUMBER; - } - } - case EOZ: { - return TK_EOS; - } - default: { - if (isspace(LS->current)) { - next(LS); - continue; - } - else if (isdigit(LS->current)) { - read_numeral(LS, 0, seminfo); - return TK_NUMBER; - } - else if (isalpha(LS->current) || LS->current == '_') { - /* identifier or reserved word */ - size_t l = readname(LS); - TString *ts = luaS_newlstr(LS->L, luaZ_buffer(LS->buff), l); - if (ts->tsv.reserved > 0) /* reserved word? */ - return ts->tsv.reserved - 1 + FIRST_RESERVED; - seminfo->ts = ts; - return TK_NAME; - } - else { - int c = LS->current; - if (iscntrl(c)) - luaX_error(LS, "invalid control char", - luaO_pushfstring(LS->L, "char(%d)", c)); - next(LS); - return c; /* single-char tokens (+ - / ...) */ - } - } - } - } -} - -#undef next diff --git a/plugins/SmartAutoReplier/lualib/llex.h b/plugins/SmartAutoReplier/lualib/llex.h deleted file mode 100644 index 740e3f6b31..0000000000 --- a/plugins/SmartAutoReplier/lualib/llex.h +++ /dev/null @@ -1,75 +0,0 @@ -/* -** $Id: llex.h,v 1.47 2003/02/28 17:19:47 roberto Exp $ -** Lexical Analyzer -** See Copyright Notice in lua.h -*/ - -#ifndef llex_h -#define llex_h - -#include "lobject.h" -#include "lzio.h" - - -#define FIRST_RESERVED 257 - -/* maximum length of a reserved word */ -#define TOKEN_LEN (sizeof("function")/sizeof(char)) - - -/* -* WARNING: if you change the order of this enumeration, -* grep "ORDER RESERVED" -*/ -enum RESERVED { - /* terminal symbols denoted by reserved words */ - TK_AND = FIRST_RESERVED, TK_BREAK, - TK_DO, TK_ELSE, TK_ELSEIF, TK_END, TK_FALSE, TK_FOR, TK_FUNCTION, - TK_IF, TK_IN, TK_LOCAL, TK_NIL, TK_NOT, TK_OR, TK_REPEAT, - TK_RETURN, TK_THEN, TK_TRUE, TK_UNTIL, TK_WHILE, - /* other terminal symbols */ - TK_NAME, TK_CONCAT, TK_DOTS, TK_EQ, TK_GE, TK_LE, TK_NE, TK_NUMBER, - TK_STRING, TK_EOS -}; - -/* number of reserved words */ -#define NUM_RESERVED (cast(int, TK_WHILE-FIRST_RESERVED+1)) - - -typedef union { - lua_Number r; - TString *ts; -} SemInfo; /* semantics information */ - - -typedef struct Token { - int token; - SemInfo seminfo; -} Token; - - -typedef struct LexState { - int current; /* current character (charint) */ - int linenumber; /* input line counter */ - int lastline; /* line of last token `consumed' */ - Token t; /* current token */ - Token lookahead; /* look ahead token */ - struct FuncState *fs; /* `FuncState' is private to the parser */ - struct lua_State *L; - ZIO *z; /* input stream */ - Mbuffer *buff; /* buffer for tokens */ - TString *source; /* current source name */ - int nestlevel; /* level of nested non-terminals */ -} LexState; - - -void luaX_init (lua_State *L); -void luaX_setinput (lua_State *L, LexState *LS, ZIO *z, TString *source); -int luaX_lex (LexState *LS, SemInfo *seminfo); -void luaX_checklimit (LexState *ls, int val, int limit, const char *msg); -void luaX_syntaxerror (LexState *ls, const char *s); -void luaX_errorline (LexState *ls, const char *s, const char *token, int line); -const char *luaX_token2str (LexState *ls, int token); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/llimits.h b/plugins/SmartAutoReplier/lualib/llimits.h deleted file mode 100644 index 343c922612..0000000000 --- a/plugins/SmartAutoReplier/lualib/llimits.h +++ /dev/null @@ -1,185 +0,0 @@ -/* -** $Id: llimits.h,v 1.52 2003/02/20 19:33:23 roberto Exp $ -** Limits, basic types, and some other `installation-dependent' definitions -** See Copyright Notice in lua.h -*/ - -#ifndef llimits_h -#define llimits_h - - -#include -#include - - -#include "lua.h" - - -/* -** try to find number of bits in an integer -*/ -#ifndef BITS_INT -/* avoid overflows in comparison */ -#if INT_MAX-20 < 32760 -#define BITS_INT 16 -#else -#if INT_MAX > 2147483640L -/* machine has at least 32 bits */ -#define BITS_INT 32 -#else -#error "you must define BITS_INT with number of bits in an integer" -#endif -#endif -#endif - - -/* -** the following types define integer types for values that may not -** fit in a `small int' (16 bits), but may waste space in a -** `large long' (64 bits). The current definitions should work in -** any machine, but may not be optimal. -*/ - -/* an unsigned integer to hold hash values */ -typedef unsigned int lu_hash; -/* its signed equivalent */ -typedef int ls_hash; - -/* an unsigned integer big enough to count the total memory used by Lua; */ -/* it should be at least as large as size_t */ -typedef unsigned long lu_mem; - -#define MAX_LUMEM ULONG_MAX - - -/* an integer big enough to count the number of strings in use */ -typedef long ls_nstr; - -/* chars used as small naturals (so that `char' is reserved for characters) */ -typedef unsigned char lu_byte; - - -#define MAX_SIZET ((size_t)(~(size_t)0)-2) - - -#define MAX_INT (INT_MAX-2) /* maximum value of an int (-2 for safety) */ - -/* -** conversion of pointer to integer -** this is for hashing only; there is no problem if the integer -** cannot hold the whole pointer value -*/ -#define IntPoint(p) ((lu_hash)(p)) - - - -/* type to ensure maximum alignment */ -#ifndef LUSER_ALIGNMENT_T -typedef union { double u; void *s; long l; } L_Umaxalign; -#else -typedef LUSER_ALIGNMENT_T L_Umaxalign; -#endif - - -/* result of `usual argument conversion' over lua_Number */ -#ifndef LUA_UACNUMBER -typedef double l_uacNumber; -#else -typedef LUA_UACNUMBER l_uacNumber; -#endif - - -#ifndef lua_assert -#define lua_assert(c) /* empty */ -#endif - - -#ifndef check_exp -#define check_exp(c,e) (e) -#endif - - -#ifndef UNUSED -#define UNUSED(x) ((void)(x)) /* to avoid warnings */ -#endif - - -#ifndef cast -#define cast(t, exp) ((t)(exp)) -#endif - - - -/* -** type for virtual-machine instructions -** must be an unsigned with (at least) 4 bytes (see details in lopcodes.h) -*/ -typedef unsigned long Instruction; - - -/* maximum depth for calls (unsigned short) */ -#ifndef LUA_MAXCALLS -#define LUA_MAXCALLS 4096 -#endif - - -/* -** maximum depth for C calls (unsigned short): Not too big, or may -** overflow the C stack... -*/ - -#ifndef LUA_MAXCCALLS -#define LUA_MAXCCALLS 200 -#endif - - -/* maximum size for the C stack */ -#ifndef LUA_MAXCSTACK -#define LUA_MAXCSTACK 2048 -#endif - - -/* maximum stack for a Lua function */ -#define MAXSTACK 250 - - -/* maximum number of variables declared in a function */ -#ifndef MAXVARS -#define MAXVARS 200 /* arbitrary limit ( -#include - -#define lmathlib_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#undef PI -#define PI (3.14159265358979323846) -#define RADIANS_PER_DEGREE (PI/180.0) - - - -/* -** If you want Lua to operate in degrees (instead of radians), -** define USE_DEGREES -*/ -#ifdef USE_DEGREES -#define FROMRAD(a) ((a)/RADIANS_PER_DEGREE) -#define TORAD(a) ((a)*RADIANS_PER_DEGREE) -#else -#define FROMRAD(a) (a) -#define TORAD(a) (a) -#endif - - -static int math_abs (lua_State *L) { - lua_pushnumber(L, fabs(luaL_checknumber(L, 1))); - return 1; -} - -static int math_sin (lua_State *L) { - lua_pushnumber(L, sin(TORAD(luaL_checknumber(L, 1)))); - return 1; -} - -static int math_cos (lua_State *L) { - lua_pushnumber(L, cos(TORAD(luaL_checknumber(L, 1)))); - return 1; -} - -static int math_tan (lua_State *L) { - lua_pushnumber(L, tan(TORAD(luaL_checknumber(L, 1)))); - return 1; -} - -static int math_asin (lua_State *L) { - lua_pushnumber(L, FROMRAD(asin(luaL_checknumber(L, 1)))); - return 1; -} - -static int math_acos (lua_State *L) { - lua_pushnumber(L, FROMRAD(acos(luaL_checknumber(L, 1)))); - return 1; -} - -static int math_atan (lua_State *L) { - lua_pushnumber(L, FROMRAD(atan(luaL_checknumber(L, 1)))); - return 1; -} - -static int math_atan2 (lua_State *L) { - lua_pushnumber(L, FROMRAD(atan2(luaL_checknumber(L, 1), luaL_checknumber(L, 2)))); - return 1; -} - -static int math_ceil (lua_State *L) { - lua_pushnumber(L, ceil(luaL_checknumber(L, 1))); - return 1; -} - -static int math_floor (lua_State *L) { - lua_pushnumber(L, floor(luaL_checknumber(L, 1))); - return 1; -} - -static int math_mod (lua_State *L) { - lua_pushnumber(L, fmod(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); - return 1; -} - -static int math_sqrt (lua_State *L) { - lua_pushnumber(L, sqrt(luaL_checknumber(L, 1))); - return 1; -} - -static int math_pow (lua_State *L) { - lua_pushnumber(L, pow(luaL_checknumber(L, 1), luaL_checknumber(L, 2))); - return 1; -} - -static int math_log (lua_State *L) { - lua_pushnumber(L, log(luaL_checknumber(L, 1))); - return 1; -} - -static int math_log10 (lua_State *L) { - lua_pushnumber(L, log10(luaL_checknumber(L, 1))); - return 1; -} - -static int math_exp (lua_State *L) { - lua_pushnumber(L, exp(luaL_checknumber(L, 1))); - return 1; -} - -static int math_deg (lua_State *L) { - lua_pushnumber(L, luaL_checknumber(L, 1)/RADIANS_PER_DEGREE); - return 1; -} - -static int math_rad (lua_State *L) { - lua_pushnumber(L, luaL_checknumber(L, 1)*RADIANS_PER_DEGREE); - return 1; -} - -static int math_frexp (lua_State *L) { - int e; - lua_pushnumber(L, frexp(luaL_checknumber(L, 1), &e)); - lua_pushnumber(L, e); - return 2; -} - -static int math_ldexp (lua_State *L) { - lua_pushnumber(L, ldexp(luaL_checknumber(L, 1), luaL_checkint(L, 2))); - return 1; -} - - - -static int math_min (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - lua_Number dmin = luaL_checknumber(L, 1); - int i; - for (i=2; i<=n; i++) { - lua_Number d = luaL_checknumber(L, i); - if (d < dmin) - dmin = d; - } - lua_pushnumber(L, dmin); - return 1; -} - - -static int math_max (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - lua_Number dmax = luaL_checknumber(L, 1); - int i; - for (i=2; i<=n; i++) { - lua_Number d = luaL_checknumber(L, i); - if (d > dmax) - dmax = d; - } - lua_pushnumber(L, dmax); - return 1; -} - - -static int math_random (lua_State *L) { - /* the `%' avoids the (rare) case of r==1, and is needed also because on - some systems (SunOS!) `rand()' may return a value larger than RAND_MAX */ - lua_Number r = (lua_Number)(rand()%RAND_MAX) / (lua_Number)RAND_MAX; - switch (lua_gettop(L)) { /* check number of arguments */ - case 0: { /* no arguments */ - lua_pushnumber(L, r); /* Number between 0 and 1 */ - break; - } - case 1: { /* only upper limit */ - int u = luaL_checkint(L, 1); - luaL_argcheck(L, 1<=u, 1, "interval is empty"); - lua_pushnumber(L, (int)floor(r*u)+1); /* int between 1 and `u' */ - break; - } - case 2: { /* lower and upper limits */ - int l = luaL_checkint(L, 1); - int u = luaL_checkint(L, 2); - luaL_argcheck(L, l<=u, 2, "interval is empty"); - lua_pushnumber(L, (int)floor(r*(u-l+1))+l); /* int between `l' and `u' */ - break; - } - default: return luaL_error(L, "wrong number of arguments"); - } - return 1; -} - - -static int math_randomseed (lua_State *L) { - srand(luaL_checkint(L, 1)); - return 0; -} - - -static const luaL_reg mathlib[] = { - {"abs", math_abs}, - {"sin", math_sin}, - {"cos", math_cos}, - {"tan", math_tan}, - {"asin", math_asin}, - {"acos", math_acos}, - {"atan", math_atan}, - {"atan2", math_atan2}, - {"ceil", math_ceil}, - {"floor", math_floor}, - {"mod", math_mod}, - {"frexp", math_frexp}, - {"ldexp", math_ldexp}, - {"sqrt", math_sqrt}, - {"min", math_min}, - {"max", math_max}, - {"log", math_log}, - {"log10", math_log10}, - {"exp", math_exp}, - {"deg", math_deg}, - {"pow", math_pow}, - {"rad", math_rad}, - {"random", math_random}, - {"randomseed", math_randomseed}, - {NULL, NULL} -}; - - -/* -** Open math library -*/ -LUALIB_API int luaopen_math (lua_State *L) { - luaL_openlib(L, LUA_MATHLIBNAME, mathlib, 0); - lua_pushliteral(L, "pi"); - lua_pushnumber(L, PI); - lua_settable(L, -3); - lua_pushliteral(L, "__pow"); - lua_pushcfunction(L, math_pow); - lua_settable(L, LUA_GLOBALSINDEX); - return 1; -} - diff --git a/plugins/SmartAutoReplier/lualib/lmem.c b/plugins/SmartAutoReplier/lualib/lmem.c deleted file mode 100644 index f977770af0..0000000000 --- a/plugins/SmartAutoReplier/lualib/lmem.c +++ /dev/null @@ -1,91 +0,0 @@ -/* -** $Id: lmem.c,v 1.61 2002/12/04 17:38:31 roberto Exp $ -** Interface to Memory Manager -** See Copyright Notice in lua.h -*/ - - -#include - -#define lmem_c - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" - - - -/* -** definition for realloc function. It must assure that l_realloc(NULL, -** 0, x) allocates a new block (ANSI C assures that). (`os' is the old -** block size; some allocators may use that.) -*/ -#ifndef l_realloc -#define l_realloc(b,os,s) realloc(b,s) -#endif - -/* -** definition for free function. (`os' is the old block size; some -** allocators may use that.) -*/ -#ifndef l_free -#define l_free(b,os) free(b) -#endif - - -#define MINSIZEARRAY 4 - - -void *luaM_growaux (lua_State *L, void *block, int *size, int size_elems, - int limit, const char *errormsg) { - void *newblock; - int newsize = (*size)*2; - if (newsize < MINSIZEARRAY) - newsize = MINSIZEARRAY; /* minimum size */ - else if (*size >= limit/2) { /* cannot double it? */ - if (*size < limit - MINSIZEARRAY) /* try something smaller... */ - newsize = limit; /* still have at least MINSIZEARRAY free places */ - else luaG_runerror(L, errormsg); - } - newblock = luaM_realloc(L, block, - cast(lu_mem, *size)*cast(lu_mem, size_elems), - cast(lu_mem, newsize)*cast(lu_mem, size_elems)); - *size = newsize; /* update only when everything else is OK */ - return newblock; -} - - -/* -** generic allocation routine. -*/ -void *luaM_realloc (lua_State *L, void *block, lu_mem oldsize, lu_mem size) { - lua_assert((oldsize == 0) == (block == NULL)); - if (size == 0) { - if (block != NULL) { - l_free(block, oldsize); - block = NULL; - } - else return NULL; /* avoid `nblocks' computations when oldsize==size==0 */ - } - else if (size >= MAX_SIZET) - luaG_runerror(L, "memory allocation error: block too big"); - else { - block = l_realloc(block, oldsize, size); - if (block == NULL) { - if (L) - luaD_throw(L, LUA_ERRMEM); - else return NULL; /* error before creating state! */ - } - } - if (L) { - lua_assert(G(L) != NULL && G(L)->nblocks > 0); - G(L)->nblocks -= oldsize; - G(L)->nblocks += size; - } - return block; -} - diff --git a/plugins/SmartAutoReplier/lualib/lmem.h b/plugins/SmartAutoReplier/lualib/lmem.h deleted file mode 100644 index 1bb4fde0b2..0000000000 --- a/plugins/SmartAutoReplier/lualib/lmem.h +++ /dev/null @@ -1,44 +0,0 @@ -/* -** $Id: lmem.h,v 1.26 2002/05/01 20:40:42 roberto Exp $ -** Interface to Memory Manager -** See Copyright Notice in lua.h -*/ - -#ifndef lmem_h -#define lmem_h - - -#include - -#include "llimits.h" -#include "lua.h" - -#define MEMERRMSG "not enough memory" - - -void *luaM_realloc (lua_State *L, void *oldblock, lu_mem oldsize, lu_mem size); - -void *luaM_growaux (lua_State *L, void *block, int *size, int size_elem, - int limit, const char *errormsg); - -#define luaM_free(L, b, s) luaM_realloc(L, (b), (s), 0) -#define luaM_freelem(L, b) luaM_realloc(L, (b), sizeof(*(b)), 0) -#define luaM_freearray(L, b, n, t) luaM_realloc(L, (b), \ - cast(lu_mem, n)*cast(lu_mem, sizeof(t)), 0) - -#define luaM_malloc(L, t) luaM_realloc(L, NULL, 0, (t)) -#define luaM_new(L, t) cast(t *, luaM_malloc(L, sizeof(t))) -#define luaM_newvector(L, n,t) cast(t *, luaM_malloc(L, \ - cast(lu_mem, n)*cast(lu_mem, sizeof(t)))) - -#define luaM_growvector(L,v,nelems,size,t,limit,e) \ - if (((nelems)+1) > (size)) \ - ((v)=cast(t *, luaM_growaux(L,v,&(size),sizeof(t),limit,e))) - -#define luaM_reallocvector(L, v,oldn,n,t) \ - ((v)=cast(t *, luaM_realloc(L, v,cast(lu_mem, oldn)*cast(lu_mem, sizeof(t)), \ - cast(lu_mem, n)*cast(lu_mem, sizeof(t))))) - - -#endif - diff --git a/plugins/SmartAutoReplier/lualib/loadlib.c b/plugins/SmartAutoReplier/lualib/loadlib.c deleted file mode 100644 index ac4d697a68..0000000000 --- a/plugins/SmartAutoReplier/lualib/loadlib.c +++ /dev/null @@ -1,205 +0,0 @@ -/* -** $Id: loadlib.c,v 1.4 2003/04/07 20:11:53 roberto Exp $ -** Dynamic library loader for Lua -** See Copyright Notice in lua.h -* -* This Lua library exports a single function, called loadlib, which is -* called from Lua as loadlib(lib,init), where lib is the full name of the -* library to be loaded (including the complete path) and init is the name -* of a function to be called after the library is loaded. Typically, this -* function will register other functions, thus making the complete library -* available to Lua. The init function is *not* automatically called by -* loadlib. Instead, loadlib returns the init function as a Lua function -* that the client can call when it thinks is appropriate. In the case of -* errors, loadlib returns nil and two strings describing the error. -* The first string is supplied by the operating system; it should be -* informative and useful for error messages. The second string is "open", -* "init", or "absent" to identify the error and is meant to be used for -* making decisions without having to look into the first string (whose -* format is system-dependent). -* -* This module contains an implementation of loadlib for Unix systems that -* have dlfcn, an implementation for Windows, and a stub for other systems. -* See the list at the end of this file for some links to available -* implementations of dlfcn and interfaces to other native dynamic loaders -* on top of which loadlib could be implemented. -* -*/ - -#include "lua.h" -#include "lauxlib.h" -#include "lualib.h" - - -#undef LOADLIB - - -#ifdef USE_DLOPEN -#define LOADLIB -/* -* This is an implementation of loadlib based on the dlfcn interface. -* The dlfcn interface is available in Linux, SunOS, Solaris, IRIX, FreeBSD, -* NetBSD, AIX 4.2, HPUX 11, and probably most other Unix flavors, at least -* as an emulation layer on top of native functions. -*/ - -#include - -static int loadlib(lua_State *L) -{ - const char *path=luaL_checkstring(L,1); - const char *init=luaL_checkstring(L,2); - void *lib=dlopen(path,RTLD_NOW); - if (lib!=NULL) - { - lua_CFunction f=(lua_CFunction) dlsym(lib,init); - if (f!=NULL) - { - lua_pushlightuserdata(L,lib); - lua_pushcclosure(L,f,1); - return 1; - } - } - /* else return appropriate error messages */ - lua_pushnil(L); - lua_pushstring(L,dlerror()); - lua_pushstring(L,(lib!=NULL) ? "init" : "open"); - if (lib!=NULL) dlclose(lib); - return 3; -} - -#endif - - - -/* -** In Windows, default is to use dll; otherwise, default is not to use dll -*/ -#ifndef USE_DLL -#ifdef _WIN32 -#define USE_DLL 1 -#else -#define USE_DLL 0 -#endif -#endif - - -#if USE_DLL -#define LOADLIB -/* -* This is an implementation of loadlib for Windows using native functions. -*/ - -#include - -static void pusherror(lua_State *L) -{ - int error=GetLastError(); - char buffer[128]; - if (FormatMessage(FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM, - 0, error, 0, buffer, sizeof(buffer), 0)) - lua_pushstring(L,buffer); - else - lua_pushfstring(L,"system error %d\n",error); -} - -static int loadlib(lua_State *L) -{ - const char *path=luaL_checkstring(L,1); - const char *init=luaL_checkstring(L,2); - HINSTANCE lib=LoadLibrary(path); - if (lib!=NULL) - { - lua_CFunction f=(lua_CFunction) GetProcAddress(lib,init); - if (f!=NULL) - { - lua_pushlightuserdata(L,lib); - lua_pushcclosure(L,f,1); - return 1; - } - } - lua_pushnil(L); - pusherror(L); - lua_pushstring(L,(lib!=NULL) ? "init" : "open"); - if (lib!=NULL) FreeLibrary(lib); - return 3; -} - -#endif - - - -#ifndef LOADLIB -/* Fallback for other systems */ - -/* -** Those systems support dlopen, so they should have defined USE_DLOPEN. -** The default (no)implementation gives them a special error message. -*/ -#ifdef linux -#define LOADLIB -#endif - -#ifdef sun -#define LOADLIB -#endif - -#ifdef sgi -#define LOADLIB -#endif - -#ifdef BSD -#define LOADLIB -#endif - -#ifdef _WIN32 -#define LOADLIB -#endif - -#ifdef LOADLIB -#undef LOADLIB -#define LOADLIB "`loadlib' not installed (check your Lua configuration)" -#else -#define LOADLIB "`loadlib' not supported" -#endif - -static int loadlib(lua_State *L) -{ - lua_pushnil(L); - lua_pushliteral(L,LOADLIB); - lua_pushliteral(L,"absent"); - return 3; -} -#endif - -LUALIB_API int luaopen_loadlib (lua_State *L) -{ - lua_register(L,"loadlib",loadlib); - return 0; -} - -/* -* Here are some links to available implementations of dlfcn and -* interfaces to other native dynamic loaders on top of which loadlib -* could be implemented. Please send contributions and corrections to us. -* -* AIX -* Starting with AIX 4.2, dlfcn is included in the base OS. -* There is also an emulation package available. -* http://www.faqs.org/faqs/aix-faq/part4/section-21.html -* -* HPUX -* HPUX 11 has dlfcn. For HPUX 10 use shl_*. -* http://www.geda.seul.org/mailinglist/geda-dev37/msg00094.html -* http://www.stat.umn.edu/~luke/xls/projects/dlbasics/dlbasics.html -* -* Macintosh, Windows -* http://www.stat.umn.edu/~luke/xls/projects/dlbasics/dlbasics.html -* -* Mac OS X/Darwin -* http://www.opendarwin.org/projects/dlcompat/ -* -* GLIB has wrapper code for BeOS, OS2, Unix and Windows -* http://cvs.gnome.org/lxr/source/glib/gmodule/ -* -*/ diff --git a/plugins/SmartAutoReplier/lualib/lobject.c b/plugins/SmartAutoReplier/lualib/lobject.c deleted file mode 100644 index 9522b6e812..0000000000 --- a/plugins/SmartAutoReplier/lualib/lobject.c +++ /dev/null @@ -1,195 +0,0 @@ -/* -** $Id: lobject.c,v 1.97 2003/04/03 13:35:34 roberto Exp $ -** Some generic functions over Lua objects -** See Copyright Notice in lua.h -*/ - -#include -#include -#include -#include - -#define lobject_c - -#include "lua.h" - -#include "ldo.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "lvm.h" - - -/* function to convert a string to a lua_Number */ -#ifndef lua_str2number -#define lua_str2number(s,p) strtod((s), (p)) -#endif - - -const TObject luaO_nilobject = {LUA_TNIL, {NULL}}; - - -/* -** converts an integer to a "floating point byte", represented as -** (mmmmmxxx), where the real value is (xxx) * 2^(mmmmm) -*/ -int luaO_int2fb (unsigned int x) { - int m = 0; /* mantissa */ - while (x >= (1<<3)) { - x = (x+1) >> 1; - m++; - } - return (m << 3) | cast(int, x); -} - - -int luaO_log2 (unsigned int x) { - static const lu_byte log_8[255] = { - 0, - 1,1, - 2,2,2,2, - 3,3,3,3,3,3,3,3, - 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, - 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, - 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7 - }; - if (x >= 0x00010000) { - if (x >= 0x01000000) return log_8[((x>>24) & 0xff) - 1]+24; - else return log_8[((x>>16) & 0xff) - 1]+16; - } - else { - if (x >= 0x00000100) return log_8[((x>>8) & 0xff) - 1]+8; - else if (x) return log_8[(x & 0xff) - 1]; - return -1; /* special `log' for 0 */ - } -} - - -int luaO_rawequalObj (const TObject *t1, const TObject *t2) { - if (ttype(t1) != ttype(t2)) return 0; - else switch (ttype(t1)) { - case LUA_TNIL: - return 1; - case LUA_TNUMBER: - return nvalue(t1) == nvalue(t2); - case LUA_TBOOLEAN: - return bvalue(t1) == bvalue(t2); /* boolean true must be 1 !! */ - case LUA_TLIGHTUSERDATA: - return pvalue(t1) == pvalue(t2); - default: - lua_assert(iscollectable(t1)); - return gcvalue(t1) == gcvalue(t2); - } -} - - -int luaO_str2d (const char *s, lua_Number *result) { - char *endptr; - lua_Number res = lua_str2number(s, &endptr); - if (endptr == s) return 0; /* no conversion */ - while (isspace((unsigned char)(*endptr))) endptr++; - if (*endptr != '\0') return 0; /* invalid trailing characters? */ - *result = res; - return 1; -} - - - -static void pushstr (lua_State *L, const char *str) { - setsvalue2s(L->top, luaS_new(L, str)); - incr_top(L); -} - - -/* this function handles only `%d', `%c', %f, and `%s' formats */ -const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp) { - int n = 1; - pushstr(L, ""); - for (;;) { - const char *e = strchr(fmt, '%'); - if (e == NULL) break; - setsvalue2s(L->top, luaS_newlstr(L, fmt, e-fmt)); - incr_top(L); - switch (*(e+1)) { - case 's': - pushstr(L, va_arg(argp, char *)); - break; - case 'c': { - char buff[2]; - buff[0] = cast(char, va_arg(argp, int)); - buff[1] = '\0'; - pushstr(L, buff); - break; - } - case 'd': - setnvalue(L->top, cast(lua_Number, va_arg(argp, int))); - incr_top(L); - break; - case 'f': - setnvalue(L->top, cast(lua_Number, va_arg(argp, l_uacNumber))); - incr_top(L); - break; - case '%': - pushstr(L, "%"); - break; - default: lua_assert(0); - } - n += 2; - fmt = e+2; - } - pushstr(L, fmt); - luaV_concat(L, n+1, L->top - L->base - 1); - L->top -= n; - return svalue(L->top - 1); -} - - -const char *luaO_pushfstring (lua_State *L, const char *fmt, ...) { - const char *msg; - va_list argp; - va_start(argp, fmt); - msg = luaO_pushvfstring(L, fmt, argp); - va_end(argp); - return msg; -} - - -void luaO_chunkid (char *out, const char *source, int bufflen) { - if (*source == '=') { - strncpy(out, source+1, bufflen); /* remove first char */ - out[bufflen-1] = '\0'; /* ensures null termination */ - } - else { /* out = "source", or "...source" */ - if (*source == '@') { - int l; - source++; /* skip the `@' */ - bufflen -= sizeof(" `...' "); - l = strlen(source); - strcpy(out, ""); - if (l>bufflen) { - source += (l-bufflen); /* get last part of file name */ - strcat(out, "..."); - } - strcat(out, source); - } - else { /* out = [string "string"] */ - int len = strcspn(source, "\n"); /* stop at first newline */ - bufflen -= sizeof(" [string \"...\"] "); - if (len > bufflen) len = bufflen; - strcpy(out, "[string \""); - if (source[len] != '\0') { /* must truncate? */ - strncat(out, source, len); - strcat(out, "..."); - } - else - strcat(out, source); - strcat(out, "\"]"); - } - } -} diff --git a/plugins/SmartAutoReplier/lualib/lobject.h b/plugins/SmartAutoReplier/lualib/lobject.h deleted file mode 100644 index 321a7e06c1..0000000000 --- a/plugins/SmartAutoReplier/lualib/lobject.h +++ /dev/null @@ -1,336 +0,0 @@ -/* -** $Id: lobject.h,v 1.159 2003/03/18 12:50:04 roberto Exp $ -** Type definitions for Lua objects -** See Copyright Notice in lua.h -*/ - -#ifndef lobject_h -#define lobject_h - - -#include "llimits.h" -#include "lua.h" - - -/* tags for values visible from Lua */ -#define NUM_TAGS LUA_TTHREAD - - -/* -** Extra tags for non-values -*/ -#define LUA_TPROTO (NUM_TAGS+1) -#define LUA_TUPVAL (NUM_TAGS+2) - - -/* -** Union of all collectable objects -*/ -typedef union GCObject GCObject; - - -/* -** Common Header for all collectable objects (in macro form, to be -** included in other objects) -*/ -#define CommonHeader GCObject *next; lu_byte tt; lu_byte marked - - -/* -** Common header in struct form -*/ -typedef struct GCheader { - CommonHeader; -} GCheader; - - - - -/* -** Union of all Lua values -*/ -typedef union { - GCObject *gc; - void *p; - lua_Number n; - int b; -} Value; - - -/* -** Lua values (or `tagged objects') -*/ -typedef struct lua_TObject { - int tt; - Value value; -} TObject; - - -/* Macros to test type */ -#define ttisnil(o) (ttype(o) == LUA_TNIL) -#define ttisnumber(o) (ttype(o) == LUA_TNUMBER) -#define ttisstring(o) (ttype(o) == LUA_TSTRING) -#define ttistable(o) (ttype(o) == LUA_TTABLE) -#define ttisfunction(o) (ttype(o) == LUA_TFUNCTION) -#define ttisboolean(o) (ttype(o) == LUA_TBOOLEAN) -#define ttisuserdata(o) (ttype(o) == LUA_TUSERDATA) -#define ttisthread(o) (ttype(o) == LUA_TTHREAD) -#define ttislightuserdata(o) (ttype(o) == LUA_TLIGHTUSERDATA) - -/* Macros to access values */ -#define ttype(o) ((o)->tt) -#define gcvalue(o) check_exp(iscollectable(o), (o)->value.gc) -#define pvalue(o) check_exp(ttislightuserdata(o), (o)->value.p) -#define nvalue(o) check_exp(ttisnumber(o), (o)->value.n) -#define tsvalue(o) check_exp(ttisstring(o), &(o)->value.gc->ts) -#define uvalue(o) check_exp(ttisuserdata(o), &(o)->value.gc->u) -#define clvalue(o) check_exp(ttisfunction(o), &(o)->value.gc->cl) -#define hvalue(o) check_exp(ttistable(o), &(o)->value.gc->h) -#define bvalue(o) check_exp(ttisboolean(o), (o)->value.b) -#define thvalue(o) check_exp(ttisthread(o), &(o)->value.gc->th) - -#define l_isfalse(o) (ttisnil(o) || (ttisboolean(o) && bvalue(o) == 0)) - -/* Macros to set values */ -#define setnvalue(obj,x) \ - { TObject *i_o=(obj); i_o->tt=LUA_TNUMBER; i_o->value.n=(x); } - -#define chgnvalue(obj,x) \ - check_exp(ttype(obj)==LUA_TNUMBER, (obj)->value.n=(x)) - -#define setpvalue(obj,x) \ - { TObject *i_o=(obj); i_o->tt=LUA_TLIGHTUSERDATA; i_o->value.p=(x); } - -#define setbvalue(obj,x) \ - { TObject *i_o=(obj); i_o->tt=LUA_TBOOLEAN; i_o->value.b=(x); } - -#define setsvalue(obj,x) \ - { TObject *i_o=(obj); i_o->tt=LUA_TSTRING; \ - i_o->value.gc=cast(GCObject *, (x)); \ - lua_assert(i_o->value.gc->gch.tt == LUA_TSTRING); } - -#define setuvalue(obj,x) \ - { TObject *i_o=(obj); i_o->tt=LUA_TUSERDATA; \ - i_o->value.gc=cast(GCObject *, (x)); \ - lua_assert(i_o->value.gc->gch.tt == LUA_TUSERDATA); } - -#define setthvalue(obj,x) \ - { TObject *i_o=(obj); i_o->tt=LUA_TTHREAD; \ - i_o->value.gc=cast(GCObject *, (x)); \ - lua_assert(i_o->value.gc->gch.tt == LUA_TTHREAD); } - -#define setclvalue(obj,x) \ - { TObject *i_o=(obj); i_o->tt=LUA_TFUNCTION; \ - i_o->value.gc=cast(GCObject *, (x)); \ - lua_assert(i_o->value.gc->gch.tt == LUA_TFUNCTION); } - -#define sethvalue(obj,x) \ - { TObject *i_o=(obj); i_o->tt=LUA_TTABLE; \ - i_o->value.gc=cast(GCObject *, (x)); \ - lua_assert(i_o->value.gc->gch.tt == LUA_TTABLE); } - -#define setnilvalue(obj) ((obj)->tt=LUA_TNIL) - - - -/* -** for internal debug only -*/ -#define checkconsistency(obj) \ - lua_assert(!iscollectable(obj) || (ttype(obj) == (obj)->value.gc->gch.tt)) - - -#define setobj(obj1,obj2) \ - { const TObject *o2=(obj2); TObject *o1=(obj1); \ - checkconsistency(o2); \ - o1->tt=o2->tt; o1->value = o2->value; } - - -/* -** different types of sets, according to destination -*/ - -/* from stack to (same) stack */ -#define setobjs2s setobj -/* to stack (not from same stack) */ -#define setobj2s setobj -#define setsvalue2s setsvalue -/* from table to same table */ -#define setobjt2t setobj -/* to table */ -#define setobj2t setobj -/* to new object */ -#define setobj2n setobj -#define setsvalue2n setsvalue - -#define setttype(obj, tt) (ttype(obj) = (tt)) - - -#define iscollectable(o) (ttype(o) >= LUA_TSTRING) - - - -typedef TObject *StkId; /* index to stack elements */ - - -/* -** String headers for string table -*/ -typedef union TString { - L_Umaxalign dummy; /* ensures maximum alignment for strings */ - struct { - CommonHeader; - lu_byte reserved; - lu_hash hash; - size_t len; - } tsv; -} TString; - - -#define getstr(ts) cast(const char *, (ts) + 1) -#define svalue(o) getstr(tsvalue(o)) - - - -typedef union Udata { - L_Umaxalign dummy; /* ensures maximum alignment for `local' udata */ - struct { - CommonHeader; - struct Table *metatable; - size_t len; - } uv; -} Udata; - - - - -/* -** Function Prototypes -*/ -typedef struct Proto { - CommonHeader; - TObject *k; /* constants used by the function */ - Instruction *code; - struct Proto **p; /* functions defined inside the function */ - int *lineinfo; /* map from opcodes to source lines */ - struct LocVar *locvars; /* information about local variables */ - TString **upvalues; /* upvalue names */ - TString *source; - int sizeupvalues; - int sizek; /* size of `k' */ - int sizecode; - int sizelineinfo; - int sizep; /* size of `p' */ - int sizelocvars; - int lineDefined; - GCObject *gclist; - lu_byte nups; /* number of upvalues */ - lu_byte numparams; - lu_byte is_vararg; - lu_byte maxstacksize; -} Proto; - - -typedef struct LocVar { - TString *varname; - int startpc; /* first point where variable is active */ - int endpc; /* first point where variable is dead */ -} LocVar; - - - -/* -** Upvalues -*/ - -typedef struct UpVal { - CommonHeader; - TObject *v; /* points to stack or to its own value */ - TObject value; /* the value (when closed) */ -} UpVal; - - -/* -** Closures -*/ - -#define ClosureHeader \ - CommonHeader; lu_byte isC; lu_byte nupvalues; GCObject *gclist - -typedef struct CClosure { - ClosureHeader; - lua_CFunction f; - TObject upvalue[1]; -} CClosure; - - -typedef struct LClosure { - ClosureHeader; - struct Proto *p; - TObject g; /* global table for this closure */ - UpVal *upvals[1]; -} LClosure; - - -typedef union Closure { - CClosure c; - LClosure l; -} Closure; - - -#define iscfunction(o) (ttype(o) == LUA_TFUNCTION && clvalue(o)->c.isC) -#define isLfunction(o) (ttype(o) == LUA_TFUNCTION && !clvalue(o)->c.isC) - - -/* -** Tables -*/ - -typedef struct Node { - TObject i_key; - TObject i_val; - struct Node *next; /* for chaining */ -} Node; - - -typedef struct Table { - CommonHeader; - lu_byte flags; /* 1<

lsizenode)) - - - -extern const TObject luaO_nilobject; - -int luaO_log2 (unsigned int x); -int luaO_int2fb (unsigned int x); -#define fb2int(x) (((x) & 7) << ((x) >> 3)) - -int luaO_rawequalObj (const TObject *t1, const TObject *t2); -int luaO_str2d (const char *s, lua_Number *result); - -const char *luaO_pushvfstring (lua_State *L, const char *fmt, va_list argp); -const char *luaO_pushfstring (lua_State *L, const char *fmt, ...); -void luaO_chunkid (char *out, const char *source, int len); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lopcodes.c b/plugins/SmartAutoReplier/lualib/lopcodes.c deleted file mode 100644 index 993e426d35..0000000000 --- a/plugins/SmartAutoReplier/lualib/lopcodes.c +++ /dev/null @@ -1,102 +0,0 @@ -/* -** $Id: lopcodes.c,v 1.22 2002/12/04 17:38:31 roberto Exp $ -** extracted automatically from lopcodes.h by mkprint.lua -** DO NOT EDIT -** See Copyright Notice in lua.h -*/ - - -#define lopcodes_c - -#include "lua.h" - -#include "lobject.h" -#include "lopcodes.h" - - -#ifdef LUA_OPNAMES - -const char *const luaP_opnames[] = { - "MOVE", - "LOADK", - "LOADBOOL", - "LOADNIL", - "GETUPVAL", - "GETGLOBAL", - "GETTABLE", - "SETGLOBAL", - "SETUPVAL", - "SETTABLE", - "NEWTABLE", - "SELF", - "ADD", - "SUB", - "MUL", - "DIV", - "POW", - "UNM", - "NOT", - "CONCAT", - "JMP", - "EQ", - "LT", - "LE", - "TEST", - "CALL", - "TAILCALL", - "RETURN", - "FORLOOP", - "TFORLOOP", - "TFORPREP", - "SETLIST", - "SETLISTO", - "CLOSE", - "CLOSURE" -}; - -#endif - -#define opmode(t,b,bk,ck,sa,k,m) (((t)<>1) /* `sBx' is signed */ -#else -#define MAXARG_Bx MAX_INT -#define MAXARG_sBx MAX_INT -#endif - - -#define MAXARG_A ((1<>POS_A)) -#define SETARG_A(i,u) ((i) = (((i)&MASK0(SIZE_A,POS_A)) | \ - ((cast(Instruction, u)<>POS_B) & MASK1(SIZE_B,0))) -#define SETARG_B(i,b) ((i) = (((i)&MASK0(SIZE_B,POS_B)) | \ - ((cast(Instruction, b)<>POS_C) & MASK1(SIZE_C,0))) -#define SETARG_C(i,b) ((i) = (((i)&MASK0(SIZE_C,POS_C)) | \ - ((cast(Instruction, b)<>POS_Bx) & MASK1(SIZE_Bx,0))) -#define SETARG_Bx(i,b) ((i) = (((i)&MASK0(SIZE_Bx,POS_Bx)) | \ - ((cast(Instruction, b)< C) then R(A) := R(B) else pc++ */ - -OP_CALL,/* A B C R(A), ... ,R(A+C-2) := R(A)(R(A+1), ... ,R(A+B-1)) */ -OP_TAILCALL,/* A B C return R(A)(R(A+1), ... ,R(A+B-1)) */ -OP_RETURN,/* A B return R(A), ... ,R(A+B-2) (see note) */ - -OP_FORLOOP,/* A sBx R(A)+=R(A+2); if R(A) =) R(A)*/ -OP_CLOSURE/* A Bx R(A) := closure(KPROTO[Bx], R(A), ... ,R(A+n)) */ -} OpCode; - - -#define NUM_OPCODES (cast(int, OP_CLOSURE+1)) - - - -/*=========================================================================== - Notes: - (1) In OP_CALL, if (B == 0) then B = top. C is the number of returns - 1, - and can be 0: OP_CALL then sets `top' to last_result+1, so - next open instruction (OP_CALL, OP_RETURN, OP_SETLIST) may use `top'. - - (2) In OP_RETURN, if (B == 0) then return up to `top' - - (3) For comparisons, B specifies what conditions the test should accept. - - (4) All `skips' (pc++) assume that next instruction is a jump -===========================================================================*/ - - -/* -** masks for instruction properties -*/ -enum OpModeMask { - OpModeBreg = 2, /* B is a register */ - OpModeBrk, /* B is a register/constant */ - OpModeCrk, /* C is a register/constant */ - OpModesetA, /* instruction set register A */ - OpModeK, /* Bx is a constant */ - OpModeT /* operator is a test */ - -}; - - -extern const lu_byte luaP_opmodes[NUM_OPCODES]; - -#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 3)) -#define testOpMode(m, b) (luaP_opmodes[m] & (1 << (b))) - - -#ifdef LUA_OPNAMES -extern const char *const luaP_opnames[]; /* opcode names */ -#endif - - - -/* number of list items to accumulate before a SETLIST instruction */ -/* (must be a power of 2) */ -#define LFIELDS_PER_FLUSH 32 - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lparser.c b/plugins/SmartAutoReplier/lualib/lparser.c deleted file mode 100644 index c1323ecd2a..0000000000 --- a/plugins/SmartAutoReplier/lualib/lparser.c +++ /dev/null @@ -1,1329 +0,0 @@ -/* -** $Id: lparser.c,v 1.208 2003/04/03 13:35:34 roberto Exp $ -** Lua Parser -** See Copyright Notice in lua.h -*/ - - -#include - -#define lparser_c - -#include "lua.h" - -#include "lcode.h" -#include "ldebug.h" -#include "lfunc.h" -#include "llex.h" -#include "lmem.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lparser.h" -#include "lstate.h" -#include "lstring.h" - - - - -#define getlocvar(fs, i) ((fs)->f->locvars[(fs)->actvar[i]]) - - -#define enterlevel(ls) if (++(ls)->nestlevel > LUA_MAXPARSERLEVEL) \ - luaX_syntaxerror(ls, "too many syntax levels"); -#define leavelevel(ls) ((ls)->nestlevel--) - - -/* -** nodes for block list (list of active blocks) -*/ -typedef struct BlockCnt { - struct BlockCnt *previous; /* chain */ - int breaklist; /* list of jumps out of this loop */ - int nactvar; /* # active local variables outside the breakable structure */ - int upval; /* true if some variable in the block is an upvalue */ - int isbreakable; /* true if `block' is a loop */ -} BlockCnt; - - - -/* -** prototypes for recursive non-terminal functions -*/ -static void chunk (LexState *ls); -static void expr (LexState *ls, expdesc *v); - - - -static void next (LexState *ls) { - ls->lastline = ls->linenumber; - if (ls->lookahead.token != TK_EOS) { /* is there a look-ahead token? */ - ls->t = ls->lookahead; /* use this one */ - ls->lookahead.token = TK_EOS; /* and discharge it */ - } - else - ls->t.token = luaX_lex(ls, &ls->t.seminfo); /* read next token */ -} - - -static void lookahead (LexState *ls) { - lua_assert(ls->lookahead.token == TK_EOS); - ls->lookahead.token = luaX_lex(ls, &ls->lookahead.seminfo); -} - - -static void error_expected (LexState *ls, int token) { - luaX_syntaxerror(ls, - luaO_pushfstring(ls->L, "`%s' expected", luaX_token2str(ls, token))); -} - - -static int testnext (LexState *ls, int c) { - if (ls->t.token == c) { - next(ls); - return 1; - } - else return 0; -} - - -static void check (LexState *ls, int c) { - if (!testnext(ls, c)) - error_expected(ls, c); -} - - -#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } - - - -static void check_match (LexState *ls, int what, int who, int where) { - if (!testnext(ls, what)) { - if (where == ls->linenumber) - error_expected(ls, what); - else { - luaX_syntaxerror(ls, luaO_pushfstring(ls->L, - "`%s' expected (to close `%s' at line %d)", - luaX_token2str(ls, what), luaX_token2str(ls, who), where)); - } - } -} - - -static TString *str_checkname (LexState *ls) { - TString *ts; - check_condition(ls, (ls->t.token == TK_NAME), " expected"); - ts = ls->t.seminfo.ts; - next(ls); - return ts; -} - - -static void init_exp (expdesc *e, expkind k, int i) { - e->f = e->t = NO_JUMP; - e->k = k; - e->info = i; -} - - -static void codestring (LexState *ls, expdesc *e, TString *s) { - init_exp(e, VK, luaK_stringK(ls->fs, s)); -} - - -static void checkname(LexState *ls, expdesc *e) { - codestring(ls, e, str_checkname(ls)); -} - - -static int luaI_registerlocalvar (LexState *ls, TString *varname) { - FuncState *fs = ls->fs; - Proto *f = fs->f; - luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, - LocVar, MAX_INT, ""); - f->locvars[fs->nlocvars].varname = varname; - return fs->nlocvars++; -} - - -static void new_localvar (LexState *ls, TString *name, int n) { - FuncState *fs = ls->fs; - luaX_checklimit(ls, fs->nactvar+n+1, MAXVARS, "local variables"); - fs->actvar[fs->nactvar+n] = luaI_registerlocalvar(ls, name); -} - - -static void adjustlocalvars (LexState *ls, int nvars) { - FuncState *fs = ls->fs; - fs->nactvar += nvars; - for (; nvars; nvars--) { - getlocvar(fs, fs->nactvar - nvars).startpc = fs->pc; - } -} - - -static void removevars (LexState *ls, int tolevel) { - FuncState *fs = ls->fs; - while (fs->nactvar > tolevel) - getlocvar(fs, --fs->nactvar).endpc = fs->pc; -} - - -static void new_localvarstr (LexState *ls, const char *name, int n) { - new_localvar(ls, luaS_new(ls->L, name), n); -} - - -static void create_local (LexState *ls, const char *name) { - new_localvarstr(ls, name, 0); - adjustlocalvars(ls, 1); -} - - -static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { - int i; - Proto *f = fs->f; - for (i=0; inups; i++) { - if (fs->upvalues[i].k == v->k && fs->upvalues[i].info == v->info) { - lua_assert(fs->f->upvalues[i] == name); - return i; - } - } - /* new one */ - luaX_checklimit(fs->ls, f->nups + 1, MAXUPVALUES, "upvalues"); - luaM_growvector(fs->L, fs->f->upvalues, f->nups, fs->f->sizeupvalues, - TString *, MAX_INT, ""); - fs->f->upvalues[f->nups] = name; - fs->upvalues[f->nups] = *v; - return f->nups++; -} - - -static int searchvar (FuncState *fs, TString *n) { - int i; - for (i=fs->nactvar-1; i >= 0; i--) { - if (n == getlocvar(fs, i).varname) - return i; - } - return -1; /* not found */ -} - - -static void markupval (FuncState *fs, int level) { - BlockCnt *bl = fs->bl; - while (bl && bl->nactvar > level) bl = bl->previous; - if (bl) bl->upval = 1; -} - - -static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { - if (fs == NULL) /* no more levels? */ - init_exp(var, VGLOBAL, NO_REG); /* default is global variable */ - else { - int v = searchvar(fs, n); /* look up at current level */ - if (v >= 0) { - init_exp(var, VLOCAL, v); - if (!base) - markupval(fs, v); /* local will be used as an upval */ - } - else { /* not found at current level; try upper one */ - singlevaraux(fs->prev, n, var, 0); - if (var->k == VGLOBAL) { - if (base) - var->info = luaK_stringK(fs, n); /* info points to global name */ - } - else { /* LOCAL or UPVAL */ - var->info = indexupvalue(fs, n, var); - var->k = VUPVAL; /* upvalue in this level */ - } - } - } -} - - -static TString *singlevar (LexState *ls, expdesc *var, int base) { - TString *varname = str_checkname(ls); - singlevaraux(ls->fs, varname, var, base); - return varname; -} - - -static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { - FuncState *fs = ls->fs; - int extra = nvars - nexps; - if (e->k == VCALL) { - extra++; /* includes call itself */ - if (extra <= 0) extra = 0; - else luaK_reserveregs(fs, extra-1); - luaK_setcallreturns(fs, e, extra); /* call provides the difference */ - } - else { - if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */ - if (extra > 0) { - int reg = fs->freereg; - luaK_reserveregs(fs, extra); - luaK_nil(fs, reg, extra); - } - } -} - - -static void code_params (LexState *ls, int nparams, int dots) { - FuncState *fs = ls->fs; - adjustlocalvars(ls, nparams); - luaX_checklimit(ls, fs->nactvar, MAXPARAMS, "parameters"); - fs->f->numparams = cast(lu_byte, fs->nactvar); - fs->f->is_vararg = cast(lu_byte, dots); - if (dots) - create_local(ls, "arg"); - luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ -} - - -static void enterblock (FuncState *fs, BlockCnt *bl, int isbreakable) { - bl->breaklist = NO_JUMP; - bl->isbreakable = isbreakable; - bl->nactvar = fs->nactvar; - bl->upval = 0; - bl->previous = fs->bl; - fs->bl = bl; - lua_assert(fs->freereg == fs->nactvar); -} - - -static void leaveblock (FuncState *fs) { - BlockCnt *bl = fs->bl; - fs->bl = bl->previous; - removevars(fs->ls, bl->nactvar); - if (bl->upval) - luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); - lua_assert(bl->nactvar == fs->nactvar); - fs->freereg = fs->nactvar; /* free registers */ - luaK_patchtohere(fs, bl->breaklist); -} - - -static void pushclosure (LexState *ls, FuncState *func, expdesc *v) { - FuncState *fs = ls->fs; - Proto *f = fs->f; - int i; - luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, - MAXARG_Bx, "constant table overflow"); - f->p[fs->np++] = func->f; - init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np-1)); - for (i=0; if->nups; i++) { - OpCode o = (func->upvalues[i].k == VLOCAL) ? OP_MOVE : OP_GETUPVAL; - luaK_codeABC(fs, o, 0, func->upvalues[i].info, 0); - } -} - - -static void open_func (LexState *ls, FuncState *fs) { - Proto *f = luaF_newproto(ls->L); - fs->f = f; - fs->prev = ls->fs; /* linked list of funcstates */ - fs->ls = ls; - fs->L = ls->L; - ls->fs = fs; - fs->pc = 0; - fs->lasttarget = 0; - fs->jpc = NO_JUMP; - fs->freereg = 0; - fs->nk = 0; - fs->h = luaH_new(ls->L, 0, 0); - fs->np = 0; - fs->nlocvars = 0; - fs->nactvar = 0; - fs->bl = NULL; - f->source = ls->source; - f->maxstacksize = 2; /* registers 0/1 are always valid */ -} - - -static void close_func (LexState *ls) { - lua_State *L = ls->L; - FuncState *fs = ls->fs; - Proto *f = fs->f; - removevars(ls, 0); - luaK_codeABC(fs, OP_RETURN, 0, 1, 0); /* final return */ - luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction); - f->sizecode = fs->pc; - luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int); - f->sizelineinfo = fs->pc; - luaM_reallocvector(L, f->k, f->sizek, fs->nk, TObject); - f->sizek = fs->nk; - luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *); - f->sizep = fs->np; - luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar); - f->sizelocvars = fs->nlocvars; - luaM_reallocvector(L, f->upvalues, f->sizeupvalues, f->nups, TString *); - f->sizeupvalues = f->nups; - lua_assert(luaG_checkcode(f)); - lua_assert(fs->bl == NULL); - ls->fs = fs->prev; -} - - -Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff) { - struct LexState lexstate; - struct FuncState funcstate; - lexstate.buff = buff; - lexstate.nestlevel = 0; - luaX_setinput(L, &lexstate, z, luaS_new(L, zname(z))); - open_func(&lexstate, &funcstate); - next(&lexstate); /* read first token */ - chunk(&lexstate); - check_condition(&lexstate, (lexstate.t.token == TK_EOS), " expected"); - close_func(&lexstate); - lua_assert(funcstate.prev == NULL); - lua_assert(funcstate.f->nups == 0); - lua_assert(lexstate.nestlevel == 0); - return funcstate.f; -} - - - -/*============================================================*/ -/* GRAMMAR RULES */ -/*============================================================*/ - - -static void luaY_field (LexState *ls, expdesc *v) { - /* field -> ['.' | ':'] NAME */ - FuncState *fs = ls->fs; - expdesc key; - luaK_exp2anyreg(fs, v); - next(ls); /* skip the dot or colon */ - checkname(ls, &key); - luaK_indexed(fs, v, &key); -} - - -static void luaY_index (LexState *ls, expdesc *v) { - /* index -> '[' expr ']' */ - next(ls); /* skip the '[' */ - expr(ls, v); - luaK_exp2val(ls->fs, v); - check(ls, ']'); -} - - -/* -** {====================================================================== -** Rules for Constructors -** ======================================================================= -*/ - - -struct ConsControl { - expdesc v; /* last list item read */ - expdesc *t; /* table descriptor */ - int nh; /* total number of `record' elements */ - int na; /* total number of array elements */ - int tostore; /* number of array elements pending to be stored */ -}; - - -static void recfield (LexState *ls, struct ConsControl *cc) { - /* recfield -> (NAME | `['exp1`]') = exp1 */ - FuncState *fs = ls->fs; - int reg = ls->fs->freereg; - expdesc key, val; - if (ls->t.token == TK_NAME) { - luaX_checklimit(ls, cc->nh, MAX_INT, "items in a constructor"); - cc->nh++; - checkname(ls, &key); - } - else /* ls->t.token == '[' */ - luaY_index(ls, &key); - check(ls, '='); - luaK_exp2RK(fs, &key); - expr(ls, &val); - luaK_codeABC(fs, OP_SETTABLE, cc->t->info, luaK_exp2RK(fs, &key), - luaK_exp2RK(fs, &val)); - fs->freereg = reg; /* free registers */ -} - - -static void closelistfield (FuncState *fs, struct ConsControl *cc) { - if (cc->v.k == VVOID) return; /* there is no list item */ - luaK_exp2nextreg(fs, &cc->v); - cc->v.k = VVOID; - if (cc->tostore == LFIELDS_PER_FLUSH) { - luaK_codeABx(fs, OP_SETLIST, cc->t->info, cc->na-1); /* flush */ - cc->tostore = 0; /* no more items pending */ - fs->freereg = cc->t->info + 1; /* free registers */ - } -} - - -static void lastlistfield (FuncState *fs, struct ConsControl *cc) { - if (cc->tostore == 0) return; - if (cc->v.k == VCALL) { - luaK_setcallreturns(fs, &cc->v, LUA_MULTRET); - luaK_codeABx(fs, OP_SETLISTO, cc->t->info, cc->na-1); - } - else { - if (cc->v.k != VVOID) - luaK_exp2nextreg(fs, &cc->v); - luaK_codeABx(fs, OP_SETLIST, cc->t->info, cc->na-1); - } - fs->freereg = cc->t->info + 1; /* free registers */ -} - - -static void listfield (LexState *ls, struct ConsControl *cc) { - expr(ls, &cc->v); - luaX_checklimit(ls, cc->na, MAXARG_Bx, "items in a constructor"); - cc->na++; - cc->tostore++; -} - - -static void constructor (LexState *ls, expdesc *t) { - /* constructor -> ?? */ - FuncState *fs = ls->fs; - int line = ls->linenumber; - int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0); - struct ConsControl cc; - cc.na = cc.nh = cc.tostore = 0; - cc.t = t; - init_exp(t, VRELOCABLE, pc); - init_exp(&cc.v, VVOID, 0); /* no value (yet) */ - luaK_exp2nextreg(ls->fs, t); /* fix it at stack top (for gc) */ - check(ls, '{'); - do { - lua_assert(cc.v.k == VVOID || cc.tostore > 0); - testnext(ls, ';'); /* compatibility only */ - if (ls->t.token == '}') break; - closelistfield(fs, &cc); - switch(ls->t.token) { - case TK_NAME: { /* may be listfields or recfields */ - lookahead(ls); - if (ls->lookahead.token != '=') /* expression? */ - listfield(ls, &cc); - else - recfield(ls, &cc); - break; - } - case '[': { /* constructor_item -> recfield */ - recfield(ls, &cc); - break; - } - default: { /* constructor_part -> listfield */ - listfield(ls, &cc); - break; - } - } - } while (testnext(ls, ',') || testnext(ls, ';')); - check_match(ls, '}', '{', line); - lastlistfield(fs, &cc); - SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */ - SETARG_C(fs->f->code[pc], luaO_log2(cc.nh)+1); /* set initial table size */ -} - -/* }====================================================================== */ - - - -static void parlist (LexState *ls) { - /* parlist -> [ param { `,' param } ] */ - int nparams = 0; - int dots = 0; - if (ls->t.token != ')') { /* is `parlist' not empty? */ - do { - switch (ls->t.token) { - case TK_DOTS: dots = 1; next(ls); break; - case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break; - default: luaX_syntaxerror(ls, " or `...' expected"); - } - } while (!dots && testnext(ls, ',')); - } - code_params(ls, nparams, dots); -} - - -static void body (LexState *ls, expdesc *e, int needself, int line) { - /* body -> `(' parlist `)' chunk END */ - FuncState new_fs; - open_func(ls, &new_fs); - new_fs.f->lineDefined = line; - check(ls, '('); - if (needself) - create_local(ls, "self"); - parlist(ls); - check(ls, ')'); - chunk(ls); - check_match(ls, TK_END, TK_FUNCTION, line); - close_func(ls); - pushclosure(ls, &new_fs, e); -} - - -static int explist1 (LexState *ls, expdesc *v) { - /* explist1 -> expr { `,' expr } */ - int n = 1; /* at least one expression */ - expr(ls, v); - while (testnext(ls, ',')) { - luaK_exp2nextreg(ls->fs, v); - expr(ls, v); - n++; - } - return n; -} - - -static void funcargs (LexState *ls, expdesc *f) { - FuncState *fs = ls->fs; - expdesc args; - int base, nparams; - int line = ls->linenumber; - switch (ls->t.token) { - case '(': { /* funcargs -> `(' [ explist1 ] `)' */ - if (line != ls->lastline) - luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); - next(ls); - if (ls->t.token == ')') /* arg list is empty? */ - args.k = VVOID; - else { - explist1(ls, &args); - luaK_setcallreturns(fs, &args, LUA_MULTRET); - } - check_match(ls, ')', '(', line); - break; - } - case '{': { /* funcargs -> constructor */ - constructor(ls, &args); - break; - } - case TK_STRING: { /* funcargs -> STRING */ - codestring(ls, &args, ls->t.seminfo.ts); - next(ls); /* must use `seminfo' before `next' */ - break; - } - default: { - luaX_syntaxerror(ls, "function arguments expected"); - return; - } - } - lua_assert(f->k == VNONRELOC); - base = f->info; /* base register for call */ - if (args.k == VCALL) - nparams = LUA_MULTRET; /* open call */ - else { - if (args.k != VVOID) - luaK_exp2nextreg(fs, &args); /* close last argument */ - nparams = fs->freereg - (base+1); - } - init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2)); - luaK_fixline(fs, line); - fs->freereg = base+1; /* call remove function and arguments and leaves - (unless changed) one result */ -} - - - - -/* -** {====================================================================== -** Expression parsing -** ======================================================================= -*/ - - -static void prefixexp (LexState *ls, expdesc *v) { - /* prefixexp -> NAME | '(' expr ')' */ - switch (ls->t.token) { - case '(': { - int line = ls->linenumber; - next(ls); - expr(ls, v); - check_match(ls, ')', '(', line); - luaK_dischargevars(ls->fs, v); - return; - } - case TK_NAME: { - singlevar(ls, v, 1); - return; - } -#ifdef LUA_COMPATUPSYNTAX - case '%': { /* for compatibility only */ - TString *varname; - int line = ls->linenumber; - next(ls); /* skip `%' */ - varname = singlevar(ls, v, 1); - if (v->k != VUPVAL) - luaX_errorline(ls, "global upvalues are obsolete", - getstr(varname), line); - return; - } -#endif - default: { - luaX_syntaxerror(ls, "unexpected symbol"); - return; - } - } -} - - -static void primaryexp (LexState *ls, expdesc *v) { - /* primaryexp -> - prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */ - FuncState *fs = ls->fs; - prefixexp(ls, v); - for (;;) { - switch (ls->t.token) { - case '.': { /* field */ - luaY_field(ls, v); - break; - } - case '[': { /* `[' exp1 `]' */ - expdesc key; - luaK_exp2anyreg(fs, v); - luaY_index(ls, &key); - luaK_indexed(fs, v, &key); - break; - } - case ':': { /* `:' NAME funcargs */ - expdesc key; - next(ls); - checkname(ls, &key); - luaK_self(fs, v, &key); - funcargs(ls, v); - break; - } - case '(': case TK_STRING: case '{': { /* funcargs */ - luaK_exp2nextreg(fs, v); - funcargs(ls, v); - break; - } - default: return; - } - } -} - - -static void simpleexp (LexState *ls, expdesc *v) { - /* simpleexp -> NUMBER | STRING | NIL | constructor | FUNCTION body - | primaryexp */ - switch (ls->t.token) { - case TK_NUMBER: { - init_exp(v, VK, luaK_numberK(ls->fs, ls->t.seminfo.r)); - next(ls); /* must use `seminfo' before `next' */ - break; - } - case TK_STRING: { - codestring(ls, v, ls->t.seminfo.ts); - next(ls); /* must use `seminfo' before `next' */ - break; - } - case TK_NIL: { - init_exp(v, VNIL, 0); - next(ls); - break; - } - case TK_TRUE: { - init_exp(v, VTRUE, 0); - next(ls); - break; - } - case TK_FALSE: { - init_exp(v, VFALSE, 0); - next(ls); - break; - } - case '{': { /* constructor */ - constructor(ls, v); - break; - } - case TK_FUNCTION: { - next(ls); - body(ls, v, 0, ls->linenumber); - break; - } - default: { - primaryexp(ls, v); - break; - } - } -} - - -static UnOpr getunopr (int op) { - switch (op) { - case TK_NOT: return OPR_NOT; - case '-': return OPR_MINUS; - default: return OPR_NOUNOPR; - } -} - - -static BinOpr getbinopr (int op) { - switch (op) { - case '+': return OPR_ADD; - case '-': return OPR_SUB; - case '*': return OPR_MULT; - case '/': return OPR_DIV; - case '^': return OPR_POW; - case TK_CONCAT: return OPR_CONCAT; - case TK_NE: return OPR_NE; - case TK_EQ: return OPR_EQ; - case '<': return OPR_LT; - case TK_LE: return OPR_LE; - case '>': return OPR_GT; - case TK_GE: return OPR_GE; - case TK_AND: return OPR_AND; - case TK_OR: return OPR_OR; - default: return OPR_NOBINOPR; - } -} - - -static const struct { - lu_byte left; /* left priority for each binary operator */ - lu_byte right; /* right priority */ -} priority[] = { /* ORDER OPR */ - {6, 6}, {6, 6}, {7, 7}, {7, 7}, /* arithmetic */ - {10, 9}, {5, 4}, /* power and concat (right associative) */ - {3, 3}, {3, 3}, /* equality */ - {3, 3}, {3, 3}, {3, 3}, {3, 3}, /* order */ - {2, 2}, {1, 1} /* logical (and/or) */ -}; - -#define UNARY_PRIORITY 8 /* priority for unary operators */ - - -/* -** subexpr -> (simplexep | unop subexpr) { binop subexpr } -** where `binop' is any binary operator with a priority higher than `limit' -*/ -static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { - BinOpr op; - UnOpr uop; - enterlevel(ls); - uop = getunopr(ls->t.token); - if (uop != OPR_NOUNOPR) { - next(ls); - subexpr(ls, v, UNARY_PRIORITY); - luaK_prefix(ls->fs, uop, v); - } - else simpleexp(ls, v); - /* expand while operators have priorities higher than `limit' */ - op = getbinopr(ls->t.token); - while (op != OPR_NOBINOPR && cast(int, priority[op].left) > limit) { - expdesc v2; - BinOpr nextop; - next(ls); - luaK_infix(ls->fs, op, v); - /* read sub-expression with higher priority */ - nextop = subexpr(ls, &v2, cast(int, priority[op].right)); - luaK_posfix(ls->fs, op, v, &v2); - op = nextop; - } - leavelevel(ls); - return op; /* return first untreated operator */ -} - - -static void expr (LexState *ls, expdesc *v) { - subexpr(ls, v, -1); -} - -/* }==================================================================== */ - - - -/* -** {====================================================================== -** Rules for Statements -** ======================================================================= -*/ - - -static int block_follow (int token) { - switch (token) { - case TK_ELSE: case TK_ELSEIF: case TK_END: - case TK_UNTIL: case TK_EOS: - return 1; - default: return 0; - } -} - - -static void block (LexState *ls) { - /* block -> chunk */ - FuncState *fs = ls->fs; - BlockCnt bl; - enterblock(fs, &bl, 0); - chunk(ls); - lua_assert(bl.breaklist == NO_JUMP); - leaveblock(fs); -} - - -/* -** structure to chain all variables in the left-hand side of an -** assignment -*/ -struct LHS_assign { - struct LHS_assign *prev; - expdesc v; /* variable (global, local, upvalue, or indexed) */ -}; - - -/* -** check whether, in an assignment to a local variable, the local variable -** is needed in a previous assignment (to a table). If so, save original -** local value in a safe place and use this safe copy in the previous -** assignment. -*/ -static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { - FuncState *fs = ls->fs; - int extra = fs->freereg; /* eventual position to save local variable */ - int conflict = 0; - for (; lh; lh = lh->prev) { - if (lh->v.k == VINDEXED) { - if (lh->v.info == v->info) { /* conflict? */ - conflict = 1; - lh->v.info = extra; /* previous assignment will use safe copy */ - } - if (lh->v.aux == v->info) { /* conflict? */ - conflict = 1; - lh->v.aux = extra; /* previous assignment will use safe copy */ - } - } - } - if (conflict) { - luaK_codeABC(fs, OP_MOVE, fs->freereg, v->info, 0); /* make copy */ - luaK_reserveregs(fs, 1); - } -} - - -static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { - expdesc e; - check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, - "syntax error"); - if (testnext(ls, ',')) { /* assignment -> `,' primaryexp assignment */ - struct LHS_assign nv; - nv.prev = lh; - primaryexp(ls, &nv.v); - if (nv.v.k == VLOCAL) - check_conflict(ls, lh, &nv.v); - assignment(ls, &nv, nvars+1); - } - else { /* assignment -> `=' explist1 */ - int nexps; - check(ls, '='); - nexps = explist1(ls, &e); - if (nexps != nvars) { - adjust_assign(ls, nvars, nexps, &e); - if (nexps > nvars) - ls->fs->freereg -= nexps - nvars; /* remove extra values */ - } - else { - luaK_setcallreturns(ls->fs, &e, 1); /* close last expression */ - luaK_storevar(ls->fs, &lh->v, &e); - return; /* avoid default */ - } - } - init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ - luaK_storevar(ls->fs, &lh->v, &e); -} - - -static void cond (LexState *ls, expdesc *v) { - /* cond -> exp */ - expr(ls, v); /* read condition */ - if (v->k == VNIL) v->k = VFALSE; /* `falses' are all equal here */ - luaK_goiftrue(ls->fs, v); - luaK_patchtohere(ls->fs, v->t); -} - - -/* -** The while statement optimizes its code by coding the condition -** after its body (and thus avoiding one jump in the loop). -*/ - -/* -** maximum size of expressions for optimizing `while' code -*/ -#ifndef MAXEXPWHILE -#define MAXEXPWHILE 100 -#endif - -/* -** the call `luaK_goiffalse' may grow the size of an expression by -** at most this: -*/ -#define EXTRAEXP 5 - -static void whilestat (LexState *ls, int line) { - /* whilestat -> WHILE cond DO block END */ - Instruction codeexp[MAXEXPWHILE + EXTRAEXP]; - int lineexp; - int i; - int sizeexp; - FuncState *fs = ls->fs; - int whileinit, blockinit, expinit; - expdesc v; - BlockCnt bl; - next(ls); /* skip WHILE */ - whileinit = luaK_jump(fs); /* jump to condition (which will be moved) */ - expinit = luaK_getlabel(fs); - expr(ls, &v); /* parse condition */ - if (v.k == VK) v.k = VTRUE; /* `trues' are all equal here */ - lineexp = ls->linenumber; - luaK_goiffalse(fs, &v); - luaK_concat(fs, &v.f, fs->jpc); - fs->jpc = NO_JUMP; - sizeexp = fs->pc - expinit; /* size of expression code */ - if (sizeexp > MAXEXPWHILE) - luaX_syntaxerror(ls, "`while' condition too complex"); - for (i = 0; i < sizeexp; i++) /* save `exp' code */ - codeexp[i] = fs->f->code[expinit + i]; - fs->pc = expinit; /* remove `exp' code */ - enterblock(fs, &bl, 1); - check(ls, TK_DO); - blockinit = luaK_getlabel(fs); - block(ls); - luaK_patchtohere(fs, whileinit); /* initial jump jumps to here */ - /* move `exp' back to code */ - if (v.t != NO_JUMP) v.t += fs->pc - expinit; - if (v.f != NO_JUMP) v.f += fs->pc - expinit; - for (i=0; i REPEAT block UNTIL cond */ - FuncState *fs = ls->fs; - int repeat_init = luaK_getlabel(fs); - expdesc v; - BlockCnt bl; - enterblock(fs, &bl, 1); - next(ls); - block(ls); - check_match(ls, TK_UNTIL, TK_REPEAT, line); - cond(ls, &v); - luaK_patchlist(fs, v.f, repeat_init); - leaveblock(fs); -} - - -static int exp1 (LexState *ls) { - expdesc e; - int k; - expr(ls, &e); - k = e.k; - luaK_exp2nextreg(ls->fs, &e); - return k; -} - - -static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { - BlockCnt bl; - FuncState *fs = ls->fs; - int prep, endfor; - adjustlocalvars(ls, nvars); /* scope for all variables */ - check(ls, TK_DO); - enterblock(fs, &bl, 1); /* loop block */ - prep = luaK_getlabel(fs); - block(ls); - luaK_patchtohere(fs, prep-1); - endfor = (isnum) ? luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP) : - luaK_codeABC(fs, OP_TFORLOOP, base, 0, nvars - 3); - luaK_fixline(fs, line); /* pretend that `OP_FOR' starts the loop */ - luaK_patchlist(fs, (isnum) ? endfor : luaK_jump(fs), prep); - leaveblock(fs); -} - - -static void fornum (LexState *ls, TString *varname, int line) { - /* fornum -> NAME = exp1,exp1[,exp1] DO body */ - FuncState *fs = ls->fs; - int base = fs->freereg; - new_localvar(ls, varname, 0); - new_localvarstr(ls, "(for limit)", 1); - new_localvarstr(ls, "(for step)", 2); - check(ls, '='); - exp1(ls); /* initial value */ - check(ls, ','); - exp1(ls); /* limit */ - if (testnext(ls, ',')) - exp1(ls); /* optional step */ - else { /* default step = 1 */ - luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1)); - luaK_reserveregs(fs, 1); - } - luaK_codeABC(fs, OP_SUB, fs->freereg - 3, fs->freereg - 3, fs->freereg - 1); - luaK_jump(fs); - forbody(ls, base, line, 3, 1); -} - - -static void forlist (LexState *ls, TString *indexname) { - /* forlist -> NAME {,NAME} IN explist1 DO body */ - FuncState *fs = ls->fs; - expdesc e; - int nvars = 0; - int line; - int base = fs->freereg; - new_localvarstr(ls, "(for generator)", nvars++); - new_localvarstr(ls, "(for state)", nvars++); - new_localvar(ls, indexname, nvars++); - while (testnext(ls, ',')) - new_localvar(ls, str_checkname(ls), nvars++); - check(ls, TK_IN); - line = ls->linenumber; - adjust_assign(ls, nvars, explist1(ls, &e), &e); - luaK_checkstack(fs, 3); /* extra space to call generator */ - luaK_codeAsBx(fs, OP_TFORPREP, base, NO_JUMP); - forbody(ls, base, line, nvars, 0); -} - - -static void forstat (LexState *ls, int line) { - /* forstat -> fornum | forlist */ - FuncState *fs = ls->fs; - TString *varname; - BlockCnt bl; - enterblock(fs, &bl, 0); /* block to control variable scope */ - next(ls); /* skip `for' */ - varname = str_checkname(ls); /* first variable name */ - switch (ls->t.token) { - case '=': fornum(ls, varname, line); break; - case ',': case TK_IN: forlist(ls, varname); break; - default: luaX_syntaxerror(ls, "`=' or `in' expected"); - } - check_match(ls, TK_END, TK_FOR, line); - leaveblock(fs); -} - - -static void test_then_block (LexState *ls, expdesc *v) { - /* test_then_block -> [IF | ELSEIF] cond THEN block */ - next(ls); /* skip IF or ELSEIF */ - cond(ls, v); - check(ls, TK_THEN); - block(ls); /* `then' part */ -} - - -static void ifstat (LexState *ls, int line) { - /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */ - FuncState *fs = ls->fs; - expdesc v; - int escapelist = NO_JUMP; - test_then_block(ls, &v); /* IF cond THEN block */ - while (ls->t.token == TK_ELSEIF) { - luaK_concat(fs, &escapelist, luaK_jump(fs)); - luaK_patchtohere(fs, v.f); - test_then_block(ls, &v); /* ELSEIF cond THEN block */ - } - if (ls->t.token == TK_ELSE) { - luaK_concat(fs, &escapelist, luaK_jump(fs)); - luaK_patchtohere(fs, v.f); - next(ls); /* skip ELSE (after patch, for correct line info) */ - block(ls); /* `else' part */ - } - else - luaK_concat(fs, &escapelist, v.f); - luaK_patchtohere(fs, escapelist); - check_match(ls, TK_END, TK_IF, line); -} - - -static void localfunc (LexState *ls) { - expdesc v, b; - new_localvar(ls, str_checkname(ls), 0); - init_exp(&v, VLOCAL, ls->fs->freereg++); - adjustlocalvars(ls, 1); - body(ls, &b, 0, ls->linenumber); - luaK_storevar(ls->fs, &v, &b); -} - - -static void localstat (LexState *ls) { - /* stat -> LOCAL NAME {`,' NAME} [`=' explist1] */ - int nvars = 0; - int nexps; - expdesc e; - do { - new_localvar(ls, str_checkname(ls), nvars++); - } while (testnext(ls, ',')); - if (testnext(ls, '=')) - nexps = explist1(ls, &e); - else { - e.k = VVOID; - nexps = 0; - } - adjust_assign(ls, nvars, nexps, &e); - adjustlocalvars(ls, nvars); -} - - -static int funcname (LexState *ls, expdesc *v) { - /* funcname -> NAME {field} [`:' NAME] */ - int needself = 0; - singlevar(ls, v, 1); - while (ls->t.token == '.') - luaY_field(ls, v); - if (ls->t.token == ':') { - needself = 1; - luaY_field(ls, v); - } - return needself; -} - - -static void funcstat (LexState *ls, int line) { - /* funcstat -> FUNCTION funcname body */ - int needself; - expdesc v, b; - next(ls); /* skip FUNCTION */ - needself = funcname(ls, &v); - body(ls, &b, needself, line); - luaK_storevar(ls->fs, &v, &b); - luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ -} - - -static void exprstat (LexState *ls) { - /* stat -> func | assignment */ - FuncState *fs = ls->fs; - struct LHS_assign v; - primaryexp(ls, &v.v); - if (v.v.k == VCALL) { /* stat -> func */ - luaK_setcallreturns(fs, &v.v, 0); /* call statement uses no results */ - } - else { /* stat -> assignment */ - v.prev = NULL; - assignment(ls, &v, 1); - } -} - - -static void retstat (LexState *ls) { - /* stat -> RETURN explist */ - FuncState *fs = ls->fs; - expdesc e; - int first, nret; /* registers with returned values */ - next(ls); /* skip RETURN */ - if (block_follow(ls->t.token) || ls->t.token == ';') - first = nret = 0; /* return no values */ - else { - nret = explist1(ls, &e); /* optional return values */ - if (e.k == VCALL) { - luaK_setcallreturns(fs, &e, LUA_MULTRET); - if (nret == 1) { /* tail call? */ - SET_OPCODE(getcode(fs,&e), OP_TAILCALL); - lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar); - } - first = fs->nactvar; - nret = LUA_MULTRET; /* return all values */ - } - else { - if (nret == 1) /* only one single value? */ - first = luaK_exp2anyreg(fs, &e); - else { - luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */ - first = fs->nactvar; /* return all `active' values */ - lua_assert(nret == fs->freereg - first); - } - } - } - luaK_codeABC(fs, OP_RETURN, first, nret+1, 0); -} - - -static void breakstat (LexState *ls) { - /* stat -> BREAK [NAME] */ - FuncState *fs = ls->fs; - BlockCnt *bl = fs->bl; - int upval = 0; - next(ls); /* skip BREAK */ - while (bl && !bl->isbreakable) { - upval |= bl->upval; - bl = bl->previous; - } - if (!bl) - luaX_syntaxerror(ls, "no loop to break"); - if (upval) - luaK_codeABC(fs, OP_CLOSE, bl->nactvar, 0, 0); - luaK_concat(fs, &bl->breaklist, luaK_jump(fs)); -} - - -static int statement (LexState *ls) { - int line = ls->linenumber; /* may be needed for error messages */ - switch (ls->t.token) { - case TK_IF: { /* stat -> ifstat */ - ifstat(ls, line); - return 0; - } - case TK_WHILE: { /* stat -> whilestat */ - whilestat(ls, line); - return 0; - } - case TK_DO: { /* stat -> DO block END */ - next(ls); /* skip DO */ - block(ls); - check_match(ls, TK_END, TK_DO, line); - return 0; - } - case TK_FOR: { /* stat -> forstat */ - forstat(ls, line); - return 0; - } - case TK_REPEAT: { /* stat -> repeatstat */ - repeatstat(ls, line); - return 0; - } - case TK_FUNCTION: { - funcstat(ls, line); /* stat -> funcstat */ - return 0; - } - case TK_LOCAL: { /* stat -> localstat */ - next(ls); /* skip LOCAL */ - if (testnext(ls, TK_FUNCTION)) /* local function? */ - localfunc(ls); - else - localstat(ls); - return 0; - } - case TK_RETURN: { /* stat -> retstat */ - retstat(ls); - return 1; /* must be last statement */ - } - case TK_BREAK: { /* stat -> breakstat */ - breakstat(ls); - return 1; /* must be last statement */ - } - default: { - exprstat(ls); - return 0; /* to avoid warnings */ - } - } -} - - -static void chunk (LexState *ls) { - /* chunk -> { stat [`;'] } */ - int islast = 0; - enterlevel(ls); - while (!islast && !block_follow(ls->t.token)) { - islast = statement(ls); - testnext(ls, ';'); - lua_assert(ls->fs->freereg >= ls->fs->nactvar); - ls->fs->freereg = ls->fs->nactvar; /* free registers */ - } - leavelevel(ls); -} - -/* }====================================================================== */ diff --git a/plugins/SmartAutoReplier/lualib/lparser.h b/plugins/SmartAutoReplier/lualib/lparser.h deleted file mode 100644 index d6aaaf0e7d..0000000000 --- a/plugins/SmartAutoReplier/lualib/lparser.h +++ /dev/null @@ -1,71 +0,0 @@ -/* -** $Id: lparser.h,v 1.47 2003/02/11 10:46:24 roberto Exp $ -** Lua Parser -** See Copyright Notice in lua.h -*/ - -#ifndef lparser_h -#define lparser_h - -#include "llimits.h" -#include "lobject.h" -#include "ltable.h" -#include "lzio.h" - - -/* -** Expression descriptor -*/ - -typedef enum { - VVOID, /* no value */ - VNIL, - VTRUE, - VFALSE, - VK, /* info = index of constant in `k' */ - VLOCAL, /* info = local register */ - VUPVAL, /* info = index of upvalue in `upvalues' */ - VGLOBAL, /* info = index of table; aux = index of global name in `k' */ - VINDEXED, /* info = table register; aux = index register (or `k') */ - VJMP, /* info = instruction pc */ - VRELOCABLE, /* info = instruction pc */ - VNONRELOC, /* info = result register */ - VCALL /* info = result register */ -} expkind; - -typedef struct expdesc { - expkind k; - int info, aux; - int t; /* patch list of `exit when true' */ - int f; /* patch list of `exit when false' */ -} expdesc; - - -struct BlockCnt; /* defined in lparser.c */ - - -/* state needed to generate code for a given function */ -typedef struct FuncState { - Proto *f; /* current function header */ - Table *h; /* table to find (and reuse) elements in `k' */ - struct FuncState *prev; /* enclosing function */ - struct LexState *ls; /* lexical state */ - struct lua_State *L; /* copy of the Lua state */ - struct BlockCnt *bl; /* chain of current blocks */ - int pc; /* next position to code (equivalent to `ncode') */ - int lasttarget; /* `pc' of last `jump target' */ - int jpc; /* list of pending jumps to `pc' */ - int freereg; /* first free register */ - int nk; /* number of elements in `k' */ - int np; /* number of elements in `p' */ - int nlocvars; /* number of elements in `locvars' */ - int nactvar; /* number of active local variables */ - expdesc upvalues[MAXUPVALUES]; /* upvalues */ - int actvar[MAXVARS]; /* declared-variable stack */ -} FuncState; - - -Proto *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lstate.c b/plugins/SmartAutoReplier/lualib/lstate.c deleted file mode 100644 index b593658def..0000000000 --- a/plugins/SmartAutoReplier/lualib/lstate.c +++ /dev/null @@ -1,220 +0,0 @@ -/* -** $Id: lstate.c,v 1.123 2003/04/03 13:35:34 roberto Exp $ -** Global State -** See Copyright Notice in lua.h -*/ - - -#include - -#define lstate_c - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "llex.h" -#include "lmem.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - -/* -** macro to allow the inclusion of user information in Lua state -*/ -#ifndef LUA_USERSTATE -#define EXTRASPACE 0 -#else -union UEXTRASPACE {L_Umaxalign a; LUA_USERSTATE b;}; -#define EXTRASPACE (sizeof(union UEXTRASPACE)) -#endif - - - -/* -** you can change this function through the official API: -** call `lua_setpanicf' -*/ -static int default_panic (lua_State *L) { - UNUSED(L); - return 0; -} - - -static lua_State *mallocstate (lua_State *L) { - lu_byte *block = (lu_byte *)luaM_malloc(L, sizeof(lua_State) + EXTRASPACE); - if (block == NULL) return NULL; - else { - block += EXTRASPACE; - return cast(lua_State *, block); - } -} - - -static void freestate (lua_State *L, lua_State *L1) { - luaM_free(L, cast(lu_byte *, L1) - EXTRASPACE, - sizeof(lua_State) + EXTRASPACE); -} - - -static void stack_init (lua_State *L1, lua_State *L) { - L1->stack = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, TObject); - L1->stacksize = BASIC_STACK_SIZE + EXTRA_STACK; - L1->top = L1->stack; - L1->stack_last = L1->stack+(L1->stacksize - EXTRA_STACK)-1; - L1->base_ci = luaM_newvector(L, BASIC_CI_SIZE, CallInfo); - L1->ci = L1->base_ci; - L1->ci->state = CI_C; /* not a Lua function */ - setnilvalue(L1->top++); /* `function' entry for this `ci' */ - L1->base = L1->ci->base = L1->top; - L1->ci->top = L1->top + LUA_MINSTACK; - L1->size_ci = BASIC_CI_SIZE; - L1->end_ci = L1->base_ci + L1->size_ci; -} - - -static void freestack (lua_State *L, lua_State *L1) { - luaM_freearray(L, L1->base_ci, L1->size_ci, CallInfo); - luaM_freearray(L, L1->stack, L1->stacksize, TObject); -} - - -/* -** open parts that may cause memory-allocation errors -*/ -static void f_luaopen (lua_State *L, void *ud) { - /* create a new global state */ - global_State *g = luaM_new(NULL, global_State); - UNUSED(ud); - if (g == NULL) luaD_throw(L, LUA_ERRMEM); - L->l_G = g; - g->mainthread = L; - g->GCthreshold = 0; /* mark it as unfinished state */ - g->strt.size = 0; - g->strt.nuse = 0; - g->strt.hash = NULL; - setnilvalue(defaultmeta(L)); - setnilvalue(registry(L)); - luaZ_initbuffer(L, &g->buff); - g->panic = default_panic; - g->rootgc = NULL; - g->rootudata = NULL; - g->tmudata = NULL; - setnilvalue(gkey(g->dummynode)); - setnilvalue(gval(g->dummynode)); - g->dummynode->next = NULL; - g->nblocks = sizeof(lua_State) + sizeof(global_State); - stack_init(L, L); /* init stack */ - /* create default meta table with a dummy table, and then close the loop */ - defaultmeta(L)->tt = LUA_TTABLE; - sethvalue(defaultmeta(L), luaH_new(L, 0, 0)); - hvalue(defaultmeta(L))->metatable = hvalue(defaultmeta(L)); - sethvalue(gt(L), luaH_new(L, 0, 4)); /* table of globals */ - sethvalue(registry(L), luaH_new(L, 4, 4)); /* registry */ - luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ - luaT_init(L); - luaX_init(L); - luaS_fix(luaS_newliteral(L, MEMERRMSG)); - g->GCthreshold = 4*G(L)->nblocks; -} - - -static void preinit_state (lua_State *L) { - L->stack = NULL; - L->stacksize = 0; - L->errorJmp = NULL; - L->hook = NULL; - L->hookmask = L->hookinit = 0; - L->basehookcount = 0; - L->allowhook = 1; - resethookcount(L); - L->openupval = NULL; - L->size_ci = 0; - L->nCcalls = 0; - L->base_ci = L->ci = NULL; - L->errfunc = 0; - setnilvalue(gt(L)); -} - - -static void close_state (lua_State *L) { - luaF_close(L, L->stack); /* close all upvalues for this thread */ - if (G(L)) { /* close global state */ - luaC_sweep(L, 1); /* collect all elements */ - lua_assert(G(L)->rootgc == NULL); - lua_assert(G(L)->rootudata == NULL); - luaS_freeall(L); - luaZ_freebuffer(L, &G(L)->buff); - } - freestack(L, L); - if (G(L)) { - lua_assert(G(L)->nblocks == sizeof(lua_State) + sizeof(global_State)); - luaM_freelem(NULL, G(L)); - } - freestate(NULL, L); -} - - -lua_State *luaE_newthread (lua_State *L) { - lua_State *L1 = mallocstate(L); - luaC_link(L, valtogco(L1), LUA_TTHREAD); - preinit_state(L1); - L1->l_G = L->l_G; - stack_init(L1, L); /* init stack */ - setobj2n(gt(L1), gt(L)); /* share table of globals */ - return L1; -} - - -void luaE_freethread (lua_State *L, lua_State *L1) { - luaF_close(L1, L1->stack); /* close all upvalues for this thread */ - lua_assert(L1->openupval == NULL); - freestack(L, L1); - freestate(L, L1); -} - - -LUA_API lua_State *lua_open (void) { - lua_State *L = mallocstate(NULL); - if (L) { /* allocation OK? */ - L->tt = LUA_TTHREAD; - L->marked = 0; - L->next = L->gclist = NULL; - preinit_state(L); - L->l_G = NULL; - if (luaD_rawrunprotected(L, f_luaopen, NULL) != 0) { - /* memory allocation error: free partial state */ - close_state(L); - L = NULL; - } - } - lua_userstateopen(L); - return L; -} - - -static void callallgcTM (lua_State *L, void *ud) { - UNUSED(ud); - luaC_callGCTM(L); /* call GC metamethods for all udata */ -} - - -LUA_API void lua_close (lua_State *L) { - lua_lock(L); - L = G(L)->mainthread; /* only the main thread can be closed */ - luaF_close(L, L->stack); /* close all upvalues for this thread */ - luaC_separateudata(L); /* separate udata that have GC metamethods */ - L->errfunc = 0; /* no error function during GC metamethods */ - do { /* repeat until no more errors */ - L->ci = L->base_ci; - L->base = L->top = L->ci->base; - L->nCcalls = 0; - } while (luaD_rawrunprotected(L, callallgcTM, NULL) != 0); - lua_assert(G(L)->tmudata == NULL); - close_state(L); -} - diff --git a/plugins/SmartAutoReplier/lualib/lstate.h b/plugins/SmartAutoReplier/lualib/lstate.h deleted file mode 100644 index 5422f1b196..0000000000 --- a/plugins/SmartAutoReplier/lualib/lstate.h +++ /dev/null @@ -1,195 +0,0 @@ -/* -** $Id: lstate.h,v 1.109 2003/02/27 11:52:30 roberto Exp $ -** Global State -** See Copyright Notice in lua.h -*/ - -#ifndef lstate_h -#define lstate_h - -#include "lua.h" - -#include "lobject.h" -#include "ltm.h" -#include "lzio.h" - - -/* -** macros for thread synchronization inside Lua core machine: -** all accesses to the global state and to global objects are synchronized. -** Because threads can read the stack of other threads -** (when running garbage collection), -** a thread must also synchronize any write-access to its own stack. -** Unsynchronized accesses are allowed only when reading its own stack, -** or when reading immutable fields from global objects -** (such as string values and udata values). -*/ -#ifndef lua_lock -#define lua_lock(L) ((void) 0) -#endif - -#ifndef lua_unlock -#define lua_unlock(L) ((void) 0) -#endif - - -#ifndef lua_userstateopen -#define lua_userstateopen(l) -#endif - - - -struct lua_longjmp; /* defined in ldo.c */ - - -/* default meta table (both for tables and udata) */ -#define defaultmeta(L) (&G(L)->_defaultmeta) - -/* table of globals */ -#define gt(L) (&L->_gt) - -/* registry */ -#define registry(L) (&G(L)->_registry) - - -/* extra stack space to handle TM calls and some other extras */ -#define EXTRA_STACK 5 - - -#define BASIC_CI_SIZE 8 - -#define BASIC_STACK_SIZE (2*LUA_MINSTACK) - - - -typedef struct stringtable { - GCObject **hash; - ls_nstr nuse; /* number of elements */ - int size; -} stringtable; - - -/* -** informations about a call -*/ -typedef struct CallInfo { - StkId base; /* base for called function */ - StkId top; /* top for this function */ - int state; /* bit fields; see below */ - union { - struct { /* for Lua functions */ - const Instruction *savedpc; - const Instruction **pc; /* points to `pc' variable in `luaV_execute' */ - int tailcalls; /* number of tail calls lost under this entry */ - } l; - struct { /* for C functions */ - int dummy; /* just to avoid an empty struct */ - } c; - } u; -} CallInfo; - - -/* -** bit fields for `CallInfo.state' -*/ -#define CI_C (1<<0) /* 1 if function is a C function */ -/* 1 if (Lua) function has an active `luaV_execute' running it */ -#define CI_HASFRAME (1<<1) -/* 1 if Lua function is calling another Lua function (and therefore its - `pc' is being used by the other, and therefore CI_SAVEDPC is 1 too) */ -#define CI_CALLING (1<<2) -#define CI_SAVEDPC (1<<3) /* 1 if `savedpc' is updated */ -#define CI_YIELD (1<<4) /* 1 if thread is suspended */ - - -#define ci_func(ci) (clvalue((ci)->base - 1)) - - -/* -** `global state', shared by all threads of this state -*/ -typedef struct global_State { - stringtable strt; /* hash table for strings */ - GCObject *rootgc; /* list of (almost) all collectable objects */ - GCObject *rootudata; /* (separated) list of all userdata */ - GCObject *tmudata; /* list of userdata to be GC */ - Mbuffer buff; /* temporary buffer for string concatentation */ - lu_mem GCthreshold; - lu_mem nblocks; /* number of `bytes' currently allocated */ - lua_CFunction panic; /* to be called in unprotected errors */ - TObject _registry; - TObject _defaultmeta; - struct lua_State *mainthread; - Node dummynode[1]; /* common node array for all empty tables */ - TString *tmname[TM_N]; /* array with tag-method names */ -} global_State; - - -/* -** `per thread' state -*/ -struct lua_State { - CommonHeader; - StkId top; /* first free slot in the stack */ - StkId base; /* base of current function */ - global_State *l_G; - CallInfo *ci; /* call info for current function */ - StkId stack_last; /* last free slot in the stack */ - StkId stack; /* stack base */ - int stacksize; - CallInfo *end_ci; /* points after end of ci array*/ - CallInfo *base_ci; /* array of CallInfo's */ - unsigned short size_ci; /* size of array `base_ci' */ - unsigned short nCcalls; /* number of nested C calls */ - lu_byte hookmask; - lu_byte allowhook; - lu_byte hookinit; - int basehookcount; - int hookcount; - lua_Hook hook; - TObject _gt; /* table of globals */ - GCObject *openupval; /* list of open upvalues in this stack */ - GCObject *gclist; - struct lua_longjmp *errorJmp; /* current error recover point */ - ptrdiff_t errfunc; /* current error handling function (stack index) */ -}; - - -#define G(L) (L->l_G) - - -/* -** Union of all collectable objects -*/ -union GCObject { - GCheader gch; - union TString ts; - union Udata u; - union Closure cl; - struct Table h; - struct Proto p; - struct UpVal uv; - struct lua_State th; /* thread */ -}; - - -/* macros to convert a GCObject into a specific value */ -#define gcotots(o) check_exp((o)->gch.tt == LUA_TSTRING, &((o)->ts)) -#define gcotou(o) check_exp((o)->gch.tt == LUA_TUSERDATA, &((o)->u)) -#define gcotocl(o) check_exp((o)->gch.tt == LUA_TFUNCTION, &((o)->cl)) -#define gcotoh(o) check_exp((o)->gch.tt == LUA_TTABLE, &((o)->h)) -#define gcotop(o) check_exp((o)->gch.tt == LUA_TPROTO, &((o)->p)) -#define gcotouv(o) check_exp((o)->gch.tt == LUA_TUPVAL, &((o)->uv)) -#define ngcotouv(o) \ - check_exp((o) == NULL || (o)->gch.tt == LUA_TUPVAL, &((o)->uv)) -#define gcototh(o) check_exp((o)->gch.tt == LUA_TTHREAD, &((o)->th)) - -/* macro to convert any value into a GCObject */ -#define valtogco(v) (cast(GCObject *, (v))) - - -lua_State *luaE_newthread (lua_State *L); -void luaE_freethread (lua_State *L, lua_State *L1); - -#endif - diff --git a/plugins/SmartAutoReplier/lualib/lstring.c b/plugins/SmartAutoReplier/lualib/lstring.c deleted file mode 100644 index 8cbddbd218..0000000000 --- a/plugins/SmartAutoReplier/lualib/lstring.c +++ /dev/null @@ -1,102 +0,0 @@ -/* -** $Id: lstring.c,v 1.78 2002/12/04 17:38:31 roberto Exp $ -** String table (keeps all strings handled by Lua) -** See Copyright Notice in lua.h -*/ - - -#include - -#define lstring_c - -#include "lua.h" - -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" - - - -void luaS_freeall (lua_State *L) { - lua_assert(G(L)->strt.nuse==0); - luaM_freearray(L, G(L)->strt.hash, G(L)->strt.size, TString *); -} - - -void luaS_resize (lua_State *L, int newsize) { - GCObject **newhash = luaM_newvector(L, newsize, GCObject *); - stringtable *tb = &G(L)->strt; - int i; - for (i=0; isize; i++) { - GCObject *p = tb->hash[i]; - while (p) { /* for each node in the list */ - GCObject *next = p->gch.next; /* save next */ - lu_hash h = gcotots(p)->tsv.hash; - int h1 = lmod(h, newsize); /* new position */ - lua_assert(cast(int, h%newsize) == lmod(h, newsize)); - p->gch.next = newhash[h1]; /* chain it */ - newhash[h1] = p; - p = next; - } - } - luaM_freearray(L, tb->hash, tb->size, TString *); - tb->size = newsize; - tb->hash = newhash; -} - - -static TString *newlstr (lua_State *L, const char *str, size_t l, lu_hash h) { - TString *ts = cast(TString *, luaM_malloc(L, sizestring(l))); - stringtable *tb; - ts->tsv.len = l; - ts->tsv.hash = h; - ts->tsv.marked = 0; - ts->tsv.tt = LUA_TSTRING; - ts->tsv.reserved = 0; - memcpy(ts+1, str, l*sizeof(char)); - ((char *)(ts+1))[l] = '\0'; /* ending 0 */ - tb = &G(L)->strt; - h = lmod(h, tb->size); - ts->tsv.next = tb->hash[h]; /* chain new entry */ - tb->hash[h] = valtogco(ts); - tb->nuse++; - if (tb->nuse > cast(ls_nstr, tb->size) && tb->size <= MAX_INT/2) - luaS_resize(L, tb->size*2); /* too crowded */ - return ts; -} - - -TString *luaS_newlstr (lua_State *L, const char *str, size_t l) { - GCObject *o; - lu_hash h = (lu_hash)l; /* seed */ - size_t step = (l>>5)+1; /* if string is too long, don't hash all its chars */ - size_t l1; - for (l1=l; l1>=step; l1-=step) /* compute hash */ - h = h ^ ((h<<5)+(h>>2)+(unsigned char)(str[l1-1])); - for (o = G(L)->strt.hash[lmod(h, G(L)->strt.size)]; - o != NULL; - o = o->gch.next) { - TString *ts = gcotots(o); - if (ts->tsv.len == l && (memcmp(str, getstr(ts), l) == 0)) - return ts; - } - return newlstr(L, str, l, h); /* not found */ -} - - -Udata *luaS_newudata (lua_State *L, size_t s) { - Udata *u; - u = cast(Udata *, luaM_malloc(L, sizeudata(s))); - u->uv.marked = (1<<1); /* is not finalized */ - u->uv.tt = LUA_TUSERDATA; - u->uv.len = s; - u->uv.metatable = hvalue(defaultmeta(L)); - /* chain it on udata list */ - u->uv.next = G(L)->rootudata; - G(L)->rootudata = valtogco(u); - return u; -} - diff --git a/plugins/SmartAutoReplier/lualib/lstring.h b/plugins/SmartAutoReplier/lualib/lstring.h deleted file mode 100644 index be5a1e3767..0000000000 --- a/plugins/SmartAutoReplier/lualib/lstring.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -** $Id: lstring.h,v 1.37 2002/08/16 14:45:55 roberto Exp $ -** String table (keep all strings handled by Lua) -** See Copyright Notice in lua.h -*/ - -#ifndef lstring_h -#define lstring_h - - -#include "lobject.h" -#include "lstate.h" - - - -#define sizestring(l) (cast(lu_mem, sizeof(union TString))+ \ - (cast(lu_mem, l)+1)*sizeof(char)) - -#define sizeudata(l) (cast(lu_mem, sizeof(union Udata))+(l)) - -#define luaS_new(L, s) (luaS_newlstr(L, s, strlen(s))) -#define luaS_newliteral(L, s) (luaS_newlstr(L, "" s, \ - (sizeof(s)/sizeof(char))-1)) - -#define luaS_fix(s) ((s)->tsv.marked |= (1<<4)) - -void luaS_resize (lua_State *L, int newsize); -Udata *luaS_newudata (lua_State *L, size_t s); -void luaS_freeall (lua_State *L); -TString *luaS_newlstr (lua_State *L, const char *str, size_t l); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lstrlib.c b/plugins/SmartAutoReplier/lualib/lstrlib.c deleted file mode 100644 index 8752e3aba3..0000000000 --- a/plugins/SmartAutoReplier/lualib/lstrlib.c +++ /dev/null @@ -1,770 +0,0 @@ -/* -** $Id: lstrlib.c,v 1.98 2003/04/03 13:35:34 roberto Exp $ -** Standard library for string operations and pattern-matching -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include -#include -#include - -#define lstrlib_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -/* macro to `unsign' a character */ -#ifndef uchar -#define uchar(c) ((unsigned char)(c)) -#endif - - -typedef long sint32; /* a signed version for size_t */ - - -static int str_len (lua_State *L) { - size_t l; - luaL_checklstring(L, 1, &l); - lua_pushnumber(L, (lua_Number)l); - return 1; -} - - -static sint32 posrelat (sint32 pos, size_t len) { - /* relative string position: negative means back from end */ - return (pos>=0) ? pos : (sint32)len+pos+1; -} - - -static int str_sub (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - sint32 start = posrelat(luaL_checklong(L, 2), l); - sint32 end = posrelat(luaL_optlong(L, 3, -1), l); - if (start < 1) start = 1; - if (end > (sint32)l) end = (sint32)l; - if (start <= end) - lua_pushlstring(L, s+start-1, end-start+1); - else lua_pushliteral(L, ""); - return 1; -} - - -static int str_lower (lua_State *L) { - size_t l; - size_t i; - luaL_Buffer b; - const char *s = luaL_checklstring(L, 1, &l); - luaL_buffinit(L, &b); - for (i=0; i 0) - luaL_addlstring(&b, s, l); - luaL_pushresult(&b); - return 1; -} - - -static int str_byte (lua_State *L) { - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - sint32 pos = posrelat(luaL_optlong(L, 2, 1), l); - if (pos <= 0 || (size_t)(pos) > l) /* index out of range? */ - return 0; /* no answer */ - lua_pushnumber(L, uchar(s[pos-1])); - return 1; -} - - -static int str_char (lua_State *L) { - int n = lua_gettop(L); /* number of arguments */ - int i; - luaL_Buffer b; - luaL_buffinit(L, &b); - for (i=1; i<=n; i++) { - int c = luaL_checkint(L, i); - luaL_argcheck(L, uchar(c) == c, i, "invalid value"); - luaL_putchar(&b, uchar(c)); - } - luaL_pushresult(&b); - return 1; -} - - -static int writer (lua_State *L, const void* b, size_t size, void* B) { - (void)L; - luaL_addlstring((luaL_Buffer*) B, (const char *)b, size); - return 1; -} - - -static int str_dump (lua_State *L) { - luaL_Buffer b; - luaL_checktype(L, 1, LUA_TFUNCTION); - luaL_buffinit(L,&b); - if (!lua_dump(L, writer, &b)) - luaL_error(L, "unable to dump given function"); - luaL_pushresult(&b); - return 1; -} - - - -/* -** {====================================================== -** PATTERN MATCHING -** ======================================================= -*/ - -#ifndef MAX_CAPTURES -#define MAX_CAPTURES 32 /* arbitrary limit */ -#endif - - -#define CAP_UNFINISHED (-1) -#define CAP_POSITION (-2) - -typedef struct MatchState { - const char *src_init; /* init of source string */ - const char *src_end; /* end (`\0') of source string */ - lua_State *L; - int level; /* total number of captures (finished or unfinished) */ - struct { - const char *init; - sint32 len; - } capture[MAX_CAPTURES]; -} MatchState; - - -#define ESC '%' -#define SPECIALS "^$*+?.([%-" - - -static int check_capture (MatchState *ms, int l) { - l -= '1'; - if (l < 0 || l >= ms->level || ms->capture[l].len == CAP_UNFINISHED) - return luaL_error(ms->L, "invalid capture index"); - return l; -} - - -static int capture_to_close (MatchState *ms) { - int level = ms->level; - for (level--; level>=0; level--) - if (ms->capture[level].len == CAP_UNFINISHED) return level; - return luaL_error(ms->L, "invalid pattern capture"); -} - - -static const char *luaI_classend (MatchState *ms, const char *p) { - switch (*p++) { - case ESC: { - if (*p == '\0') - luaL_error(ms->L, "malformed pattern (ends with `%')"); - return p+1; - } - case '[': { - if (*p == '^') p++; - do { /* look for a `]' */ - if (*p == '\0') - luaL_error(ms->L, "malformed pattern (missing `]')"); - if (*(p++) == ESC && *p != '\0') - p++; /* skip escapes (e.g. `%]') */ - } while (*p != ']'); - return p+1; - } - default: { - return p; - } - } -} - - -static int match_class (int c, int cl) { - int res; - switch (tolower(cl)) { - case 'a' : res = isalpha(c); break; - case 'c' : res = iscntrl(c); break; - case 'd' : res = isdigit(c); break; - case 'l' : res = islower(c); break; - case 'p' : res = ispunct(c); break; - case 's' : res = isspace(c); break; - case 'u' : res = isupper(c); break; - case 'w' : res = isalnum(c); break; - case 'x' : res = isxdigit(c); break; - case 'z' : res = (c == 0); break; - default: return (cl == c); - } - return (islower(cl) ? res : !res); -} - - -static int matchbracketclass (int c, const char *p, const char *ec) { - int sig = 1; - if (*(p+1) == '^') { - sig = 0; - p++; /* skip the `^' */ - } - while (++p < ec) { - if (*p == ESC) { - p++; - if (match_class(c, *p)) - return sig; - } - else if ((*(p+1) == '-') && (p+2 < ec)) { - p+=2; - if (uchar(*(p-2)) <= c && c <= uchar(*p)) - return sig; - } - else if (uchar(*p) == c) return sig; - } - return !sig; -} - - -static int luaI_singlematch (int c, const char *p, const char *ep) { - switch (*p) { - case '.': return 1; /* matches any char */ - case ESC: return match_class(c, *(p+1)); - case '[': return matchbracketclass(c, p, ep-1); - default: return (uchar(*p) == c); - } -} - - -static const char *match (MatchState *ms, const char *s, const char *p); - - -static const char *matchbalance (MatchState *ms, const char *s, - const char *p) { - if (*p == 0 || *(p+1) == 0) - luaL_error(ms->L, "unbalanced pattern"); - if (*s != *p) return NULL; - else { - int b = *p; - int e = *(p+1); - int cont = 1; - while (++s < ms->src_end) { - if (*s == e) { - if (--cont == 0) return s+1; - } - else if (*s == b) cont++; - } - } - return NULL; /* string ends out of balance */ -} - - -static const char *max_expand (MatchState *ms, const char *s, - const char *p, const char *ep) { - sint32 i = 0; /* counts maximum expand for item */ - while ((s+i)src_end && luaI_singlematch(uchar(*(s+i)), p, ep)) - i++; - /* keeps trying to match with the maximum repetitions */ - while (i>=0) { - const char *res = match(ms, (s+i), ep+1); - if (res) return res; - i--; /* else didn't match; reduce 1 repetition to try again */ - } - return NULL; -} - - -static const char *min_expand (MatchState *ms, const char *s, - const char *p, const char *ep) { - for (;;) { - const char *res = match(ms, s, ep+1); - if (res != NULL) - return res; - else if (ssrc_end && luaI_singlematch(uchar(*s), p, ep)) - s++; /* try with one more repetition */ - else return NULL; - } -} - - -static const char *start_capture (MatchState *ms, const char *s, - const char *p, int what) { - const char *res; - int level = ms->level; - if (level >= MAX_CAPTURES) luaL_error(ms->L, "too many captures"); - ms->capture[level].init = s; - ms->capture[level].len = what; - ms->level = level+1; - if ((res=match(ms, s, p)) == NULL) /* match failed? */ - ms->level--; /* undo capture */ - return res; -} - - -static const char *end_capture (MatchState *ms, const char *s, - const char *p) { - int l = capture_to_close(ms); - const char *res; - ms->capture[l].len = s - ms->capture[l].init; /* close capture */ - if ((res = match(ms, s, p)) == NULL) /* match failed? */ - ms->capture[l].len = CAP_UNFINISHED; /* undo capture */ - return res; -} - - -static const char *match_capture (MatchState *ms, const char *s, int l) { - size_t len; - l = check_capture(ms, l); - len = ms->capture[l].len; - if ((size_t)(ms->src_end-s) >= len && - memcmp(ms->capture[l].init, s, len) == 0) - return s+len; - else return NULL; -} - - -static const char *match (MatchState *ms, const char *s, const char *p) { - init: /* using goto's to optimize tail recursion */ - switch (*p) { - case '(': { /* start capture */ - if (*(p+1) == ')') /* position capture? */ - return start_capture(ms, s, p+2, CAP_POSITION); - else - return start_capture(ms, s, p+1, CAP_UNFINISHED); - } - case ')': { /* end capture */ - return end_capture(ms, s, p+1); - } - case ESC: { - switch (*(p+1)) { - case 'b': { /* balanced string? */ - s = matchbalance(ms, s, p+2); - if (s == NULL) return NULL; - p+=4; goto init; /* else return match(ms, s, p+4); */ - } - case 'f': { /* frontier? */ - const char *ep; char previous; - p += 2; - if (*p != '[') - luaL_error(ms->L, "missing `[' after `%%f' in pattern"); - ep = luaI_classend(ms, p); /* points to what is next */ - previous = (s == ms->src_init) ? '\0' : *(s-1); - if (matchbracketclass(uchar(previous), p, ep-1) || - !matchbracketclass(uchar(*s), p, ep-1)) return NULL; - p=ep; goto init; /* else return match(ms, s, ep); */ - } - default: { - if (isdigit(uchar(*(p+1)))) { /* capture results (%0-%9)? */ - s = match_capture(ms, s, *(p+1)); - if (s == NULL) return NULL; - p+=2; goto init; /* else return match(ms, s, p+2) */ - } - goto dflt; /* case default */ - } - } - } - case '\0': { /* end of pattern */ - return s; /* match succeeded */ - } - case '$': { - if (*(p+1) == '\0') /* is the `$' the last char in pattern? */ - return (s == ms->src_end) ? s : NULL; /* check end of string */ - else goto dflt; - } - default: dflt: { /* it is a pattern item */ - const char *ep = luaI_classend(ms, p); /* points to what is next */ - int m = ssrc_end && luaI_singlematch(uchar(*s), p, ep); - switch (*ep) { - case '?': { /* optional */ - const char *res; - if (m && ((res=match(ms, s+1, ep+1)) != NULL)) - return res; - p=ep+1; goto init; /* else return match(ms, s, ep+1); */ - } - case '*': { /* 0 or more repetitions */ - return max_expand(ms, s, p, ep); - } - case '+': { /* 1 or more repetitions */ - return (m ? max_expand(ms, s+1, p, ep) : NULL); - } - case '-': { /* 0 or more repetitions (minimum) */ - return min_expand(ms, s, p, ep); - } - default: { - if (!m) return NULL; - s++; p=ep; goto init; /* else return match(ms, s+1, ep); */ - } - } - } - } -} - - - -static const char *lmemfind (const char *s1, size_t l1, - const char *s2, size_t l2) { - if (l2 == 0) return s1; /* empty strings are everywhere */ - else if (l2 > l1) return NULL; /* avoids a negative `l1' */ - else { - const char *init; /* to search for a `*s2' inside `s1' */ - l2--; /* 1st char will be checked by `memchr' */ - l1 = l1-l2; /* `s2' cannot be found after that */ - while (l1 > 0 && (init = (const char *)memchr(s1, *s2, l1)) != NULL) { - init++; /* 1st char is already checked */ - if (memcmp(init, s2+1, l2) == 0) - return init-1; - else { /* correct `l1' and `s1' to try again */ - l1 -= init-s1; - s1 = init; - } - } - return NULL; /* not found */ - } -} - - -static void push_onecapture (MatchState *ms, int i) { - int l = ms->capture[i].len; - if (l == CAP_UNFINISHED) luaL_error(ms->L, "unfinished capture"); - if (l == CAP_POSITION) - lua_pushnumber(ms->L, (lua_Number)(ms->capture[i].init - ms->src_init + 1)); - else - lua_pushlstring(ms->L, ms->capture[i].init, l); -} - - -static int push_captures (MatchState *ms, const char *s, const char *e) { - int i; - luaL_checkstack(ms->L, ms->level, "too many captures"); - if (ms->level == 0 && s) { /* no explicit captures? */ - lua_pushlstring(ms->L, s, e-s); /* return whole match */ - return 1; - } - else { /* return all captures */ - for (i=0; ilevel; i++) - push_onecapture(ms, i); - return ms->level; /* number of strings pushed */ - } -} - - -static int str_find (lua_State *L) { - size_t l1, l2; - const char *s = luaL_checklstring(L, 1, &l1); - const char *p = luaL_checklstring(L, 2, &l2); - sint32 init = posrelat(luaL_optlong(L, 3, 1), l1) - 1; - if (init < 0) init = 0; - else if ((size_t)(init) > l1) init = (sint32)l1; - if (lua_toboolean(L, 4) || /* explicit request? */ - strpbrk(p, SPECIALS) == NULL) { /* or no special characters? */ - /* do a plain search */ - const char *s2 = lmemfind(s+init, l1-init, p, l2); - if (s2) { - lua_pushnumber(L, (lua_Number)(s2-s+1)); - lua_pushnumber(L, (lua_Number)(s2-s+l2)); - return 2; - } - } - else { - MatchState ms; - int anchor = (*p == '^') ? (p++, 1) : 0; - const char *s1=s+init; - ms.L = L; - ms.src_init = s; - ms.src_end = s+l1; - do { - const char *res; - ms.level = 0; - if ((res=match(&ms, s1, p)) != NULL) { - lua_pushnumber(L, (lua_Number)(s1-s+1)); /* start */ - lua_pushnumber(L, (lua_Number)(res-s)); /* end */ - return push_captures(&ms, NULL, 0) + 2; - } - } while (s1++L; - if (lua_isstring(L, 3)) { - const char *news = lua_tostring(L, 3); - size_t l = lua_strlen(L, 3); - size_t i; - for (i=0; i= 3 && (lua_isstring(L, 3) || lua_isfunction(L, 3)), - 3, "string or function expected"); - luaL_buffinit(L, &b); - ms.L = L; - ms.src_init = src; - ms.src_end = src+srcl; - while (n < max_s) { - const char *e; - ms.level = 0; - e = match(&ms, src, p); - if (e) { - n++; - add_s(&ms, &b, src, e); - } - if (e && e>src) /* non empty match? */ - src = e; /* skip it */ - else if (src < ms.src_end) - luaL_putchar(&b, *src++); - else break; - if (anchor) break; - } - luaL_addlstring(&b, src, ms.src_end-src); - luaL_pushresult(&b); - lua_pushnumber(L, (lua_Number)n); /* number of substitutions */ - return 2; -} - -/* }====================================================== */ - - -/* maximum size of each formatted item (> len(format('%99.99f', -1e308))) */ -#define MAX_ITEM 512 -/* maximum size of each format specification (such as '%-099.99d') */ -#define MAX_FORMAT 20 - - -static void luaI_addquoted (lua_State *L, luaL_Buffer *b, int arg) { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - luaL_putchar(b, '"'); - while (l--) { - switch (*s) { - case '"': case '\\': case '\n': { - luaL_putchar(b, '\\'); - luaL_putchar(b, *s); - break; - } - case '\0': { - luaL_addlstring(b, "\\000", 4); - break; - } - default: { - luaL_putchar(b, *s); - break; - } - } - s++; - } - luaL_putchar(b, '"'); -} - - -static const char *scanformat (lua_State *L, const char *strfrmt, - char *form, int *hasprecision) { - const char *p = strfrmt; - while (strchr("-+ #0", *p)) p++; /* skip flags */ - if (isdigit(uchar(*p))) p++; /* skip width */ - if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ - if (*p == '.') { - p++; - *hasprecision = 1; - if (isdigit(uchar(*p))) p++; /* skip precision */ - if (isdigit(uchar(*p))) p++; /* (2 digits at most) */ - } - if (isdigit(uchar(*p))) - luaL_error(L, "invalid format (width or precision too long)"); - if (p-strfrmt+2 > MAX_FORMAT) /* +2 to include `%' and the specifier */ - luaL_error(L, "invalid format (too long)"); - form[0] = '%'; - strncpy(form+1, strfrmt, p-strfrmt+1); - form[p-strfrmt+2] = 0; - return p; -} - - -static int str_format (lua_State *L) { - int arg = 1; - size_t sfl; - const char *strfrmt = luaL_checklstring(L, arg, &sfl); - const char *strfrmt_end = strfrmt+sfl; - luaL_Buffer b; - luaL_buffinit(L, &b); - while (strfrmt < strfrmt_end) { - if (*strfrmt != '%') - luaL_putchar(&b, *strfrmt++); - else if (*++strfrmt == '%') - luaL_putchar(&b, *strfrmt++); /* %% */ - else { /* format item */ - char form[MAX_FORMAT]; /* to store the format (`%...') */ - char buff[MAX_ITEM]; /* to store the formatted item */ - int hasprecision = 0; - if (isdigit(uchar(*strfrmt)) && *(strfrmt+1) == '$') - return luaL_error(L, "obsolete option (d$) to `format'"); - arg++; - strfrmt = scanformat(L, strfrmt, form, &hasprecision); - switch (*strfrmt++) { - case 'c': case 'd': case 'i': { - sprintf(buff, form, luaL_checkint(L, arg)); - break; - } - case 'o': case 'u': case 'x': case 'X': { - sprintf(buff, form, (unsigned int)(luaL_checknumber(L, arg))); - break; - } - case 'e': case 'E': case 'f': - case 'g': case 'G': { - sprintf(buff, form, luaL_checknumber(L, arg)); - break; - } - case 'q': { - luaI_addquoted(L, &b, arg); - continue; /* skip the `addsize' at the end */ - } - case 's': { - size_t l; - const char *s = luaL_checklstring(L, arg, &l); - if (!hasprecision && l >= 100) { - /* no precision and string is too long to be formatted; - keep original string */ - lua_pushvalue(L, arg); - luaL_addvalue(&b); - continue; /* skip the `addsize' at the end */ - } - else { - sprintf(buff, form, s); - break; - } - } - default: { /* also treat cases `pnLlh' */ - return luaL_error(L, "invalid option to `format'"); - } - } - luaL_addlstring(&b, buff, strlen(buff)); - } - } - luaL_pushresult(&b); - return 1; -} - - -static const luaL_reg strlib[] = { - {"len", str_len}, - {"sub", str_sub}, - {"lower", str_lower}, - {"upper", str_upper}, - {"char", str_char}, - {"rep", str_rep}, - {"byte", str_byte}, - {"format", str_format}, - {"dump", str_dump}, - {"find", str_find}, - {"gfind", gfind}, - {"gsub", str_gsub}, - {NULL, NULL} -}; - - -/* -** Open string library -*/ -LUALIB_API int luaopen_string (lua_State *L) { - luaL_openlib(L, LUA_STRLIBNAME, strlib, 0); - return 1; -} - diff --git a/plugins/SmartAutoReplier/lualib/ltable.c b/plugins/SmartAutoReplier/lualib/ltable.c deleted file mode 100644 index 0c64adb10a..0000000000 --- a/plugins/SmartAutoReplier/lualib/ltable.c +++ /dev/null @@ -1,509 +0,0 @@ -/* -** $Id: ltable.c,v 1.132 2003/04/03 13:35:34 roberto Exp $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - - -/* -** Implementation of tables (aka arrays, objects, or hash tables). -** Tables keep its elements in two parts: an array part and a hash part. -** Non-negative integer keys are all candidates to be kept in the array -** part. The actual size of the array is the largest `n' such that at -** least half the slots between 0 and n are in use. -** Hash uses a mix of chained scatter table with Brent's variation. -** A main invariant of these tables is that, if an element is not -** in its main position (i.e. the `original' position that its hash gives -** to it), then the colliding element is in its own main position. -** In other words, there are collisions only when two elements have the -** same main position (i.e. the same hash values for that table size). -** Because of that, the load factor of these tables can be 100% without -** performance penalties. -*/ - -#include - -#define ltable_c - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lgc.h" -#include "lmem.h" -#include "lobject.h" -#include "lstate.h" -#include "ltable.h" - - -/* -** max size of array part is 2^MAXBITS -*/ -#if BITS_INT > 26 -#define MAXBITS 24 -#else -#define MAXBITS (BITS_INT-2) -#endif - -/* check whether `x' < 2^MAXBITS */ -#define toobig(x) ((((x)-1) >> MAXBITS) != 0) - - -/* function to convert a lua_Number to int (with any rounding method) */ -#ifndef lua_number2int -#define lua_number2int(i,n) ((i)=(int)(n)) -#endif - - -#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t)))) - -#define hashstr(t,str) hashpow2(t, (str)->tsv.hash) -#define hashboolean(t,p) hashpow2(t, p) - - -/* -** for some types, it is better to avoid modulus by power of 2, as -** they tend to have many 2 factors. -*/ -#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1)))) - - -#define hashpointer(t,p) hashmod(t, IntPoint(p)) - - -/* -** number of ints inside a lua_Number -*/ -#define numints cast(int, sizeof(lua_Number)/sizeof(int)) - - -/* -** hash for lua_Numbers -*/ -static Node *hashnum (const Table *t, lua_Number n) { - unsigned int a[numints]; - int i; - n += 1; /* normalize number (avoid -0) */ - lua_assert(sizeof(a) <= sizeof(n)); - memcpy(a, &n, sizeof(a)); - for (i = 1; i < numints; i++) a[0] += a[i]; - return hashmod(t, cast(lu_hash, a[0])); -} - - - -/* -** returns the `main' position of an element in a table (that is, the index -** of its hash value) -*/ -Node *luaH_mainposition (const Table *t, const TObject *key) { - switch (ttype(key)) { - case LUA_TNUMBER: - return hashnum(t, nvalue(key)); - case LUA_TSTRING: - return hashstr(t, tsvalue(key)); - case LUA_TBOOLEAN: - return hashboolean(t, bvalue(key)); - case LUA_TLIGHTUSERDATA: - return hashpointer(t, pvalue(key)); - default: - return hashpointer(t, gcvalue(key)); - } -} - - -/* -** returns the index for `key' if `key' is an appropriate key to live in -** the array part of the table, -1 otherwise. -*/ -static int arrayindex (const TObject *key) { - if (ttisnumber(key)) { - int k; - lua_number2int(k, (nvalue(key))); - if (cast(lua_Number, k) == nvalue(key) && k >= 1 && !toobig(k)) - return k; - } - return -1; /* `key' did not match some condition */ -} - - -/* -** returns the index of a `key' for table traversals. First goes all -** elements in the array part, then elements in the hash part. The -** beginning and end of a traversal are signalled by -1. -*/ -static int luaH_index (lua_State *L, Table *t, StkId key) { - int i; - if (ttisnil(key)) return -1; /* first iteration */ - i = arrayindex(key); - if (0 <= i && i <= t->sizearray) { /* is `key' inside array part? */ - return i-1; /* yes; that's the index (corrected to C) */ - } - else { - const TObject *v = luaH_get(t, key); - if (v == &luaO_nilobject) - luaG_runerror(L, "invalid key for `next'"); - i = cast(int, (cast(const lu_byte *, v) - - cast(const lu_byte *, gval(gnode(t, 0)))) / sizeof(Node)); - return i + t->sizearray; /* hash elements are numbered after array ones */ - } -} - - -int luaH_next (lua_State *L, Table *t, StkId key) { - int i = luaH_index(L, t, key); /* find original element */ - for (i++; i < t->sizearray; i++) { /* try first array part */ - if (!ttisnil(&t->array[i])) { /* a non-nil value? */ - setnvalue(key, cast(lua_Number, i+1)); - setobj2s(key+1, &t->array[i]); - return 1; - } - } - for (i -= t->sizearray; i < sizenode(t); i++) { /* then hash part */ - if (!ttisnil(gval(gnode(t, i)))) { /* a non-nil value? */ - setobj2s(key, gkey(gnode(t, i))); - setobj2s(key+1, gval(gnode(t, i))); - return 1; - } - } - return 0; /* no more elements */ -} - - -/* -** {============================================================= -** Rehash -** ============================================================== -*/ - - -static void computesizes (int nums[], int ntotal, int *narray, int *nhash) { - int i; - int a = nums[0]; /* number of elements smaller than 2^i */ - int na = a; /* number of elements to go to array part */ - int n = (na == 0) ? -1 : 0; /* (log of) optimal size for array part */ - for (i = 1; a < *narray && *narray >= twoto(i-1); i++) { - if (nums[i] > 0) { - a += nums[i]; - if (a >= twoto(i-1)) { /* more than half elements in use? */ - n = i; - na = a; - } - } - } - lua_assert(na <= *narray && *narray <= ntotal); - *nhash = ntotal - na; - *narray = (n == -1) ? 0 : twoto(n); - lua_assert(na <= *narray && na >= *narray/2); -} - - -static void numuse (const Table *t, int *narray, int *nhash) { - int nums[MAXBITS+1]; - int i, lg; - int totaluse = 0; - /* count elements in array part */ - for (i=0, lg=0; lg<=MAXBITS; lg++) { /* for each slice [2^(lg-1) to 2^lg) */ - int ttlg = twoto(lg); /* 2^lg */ - if (ttlg > t->sizearray) { - ttlg = t->sizearray; - if (i >= ttlg) break; - } - nums[lg] = 0; - for (; iarray[i])) { - nums[lg]++; - totaluse++; - } - } - } - for (; lg<=MAXBITS; lg++) nums[lg] = 0; /* reset other counts */ - *narray = totaluse; /* all previous uses were in array part */ - /* count elements in hash part */ - i = sizenode(t); - while (i--) { - Node *n = &t->node[i]; - if (!ttisnil(gval(n))) { - int k = arrayindex(gkey(n)); - if (k >= 0) { /* is `key' an appropriate array index? */ - nums[luaO_log2(k-1)+1]++; /* count as such */ - (*narray)++; - } - totaluse++; - } - } - computesizes(nums, totaluse, narray, nhash); -} - - -static void setarrayvector (lua_State *L, Table *t, int size) { - int i; - luaM_reallocvector(L, t->array, t->sizearray, size, TObject); - for (i=t->sizearray; iarray[i]); - t->sizearray = size; -} - - -static void setnodevector (lua_State *L, Table *t, int lsize) { - int i; - int size = twoto(lsize); - if (lsize > MAXBITS) - luaG_runerror(L, "table overflow"); - if (lsize == 0) { /* no elements to hash part? */ - t->node = G(L)->dummynode; /* use common `dummynode' */ - lua_assert(ttisnil(gkey(t->node))); /* assert invariants: */ - lua_assert(ttisnil(gval(t->node))); - lua_assert(t->node->next == NULL); /* (`dummynode' must be empty) */ - } - else { - t->node = luaM_newvector(L, size, Node); - for (i=0; inode[i].next = NULL; - setnilvalue(gkey(gnode(t, i))); - setnilvalue(gval(gnode(t, i))); - } - } - t->lsizenode = cast(lu_byte, lsize); - t->firstfree = gnode(t, size-1); /* first free position to be used */ -} - - -static void resize (lua_State *L, Table *t, int nasize, int nhsize) { - int i; - int oldasize = t->sizearray; - int oldhsize = t->lsizenode; - Node *nold; - Node temp[1]; - if (oldhsize) - nold = t->node; /* save old hash ... */ - else { /* old hash is `dummynode' */ - lua_assert(t->node == G(L)->dummynode); - temp[0] = t->node[0]; /* copy it to `temp' */ - nold = temp; - setnilvalue(gkey(G(L)->dummynode)); /* restate invariant */ - setnilvalue(gval(G(L)->dummynode)); - lua_assert(G(L)->dummynode->next == NULL); - } - if (nasize > oldasize) /* array part must grow? */ - setarrayvector(L, t, nasize); - /* create new hash part with appropriate size */ - setnodevector(L, t, nhsize); - /* re-insert elements */ - if (nasize < oldasize) { /* array part must shrink? */ - t->sizearray = nasize; - /* re-insert elements from vanishing slice */ - for (i=nasize; iarray[i])) - setobjt2t(luaH_setnum(L, t, i+1), &t->array[i]); - } - /* shrink array */ - luaM_reallocvector(L, t->array, oldasize, nasize, TObject); - } - /* re-insert elements in hash part */ - for (i = twoto(oldhsize) - 1; i >= 0; i--) { - Node *old = nold+i; - if (!ttisnil(gval(old))) - setobjt2t(luaH_set(L, t, gkey(old)), gval(old)); - } - if (oldhsize) - luaM_freearray(L, nold, twoto(oldhsize), Node); /* free old array */ -} - - -static void rehash (lua_State *L, Table *t) { - int nasize, nhsize; - numuse(t, &nasize, &nhsize); /* compute new sizes for array and hash parts */ - resize(L, t, nasize, luaO_log2(nhsize)+1); -} - - - -/* -** }============================================================= -*/ - - -Table *luaH_new (lua_State *L, int narray, int lnhash) { - Table *t = luaM_new(L, Table); - luaC_link(L, valtogco(t), LUA_TTABLE); - t->metatable = hvalue(defaultmeta(L)); - t->flags = cast(lu_byte, ~0); - /* temporary values (kept only if some malloc fails) */ - t->array = NULL; - t->sizearray = 0; - t->lsizenode = 0; - t->node = NULL; - setarrayvector(L, t, narray); - setnodevector(L, t, lnhash); - return t; -} - - -void luaH_free (lua_State *L, Table *t) { - if (t->lsizenode) - luaM_freearray(L, t->node, sizenode(t), Node); - luaM_freearray(L, t->array, t->sizearray, TObject); - luaM_freelem(L, t); -} - - -#if 0 -/* -** try to remove an element from a hash table; cannot move any element -** (because gc can call `remove' during a table traversal) -*/ -void luaH_remove (Table *t, Node *e) { - Node *mp = luaH_mainposition(t, gkey(e)); - if (e != mp) { /* element not in its main position? */ - while (mp->next != e) mp = mp->next; /* find previous */ - mp->next = e->next; /* remove `e' from its list */ - } - else { - if (e->next != NULL) ?? - } - lua_assert(ttisnil(gval(node))); - setnilvalue(gkey(e)); /* clear node `e' */ - e->next = NULL; -} -#endif - - -/* -** inserts a new key into a hash table; first, check whether key's main -** position is free. If not, check whether colliding node is in its main -** position or not: if it is not, move colliding node to an empty place and -** put new key in its main position; otherwise (colliding node is in its main -** position), new key goes to an empty position. -*/ -static TObject *newkey (lua_State *L, Table *t, const TObject *key) { - TObject *val; - Node *mp = luaH_mainposition(t, key); - if (!ttisnil(gval(mp))) { /* main position is not free? */ - Node *othern = luaH_mainposition(t, gkey(mp)); /* `mp' of colliding node */ - Node *n = t->firstfree; /* get a free place */ - if (othern != mp) { /* is colliding node out of its main position? */ - /* yes; move colliding node into free position */ - while (othern->next != mp) othern = othern->next; /* find previous */ - othern->next = n; /* redo the chain with `n' in place of `mp' */ - *n = *mp; /* copy colliding node into free pos. (mp->next also goes) */ - mp->next = NULL; /* now `mp' is free */ - setnilvalue(gval(mp)); - } - else { /* colliding node is in its own main position */ - /* new node will go into free position */ - n->next = mp->next; /* chain new position */ - mp->next = n; - mp = n; - } - } - setobj2t(gkey(mp), key); /* write barrier */ - lua_assert(ttisnil(gval(mp))); - for (;;) { /* correct `firstfree' */ - if (ttisnil(gkey(t->firstfree))) - return gval(mp); /* OK; table still has a free place */ - else if (t->firstfree == t->node) break; /* cannot decrement from here */ - else (t->firstfree)--; - } - /* no more free places; must create one */ - setbvalue(gval(mp), 0); /* avoid new key being removed */ - rehash(L, t); /* grow table */ - val = cast(TObject *, luaH_get(t, key)); /* get new position */ - lua_assert(ttisboolean(val)); - setnilvalue(val); - return val; -} - - -/* -** generic search function -*/ -static const TObject *luaH_getany (Table *t, const TObject *key) { - if (ttisnil(key)) return &luaO_nilobject; - else { - Node *n = luaH_mainposition(t, key); - do { /* check whether `key' is somewhere in the chain */ - if (luaO_rawequalObj(gkey(n), key)) return gval(n); /* that's it */ - else n = n->next; - } while (n); - return &luaO_nilobject; - } -} - - -/* -** search function for integers -*/ -const TObject *luaH_getnum (Table *t, int key) { - if (1 <= key && key <= t->sizearray) - return &t->array[key-1]; - else { - lua_Number nk = cast(lua_Number, key); - Node *n = hashnum(t, nk); - do { /* check whether `key' is somewhere in the chain */ - if (ttisnumber(gkey(n)) && nvalue(gkey(n)) == nk) - return gval(n); /* that's it */ - else n = n->next; - } while (n); - return &luaO_nilobject; - } -} - - -/* -** search function for strings -*/ -const TObject *luaH_getstr (Table *t, TString *key) { - Node *n = hashstr(t, key); - do { /* check whether `key' is somewhere in the chain */ - if (ttisstring(gkey(n)) && tsvalue(gkey(n)) == key) - return gval(n); /* that's it */ - else n = n->next; - } while (n); - return &luaO_nilobject; -} - - -/* -** main search function -*/ -const TObject *luaH_get (Table *t, const TObject *key) { - switch (ttype(key)) { - case LUA_TSTRING: return luaH_getstr(t, tsvalue(key)); - case LUA_TNUMBER: { - int k; - lua_number2int(k, (nvalue(key))); - if (cast(lua_Number, k) == nvalue(key)) /* is an integer index? */ - return luaH_getnum(t, k); /* use specialized version */ - /* else go through */ - } - default: return luaH_getany(t, key); - } -} - - -TObject *luaH_set (lua_State *L, Table *t, const TObject *key) { - const TObject *p = luaH_get(t, key); - t->flags = 0; - if (p != &luaO_nilobject) - return cast(TObject *, p); - else { - if (ttisnil(key)) luaG_runerror(L, "table index is nil"); - else if (ttisnumber(key) && nvalue(key) != nvalue(key)) - luaG_runerror(L, "table index is NaN"); - return newkey(L, t, key); - } -} - - -TObject *luaH_setnum (lua_State *L, Table *t, int key) { - const TObject *p = luaH_getnum(t, key); - if (p != &luaO_nilobject) - return cast(TObject *, p); - else { - TObject k; - setnvalue(&k, cast(lua_Number, key)); - return newkey(L, t, &k); - } -} - diff --git a/plugins/SmartAutoReplier/lualib/ltable.h b/plugins/SmartAutoReplier/lualib/ltable.h deleted file mode 100644 index 3d4d753c3c..0000000000 --- a/plugins/SmartAutoReplier/lualib/ltable.h +++ /dev/null @@ -1,31 +0,0 @@ -/* -** $Id: ltable.h,v 1.44 2003/03/18 12:50:04 roberto Exp $ -** Lua tables (hash) -** See Copyright Notice in lua.h -*/ - -#ifndef ltable_h -#define ltable_h - -#include "lobject.h" - - -#define gnode(t,i) (&(t)->node[i]) -#define gkey(n) (&(n)->i_key) -#define gval(n) (&(n)->i_val) - - -const TObject *luaH_getnum (Table *t, int key); -TObject *luaH_setnum (lua_State *L, Table *t, int key); -const TObject *luaH_getstr (Table *t, TString *key); -const TObject *luaH_get (Table *t, const TObject *key); -TObject *luaH_set (lua_State *L, Table *t, const TObject *key); -Table *luaH_new (lua_State *L, int narray, int lnhash); -void luaH_free (lua_State *L, Table *t); -int luaH_next (lua_State *L, Table *t, StkId key); - -/* exported only for debugging */ -Node *luaH_mainposition (const Table *t, const TObject *key); - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/ltablib.c b/plugins/SmartAutoReplier/lualib/ltablib.c deleted file mode 100644 index c9bb2d1b7e..0000000000 --- a/plugins/SmartAutoReplier/lualib/ltablib.c +++ /dev/null @@ -1,250 +0,0 @@ -/* -** $Id: ltablib.c,v 1.21 2003/04/03 13:35:34 roberto Exp $ -** Library for Table Manipulation -** See Copyright Notice in lua.h -*/ - - -#include - -#define ltablib_c - -#include "lua.h" - -#include "lauxlib.h" -#include "lualib.h" - - -#define aux_getn(L,n) (luaL_checktype(L, n, LUA_TTABLE), luaL_getn(L, n)) - - -static int luaB_foreachi (lua_State *L) { - int i; - int n = aux_getn(L, 1); - luaL_checktype(L, 2, LUA_TFUNCTION); - for (i=1; i<=n; i++) { - lua_pushvalue(L, 2); /* function */ - lua_pushnumber(L, (lua_Number)i); /* 1st argument */ - lua_rawgeti(L, 1, i); /* 2nd argument */ - lua_call(L, 2, 1); - if (!lua_isnil(L, -1)) - return 1; - lua_pop(L, 1); /* remove nil result */ - } - return 0; -} - - -static int luaB_foreach (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_checktype(L, 2, LUA_TFUNCTION); - lua_pushnil(L); /* first key */ - for (;;) { - if (lua_next(L, 1) == 0) - return 0; - lua_pushvalue(L, 2); /* function */ - lua_pushvalue(L, -3); /* key */ - lua_pushvalue(L, -3); /* value */ - lua_call(L, 2, 1); - if (!lua_isnil(L, -1)) - return 1; - lua_pop(L, 2); /* remove value and result */ - } -} - - -static int luaB_getn (lua_State *L) { - lua_pushnumber(L, (lua_Number)aux_getn(L, 1)); - return 1; -} - - -static int luaB_setn (lua_State *L) { - luaL_checktype(L, 1, LUA_TTABLE); - luaL_setn(L, 1, luaL_checkint(L, 2)); - return 0; -} - - -static int luaB_tinsert (lua_State *L) { - int v = lua_gettop(L); /* number of arguments */ - int n = aux_getn(L, 1) + 1; - int pos; /* where to insert new element */ - if (v == 2) /* called with only 2 arguments */ - pos = n; /* insert new element at the end */ - else { - pos = luaL_checkint(L, 2); /* 2nd argument is the position */ - if (pos > n) n = pos; /* `grow' array if necessary */ - v = 3; /* function may be called with more than 3 args */ - } - luaL_setn(L, 1, n); /* new size */ - while (--n >= pos) { /* move up elements */ - lua_rawgeti(L, 1, n); - lua_rawseti(L, 1, n+1); /* t[n+1] = t[n] */ - } - lua_pushvalue(L, v); - lua_rawseti(L, 1, pos); /* t[pos] = v */ - return 0; -} - - -static int luaB_tremove (lua_State *L) { - int n = aux_getn(L, 1); - int pos = luaL_optint(L, 2, n); - if (n <= 0) return 0; /* table is `empty' */ - luaL_setn(L, 1, n-1); /* t.n = n-1 */ - lua_rawgeti(L, 1, pos); /* result = t[pos] */ - for ( ;pos= P */ - while (lua_rawgeti(L, 1, ++i), sort_comp(L, -1, -2)) { - if (i>u) luaL_error(L, "invalid order function for sorting"); - lua_pop(L, 1); /* remove a[i] */ - } - /* repeat --j until a[j] <= P */ - while (lua_rawgeti(L, 1, --j), sort_comp(L, -3, -1)) { - if (j -#include -#include -#include -#include - -#define ltests_c - -#include "lua.h" - -#include "lapi.h" -#include "lauxlib.h" -#include "lcode.h" -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lmem.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "lualib.h" - - - -/* -** The whole module only makes sense with LUA_DEBUG on -*/ -#ifdef LUA_DEBUG - - -#define lua_pushintegral(L,i) lua_pushnumber(L, cast(lua_Number, (i))) - - -static lua_State *lua_state = NULL; - -int islocked = 0; - - -#define func_at(L,k) (L->ci->base+(k) - 1) - - -static void setnameval (lua_State *L, const char *name, int val) { - lua_pushstring(L, name); - lua_pushintegral(L, val); - lua_settable(L, -3); -} - - -/* -** {====================================================================== -** Controlled version for realloc. -** ======================================================================= -*/ - -#define MARK 0x55 /* 01010101 (a nice pattern) */ - -#ifndef EXTERNMEMCHECK -/* full memory check */ -#define HEADER (sizeof(L_Umaxalign)) /* ensures maximum alignment for HEADER */ -#define MARKSIZE 16 /* size of marks after each block */ -#define blockhead(b) (cast(char *, b) - HEADER) -#define setsize(newblock, size) (*cast(size_t *, newblock) = size) -#define checkblocksize(b, size) (size == (*cast(size_t *, blockhead(b)))) -#define fillmem(mem,size) memset(mem, -MARK, size) -#else -/* external memory check: don't do it twice */ -#define HEADER 0 -#define MARKSIZE 0 -#define blockhead(b) (b) -#define setsize(newblock, size) /* empty */ -#define checkblocksize(b,size) (1) -#define fillmem(mem,size) /* empty */ -#endif - -unsigned long memdebug_numblocks = 0; -unsigned long memdebug_total = 0; -unsigned long memdebug_maxmem = 0; -unsigned long memdebug_memlimit = ULONG_MAX; - - -static void *checkblock (void *block, size_t size) { - void *b = blockhead(block); - int i; - for (i=0;i 0); - if (size == 0) { - freeblock(block, oldsize); - return NULL; - } - else if (size > oldsize && memdebug_total+size-oldsize > memdebug_memlimit) - return NULL; /* to test memory allocation errors */ - else { - void *newblock; - int i; - size_t realsize = HEADER+size+MARKSIZE; - size_t commonsize = (oldsize < size) ? oldsize : size; - if (realsize < size) return NULL; /* overflow! */ - newblock = malloc(realsize); /* alloc a new block */ - if (newblock == NULL) return NULL; - if (block) { - memcpy(cast(char *, newblock)+HEADER, block, commonsize); - freeblock(block, oldsize); /* erase (and check) old copy */ - } - /* initialize new part of the block with something `weird' */ - fillmem(cast(char *, newblock)+HEADER+commonsize, size-commonsize); - memdebug_total += size; - if (memdebug_total > memdebug_maxmem) - memdebug_maxmem = memdebug_total; - memdebug_numblocks++; - setsize(newblock, size); - for (i=0;icode[pc]; - OpCode o = GET_OPCODE(i); - const char *name = luaP_opnames[o]; - int line = getline(p, pc); - sprintf(buff, "(%4d) %4d - ", line, pc); - switch (getOpMode(o)) { - case iABC: - sprintf(buff+strlen(buff), "%-12s%4d %4d %4d", name, - GETARG_A(i), GETARG_B(i), GETARG_C(i)); - break; - case iABx: - sprintf(buff+strlen(buff), "%-12s%4d %4d", name, GETARG_A(i), GETARG_Bx(i)); - break; - case iAsBx: - sprintf(buff+strlen(buff), "%-12s%4d %4d", name, GETARG_A(i), GETARG_sBx(i)); - break; - } - return buff; -} - - -#if 0 -void luaI_printcode (Proto *pt, int size) { - int pc; - for (pc=0; pcl.p; - lua_newtable(L); - setnameval(L, "maxstack", p->maxstacksize); - setnameval(L, "numparams", p->numparams); - for (pc=0; pcsizecode; pc++) { - char buff[100]; - lua_pushintegral(L, pc+1); - lua_pushstring(L, buildop(p, pc, buff)); - lua_settable(L, -3); - } - return 1; -} - - -static int listk (lua_State *L) { - Proto *p; - int i; - luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = clvalue(func_at(L, 1))->l.p; - lua_newtable(L); - for (i=0; isizek; i++) { - lua_pushintegral(L, i+1); - luaA_pushobject(L, p->k+i); - lua_settable(L, -3); - } - return 1; -} - - -static int listlocals (lua_State *L) { - Proto *p; - int pc = luaL_checkint(L, 2) - 1; - int i = 0; - const char *name; - luaL_argcheck(L, lua_isfunction(L, 1) && !lua_iscfunction(L, 1), - 1, "Lua function expected"); - p = clvalue(func_at(L, 1))->l.p; - while ((name = luaF_getlocalname(p, ++i, pc)) != NULL) - lua_pushstring(L, name); - return i-1; -} - -/* }====================================================== */ - - - - -static int get_limits (lua_State *L) { - lua_newtable(L); - setnameval(L, "BITS_INT", BITS_INT); - setnameval(L, "LFPF", LFIELDS_PER_FLUSH); - setnameval(L, "MAXVARS", MAXVARS); - setnameval(L, "MAXPARAMS", MAXPARAMS); - setnameval(L, "MAXSTACK", MAXSTACK); - setnameval(L, "MAXUPVALUES", MAXUPVALUES); - return 1; -} - - -static int mem_query (lua_State *L) { - if (lua_isnone(L, 1)) { - lua_pushintegral(L, memdebug_total); - lua_pushintegral(L, memdebug_numblocks); - lua_pushintegral(L, memdebug_maxmem); - return 3; - } - else { - memdebug_memlimit = luaL_checkint(L, 1); - return 0; - } -} - - -static int hash_query (lua_State *L) { - if (lua_isnone(L, 2)) { - luaL_argcheck(L, lua_type(L, 1) == LUA_TSTRING, 1, "string expected"); - lua_pushintegral(L, tsvalue(func_at(L, 1))->tsv.hash); - } - else { - TObject *o = func_at(L, 1); - Table *t; - luaL_checktype(L, 2, LUA_TTABLE); - t = hvalue(func_at(L, 2)); - lua_pushintegral(L, luaH_mainposition(t, o) - t->node); - } - return 1; -} - - -static int stacklevel (lua_State *L) { - unsigned long a = 0; - lua_pushintegral(L, (int)(L->top - L->stack)); - lua_pushintegral(L, (int)(L->stack_last - L->stack)); - lua_pushintegral(L, (int)(L->ci - L->base_ci)); - lua_pushintegral(L, (int)(L->end_ci - L->base_ci)); - lua_pushintegral(L, (unsigned long)&a); - return 5; -} - - -static int table_query (lua_State *L) { - const Table *t; - int i = luaL_optint(L, 2, -1); - luaL_checktype(L, 1, LUA_TTABLE); - t = hvalue(func_at(L, 1)); - if (i == -1) { - lua_pushintegral(L, t->sizearray); - lua_pushintegral(L, sizenode(t)); - lua_pushintegral(L, t->firstfree - t->node); - } - else if (i < t->sizearray) { - lua_pushintegral(L, i); - luaA_pushobject(L, &t->array[i]); - lua_pushnil(L); - } - else if ((i -= t->sizearray) < sizenode(t)) { - if (!ttisnil(gval(gnode(t, i))) || - ttisnil(gkey(gnode(t, i))) || - ttisnumber(gkey(gnode(t, i)))) { - luaA_pushobject(L, gkey(gnode(t, i))); - } - else - lua_pushstring(L, ""); - luaA_pushobject(L, gval(gnode(t, i))); - if (t->node[i].next) - lua_pushintegral(L, t->node[i].next - t->node); - else - lua_pushnil(L); - } - return 3; -} - - -static int string_query (lua_State *L) { - stringtable *tb = &G(L)->strt; - int s = luaL_optint(L, 2, 0) - 1; - if (s==-1) { - lua_pushintegral(L ,tb->nuse); - lua_pushintegral(L ,tb->size); - return 2; - } - else if (s < tb->size) { - GCObject *ts; - int n = 0; - for (ts = tb->hash[s]; ts; ts = ts->gch.next) { - setsvalue2s(L->top, gcotots(ts)); - incr_top(L); - n++; - } - return n; - } - return 0; -} - - -static int tref (lua_State *L) { - int level = lua_gettop(L); - int lock = luaL_optint(L, 2, 1); - luaL_checkany(L, 1); - lua_pushvalue(L, 1); - lua_pushintegral(L, lua_ref(L, lock)); - assert(lua_gettop(L) == level+1); /* +1 for result */ - return 1; -} - -static int getref (lua_State *L) { - int level = lua_gettop(L); - lua_getref(L, luaL_checkint(L, 1)); - assert(lua_gettop(L) == level+1); - return 1; -} - -static int unref (lua_State *L) { - int level = lua_gettop(L); - lua_unref(L, luaL_checkint(L, 1)); - assert(lua_gettop(L) == level); - return 0; -} - -static int metatable (lua_State *L) { - luaL_checkany(L, 1); - if (lua_isnone(L, 2)) { - if (lua_getmetatable(L, 1) == 0) - lua_pushnil(L); - } - else { - lua_settop(L, 2); - luaL_checktype(L, 2, LUA_TTABLE); - lua_setmetatable(L, 1); - } - return 1; -} - - -static int upvalue (lua_State *L) { - int n = luaL_checkint(L, 2); - luaL_checktype(L, 1, LUA_TFUNCTION); - if (lua_isnone(L, 3)) { - const char *name = lua_getupvalue(L, 1, n); - if (name == NULL) return 0; - lua_pushstring(L, name); - return 2; - } - else { - const char *name = lua_setupvalue(L, 1, n); - lua_pushstring(L, name); - return 1; - } -} - - -static int newuserdata (lua_State *L) { - size_t size = luaL_checkint(L, 1); - char *p = cast(char *, lua_newuserdata(L, size)); - while (size--) *p++ = '\0'; - return 1; -} - - -static int pushuserdata (lua_State *L) { - lua_pushlightuserdata(L, cast(void *, luaL_checkint(L, 1))); - return 1; -} - - -static int udataval (lua_State *L) { - lua_pushintegral(L, cast(int, lua_touserdata(L, 1))); - return 1; -} - - -static int doonnewstack (lua_State *L) { - lua_State *L1 = lua_newthread(L); - size_t l; - const char *s = luaL_checklstring(L, 1, &l); - int status = luaL_loadbuffer(L1, s, l, s); - if (status == 0) - status = lua_pcall(L1, 0, 0, 0); - lua_pushintegral(L, status); - return 1; -} - - -static int s2d (lua_State *L) { - lua_pushnumber(L, *cast(const double *, luaL_checkstring(L, 1))); - return 1; -} - -static int d2s (lua_State *L) { - double d = luaL_checknumber(L, 1); - lua_pushlstring(L, cast(char *, &d), sizeof(d)); - return 1; -} - - -static int newstate (lua_State *L) { - lua_State *L1 = lua_open(); - if (L1) { - lua_userstateopen(L1); /* init lock */ - lua_pushintegral(L, (unsigned long)L1); - } - else - lua_pushnil(L); - return 1; -} - - -static int loadlib (lua_State *L) { - static const luaL_reg libs[] = { - {"mathlibopen", luaopen_math}, - {"strlibopen", luaopen_string}, - {"iolibopen", luaopen_io}, - {"tablibopen", luaopen_table}, - {"dblibopen", luaopen_debug}, - {"baselibopen", luaopen_base}, - {NULL, NULL} - }; - lua_State *L1 = cast(lua_State *, - cast(unsigned long, luaL_checknumber(L, 1))); - lua_pushvalue(L1, LUA_GLOBALSINDEX); - luaL_openlib(L1, NULL, libs, 0); - return 0; -} - -static int closestate (lua_State *L) { - lua_State *L1 = cast(lua_State *, cast(unsigned long, luaL_checknumber(L, 1))); - lua_close(L1); - lua_unlock(L); /* close cannot unlock that */ - return 0; -} - -static int doremote (lua_State *L) { - lua_State *L1 = cast(lua_State *,cast(unsigned long,luaL_checknumber(L, 1))); - size_t lcode; - const char *code = luaL_checklstring(L, 2, &lcode); - int status; - lua_settop(L1, 0); - status = luaL_loadbuffer(L1, code, lcode, code); - if (status == 0) - status = lua_pcall(L1, 0, LUA_MULTRET, 0); - if (status != 0) { - lua_pushnil(L); - lua_pushintegral(L, status); - lua_pushstring(L, lua_tostring(L1, -1)); - return 3; - } - else { - int i = 0; - while (!lua_isnone(L1, ++i)) - lua_pushstring(L, lua_tostring(L1, i)); - lua_pop(L1, i-1); - return i-1; - } -} - - -static int log2_aux (lua_State *L) { - lua_pushintegral(L, luaO_log2(luaL_checkint(L, 1))); - return 1; -} - -static int int2fb_aux (lua_State *L) { - int b = luaO_int2fb(luaL_checkint(L, 1)); - lua_pushintegral(L, b); - lua_pushintegral(L, fb2int(b)); - return 2; -} - - -static int test_do (lua_State *L) { - const char *p = luaL_checkstring(L, 1); - if (*p == '@') - lua_dofile(L, p+1); - else - lua_dostring(L, p); - return lua_gettop(L); -} - - - -/* -** {====================================================== -** function to test the API with C. It interprets a kind of assembler -** language with calls to the API, so the test can be driven by Lua code -** ======================================================= -*/ - -static const char *const delimits = " \t\n,;"; - -static void skip (const char **pc) { - while (**pc != '\0' && strchr(delimits, **pc)) (*pc)++; -} - -static int getnum_aux (lua_State *L, const char **pc) { - int res = 0; - int sig = 1; - skip(pc); - if (**pc == '.') { - res = cast(int, lua_tonumber(L, -1)); - lua_pop(L, 1); - (*pc)++; - return res; - } - else if (**pc == '-') { - sig = -1; - (*pc)++; - } - while (isdigit(cast(int, **pc))) res = res*10 + (*(*pc)++) - '0'; - return sig*res; -} - -static const char *getname_aux (char *buff, const char **pc) { - int i = 0; - skip(pc); - while (**pc != '\0' && !strchr(delimits, **pc)) - buff[i++] = *(*pc)++; - buff[i] = '\0'; - return buff; -} - - -#define EQ(s1) (strcmp(s1, inst) == 0) - -#define getnum (getnum_aux(L, &pc)) -#define getname (getname_aux(buff, &pc)) - - -static int testC (lua_State *L) { - char buff[30]; - const char *pc = luaL_checkstring(L, 1); - for (;;) { - const char *inst = getname; - if EQ("") return 0; - else if EQ("isnumber") { - lua_pushintegral(L, lua_isnumber(L, getnum)); - } - else if EQ("isstring") { - lua_pushintegral(L, lua_isstring(L, getnum)); - } - else if EQ("istable") { - lua_pushintegral(L, lua_istable(L, getnum)); - } - else if EQ("iscfunction") { - lua_pushintegral(L, lua_iscfunction(L, getnum)); - } - else if EQ("isfunction") { - lua_pushintegral(L, lua_isfunction(L, getnum)); - } - else if EQ("isuserdata") { - lua_pushintegral(L, lua_isuserdata(L, getnum)); - } - else if EQ("isudataval") { - lua_pushintegral(L, lua_islightuserdata(L, getnum)); - } - else if EQ("isnil") { - lua_pushintegral(L, lua_isnil(L, getnum)); - } - else if EQ("isnull") { - lua_pushintegral(L, lua_isnone(L, getnum)); - } - else if EQ("tonumber") { - lua_pushnumber(L, lua_tonumber(L, getnum)); - } - else if EQ("tostring") { - const char *s = lua_tostring(L, getnum); - lua_pushstring(L, s); - } - else if EQ("strlen") { - lua_pushintegral(L, lua_strlen(L, getnum)); - } - else if EQ("tocfunction") { - lua_pushcfunction(L, lua_tocfunction(L, getnum)); - } - else if EQ("return") { - return getnum; - } - else if EQ("gettop") { - lua_pushintegral(L, lua_gettop(L)); - } - else if EQ("settop") { - lua_settop(L, getnum); - } - else if EQ("pop") { - lua_pop(L, getnum); - } - else if EQ("pushnum") { - lua_pushintegral(L, getnum); - } - else if EQ("pushnil") { - lua_pushnil(L); - } - else if EQ("pushbool") { - lua_pushboolean(L, getnum); - } - else if EQ("tobool") { - lua_pushintegral(L, lua_toboolean(L, getnum)); - } - else if EQ("pushvalue") { - lua_pushvalue(L, getnum); - } - else if EQ("pushcclosure") { - lua_pushcclosure(L, testC, getnum); - } - else if EQ("pushupvalues") { - lua_pushupvalues(L); - } - else if EQ("remove") { - lua_remove(L, getnum); - } - else if EQ("insert") { - lua_insert(L, getnum); - } - else if EQ("replace") { - lua_replace(L, getnum); - } - else if EQ("gettable") { - lua_gettable(L, getnum); - } - else if EQ("settable") { - lua_settable(L, getnum); - } - else if EQ("next") { - lua_next(L, -2); - } - else if EQ("concat") { - lua_concat(L, getnum); - } - else if EQ("lessthan") { - int a = getnum; - lua_pushboolean(L, lua_lessthan(L, a, getnum)); - } - else if EQ("equal") { - int a = getnum; - lua_pushboolean(L, lua_equal(L, a, getnum)); - } - else if EQ("rawcall") { - int narg = getnum; - int nres = getnum; - lua_call(L, narg, nres); - } - else if EQ("call") { - int narg = getnum; - int nres = getnum; - lua_pcall(L, narg, nres, 0); - } - else if EQ("loadstring") { - size_t sl; - const char *s = luaL_checklstring(L, getnum, &sl); - luaL_loadbuffer(L, s, sl, s); - } - else if EQ("loadfile") { - luaL_loadfile(L, luaL_checkstring(L, getnum)); - } - else if EQ("setmetatable") { - lua_setmetatable(L, getnum); - } - else if EQ("getmetatable") { - if (lua_getmetatable(L, getnum) == 0) - lua_pushnil(L); - } - else if EQ("type") { - lua_pushstring(L, lua_typename(L, lua_type(L, getnum))); - } - else if EQ("getn") { - int i = getnum; - lua_pushintegral(L, luaL_getn(L, i)); - } - else if EQ("setn") { - int i = getnum; - int n = cast(int, lua_tonumber(L, -1)); - luaL_setn(L, i, n); - lua_pop(L, 1); - } - else luaL_error(L, "unknown instruction %s", buff); - } - return 0; -} - -/* }====================================================== */ - - -/* -** {====================================================== -** tests for yield inside hooks -** ======================================================= -*/ - -static void yieldf (lua_State *L, lua_Debug *ar) { - lua_yield(L, 0); -} - -static int setyhook (lua_State *L) { - if (lua_isnoneornil(L, 1)) - lua_sethook(L, NULL, 0, 0); /* turn off hooks */ - else { - const char *smask = luaL_checkstring(L, 1); - int count = luaL_optint(L, 2, 0); - int mask = 0; - if (strchr(smask, 'l')) mask |= LUA_MASKLINE; - if (count > 0) mask |= LUA_MASKCOUNT; - lua_sethook(L, yieldf, mask, count); - } - return 0; -} - - -static int coresume (lua_State *L) { - int status; - lua_State *co = lua_tothread(L, 1); - luaL_argcheck(L, co, 1, "coroutine expected"); - status = lua_resume(co, 0); - if (status != 0) { - lua_pushboolean(L, 0); - lua_insert(L, -2); - return 2; /* return false + error message */ - } - else { - lua_pushboolean(L, 1); - return 1; - } -} - -/* }====================================================== */ - - - -static const struct luaL_reg tests_funcs[] = { - {"hash", hash_query}, - {"limits", get_limits}, - {"listcode", listcode}, - {"listk", listk}, - {"listlocals", listlocals}, - {"loadlib", loadlib}, - {"stacklevel", stacklevel}, - {"querystr", string_query}, - {"querytab", table_query}, - {"doit", test_do}, - {"testC", testC}, - {"ref", tref}, - {"getref", getref}, - {"unref", unref}, - {"d2s", d2s}, - {"s2d", s2d}, - {"metatable", metatable}, - {"upvalue", upvalue}, - {"newuserdata", newuserdata}, - {"pushuserdata", pushuserdata}, - {"udataval", udataval}, - {"doonnewstack", doonnewstack}, - {"newstate", newstate}, - {"closestate", closestate}, - {"doremote", doremote}, - {"log2", log2_aux}, - {"int2fb", int2fb_aux}, - {"totalmem", mem_query}, - {"resume", coresume}, - {"setyhook", setyhook}, - {NULL, NULL} -}; - - -static void fim (void) { - if (!islocked) - lua_close(lua_state); - lua_assert(memdebug_numblocks == 0); - lua_assert(memdebug_total == 0); -} - - -static int l_panic (lua_State *L) { - UNUSED(L); - fprintf(stderr, "unable to recover; exiting\n"); - return 0; -} - - -int luaB_opentests (lua_State *L) { - lua_atpanic(L, l_panic); - lua_userstateopen(L); /* init lock */ - lua_state = L; /* keep first state to be opened */ - luaL_openlib(L, "T", tests_funcs, 0); - atexit(fim); - return 0; -} - - -#undef main -int main (int argc, char *argv[]) { - char *limit = getenv("MEMLIMIT"); - if (limit) - memdebug_memlimit = strtoul(limit, NULL, 10); - l_main(argc, argv); - return 0; -} - -#endif diff --git a/plugins/SmartAutoReplier/lualib/ltm.c b/plugins/SmartAutoReplier/lualib/ltm.c deleted file mode 100644 index 1b3e515e57..0000000000 --- a/plugins/SmartAutoReplier/lualib/ltm.c +++ /dev/null @@ -1,70 +0,0 @@ -/* -** $Id: ltm.c,v 1.106 2003/04/03 13:35:34 roberto Exp $ -** Tag methods -** See Copyright Notice in lua.h -*/ - - -#include - -#define ltm_c - -#include "lua.h" - -#include "lobject.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" - - - -const char *const luaT_typenames[] = { - "nil", "boolean", "userdata", "number", - "string", "table", "function", "userdata", "thread" -}; - - -void luaT_init (lua_State *L) { - static const char *const luaT_eventname[] = { /* ORDER TM */ - "__index", "__newindex", - "__gc", "__mode", "__eq", - "__add", "__sub", "__mul", "__div", - "__pow", "__unm", "__lt", "__le", - "__concat", "__call" - }; - int i; - for (i=0; itmname[i] = luaS_new(L, luaT_eventname[i]); - luaS_fix(G(L)->tmname[i]); /* never collect these names */ - } -} - - -/* -** function to be used with macro "fasttm": optimized for absence of -** tag methods -*/ -const TObject *luaT_gettm (Table *events, TMS event, TString *ename) { - const TObject *tm = luaH_getstr(events, ename); - lua_assert(event <= TM_EQ); - if (ttisnil(tm)) { /* no tag method? */ - events->flags |= cast(lu_byte, 1u<tmname[event]; - switch (ttype(o)) { - case LUA_TTABLE: - return luaH_getstr(hvalue(o)->metatable, ename); - case LUA_TUSERDATA: - return luaH_getstr(uvalue(o)->uv.metatable, ename); - default: - return &luaO_nilobject; - } -} - diff --git a/plugins/SmartAutoReplier/lualib/ltm.h b/plugins/SmartAutoReplier/lualib/ltm.h deleted file mode 100644 index 8eebfd3dc3..0000000000 --- a/plugins/SmartAutoReplier/lualib/ltm.h +++ /dev/null @@ -1,51 +0,0 @@ -/* -** $Id: ltm.h,v 1.41 2002/11/14 11:51:50 roberto Exp $ -** Tag methods -** See Copyright Notice in lua.h -*/ - -#ifndef ltm_h -#define ltm_h - - -#include "lobject.h" - - -/* -* WARNING: if you change the order of this enumeration, -* grep "ORDER TM" -*/ -typedef enum { - TM_INDEX, - TM_NEWINDEX, - TM_GC, - TM_MODE, - TM_EQ, /* last tag method with `fast' access */ - TM_ADD, - TM_SUB, - TM_MUL, - TM_DIV, - TM_POW, - TM_UNM, - TM_LT, - TM_LE, - TM_CONCAT, - TM_CALL, - TM_N /* number of elements in the enum */ -} TMS; - - - -#define gfasttm(g,et,e) \ - (((et)->flags & (1u<<(e))) ? NULL : luaT_gettm(et, e, (g)->tmname[e])) - -#define fasttm(l,et,e) gfasttm(G(l), et, e) - - -const TObject *luaT_gettm (Table *events, TMS event, TString *ename); -const TObject *luaT_gettmbyobj (lua_State *L, const TObject *o, TMS event); -void luaT_init (lua_State *L); - -extern const char *const luaT_typenames[]; - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lua.h b/plugins/SmartAutoReplier/lualib/lua.h deleted file mode 100644 index 0d827b10c7..0000000000 --- a/plugins/SmartAutoReplier/lualib/lua.h +++ /dev/null @@ -1,391 +0,0 @@ -/* -** $Id: lua.h,v 1.175 2003/03/18 12:31:39 roberto Exp $ -** Lua - An Extensible Extension Language -** Tecgraf: Computer Graphics Technology Group, PUC-Rio, Brazil -** http://www.lua.org mailto:info@lua.org -** See Copyright Notice at the end of this file -*/ - - -#ifndef lua_h -#define lua_h - -#include -#include - - -#define LUA_VERSION "Lua 5.0" -#define LUA_COPYRIGHT "Copyright (C) 1994-2003 Tecgraf, PUC-Rio" -#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo & W. Celes" - - - -/* option for multiple returns in `lua_pcall' and `lua_call' */ -#define LUA_MULTRET (-1) - - -/* -** pseudo-indices -*/ -#define LUA_REGISTRYINDEX (-10000) -#define LUA_GLOBALSINDEX (-10001) -#define lua_upvalueindex(i) (LUA_GLOBALSINDEX-(i)) - - -/* error codes for `lua_load' and `lua_pcall' */ -#define LUA_ERRRUN 1 -#define LUA_ERRFILE 2 -#define LUA_ERRSYNTAX 3 -#define LUA_ERRMEM 4 -#define LUA_ERRERR 5 - - -typedef struct lua_State lua_State; - -typedef int (*lua_CFunction) (lua_State *L); - - -/* -** functions that read/write blocks when loading/dumping Lua chunks -*/ -typedef const char * (*lua_Chunkreader) (lua_State *L, void *ud, size_t *sz); - -typedef int (*lua_Chunkwriter) (lua_State *L, const void* p, - size_t sz, void* ud); - - -/* -** basic types -*/ -#define LUA_TNONE (-1) - -#define LUA_TNIL 0 -#define LUA_TBOOLEAN 1 -#define LUA_TLIGHTUSERDATA 2 -#define LUA_TNUMBER 3 -#define LUA_TSTRING 4 -#define LUA_TTABLE 5 -#define LUA_TFUNCTION 6 -#define LUA_TUSERDATA 7 -#define LUA_TTHREAD 8 - - -/* minimum Lua stack available to a C function */ -#define LUA_MINSTACK 20 - - -/* -** generic extra include file -*/ -#ifdef LUA_USER_H -#include LUA_USER_H -#endif - - -/* type of numbers in Lua */ -#ifndef LUA_NUMBER -typedef double lua_Number; -#else -typedef LUA_NUMBER lua_Number; -#endif - - -/* mark for all API functions */ -#ifndef LUA_API -#define LUA_API extern -#endif - - -/* -** state manipulation -*/ -LUA_API lua_State *lua_open (void); -LUA_API void lua_close (lua_State *L); -LUA_API lua_State *lua_newthread (lua_State *L); - -LUA_API lua_CFunction lua_atpanic (lua_State *L, lua_CFunction panicf); - - -/* -** basic stack manipulation -*/ -LUA_API int lua_gettop (lua_State *L); -LUA_API void lua_settop (lua_State *L, int idx); -LUA_API void lua_pushvalue (lua_State *L, int idx); -LUA_API void lua_remove (lua_State *L, int idx); -LUA_API void lua_insert (lua_State *L, int idx); -LUA_API void lua_replace (lua_State *L, int idx); -LUA_API int lua_checkstack (lua_State *L, int sz); - -LUA_API void lua_xmove (lua_State *from, lua_State *to, int n); - - -/* -** access functions (stack -> C) -*/ - -LUA_API int lua_isnumber (lua_State *L, int idx); -LUA_API int lua_isstring (lua_State *L, int idx); -LUA_API int lua_iscfunction (lua_State *L, int idx); -LUA_API int lua_isuserdata (lua_State *L, int idx); -LUA_API int lua_type (lua_State *L, int idx); -LUA_API const char *lua_typename (lua_State *L, int tp); - -LUA_API int lua_equal (lua_State *L, int idx1, int idx2); -LUA_API int lua_rawequal (lua_State *L, int idx1, int idx2); -LUA_API int lua_lessthan (lua_State *L, int idx1, int idx2); - -LUA_API lua_Number lua_tonumber (lua_State *L, int idx); -LUA_API int lua_toboolean (lua_State *L, int idx); -LUA_API const char *lua_tostring (lua_State *L, int idx); -LUA_API size_t lua_strlen (lua_State *L, int idx); -LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx); -LUA_API void *lua_touserdata (lua_State *L, int idx); -LUA_API lua_State *lua_tothread (lua_State *L, int idx); -LUA_API const void *lua_topointer (lua_State *L, int idx); - - -/* -** push functions (C -> stack) -*/ -LUA_API void lua_pushnil (lua_State *L); -LUA_API void lua_pushnumber (lua_State *L, lua_Number n); -LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t l); -LUA_API void lua_pushstring (lua_State *L, const char *s); -LUA_API const char *lua_pushvfstring (lua_State *L, const char *fmt, - va_list argp); -LUA_API const char *lua_pushfstring (lua_State *L, const char *fmt, ...); -LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n); -LUA_API void lua_pushboolean (lua_State *L, int b); -LUA_API void lua_pushlightuserdata (lua_State *L, void *p); - - -/* -** get functions (Lua -> stack) -*/ -LUA_API void lua_gettable (lua_State *L, int idx); -LUA_API void lua_rawget (lua_State *L, int idx); -LUA_API void lua_rawgeti (lua_State *L, int idx, int n); -LUA_API void lua_newtable (lua_State *L); -LUA_API void *lua_newuserdata (lua_State *L, size_t sz); -LUA_API int lua_getmetatable (lua_State *L, int objindex); -LUA_API void lua_getfenv (lua_State *L, int idx); - - -/* -** set functions (stack -> Lua) -*/ -LUA_API void lua_settable (lua_State *L, int idx); -LUA_API void lua_rawset (lua_State *L, int idx); -LUA_API void lua_rawseti (lua_State *L, int idx, int n); -LUA_API int lua_setmetatable (lua_State *L, int objindex); -LUA_API int lua_setfenv (lua_State *L, int idx); - - -/* -** `load' and `call' functions (load and run Lua code) -*/ -LUA_API void lua_call (lua_State *L, int nargs, int nresults); -LUA_API int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc); -LUA_API int lua_cpcall (lua_State *L, lua_CFunction func, void *ud); -LUA_API int lua_load (lua_State *L, lua_Chunkreader reader, void *dt, - const char *chunkname); - -LUA_API int lua_dump (lua_State *L, lua_Chunkwriter writer, void *data); - - -/* -** coroutine functions -*/ -LUA_API int lua_yield (lua_State *L, int nresults); -LUA_API int lua_resume (lua_State *L, int narg); - -/* -** garbage-collection functions -*/ -LUA_API int lua_getgcthreshold (lua_State *L); -LUA_API int lua_getgccount (lua_State *L); -LUA_API void lua_setgcthreshold (lua_State *L, int newthreshold); - -/* -** miscellaneous functions -*/ - -LUA_API const char *lua_version (void); - -LUA_API int lua_error (lua_State *L); - -LUA_API int lua_next (lua_State *L, int idx); - -LUA_API void lua_concat (lua_State *L, int n); - - - -/* -** =============================================================== -** some useful macros -** =============================================================== -*/ - -#define lua_boxpointer(L,u) \ - (*(void **)(lua_newuserdata(L, sizeof(void *))) = (u)) - -#define lua_unboxpointer(L,i) (*(void **)(lua_touserdata(L, i))) - -#define lua_pop(L,n) lua_settop(L, -(n)-1) - -#define lua_register(L,n,f) \ - (lua_pushstring(L, n), \ - lua_pushcfunction(L, f), \ - lua_settable(L, LUA_GLOBALSINDEX)) - -#define lua_pushcfunction(L,f) lua_pushcclosure(L, f, 0) - -#define lua_isfunction(L,n) (lua_type(L,n) == LUA_TFUNCTION) -#define lua_istable(L,n) (lua_type(L,n) == LUA_TTABLE) -#define lua_islightuserdata(L,n) (lua_type(L,n) == LUA_TLIGHTUSERDATA) -#define lua_isnil(L,n) (lua_type(L,n) == LUA_TNIL) -#define lua_isboolean(L,n) (lua_type(L,n) == LUA_TBOOLEAN) -#define lua_isnone(L,n) (lua_type(L,n) == LUA_TNONE) -#define lua_isnoneornil(L, n) (lua_type(L,n) <= 0) - -#define lua_pushliteral(L, s) \ - lua_pushlstring(L, "" s, (sizeof(s)/sizeof(char))-1) - - - -/* -** compatibility macros and functions -*/ - - -LUA_API int lua_pushupvalues (lua_State *L); - -#define lua_getregistry(L) lua_pushvalue(L, LUA_REGISTRYINDEX) -#define lua_setglobal(L,s) \ - (lua_pushstring(L, s), lua_insert(L, -2), lua_settable(L, LUA_GLOBALSINDEX)) - -#define lua_getglobal(L,s) \ - (lua_pushstring(L, s), lua_gettable(L, LUA_GLOBALSINDEX)) - - -/* compatibility with ref system */ - -/* pre-defined references */ -#define LUA_NOREF (-2) -#define LUA_REFNIL (-1) - -#define lua_ref(L,lock) ((lock) ? luaL_ref(L, LUA_REGISTRYINDEX) : \ - (lua_pushstring(L, "unlocked references are obsolete"), lua_error(L), 0)) - -#define lua_unref(L,ref) luaL_unref(L, LUA_REGISTRYINDEX, (ref)) - -#define lua_getref(L,ref) lua_rawgeti(L, LUA_REGISTRYINDEX, ref) - - - -/* -** {====================================================================== -** useful definitions for Lua kernel and libraries -** ======================================================================= -*/ - -/* formats for Lua numbers */ -#ifndef LUA_NUMBER_SCAN -#define LUA_NUMBER_SCAN "%lf" -#endif - -#ifndef LUA_NUMBER_FMT -#define LUA_NUMBER_FMT "%.14g" -#endif - -/* }====================================================================== */ - - -/* -** {====================================================================== -** Debug API -** ======================================================================= -*/ - - -/* -** Event codes -*/ -#define LUA_HOOKCALL 0 -#define LUA_HOOKRET 1 -#define LUA_HOOKLINE 2 -#define LUA_HOOKCOUNT 3 -#define LUA_HOOKTAILRET 4 - - -/* -** Event masks -*/ -#define LUA_MASKCALL (1 << LUA_HOOKCALL) -#define LUA_MASKRET (1 << LUA_HOOKRET) -#define LUA_MASKLINE (1 << LUA_HOOKLINE) -#define LUA_MASKCOUNT (1 << LUA_HOOKCOUNT) - -typedef struct lua_Debug lua_Debug; /* activation record */ - -typedef void (*lua_Hook) (lua_State *L, lua_Debug *ar); - - -LUA_API int lua_getstack (lua_State *L, int level, lua_Debug *ar); -LUA_API int lua_getinfo (lua_State *L, const char *what, lua_Debug *ar); -LUA_API const char *lua_getlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_setlocal (lua_State *L, const lua_Debug *ar, int n); -LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n); -LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n); - -LUA_API int lua_sethook (lua_State *L, lua_Hook func, int mask, int count); -LUA_API lua_Hook lua_gethook (lua_State *L); -LUA_API int lua_gethookmask (lua_State *L); -LUA_API int lua_gethookcount (lua_State *L); - - -#define LUA_IDSIZE 60 - -struct lua_Debug { - int event; - const char *name; /* (n) */ - const char *namewhat; /* (n) `global', `local', `field', `method' */ - const char *what; /* (S) `Lua', `C', `main', `tail' */ - const char *source; /* (S) */ - int currentline; /* (l) */ - int nups; /* (u) number of upvalues */ - int linedefined; /* (S) */ - char short_src[LUA_IDSIZE]; /* (S) */ - /* private part */ - int i_ci; /* active function */ -}; - -/* }====================================================================== */ - - -/****************************************************************************** -* Copyright (C) 1994-2003 Tecgraf, PUC-Rio. All rights reserved. -* -* Permission is hereby granted, free of charge, to any person obtaining -* a copy of this software and associated documentation files (the -* "Software"), to deal in the Software without restriction, including -* without limitation the rights to use, copy, modify, merge, publish, -* distribute, sublicense, and/or sell copies of the Software, and to -* permit persons to whom the Software is furnished to do so, subject to -* the following conditions: -* -* The above copyright notice and this permission notice shall be -* included in all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -******************************************************************************/ - - -#endif diff --git a/plugins/SmartAutoReplier/lualib/luainc.h b/plugins/SmartAutoReplier/lualib/luainc.h deleted file mode 100644 index 1306197b64..0000000000 --- a/plugins/SmartAutoReplier/lualib/luainc.h +++ /dev/null @@ -1,12 +0,0 @@ - -#ifndef __LUA_INC_H__ -#define __LUA_INC_H__ - -extern "C" -{ - #include "lualib/lua.h" - #include "lualib/lauxlib.h" - #include "lualib/lualib.h" -} - -#endif // __LUA_INC_H__ \ No newline at end of file diff --git a/plugins/SmartAutoReplier/lualib/lualib.h b/plugins/SmartAutoReplier/lualib/lualib.h deleted file mode 100644 index e22c4c3063..0000000000 --- a/plugins/SmartAutoReplier/lualib/lualib.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -** $Id: lualib.h,v 1.28 2003/03/18 12:24:26 roberto Exp $ -** Lua standard libraries -** See Copyright Notice in lua.h -*/ - - -#ifndef lualib_h -#define lualib_h - -#include "lua.h" - - -#ifndef LUALIB_API -#define LUALIB_API LUA_API -#endif - - -#define LUA_COLIBNAME "coroutine" -LUALIB_API int luaopen_base (lua_State *L); - -#define LUA_TABLIBNAME "table" -LUALIB_API int luaopen_table (lua_State *L); - -#define LUA_IOLIBNAME "io" -#define LUA_OSLIBNAME "os" -LUALIB_API int luaopen_io (lua_State *L); - -#define LUA_STRLIBNAME "string" -LUALIB_API int luaopen_string (lua_State *L); - -#define LUA_MATHLIBNAME "math" -LUALIB_API int luaopen_math (lua_State *L); - -#define LUA_DBLIBNAME "debug" -LUALIB_API int luaopen_debug (lua_State *L); - - -LUALIB_API int luaopen_loadlib (lua_State *L); - - -/* to help testing the libraries */ -#ifndef lua_assert -#define lua_assert(c) /* empty */ -#endif - - -/* compatibility code */ -#define lua_baselibopen luaopen_base -#define lua_tablibopen luaopen_table -#define lua_iolibopen luaopen_io -#define lua_strlibopen luaopen_string -#define lua_mathlibopen luaopen_math -#define lua_dblibopen luaopen_debug - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lualib.vcxproj b/plugins/SmartAutoReplier/lualib/lualib.vcxproj deleted file mode 100644 index b7618412cf..0000000000 --- a/plugins/SmartAutoReplier/lualib/lualib.vcxproj +++ /dev/null @@ -1,138 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - - {6DB53D29-2EA9-407B-84F3-06E8031F3314} - Win32Proj - lualib - - - - StaticLibrary - true - Unicode - - - StaticLibrary - false - true - Unicode - - - - - - - - - - - - - - - NotUsing - Level3 - Disabled - WIN32;_DEBUG;_LIB - MultiThreadedDebug - - - Windows - true - - - - - Level3 - NotUsing - MaxSpeed - true - true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - MultiThreaded - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - - - - - - \ No newline at end of file diff --git a/plugins/SmartAutoReplier/lualib/lualib.vcxproj.filters b/plugins/SmartAutoReplier/lualib/lualib.vcxproj.filters deleted file mode 100644 index a224003846..0000000000 --- a/plugins/SmartAutoReplier/lualib/lualib.vcxproj.filters +++ /dev/null @@ -1,186 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - \ No newline at end of file diff --git a/plugins/SmartAutoReplier/lualib/lundump.c b/plugins/SmartAutoReplier/lualib/lundump.c deleted file mode 100644 index 151a8507cc..0000000000 --- a/plugins/SmartAutoReplier/lualib/lundump.c +++ /dev/null @@ -1,286 +0,0 @@ -/* -** $Id: lundump.c,v 1.49 2003/04/07 20:34:20 lhf Exp $ -** load pre-compiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#define lundump_c - -#include "lua.h" - -#include "ldebug.h" -#include "lfunc.h" -#include "lmem.h" -#include "lopcodes.h" -#include "lstring.h" -#include "lundump.h" -#include "lzio.h" - -#define LoadByte (lu_byte) ezgetc - -typedef struct { - lua_State* L; - ZIO* Z; - Mbuffer* b; - int swap; - const char* name; -} LoadState; - -static void unexpectedEOZ (LoadState* S) -{ - luaG_runerror(S->L,"unexpected end of file in %s",S->name); -} - -static int ezgetc (LoadState* S) -{ - int c=zgetc(S->Z); - if (c==EOZ) unexpectedEOZ(S); - return c; -} - -static void ezread (LoadState* S, void* b, int n) -{ - int r=luaZ_read(S->Z,b,n); - if (r!=0) unexpectedEOZ(S); -} - -static void LoadBlock (LoadState* S, void* b, size_t size) -{ - if (S->swap) - { - char* p=(char*) b+size-1; - int n=size; - while (n--) *p--=(char)ezgetc(S); - } - else - ezread(S,b,size); -} - -static void LoadVector (LoadState* S, void* b, int m, size_t size) -{ - if (S->swap) - { - char* q=(char*) b; - while (m--) - { - char* p=q+size-1; - int n=size; - while (n--) *p--=(char)ezgetc(S); - q+=size; - } - } - else - ezread(S,b,m*size); -} - -static int LoadInt (LoadState* S) -{ - int x; - LoadBlock(S,&x,sizeof(x)); - if (x<0) luaG_runerror(S->L,"bad integer in %s",S->name); - return x; -} - -static size_t LoadSize (LoadState* S) -{ - size_t x; - LoadBlock(S,&x,sizeof(x)); - return x; -} - -static lua_Number LoadNumber (LoadState* S) -{ - lua_Number x; - LoadBlock(S,&x,sizeof(x)); - return x; -} - -static TString* LoadString (LoadState* S) -{ - size_t size=LoadSize(S); - if (size==0) - return NULL; - else - { - char* s=luaZ_openspace(S->L,S->b,size); - ezread(S,s,size); - return luaS_newlstr(S->L,s,size-1); /* remove trailing '\0' */ - } -} - -static void LoadCode (LoadState* S, Proto* f) -{ - int size=LoadInt(S); - f->code=luaM_newvector(S->L,size,Instruction); - f->sizecode=size; - LoadVector(S,f->code,size,sizeof(*f->code)); -} - -static void LoadLocals (LoadState* S, Proto* f) -{ - int i,n; - n=LoadInt(S); - f->locvars=luaM_newvector(S->L,n,LocVar); - f->sizelocvars=n; - for (i=0; ilocvars[i].varname=LoadString(S); - f->locvars[i].startpc=LoadInt(S); - f->locvars[i].endpc=LoadInt(S); - } -} - -static void LoadLines (LoadState* S, Proto* f) -{ - int size=LoadInt(S); - f->lineinfo=luaM_newvector(S->L,size,int); - f->sizelineinfo=size; - LoadVector(S,f->lineinfo,size,sizeof(*f->lineinfo)); -} - -static void LoadUpvalues (LoadState* S, Proto* f) -{ - int i,n; - n=LoadInt(S); - if (n!=0 && n!=f->nups) - luaG_runerror(S->L,"bad nupvalues in %s: read %d; expected %d", - S->name,n,f->nups); - f->upvalues=luaM_newvector(S->L,n,TString*); - f->sizeupvalues=n; - for (i=0; iupvalues[i]=LoadString(S); -} - -static Proto* LoadFunction (LoadState* S, TString* p); - -static void LoadConstants (LoadState* S, Proto* f) -{ - int i,n; - n=LoadInt(S); - f->k=luaM_newvector(S->L,n,TObject); - f->sizek=n; - for (i=0; ik[i]; - int t=LoadByte(S); - switch (t) - { - case LUA_TNUMBER: - setnvalue(o,LoadNumber(S)); - break; - case LUA_TSTRING: - setsvalue2n(o,LoadString(S)); - break; - case LUA_TNIL: - setnilvalue(o); - break; - default: - luaG_runerror(S->L,"bad constant type (%d) in %s",t,S->name); - break; - } - } - n=LoadInt(S); - f->p=luaM_newvector(S->L,n,Proto*); - f->sizep=n; - for (i=0; ip[i]=LoadFunction(S,f->source); -} - -static Proto* LoadFunction (LoadState* S, TString* p) -{ - Proto* f=luaF_newproto(S->L); - f->source=LoadString(S); if (f->source==NULL) f->source=p; - f->lineDefined=LoadInt(S); - f->nups=LoadByte(S); - f->numparams=LoadByte(S); - f->is_vararg=LoadByte(S); - f->maxstacksize=LoadByte(S); - LoadLines(S,f); - LoadLocals(S,f); - LoadUpvalues(S,f); - LoadConstants(S,f); - LoadCode(S,f); -#ifndef TRUST_BINARIES - if (!luaG_checkcode(f)) luaG_runerror(S->L,"bad code in %s",S->name); -#endif - return f; -} - -static void LoadSignature (LoadState* S) -{ - const char* s=LUA_SIGNATURE; - while (*s!=0 && ezgetc(S)==*s) - ++s; - if (*s!=0) luaG_runerror(S->L,"bad signature in %s",S->name); -} - -static void TestSize (LoadState* S, int s, const char* what) -{ - int r=LoadByte(S); - if (r!=s) - luaG_runerror(S->L,"virtual machine mismatch in %s: " - "size of %s is %d but read %d",S->name,what,s,r); -} - -#define TESTSIZE(s,w) TestSize(S,s,w) -#define V(v) v/16,v%16 - -static void LoadHeader (LoadState* S) -{ - int version; - lua_Number x,tx=TEST_NUMBER; - LoadSignature(S); - version=LoadByte(S); - if (version>VERSION) - luaG_runerror(S->L,"%s too new: " - "read version %d.%d; expected at most %d.%d", - S->name,V(version),V(VERSION)); - if (versionL,"%s too old: " - "read version %d.%d; expected at least %d.%d", - S->name,V(version),V(VERSION0)); - S->swap=(luaU_endianness()!=LoadByte(S)); /* need to swap bytes? */ - TESTSIZE(sizeof(int),"int"); - TESTSIZE(sizeof(size_t), "size_t"); - TESTSIZE(sizeof(Instruction), "Instruction"); - TESTSIZE(SIZE_OP, "OP"); - TESTSIZE(SIZE_A, "A"); - TESTSIZE(SIZE_B, "B"); - TESTSIZE(SIZE_C, "C"); - TESTSIZE(sizeof(lua_Number), "number"); - x=LoadNumber(S); - if ((long)x!=(long)tx) /* disregard errors in last bits of fraction */ - luaG_runerror(S->L,"unknown number format in %s",S->name); -} - -static Proto* LoadChunk (LoadState* S) -{ - LoadHeader(S); - return LoadFunction(S,NULL); -} - -/* -** load precompiled chunk -*/ -Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff) -{ - LoadState S; - const char* s=zname(Z); - if (*s=='@' || *s=='=') - S.name=s+1; - else if (*s==LUA_SIGNATURE[0]) - S.name="binary string"; - else - S.name=s; - S.L=L; - S.Z=Z; - S.b=buff; - return LoadChunk(&S); -} - -/* -** find byte order -*/ -int luaU_endianness (void) -{ - int x=1; - return *(char*)&x; -} diff --git a/plugins/SmartAutoReplier/lualib/lundump.h b/plugins/SmartAutoReplier/lualib/lundump.h deleted file mode 100644 index c7e6959b30..0000000000 --- a/plugins/SmartAutoReplier/lualib/lundump.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -** $Id: lundump.h,v 1.30 2003/04/07 20:34:20 lhf Exp $ -** load pre-compiled Lua chunks -** See Copyright Notice in lua.h -*/ - -#ifndef lundump_h -#define lundump_h - -#include "lobject.h" -#include "lzio.h" - -/* load one chunk; from lundump.c */ -Proto* luaU_undump (lua_State* L, ZIO* Z, Mbuffer* buff); - -/* find byte order; from lundump.c */ -int luaU_endianness (void); - -/* dump one chunk; from ldump.c */ -void luaU_dump (lua_State* L, const Proto* Main, lua_Chunkwriter w, void* data); - -/* print one chunk; from print.c */ -void luaU_print (const Proto* Main); - -/* definitions for headers of binary files */ -#define LUA_SIGNATURE "\033Lua" /* binary files start with "Lua" */ -#define VERSION 0x50 /* last format change was in 5.0 */ -#define VERSION0 0x50 /* last major change was in 5.0 */ - -/* a multiple of PI for testing native format */ -/* multiplying by 1E7 gives non-trivial integer values */ -#define TEST_NUMBER ((lua_Number)3.14159265358979323846E7) - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lvm.c b/plugins/SmartAutoReplier/lualib/lvm.c deleted file mode 100644 index eaa5c700b0..0000000000 --- a/plugins/SmartAutoReplier/lualib/lvm.c +++ /dev/null @@ -1,780 +0,0 @@ -/* -** $Id: lvm.c,v 1.284 2003/04/03 13:35:34 roberto Exp $ -** Lua virtual machine -** See Copyright Notice in lua.h -*/ - - -#include -#include -#include - -/* needed only when `lua_number2str' uses `sprintf' */ -#include - -#define lvm_c - -#include "lua.h" - -#include "ldebug.h" -#include "ldo.h" -#include "lfunc.h" -#include "lgc.h" -#include "lobject.h" -#include "lopcodes.h" -#include "lstate.h" -#include "lstring.h" -#include "ltable.h" -#include "ltm.h" -#include "lvm.h" - - - -/* function to convert a lua_Number to a string */ -#ifndef lua_number2str -#define lua_number2str(s,n) sprintf((s), LUA_NUMBER_FMT, (n)) -#endif - - -/* limit for table tag-method chains (to avoid loops) */ -#define MAXTAGLOOP 100 - - -const TObject *luaV_tonumber (const TObject *obj, TObject *n) { - lua_Number num; - if (ttisnumber(obj)) return obj; - if (ttisstring(obj) && luaO_str2d(svalue(obj), &num)) { - setnvalue(n, num); - return n; - } - else - return NULL; -} - - -int luaV_tostring (lua_State *L, StkId obj) { - if (!ttisnumber(obj)) - return 0; - else { - char s[32]; /* 16 digits, sign, point and \0 (+ some extra...) */ - lua_number2str(s, nvalue(obj)); - setsvalue2s(obj, luaS_new(L, s)); - return 1; - } -} - - -static void traceexec (lua_State *L) { - lu_byte mask = L->hookmask; - if (mask > LUA_MASKLINE) { /* instruction-hook set? */ - if (L->hookcount == 0) { - resethookcount(L); - luaD_callhook(L, LUA_HOOKCOUNT, -1); - return; - } - } - if (mask & LUA_MASKLINE) { - CallInfo *ci = L->ci; - Proto *p = ci_func(ci)->l.p; - int newline = getline(p, pcRel(*ci->u.l.pc, p)); - if (!L->hookinit) { - luaG_inithooks(L); - return; - } - lua_assert(ci->state & CI_HASFRAME); - if (pcRel(*ci->u.l.pc, p) == 0) /* tracing may be starting now? */ - ci->u.l.savedpc = *ci->u.l.pc; /* initialize `savedpc' */ - /* calls linehook when enters a new line or jumps back (loop) */ - if (*ci->u.l.pc <= ci->u.l.savedpc || - newline != getline(p, pcRel(ci->u.l.savedpc, p))) { - luaD_callhook(L, LUA_HOOKLINE, newline); - ci = L->ci; /* previous call may reallocate `ci' */ - } - ci->u.l.savedpc = *ci->u.l.pc; - } -} - - -static void callTMres (lua_State *L, const TObject *f, - const TObject *p1, const TObject *p2) { - setobj2s(L->top, f); /* push function */ - setobj2s(L->top+1, p1); /* 1st argument */ - setobj2s(L->top+2, p2); /* 2nd argument */ - luaD_checkstack(L, 3); /* cannot check before (could invalidate p1, p2) */ - L->top += 3; - luaD_call(L, L->top - 3, 1); - L->top--; /* result will be in L->top */ -} - - - -static void callTM (lua_State *L, const TObject *f, - const TObject *p1, const TObject *p2, const TObject *p3) { - setobj2s(L->top, f); /* push function */ - setobj2s(L->top+1, p1); /* 1st argument */ - setobj2s(L->top+2, p2); /* 2nd argument */ - setobj2s(L->top+3, p3); /* 3th argument */ - luaD_checkstack(L, 4); /* cannot check before (could invalidate p1...p3) */ - L->top += 4; - luaD_call(L, L->top - 4, 0); -} - - -static const TObject *luaV_index (lua_State *L, const TObject *t, - TObject *key, int loop) { - const TObject *tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); - if (tm == NULL) return &luaO_nilobject; /* no TM */ - if (ttisfunction(tm)) { - callTMres(L, tm, t, key); - return L->top; - } - else return luaV_gettable(L, tm, key, loop); -} - -static const TObject *luaV_getnotable (lua_State *L, const TObject *t, - TObject *key, int loop) { - const TObject *tm = luaT_gettmbyobj(L, t, TM_INDEX); - if (ttisnil(tm)) - luaG_typeerror(L, t, "index"); - if (ttisfunction(tm)) { - callTMres(L, tm, t, key); - return L->top; - } - else return luaV_gettable(L, tm, key, loop); -} - - -/* -** Function to index a table. -** Receives the table at `t' and the key at `key'. -** leaves the result at `res'. -*/ -const TObject *luaV_gettable (lua_State *L, const TObject *t, TObject *key, - int loop) { - if (loop > MAXTAGLOOP) - luaG_runerror(L, "loop in gettable"); - if (ttistable(t)) { /* `t' is a table? */ - Table *h = hvalue(t); - const TObject *v = luaH_get(h, key); /* do a primitive get */ - if (!ttisnil(v)) return v; - else return luaV_index(L, t, key, loop+1); - } - else return luaV_getnotable(L, t, key, loop+1); -} - - -/* -** Receives table at `t', key at `key' and value at `val'. -*/ -void luaV_settable (lua_State *L, const TObject *t, TObject *key, StkId val) { - const TObject *tm; - int loop = 0; - do { - if (ttistable(t)) { /* `t' is a table? */ - Table *h = hvalue(t); - TObject *oldval = luaH_set(L, h, key); /* do a primitive set */ - if (!ttisnil(oldval) || /* result is no nil? */ - (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ - setobj2t(oldval, val); /* write barrier */ - return; - } - /* else will try the tag method */ - } - else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) - luaG_typeerror(L, t, "index"); - if (ttisfunction(tm)) { - callTM(L, tm, t, key, val); - return; - } - t = tm; /* else repeat with `tm' */ - } while (++loop <= MAXTAGLOOP); - luaG_runerror(L, "loop in settable"); -} - - -static int call_binTM (lua_State *L, const TObject *p1, const TObject *p2, - StkId res, TMS event) { - ptrdiff_t result = savestack(L, res); - const TObject *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ - if (ttisnil(tm)) - tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ - if (!ttisfunction(tm)) return 0; - callTMres(L, tm, p1, p2); - res = restorestack(L, result); /* previous call may change stack */ - setobjs2s(res, L->top); - return 1; -} - - -static const TObject *get_compTM (lua_State *L, Table *mt1, Table *mt2, - TMS event) { - const TObject *tm1 = fasttm(L, mt1, event); - const TObject *tm2; - if (tm1 == NULL) return NULL; /* no metamethod */ - if (mt1 == mt2) return tm1; /* same metatables => same metamethods */ - tm2 = fasttm(L, mt2, event); - if (tm2 == NULL) return NULL; /* no metamethod */ - if (luaO_rawequalObj(tm1, tm2)) /* same metamethods? */ - return tm1; - return NULL; -} - - -static int call_orderTM (lua_State *L, const TObject *p1, const TObject *p2, - TMS event) { - const TObject *tm1 = luaT_gettmbyobj(L, p1, event); - const TObject *tm2; - if (ttisnil(tm1)) return -1; /* no metamethod? */ - tm2 = luaT_gettmbyobj(L, p2, event); - if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */ - return -1; - callTMres(L, tm1, p1, p2); - return !l_isfalse(L->top); -} - - -static int luaV_strcmp (const TString *ls, const TString *rs) { - const char *l = getstr(ls); - size_t ll = ls->tsv.len; - const char *r = getstr(rs); - size_t lr = rs->tsv.len; - for (;;) { - int temp = strcoll(l, r); - if (temp != 0) return temp; - else { /* strings are equal up to a `\0' */ - size_t len = strlen(l); /* index of first `\0' in both strings */ - if (len == lr) /* r is finished? */ - return (len == ll) ? 0 : 1; - else if (len == ll) /* l is finished? */ - return -1; /* l is smaller than r (because r is not finished) */ - /* both strings longer than `len'; go on comparing (after the `\0') */ - len++; - l += len; ll -= len; r += len; lr -= len; - } - } -} - - -int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r) { - int res; - if (ttype(l) != ttype(r)) - return luaG_ordererror(L, l, r); - else if (ttisnumber(l)) - return nvalue(l) < nvalue(r); - else if (ttisstring(l)) - return luaV_strcmp(tsvalue(l), tsvalue(r)) < 0; - else if ((res = call_orderTM(L, l, r, TM_LT)) != -1) - return res; - return luaG_ordererror(L, l, r); -} - - -static int luaV_lessequal (lua_State *L, const TObject *l, const TObject *r) { - int res; - if (ttype(l) != ttype(r)) - return luaG_ordererror(L, l, r); - else if (ttisnumber(l)) - return nvalue(l) <= nvalue(r); - else if (ttisstring(l)) - return luaV_strcmp(tsvalue(l), tsvalue(r)) <= 0; - else if ((res = call_orderTM(L, l, r, TM_LE)) != -1) /* first try `le' */ - return res; - else if ((res = call_orderTM(L, r, l, TM_LT)) != -1) /* else try `lt' */ - return !res; - return luaG_ordererror(L, l, r); -} - - -int luaV_equalval (lua_State *L, const TObject *t1, const TObject *t2) { - const TObject *tm; - lua_assert(ttype(t1) == ttype(t2)); - switch (ttype(t1)) { - case LUA_TNIL: return 1; - case LUA_TNUMBER: return nvalue(t1) == nvalue(t2); - case LUA_TBOOLEAN: return bvalue(t1) == bvalue(t2); /* true must be 1 !! */ - case LUA_TLIGHTUSERDATA: return pvalue(t1) == pvalue(t2); - case LUA_TUSERDATA: { - if (uvalue(t1) == uvalue(t2)) return 1; - tm = get_compTM(L, uvalue(t1)->uv.metatable, uvalue(t2)->uv.metatable, - TM_EQ); - break; /* will try TM */ - } - case LUA_TTABLE: { - if (hvalue(t1) == hvalue(t2)) return 1; - tm = get_compTM(L, hvalue(t1)->metatable, hvalue(t2)->metatable, TM_EQ); - break; /* will try TM */ - } - default: return gcvalue(t1) == gcvalue(t2); - } - if (tm == NULL) return 0; /* no TM? */ - callTMres(L, tm, t1, t2); /* call TM */ - return !l_isfalse(L->top); -} - - -void luaV_concat (lua_State *L, int total, int last) { - do { - StkId top = L->base + last + 1; - int n = 2; /* number of elements handled in this pass (at least 2) */ - if (!tostring(L, top-2) || !tostring(L, top-1)) { - if (!call_binTM(L, top-2, top-1, top-2, TM_CONCAT)) - luaG_concaterror(L, top-2, top-1); - } else if (tsvalue(top-1)->tsv.len > 0) { /* if len=0, do nothing */ - /* at least two string values; get as many as possible */ - lu_mem tl = cast(lu_mem, tsvalue(top-1)->tsv.len) + - cast(lu_mem, tsvalue(top-2)->tsv.len); - char *buffer; - int i; - while (n < total && tostring(L, top-n-1)) { /* collect total length */ - tl += tsvalue(top-n-1)->tsv.len; - n++; - } - if (tl > MAX_SIZET) luaG_runerror(L, "string size overflow"); - buffer = luaZ_openspace(L, &G(L)->buff, tl); - tl = 0; - for (i=n; i>0; i--) { /* concat all strings */ - size_t l = tsvalue(top-i)->tsv.len; - memcpy(buffer+tl, svalue(top-i), l); - tl += l; - } - setsvalue2s(top-n, luaS_newlstr(L, buffer, tl)); - } - total -= n-1; /* got `n' strings to create 1 new */ - last -= n-1; - } while (total > 1); /* repeat until only 1 result left */ -} - - -static void Arith (lua_State *L, StkId ra, - const TObject *rb, const TObject *rc, TMS op) { - TObject tempb, tempc; - const TObject *b, *c; - if ((b = luaV_tonumber(rb, &tempb)) != NULL && - (c = luaV_tonumber(rc, &tempc)) != NULL) { - switch (op) { - case TM_ADD: setnvalue(ra, nvalue(b) + nvalue(c)); break; - case TM_SUB: setnvalue(ra, nvalue(b) - nvalue(c)); break; - case TM_MUL: setnvalue(ra, nvalue(b) * nvalue(c)); break; - case TM_DIV: setnvalue(ra, nvalue(b) / nvalue(c)); break; - case TM_POW: { - const TObject *f = luaH_getstr(hvalue(gt(L)), G(L)->tmname[TM_POW]); - ptrdiff_t res = savestack(L, ra); - if (!ttisfunction(f)) - luaG_runerror(L, "`__pow' (`^' operator) is not a function"); - callTMres(L, f, b, c); - ra = restorestack(L, res); /* previous call may change stack */ - setobjs2s(ra, L->top); - break; - } - default: lua_assert(0); break; - } - } - else if (!call_binTM(L, rb, rc, ra, op)) - luaG_aritherror(L, rb, rc); -} - - - -/* -** some macros for common tasks in `luaV_execute' -*/ - -#define runtime_check(L, c) { if (!(c)) return 0; } - -#define RA(i) (base+GETARG_A(i)) -/* to be used after possible stack reallocation */ -#define XRA(i) (L->base+GETARG_A(i)) -#define RB(i) (base+GETARG_B(i)) -#define RKB(i) ((GETARG_B(i) < MAXSTACK) ? RB(i) : k+GETARG_B(i)-MAXSTACK) -#define RC(i) (base+GETARG_C(i)) -#define RKC(i) ((GETARG_C(i) < MAXSTACK) ? RC(i) : k+GETARG_C(i)-MAXSTACK) -#define KBx(i) (k+GETARG_Bx(i)) - - -#define dojump(pc, i) ((pc) += (i)) - - -StkId luaV_execute (lua_State *L) { - LClosure *cl; - TObject *k; - const Instruction *pc; - callentry: /* entry point when calling new functions */ - L->ci->u.l.pc = &pc; - if (L->hookmask & LUA_MASKCALL) - luaD_callhook(L, LUA_HOOKCALL, -1); - retentry: /* entry point when returning to old functions */ - lua_assert(L->ci->state == CI_SAVEDPC || - L->ci->state == (CI_SAVEDPC | CI_CALLING)); - L->ci->state = CI_HASFRAME; /* activate frame */ - pc = L->ci->u.l.savedpc; - cl = &clvalue(L->base - 1)->l; - k = cl->p->k; - /* main loop of interpreter */ - for (;;) { - const Instruction i = *pc++; - StkId base, ra; - if ((L->hookmask & (LUA_MASKLINE | LUA_MASKCOUNT)) && - (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { - traceexec(L); - if (L->ci->state & CI_YIELD) { /* did hook yield? */ - L->ci->u.l.savedpc = pc - 1; - L->ci->state = CI_YIELD | CI_SAVEDPC; - return NULL; - } - } - /* warning!! several calls may realloc the stack and invalidate `ra' */ - base = L->base; - ra = RA(i); - lua_assert(L->ci->state & CI_HASFRAME); - lua_assert(base == L->ci->base); - lua_assert(L->top <= L->stack + L->stacksize && L->top >= base); - lua_assert(L->top == L->ci->top || - GET_OPCODE(i) == OP_CALL || GET_OPCODE(i) == OP_TAILCALL || - GET_OPCODE(i) == OP_RETURN || GET_OPCODE(i) == OP_SETLISTO); - switch (GET_OPCODE(i)) { - case OP_MOVE: { - setobjs2s(ra, RB(i)); - break; - } - case OP_LOADK: { - setobj2s(ra, KBx(i)); - break; - } - case OP_LOADBOOL: { - setbvalue(ra, GETARG_B(i)); - if (GETARG_C(i)) pc++; /* skip next instruction (if C) */ - break; - } - case OP_LOADNIL: { - TObject *rb = RB(i); - do { - setnilvalue(rb--); - } while (rb >= ra); - break; - } - case OP_GETUPVAL: { - int b = GETARG_B(i); - setobj2s(ra, cl->upvals[b]->v); - break; - } - case OP_GETGLOBAL: { - TObject *rb = KBx(i); - const TObject *v; - lua_assert(ttisstring(rb) && ttistable(&cl->g)); - v = luaH_getstr(hvalue(&cl->g), tsvalue(rb)); - if (!ttisnil(v)) { setobj2s(ra, v); } - else - setobj2s(XRA(i), luaV_index(L, &cl->g, rb, 0)); - break; - } - case OP_GETTABLE: { - StkId rb = RB(i); - TObject *rc = RKC(i); - if (ttistable(rb)) { - const TObject *v = luaH_get(hvalue(rb), rc); - if (!ttisnil(v)) { setobj2s(ra, v); } - else - setobj2s(XRA(i), luaV_index(L, rb, rc, 0)); - } - else - setobj2s(XRA(i), luaV_getnotable(L, rb, rc, 0)); - break; - } - case OP_SETGLOBAL: { - lua_assert(ttisstring(KBx(i)) && ttistable(&cl->g)); - luaV_settable(L, &cl->g, KBx(i), ra); - break; - } - case OP_SETUPVAL: { - int b = GETARG_B(i); - setobj(cl->upvals[b]->v, ra); /* write barrier */ - break; - } - case OP_SETTABLE: { - luaV_settable(L, ra, RKB(i), RKC(i)); - break; - } - case OP_NEWTABLE: { - int b = GETARG_B(i); - b = fb2int(b); - sethvalue(ra, luaH_new(L, b, GETARG_C(i))); - luaC_checkGC(L); - break; - } - case OP_SELF: { - StkId rb = RB(i); - TObject *rc = RKC(i); - runtime_check(L, ttisstring(rc)); - setobjs2s(ra+1, rb); - if (ttistable(rb)) { - const TObject *v = luaH_getstr(hvalue(rb), tsvalue(rc)); - if (!ttisnil(v)) { setobj2s(ra, v); } - else - setobj2s(XRA(i), luaV_index(L, rb, rc, 0)); - } - else - setobj2s(XRA(i), luaV_getnotable(L, rb, rc, 0)); - break; - } - case OP_ADD: { - TObject *rb = RKB(i); - TObject *rc = RKC(i); - if (ttisnumber(rb) && ttisnumber(rc)) { - setnvalue(ra, nvalue(rb) + nvalue(rc)); - } - else - Arith(L, ra, rb, rc, TM_ADD); - break; - } - case OP_SUB: { - TObject *rb = RKB(i); - TObject *rc = RKC(i); - if (ttisnumber(rb) && ttisnumber(rc)) { - setnvalue(ra, nvalue(rb) - nvalue(rc)); - } - else - Arith(L, ra, rb, rc, TM_SUB); - break; - } - case OP_MUL: { - TObject *rb = RKB(i); - TObject *rc = RKC(i); - if (ttisnumber(rb) && ttisnumber(rc)) { - setnvalue(ra, nvalue(rb) * nvalue(rc)); - } - else - Arith(L, ra, rb, rc, TM_MUL); - break; - } - case OP_DIV: { - TObject *rb = RKB(i); - TObject *rc = RKC(i); - if (ttisnumber(rb) && ttisnumber(rc)) { - setnvalue(ra, nvalue(rb) / nvalue(rc)); - } - else - Arith(L, ra, rb, rc, TM_DIV); - break; - } - case OP_POW: { - Arith(L, ra, RKB(i), RKC(i), TM_POW); - break; - } - case OP_UNM: { - const TObject *rb = RB(i); - TObject temp; - if (tonumber(rb, &temp)) { - setnvalue(ra, -nvalue(rb)); - } - else { - setnilvalue(&temp); - if (!call_binTM(L, RB(i), &temp, ra, TM_UNM)) - luaG_aritherror(L, RB(i), &temp); - } - break; - } - case OP_NOT: { - int res = l_isfalse(RB(i)); /* next assignment may change this value */ - setbvalue(ra, res); - break; - } - case OP_CONCAT: { - int b = GETARG_B(i); - int c = GETARG_C(i); - luaV_concat(L, c-b+1, c); /* may change `base' (and `ra') */ - base = L->base; - setobjs2s(RA(i), base+b); - luaC_checkGC(L); - break; - } - case OP_JMP: { - dojump(pc, GETARG_sBx(i)); - break; - } - case OP_EQ: { - if (equalobj(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; - else dojump(pc, GETARG_sBx(*pc) + 1); - break; - } - case OP_LT: { - if (luaV_lessthan(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; - else dojump(pc, GETARG_sBx(*pc) + 1); - break; - } - case OP_LE: { - if (luaV_lessequal(L, RKB(i), RKC(i)) != GETARG_A(i)) pc++; - else dojump(pc, GETARG_sBx(*pc) + 1); - break; - } - case OP_TEST: { - TObject *rb = RB(i); - if (l_isfalse(rb) == GETARG_C(i)) pc++; - else { - setobjs2s(ra, rb); - dojump(pc, GETARG_sBx(*pc) + 1); - } - break; - } - case OP_CALL: - case OP_TAILCALL: { - StkId firstResult; - int b = GETARG_B(i); - int nresults; - if (b != 0) L->top = ra+b; /* else previous instruction set top */ - nresults = GETARG_C(i) - 1; - firstResult = luaD_precall(L, ra); - if (firstResult) { - if (firstResult > L->top) { /* yield? */ - lua_assert(L->ci->state == (CI_C | CI_YIELD)); - (L->ci - 1)->u.l.savedpc = pc; - (L->ci - 1)->state = CI_SAVEDPC; - return NULL; - } - /* it was a C function (`precall' called it); adjust results */ - luaD_poscall(L, nresults, firstResult); - if (nresults >= 0) L->top = L->ci->top; - } - else { /* it is a Lua function */ - if (GET_OPCODE(i) == OP_CALL) { /* regular call? */ - (L->ci-1)->u.l.savedpc = pc; /* save `pc' to return later */ - (L->ci-1)->state = (CI_SAVEDPC | CI_CALLING); - } - else { /* tail call: put new frame in place of previous one */ - int aux; - base = (L->ci - 1)->base; /* `luaD_precall' may change the stack */ - ra = RA(i); - if (L->openupval) luaF_close(L, base); - for (aux = 0; ra+aux < L->top; aux++) /* move frame down */ - setobjs2s(base+aux-1, ra+aux); - (L->ci - 1)->top = L->top = base+aux; /* correct top */ - lua_assert(L->ci->state & CI_SAVEDPC); - (L->ci - 1)->u.l.savedpc = L->ci->u.l.savedpc; - (L->ci - 1)->u.l.tailcalls++; /* one more call lost */ - (L->ci - 1)->state = CI_SAVEDPC; - L->ci--; /* remove new frame */ - L->base = L->ci->base; - } - goto callentry; - } - break; - } - case OP_RETURN: { - CallInfo *ci = L->ci - 1; /* previous function frame */ - int b = GETARG_B(i); - if (b != 0) L->top = ra+b-1; - lua_assert(L->ci->state & CI_HASFRAME); - if (L->openupval) luaF_close(L, base); - L->ci->state = CI_SAVEDPC; /* deactivate current function */ - L->ci->u.l.savedpc = pc; - /* previous function was running `here'? */ - if (!(ci->state & CI_CALLING)) { - lua_assert((ci->state & CI_C) || ci->u.l.pc != &pc); - return ra; /* no: return */ - } - else { /* yes: continue its execution */ - int nresults; - lua_assert(ci->u.l.pc == &pc && - ttisfunction(ci->base - 1) && - (ci->state & CI_SAVEDPC)); - lua_assert(GET_OPCODE(*(ci->u.l.savedpc - 1)) == OP_CALL); - nresults = GETARG_C(*(ci->u.l.savedpc - 1)) - 1; - luaD_poscall(L, nresults, ra); - if (nresults >= 0) L->top = L->ci->top; - goto retentry; - } - } - case OP_FORLOOP: { - lua_Number step, idx, limit; - const TObject *plimit = ra+1; - const TObject *pstep = ra+2; - if (!ttisnumber(ra)) - luaG_runerror(L, "`for' initial value must be a number"); - if (!tonumber(plimit, ra+1)) - luaG_runerror(L, "`for' limit must be a number"); - if (!tonumber(pstep, ra+2)) - luaG_runerror(L, "`for' step must be a number"); - step = nvalue(pstep); - idx = nvalue(ra) + step; /* increment index */ - limit = nvalue(plimit); - if (step > 0 ? idx <= limit : idx >= limit) { - dojump(pc, GETARG_sBx(i)); /* jump back */ - chgnvalue(ra, idx); /* update index */ - } - break; - } - case OP_TFORLOOP: { - int nvar = GETARG_C(i) + 1; - StkId cb = ra + nvar + 2; /* call base */ - setobjs2s(cb, ra); - setobjs2s(cb+1, ra+1); - setobjs2s(cb+2, ra+2); - L->top = cb+3; /* func. + 2 args (state and index) */ - luaD_call(L, cb, nvar); - L->top = L->ci->top; - ra = XRA(i) + 2; /* final position of first result */ - cb = ra + nvar; - do { /* move results to proper positions */ - nvar--; - setobjs2s(ra+nvar, cb+nvar); - } while (nvar > 0); - if (ttisnil(ra)) /* break loop? */ - pc++; /* skip jump (break loop) */ - else - dojump(pc, GETARG_sBx(*pc) + 1); /* jump back */ - break; - } - case OP_TFORPREP: { /* for compatibility only */ - if (ttistable(ra)) { - setobjs2s(ra+1, ra); - setobj2s(ra, luaH_getstr(hvalue(gt(L)), luaS_new(L, "next"))); - } - dojump(pc, GETARG_sBx(i)); - break; - } - case OP_SETLIST: - case OP_SETLISTO: { - int bc; - int n; - Table *h; - runtime_check(L, ttistable(ra)); - h = hvalue(ra); - bc = GETARG_Bx(i); - if (GET_OPCODE(i) == OP_SETLIST) - n = (bc&(LFIELDS_PER_FLUSH-1)) + 1; - else { - n = L->top - ra - 1; - L->top = L->ci->top; - } - bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ - for (; n > 0; n--) - setobj2t(luaH_setnum(L, h, bc+n), ra+n); /* write barrier */ - break; - } - case OP_CLOSE: { - luaF_close(L, ra); - break; - } - case OP_CLOSURE: { - Proto *p; - Closure *ncl; - int nup, j; - p = cl->p->p[GETARG_Bx(i)]; - nup = p->nups; - ncl = luaF_newLclosure(L, nup, &cl->g); - ncl->l.p = p; - for (j=0; jl.upvals[j] = cl->upvals[GETARG_B(*pc)]; - else { - lua_assert(GET_OPCODE(*pc) == OP_MOVE); - ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc)); - } - } - setclvalue(ra, ncl); - luaC_checkGC(L); - break; - } - } - } -} - diff --git a/plugins/SmartAutoReplier/lualib/lvm.h b/plugins/SmartAutoReplier/lualib/lvm.h deleted file mode 100644 index 19cce200b6..0000000000 --- a/plugins/SmartAutoReplier/lualib/lvm.h +++ /dev/null @@ -1,35 +0,0 @@ -/* -** $Id: lvm.h,v 1.47 2002/11/14 16:16:21 roberto Exp $ -** Lua virtual machine -** See Copyright Notice in lua.h -*/ - -#ifndef lvm_h -#define lvm_h - - -#include "ldo.h" -#include "lobject.h" -#include "ltm.h" - - -#define tostring(L,o) ((ttype(o) == LUA_TSTRING) || (luaV_tostring(L, o))) - -#define tonumber(o,n) (ttype(o) == LUA_TNUMBER || \ - (((o) = luaV_tonumber(o,n)) != NULL)) - -#define equalobj(L,o1,o2) \ - (ttype(o1) == ttype(o2) && luaV_equalval(L, o1, o2)) - - -int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r); -int luaV_equalval (lua_State *L, const TObject *t1, const TObject *t2); -const TObject *luaV_tonumber (const TObject *obj, TObject *n); -int luaV_tostring (lua_State *L, StkId obj); -const TObject *luaV_gettable (lua_State *L, const TObject *t, TObject *key, - int loop); -void luaV_settable (lua_State *L, const TObject *t, TObject *key, StkId val); -StkId luaV_execute (lua_State *L); -void luaV_concat (lua_State *L, int total, int last); - -#endif diff --git a/plugins/SmartAutoReplier/lualib/lzio.c b/plugins/SmartAutoReplier/lualib/lzio.c deleted file mode 100644 index 3aeca1c588..0000000000 --- a/plugins/SmartAutoReplier/lualib/lzio.c +++ /dev/null @@ -1,81 +0,0 @@ -/* -** $Id: lzio.c,v 1.24 2003/03/20 16:00:56 roberto Exp $ -** a generic input stream interface -** See Copyright Notice in lua.h -*/ - - -#include - -#define lzio_c - -#include "lua.h" - -#include "llimits.h" -#include "lmem.h" -#include "lzio.h" - - -int luaZ_fill (ZIO *z) { - size_t size; - const char *buff = z->reader(NULL, z->data, &size); - if (buff == NULL || size == 0) return EOZ; - z->n = size - 1; - z->p = buff; - return char2int(*(z->p++)); -} - - -int luaZ_lookahead (ZIO *z) { - if (z->n == 0) { - int c = luaZ_fill(z); - if (c == EOZ) return c; - z->n++; - z->p--; - } - return char2int(*z->p); -} - - -void luaZ_init (ZIO *z, lua_Chunkreader reader, void *data, const char *name) { - z->reader = reader; - z->data = data; - z->name = name; - z->n = 0; - z->p = NULL; -} - - -/* --------------------------------------------------------------- read --- */ -size_t luaZ_read (ZIO *z, void *b, size_t n) { - while (n) { - size_t m; - if (z->n == 0) { - if (luaZ_fill(z) == EOZ) - return n; /* return number of missing bytes */ - else { - ++z->n; /* filbuf removed first byte; put back it */ - --z->p; - } - } - m = (n <= z->n) ? n : z->n; /* min. between n and z->n */ - memcpy(b, z->p, m); - z->n -= m; - z->p += m; - b = (char *)b + m; - n -= m; - } - return 0; -} - -/* ------------------------------------------------------------------------ */ -char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n) { - if (n > buff->buffsize) { - if (n < LUA_MINBUFFER) n = LUA_MINBUFFER; - luaM_reallocvector(L, buff->buffer, buff->buffsize, n, char); - buff->buffsize = n; - } - return buff->buffer; -} - - diff --git a/plugins/SmartAutoReplier/lualib/lzio.h b/plugins/SmartAutoReplier/lualib/lzio.h deleted file mode 100644 index 5e73615cc0..0000000000 --- a/plugins/SmartAutoReplier/lualib/lzio.h +++ /dev/null @@ -1,64 +0,0 @@ -/* -** $Id: lzio.h,v 1.15 2003/03/20 16:00:56 roberto Exp $ -** Buffered streams -** See Copyright Notice in lua.h -*/ - - -#ifndef lzio_h -#define lzio_h - -#include "lua.h" - - -#define EOZ (-1) /* end of stream */ - -typedef struct Zio ZIO; - - -#define char2int(c) cast(int, cast(unsigned char, (c))) - -#define zgetc(z) (((z)->n--)>0 ? char2int(*(z)->p++) : luaZ_fill(z)) - -#define zname(z) ((z)->name) - -void luaZ_init (ZIO *z, lua_Chunkreader reader, void *data, const char *name); -size_t luaZ_read (ZIO* z, void* b, size_t n); /* read next n bytes */ -int luaZ_lookahead (ZIO *z); - - - -typedef struct Mbuffer { - char *buffer; - size_t buffsize; -} Mbuffer; - - -char *luaZ_openspace (lua_State *L, Mbuffer *buff, size_t n); - -#define luaZ_initbuffer(L, buff) ((buff)->buffer = NULL, (buff)->buffsize = 0) - -#define luaZ_sizebuffer(buff) ((buff)->buffsize) -#define luaZ_buffer(buff) ((buff)->buffer) - -#define luaZ_resizebuffer(L, buff, size) \ - (luaM_reallocvector(L, (buff)->buffer, (buff)->buffsize, size, char), \ - (buff)->buffsize = size) - -#define luaZ_freebuffer(L, buff) luaZ_resizebuffer(L, buff, 0) - - -/* --------- Private Part ------------------ */ - -struct Zio { - size_t n; /* bytes still unread */ - const char *p; /* current position in buffer */ - lua_Chunkreader reader; - void* data; /* additional data */ - const char *name; -}; - - -int luaZ_fill (ZIO *z); - -#endif diff --git a/plugins/SmartAutoReplier/lualib/targetver.h b/plugins/SmartAutoReplier/lualib/targetver.h deleted file mode 100644 index 90e767bfce..0000000000 --- a/plugins/SmartAutoReplier/lualib/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include diff --git a/plugins/SmartAutoReplier/resource.h b/plugins/SmartAutoReplier/resource.h deleted file mode 100644 index 38765d95fc..0000000000 --- a/plugins/SmartAutoReplier/resource.h +++ /dev/null @@ -1,52 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by SAR.rc -// -#define IDD_OPTIONS 101 -#define IDD_ADDRULE_DLG 102 -#define IDI_SAR_ICON 103 -#define IDD_SET_AURMESSAGEDLG 104 -#define IDD_SEL_USER 110 -#define IDD_HISTORYLOGS 111 -#define IDD_SDLGHOLDER 113 -#define IDC_STATIC_HEADER_TEXT 1001 -#define IDC_EDIT_HEADER 1002 -#define IDC_STATIC_MESSAGE_TEXT 1003 -#define IDC_EDIT_MESSAGE 1004 -#define IDC_EDIT_REPLAYDELAY 1006 -#define IDC_LIST_RULES 1007 -#define IDC_BTN_ADDRULE 1008 -#define IDC_BTN_DELRULE 1009 -#define IDC_ED_RULENAME 1009 -#define IDC_BTN_EDITRULE 1010 -#define IDC_ED_RULECNAME 1010 -#define IDC_ED_RULEREPLY 1011 -#define IDC_ED_RULEACTION 1012 -#define IDC_BUTTON1 1013 -#define IDC_BTN_SELUSER 1013 -#define IDC_CHECK_DISABLEWMON 1014 -#define IDC_CHECK1 1017 -#define IDC_CH_SHOW_AURDLG_WHMC 1017 -#define IDC_CH_DISWHSB 1017 -#define IDC_ED_TEXT 1019 -#define IDC_CB_DWSB 1020 -#define IDC_LIST_USERS 1021 -#define IDC_TABS 1022 -#define IDC_TABSHOLDER 1022 -#define IDC_STATUSMSG 1023 -#define IDC_CH_ENABLE_WSCH 1115 -#define IDC_CB_ENWSC 1116 -#define IDC_CH_SHOWCG 1117 -#define IDC_CH_SHOWCG2 1118 -#define IDC_CH_SAVE_AURS 1118 - -// Next default values for new objects -// -#ifdef APSTUDIO_INVOKED -#ifndef APSTUDIO_READONLY_SYMBOLS -#define _APS_NEXT_RESOURCE_VALUE 113 -#define _APS_NEXT_COMMAND_VALUE 40002 -#define _APS_NEXT_CONTROL_VALUE 1024 -#define _APS_NEXT_SYMED_VALUE 101 -#endif -#endif diff --git a/plugins/SmartAutoReplier/sar.ico b/plugins/SmartAutoReplier/sar.ico deleted file mode 100644 index 27a5d17bbb..0000000000 Binary files a/plugins/SmartAutoReplier/sar.ico and /dev/null differ diff --git a/plugins/SmartAutoReplier/stdafx.cpp b/plugins/SmartAutoReplier/stdafx.cpp deleted file mode 100644 index 39aa93ac1d..0000000000 --- a/plugins/SmartAutoReplier/stdafx.cpp +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#include "stdafx.h" - -void OnRefreshSettings(void) -{ - SendMessage(HWND_BROADCAST, REFRESH_OPTS_MSG, 0, 0); -} \ No newline at end of file diff --git a/plugins/SmartAutoReplier/stdafx.h b/plugins/SmartAutoReplier/stdafx.h deleted file mode 100644 index 76f6c5128c..0000000000 --- a/plugins/SmartAutoReplier/stdafx.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Smart Auto Replier (SAR) - auto replier plugin for Miranda IM - * - * Copyright (C) 2004 - 2012 by Volodymyr M. Shcherbyna - * - * This file is part of SAR. - * - * SAR 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 3 of the License, or - * (at your option) any later version. - * - * SAR 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 SAR. If not, see . -*/ - -#pragma once - -#include "AggressiveOptimize.h" - -#undef _WIN32_WINNT -#define _WIN32_WINNT 0x0500 - -#define WIN32_LEAN_AND_MEAN -#define _MERGE_RDATA_ - -/// windows and crt headers (win32 api) -#include -#include -#include -#include -#include "resource.h" -#include -#include - -#include - -/// shell's headers... (windows shell) -#include -#include - -#pragma comment(lib, "shlwapi.lib") -#pragma comment(lib, "shell32.lib") - -#pragma warning(disable:4312) -#pragma warning(disable:4267) -#pragma warning(disable:4356) - -/// miranda's headers... -#include "../miranda32/newpluginapi.h" -#include "../miranda32/m_system.h" -#include "../miranda32/m_protomod.h" -#include "../miranda32/m_protosvc.h" -#include "../miranda32/m_clist.h" -#include "../miranda32/m_skin.h" -#include "../miranda32/m_database.h" -#include "../miranda32/m_options.h" -#include "../miranda32/m_langpack.h" - -/// plugin's specific headers... -#include "messageshandler.h" /// messages handler -#include "settingshandler.h" /// settings handler -#include "GUI/optionsDlg.h" /// options handler -#include "comlogging.h" /// common loggin helper macroses -#include "crushlog.h" /// crush log handler - -#define REFRESH_OPTS_MSG WM_USER + 666 - -void OnRefreshSettings(void); \ No newline at end of file diff --git a/plugins/SmartAutoReplier/wtl/atlapp.h b/plugins/SmartAutoReplier/wtl/atlapp.h deleted file mode 100644 index e47bcd633b..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlapp.h +++ /dev/null @@ -1,2035 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLAPP_H__ -#define __ATLAPP_H__ - -#pragma once - -#ifndef __cplusplus - #error WTL requires C++ compilation (use a .cpp suffix) -#endif - -#ifndef __ATLBASE_H__ - #error atlapp.h requires atlbase.h to be included first -#endif - -#ifndef _WIN32_WCE - #if (WINVER < 0x0400) - #error WTL requires Windows version 4.0 or higher - #endif - - #if (_WIN32_IE < 0x0300) - #error WTL requires IE version 3.0 or higher - #endif -#endif - -#ifdef _ATL_NO_COMMODULE - #error WTL requires that _ATL_NO_COMMODULE is not defined -#endif - -#if (_ATL_VER >= 0x0900) && defined(_ATL_MIN_CRT) - #error _ATL_MIN_CRT is not supported with ATL 9.0 and higher -#endif - -#if defined(_WIN32_WCE) && defined(_ATL_MIN_CRT) - #pragma message("Warning: WTL for Windows CE doesn't use _ATL_MIN_CRT") -#endif - -#include -#if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE) - #include // for _beginthreadex -#endif - -#if (_ATL_VER < 0x0800) && !defined(_DEBUG) - #include -#endif - -#include -#ifndef _WIN32_WCE - #pragma comment(lib, "comctl32.lib") -#endif - -#ifndef _WIN32_WCE - #include "atlres.h" -#else // CE specific - #include "atlresce.h" -#endif // _WIN32_WCE - -// We need to disable this warning because of template class arguments -#pragma warning(disable: 4127) - -#if (_ATL_VER >= 0x0900) && !defined(_SECURE_ATL) - #define _SECURE_ATL 1 -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// WTL version number - -#define _WTL_VER 0x0810 - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CMessageFilter -// CIdleHandler -// CMessageLoop -// -// CAppModule -// CServerAppModule -// -// CRegKeyEx -// -// Global functions: -// AtlGetDefaultGuiFont() -// AtlCreateControlFont() -// AtlCreateBoldFont() -// AtlInitCommonControls() - - -/////////////////////////////////////////////////////////////////////////////// -// Global support for Windows CE - -#ifdef _WIN32_WCE - -#ifndef SW_SHOWDEFAULT - #define SW_SHOWDEFAULT SW_SHOWNORMAL -#endif // !SW_SHOWDEFAULT - -// These get's OR-ed in a constant and will have no effect. -// Defining them reduces the number of #ifdefs required for CE. -#define LR_DEFAULTSIZE 0 -#define LR_LOADFROMFILE 0 - -#ifndef SM_CXCURSOR - #define SM_CXCURSOR 13 -#endif -#ifndef SM_CYCURSOR - #define SM_CYCURSOR 14 -#endif - -inline BOOL IsMenu(HMENU hMenu) -{ - MENUITEMINFO mii = { sizeof(MENUITEMINFO) }; - ::SetLastError(0); - BOOL bRet = ::GetMenuItemInfo(hMenu, 0, TRUE, &mii); - if(!bRet) - bRet = (::GetLastError() != ERROR_INVALID_MENU_HANDLE) ? TRUE : FALSE; - return bRet; -} - -#if (_WIN32_WCE >= 410) -extern "C" void WINAPI ListView_SetItemSpacing(HWND hwndLV, int iHeight); -#endif // (_WIN32_WCE >= 410) - -inline int MulDiv(IN int nNumber, IN int nNumerator, IN int nDenominator) -{ - __int64 multiple = nNumber * nNumerator; - return static_cast(multiple / nDenominator); -} - -#if (_ATL_VER >= 0x0800) - -#ifndef _WTL_KEEP_WS_OVERLAPPEDWINDOW - #ifdef WS_OVERLAPPEDWINDOW - #undef WS_OVERLAPPEDWINDOW - #define WS_OVERLAPPEDWINDOW 0 - #endif // WS_OVERLAPPEDWINDOW -#endif // !_WTL_KEEP_WS_OVERLAPPEDWINDOW - -#ifndef RDW_FRAME - #define RDW_FRAME 0 -#endif // !RDW_FRAME - -#ifndef WM_WINDOWPOSCHANGING - #define WM_WINDOWPOSCHANGING 0 -#endif // !WM_WINDOWPOSCHANGING - -#define FreeResource(x) -#define UnlockResource(x) - -namespace ATL -{ - inline HRESULT CComModule::RegisterClassObjects(DWORD /*dwClsContext*/, DWORD /*dwFlags*/) throw() - { return E_NOTIMPL; } - inline HRESULT CComModule::RevokeClassObjects() throw() - { return E_NOTIMPL; } -}; // namespace ATL - -#ifndef lstrlenW - #define lstrlenW (int)ATL::lstrlenW -#endif // lstrlenW - -inline int WINAPI lstrlenA(LPCSTR lpszString) -{ return ATL::lstrlenA(lpszString); } - -#ifdef lstrcpyn - #undef lstrcpyn - #define lstrcpyn ATL::lstrcpynW -#endif // lstrcpyn - -#ifndef SetWindowLongPtrW - inline LONG_PTR tmp_SetWindowLongPtrW( HWND hWnd, int nIndex, LONG_PTR dwNewLong ) - { - return( ::SetWindowLongW( hWnd, nIndex, LONG( dwNewLong ) ) ); - } - #define SetWindowLongPtrW tmp_SetWindowLongPtrW -#endif - -#ifndef GetWindowLongPtrW - inline LONG_PTR tmp_GetWindowLongPtrW( HWND hWnd, int nIndex ) - { - return( ::GetWindowLongW( hWnd, nIndex ) ); - } - #define GetWindowLongPtrW tmp_GetWindowLongPtrW -#endif - -#ifndef LongToPtr - #define LongToPtr(x) ((void*)x) -#endif - -#ifndef PtrToInt - #define PtrToInt( p ) ((INT)(INT_PTR) (p) ) -#endif - -#else // !(_ATL_VER >= 0x0800) - -#ifdef lstrlenW - #undef lstrlenW - #define lstrlenW (int)::wcslen -#endif // lstrlenW - -#define lstrlenA (int)strlen - -#ifndef lstrcpyn - inline LPTSTR lstrcpyn(LPTSTR lpstrDest, LPCTSTR lpstrSrc, int nLength) - { - if(lpstrDest == NULL || lpstrSrc == NULL || nLength <= 0) - return NULL; - int nLen = min(lstrlen(lpstrSrc), nLength - 1); - LPTSTR lpstrRet = (LPTSTR)memcpy(lpstrDest, lpstrSrc, nLen * sizeof(TCHAR)); - lpstrDest[nLen] = 0; - return lpstrRet; - } -#endif // !lstrcpyn - -#ifndef lstrcpynW - inline LPWSTR lstrcpynW(LPWSTR lpstrDest, LPCWSTR lpstrSrc, int nLength) - { - return lstrcpyn(lpstrDest, lpstrSrc, nLength); // WinCE is Unicode only - } -#endif // !lstrcpynW - -#ifndef lstrcpynA - inline LPSTR lstrcpynA(LPSTR lpstrDest, LPCSTR lpstrSrc, int nLength) - { - if(lpstrDest == NULL || lpstrSrc == NULL || nLength <= 0) - return NULL; - int nLen = min(lstrlenA(lpstrSrc), nLength - 1); - LPSTR lpstrRet = (LPSTR)memcpy(lpstrDest, lpstrSrc, nLen * sizeof(char)); - lpstrDest[nLen] = 0; - return lpstrRet; - } -#endif // !lstrcpyn - -#ifdef TrackPopupMenu - #undef TrackPopupMenu -#endif // TrackPopupMenu - -#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd) \ -static CWndClassInfo& GetWndClassInfo() \ -{ \ - static CWndClassInfo wc = \ - { \ - { style, StartWindowProc, \ - 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName }, \ - NULL, NULL, IDC_ARROW, TRUE, 0, _T("") \ - }; \ - return wc; \ -} - -#ifndef _MAX_FNAME - #define _MAX_FNAME _MAX_PATH -#endif // _MAX_FNAME - -#if (_WIN32_WCE < 400) - #define MAKEINTATOM(i) (LPTSTR)((ULONG_PTR)((WORD)(i))) -#endif // (_WIN32_WCE < 400) - -#if (_WIN32_WCE < 410) - #define WHEEL_PAGESCROLL (UINT_MAX) - #define WHEEL_DELTA 120 -#endif // (_WIN32_WCE < 410) - -#ifdef DrawIcon - #undef DrawIcon -#endif - -#ifndef VARCMP_LT - #define VARCMP_LT 0 -#endif -#ifndef VARCMP_EQ - #define VARCMP_EQ 1 -#endif -#ifndef VARCMP_GT - #define VARCMP_GT 2 -#endif -#ifndef VARCMP_NULL - #define VARCMP_NULL 3 -#endif - -#ifndef RDW_ALLCHILDREN - #define RDW_ALLCHILDREN 0 -#endif - -#endif // !(_ATL_VER >= 0x0800) - -#endif // _WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// Global support for using original VC++ 6.0 headers with WTL - -#ifndef _ATL_NO_OLD_HEADERS_WIN64 -#if !defined(_WIN64) && (_ATL_VER < 0x0700) - - #ifndef PSM_INSERTPAGE - #define PSM_INSERTPAGE (WM_USER + 119) - #endif // !PSM_INSERTPAGE - - #ifndef GetClassLongPtr - #define GetClassLongPtrA GetClassLongA - #define GetClassLongPtrW GetClassLongW - #ifdef UNICODE - #define GetClassLongPtr GetClassLongPtrW - #else - #define GetClassLongPtr GetClassLongPtrA - #endif // !UNICODE - #endif // !GetClassLongPtr - - #ifndef GCLP_HICONSM - #define GCLP_HICONSM (-34) - #endif // !GCLP_HICONSM - - #ifndef GetWindowLongPtr - #define GetWindowLongPtrA GetWindowLongA - #define GetWindowLongPtrW GetWindowLongW - #ifdef UNICODE - #define GetWindowLongPtr GetWindowLongPtrW - #else - #define GetWindowLongPtr GetWindowLongPtrA - #endif // !UNICODE - #endif // !GetWindowLongPtr - - #ifndef SetWindowLongPtr - #define SetWindowLongPtrA SetWindowLongA - #define SetWindowLongPtrW SetWindowLongW - #ifdef UNICODE - #define SetWindowLongPtr SetWindowLongPtrW - #else - #define SetWindowLongPtr SetWindowLongPtrA - #endif // !UNICODE - #endif // !SetWindowLongPtr - - #ifndef GWLP_WNDPROC - #define GWLP_WNDPROC (-4) - #endif - #ifndef GWLP_HINSTANCE - #define GWLP_HINSTANCE (-6) - #endif - #ifndef GWLP_HWNDPARENT - #define GWLP_HWNDPARENT (-8) - #endif - #ifndef GWLP_USERDATA - #define GWLP_USERDATA (-21) - #endif - #ifndef GWLP_ID - #define GWLP_ID (-12) - #endif - - #ifndef DWLP_MSGRESULT - #define DWLP_MSGRESULT 0 - #endif - - typedef long LONG_PTR; - typedef unsigned long ULONG_PTR; - typedef ULONG_PTR DWORD_PTR; - - #ifndef HandleToUlong - #define HandleToUlong( h ) ((ULONG)(ULONG_PTR)(h) ) - #endif - #ifndef HandleToLong - #define HandleToLong( h ) ((LONG)(LONG_PTR) (h) ) - #endif - #ifndef LongToHandle - #define LongToHandle( h) ((HANDLE)(LONG_PTR) (h)) - #endif - #ifndef PtrToUlong - #define PtrToUlong( p ) ((ULONG)(ULONG_PTR) (p) ) - #endif - #ifndef PtrToLong - #define PtrToLong( p ) ((LONG)(LONG_PTR) (p) ) - #endif - #ifndef PtrToUint - #define PtrToUint( p ) ((UINT)(UINT_PTR) (p) ) - #endif - #ifndef PtrToInt - #define PtrToInt( p ) ((INT)(INT_PTR) (p) ) - #endif - #ifndef PtrToUshort - #define PtrToUshort( p ) ((unsigned short)(ULONG_PTR)(p) ) - #endif - #ifndef PtrToShort - #define PtrToShort( p ) ((short)(LONG_PTR)(p) ) - #endif - #ifndef IntToPtr - #define IntToPtr( i ) ((VOID *)(INT_PTR)((int)i)) - #endif - #ifndef UIntToPtr - #define UIntToPtr( ui ) ((VOID *)(UINT_PTR)((unsigned int)ui)) - #endif - #ifndef LongToPtr - #define LongToPtr( l ) ((VOID *)(LONG_PTR)((long)l)) - #endif - #ifndef ULongToPtr - #define ULongToPtr( ul ) ((VOID *)(ULONG_PTR)((unsigned long)ul)) - #endif - -#endif // !defined(_WIN64) && (_ATL_VER < 0x0700) -#endif // !_ATL_NO_OLD_HEADERS_WIN64 - - -/////////////////////////////////////////////////////////////////////////////// -// Global support for SecureHelper functions - -#ifndef _TRUNCATE - #define _TRUNCATE ((size_t)-1) -#endif - -#ifndef _ERRCODE_DEFINED - #define _ERRCODE_DEFINED - typedef int errno_t; -#endif - -#ifndef _SECURECRT_ERRCODE_VALUES_DEFINED - #define _SECURECRT_ERRCODE_VALUES_DEFINED - #define EINVAL 22 - #define STRUNCATE 80 -#endif - -#ifndef _countof - #define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0])) -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Miscellaneous global support - -// define useful macros from winuser.h -#ifndef IS_INTRESOURCE - #define IS_INTRESOURCE(_r) (((ULONG_PTR)(_r) >> 16) == 0) -#endif // IS_INTRESOURCE - -// protect template members from windowsx.h macros -#ifdef _INC_WINDOWSX - #undef SubclassWindow -#endif // _INC_WINDOWSX - -// define useful macros from windowsx.h -#ifndef GET_X_LPARAM - #define GET_X_LPARAM(lParam) ((int)(short)LOWORD(lParam)) -#endif -#ifndef GET_Y_LPARAM - #define GET_Y_LPARAM(lParam) ((int)(short)HIWORD(lParam)) -#endif - -// Dummy structs for compiling with /CLR -#if (_MSC_VER >= 1300) && defined(_MANAGED) - __if_not_exists(_IMAGELIST::_IMAGELIST) { struct _IMAGELIST { }; } - __if_not_exists(_TREEITEM::_TREEITEM) { struct _TREEITEM { }; } - __if_not_exists(_PSP::_PSP) { struct _PSP { }; } -#endif - -// Define ATLVERIFY macro for ATL3 -#if (_ATL_VER < 0x0700) - #ifndef ATLVERIFY - #ifdef _DEBUG - #define ATLVERIFY(expr) ATLASSERT(expr) - #else - #define ATLVERIFY(expr) (expr) - #endif // DEBUG - #endif // ATLVERIFY -#endif // (_ATL_VER < 0x0700) - -// Forward declaration for ATL3 fix -#if (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) - namespace ATL { HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor); }; -#endif - - -namespace WTL -{ - -#if (_ATL_VER >= 0x0700) - DECLARE_TRACE_CATEGORY(atlTraceUI); - #ifdef _DEBUG - __declspec(selectany) ATL::CTraceCategory atlTraceUI(_T("atlTraceUI")); - #endif // _DEBUG -#else // !(_ATL_VER >= 0x0700) - enum wtlTraceFlags - { - atlTraceUI = 0x10000000 - }; -#endif // !(_ATL_VER >= 0x0700) - -// Windows version helper -inline bool AtlIsOldWindows() -{ - OSVERSIONINFO ovi = { 0 }; - ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - BOOL bRet = ::GetVersionEx(&ovi); - return (!bRet || !((ovi.dwMajorVersion >= 5) || (ovi.dwMajorVersion == 4 && ovi.dwMinorVersion >= 90))); -} - -// Default GUI font helper - "MS Shell Dlg" stock font -inline HFONT AtlGetDefaultGuiFont() -{ -#ifndef _WIN32_WCE - return (HFONT)::GetStockObject(DEFAULT_GUI_FONT); -#else // CE specific - return (HFONT)::GetStockObject(SYSTEM_FONT); -#endif // _WIN32_WCE -} - -// Control font helper - default font for controls not in a dialog -// (NOTE: Caller owns the font, and should destroy it when it's no longer needed) -inline HFONT AtlCreateControlFont() -{ -#ifndef _WIN32_WCE - LOGFONT lf = { 0 }; - ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE); - HFONT hFont = ::CreateFontIndirect(&lf); - ATLASSERT(hFont != NULL); - return hFont; -#else // CE specific - return (HFONT)::GetStockObject(SYSTEM_FONT); -#endif // _WIN32_WCE -} - -// Bold font helper -// (NOTE: Caller owns the font, and should destroy it when it's no longer needed) -inline HFONT AtlCreateBoldFont(HFONT hFont = NULL) -{ - LOGFONT lf = { 0 }; -#ifndef _WIN32_WCE - if(hFont == NULL) - ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE); - else - ATLVERIFY(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT)); -#else // CE specific - if(hFont == NULL) - hFont = (HFONT)::GetStockObject(SYSTEM_FONT); - ATLVERIFY(::GetObject(hFont, sizeof(LOGFONT), &lf) == sizeof(LOGFONT)); -#endif // _WIN32_WCE - lf.lfWeight = FW_BOLD; - HFONT hFontBold = ::CreateFontIndirect(&lf); - ATLASSERT(hFontBold != NULL); - return hFontBold; -} - -// Common Controls initialization helper -inline BOOL AtlInitCommonControls(DWORD dwFlags) -{ - INITCOMMONCONTROLSEX iccx = { sizeof(INITCOMMONCONTROLSEX), dwFlags }; - BOOL bRet = ::InitCommonControlsEx(&iccx); - ATLASSERT(bRet); - return bRet; -} - - -/////////////////////////////////////////////////////////////////////////////// -// RunTimeHelper - helper functions for Windows version and structure sizes - -// Not for Windows CE -#if defined(_WIN32_WCE) && !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) - #define _WTL_NO_RUNTIME_STRUCT_SIZE -#endif - -#ifndef _WTL_NO_RUNTIME_STRUCT_SIZE - -#ifndef _SIZEOF_STRUCT - #define _SIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) -#endif - -#if (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE) - #define REBARBANDINFO_V6_SIZE _SIZEOF_STRUCT(REBARBANDINFO, cxHeader) -#endif // (_WIN32_WINNT >= 0x0600) && !defined(REBARBANDINFO_V6_SIZE) - -#if (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE) - #define LVGROUP_V5_SIZE _SIZEOF_STRUCT(LVGROUP, uAlign) -#endif // (_WIN32_WINNT >= 0x0600) && !defined(LVGROUP_V5_SIZE) - -#if (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE) - #define LVTILEINFO_V5_SIZE _SIZEOF_STRUCT(LVTILEINFO, puColumns) -#endif // (_WIN32_WINNT >= 0x0600) && !defined(LVTILEINFO_V5_SIZE) - -#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHITTESTINFO_V1_SIZE) - #define MCHITTESTINFO_V1_SIZE _SIZEOF_STRUCT(MCHITTESTINFO, st) -#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) && !defined(MCHITTESTINFO_V1_SIZE) - -#if !defined(_WIN32_WCE) && (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_SIZE) - #define NONCLIENTMETRICS_V1_SIZE _SIZEOF_STRUCT(NONCLIENTMETRICS, lfMessageFont) -#endif // !defined(_WIN32_WCE) && (WINVER >= 0x0600) && !defined(NONCLIENTMETRICS_V1_SIZE) - -#endif // !_WTL_NO_RUNTIME_STRUCT_SIZE - -namespace RunTimeHelper -{ -#ifndef _WIN32_WCE - inline bool IsCommCtrl6() - { - DWORD dwMajor = 0, dwMinor = 0; - HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor); - return (SUCCEEDED(hRet) && (dwMajor >= 6)); - } - - inline bool IsVista() - { - OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) }; - BOOL bRet = ::GetVersionEx(&ovi); - return ((bRet != FALSE) && (ovi.dwMajorVersion >= 6)); - } - - inline bool IsThemeAvailable() - { - bool bRet = false; - - if(IsCommCtrl6()) - { - HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); - if(hThemeDLL != NULL) - { - typedef BOOL (STDAPICALLTYPE *PFN_IsThemeActive)(); - PFN_IsThemeActive pfnIsThemeActive = (PFN_IsThemeActive)::GetProcAddress(hThemeDLL, "IsThemeActive"); - ATLASSERT(pfnIsThemeActive != NULL); - bRet = (pfnIsThemeActive != NULL) && (pfnIsThemeActive() != FALSE); - if(bRet) - { - typedef BOOL (STDAPICALLTYPE *PFN_IsAppThemed)(); - PFN_IsAppThemed pfnIsAppThemed = (PFN_IsAppThemed)::GetProcAddress(hThemeDLL, "IsAppThemed"); - ATLASSERT(pfnIsAppThemed != NULL); - bRet = (pfnIsAppThemed != NULL) && (pfnIsAppThemed() != FALSE); - } - - ::FreeLibrary(hThemeDLL); - } - } - - return bRet; - } - - inline bool IsWin7() - { - OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) }; - BOOL bRet = ::GetVersionEx(&ovi); - return ((bRet != FALSE) && (ovi.dwMajorVersion == 6) && (ovi.dwMinorVersion >= 1)); - } - - inline bool IsRibbonUIAvailable() - { - static INT iRibbonUI = -1; - -#if defined(NTDDI_WIN7) && (NTDDI_VERSION >= NTDDI_WIN7) - if (iRibbonUI == -1) - { - HMODULE hRibbonDLL = ::LoadLibrary(_T("propsys.dll")); - if (hRibbonDLL != NULL) - { - const GUID CLSID_UIRibbonFramework = { 0x926749fa, 0x2615, 0x4987, { 0x88, 0x45, 0xc3, 0x3e, 0x65, 0xf2, 0xb9, 0x57 } }; - // block - create instance - { - ATL::CComPtr pIUIFramework; - iRibbonUI = SUCCEEDED(pIUIFramework.CoCreateInstance(CLSID_UIRibbonFramework)) ? 1 : 0; - } - ::FreeLibrary(hRibbonDLL); - } - else - { - iRibbonUI = 0; - } - } -#endif // defined(NTDDI_WIN7) && (NTDDI_VERSION >= NTDDI_WIN7) - - return (iRibbonUI == 1); - } - -#endif // !_WIN32_WCE - - inline int SizeOf_REBARBANDINFO() - { - int nSize = sizeof(REBARBANDINFO); -#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) - if(!(IsVista() && IsCommCtrl6())) - nSize = REBARBANDINFO_V6_SIZE; -#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) - return nSize; - } - -#if (_WIN32_WINNT >= 0x501) - inline int SizeOf_LVGROUP() - { - int nSize = sizeof(LVGROUP); -#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) - if(!IsVista()) - nSize = LVGROUP_V5_SIZE; -#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) - return nSize; - } - - inline int SizeOf_LVTILEINFO() - { - int nSize = sizeof(LVTILEINFO); -#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) - if(!IsVista()) - nSize = LVTILEINFO_V5_SIZE; -#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (_WIN32_WINNT >= 0x0600) - return nSize; - } -#endif // (_WIN32_WINNT >= 0x501) - - inline int SizeOf_MCHITTESTINFO() - { - int nSize = sizeof(MCHITTESTINFO); -#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) - if(!(IsVista() && IsCommCtrl6())) - nSize = MCHITTESTINFO_V1_SIZE; -#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) - return nSize; - } - -#ifndef _WIN32_WCE - inline int SizeOf_NONCLIENTMETRICS() - { - int nSize = sizeof(NONCLIENTMETRICS); -#if !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600) - if(!IsVista()) - nSize = NONCLIENTMETRICS_V1_SIZE; -#endif // !defined(_WTL_NO_RUNTIME_STRUCT_SIZE) && (WINVER >= 0x0600) - return nSize; - } -#endif // !_WIN32_WCE -}; - - -/////////////////////////////////////////////////////////////////////////////// -// ModuleHelper - helper functions for ATL3 and ATL7 module classes - -namespace ModuleHelper -{ - inline HINSTANCE GetModuleInstance() - { -#if (_ATL_VER >= 0x0700) - return ATL::_AtlBaseModule.GetModuleInstance(); -#else // !(_ATL_VER >= 0x0700) - return ATL::_pModule->GetModuleInstance(); -#endif // !(_ATL_VER >= 0x0700) - } - - inline HINSTANCE GetResourceInstance() - { -#if (_ATL_VER >= 0x0700) - return ATL::_AtlBaseModule.GetResourceInstance(); -#else // !(_ATL_VER >= 0x0700) - return ATL::_pModule->GetResourceInstance(); -#endif // !(_ATL_VER >= 0x0700) - } - - inline void AddCreateWndData(ATL::_AtlCreateWndData* pData, void* pObject) - { -#if (_ATL_VER >= 0x0700) - ATL::_AtlWinModule.AddCreateWndData(pData, pObject); -#else // !(_ATL_VER >= 0x0700) - ATL::_pModule->AddCreateWndData(pData, pObject); -#endif // !(_ATL_VER >= 0x0700) - } - - inline void* ExtractCreateWndData() - { -#if (_ATL_VER >= 0x0700) - return ATL::_AtlWinModule.ExtractCreateWndData(); -#else // !(_ATL_VER >= 0x0700) - return ATL::_pModule->ExtractCreateWndData(); -#endif // !(_ATL_VER >= 0x0700) - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// SecureHelper - helper functions for VS2005 secure CRT - -namespace SecureHelper -{ - inline void strcpyA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc) - { -#if _SECURE_ATL - ATL::Checked::strcpy_s(lpstrDest, cchDest, lpstrSrc); -#else - if(cchDest > (size_t)lstrlenA(lpstrSrc)) - ATLVERIFY(lstrcpyA(lpstrDest, lpstrSrc) != NULL); - else - ATLASSERT(FALSE); -#endif - } - - inline void strcpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc) - { -#if _SECURE_ATL - ATL::Checked::wcscpy_s(lpstrDest, cchDest, lpstrSrc); -#else - if(cchDest > (size_t)lstrlenW(lpstrSrc)) - ATLVERIFY(lstrcpyW(lpstrDest, lpstrSrc) != NULL); - else - ATLASSERT(FALSE); -#endif - } - - inline void strcpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc) - { -#ifdef _UNICODE - strcpyW_x(lpstrDest, cchDest, lpstrSrc); -#else - strcpyA_x(lpstrDest, cchDest, lpstrSrc); -#endif - } - - inline errno_t strncpyA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc, size_t cchCount) - { -#if _SECURE_ATL - return ATL::Checked::strncpy_s(lpstrDest, cchDest, lpstrSrc, cchCount); -#else - errno_t nRet = 0; - if(lpstrDest == NULL || cchDest == 0 || lpstrSrc == NULL) - { - nRet = EINVAL; - } - else if(cchCount == _TRUNCATE) - { - cchCount = min(cchDest - 1, size_t(lstrlenA(lpstrSrc))); - nRet = STRUNCATE; - } - else if(cchDest <= cchCount) - { - lpstrDest[0] = 0; - nRet = EINVAL; - } - if(nRet == 0 || nRet == STRUNCATE) - nRet = (lstrcpynA(lpstrDest, lpstrSrc, (int)cchCount + 1) != NULL) ? nRet : EINVAL; - ATLASSERT(nRet == 0 || nRet == STRUNCATE); - return nRet; -#endif - } - - inline errno_t strncpyW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc, size_t cchCount) - { -#if _SECURE_ATL - return ATL::Checked::wcsncpy_s(lpstrDest, cchDest, lpstrSrc, cchCount); -#else - errno_t nRet = 0; - if(lpstrDest == NULL || cchDest == 0 || lpstrSrc == NULL) - { - nRet = EINVAL; - } - else if(cchCount == _TRUNCATE) - { - cchCount = min(cchDest - 1, size_t(lstrlenW(lpstrSrc))); - nRet = STRUNCATE; - } - else if(cchDest <= cchCount) - { - lpstrDest[0] = 0; - nRet = EINVAL; - } - if(nRet == 0 || nRet == STRUNCATE) - nRet = (lstrcpynW(lpstrDest, lpstrSrc, (int)cchCount + 1) != NULL) ? nRet : EINVAL; - ATLASSERT(nRet == 0 || nRet == STRUNCATE); - return nRet; -#endif - } - - inline errno_t strncpy_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc, size_t cchCount) - { -#ifdef _UNICODE - return strncpyW_x(lpstrDest, cchDest, lpstrSrc, cchCount); -#else - return strncpyA_x(lpstrDest, cchDest, lpstrSrc, cchCount); -#endif - } - - inline void strcatA_x(char* lpstrDest, size_t cchDest, const char* lpstrSrc) - { -#if _SECURE_ATL - ATL::Checked::strcat_s(lpstrDest, cchDest, lpstrSrc); -#else - if(cchDest > (size_t)lstrlenA(lpstrSrc)) - ATLVERIFY(lstrcatA(lpstrDest, lpstrSrc) != NULL); - else - ATLASSERT(FALSE); -#endif - } - - inline void strcatW_x(wchar_t* lpstrDest, size_t cchDest, const wchar_t* lpstrSrc) - { -#if _SECURE_ATL - ATL::Checked::wcscat_s(lpstrDest, cchDest, lpstrSrc); -#else - if(cchDest > (size_t)lstrlenW(lpstrSrc)) - ATLVERIFY(lstrcatW(lpstrDest, lpstrSrc) != NULL); - else - ATLASSERT(FALSE); -#endif - } - - inline void strcat_x(LPTSTR lpstrDest, size_t cchDest, LPCTSTR lpstrSrc) - { -#ifdef _UNICODE - strcatW_x(lpstrDest, cchDest, lpstrSrc); -#else - strcatA_x(lpstrDest, cchDest, lpstrSrc); -#endif - } - - inline void memcpy_x(void* pDest, size_t cbDest, const void* pSrc, size_t cbSrc) - { -#if _SECURE_ATL - ATL::Checked::memcpy_s(pDest, cbDest, pSrc, cbSrc); -#else - if(cbDest >= cbSrc) - memcpy(pDest, pSrc, cbSrc); - else - ATLASSERT(FALSE); -#endif - } - - inline void memmove_x(void* pDest, size_t cbDest, const void* pSrc, size_t cbSrc) - { -#if _SECURE_ATL - ATL::Checked::memmove_s(pDest, cbDest, pSrc, cbSrc); -#else - if(cbDest >= cbSrc) - memmove(pDest, pSrc, cbSrc); - else - ATLASSERT(FALSE); -#endif - } - - inline int vsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args) - { -#if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE) - return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args); -#else - cchBuff; // Avoid unused argument warning -#pragma warning(disable: 4996) - return _vstprintf(lpstrBuff, lpstrFormat, args); -#pragma warning(default: 4996) -#endif - } - - inline int wvsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, va_list args) - { -#if _SECURE_ATL && !defined(_ATL_MIN_CRT) && !defined(_WIN32_WCE) - return _vstprintf_s(lpstrBuff, cchBuff, lpstrFormat, args); -#else - cchBuff; // Avoid unused argument warning - return ::wvsprintf(lpstrBuff, lpstrFormat, args); -#endif - } - - inline int sprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, ...) - { - va_list args; - va_start(args, lpstrFormat); - int nRes = vsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args); - va_end(args); - return nRes; - } - - inline int wsprintf_x(LPTSTR lpstrBuff, size_t cchBuff, LPCTSTR lpstrFormat, ...) - { - va_list args; - va_start(args, lpstrFormat); - int nRes = wvsprintf_x(lpstrBuff, cchBuff, lpstrFormat, args); - va_end(args); - return nRes; - } -}; // namespace SecureHelper - - -/////////////////////////////////////////////////////////////////////////////// -// CMessageFilter - Interface for message filter support - -class CMessageFilter -{ -public: - virtual BOOL PreTranslateMessage(MSG* pMsg) = 0; -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CIdleHandler - Interface for idle processing - -class CIdleHandler -{ -public: - virtual BOOL OnIdle() = 0; -}; - -#ifndef _ATL_NO_OLD_NAMES - // for compatilibility with old names only - typedef CIdleHandler CUpdateUIObject; - #define DoUpdate OnIdle -#endif // !_ATL_NO_OLD_NAMES - - -/////////////////////////////////////////////////////////////////////////////// -// CMessageLoop - message loop implementation - -class CMessageLoop -{ -public: - ATL::CSimpleArray m_aMsgFilter; - ATL::CSimpleArray m_aIdleHandler; - MSG m_msg; - -// Message filter operations - BOOL AddMessageFilter(CMessageFilter* pMessageFilter) - { - return m_aMsgFilter.Add(pMessageFilter); - } - - BOOL RemoveMessageFilter(CMessageFilter* pMessageFilter) - { - return m_aMsgFilter.Remove(pMessageFilter); - } - -// Idle handler operations - BOOL AddIdleHandler(CIdleHandler* pIdleHandler) - { - return m_aIdleHandler.Add(pIdleHandler); - } - - BOOL RemoveIdleHandler(CIdleHandler* pIdleHandler) - { - return m_aIdleHandler.Remove(pIdleHandler); - } - -#ifndef _ATL_NO_OLD_NAMES - // for compatilibility with old names only - BOOL AddUpdateUI(CIdleHandler* pIdleHandler) - { - ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIObject and AddUpdateUI are deprecated. Please change your code to use CIdleHandler and OnIdle\n")); - return AddIdleHandler(pIdleHandler); - } - - BOOL RemoveUpdateUI(CIdleHandler* pIdleHandler) - { - ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIObject and RemoveUpdateUI are deprecated. Please change your code to use CIdleHandler and OnIdle\n")); - return RemoveIdleHandler(pIdleHandler); - } -#endif // !_ATL_NO_OLD_NAMES - -// message loop - int Run() - { - BOOL bDoIdle = TRUE; - int nIdleCount = 0; - BOOL bRet; - - for(;;) - { - while(bDoIdle && !::PeekMessage(&m_msg, NULL, 0, 0, PM_NOREMOVE)) - { - if(!OnIdle(nIdleCount++)) - bDoIdle = FALSE; - } - - bRet = ::GetMessage(&m_msg, NULL, 0, 0); - - if(bRet == -1) - { - ATLTRACE2(atlTraceUI, 0, _T("::GetMessage returned -1 (error)\n")); - continue; // error, don't process - } - else if(!bRet) - { - ATLTRACE2(atlTraceUI, 0, _T("CMessageLoop::Run - exiting\n")); - break; // WM_QUIT, exit message loop - } - - if(!PreTranslateMessage(&m_msg)) - { - ::TranslateMessage(&m_msg); - ::DispatchMessage(&m_msg); - } - - if(IsIdleMessage(&m_msg)) - { - bDoIdle = TRUE; - nIdleCount = 0; - } - } - - return (int)m_msg.wParam; - } - - static BOOL IsIdleMessage(MSG* pMsg) - { - // These messages should NOT cause idle processing - switch(pMsg->message) - { - case WM_MOUSEMOVE: -#ifndef _WIN32_WCE - case WM_NCMOUSEMOVE: -#endif // !_WIN32_WCE - case WM_PAINT: - case 0x0118: // WM_SYSTIMER (caret blink) - return FALSE; - } - - return TRUE; - } - -// Overrideables - // Override to change message filtering - virtual BOOL PreTranslateMessage(MSG* pMsg) - { - // loop backwards - for(int i = m_aMsgFilter.GetSize() - 1; i >= 0; i--) - { - CMessageFilter* pMessageFilter = m_aMsgFilter[i]; - if(pMessageFilter != NULL && pMessageFilter->PreTranslateMessage(pMsg)) - return TRUE; - } - return FALSE; // not translated - } - - // override to change idle processing - virtual BOOL OnIdle(int /*nIdleCount*/) - { - for(int i = 0; i < m_aIdleHandler.GetSize(); i++) - { - CIdleHandler* pIdleHandler = m_aIdleHandler[i]; - if(pIdleHandler != NULL) - pIdleHandler->OnIdle(); - } - return FALSE; // don't continue - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CStaticDataInitCriticalSectionLock and CWindowCreateCriticalSectionLock -// internal classes to manage critical sections for both ATL3 and ATL7 - -class CStaticDataInitCriticalSectionLock -{ -public: -#if (_ATL_VER >= 0x0700) - ATL::CComCritSecLock m_cslock; - - CStaticDataInitCriticalSectionLock() : m_cslock(ATL::_pAtlModule->m_csStaticDataInitAndTypeInfo, false) - { } -#endif // (_ATL_VER >= 0x0700) - - HRESULT Lock() - { -#if (_ATL_VER >= 0x0700) - return m_cslock.Lock(); -#else // !(_ATL_VER >= 0x0700) - ::EnterCriticalSection(&ATL::_pModule->m_csStaticDataInit); - return S_OK; -#endif // !(_ATL_VER >= 0x0700) - } - - void Unlock() - { -#if (_ATL_VER >= 0x0700) - m_cslock.Unlock(); -#else // !(_ATL_VER >= 0x0700) - ::LeaveCriticalSection(&ATL::_pModule->m_csStaticDataInit); -#endif // !(_ATL_VER >= 0x0700) - } -}; - - -class CWindowCreateCriticalSectionLock -{ -public: -#if (_ATL_VER >= 0x0700) - ATL::CComCritSecLock m_cslock; - - CWindowCreateCriticalSectionLock() : m_cslock(ATL::_AtlWinModule.m_csWindowCreate, false) - { } -#endif // (_ATL_VER >= 0x0700) - - HRESULT Lock() - { -#if (_ATL_VER >= 0x0700) - return m_cslock.Lock(); -#else // !(_ATL_VER >= 0x0700) - ::EnterCriticalSection(&ATL::_pModule->m_csWindowCreate); - return S_OK; -#endif // !(_ATL_VER >= 0x0700) - } - - void Unlock() - { -#if (_ATL_VER >= 0x0700) - m_cslock.Unlock(); -#else // !(_ATL_VER >= 0x0700) - ::LeaveCriticalSection(&ATL::_pModule->m_csWindowCreate); -#endif // !(_ATL_VER >= 0x0700) - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CTempBuffer - helper class for stack allocations for ATL3 - -#ifndef _WTL_STACK_ALLOC_THRESHOLD - #define _WTL_STACK_ALLOC_THRESHOLD 512 -#endif - -#if (_ATL_VER >= 0x0700) - -using ATL::CTempBuffer; - -#else // !(_ATL_VER >= 0x0700) - -#ifndef SIZE_MAX - #ifdef _WIN64 - #define SIZE_MAX _UI64_MAX - #else - #define SIZE_MAX UINT_MAX - #endif -#endif - -#pragma warning(disable: 4284) // warning for operator -> - -template -class CTempBuffer -{ -public: - CTempBuffer() : m_p(NULL) - { - } - - CTempBuffer(size_t nElements) : m_p(NULL) - { - Allocate(nElements); - } - - ~CTempBuffer() - { - if(m_p != reinterpret_cast(m_abFixedBuffer)) - free(m_p); - } - - operator T*() const - { - return m_p; - } - - T* operator ->() const - { - ATLASSERT(m_p != NULL); - return m_p; - } - - T* Allocate(size_t nElements) - { - ATLASSERT(nElements <= (SIZE_MAX / sizeof(T))); - return AllocateBytes(nElements * sizeof(T)); - } - - T* AllocateBytes(size_t nBytes) - { - ATLASSERT(m_p == NULL); - if(nBytes > t_nFixedBytes) - m_p = static_cast(malloc(nBytes)); - else - m_p = reinterpret_cast(m_abFixedBuffer); - - return m_p; - } - -private: - T* m_p; - BYTE m_abFixedBuffer[t_nFixedBytes]; -}; - -#pragma warning(default: 4284) - -#endif // !(_ATL_VER >= 0x0700) - - -/////////////////////////////////////////////////////////////////////////////// -// CAppModule - module class for an application - -class CAppModule : public ATL::CComModule -{ -public: - DWORD m_dwMainThreadID; - ATL::CSimpleMap* m_pMsgLoopMap; - ATL::CSimpleArray* m_pSettingChangeNotify; - -// Overrides of CComModule::Init and Term - HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const GUID* pLibID = NULL) - { - HRESULT hRet = CComModule::Init(pObjMap, hInstance, pLibID); - if(FAILED(hRet)) - return hRet; - - m_dwMainThreadID = ::GetCurrentThreadId(); - typedef ATL::CSimpleMap _mapClass; - m_pMsgLoopMap = NULL; - ATLTRY(m_pMsgLoopMap = new _mapClass); - if(m_pMsgLoopMap == NULL) - return E_OUTOFMEMORY; - m_pSettingChangeNotify = NULL; - - return hRet; - } - - void Term() - { - TermSettingChangeNotify(); - delete m_pMsgLoopMap; - CComModule::Term(); - } - -// Message loop map methods - BOOL AddMessageLoop(CMessageLoop* pMsgLoop) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddMessageLoop.\n")); - ATLASSERT(FALSE); - return FALSE; - } - - ATLASSERT(pMsgLoop != NULL); - ATLASSERT(m_pMsgLoopMap->Lookup(::GetCurrentThreadId()) == NULL); // not in map yet - - BOOL bRet = m_pMsgLoopMap->Add(::GetCurrentThreadId(), pMsgLoop); - - lock.Unlock(); - - return bRet; - } - - BOOL RemoveMessageLoop() - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveMessageLoop.\n")); - ATLASSERT(FALSE); - return FALSE; - } - - BOOL bRet = m_pMsgLoopMap->Remove(::GetCurrentThreadId()); - - lock.Unlock(); - - return bRet; - } - - CMessageLoop* GetMessageLoop(DWORD dwThreadID = ::GetCurrentThreadId()) const - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::GetMessageLoop.\n")); - ATLASSERT(FALSE); - return NULL; - } - - CMessageLoop* pLoop = m_pMsgLoopMap->Lookup(dwThreadID); - - lock.Unlock(); - - return pLoop; - } - -// Setting change notify methods - // Note: Call this from the main thread for MSDI apps - BOOL InitSettingChangeNotify(DLGPROC pfnDlgProc = _SettingChangeDlgProc) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::InitSettingChangeNotify.\n")); - ATLASSERT(FALSE); - return FALSE; - } - - if(m_pSettingChangeNotify == NULL) - { - typedef ATL::CSimpleArray _notifyClass; - ATLTRY(m_pSettingChangeNotify = new _notifyClass); - ATLASSERT(m_pSettingChangeNotify != NULL); - } - - BOOL bRet = (m_pSettingChangeNotify != NULL); - if(bRet && m_pSettingChangeNotify->GetSize() == 0) - { - // init everything - _ATL_EMPTY_DLGTEMPLATE templ; - HWND hNtfWnd = ::CreateDialogIndirect(GetModuleInstance(), &templ, NULL, pfnDlgProc); - ATLASSERT(::IsWindow(hNtfWnd)); - if(::IsWindow(hNtfWnd)) - { -// need conditional code because types don't match in winuser.h -#ifdef _WIN64 - ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, (LONG_PTR)this); -#else - ::SetWindowLongPtr(hNtfWnd, GWLP_USERDATA, PtrToLong(this)); -#endif - bRet = m_pSettingChangeNotify->Add(hNtfWnd); - } - else - { - bRet = FALSE; - } - } - - lock.Unlock(); - - return bRet; - } - - void TermSettingChangeNotify() - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::TermSettingChangeNotify.\n")); - ATLASSERT(FALSE); - return; - } - - if(m_pSettingChangeNotify != NULL && m_pSettingChangeNotify->GetSize() > 0) - ::DestroyWindow((*m_pSettingChangeNotify)[0]); - delete m_pSettingChangeNotify; - m_pSettingChangeNotify = NULL; - - lock.Unlock(); - } - - BOOL AddSettingChangeNotify(HWND hWnd) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::AddSettingChangeNotify.\n")); - ATLASSERT(FALSE); - return FALSE; - } - - ATLASSERT(::IsWindow(hWnd)); - BOOL bRet = FALSE; - if(InitSettingChangeNotify() != FALSE) - bRet = m_pSettingChangeNotify->Add(hWnd); - - lock.Unlock(); - - return bRet; - } - - BOOL RemoveSettingChangeNotify(HWND hWnd) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CAppModule::RemoveSettingChangeNotify.\n")); - ATLASSERT(FALSE); - return FALSE; - } - - BOOL bRet = FALSE; - if(m_pSettingChangeNotify != NULL) - bRet = m_pSettingChangeNotify->Remove(hWnd); - - lock.Unlock(); - - return bRet; - } - -// Implementation - setting change notify dialog template and dialog procedure - struct _ATL_EMPTY_DLGTEMPLATE : DLGTEMPLATE - { - _ATL_EMPTY_DLGTEMPLATE() - { - memset(this, 0, sizeof(_ATL_EMPTY_DLGTEMPLATE)); - style = WS_POPUP; - } - WORD wMenu, wClass, wTitle; - }; - -#ifdef _WIN64 - static INT_PTR CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -#else - static BOOL CALLBACK _SettingChangeDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) -#endif - { - if(uMsg == WM_SETTINGCHANGE) - { -// need conditional code because types don't match in winuser.h -#ifdef _WIN64 - CAppModule* pModule = (CAppModule*)::GetWindowLongPtr(hWnd, GWLP_USERDATA); -#else - CAppModule* pModule = (CAppModule*)LongToPtr(::GetWindowLongPtr(hWnd, GWLP_USERDATA)); -#endif - ATLASSERT(pModule != NULL); - ATLASSERT(pModule->m_pSettingChangeNotify != NULL); - const UINT uTimeout = 1500; // ms - for(int i = 1; i < pModule->m_pSettingChangeNotify->GetSize(); i++) - { -#if !defined(_WIN32_WCE) - ::SendMessageTimeout((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam, SMTO_ABORTIFHUNG, uTimeout, NULL); -#elif(_WIN32_WCE >= 400) // CE specific - ::SendMessageTimeout((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam, SMTO_NORMAL, uTimeout, NULL); -#else // _WIN32_WCE < 400 specific - uTimeout; - ::SendMessage((*pModule->m_pSettingChangeNotify)[i], uMsg, wParam, lParam); -#endif - } - return TRUE; - } - return FALSE; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CServerAppModule - module class for a COM server application - -class CServerAppModule : public CAppModule -{ -public: - HANDLE m_hEventShutdown; - bool m_bActivity; - DWORD m_dwTimeOut; - DWORD m_dwPause; - -// Override of CAppModule::Init - HRESULT Init(ATL::_ATL_OBJMAP_ENTRY* pObjMap, HINSTANCE hInstance, const GUID* pLibID = NULL) - { - m_dwTimeOut = 5000; - m_dwPause = 1000; - return CAppModule::Init(pObjMap, hInstance, pLibID); - } - - void Term() - { - if(m_hEventShutdown != NULL && ::CloseHandle(m_hEventShutdown)) - m_hEventShutdown = NULL; - CAppModule::Term(); - } - -// COM Server methods - LONG Unlock() - { - LONG lRet = CComModule::Unlock(); - if(lRet == 0) - { - m_bActivity = true; - ::SetEvent(m_hEventShutdown); // tell monitor that we transitioned to zero - } - return lRet; - } - - void MonitorShutdown() - { - for(;;) - { - ::WaitForSingleObject(m_hEventShutdown, INFINITE); - DWORD dwWait = 0; - do - { - m_bActivity = false; - dwWait = ::WaitForSingleObject(m_hEventShutdown, m_dwTimeOut); - } - while(dwWait == WAIT_OBJECT_0); - // timed out - if(!m_bActivity && m_nLockCnt == 0) // if no activity let's really bail - { -#if ((_WIN32_WINNT >= 0x0400 ) || defined(_WIN32_DCOM)) && defined(_ATL_FREE_THREADED) && !defined(_WIN32_WCE) - ::CoSuspendClassObjects(); - if(!m_bActivity && m_nLockCnt == 0) -#endif - break; - } - } - // This handle should be valid now. If it isn't, - // check if _Module.Term was called first (it shouldn't) - if(::CloseHandle(m_hEventShutdown)) - m_hEventShutdown = NULL; - ::PostThreadMessage(m_dwMainThreadID, WM_QUIT, 0, 0); - } - - bool StartMonitor() - { - m_hEventShutdown = ::CreateEvent(NULL, false, false, NULL); - if(m_hEventShutdown == NULL) - return false; - DWORD dwThreadID = 0; -#if !defined(_ATL_MIN_CRT) && defined(_MT) && !defined(_WIN32_WCE) - HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, (UINT (WINAPI*)(void*))MonitorProc, this, 0, (UINT*)&dwThreadID); -#else - HANDLE hThread = ::CreateThread(NULL, 0, MonitorProc, this, 0, &dwThreadID); -#endif - bool bRet = (hThread != NULL); - if(bRet) - ::CloseHandle(hThread); - return bRet; - } - - static DWORD WINAPI MonitorProc(void* pv) - { - CServerAppModule* p = (CServerAppModule*)pv; - p->MonitorShutdown(); - return 0; - } - -#if (_ATL_VER < 0x0700) - // search for an occurence of string p2 in string p1 - static LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) - { - while(p1 != NULL && *p1 != NULL) - { - LPCTSTR p = p2; - while(p != NULL && *p != NULL) - { - if(*p1 == *p) - return ::CharNext(p1); - p = ::CharNext(p); - } - p1 = ::CharNext(p1); - } - return NULL; - } -#endif // (_ATL_VER < 0x0700) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CRegKeyEx - adds type-specific methods to ATL3 CRegKey - -#if (_ATL_VER < 0x0700) - -class CRegKeyEx : public ATL::CRegKey -{ -public: -// Constructors and operators - CRegKeyEx(HKEY hKey = NULL) - { - m_hKey = hKey; - } - - CRegKeyEx(CRegKeyEx& key) - { - Attach(key.Detach()); - } - - CRegKeyEx& operator =(CRegKeyEx& key) - { - Close(); - Attach(key.Detach()); - return *this; - } - -// Methods - LONG SetValue(LPCTSTR pszValueName, DWORD dwType, const void* pValue, ULONG nBytes) - { - ATLASSERT(m_hKey != NULL); - return ::RegSetValueEx(m_hKey, pszValueName, NULL, dwType, static_cast(pValue), nBytes); - } - - LONG SetGUIDValue(LPCTSTR pszValueName, REFGUID guidValue) - { - ATLASSERT(m_hKey != NULL); - - OLECHAR szGUID[64] = { 0 }; - ::StringFromGUID2(guidValue, szGUID, 64); - - USES_CONVERSION; - LPCTSTR lpstr = OLE2CT(szGUID); -#ifndef _UNICODE - if(lpstr == NULL) - return E_OUTOFMEMORY; -#endif - return SetStringValue(pszValueName, lpstr); - } - - LONG SetBinaryValue(LPCTSTR pszValueName, const void* pValue, ULONG nBytes) - { - ATLASSERT(m_hKey != NULL); - return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_BINARY, reinterpret_cast(pValue), nBytes); - } - - LONG SetDWORDValue(LPCTSTR pszValueName, DWORD dwValue) - { - ATLASSERT(m_hKey != NULL); - return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_DWORD, reinterpret_cast(&dwValue), sizeof(DWORD)); - } - -#ifndef _WIN32_WCE - LONG SetQWORDValue(LPCTSTR pszValueName, ULONGLONG qwValue) - { - ATLASSERT(m_hKey != NULL); - return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_QWORD, reinterpret_cast(&qwValue), sizeof(ULONGLONG)); - } -#endif - - LONG SetStringValue(LPCTSTR pszValueName, LPCTSTR pszValue, DWORD dwType = REG_SZ) - { - ATLASSERT(m_hKey != NULL); - if(pszValue == NULL) - { - ATLASSERT(FALSE); - return ERROR_INVALID_DATA; - } - ATLASSERT((dwType == REG_SZ) || (dwType == REG_EXPAND_SZ)); - - return ::RegSetValueEx(m_hKey, pszValueName, NULL, dwType, reinterpret_cast(pszValue), (lstrlen(pszValue) + 1) * sizeof(TCHAR)); - } - - LONG SetMultiStringValue(LPCTSTR pszValueName, LPCTSTR pszValue) - { - ATLASSERT(m_hKey != NULL); - if(pszValue == NULL) - { - ATLASSERT(FALSE); - return ERROR_INVALID_DATA; - } - - ULONG nBytes = 0; - ULONG nLength = 0; - LPCTSTR pszTemp = pszValue; - do - { - nLength = lstrlen(pszTemp) + 1; - pszTemp += nLength; - nBytes += nLength * sizeof(TCHAR); - } while (nLength != 1); - - return ::RegSetValueEx(m_hKey, pszValueName, NULL, REG_MULTI_SZ, reinterpret_cast(pszValue), nBytes); - } - - LONG QueryValue(LPCTSTR pszValueName, DWORD* pdwType, void* pData, ULONG* pnBytes) - { - ATLASSERT(m_hKey != NULL); - return ::RegQueryValueEx(m_hKey, pszValueName, NULL, pdwType, static_cast(pData), pnBytes); - } - - LONG QueryGUIDValue(LPCTSTR pszValueName, GUID& guidValue) - { - ATLASSERT(m_hKey != NULL); - - guidValue = GUID_NULL; - - TCHAR szGUID[64] = { 0 }; - ULONG nCount = 64; - LONG lRes = QueryStringValue(pszValueName, szGUID, &nCount); - - if (lRes != ERROR_SUCCESS) - return lRes; - - if(szGUID[0] != _T('{')) - return ERROR_INVALID_DATA; - - USES_CONVERSION; - LPOLESTR lpstr = T2OLE(szGUID); -#ifndef _UNICODE - if(lpstr == NULL) - return E_OUTOFMEMORY; -#endif - - HRESULT hr = ::CLSIDFromString(lpstr, &guidValue); - if (FAILED(hr)) - return ERROR_INVALID_DATA; - - return ERROR_SUCCESS; - } - - LONG QueryBinaryValue(LPCTSTR pszValueName, void* pValue, ULONG* pnBytes) - { - ATLASSERT(pnBytes != NULL); - ATLASSERT(m_hKey != NULL); - - DWORD dwType = 0; - LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(pValue), pnBytes); - if (lRes != ERROR_SUCCESS) - return lRes; - if (dwType != REG_BINARY) - return ERROR_INVALID_DATA; - - return ERROR_SUCCESS; - } - - LONG QueryDWORDValue(LPCTSTR pszValueName, DWORD& dwValue) - { - ATLASSERT(m_hKey != NULL); - - ULONG nBytes = sizeof(DWORD); - DWORD dwType = 0; - LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(&dwValue), &nBytes); - if (lRes != ERROR_SUCCESS) - return lRes; - if (dwType != REG_DWORD) - return ERROR_INVALID_DATA; - - return ERROR_SUCCESS; - } - - LONG QueryQWORDValue(LPCTSTR pszValueName, ULONGLONG& qwValue) - { - ATLASSERT(m_hKey != NULL); - - ULONG nBytes = sizeof(ULONGLONG); - DWORD dwType = 0; - LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(&qwValue), &nBytes); - if (lRes != ERROR_SUCCESS) - return lRes; - if (dwType != REG_QWORD) - return ERROR_INVALID_DATA; - - return ERROR_SUCCESS; - } - - LONG QueryStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) - { - ATLASSERT(m_hKey != NULL); - ATLASSERT(pnChars != NULL); - - ULONG nBytes = (*pnChars) * sizeof(TCHAR); - DWORD dwType = 0; - *pnChars = 0; - LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(pszValue), &nBytes); - - if (lRes != ERROR_SUCCESS) - { - return lRes; - } - - if(dwType != REG_SZ && dwType != REG_EXPAND_SZ) - { - return ERROR_INVALID_DATA; - } - - if (pszValue != NULL) - { - if(nBytes != 0) - { - if ((nBytes % sizeof(TCHAR) != 0) || (pszValue[nBytes / sizeof(TCHAR) -1] != 0)) - return ERROR_INVALID_DATA; - } - else - { - pszValue[0] = _T('\0'); - } - } - - *pnChars = nBytes / sizeof(TCHAR); - - return ERROR_SUCCESS; - } - - LONG QueryMultiStringValue(LPCTSTR pszValueName, LPTSTR pszValue, ULONG* pnChars) - { - ATLASSERT(m_hKey != NULL); - ATLASSERT(pnChars != NULL); - - if (pszValue != NULL && *pnChars < 2) - return ERROR_INSUFFICIENT_BUFFER; - - ULONG nBytes = (*pnChars) * sizeof(TCHAR); - DWORD dwType = 0; - *pnChars = 0; - LONG lRes = ::RegQueryValueEx(m_hKey, pszValueName, NULL, &dwType, reinterpret_cast(pszValue), &nBytes); - if (lRes != ERROR_SUCCESS) - return lRes; - if (dwType != REG_MULTI_SZ) - return ERROR_INVALID_DATA; - if (pszValue != NULL && (nBytes % sizeof(TCHAR) != 0 || nBytes / sizeof(TCHAR) < 1 || pszValue[nBytes / sizeof(TCHAR) - 1] != 0 || ((nBytes / sizeof(TCHAR)) > 1 && pszValue[nBytes / sizeof(TCHAR) - 2] != 0))) - return ERROR_INVALID_DATA; - - *pnChars = nBytes / sizeof(TCHAR); - - return ERROR_SUCCESS; - } -}; - -#else // !(_ATL_VER < 0x0700) - -typedef ATL::CRegKey CRegKeyEx; - -#endif // !(_ATL_VER < 0x0700) - - -/////////////////////////////////////////////////////////////////////////////// -// CString forward reference (enables CString use in atluser.h and atlgdi.h) - -#if defined(_WTL_FORWARD_DECLARE_CSTRING) && !defined(_WTL_USE_CSTRING) - #define _WTL_USE_CSTRING -#endif // defined(_WTL_FORWARD_DECLARE_CSTRING) && !defined(_WTL_USE_CSTRING) - -#ifdef _WTL_USE_CSTRING - class CString; // forward declaration (include atlmisc.h for the whole class) -#endif // _WTL_USE_CSTRING - -// CString namespace -#ifndef _CSTRING_NS - #ifdef __ATLSTR_H__ - #define _CSTRING_NS ATL - #else - #define _CSTRING_NS WTL - #endif -#endif // _CSTRING_NS - -// Type classes namespace -#ifndef _WTYPES_NS - #ifdef __ATLTYPES_H__ - #define _WTYPES_NS - #else - #define _WTYPES_NS WTL - #endif -#endif // _WTYPES_NS - -}; // namespace WTL - - -/////////////////////////////////////////////////////////////////////////////// -// General DLL version helpers (excluded from atlbase.h if _ATL_DLL is defined) - -#if (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) - -namespace ATL -{ - -inline HRESULT AtlGetDllVersion(HINSTANCE hInstDLL, DLLVERSIONINFO* pDllVersionInfo) -{ - ATLASSERT(pDllVersionInfo != NULL); - if(pDllVersionInfo == NULL) - return E_INVALIDARG; - - // We must get this function explicitly because some DLLs don't implement it. - DLLGETVERSIONPROC pfnDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hInstDLL, "DllGetVersion"); - if(pfnDllGetVersion == NULL) - return E_NOTIMPL; - - return (*pfnDllGetVersion)(pDllVersionInfo); -} - -inline HRESULT AtlGetDllVersion(LPCTSTR lpstrDllName, DLLVERSIONINFO* pDllVersionInfo) -{ - HINSTANCE hInstDLL = ::LoadLibrary(lpstrDllName); - if(hInstDLL == NULL) - return E_FAIL; - HRESULT hRet = AtlGetDllVersion(hInstDLL, pDllVersionInfo); - ::FreeLibrary(hInstDLL); - return hRet; -} - -// Common Control Versions: -// Win95/WinNT 4.0 maj=4 min=00 -// IE 3.x maj=4 min=70 -// IE 4.0 maj=4 min=71 -inline HRESULT AtlGetCommCtrlVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) -{ - ATLASSERT(pdwMajor != NULL && pdwMinor != NULL); - if(pdwMajor == NULL || pdwMinor == NULL) - return E_INVALIDARG; - - DLLVERSIONINFO dvi; - ::ZeroMemory(&dvi, sizeof(dvi)); - dvi.cbSize = sizeof(dvi); - HRESULT hRet = AtlGetDllVersion(_T("comctl32.dll"), &dvi); - - if(SUCCEEDED(hRet)) - { - *pdwMajor = dvi.dwMajorVersion; - *pdwMinor = dvi.dwMinorVersion; - } - else if(hRet == E_NOTIMPL) - { - // If DllGetVersion is not there, then the DLL is a version - // previous to the one shipped with IE 3.x - *pdwMajor = 4; - *pdwMinor = 0; - hRet = S_OK; - } - - return hRet; -} - -// Shell Versions: -// Win95/WinNT 4.0 maj=4 min=00 -// IE 3.x, IE 4.0 without Web Integrated Desktop maj=4 min=00 -// IE 4.0 with Web Integrated Desktop maj=4 min=71 -// IE 4.01 with Web Integrated Desktop maj=4 min=72 -inline HRESULT AtlGetShellVersion(LPDWORD pdwMajor, LPDWORD pdwMinor) -{ - ATLASSERT(pdwMajor != NULL && pdwMinor != NULL); - if(pdwMajor == NULL || pdwMinor == NULL) - return E_INVALIDARG; - - DLLVERSIONINFO dvi; - ::ZeroMemory(&dvi, sizeof(dvi)); - dvi.cbSize = sizeof(dvi); - HRESULT hRet = AtlGetDllVersion(_T("shell32.dll"), &dvi); - - if(SUCCEEDED(hRet)) - { - *pdwMajor = dvi.dwMajorVersion; - *pdwMinor = dvi.dwMinorVersion; - } - else if(hRet == E_NOTIMPL) - { - // If DllGetVersion is not there, then the DLL is a version - // previous to the one shipped with IE 4.x - *pdwMajor = 4; - *pdwMinor = 0; - hRet = S_OK; - } - - return hRet; -} - -}; // namespace ATL - -#endif // (_ATL_VER < 0x0700) && defined(_ATL_DLL) && !defined(_WIN32_WCE) - - -// These are always included -#include "atlwinx.h" -#include "atluser.h" -#include "atlgdi.h" - -#ifndef _WTL_NO_AUTOMATIC_NAMESPACE -using namespace WTL; -#endif // !_WTL_NO_AUTOMATIC_NAMESPACE - -#endif // __ATLAPP_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlcrack.h b/plugins/SmartAutoReplier/wtl/atlcrack.h deleted file mode 100644 index b9971b5510..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlcrack.h +++ /dev/null @@ -1,2384 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLCRACK_H__ -#define __ATLCRACK_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlcrack.h requires atlapp.h to be included first -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Message map macro for cracked handlers - -// Note about message maps with cracked handlers: -// For ATL 3.0, a message map using cracked handlers MUST use BEGIN_MSG_MAP_EX. -// For ATL 7.0 or higher, you can use BEGIN_MSG_MAP for CWindowImpl/CDialogImpl derived classes, -// but must use BEGIN_MSG_MAP_EX for classes that don't derive from CWindowImpl/CDialogImpl. - -#define BEGIN_MSG_MAP_EX(theClass) \ -public: \ - BOOL m_bMsgHandled; \ - /* "handled" management for cracked handlers */ \ - BOOL IsMsgHandled() const \ - { \ - return m_bMsgHandled; \ - } \ - void SetMsgHandled(BOOL bHandled) \ - { \ - m_bMsgHandled = bHandled; \ - } \ - BOOL ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID = 0) \ - { \ - BOOL bOldMsgHandled = m_bMsgHandled; \ - BOOL bRet = _ProcessWindowMessage(hWnd, uMsg, wParam, lParam, lResult, dwMsgMapID); \ - m_bMsgHandled = bOldMsgHandled; \ - return bRet; \ - } \ - BOOL _ProcessWindowMessage(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT& lResult, DWORD dwMsgMapID) \ - { \ - BOOL bHandled = TRUE; \ - hWnd; \ - uMsg; \ - wParam; \ - lParam; \ - lResult; \ - bHandled; \ - switch(dwMsgMapID) \ - { \ - case 0: - - -/////////////////////////////////////////////////////////////////////////////// -// Standard Windows message macros - -// int OnCreate(LPCREATESTRUCT lpCreateStruct) -#define MSG_WM_CREATE(func) \ - if (uMsg == WM_CREATE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam) -#define MSG_WM_INITDIALOG(func) \ - if (uMsg == WM_INITDIALOG) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HWND)wParam, lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnCopyData(CWindow wnd, PCOPYDATASTRUCT pCopyDataStruct) -#define MSG_WM_COPYDATA(func) \ - if (uMsg == WM_COPYDATA) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HWND)wParam, (PCOPYDATASTRUCT)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDestroy() -#define MSG_WM_DESTROY(func) \ - if (uMsg == WM_DESTROY) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMove(CPoint ptPos) -#define MSG_WM_MOVE(func) \ - if (uMsg == WM_MOVE) \ - { \ - SetMsgHandled(TRUE); \ - func(_WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSize(UINT nType, CSize size) -#define MSG_WM_SIZE(func) \ - if (uMsg == WM_SIZE) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnActivate(UINT nState, BOOL bMinimized, CWindow wndOther) -#define MSG_WM_ACTIVATE(func) \ - if (uMsg == WM_ACTIVATE) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)LOWORD(wParam), (BOOL)HIWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSetFocus(CWindow wndOld) -#define MSG_WM_SETFOCUS(func) \ - if (uMsg == WM_SETFOCUS) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnKillFocus(CWindow wndFocus) -#define MSG_WM_KILLFOCUS(func) \ - if (uMsg == WM_KILLFOCUS) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnEnable(BOOL bEnable) -#define MSG_WM_ENABLE(func) \ - if (uMsg == WM_ENABLE) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnPaint(CDCHandle dc) -#define MSG_WM_PAINT(func) \ - if (uMsg == WM_PAINT) \ - { \ - SetMsgHandled(TRUE); \ - func((HDC)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnClose() -#define MSG_WM_CLOSE(func) \ - if (uMsg == WM_CLOSE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnQueryEndSession(UINT nSource, UINT uLogOff) -#define MSG_WM_QUERYENDSESSION(func) \ - if (uMsg == WM_QUERYENDSESSION) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)wParam, (UINT)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnQueryOpen() -#define MSG_WM_QUERYOPEN(func) \ - if (uMsg == WM_QUERYOPEN) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func(); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnEraseBkgnd(CDCHandle dc) -#define MSG_WM_ERASEBKGND(func) \ - if (uMsg == WM_ERASEBKGND) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSysColorChange() -#define MSG_WM_SYSCOLORCHANGE(func) \ - if (uMsg == WM_SYSCOLORCHANGE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnEndSession(BOOL bEnding, UINT uLogOff) -#define MSG_WM_ENDSESSION(func) \ - if (uMsg == WM_ENDSESSION) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)wParam, (UINT)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnShowWindow(BOOL bShow, UINT nStatus) -#define MSG_WM_SHOWWINDOW(func) \ - if (uMsg == WM_SHOWWINDOW) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)wParam, (int)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnCtlColorEdit(CDCHandle dc, CEdit edit) -#define MSG_WM_CTLCOLOREDIT(func) \ - if (uMsg == WM_CTLCOLOREDIT) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnCtlColorListBox(CDCHandle dc, CListBox listBox) -#define MSG_WM_CTLCOLORLISTBOX(func) \ - if (uMsg == WM_CTLCOLORLISTBOX) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnCtlColorBtn(CDCHandle dc, CButton button) -#define MSG_WM_CTLCOLORBTN(func) \ - if (uMsg == WM_CTLCOLORBTN) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnCtlColorDlg(CDCHandle dc, CWindow wnd) -#define MSG_WM_CTLCOLORDLG(func) \ - if (uMsg == WM_CTLCOLORDLG) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnCtlColorScrollBar(CDCHandle dc, CScrollBar scrollBar) -#define MSG_WM_CTLCOLORSCROLLBAR(func) \ - if (uMsg == WM_CTLCOLORSCROLLBAR) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnCtlColorStatic(CDCHandle dc, CStatic wndStatic) -#define MSG_WM_CTLCOLORSTATIC(func) \ - if (uMsg == WM_CTLCOLORSTATIC) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSettingChange(UINT uFlags, LPCTSTR lpszSection) -#define MSG_WM_SETTINGCHANGE(func) \ - if (uMsg == WM_SETTINGCHANGE) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPCTSTR)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDevModeChange(LPCTSTR lpDeviceName) -#define MSG_WM_DEVMODECHANGE(func) \ - if (uMsg == WM_DEVMODECHANGE) \ - { \ - SetMsgHandled(TRUE); \ - func((LPCTSTR)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnActivateApp(BOOL bActive, DWORD dwThreadID) -#define MSG_WM_ACTIVATEAPP(func) \ - if (uMsg == WM_ACTIVATEAPP) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)wParam, (DWORD)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnFontChange() -#define MSG_WM_FONTCHANGE(func) \ - if (uMsg == WM_FONTCHANGE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnTimeChange() -#define MSG_WM_TIMECHANGE(func) \ - if (uMsg == WM_TIMECHANGE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCancelMode() -#define MSG_WM_CANCELMODE(func) \ - if (uMsg == WM_CANCELMODE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnSetCursor(CWindow wnd, UINT nHitTest, UINT message) -#define MSG_WM_SETCURSOR(func) \ - if (uMsg == WM_SETCURSOR) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnMouseActivate(CWindow wndTopLevel, UINT nHitTest, UINT message) -#define MSG_WM_MOUSEACTIVATE(func) \ - if (uMsg == WM_MOUSEACTIVATE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnChildActivate() -#define MSG_WM_CHILDACTIVATE(func) \ - if (uMsg == WM_CHILDACTIVATE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnGetMinMaxInfo(LPMINMAXINFO lpMMI) -#define MSG_WM_GETMINMAXINFO(func) \ - if (uMsg == WM_GETMINMAXINFO) \ - { \ - SetMsgHandled(TRUE); \ - func((LPMINMAXINFO)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnIconEraseBkgnd(CDCHandle dc) -#define MSG_WM_ICONERASEBKGND(func) \ - if (uMsg == WM_ICONERASEBKGND) \ - { \ - SetMsgHandled(TRUE); \ - func((HDC)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSpoolerStatus(UINT nStatus, UINT nJobs) -#define MSG_WM_SPOOLERSTATUS(func) \ - if (uMsg == WM_SPOOLERSTATUS) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (UINT)LOWORD(lParam)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) -#define MSG_WM_DRAWITEM(func) \ - if (uMsg == WM_DRAWITEM) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) -#define MSG_WM_MEASUREITEM(func) \ - if (uMsg == WM_MEASUREITEM) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct) -#define MSG_WM_DELETEITEM(func) \ - if (uMsg == WM_DELETEITEM) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPDELETEITEMSTRUCT)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -//int OnCharToItem(UINT nChar, UINT nIndex, CListBox listBox) -#define MSG_WM_CHARTOITEM(func) \ - if (uMsg == WM_CHARTOITEM) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnVKeyToItem(UINT nKey, UINT nIndex, CListBox listBox) -#define MSG_WM_VKEYTOITEM(func) \ - if (uMsg == WM_VKEYTOITEM) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HCURSOR OnQueryDragIcon() -#define MSG_WM_QUERYDRAGICON(func) \ - if (uMsg == WM_QUERYDRAGICON) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func(); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct) -#define MSG_WM_COMPAREITEM(func) \ - if (uMsg == WM_COMPAREITEM) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)wParam, (LPCOMPAREITEMSTRUCT)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCompacting(UINT nCpuTime) -#define MSG_WM_COMPACTING(func) \ - if (uMsg == WM_COMPACTING) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnNcCreate(LPCREATESTRUCT lpCreateStruct) -#define MSG_WM_NCCREATE(func) \ - if (uMsg == WM_NCCREATE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((LPCREATESTRUCT)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcDestroy() -#define MSG_WM_NCDESTROY(func) \ - if (uMsg == WM_NCDESTROY) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnNcCalcSize(BOOL bCalcValidRects, LPARAM lParam) -#define MSG_WM_NCCALCSIZE(func) \ - if (uMsg == WM_NCCALCSIZE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((BOOL)wParam, lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// UINT OnNcHitTest(CPoint point) -#define MSG_WM_NCHITTEST(func) \ - if (uMsg == WM_NCHITTEST) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func(_WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcPaint(CRgnHandle rgn) -#define MSG_WM_NCPAINT(func) \ - if (uMsg == WM_NCPAINT) \ - { \ - SetMsgHandled(TRUE); \ - func((HRGN)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnNcActivate(BOOL bActive) -#define MSG_WM_NCACTIVATE(func) \ - if (uMsg == WM_NCACTIVATE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((BOOL)wParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// UINT OnGetDlgCode(LPMSG lpMsg) -#define MSG_WM_GETDLGCODE(func) \ - if (uMsg == WM_GETDLGCODE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((LPMSG)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcMouseMove(UINT nHitTest, CPoint point) -#define MSG_WM_NCMOUSEMOVE(func) \ - if (uMsg == WM_NCMOUSEMOVE) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcLButtonDown(UINT nHitTest, CPoint point) -#define MSG_WM_NCLBUTTONDOWN(func) \ - if (uMsg == WM_NCLBUTTONDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcLButtonUp(UINT nHitTest, CPoint point) -#define MSG_WM_NCLBUTTONUP(func) \ - if (uMsg == WM_NCLBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcLButtonDblClk(UINT nHitTest, CPoint point) -#define MSG_WM_NCLBUTTONDBLCLK(func) \ - if (uMsg == WM_NCLBUTTONDBLCLK) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcRButtonDown(UINT nHitTest, CPoint point) -#define MSG_WM_NCRBUTTONDOWN(func) \ - if (uMsg == WM_NCRBUTTONDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcRButtonUp(UINT nHitTest, CPoint point) -#define MSG_WM_NCRBUTTONUP(func) \ - if (uMsg == WM_NCRBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcRButtonDblClk(UINT nHitTest, CPoint point) -#define MSG_WM_NCRBUTTONDBLCLK(func) \ - if (uMsg == WM_NCRBUTTONDBLCLK) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcMButtonDown(UINT nHitTest, CPoint point) -#define MSG_WM_NCMBUTTONDOWN(func) \ - if (uMsg == WM_NCMBUTTONDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcMButtonUp(UINT nHitTest, CPoint point) -#define MSG_WM_NCMBUTTONUP(func) \ - if (uMsg == WM_NCMBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNcMButtonDblClk(UINT nHitTest, CPoint point) -#define MSG_WM_NCMBUTTONDBLCLK(func) \ - if (uMsg == WM_NCMBUTTONDBLCLK) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_KEYDOWN(func) \ - if (uMsg == WM_KEYDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_KEYUP(func) \ - if (uMsg == WM_KEYUP) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_CHAR(func) \ - if (uMsg == WM_CHAR) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDeadChar(UINT nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_DEADCHAR(func) \ - if (uMsg == WM_DEADCHAR) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSysKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_SYSKEYDOWN(func) \ - if (uMsg == WM_SYSKEYDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSysKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_SYSKEYUP(func) \ - if (uMsg == WM_SYSKEYUP) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSysChar(UINT nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_SYSCHAR(func) \ - if (uMsg == WM_SYSCHAR) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSysDeadChar(UINT nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_SYSDEADCHAR(func) \ - if (uMsg == WM_SYSDEADCHAR) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSysCommand(UINT nID, LPARAM lParam) -#define MSG_WM_SYSCOMMAND(func) \ - if (uMsg == WM_SYSCOMMAND) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnTCard(UINT idAction, DWORD dwActionData) -#define MSG_WM_TCARD(func) \ - if (uMsg == WM_TCARD) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (DWORD)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnTimer(UINT_PTR nIDEvent) -#define MSG_WM_TIMER(func) \ - if (uMsg == WM_TIMER) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT_PTR)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) -#define MSG_WM_HSCROLL(func) \ - if (uMsg == WM_HSCROLL) \ - { \ - SetMsgHandled(TRUE); \ - func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) -#define MSG_WM_VSCROLL(func) \ - if (uMsg == WM_VSCROLL) \ - { \ - SetMsgHandled(TRUE); \ - func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnInitMenu(CMenuHandle menu) -#define MSG_WM_INITMENU(func) \ - if (uMsg == WM_INITMENU) \ - { \ - SetMsgHandled(TRUE); \ - func((HMENU)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnInitMenuPopup(CMenuHandle menuPopup, UINT nIndex, BOOL bSysMenu) -#define MSG_WM_INITMENUPOPUP(func) \ - if (uMsg == WM_INITMENUPOPUP) \ - { \ - SetMsgHandled(TRUE); \ - func((HMENU)wParam, (UINT)LOWORD(lParam), (BOOL)HIWORD(lParam)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMenuSelect(UINT nItemID, UINT nFlags, CMenuHandle menu) -#define MSG_WM_MENUSELECT(func) \ - if (uMsg == WM_MENUSELECT) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HMENU)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnMenuChar(UINT nChar, UINT nFlags, CMenuHandle menu) -#define MSG_WM_MENUCHAR(func) \ - if (uMsg == WM_MENUCHAR) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((TCHAR)LOWORD(wParam), (UINT)HIWORD(wParam), (HMENU)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnNotify(int idCtrl, LPNMHDR pnmh) -#define MSG_WM_NOTIFY(func) \ - if (uMsg == WM_NOTIFY) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((int)wParam, (LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnEnterIdle(UINT nWhy, CWindow wndWho) -#define MSG_WM_ENTERIDLE(func) \ - if (uMsg == WM_ENTERIDLE) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMouseMove(UINT nFlags, CPoint point) -#define MSG_WM_MOUSEMOVE(func) \ - if (uMsg == WM_MOUSEMOVE) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) -#define MSG_WM_MOUSEWHEEL(func) \ - if (uMsg == WM_MOUSEWHEEL) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)LOWORD(wParam), (short)HIWORD(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnLButtonDown(UINT nFlags, CPoint point) -#define MSG_WM_LBUTTONDOWN(func) \ - if (uMsg == WM_LBUTTONDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnLButtonUp(UINT nFlags, CPoint point) -#define MSG_WM_LBUTTONUP(func) \ - if (uMsg == WM_LBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnLButtonDblClk(UINT nFlags, CPoint point) -#define MSG_WM_LBUTTONDBLCLK(func) \ - if (uMsg == WM_LBUTTONDBLCLK) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnRButtonDown(UINT nFlags, CPoint point) -#define MSG_WM_RBUTTONDOWN(func) \ - if (uMsg == WM_RBUTTONDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnRButtonUp(UINT nFlags, CPoint point) -#define MSG_WM_RBUTTONUP(func) \ - if (uMsg == WM_RBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnRButtonDblClk(UINT nFlags, CPoint point) -#define MSG_WM_RBUTTONDBLCLK(func) \ - if (uMsg == WM_RBUTTONDBLCLK) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMButtonDown(UINT nFlags, CPoint point) -#define MSG_WM_MBUTTONDOWN(func) \ - if (uMsg == WM_MBUTTONDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMButtonUp(UINT nFlags, CPoint point) -#define MSG_WM_MBUTTONUP(func) \ - if (uMsg == WM_MBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMButtonDblClk(UINT nFlags, CPoint point) -#define MSG_WM_MBUTTONDBLCLK(func) \ - if (uMsg == WM_MBUTTONDBLCLK) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnParentNotify(UINT message, UINT nChildID, LPARAM lParam) -#define MSG_WM_PARENTNOTIFY(func) \ - if (uMsg == WM_PARENTNOTIFY) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMDIActivate(CWindow wndActivate, CWindow wndDeactivate) -#define MSG_WM_MDIACTIVATE(func) \ - if (uMsg == WM_MDIACTIVATE) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam, (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnRenderFormat(UINT nFormat) -#define MSG_WM_RENDERFORMAT(func) \ - if (uMsg == WM_RENDERFORMAT) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnRenderAllFormats() -#define MSG_WM_RENDERALLFORMATS(func) \ - if (uMsg == WM_RENDERALLFORMATS) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDestroyClipboard() -#define MSG_WM_DESTROYCLIPBOARD(func) \ - if (uMsg == WM_DESTROYCLIPBOARD) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDrawClipboard() -#define MSG_WM_DRAWCLIPBOARD(func) \ - if (uMsg == WM_DRAWCLIPBOARD) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnPaintClipboard(CWindow wndViewer, const LPPAINTSTRUCT lpPaintStruct) -#define MSG_WM_PAINTCLIPBOARD(func) \ - if (uMsg == WM_PAINTCLIPBOARD) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam, (const LPPAINTSTRUCT)::GlobalLock((HGLOBAL)lParam)); \ - ::GlobalUnlock((HGLOBAL)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnVScrollClipboard(CWindow wndViewer, UINT nSBCode, UINT nPos) -#define MSG_WM_VSCROLLCLIPBOARD(func) \ - if (uMsg == WM_VSCROLLCLIPBOARD) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnContextMenu(CWindow wnd, CPoint point) -#define MSG_WM_CONTEXTMENU(func) \ - if (uMsg == WM_CONTEXTMENU) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSizeClipboard(CWindow wndViewer, const LPRECT lpRect) -#define MSG_WM_SIZECLIPBOARD(func) \ - if (uMsg == WM_SIZECLIPBOARD) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam, (const LPRECT)::GlobalLock((HGLOBAL)lParam)); \ - ::GlobalUnlock((HGLOBAL)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnAskCbFormatName(UINT nMaxCount, LPTSTR lpszString) -#define MSG_WM_ASKCBFORMATNAME(func) \ - if (uMsg == WM_ASKCBFORMATNAME) \ - { \ - SetMsgHandled(TRUE); \ - func((DWORD)wParam, (LPTSTR)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnChangeCbChain(CWindow wndRemove, CWindow wndAfter) -#define MSG_WM_CHANGECBCHAIN(func) \ - if (uMsg == WM_CHANGECBCHAIN) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam, (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnHScrollClipboard(CWindow wndViewer, UINT nSBCode, UINT nPos) -#define MSG_WM_HSCROLLCLIPBOARD(func) \ - if (uMsg == WM_HSCROLLCLIPBOARD) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnQueryNewPalette() -#define MSG_WM_QUERYNEWPALETTE(func) \ - if (uMsg == WM_QUERYNEWPALETTE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func(); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnPaletteChanged(CWindow wndFocus) -#define MSG_WM_PALETTECHANGED(func) \ - if (uMsg == WM_PALETTECHANGED) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnPaletteIsChanging(CWindow wndPalChg) -#define MSG_WM_PALETTEISCHANGING(func) \ - if (uMsg == WM_PALETTEISCHANGING) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDropFiles(HDROP hDropInfo) -#define MSG_WM_DROPFILES(func) \ - if (uMsg == WM_DROPFILES) \ - { \ - SetMsgHandled(TRUE); \ - func((HDROP)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnWindowPosChanging(LPWINDOWPOS lpWndPos) -#define MSG_WM_WINDOWPOSCHANGING(func) \ - if (uMsg == WM_WINDOWPOSCHANGING) \ - { \ - SetMsgHandled(TRUE); \ - func((LPWINDOWPOS)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnWindowPosChanged(LPWINDOWPOS lpWndPos) -#define MSG_WM_WINDOWPOSCHANGED(func) \ - if (uMsg == WM_WINDOWPOSCHANGED) \ - { \ - SetMsgHandled(TRUE); \ - func((LPWINDOWPOS)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnExitMenuLoop(BOOL fIsTrackPopupMenu) -#define MSG_WM_EXITMENULOOP(func) \ - if (uMsg == WM_EXITMENULOOP) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnEnterMenuLoop(BOOL fIsTrackPopupMenu) -#define MSG_WM_ENTERMENULOOP(func) \ - if (uMsg == WM_ENTERMENULOOP) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnStyleChanged(int nStyleType, LPSTYLESTRUCT lpStyleStruct) -#define MSG_WM_STYLECHANGED(func) \ - if (uMsg == WM_STYLECHANGED) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPSTYLESTRUCT)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnStyleChanging(int nStyleType, LPSTYLESTRUCT lpStyleStruct) -#define MSG_WM_STYLECHANGING(func) \ - if (uMsg == WM_STYLECHANGING) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPSTYLESTRUCT)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSizing(UINT fwSide, LPRECT pRect) -#define MSG_WM_SIZING(func) \ - if (uMsg == WM_SIZING) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPRECT)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMoving(UINT fwSide, LPRECT pRect) -#define MSG_WM_MOVING(func) \ - if (uMsg == WM_MOVING) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPRECT)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCaptureChanged(CWindow wnd) -#define MSG_WM_CAPTURECHANGED(func) \ - if (uMsg == WM_CAPTURECHANGED) \ - { \ - SetMsgHandled(TRUE); \ - func((HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnDeviceChange(UINT nEventType, DWORD dwData) -#define MSG_WM_DEVICECHANGE(func) \ - if (uMsg == WM_DEVICECHANGE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)wParam, (DWORD)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCommand(UINT uNotifyCode, int nID, CWindow wndCtl) -#define MSG_WM_COMMAND(func) \ - if (uMsg == WM_COMMAND) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDisplayChange(UINT uBitsPerPixel, CSize sizeScreen) -#define MSG_WM_DISPLAYCHANGE(func) \ - if (uMsg == WM_DISPLAYCHANGE) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, _WTYPES_NS::CSize(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnEnterSizeMove() -#define MSG_WM_ENTERSIZEMOVE(func) \ - if (uMsg == WM_ENTERSIZEMOVE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnExitSizeMove() -#define MSG_WM_EXITSIZEMOVE(func) \ - if (uMsg == WM_EXITSIZEMOVE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HFONT OnGetFont() -#define MSG_WM_GETFONT(func) \ - if (uMsg == WM_GETFONT) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func(); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnGetHotKey() -#define MSG_WM_GETHOTKEY(func) \ - if (uMsg == WM_GETHOTKEY) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func(); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HICON OnGetIcon() -#define MSG_WM_GETICON(func) \ - if (uMsg == WM_GETICON) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)wParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnGetText(int cchTextMax, LPTSTR lpszText) -#define MSG_WM_GETTEXT(func) \ - if (uMsg == WM_GETTEXT) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((int)wParam, (LPTSTR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnGetTextLength() -#define MSG_WM_GETTEXTLENGTH(func) \ - if (uMsg == WM_GETTEXTLENGTH) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func(); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnHelp(LPHELPINFO lpHelpInfo) -#define MSG_WM_HELP(func) \ - if (uMsg == WM_HELP) \ - { \ - SetMsgHandled(TRUE); \ - func((LPHELPINFO)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnHotKey(int nHotKeyID, UINT uModifiers, UINT uVirtKey) -#define MSG_WM_HOTKEY(func) \ - if (uMsg == WM_HOTKEY) \ - { \ - SetMsgHandled(TRUE); \ - func((int)wParam, (UINT)LOWORD(lParam), (UINT)HIWORD(lParam)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnInputLangChange(DWORD dwCharSet, HKL hKbdLayout) -#define MSG_WM_INPUTLANGCHANGE(func) \ - if (uMsg == WM_INPUTLANGCHANGE) \ - { \ - SetMsgHandled(TRUE); \ - func((DWORD)wParam, (HKL)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnInputLangChangeRequest(BOOL bSysCharSet, HKL hKbdLayout) -#define MSG_WM_INPUTLANGCHANGEREQUEST(func) \ - if (uMsg == WM_INPUTLANGCHANGEREQUEST) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)wParam, (HKL)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNextDlgCtl(BOOL bHandle, WPARAM wCtlFocus) -#define MSG_WM_NEXTDLGCTL(func) \ - if (uMsg == WM_NEXTDLGCTL) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)LOWORD(lParam), wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNextMenu(int nVirtKey, LPMDINEXTMENU lpMdiNextMenu) -#define MSG_WM_NEXTMENU(func) \ - if (uMsg == WM_NEXTMENU) \ - { \ - SetMsgHandled(TRUE); \ - func((int)wParam, (LPMDINEXTMENU)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnNotifyFormat(CWindow wndFrom, int nCommand) -#define MSG_WM_NOTIFYFORMAT(func) \ - if (uMsg == WM_NOTIFYFORMAT) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HWND)wParam, (int)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// BOOL OnPowerBroadcast(DWORD dwPowerEvent, DWORD dwData) -#define MSG_WM_POWERBROADCAST(func) \ - if (uMsg == WM_POWERBROADCAST) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((DWORD)wParam, (DWORD)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnPrint(CDCHandle dc, UINT uFlags) -#define MSG_WM_PRINT(func) \ - if (uMsg == WM_PRINT) \ - { \ - SetMsgHandled(TRUE); \ - func((HDC)wParam, (UINT)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnPrintClient(CDCHandle dc, UINT uFlags) -#define MSG_WM_PRINTCLIENT(func) \ - if (uMsg == WM_PRINTCLIENT) \ - { \ - SetMsgHandled(TRUE); \ - func((HDC)wParam, (UINT)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnRasDialEvent(RASCONNSTATE rasconnstate, DWORD dwError) -#define MSG_WM_RASDIALEVENT(func) \ - if (uMsg == WM_RASDIALEVENT) \ - { \ - SetMsgHandled(TRUE); \ - func((RASCONNSTATE)wParam, (DWORD)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSetFont(CFontHandle font, BOOL bRedraw) -#define MSG_WM_SETFONT(func) \ - if (uMsg == WM_SETFONT) \ - { \ - SetMsgHandled(TRUE); \ - func((HFONT)wParam, (BOOL)LOWORD(lParam)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnSetHotKey(int nVirtKey, UINT uFlags) -#define MSG_WM_SETHOTKEY(func) \ - if (uMsg == WM_SETHOTKEY) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((int)LOBYTE(LOWORD(wParam)), (UINT)HIBYTE(LOWORD(wParam))); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HICON OnSetIcon(UINT uType, HICON hIcon) -#define MSG_WM_SETICON(func) \ - if (uMsg == WM_SETICON) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)wParam, (HICON)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnSetRedraw(BOOL bRedraw) -#define MSG_WM_SETREDRAW(func) \ - if (uMsg == WM_SETREDRAW) \ - { \ - SetMsgHandled(TRUE); \ - func((BOOL)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnSetText(LPCTSTR lpstrText) -#define MSG_WM_SETTEXT(func) \ - if (uMsg == WM_SETTEXT) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((LPCTSTR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnUserChanged() -#define MSG_WM_USERCHANGED(func) \ - if (uMsg == WM_USERCHANGED) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -/////////////////////////////////////////////////////////////////////////////// -// New NT4 & NT5 messages - -#if(_WIN32_WINNT >= 0x0400) - -// void OnMouseHover(WPARAM wParam, CPoint ptPos) -#define MSG_WM_MOUSEHOVER(func) \ - if (uMsg == WM_MOUSEHOVER) \ - { \ - SetMsgHandled(TRUE); \ - func(wParam, _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMouseLeave() -#define MSG_WM_MOUSELEAVE(func) \ - if (uMsg == WM_MOUSELEAVE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -#endif /* _WIN32_WINNT >= 0x0400 */ - -#if(WINVER >= 0x0500) - -// void OnMenuRButtonUp(WPARAM wParam, CMenuHandle menu) -#define MSG_WM_MENURBUTTONUP(func) \ - if (uMsg == WM_MENURBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func(wParam, (HMENU)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnMenuDrag(WPARAM wParam, CMenuHandle menu) -#define MSG_WM_MENUDRAG(func) \ - if (uMsg == WM_MENUDRAG) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func(wParam, (HMENU)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnMenuGetObject(PMENUGETOBJECTINFO info) -#define MSG_WM_MENUGETOBJECT(func) \ - if (uMsg == WM_MENUGETOBJECT) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((PMENUGETOBJECTINFO)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnUnInitMenuPopup(UINT nID, CMenuHandle menu) -#define MSG_WM_UNINITMENUPOPUP(func) \ - if (uMsg == WM_UNINITMENUPOPUP) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(lParam), (HMENU)wParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnMenuCommand(WPARAM nIndex, CMenuHandle menu) -#define MSG_WM_MENUCOMMAND(func) \ - if (uMsg == WM_MENUCOMMAND) \ - { \ - SetMsgHandled(TRUE); \ - func(wParam, (HMENU)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -#endif /* WINVER >= 0x0500 */ - -#if(_WIN32_WINNT >= 0x0500) - -// BOOL OnAppCommand(CWindow wndFocus, short cmd, WORD uDevice, int dwKeys) -#define MSG_WM_APPCOMMAND(func) \ - if (uMsg == WM_APPCOMMAND) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HWND)wParam, GET_APPCOMMAND_LPARAM(lParam), GET_DEVICE_LPARAM(lParam), GET_KEYSTATE_LPARAM(lParam)); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNCXButtonDown(int fwButton, short nHittest, CPoint ptPos) -#define MSG_WM_NCXBUTTONDOWN(func) \ - if (uMsg == WM_NCXBUTTONDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNCXButtonUp(int fwButton, short nHittest, CPoint ptPos) -#define MSG_WM_NCXBUTTONUP(func) \ - if (uMsg == WM_NCXBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnNCXButtonDblClk(int fwButton, short nHittest, CPoint ptPos) -#define MSG_WM_NCXBUTTONDBLCLK(func) \ - if (uMsg == WM_NCXBUTTONDBLCLK) \ - { \ - SetMsgHandled(TRUE); \ - func(GET_XBUTTON_WPARAM(wParam), GET_NCHITTEST_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnXButtonDown(int fwButton, int dwKeys, CPoint ptPos) -#define MSG_WM_XBUTTONDOWN(func) \ - if (uMsg == WM_XBUTTONDOWN) \ - { \ - SetMsgHandled(TRUE); \ - func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnXButtonUp(int fwButton, int dwKeys, CPoint ptPos) -#define MSG_WM_XBUTTONUP(func) \ - if (uMsg == WM_XBUTTONUP) \ - { \ - SetMsgHandled(TRUE); \ - func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnXButtonDblClk(int fwButton, int dwKeys, CPoint ptPos) -#define MSG_WM_XBUTTONDBLCLK(func) \ - if (uMsg == WM_XBUTTONDBLCLK) \ - { \ - SetMsgHandled(TRUE); \ - func(GET_XBUTTON_WPARAM(wParam), GET_KEYSTATE_WPARAM(wParam), _WTYPES_NS::CPoint(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnChangeUIState(WORD nAction, WORD nState) -#define MSG_WM_CHANGEUISTATE(func) \ - if (uMsg == WM_CHANGEUISTATE) \ - { \ - SetMsgHandled(TRUE); \ - func(LOWORD(wParam), HIWORD(wParam)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnUpdateUIState(WORD nAction, WORD nState) -#define MSG_WM_UPDATEUISTATE(func) \ - if (uMsg == WM_UPDATEUISTATE) \ - { \ - SetMsgHandled(TRUE); \ - func(LOWORD(wParam), HIWORD(wParam)); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnQueryUIState() -#define MSG_WM_QUERYUISTATE(func) \ - if (uMsg == WM_QUERYUISTATE) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func(); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -#endif // (_WIN32_WINNT >= 0x0500) - -#if(_WIN32_WINNT >= 0x0501) - -// void OnInput(WPARAM RawInputCode, HRAWINPUT hRawInput) -#define MSG_WM_INPUT(func) \ - if (uMsg == WM_INPUT) \ - { \ - SetMsgHandled(TRUE); \ - func(GET_RAWINPUT_CODE_WPARAM(wParam), (HRAWINPUT)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnUniChar(TCHAR nChar, UINT nRepCnt, UINT nFlags) -#define MSG_WM_UNICHAR(func) \ - if (uMsg == WM_UNICHAR) \ - { \ - SetMsgHandled(TRUE); \ - func((TCHAR)wParam, (UINT)lParam & 0xFFFF, (UINT)((lParam & 0xFFFF0000) >> 16)); \ - if(IsMsgHandled()) \ - { \ - lResult = (wParam == UNICODE_NOCHAR) ? TRUE : FALSE; \ - return TRUE; \ - } \ - } - -// void OnWTSSessionChange(WPARAM nStatusCode, PWTSSESSION_NOTIFICATION nSessionID) -#define MSG_WM_WTSSESSION_CHANGE(func) \ - if (uMsg == WM_WTSSESSION_CHANGE) \ - { \ - SetMsgHandled(TRUE); \ - func(wParam, (PWTSSESSION_NOTIFICATION)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// OnThemeChanged() -#define MSG_WM_THEMECHANGED(func) \ - if (uMsg == WM_THEMECHANGED) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -#endif /* _WIN32_WINNT >= 0x0501 */ - -/////////////////////////////////////////////////////////////////////////////// -// ATL defined messages - -// BOOL OnForwardMsg(LPMSG Msg, DWORD nUserData) -#define MSG_WM_FORWARDMSG(func) \ - if (uMsg == WM_FORWARDMSG) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((LPMSG)lParam, (DWORD)wParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -/////////////////////////////////////////////////////////////////////////////// -// Dialog specific messages - -// LRESULT OnDMGetDefID() -#define MSG_DM_GETDEFID(func) \ - if (uMsg == DM_GETDEFID) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func(); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDMSetDefID(UINT DefID) -#define MSG_DM_SETDEFID(func) \ - if (uMsg == DM_SETDEFID) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnDMReposition() -#define MSG_DM_REPOSITION(func) \ - if (uMsg == DM_REPOSITION) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -/////////////////////////////////////////////////////////////////////////////// -// Reflected messages - -// void OnReflectedCommand(UINT uNotifyCode, int nID, CWindow wndCtl) -#define MSG_OCM_COMMAND(func) \ - if (uMsg == OCM_COMMAND) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedNotify(int idCtrl, LPNMHDR pnmh) -#define MSG_OCM_NOTIFY(func) \ - if (uMsg == OCM_NOTIFY) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((int)wParam, (LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnReflectedParentNotify(UINT message, UINT nChildID, LPARAM lParam) -#define MSG_OCM_PARENTNOTIFY(func) \ - if (uMsg == OCM_PARENTNOTIFY) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnReflectedDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) -#define MSG_OCM_DRAWITEM(func) \ - if (uMsg == OCM_DRAWITEM) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPDRAWITEMSTRUCT)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnReflectedMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct) -#define MSG_OCM_MEASUREITEM(func) \ - if (uMsg == OCM_MEASUREITEM) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPMEASUREITEMSTRUCT)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnReflectedCompareItem(int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct) -#define MSG_OCM_COMPAREITEM(func) \ - if (uMsg == OCM_COMPAREITEM) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)wParam, (LPCOMPAREITEMSTRUCT)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnReflectedDeleteItem(int nIDCtl, LPDELETEITEMSTRUCT lpDeleteItemStruct) -#define MSG_OCM_DELETEITEM(func) \ - if (uMsg == OCM_DELETEITEM) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)wParam, (LPDELETEITEMSTRUCT)lParam); \ - lResult = TRUE; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// int OnReflectedVKeyToItem(UINT nKey, UINT nIndex, CListBox listBox) -#define MSG_OCM_VKEYTOITEM(func) \ - if (uMsg == OCM_VKEYTOITEM) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -//int OnReflectedCharToItem(UINT nChar, UINT nIndex, CListBox listBox) -#define MSG_OCM_CHARTOITEM(func) \ - if (uMsg == OCM_CHARTOITEM) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnReflectedHScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) -#define MSG_OCM_HSCROLL(func) \ - if (uMsg == OCM_HSCROLL) \ - { \ - SetMsgHandled(TRUE); \ - func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnReflectedVScroll(UINT nSBCode, UINT nPos, CScrollBar pScrollBar) -#define MSG_OCM_VSCROLL(func) \ - if (uMsg == OCM_VSCROLL) \ - { \ - SetMsgHandled(TRUE); \ - func((int)LOWORD(wParam), (short)HIWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnReflectedCtlColorEdit(CDCHandle dc, CEdit edit) -#define MSG_OCM_CTLCOLOREDIT(func) \ - if (uMsg == OCM_CTLCOLOREDIT) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnReflectedCtlColorListBox(CDCHandle dc, CListBox listBox) -#define MSG_OCM_CTLCOLORLISTBOX(func) \ - if (uMsg == OCM_CTLCOLORLISTBOX) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnReflectedCtlColorBtn(CDCHandle dc, CButton button) -#define MSG_OCM_CTLCOLORBTN(func) \ - if (uMsg == OCM_CTLCOLORBTN) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnReflectedCtlColorDlg(CDCHandle dc, CWindow wnd) -#define MSG_OCM_CTLCOLORDLG(func) \ - if (uMsg == OCM_CTLCOLORDLG) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnReflectedCtlColorScrollBar(CDCHandle dc, CScrollBar scrollBar) -#define MSG_OCM_CTLCOLORSCROLLBAR(func) \ - if (uMsg == OCM_CTLCOLORSCROLLBAR) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// HBRUSH OnReflectedCtlColorStatic(CDCHandle dc, CStatic wndStatic) -#define MSG_OCM_CTLCOLORSTATIC(func) \ - if (uMsg == OCM_CTLCOLORSTATIC) \ - { \ - SetMsgHandled(TRUE); \ - lResult = (LRESULT)func((HDC)wParam, (HWND)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -/////////////////////////////////////////////////////////////////////////////// -// Edit specific messages - -// void OnClear() -#define MSG_WM_CLEAR(func) \ - if (uMsg == WM_CLEAR) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCopy() -#define MSG_WM_COPY(func) \ - if (uMsg == WM_COPY) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCut() -#define MSG_WM_CUT(func) \ - if (uMsg == WM_CUT) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnPaste() -#define MSG_WM_PASTE(func) \ - if (uMsg == WM_PASTE) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnUndo() -#define MSG_WM_UNDO(func) \ - if (uMsg == WM_UNDO) \ - { \ - SetMsgHandled(TRUE); \ - func(); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -/////////////////////////////////////////////////////////////////////////////// -// Generic message handlers - -// LRESULT OnMessageHandlerEX(UINT uMsg, WPARAM wParam, LPARAM lParam) -#define MESSAGE_HANDLER_EX(msg, func) \ - if(uMsg == msg) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func(uMsg, wParam, lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnMessageRangeHandlerEX(UINT uMsg, WPARAM wParam, LPARAM lParam) -#define MESSAGE_RANGE_HANDLER_EX(msgFirst, msgLast, func) \ - if(uMsg >= msgFirst && uMsg <= msgLast) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func(uMsg, wParam, lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -/////////////////////////////////////////////////////////////////////////////// -// Commands and notifications - -// void OnCommandHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define COMMAND_HANDLER_EX(id, code, func) \ - if (uMsg == WM_COMMAND && code == HIWORD(wParam) && id == LOWORD(wParam)) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define COMMAND_ID_HANDLER_EX(id, func) \ - if (uMsg == WM_COMMAND && id == LOWORD(wParam)) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCommandCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define COMMAND_CODE_HANDLER_EX(code, func) \ - if (uMsg == WM_COMMAND && code == HIWORD(wParam)) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnNotifyHandlerEX(LPNMHDR pnmh) -#define NOTIFY_HANDLER_EX(id, cd, func) \ - if (uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnNotifyIDHandlerEX(LPNMHDR pnmh) -#define NOTIFY_ID_HANDLER_EX(id, func) \ - if (uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnNotifyCodeHandlerEX(LPNMHDR pnmh) -#define NOTIFY_CODE_HANDLER_EX(cd, func) \ - if (uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCommandRangeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) \ - if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnCommandRangeCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) \ - if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnNotifyRangeHandlerEX(LPNMHDR pnmh) -#define NOTIFY_RANGE_HANDLER_EX(idFirst, idLast, func) \ - if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnNotifyRangeCodeHandlerEX(LPNMHDR pnmh) -#define NOTIFY_RANGE_CODE_HANDLER_EX(idFirst, idLast, cd, func) \ - if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedCommandHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define REFLECTED_COMMAND_HANDLER_EX(id, code, func) \ - if (uMsg == OCM_COMMAND && code == HIWORD(wParam) && id == LOWORD(wParam)) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedCommandIDHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define REFLECTED_COMMAND_ID_HANDLER_EX(id, func) \ - if (uMsg == OCM_COMMAND && id == LOWORD(wParam)) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedCommandCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define REFLECTED_COMMAND_CODE_HANDLER_EX(code, func) \ - if (uMsg == OCM_COMMAND && code == HIWORD(wParam)) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedNotifyHandlerEX(LPNMHDR pnmh) -#define REFLECTED_NOTIFY_HANDLER_EX(id, cd, func) \ - if (uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && id == ((LPNMHDR)lParam)->idFrom) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedNotifyIDHandlerEX(LPNMHDR pnmh) -#define REFLECTED_NOTIFY_ID_HANDLER_EX(id, func) \ - if (uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedNotifyCodeHandlerEX(LPNMHDR pnmh) -#define REFLECTED_NOTIFY_CODE_HANDLER_EX(cd, func) \ - if (uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnReflectedCommandRangeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define REFLECTED_COMMAND_RANGE_HANDLER_EX(idFirst, idLast, func) \ - if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// void OnReflectedCommandRangeCodeHandlerEX(UINT uNotifyCode, int nID, CWindow wndCtl) -#define REFLECTED_COMMAND_RANGE_CODE_HANDLER_EX(idFirst, idLast, code, func) \ - if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ - { \ - SetMsgHandled(TRUE); \ - func((UINT)HIWORD(wParam), (int)LOWORD(wParam), (HWND)lParam); \ - lResult = 0; \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedNotifyRangeHandlerEX(LPNMHDR pnmh) -#define REFLECTED_NOTIFY_RANGE_HANDLER_EX(idFirst, idLast, func) \ - if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -// LRESULT OnReflectedNotifyRangeCodeHandlerEX(LPNMHDR pnmh) -#define REFLECTED_NOTIFY_RANGE_CODE_HANDLER_EX(idFirst, idLast, cd, func) \ - if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ - { \ - SetMsgHandled(TRUE); \ - lResult = func((LPNMHDR)lParam); \ - if(IsMsgHandled()) \ - return TRUE; \ - } - -#endif // __ATLCRACK_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlctrls.h b/plugins/SmartAutoReplier/wtl/atlctrls.h deleted file mode 100644 index 00df403181..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlctrls.h +++ /dev/null @@ -1,10041 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLCTRLS_H__ -#define __ATLCTRLS_H__ - -#pragma once - -#include - -#ifndef __ATLAPP_H__ - #error atlctrls.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atlctrls.h requires atlwin.h to be included first -#endif - -#ifndef _WIN32_WCE - #include - #include -#elif defined(WIN32_PLATFORM_WFSP) && !defined(_WINUSERM_H_) - #include -#endif // !_WIN32_WCE - -// protect template members from windowsx.h macros -#ifdef _INC_WINDOWSX - #undef GetNextSibling - #undef GetPrevSibling -#endif // _INC_WINDOWSX - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CStaticT - CStatic -// CButtonT - CButton -// CListBoxT - CListBox -// CComboBoxT - CComboBox -// CEditT - CEdit -// CEditCommands -// CScrollBarT - CScrollBar -// -// CImageList -// CListViewCtrlT - CListViewCtrl -// CTreeViewCtrlT - CTreeViewCtrl -// CTreeItemT - CTreeItem -// CTreeViewCtrlExT - CTreeViewCtrlEx -// CHeaderCtrlT - CHeaderCtrl -// CToolBarCtrlT - CToolBarCtrl -// CStatusBarCtrlT - CStatusBarCtrl -// CTabCtrlT - CTabCtrl -// CToolInfo -// CToolTipCtrlT - CToolTipCtrl -// CTrackBarCtrlT - CTrackBarCtrl -// CUpDownCtrlT - CUpDownCtrl -// CProgressBarCtrlT - CProgressBarCtrl -// CHotKeyCtrlT - CHotKeyCtrl -// CAnimateCtrlT - CAnimateCtrl -// CRichEditCtrlT - CRichEditCtrl -// CRichEditCommands -// CDragListBoxT - CDragListBox -// CDragListNotifyImpl -// CReBarCtrlT - CReBarCtrl -// CComboBoxExT - CComboBoxEx -// CDateTimePickerCtrlT - CDateTimePickerCtrl -// CMonthCalendarCtrlT - CMonthCalendarCtrl -// CFlatScrollBarImpl -// CFlatScrollBarT - CFlatScrollBar -// CIPAddressCtrlT - CIPAddressCtrl -// CPagerCtrlT - CPagerCtrl -// CLinkCtrlT - CLinkCtrl -// -// CCustomDraw -// -// CCECommandBarCtrlT - CCECommandBarCtrl -// CCECommandBandsCtrlT - CCECommandBandsCtrl - - -namespace WTL -{ - -// These are wrapper classes for Windows standard and common controls. -// To implement a window based on a control, use following: -// Example: Implementing a window based on a list box -// -// class CMyListBox : CWindowImpl -// { -// public: -// BEGIN_MSG_MAP(CMyListBox) -// // put your message handler entries here -// END_MSG_MAP() -// }; - - - -// --- Standard Windows controls --- - -/////////////////////////////////////////////////////////////////////////////// -// CStatic - client side for a Windows STATIC control - -template -class CStaticT : public TBase -{ -public: -// Constructors - CStaticT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CStaticT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return _T("STATIC"); - } - -#ifndef _WIN32_WCE - HICON GetIcon() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HICON)::SendMessage(m_hWnd, STM_GETICON, 0, 0L); - } - - HICON SetIcon(HICON hIcon) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HICON)::SendMessage(m_hWnd, STM_SETICON, (WPARAM)hIcon, 0L); - } - - HENHMETAFILE GetEnhMetaFile() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HENHMETAFILE)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ENHMETAFILE, 0L); - } - - HENHMETAFILE SetEnhMetaFile(HENHMETAFILE hMetaFile) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HENHMETAFILE)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ENHMETAFILE, (LPARAM)hMetaFile); - } -#else // CE specific - HICON GetIcon() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HICON)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_ICON, 0L); - } - - HICON SetIcon(HICON hIcon) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HICON)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); - } -#endif // _WIN32_WCE - - CBitmapHandle GetBitmap() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_BITMAP, 0L)); - } - - CBitmapHandle SetBitmap(HBITMAP hBitmap) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap)); - } - - HCURSOR GetCursor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HCURSOR)::SendMessage(m_hWnd, STM_GETIMAGE, IMAGE_CURSOR, 0L); - } - - HCURSOR SetCursor(HCURSOR hCursor) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HCURSOR)::SendMessage(m_hWnd, STM_SETIMAGE, IMAGE_CURSOR, (LPARAM)hCursor); - } -}; - -typedef CStaticT CStatic; - - -/////////////////////////////////////////////////////////////////////////////// -// CButton - client side for a Windows BUTTON control - -template -class CButtonT : public TBase -{ -public: -// Constructors - CButtonT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CButtonT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return _T("BUTTON"); - } - - UINT GetState() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, BM_GETSTATE, 0, 0L); - } - - void SetState(BOOL bHighlight) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, BM_SETSTATE, bHighlight, 0L); - } - - int GetCheck() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, BM_GETCHECK, 0, 0L); - } - - void SetCheck(int nCheck) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, BM_SETCHECK, nCheck, 0L); - } - - UINT GetButtonStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::GetWindowLong(m_hWnd, GWL_STYLE) & 0xFFFF; - } - - void SetButtonStyle(UINT nStyle, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, BM_SETSTYLE, nStyle, (LPARAM)bRedraw); - } - -#ifndef _WIN32_WCE - HICON GetIcon() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HICON)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_ICON, 0L); - } - - HICON SetIcon(HICON hIcon) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HICON)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_ICON, (LPARAM)hIcon); - } - - CBitmapHandle GetBitmap() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_GETIMAGE, IMAGE_BITMAP, 0L)); - } - - CBitmapHandle SetBitmap(HBITMAP hBitmap) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CBitmapHandle((HBITMAP)::SendMessage(m_hWnd, BM_SETIMAGE, IMAGE_BITMAP, (LPARAM)hBitmap)); - } -#endif // !_WIN32_WCE - -#if (_WIN32_WINNT >= 0x0501) - BOOL GetIdealSize(LPSIZE lpSize) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, BCM_GETIDEALSIZE, 0, (LPARAM)lpSize); - } - - BOOL GetImageList(PBUTTON_IMAGELIST pButtonImagelist) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, BCM_GETIMAGELIST, 0, (LPARAM)pButtonImagelist); - } - - BOOL SetImageList(PBUTTON_IMAGELIST pButtonImagelist) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, BCM_SETIMAGELIST, 0, (LPARAM)pButtonImagelist); - } - - BOOL GetTextMargin(LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, BCM_GETTEXTMARGIN, 0, (LPARAM)lpRect); - } - - BOOL SetTextMargin(LPRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, BCM_SETTEXTMARGIN, 0, (LPARAM)lpRect); - } -#endif // (_WIN32_WINNT >= 0x0501) - -#if (WINVER >= 0x0600) - void SetDontClick(BOOL bDontClick) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, BM_SETDONTCLICK, (WPARAM)bDontClick, 0L); - } -#endif // (WINVER >= 0x0600) - -#if (_WIN32_WINNT >= 0x0600) - BOOL SetDropDownState(BOOL bDropDown) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); - return (BOOL)::SendMessage(m_hWnd, BCM_SETDROPDOWNSTATE, (WPARAM)bDropDown, 0L); - } - - BOOL GetSplitInfo(PBUTTON_SPLITINFO pSplitInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); - return (BOOL)::SendMessage(m_hWnd, BCM_GETSPLITINFO, 0, (LPARAM)pSplitInfo); - } - - BOOL SetSplitInfo(PBUTTON_SPLITINFO pSplitInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (BS_SPLITBUTTON | BS_DEFSPLITBUTTON)) != 0); - return (BOOL)::SendMessage(m_hWnd, BCM_SETSPLITINFO, 0, (LPARAM)pSplitInfo); - } - - int GetNoteLength() const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); - return (int)::SendMessage(m_hWnd, BCM_GETNOTELENGTH, 0, 0L); - } - - BOOL GetNote(LPWSTR lpstrNoteText, int cchNoteText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); - return (BOOL)::SendMessage(m_hWnd, BCM_GETNOTE, cchNoteText, (LPARAM)lpstrNoteText); - } - - BOOL SetNote(LPCWSTR lpstrNoteText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (BS_COMMANDLINK | BS_DEFCOMMANDLINK)) != 0); - return (BOOL)::SendMessage(m_hWnd, BCM_SETNOTE, 0, (LPARAM)lpstrNoteText); - } - - LRESULT SetElevationRequiredState(BOOL bSet) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::SendMessage(m_hWnd, BCM_SETSHIELD, 0, (LPARAM)bSet); - } -#endif // (_WIN32_WINNT >= 0x0600) - -// Operations - void Click() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, BM_CLICK, 0, 0L); - } -}; - -typedef CButtonT CButton; - - -/////////////////////////////////////////////////////////////////////////////// -// CListBox - client side for a Windows LISTBOX control - -template -class CListBoxT : public TBase -{ -public: -// Constructors - CListBoxT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CListBoxT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return _T("LISTBOX"); - } - - // for entire listbox - int GetCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETCOUNT, 0, 0L); - } - -#ifndef _WIN32_WCE - int SetCount(int cItems) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(((GetStyle() & LBS_NODATA) != 0) && ((GetStyle() & LBS_HASSTRINGS) == 0)); - return (int)::SendMessage(m_hWnd, LB_SETCOUNT, cItems, 0L); - } -#endif // !_WIN32_WCE - - int GetHorizontalExtent() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETHORIZONTALEXTENT, 0, 0L); - } - - void SetHorizontalExtent(int cxExtent) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LB_SETHORIZONTALEXTENT, cxExtent, 0L); - } - - int GetTopIndex() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETTOPINDEX, 0, 0L); - } - - int SetTopIndex(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_SETTOPINDEX, nIndex, 0L); - } - - LCID GetLocale() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LCID)::SendMessage(m_hWnd, LB_GETLOCALE, 0, 0L); - } - - LCID SetLocale(LCID nNewLocale) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LCID)::SendMessage(m_hWnd, LB_SETLOCALE, (WPARAM)nNewLocale, 0L); - } - -#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) - DWORD GetListBoxInfo() const - { - ATLASSERT(::IsWindow(m_hWnd)); -#if (_WIN32_WINNT >= 0x0501) - return (DWORD)::SendMessage(m_hWnd, LB_GETLISTBOXINFO, 0, 0L); -#else // !(_WIN32_WINNT >= 0x0501) - return ::GetListBoxInfo(m_hWnd); -#endif // !(_WIN32_WINNT >= 0x0501) - } -#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) - - // for single-selection listboxes - int GetCurSel() const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); - return (int)::SendMessage(m_hWnd, LB_GETCURSEL, 0, 0L); - } - - int SetCurSel(int nSelect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); - return (int)::SendMessage(m_hWnd, LB_SETCURSEL, nSelect, 0L); - } - - // for multiple-selection listboxes - int GetSel(int nIndex) const // also works for single-selection - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETSEL, nIndex, 0L); - } - - int SetSel(int nIndex, BOOL bSelect = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); - return (int)::SendMessage(m_hWnd, LB_SETSEL, bSelect, nIndex); - } - - int GetSelCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); - return (int)::SendMessage(m_hWnd, LB_GETSELCOUNT, 0, 0L); - } - - int GetSelItems(int nMaxItems, LPINT rgIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); - return (int)::SendMessage(m_hWnd, LB_GETSELITEMS, nMaxItems, (LPARAM)rgIndex); - } - - int GetAnchorIndex() const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); - return (int)::SendMessage(m_hWnd, LB_GETANCHORINDEX, 0, 0L); - } - - void SetAnchorIndex(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); - ::SendMessage(m_hWnd, LB_SETANCHORINDEX, nIndex, 0L); - } - - int GetCaretIndex() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETCARETINDEX, 0, 0); - } - - int SetCaretIndex(int nIndex, BOOL bScroll = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_SETCARETINDEX, nIndex, MAKELONG(bScroll, 0)); - } - - // for listbox items - DWORD_PTR GetItemData(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD_PTR)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L); - } - - int SetItemData(int nIndex, DWORD_PTR dwItemData) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_SETITEMDATA, nIndex, (LPARAM)dwItemData); - } - - void* GetItemDataPtr(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (void*)::SendMessage(m_hWnd, LB_GETITEMDATA, nIndex, 0L); - } - - int SetItemDataPtr(int nIndex, void* pData) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItemData(nIndex, (DWORD_PTR)pData); - } - - int GetItemRect(int nIndex, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETITEMRECT, nIndex, (LPARAM)lpRect); - } - - int GetText(int nIndex, LPTSTR lpszBuffer) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETTEXT, nIndex, (LPARAM)lpszBuffer); - } - -#ifndef _ATL_NO_COM -#ifdef _OLEAUTO_H_ - BOOL GetTextBSTR(int nIndex, BSTR& bstrText) const - { - USES_CONVERSION; - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(bstrText == NULL); - - int nLen = GetTextLen(nIndex); - if(nLen == LB_ERR) - return FALSE; - - CTempBuffer buff; - LPTSTR lpstrText = buff.Allocate(nLen + 1); - if(lpstrText == NULL) - return FALSE; - - if(GetText(nIndex, lpstrText) == LB_ERR) - return FALSE; - - bstrText = ::SysAllocString(T2OLE(lpstrText)); - return (bstrText != NULL) ? TRUE : FALSE; - } -#endif // _OLEAUTO_H_ -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - int GetText(int nIndex, _CSTRING_NS::CString& strText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int cchLen = GetTextLen(nIndex); - if(cchLen == LB_ERR) - return LB_ERR; - int nRet = LB_ERR; - LPTSTR lpstr = strText.GetBufferSetLength(cchLen); - if(lpstr != NULL) - { - nRet = GetText(nIndex, lpstr); - strText.ReleaseBuffer(); - } - return nRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - int GetTextLen(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETTEXTLEN, nIndex, 0L); - } - - int GetItemHeight(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_GETITEMHEIGHT, nIndex, 0L); - } - - int SetItemHeight(int nIndex, UINT cyItemHeight) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0)); - } - - // Settable only attributes - void SetColumnWidth(int cxWidth) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LB_SETCOLUMNWIDTH, cxWidth, 0L); - } - - BOOL SetTabStops(int nTabStops, LPINT rgTabStops) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); - return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); - } - - BOOL SetTabStops() - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); - return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 0, 0L); - } - - BOOL SetTabStops(const int& cxEachStop) // takes an 'int' - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & LBS_USETABSTOPS) != 0); - return (BOOL)::SendMessage(m_hWnd, LB_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); - } - -// Operations - int InitStorage(int nItems, UINT nBytes) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_INITSTORAGE, (WPARAM)nItems, nBytes); - } - - void ResetContent() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LB_RESETCONTENT, 0, 0L); - } - - UINT ItemFromPoint(POINT pt, BOOL& bOutside) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dw = (DWORD)::SendMessage(m_hWnd, LB_ITEMFROMPOINT, 0, MAKELPARAM(pt.x, pt.y)); - bOutside = (BOOL)HIWORD(dw); - return (UINT)LOWORD(dw); - } - - // manipulating listbox items - int AddString(LPCTSTR lpszItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_ADDSTRING, 0, (LPARAM)lpszItem); - } - - int DeleteString(UINT nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_DELETESTRING, nIndex, 0L); - } - - int InsertString(int nIndex, LPCTSTR lpszItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_INSERTSTRING, nIndex, (LPARAM)lpszItem); - } - -#ifndef _WIN32_WCE - int Dir(UINT attr, LPCTSTR lpszWildCard) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_DIR, attr, (LPARAM)lpszWildCard); - } - - int AddFile(LPCTSTR lpstrFileName) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_ADDFILE, 0, (LPARAM)lpstrFileName); - } -#endif // !_WIN32_WCE - - // selection helpers - int FindString(int nStartAfter, LPCTSTR lpszItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_FINDSTRING, nStartAfter, (LPARAM)lpszItem); - } - - int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind); - } - - int SelectString(int nStartAfter, LPCTSTR lpszItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LB_SELECTSTRING, nStartAfter, (LPARAM)lpszItem); - } - - int SelItemRange(BOOL bSelect, int nFirstItem, int nLastItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) != 0); - ATLASSERT(nFirstItem <= nLastItem); - return bSelect ? (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nFirstItem, nLastItem) : (int)::SendMessage(m_hWnd, LB_SELITEMRANGEEX, nLastItem, nFirstItem); - } - -#ifdef WIN32_PLATFORM_WFSP // SmartPhone only messages - DWORD GetInputMode(BOOL bCurrentMode = TRUE) - { - return SendMessage(LB_GETINPUTMODE, 0, (LPARAM)bCurrentMode); - } - - BOOL SetInputMode(DWORD dwMode) - { - return SendMessage(LB_SETINPUTMODE, 0, (LPARAM)dwMode); - } -#endif // WIN32_PLATFORM_WFSP -}; - -typedef CListBoxT CListBox; - - -/////////////////////////////////////////////////////////////////////////////// -// CComboBox - client side for a Windows COMBOBOX control - -#ifndef WIN32_PLATFORM_WFSP // No COMBOBOX on SmartPhones - -template -class CComboBoxT : public TBase -{ -public: -// Constructors - CComboBoxT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CComboBoxT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return _T("COMBOBOX"); - } - - // for entire combo box - int GetCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_GETCOUNT, 0, 0L); - } - - int GetCurSel() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_GETCURSEL, 0, 0L); - } - - int SetCurSel(int nSelect) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_SETCURSEL, nSelect, 0L); - } - - LCID GetLocale() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LCID)::SendMessage(m_hWnd, CB_GETLOCALE, 0, 0L); - } - - LCID SetLocale(LCID nNewLocale) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LCID)::SendMessage(m_hWnd, CB_SETLOCALE, (WPARAM)nNewLocale, 0L); - } - - int GetTopIndex() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_GETTOPINDEX, 0, 0L); - } - - int SetTopIndex(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_SETTOPINDEX, nIndex, 0L); - } - - UINT GetHorizontalExtent() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, CB_GETHORIZONTALEXTENT, 0, 0L); - } - - void SetHorizontalExtent(UINT nExtent) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, CB_SETHORIZONTALEXTENT, nExtent, 0L); - } - - int GetDroppedWidth() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_GETDROPPEDWIDTH, 0, 0L); - } - - int SetDroppedWidth(UINT nWidth) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_SETDROPPEDWIDTH, nWidth, 0L); - } - -#if ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) - BOOL GetComboBoxInfo(PCOMBOBOXINFO pComboBoxInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); -#if ((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) - return (BOOL)::SendMessage(m_hWnd, CB_GETCOMBOBOXINFO, 0, (LPARAM)pComboBoxInfo); -#else // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) - return ::GetComboBoxInfo(m_hWnd, pComboBoxInfo); -#endif // !((_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) - } -#endif // ((WINVER >= 0x0500) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 420)) - - // for edit control - DWORD GetEditSel() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, CB_GETEDITSEL, 0, 0L); - } - - BOOL SetEditSel(int nStartChar, int nEndChar) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CB_SETEDITSEL, 0, MAKELONG(nStartChar, nEndChar)); - } - - // for combobox item - DWORD_PTR GetItemData(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD_PTR)::SendMessage(m_hWnd, CB_GETITEMDATA, nIndex, 0L); - } - - int SetItemData(int nIndex, DWORD_PTR dwItemData) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_SETITEMDATA, nIndex, (LPARAM)dwItemData); - } - - void* GetItemDataPtr(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (void*)GetItemData(nIndex); - } - - int SetItemDataPtr(int nIndex, void* pData) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItemData(nIndex, (DWORD_PTR)pData); - } - - int GetLBText(int nIndex, LPTSTR lpszText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_GETLBTEXT, nIndex, (LPARAM)lpszText); - } - -#ifndef _ATL_NO_COM - BOOL GetLBTextBSTR(int nIndex, BSTR& bstrText) const - { - USES_CONVERSION; - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(bstrText == NULL); - - int nLen = GetLBTextLen(nIndex); - if(nLen == CB_ERR) - return FALSE; - - CTempBuffer buff; - LPTSTR lpstrText = buff.Allocate(nLen + 1); - if(lpstrText == NULL) - return FALSE; - - if(GetLBText(nIndex, lpstrText) == CB_ERR) - return FALSE; - - bstrText = ::SysAllocString(T2OLE(lpstrText)); - return (bstrText != NULL) ? TRUE : FALSE; - } -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - int GetLBText(int nIndex, _CSTRING_NS::CString& strText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int cchLen = GetLBTextLen(nIndex); - if(cchLen == CB_ERR) - return CB_ERR; - int nRet = CB_ERR; - LPTSTR lpstr = strText.GetBufferSetLength(cchLen); - if(lpstr != NULL) - { - nRet = GetLBText(nIndex, lpstr); - strText.ReleaseBuffer(); - } - return nRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - int GetLBTextLen(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_GETLBTEXTLEN, nIndex, 0L); - } - - int GetItemHeight(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_GETITEMHEIGHT, nIndex, 0L); - } - - int SetItemHeight(int nIndex, UINT cyItemHeight) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_SETITEMHEIGHT, nIndex, MAKELONG(cyItemHeight, 0)); - } - - BOOL GetExtendedUI() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CB_GETEXTENDEDUI, 0, 0L); - } - - int SetExtendedUI(BOOL bExtended = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_SETEXTENDEDUI, bExtended, 0L); - } - - void GetDroppedControlRect(LPRECT lprect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, CB_GETDROPPEDCONTROLRECT, 0, (LPARAM)lprect); - } - - BOOL GetDroppedState() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CB_GETDROPPEDSTATE, 0, 0L); - } - -#if (_WIN32_WINNT >= 0x0501) - int GetMinVisible() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_GETMINVISIBLE, 0, 0L); - } - - BOOL SetMinVisible(int nMinVisible) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CB_SETMINVISIBLE, nMinVisible, 0L); - } - - // Vista only - BOOL GetCueBannerText(LPWSTR lpwText, int cchText) const - { -#ifndef CB_GETCUEBANNER - const UINT CB_GETCUEBANNER = (CBM_FIRST + 4); -#endif - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CB_GETCUEBANNER, (WPARAM)lpwText, cchText); - } - - // Vista only - BOOL SetCueBannerText(LPCWSTR lpcwText) - { -#ifndef CB_SETCUEBANNER - const UINT CB_SETCUEBANNER = (CBM_FIRST + 3); -#endif - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CB_SETCUEBANNER, 0, (LPARAM)lpcwText); - } -#endif // (_WIN32_WINNT >= 0x0501) - -// Operations - int InitStorage(int nItems, UINT nBytes) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_INITSTORAGE, (WPARAM)nItems, nBytes); - } - - void ResetContent() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, CB_RESETCONTENT, 0, 0L); - } - - // for edit control - BOOL LimitText(int nMaxChars) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CB_LIMITTEXT, nMaxChars, 0L); - } - - // for drop-down combo boxes - void ShowDropDown(BOOL bShowIt = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, CB_SHOWDROPDOWN, bShowIt, 0L); - } - - // manipulating listbox items - int AddString(LPCTSTR lpszString) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_ADDSTRING, 0, (LPARAM)lpszString); - } - - int DeleteString(UINT nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_DELETESTRING, nIndex, 0L); - } - - int InsertString(int nIndex, LPCTSTR lpszString) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_INSERTSTRING, nIndex, (LPARAM)lpszString); - } - -#ifndef _WIN32_WCE - int Dir(UINT attr, LPCTSTR lpszWildCard) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_DIR, attr, (LPARAM)lpszWildCard); - } -#endif // !_WIN32_WCE - - // selection helpers - int FindString(int nStartAfter, LPCTSTR lpszString) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_FINDSTRING, nStartAfter, (LPARAM)lpszString); - } - - int FindStringExact(int nIndexStart, LPCTSTR lpszFind) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_FINDSTRINGEXACT, nIndexStart, (LPARAM)lpszFind); - } - - int SelectString(int nStartAfter, LPCTSTR lpszString) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CB_SELECTSTRING, nStartAfter, (LPARAM)lpszString); - } - - // Clipboard operations - void Clear() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); - } - - void Copy() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_COPY, 0, 0L); - } - - void Cut() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_CUT, 0, 0L); - } - - void Paste() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); - } -}; - -typedef CComboBoxT CComboBox; - -#endif // !WIN32_PLATFORM_WFSP - -/////////////////////////////////////////////////////////////////////////////// -// CEdit - client side for a Windows EDIT control - -template -class CEditT : public TBase -{ -public: -// Constructors - CEditT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CEditT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return _T("EDIT"); - } - - BOOL CanUndo() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); - } - - int GetLineCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L); - } - - BOOL GetModify() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); - } - - void SetModify(BOOL bModified = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L); - } - - void GetRect(LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect); - } - - DWORD GetSel() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L); - } - - void GetSel(int& nStartChar, int& nEndChar) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); - } - -#ifndef _WIN32_WCE - HLOCAL GetHandle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HLOCAL)::SendMessage(m_hWnd, EM_GETHANDLE, 0, 0L); - } - - void SetHandle(HLOCAL hBuffer) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETHANDLE, (WPARAM)hBuffer, 0L); - } -#endif // !_WIN32_WCE - - DWORD GetMargins() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, EM_GETMARGINS, 0, 0L); - } - - void SetMargins(UINT nLeft, UINT nRight) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETMARGINS, EC_LEFTMARGIN|EC_RIGHTMARGIN, MAKELONG(nLeft, nRight)); - } - - UINT GetLimitText() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L); - } - - void SetLimitText(UINT nMax) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETLIMITTEXT, nMax, 0L); - } - - POINT PosFromChar(UINT nChar) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_POSFROMCHAR, nChar, 0); - POINT point = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) }; - return point; - } - - int CharFromPos(POINT pt, int* pLine = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, MAKELPARAM(pt.x, pt.y)); - if(pLine != NULL) - *pLine = (int)(short)HIWORD(dwRet); - return (int)(short)LOWORD(dwRet); - } - - // NOTE: first word in lpszBuffer must contain the size of the buffer! - int GetLine(int nIndex, LPTSTR lpszBuffer) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); - } - - int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const - { - ATLASSERT(::IsWindow(m_hWnd)); - *(LPWORD)lpszBuffer = (WORD)nMaxLength; - return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); - } - - TCHAR GetPasswordChar() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (TCHAR)::SendMessage(m_hWnd, EM_GETPASSWORDCHAR, 0, 0L); - } - - void SetPasswordChar(TCHAR ch) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETPASSWORDCHAR, ch, 0L); - } - -#ifndef _WIN32_WCE - EDITWORDBREAKPROC GetWordBreakProc() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (EDITWORDBREAKPROC)::SendMessage(m_hWnd, EM_GETWORDBREAKPROC, 0, 0L); - } - - void SetWordBreakProc(EDITWORDBREAKPROC ewbprc) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETWORDBREAKPROC, 0, (LPARAM)ewbprc); - } -#endif // !_WIN32_WCE - - int GetFirstVisibleLine() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L); - } - -#ifndef _WIN32_WCE - int GetThumb() const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & ES_MULTILINE) != 0); - return (int)::SendMessage(m_hWnd, EM_GETTHUMB, 0, 0L); - } -#endif // !_WIN32_WCE - - BOOL SetReadOnly(BOOL bReadOnly = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L); - } - -#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) - UINT GetImeStatus(UINT uStatus) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_GETIMESTATUS, uStatus, 0L); - } - - UINT SetImeStatus(UINT uStatus, UINT uData) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_SETIMESTATUS, uStatus, uData); - } -#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) - -#if (_WIN32_WINNT >= 0x0501) - BOOL GetCueBannerText(LPCWSTR lpstrText, int cchText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_GETCUEBANNER, (WPARAM)lpstrText, cchText); - } - - // bKeepWithFocus - Vista only - BOOL SetCueBannerText(LPCWSTR lpstrText, BOOL bKeepWithFocus = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETCUEBANNER, (WPARAM)bKeepWithFocus, (LPARAM)(lpstrText)); - } -#endif // (_WIN32_WINNT >= 0x0501) - -// Operations - void EmptyUndoBuffer() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L); - } - - BOOL FmtLines(BOOL bAddEOL) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_FMTLINES, bAddEOL, 0L); - } - - void LimitText(int nChars = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_LIMITTEXT, nChars, 0L); - } - - int LineFromChar(int nIndex = -1) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_LINEFROMCHAR, nIndex, 0L); - } - - int LineIndex(int nLine = -1) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L); - } - - int LineLength(int nLine = -1) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L); - } - - void LineScroll(int nLines, int nChars = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines); - } - - void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText); - } - - void SetRect(LPCRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect); - } - - void SetRectNP(LPCRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETRECTNP, 0, (LPARAM)lpRect); - } - - void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETSEL, LOWORD(dwSelection), HIWORD(dwSelection)); - if(!bNoScroll) - ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); - } - - void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETSEL, nStartChar, nEndChar); - if(!bNoScroll) - ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); - } - - void SetSelAll(BOOL bNoScroll = FALSE) - { - SetSel(0, -1, bNoScroll); - } - - void SetSelNone(BOOL bNoScroll = FALSE) - { - SetSel(-1, 0, bNoScroll); - } - - BOOL SetTabStops(int nTabStops, LPINT rgTabStops) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); - } - - BOOL SetTabStops() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L); - } - - BOOL SetTabStops(const int& cxEachStop) // takes an 'int' - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); - } - - void ScrollCaret() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); - } - - int Scroll(int nScrollAction) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & ES_MULTILINE) != 0); - LRESULT lRet = ::SendMessage(m_hWnd, EM_SCROLL, nScrollAction, 0L); - if(!(BOOL)HIWORD(lRet)) - return -1; // failed - return (int)(short)LOWORD(lRet); - - } - - void InsertText(int nInsertAfterChar, LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE) - { - SetSel(nInsertAfterChar, nInsertAfterChar, bNoScroll); - ReplaceSel(lpstrText, bCanUndo); - } - - void AppendText(LPCTSTR lpstrText, BOOL bNoScroll = FALSE, BOOL bCanUndo = FALSE) - { - InsertText(GetWindowTextLength(), lpstrText, bNoScroll, bCanUndo); - } - -#if (_WIN32_WINNT >= 0x0501) - BOOL ShowBalloonTip(PEDITBALLOONTIP pEditBaloonTip) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SHOWBALLOONTIP, 0, (LPARAM)pEditBaloonTip); - } - - BOOL HideBalloonTip() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_HIDEBALLOONTIP, 0, 0L); - } -#endif // (_WIN32_WINNT >= 0x0501) - -#if (_WIN32_WINNT >= 0x0600) - DWORD GetHilite() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L); - } - - void GetHilite(int& nStartChar, int& nEndChar) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, EM_GETHILITE, 0, 0L); - nStartChar = (int)(short)LOWORD(dwRet); - nEndChar = (int)(short)HIWORD(dwRet); - } - - void SetHilite(int nStartChar, int nEndChar) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETHILITE, nStartChar, nEndChar); - } -#endif // (_WIN32_WINNT >= 0x0600) - - // Clipboard operations - BOOL Undo() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L); - } - - void Clear() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); - } - - void Copy() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_COPY, 0, 0L); - } - - void Cut() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_CUT, 0, 0L); - } - - void Paste() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); - } - -#ifdef WIN32_PLATFORM_WFSP // SmartPhone only messages - DWORD GetExtendedStyle() - { - return SendMessage(EM_GETEXTENDEDSTYLE); - } - - DWORD SetExtendedStyle(DWORD dwMask, DWORD dwExStyle) - { - return SendMessage(EM_SETEXTENDEDSTYLE, (WPARAM)dwMask, (LPARAM)dwExStyle); - } - - DWORD GetInputMode(BOOL bCurrentMode = TRUE) - { - return SendMessage(EM_GETINPUTMODE, 0, (LPARAM)bCurrentMode); - } - - BOOL SetInputMode(DWORD dwMode) - { - return SendMessage(EM_SETINPUTMODE, 0, (LPARAM)dwMode); - } - - BOOL SetSymbols(LPCTSTR szSymbols) - { - return SendMessage(EM_SETSYMBOLS, 0, (LPARAM)szSymbols); - } - - BOOL ResetSymbols() - { - return SendMessage(EM_SETSYMBOLS); - } -#endif // WIN32_PLATFORM_WFSP -}; - -typedef CEditT CEdit; - - -/////////////////////////////////////////////////////////////////////////////// -// CEditCommands - message handlers for standard EDIT commands - -// Chain to CEditCommands message map. Your class must also derive from CEdit. -// Example: -// class CMyEdit : public CWindowImpl, -// public CEditCommands -// { -// public: -// BEGIN_MSG_MAP(CMyEdit) -// // your handlers... -// CHAIN_MSG_MAP_ALT(CEditCommands, 1) -// END_MSG_MAP() -// // other stuff... -// }; - -template -class CEditCommands -{ -public: - BEGIN_MSG_MAP(CEditCommands< T >) - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_EDIT_CLEAR, OnEditClear) - COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, OnEditClearAll) - COMMAND_ID_HANDLER(ID_EDIT_COPY, OnEditCopy) - COMMAND_ID_HANDLER(ID_EDIT_CUT, OnEditCut) - COMMAND_ID_HANDLER(ID_EDIT_PASTE, OnEditPaste) - COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, OnEditSelectAll) - COMMAND_ID_HANDLER(ID_EDIT_UNDO, OnEditUndo) - END_MSG_MAP() - - LRESULT OnEditClear(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->Clear(); - return 0; - } - - LRESULT OnEditClearAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->SetSel(0, -1); - pT->Clear(); - return 0; - } - - LRESULT OnEditCopy(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->Copy(); - return 0; - } - - LRESULT OnEditCut(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->Cut(); - return 0; - } - - LRESULT OnEditPaste(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->Paste(); - return 0; - } - - LRESULT OnEditSelectAll(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->SetSel(0, -1); - return 0; - } - - LRESULT OnEditUndo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->Undo(); - return 0; - } - -// State (update UI) helpers - BOOL CanCut() const - { return HasSelection(); } - - BOOL CanCopy() const - { return HasSelection(); } - - BOOL CanClear() const - { return HasSelection(); } - - BOOL CanSelectAll() const - { return HasText(); } - - BOOL CanFind() const - { return HasText(); } - - BOOL CanRepeat() const - { return HasText(); } - - BOOL CanReplace() const - { return HasText(); } - - BOOL CanClearAll() const - { return HasText(); } - -// Implementation - BOOL HasSelection() const - { - const T* pT = static_cast(this); - int nMin, nMax; - ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nMin, (LPARAM)&nMax); - return (nMin != nMax); - } - - BOOL HasText() const - { - const T* pT = static_cast(this); - return (pT->GetWindowTextLength() > 0); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CScrollBar - client side for a Windows SCROLLBAR control - -template -class CScrollBarT : public TBase -{ -public: -// Constructors - CScrollBarT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CScrollBarT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return _T("SCROLLBAR"); - } - -#ifndef _WIN32_WCE - int GetScrollPos() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::GetScrollPos(m_hWnd, SB_CTL); - } -#endif // !_WIN32_WCE - - int SetScrollPos(int nPos, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::SetScrollPos(m_hWnd, SB_CTL, nPos, bRedraw); - } - -#ifndef _WIN32_WCE - void GetScrollRange(LPINT lpMinPos, LPINT lpMaxPos) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::GetScrollRange(m_hWnd, SB_CTL, lpMinPos, lpMaxPos); - } -#endif // !_WIN32_WCE - - void SetScrollRange(int nMinPos, int nMaxPos, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SetScrollRange(m_hWnd, SB_CTL, nMinPos, nMaxPos, bRedraw); - } - - BOOL GetScrollInfo(LPSCROLLINFO lpScrollInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::GetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo); - } - - int SetScrollInfo(LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::SetScrollInfo(m_hWnd, SB_CTL, lpScrollInfo, bRedraw); - } - -#ifndef _WIN32_WCE - int GetScrollLimit() const - { - int nMin = 0, nMax = 0; - ::GetScrollRange(m_hWnd, SB_CTL, &nMin, &nMax); - SCROLLINFO info = { 0 }; - info.cbSize = sizeof(SCROLLINFO); - info.fMask = SIF_PAGE; - if(::GetScrollInfo(m_hWnd, SB_CTL, &info)) - nMax -= ((info.nPage - 1) > 0) ? (info.nPage - 1) : 0; - - return nMax; - } - -#if (WINVER >= 0x0500) - BOOL GetScrollBarInfo(PSCROLLBARINFO pScrollBarInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); -#if (_WIN32_WINNT >= 0x0501) - return (BOOL)::SendMessage(m_hWnd, SBM_GETSCROLLBARINFO, 0, (LPARAM)pScrollBarInfo); -#else // !(_WIN32_WINNT >= 0x0501) - return ::GetScrollBarInfo(m_hWnd, OBJID_CLIENT, pScrollBarInfo); -#endif // !(_WIN32_WINNT >= 0x0501) - } -#endif // (WINVER >= 0x0500) - -// Operations - void ShowScrollBar(BOOL bShow = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::ShowScrollBar(m_hWnd, SB_CTL, bShow); - } - - BOOL EnableScrollBar(UINT nArrowFlags = ESB_ENABLE_BOTH) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::EnableScrollBar(m_hWnd, SB_CTL, nArrowFlags); - } -#endif // !_WIN32_WCE -}; - -typedef CScrollBarT CScrollBar; - - -// --- Windows Common Controls --- - -/////////////////////////////////////////////////////////////////////////////// -// CImageList - -class CImageList -{ -public: - HIMAGELIST m_hImageList; - -// Constructor - CImageList(HIMAGELIST hImageList = NULL) : m_hImageList(hImageList) - { } - -// Operators, etc. - CImageList& operator =(HIMAGELIST hImageList) - { - m_hImageList = hImageList; - return *this; - } - - operator HIMAGELIST() const { return m_hImageList; } - - void Attach(HIMAGELIST hImageList) - { - ATLASSERT(m_hImageList == NULL); - ATLASSERT(hImageList != NULL); - m_hImageList = hImageList; - } - - HIMAGELIST Detach() - { - HIMAGELIST hImageList = m_hImageList; - m_hImageList = NULL; - return hImageList; - } - - bool IsNull() const { return (m_hImageList == NULL); } - -// Attributes - int GetImageCount() const - { - ATLASSERT(m_hImageList != NULL); - return ImageList_GetImageCount(m_hImageList); - } - - COLORREF GetBkColor() const - { - ATLASSERT(m_hImageList != NULL); - return ImageList_GetBkColor(m_hImageList); - } - - COLORREF SetBkColor(COLORREF cr) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_SetBkColor(m_hImageList, cr); - } - - BOOL GetImageInfo(int nImage, IMAGEINFO* pImageInfo) const - { - ATLASSERT(m_hImageList != NULL); - return ImageList_GetImageInfo(m_hImageList, nImage, pImageInfo); - } - - HICON GetIcon(int nIndex, UINT uFlags = ILD_NORMAL) const - { - ATLASSERT(m_hImageList != NULL); - return ImageList_GetIcon(m_hImageList, nIndex, uFlags); - } - - BOOL GetIconSize(int& cx, int& cy) const - { - ATLASSERT(m_hImageList != NULL); - return ImageList_GetIconSize(m_hImageList, &cx, &cy); - } - - BOOL GetIconSize(SIZE& size) const - { - ATLASSERT(m_hImageList != NULL); - return ImageList_GetIconSize(m_hImageList, (int*)&size.cx, (int*)&size.cy); - } - - BOOL SetIconSize(int cx, int cy) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_SetIconSize(m_hImageList, cx, cy); - } - - BOOL SetIconSize(SIZE size) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_SetIconSize(m_hImageList, size.cx, size.cy); - } - - BOOL SetImageCount(UINT uNewCount) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_SetImageCount(m_hImageList, uNewCount); - } - - BOOL SetOverlayImage(int nImage, int nOverlay) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_SetOverlayImage(m_hImageList, nImage, nOverlay); - } - -// Operations - BOOL Create(int cx, int cy, UINT nFlags, int nInitial, int nGrow) - { - ATLASSERT(m_hImageList == NULL); - m_hImageList = ImageList_Create(cx, cy, nFlags, nInitial, nGrow); - return (m_hImageList != NULL) ? TRUE : FALSE; - } - - BOOL Create(ATL::_U_STRINGorID bitmap, int cx, int nGrow, COLORREF crMask) - { - ATLASSERT(m_hImageList == NULL); - m_hImageList = ImageList_LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, cx, nGrow, crMask); - return (m_hImageList != NULL) ? TRUE : FALSE; - } - - BOOL CreateFromImage(ATL::_U_STRINGorID image, int cx, int nGrow, COLORREF crMask, UINT uType, UINT uFlags = LR_DEFAULTCOLOR | LR_DEFAULTSIZE) - { - ATLASSERT(m_hImageList == NULL); - m_hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, cx, nGrow, crMask, uType, uFlags); - return (m_hImageList != NULL) ? TRUE : FALSE; - } - - BOOL Merge(HIMAGELIST hImageList1, int nImage1, HIMAGELIST hImageList2, int nImage2, int dx, int dy) - { - ATLASSERT(m_hImageList == NULL); - m_hImageList = ImageList_Merge(hImageList1, nImage1, hImageList2, nImage2, dx, dy); - return (m_hImageList != NULL) ? TRUE : FALSE; - } - -#ifndef _WIN32_WCE -#ifdef __IStream_INTERFACE_DEFINED__ - BOOL CreateFromStream(LPSTREAM lpStream) - { - ATLASSERT(m_hImageList == NULL); - m_hImageList = ImageList_Read(lpStream); - return (m_hImageList != NULL) ? TRUE : FALSE; - } -#endif // __IStream_INTERFACE_DEFINED__ -#endif // !_WIN32_WCE - - BOOL Destroy() - { - if (m_hImageList == NULL) - return FALSE; - BOOL bRet = ImageList_Destroy(m_hImageList); - if(bRet) - m_hImageList = NULL; - return bRet; - } - - int Add(HBITMAP hBitmap, HBITMAP hBitmapMask = NULL) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_Add(m_hImageList, hBitmap, hBitmapMask); - } - - int Add(HBITMAP hBitmap, COLORREF crMask) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_AddMasked(m_hImageList, hBitmap, crMask); - } - - BOOL Remove(int nImage) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_Remove(m_hImageList, nImage); - } - - BOOL RemoveAll() - { - ATLASSERT(m_hImageList != NULL); - return ImageList_RemoveAll(m_hImageList); - } - - BOOL Replace(int nImage, HBITMAP hBitmap, HBITMAP hBitmapMask) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_Replace(m_hImageList, nImage, hBitmap, hBitmapMask); - } - - int AddIcon(HICON hIcon) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_AddIcon(m_hImageList, hIcon); - } - - int ReplaceIcon(int nImage, HICON hIcon) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_ReplaceIcon(m_hImageList, nImage, hIcon); - } - - HICON ExtractIcon(int nImage) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_ExtractIcon(NULL, m_hImageList, nImage); - } - - BOOL Draw(HDC hDC, int nImage, int x, int y, UINT nStyle) - { - ATLASSERT(m_hImageList != NULL); - ATLASSERT(hDC != NULL); - return ImageList_Draw(m_hImageList, nImage, hDC, x, y, nStyle); - } - - BOOL Draw(HDC hDC, int nImage, POINT pt, UINT nStyle) - { - ATLASSERT(m_hImageList != NULL); - ATLASSERT(hDC != NULL); - return ImageList_Draw(m_hImageList, nImage, hDC, pt.x, pt.y, nStyle); - } - - BOOL DrawEx(int nImage, HDC hDC, int x, int y, int dx, int dy, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle) - { - ATLASSERT(m_hImageList != NULL); - ATLASSERT(hDC != NULL); - return ImageList_DrawEx(m_hImageList, nImage, hDC, x, y, dx, dy, rgbBk, rgbFg, fStyle); - } - - BOOL DrawEx(int nImage, HDC hDC, RECT& rect, COLORREF rgbBk, COLORREF rgbFg, UINT fStyle) - { - ATLASSERT(m_hImageList != NULL); - ATLASSERT(hDC != NULL); - return ImageList_DrawEx(m_hImageList, nImage, hDC, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, rgbBk, rgbFg, fStyle); - } - - static BOOL DrawIndirect(IMAGELISTDRAWPARAMS* pimldp) - { - return ImageList_DrawIndirect(pimldp); - } - - BOOL Copy(int nSrc, int nDst, UINT uFlags = ILCF_MOVE) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_Copy(m_hImageList, nDst, m_hImageList, nSrc, uFlags); - } - -#ifdef __IStream_INTERFACE_DEFINED__ -#ifndef _WIN32_WCE - static HIMAGELIST Read(LPSTREAM lpStream) - { - return ImageList_Read(lpStream); - } - - BOOL Write(LPSTREAM lpStream) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_Write(m_hImageList, lpStream); - } -#endif // !_WIN32_WCE - -#if (_WIN32_WINNT >= 0x0501) - static HRESULT ReadEx(DWORD dwFlags, LPSTREAM lpStream, REFIID riid, PVOID* ppv) - { - DebugBreak(); - return NULL; - //return ImageList_ReadEx(dwFlags, lpStream, riid, ppv); - } - - HRESULT WriteEx(DWORD dwFlags, LPSTREAM lpStream) - { - ATLASSERT(m_hImageList != NULL); - DebugBreak(); - return NULL; - //return ImageList_WriteEx(m_hImageList, dwFlags, lpStream); - } -#endif // (_WIN32_WINNT >= 0x0501) -#endif // __IStream_INTERFACE_DEFINED__ - - // Drag operations - BOOL BeginDrag(int nImage, POINT ptHotSpot) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_BeginDrag(m_hImageList, nImage, ptHotSpot.x, ptHotSpot.y); - } - - BOOL BeginDrag(int nImage, int xHotSpot, int yHotSpot) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_BeginDrag(m_hImageList, nImage, xHotSpot, yHotSpot); - } - - static void EndDrag() - { - ImageList_EndDrag(); - } - - static BOOL DragMove(POINT pt) - { - return ImageList_DragMove(pt.x, pt.y); - } - - static BOOL DragMove(int x, int y) - { - return ImageList_DragMove(x, y); - } - - BOOL SetDragCursorImage(int nDrag, POINT ptHotSpot) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_SetDragCursorImage(m_hImageList, nDrag, ptHotSpot.x, ptHotSpot.y); - } - - BOOL SetDragCursorImage(int nDrag, int xHotSpot, int yHotSpot) - { - ATLASSERT(m_hImageList != NULL); - return ImageList_SetDragCursorImage(m_hImageList, nDrag, xHotSpot, yHotSpot); - } - - static BOOL DragShowNolock(BOOL bShow = TRUE) - { - return ImageList_DragShowNolock(bShow); - } - - static CImageList GetDragImage(LPPOINT lpPoint, LPPOINT lpPointHotSpot) - { - return CImageList(ImageList_GetDragImage(lpPoint, lpPointHotSpot)); - } - - static BOOL DragEnter(HWND hWnd, POINT point) - { - return ImageList_DragEnter(hWnd, point.x, point.y); - } - - static BOOL DragEnter(HWND hWnd, int x, int y) - { - return ImageList_DragEnter(hWnd, x, y); - } - - static BOOL DragLeave(HWND hWnd) - { - return ImageList_DragLeave(hWnd); - } - -#if (_WIN32_IE >= 0x0400) - CImageList Duplicate() const - { - ATLASSERT(m_hImageList != NULL); - return CImageList(ImageList_Duplicate(m_hImageList)); - } - - static CImageList Duplicate(HIMAGELIST hImageList) - { - ATLASSERT(hImageList != NULL); - return CImageList(ImageList_Duplicate(hImageList)); - } -#endif // (_WIN32_IE >= 0x0400) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CToolTipCtrl - -#ifndef _WIN32_WCE - -class CToolInfo : public TOOLINFO -{ -public: - CToolInfo(UINT nFlags, HWND hWnd, UINT nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL) - { - Init(nFlags, hWnd, nIDTool, lpRect, lpstrText, lUserParam); - } - - operator LPTOOLINFO() { return this; } - - operator LPARAM() { return (LPARAM)this; } - - void Init(UINT nFlags, HWND hWnd, UINT nIDTool = 0, LPRECT lpRect = NULL, LPTSTR lpstrText = LPSTR_TEXTCALLBACK, LPARAM lUserParam = NULL) - { - ATLASSERT(::IsWindow(hWnd)); - memset(this, 0, sizeof(TOOLINFO)); - cbSize = sizeof(TOOLINFO); - uFlags = nFlags; - if(nIDTool == 0) - { - hwnd = ::GetParent(hWnd); - uFlags |= TTF_IDISHWND; - uId = (UINT_PTR)hWnd; - } - else - { - hwnd = hWnd; - uId = nIDTool; - } - if(lpRect != NULL) - rect = *lpRect; - hinst = ModuleHelper::GetResourceInstance(); - lpszText = lpstrText; - lParam = lUserParam; - } -}; - -template -class CToolTipCtrlT : public TBase -{ -public: -// Constructors - CToolTipCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CToolTipCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return TOOLTIPS_CLASS; - } - - void GetText(LPTOOLINFO lpToolInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_GETTEXT, 0, (LPARAM)&lpToolInfo); - } - - void GetText(LPTSTR lpstrText, HWND hWnd, UINT nIDTool = 0) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hWnd != NULL); - CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText); - ::SendMessage(m_hWnd, TTM_GETTEXT, 0, ti); - } - - BOOL GetToolInfo(LPTOOLINFO lpToolInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, (LPARAM)lpToolInfo); - } - - BOOL GetToolInfo(HWND hWnd, UINT nIDTool, UINT* puFlags, LPRECT lpRect, LPTSTR lpstrText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hWnd != NULL); - ATLASSERT(puFlags != NULL); - ATLASSERT(lpRect != NULL); - CToolInfo ti(0, hWnd, nIDTool, NULL, lpstrText); - BOOL bRet = (BOOL)::SendMessage(m_hWnd, TTM_GETTOOLINFO, 0, ti); - if(bRet != FALSE) - { - *puFlags = ti.uFlags; - *lpRect = ti.rect; - } - return bRet; - } - - void SetToolInfo(LPTOOLINFO lpToolInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_SETTOOLINFO, 0, (LPARAM)lpToolInfo); - } - - void SetToolRect(LPTOOLINFO lpToolInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, (LPARAM)lpToolInfo); - } - - void SetToolRect(HWND hWnd, UINT nIDTool, LPCRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hWnd != NULL); - ATLASSERT(nIDTool != 0); - - CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRect, NULL); - ::SendMessage(m_hWnd, TTM_NEWTOOLRECT, 0, ti); - } - - int GetToolCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TTM_GETTOOLCOUNT, 0, 0L); - } - - int GetDelayTime(DWORD dwType) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TTM_GETDELAYTIME, dwType, 0L); - } - - void SetDelayTime(DWORD dwType, int nTime) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_SETDELAYTIME, dwType, MAKELPARAM(nTime, 0)); - } - - void GetMargin(LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_GETMARGIN, 0, (LPARAM)lpRect); - } - - void SetMargin(LPRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_SETMARGIN, 0, (LPARAM)lpRect); - } - - int GetMaxTipWidth() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TTM_GETMAXTIPWIDTH, 0, 0L); - } - - int SetMaxTipWidth(int nWidth) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TTM_SETMAXTIPWIDTH, 0, nWidth); - } - - COLORREF GetTipBkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPBKCOLOR, 0, 0L); - } - - void SetTipBkColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_SETTIPBKCOLOR, (WPARAM)clr, 0L); - } - - COLORREF GetTipTextColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TTM_GETTIPTEXTCOLOR, 0, 0L); - } - - void SetTipTextColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_SETTIPTEXTCOLOR, (WPARAM)clr, 0L); - } - - BOOL GetCurrentTool(LPTOOLINFO lpToolInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TTM_GETCURRENTTOOL, 0, (LPARAM)lpToolInfo); - } - -#if (_WIN32_IE >= 0x0500) - SIZE GetBubbleSize(LPTOOLINFO lpToolInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TTM_GETBUBBLESIZE, 0, (LPARAM)lpToolInfo); - SIZE size = { GET_X_LPARAM(dwRet), GET_Y_LPARAM(dwRet) }; - return size; - } - - BOOL SetTitle(UINT uIcon, LPCTSTR lpstrTitle) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TTM_SETTITLE, uIcon, (LPARAM)lpstrTitle); - } -#endif // (_WIN32_IE >= 0x0500) - -#if (_WIN32_WINNT >= 0x0501) - void GetTitle(PTTGETTITLE pTTGetTitle) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_GETTITLE, 0, (LPARAM)pTTGetTitle); - } - - void SetWindowTheme(LPCWSTR lpstrTheme) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); - } -#endif // (_WIN32_WINNT >= 0x0501) - -// Operations - void Activate(BOOL bActivate) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_ACTIVATE, bActivate, 0L); - } - - BOOL AddTool(LPTOOLINFO lpToolInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, (LPARAM)lpToolInfo); - } - - BOOL AddTool(HWND hWnd, ATL::_U_STRINGorID text = LPSTR_TEXTCALLBACK, LPCRECT lpRectTool = NULL, UINT nIDTool = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hWnd != NULL); - // the toolrect and toolid must both be zero or both valid - ATLASSERT((lpRectTool != NULL && nIDTool != 0) || (lpRectTool == NULL && nIDTool == 0)); - - CToolInfo ti(0, hWnd, nIDTool, (LPRECT)lpRectTool, (LPTSTR)text.m_lpstr); - return (BOOL)::SendMessage(m_hWnd, TTM_ADDTOOL, 0, ti); - } - - void DelTool(LPTOOLINFO lpToolInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_DELTOOL, 0, (LPARAM)lpToolInfo); - } - - void DelTool(HWND hWnd, UINT nIDTool = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hWnd != NULL); - - CToolInfo ti(0, hWnd, nIDTool, NULL, NULL); - ::SendMessage(m_hWnd, TTM_DELTOOL, 0, ti); - } - - BOOL HitTest(LPTTHITTESTINFO lpHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)lpHitTestInfo); - } - - BOOL HitTest(HWND hWnd, POINT pt, LPTOOLINFO lpToolInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hWnd != NULL); - ATLASSERT(lpToolInfo != NULL); - - TTHITTESTINFO hti = { 0 }; - hti.ti.cbSize = sizeof(TOOLINFO); - hti.hwnd = hWnd; - hti.pt.x = pt.x; - hti.pt.y = pt.y; - if((BOOL)::SendMessage(m_hWnd, TTM_HITTEST, 0, (LPARAM)&hti) != FALSE) - { - *lpToolInfo = hti.ti; - return TRUE; - } - return FALSE; - } - - void RelayEvent(LPMSG lpMsg) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_RELAYEVENT, 0, (LPARAM)lpMsg); - } - - void UpdateTipText(LPTOOLINFO lpToolInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, (LPARAM)lpToolInfo); - } - - void UpdateTipText(ATL::_U_STRINGorID text, HWND hWnd, UINT nIDTool = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hWnd != NULL); - - CToolInfo ti(0, hWnd, nIDTool, NULL, (LPTSTR)text.m_lpstr); - ::SendMessage(m_hWnd, TTM_UPDATETIPTEXT, 0, ti); - } - - BOOL EnumTools(UINT nTool, LPTOOLINFO lpToolInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TTM_ENUMTOOLS, nTool, (LPARAM)lpToolInfo); - } - - void Pop() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_POP, 0, 0L); - } - - void TrackActivate(LPTOOLINFO lpToolInfo, BOOL bActivate) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_TRACKACTIVATE, bActivate, (LPARAM)lpToolInfo); - } - - void TrackPosition(int xPos, int yPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_TRACKPOSITION, 0, MAKELPARAM(xPos, yPos)); - } - -#if (_WIN32_IE >= 0x0400) - void Update() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_UPDATE, 0, 0L); - } -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) - BOOL AdjustRect(LPRECT lpRect, BOOL bLarger /*= TRUE*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TTM_ADJUSTRECT, bLarger, (LPARAM)lpRect); - } -#endif // (_WIN32_IE >= 0x0500) - -#if (_WIN32_WINNT >= 0x0501) - void Popup() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TTM_POPUP, 0, 0L); - } -#endif // (_WIN32_WINNT >= 0x0501) -}; - -typedef CToolTipCtrlT CToolTipCtrl; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CHeaderCtrl - -template -class CHeaderCtrlT : public TBase -{ -public: -// Constructors - CHeaderCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CHeaderCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_HEADER; - } - - int GetItemCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_GETITEMCOUNT, 0, 0L); - } - - BOOL GetItem(int nIndex, LPHDITEM pHeaderItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_GETITEM, nIndex, (LPARAM)pHeaderItem); - } - - BOOL SetItem(int nIndex, LPHDITEM pHeaderItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_SETITEM, nIndex, (LPARAM)pHeaderItem); - } - - CImageList GetImageList() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_GETIMAGELIST, 0, 0L)); - } - - CImageList SetImageList(HIMAGELIST hImageList) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_SETIMAGELIST, 0, (LPARAM)hImageList)); - } - - BOOL GetOrderArray(int nSize, int* lpnArray) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_GETORDERARRAY, nSize, (LPARAM)lpnArray); - } - - BOOL SetOrderArray(int nSize, int* lpnArray) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_SETORDERARRAY, nSize, (LPARAM)lpnArray); - } - - BOOL GetItemRect(int nIndex, LPRECT lpItemRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMRECT, nIndex, (LPARAM)lpItemRect); - } - - int SetHotDivider(BOOL bPos, DWORD dwInputValue) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_SETHOTDIVIDER, bPos, dwInputValue); - } - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - int GetBitmapMargin() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_GETBITMAPMARGIN, 0, 0L); - } - - int SetBitmapMargin(int nWidth) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_SETBITMAPMARGIN, nWidth, 0L); - } - - int SetFilterChangeTimeout(DWORD dwTimeOut) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_SETFILTERCHANGETIMEOUT, 0, dwTimeOut); - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -#if (_WIN32_WINNT >= 0x0600) - BOOL GetItemDropDownRect(int nIndex, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_GETITEMDROPDOWNRECT, nIndex, (LPARAM)lpRect); - } - - BOOL GetOverflowRect(LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_GETOVERFLOWRECT, 0, (LPARAM)lpRect); - } - - int GetFocusedItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_GETFOCUSEDITEM, 0, 0L); - } - - BOOL SetFocusedItem(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_SETFOCUSEDITEM, 0, nIndex); - } -#endif // (_WIN32_WINNT >= 0x0600) - -// Operations - int InsertItem(int nIndex, LPHDITEM phdi) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_INSERTITEM, nIndex, (LPARAM)phdi); - } - - int AddItem(LPHDITEM phdi) - { - return InsertItem(GetItemCount(), phdi); - } - - BOOL DeleteItem(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_DELETEITEM, nIndex, 0L); - } - - BOOL Layout(HD_LAYOUT* pHeaderLayout) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, HDM_LAYOUT, 0, (LPARAM)pHeaderLayout); - } - - int HitTest(LPHDHITTESTINFO lpHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_HITTEST, 0, (LPARAM)lpHitTestInfo); - } - - int OrderToIndex(int nOrder) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_ORDERTOINDEX, nOrder, 0L); - } - - CImageList CreateDragImage(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, HDM_CREATEDRAGIMAGE, nIndex, 0L)); - } - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - int EditFilter(int nColumn, BOOL bDiscardChanges) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_EDITFILTER, nColumn, MAKELPARAM(bDiscardChanges, 0)); - } - - int ClearFilter(int nColumn) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, nColumn, 0L); - } - - int ClearAllFilters() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, HDM_CLEARFILTER, (WPARAM)-1, 0L); - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) -}; - -typedef CHeaderCtrlT CHeaderCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CListViewCtrl - -template -class CListViewCtrlT : public TBase -{ -public: -// Constructors - CListViewCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CListViewCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_LISTVIEW; - } - - COLORREF GetBkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, LVM_GETBKCOLOR, 0, 0L); - } - - BOOL SetBkColor(COLORREF cr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETBKCOLOR, 0, cr); - } - - CImageList GetImageList(int nImageListType) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_GETIMAGELIST, nImageListType, 0L)); - } - - CImageList SetImageList(HIMAGELIST hImageList, int nImageList) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, nImageList, (LPARAM)hImageList)); - } - - int GetItemCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETITEMCOUNT, 0, 0L); - } - - BOOL SetItemCount(int nItems) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, 0L); - } - - BOOL GetItem(LPLVITEM pItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem); - } - - BOOL SetItem(const LVITEM* pItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)pItem); - } - - BOOL SetItem(int nItem, int nSubItem, UINT nMask, LPCTSTR lpszItem, - int nImage, UINT nState, UINT nStateMask, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - LVITEM lvi = { 0 }; - lvi.mask = nMask; - lvi.iItem = nItem; - lvi.iSubItem = nSubItem; - lvi.stateMask = nStateMask; - lvi.state = nState; - lvi.pszText = (LPTSTR) lpszItem; - lvi.iImage = nImage; - lvi.lParam = lParam; - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEM, 0, (LPARAM)&lvi); - } - - UINT GetItemState(int nItem, UINT nMask) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, LVM_GETITEMSTATE, nItem, nMask); - } - - BOOL SetItemState(int nItem, UINT nState, UINT nStateMask) - { - ATLASSERT(::IsWindow(m_hWnd)); - LVITEM lvi = { 0 }; - lvi.state = nState; - lvi.stateMask = nStateMask; - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)&lvi); - } - - BOOL SetItemState(int nItem, LPLVITEM pItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMSTATE, nItem, (LPARAM)pItem); - } - -#ifndef _ATL_NO_COM - BOOL GetItemText(int nItem, int nSubItem, BSTR& bstrText) const - { - USES_CONVERSION; - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(bstrText == NULL); - LVITEM lvi = { 0 }; - lvi.iSubItem = nSubItem; - - LPTSTR lpstrText = NULL; - int nRes = 0; - for(int nLen = 256; ; nLen *= 2) - { - ATLTRY(lpstrText = new TCHAR[nLen]); - if(lpstrText == NULL) - break; - lpstrText[0] = NULL; - lvi.cchTextMax = nLen; - lvi.pszText = lpstrText; - nRes = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); - if(nRes < nLen - 1) - break; - delete [] lpstrText; - lpstrText = NULL; - } - - if(lpstrText != NULL) - { - if(nRes != 0) - bstrText = ::SysAllocString(T2OLE(lpstrText)); - delete [] lpstrText; - } - - return (bstrText != NULL) ? TRUE : FALSE; - } -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - int GetItemText(int nItem, int nSubItem, _CSTRING_NS::CString& strText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - LVITEM lvi = { 0 }; - lvi.iSubItem = nSubItem; - - strText.Empty(); - int nRes = 0; - for(int nLen = 256; ; nLen *= 2) - { - lvi.cchTextMax = nLen; - lvi.pszText = strText.GetBufferSetLength(nLen); - if(lvi.pszText == NULL) - { - nRes = 0; - break; - } - nRes = (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); - if(nRes < nLen - 1) - break; - } - strText.ReleaseBuffer(); - return nRes; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - int GetItemText(int nItem, int nSubItem, LPTSTR lpszText, int nLen) const - { - ATLASSERT(::IsWindow(m_hWnd)); - LVITEM lvi = { 0 }; - lvi.iSubItem = nSubItem; - lvi.cchTextMax = nLen; - lvi.pszText = lpszText; - return (int)::SendMessage(m_hWnd, LVM_GETITEMTEXT, (WPARAM)nItem, (LPARAM)&lvi); - } - - BOOL SetItemText(int nItem, int nSubItem, LPCTSTR lpszText) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItem(nItem, nSubItem, LVIF_TEXT, lpszText, 0, 0, 0, 0); - } - - DWORD_PTR GetItemData(int nItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - LVITEM lvi = { 0 }; - lvi.iItem = nItem; - lvi.mask = LVIF_PARAM; - BOOL bRet = (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)&lvi); - return (DWORD_PTR)(bRet ? lvi.lParam : NULL); - } - - BOOL SetItemData(int nItem, DWORD_PTR dwData) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItem(nItem, 0, LVIF_PARAM, NULL, 0, 0, 0, (LPARAM)dwData); - } - - UINT GetCallbackMask() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, LVM_GETCALLBACKMASK, 0, 0L); - } - - BOOL SetCallbackMask(UINT nMask) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETCALLBACKMASK, nMask, 0L); - } - - BOOL GetItemPosition(int nItem, LPPOINT lpPoint) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMPOSITION, nItem, (LPARAM)lpPoint); - } - - BOOL SetItemPosition(int nItem, POINT pt) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt); - } - - BOOL SetItemPosition(int nItem, int x, int y) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(((GetStyle() & LVS_TYPEMASK) == LVS_ICON) || ((GetStyle() & LVS_TYPEMASK) == LVS_SMALLICON)); - POINT pt = { x, y }; - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMPOSITION32, nItem, (LPARAM)&pt); - } - - int GetStringWidth(LPCTSTR lpsz) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETSTRINGWIDTH, 0, (LPARAM)lpsz); - } - - CEdit GetEditControl() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CEdit((HWND)::SendMessage(m_hWnd, LVM_GETEDITCONTROL, 0, 0L)); - } - - BOOL GetColumn(int nCol, LVCOLUMN* pColumn) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMN, nCol, (LPARAM)pColumn); - } - - BOOL SetColumn(int nCol, const LVCOLUMN* pColumn) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMN, nCol, (LPARAM)pColumn); - } - - int GetColumnWidth(int nCol) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETCOLUMNWIDTH, nCol, 0L); - } - - BOOL SetColumnWidth(int nCol, int cx) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNWIDTH, nCol, MAKELPARAM(cx, 0)); - } - - BOOL GetViewRect(LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETVIEWRECT, 0, (LPARAM)lpRect); - } - - COLORREF GetTextColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTCOLOR, 0, 0L); - } - - BOOL SetTextColor(COLORREF cr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTCOLOR, 0, cr); - } - - COLORREF GetTextBkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, LVM_GETTEXTBKCOLOR, 0, 0L); - } - - BOOL SetTextBkColor(COLORREF cr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETTEXTBKCOLOR, 0, cr); - } - - int GetTopIndex() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETTOPINDEX, 0, 0L); - } - - int GetCountPerPage() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETCOUNTPERPAGE, 0, 0L); - } - - BOOL GetOrigin(LPPOINT lpPoint) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETORIGIN, 0, (LPARAM)lpPoint); - } - - UINT GetSelectedCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, LVM_GETSELECTEDCOUNT, 0, 0L); - } - - BOOL GetItemRect(int nItem, LPRECT lpRect, UINT nCode) const - { - ATLASSERT(::IsWindow(m_hWnd)); - lpRect->left = nCode; - return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMRECT, (WPARAM)nItem, (LPARAM)lpRect); - } - -#ifndef _WIN32_WCE - HCURSOR GetHotCursor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HCURSOR)::SendMessage(m_hWnd, LVM_GETHOTCURSOR, 0, 0L); - } - - HCURSOR SetHotCursor(HCURSOR hHotCursor) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HCURSOR)::SendMessage(m_hWnd, LVM_SETHOTCURSOR, 0, (LPARAM)hHotCursor); - } - - int GetHotItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETHOTITEM, 0, 0L); - } - - int SetHotItem(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_SETHOTITEM, nIndex, 0L); - } -#endif // !_WIN32_WCE - - BOOL GetColumnOrderArray(int nCount, int* lpnArray) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray); - } - - BOOL SetColumnOrderArray(int nCount, int* lpnArray) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETCOLUMNORDERARRAY, nCount, (LPARAM)lpnArray); - } - - CHeaderCtrl GetHeader() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CHeaderCtrl((HWND)::SendMessage(m_hWnd, LVM_GETHEADER, 0, 0L)); - } - - BOOL GetSubItemRect(int nItem, int nSubItem, int nFlag, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_REPORT); - ATLASSERT(lpRect != NULL); - lpRect->top = nSubItem; - lpRect->left = nFlag; - return (BOOL)::SendMessage(m_hWnd, LVM_GETSUBITEMRECT, nItem, (LPARAM)lpRect); - } - - DWORD SetIconSpacing(int cx, int cy) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & LVS_TYPEMASK) == LVS_ICON); - return (DWORD)::SendMessage(m_hWnd, LVM_SETICONSPACING, 0, MAKELPARAM(cx, cy)); - } - - int GetISearchString(LPTSTR lpstr) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETISEARCHSTRING, 0, (LPARAM)lpstr); - } - - void GetItemSpacing(SIZE& sizeSpacing, BOOL bSmallIconView = FALSE) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, LVM_GETITEMSPACING, bSmallIconView, 0L); - sizeSpacing.cx = GET_X_LPARAM(dwRet); - sizeSpacing.cy = GET_Y_LPARAM(dwRet); - } - -#if (_WIN32_WCE >= 410) - void SetItemSpacing(INT cySpacing) - { - ATLASSERT(::IsWindow(m_hWnd)); - ListView_SetItemSpacing(m_hWnd, cySpacing); - } -#endif // (_WIN32_WCE >= 410) - - // single-selection only - int GetSelectedIndex() const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0); - return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0)); - } - - BOOL GetSelectedItem(LPLVITEM pItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & LVS_SINGLESEL) != 0); - ATLASSERT(pItem != NULL); - pItem->iItem = (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, (WPARAM)-1, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0)); - if(pItem->iItem == -1) - return FALSE; - return (BOOL)::SendMessage(m_hWnd, LVM_GETITEM, 0, (LPARAM)pItem); - } - - // extended list view styles - DWORD GetExtendedListViewStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, LVM_GETEXTENDEDLISTVIEWSTYLE, 0, 0L); - } - - // dwExMask = 0 means all styles - DWORD SetExtendedListViewStyle(DWORD dwExStyle, DWORD dwExMask = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, LVM_SETEXTENDEDLISTVIEWSTYLE, dwExMask, dwExStyle); - } - - // checkboxes only - BOOL GetCheckState(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetExtendedListViewStyle() & LVS_EX_CHECKBOXES) != 0); - UINT uRet = GetItemState(nIndex, LVIS_STATEIMAGEMASK); - return (uRet >> 12) - 1; - } - - BOOL SetCheckState(int nItem, BOOL bCheck) - { - int nCheck = bCheck ? 2 : 1; // one based index - return SetItemState(nItem, INDEXTOSTATEIMAGEMASK(nCheck), LVIS_STATEIMAGEMASK); - } - - // view type - DWORD GetViewType() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (GetStyle() & LVS_TYPEMASK); - } - - DWORD SetViewType(DWORD dwType) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(dwType == LVS_ICON || dwType == LVS_SMALLICON || dwType == LVS_LIST || dwType == LVS_REPORT); - DWORD dwOldType = GetViewType(); - if(dwType != dwOldType) - ModifyStyle(LVS_TYPEMASK, (dwType & LVS_TYPEMASK)); - return dwOldType; - } - -#if (_WIN32_IE >= 0x0400) -#ifndef _WIN32_WCE - BOOL GetBkImage(LPLVBKIMAGE plvbki) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETBKIMAGE, 0, (LPARAM)plvbki); - } - - BOOL SetBkImage(LPLVBKIMAGE plvbki) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETBKIMAGE, 0, (LPARAM)plvbki); - } -#endif // !_WIN32_WCE - - int GetSelectionMark() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETSELECTIONMARK, 0, 0L); - } - - int SetSelectionMark(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_SETSELECTIONMARK, 0, nIndex); - } - -#ifndef _WIN32_WCE - BOOL GetWorkAreas(int nWorkAreas, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETWORKAREAS, nWorkAreas, (LPARAM)lpRect); - } - - BOOL SetWorkAreas(int nWorkAreas, LPRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETWORKAREAS, nWorkAreas, (LPARAM)lpRect); - } - - DWORD GetHoverTime() const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0); - return (DWORD)::SendMessage(m_hWnd, LVM_GETHOVERTIME, 0, 0L); - } - - DWORD SetHoverTime(DWORD dwHoverTime) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetExtendedListViewStyle() & (LVS_EX_TRACKSELECT | LVS_EX_ONECLICKACTIVATE | LVS_EX_TWOCLICKACTIVATE)) != 0); - return (DWORD)::SendMessage(m_hWnd, LVM_SETHOVERTIME, 0, dwHoverTime); - } - - BOOL GetNumberOfWorkAreas(int* pnWorkAreas) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETNUMBEROFWORKAREAS, 0, (LPARAM)pnWorkAreas); - } -#endif // !_WIN32_WCE - - BOOL SetItemCountEx(int nItems, DWORD dwFlags) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(((GetStyle() & LVS_OWNERDATA) != 0) && (((GetStyle() & LVS_TYPEMASK) == LVS_REPORT) || ((GetStyle() & LVS_TYPEMASK) == LVS_LIST))); - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMCOUNT, nItems, dwFlags); - } - -#ifndef _WIN32_WCE - CToolTipCtrl GetToolTips() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_GETTOOLTIPS, 0, 0L)); - } - - CToolTipCtrl SetToolTips(HWND hWndTT) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CToolTipCtrl((HWND)::SendMessage(m_hWnd, LVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L)); - } - - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // !_WIN32_WCE -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_WINNT >= 0x0501) - int GetSelectedColumn() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETSELECTEDCOLUMN, 0, 0L); - } - - void SetSelectedColumn(int nColumn) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_SETSELECTEDCOLUMN, nColumn, 0L); - } - - DWORD GetView() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, LVM_GETVIEW, 0, 0L); - } - - int SetView(DWORD dwView) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_SETVIEW, dwView, 0L); - } - - BOOL IsGroupViewEnabled() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_ISGROUPVIEWENABLED, 0, 0L); - } - - int GetGroupInfo(int nGroupID, PLVGROUP pGroup) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETGROUPINFO, nGroupID, (LPARAM)pGroup); - } - - int SetGroupInfo(int nGroupID, PLVGROUP pGroup) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_SETGROUPINFO, nGroupID, (LPARAM)pGroup); - } - - void GetGroupMetrics(PLVGROUPMETRICS pGroupMetrics) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_GETGROUPMETRICS, 0, (LPARAM)pGroupMetrics); - } - - void SetGroupMetrics(PLVGROUPMETRICS pGroupMetrics) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_SETGROUPMETRICS, 0, (LPARAM)pGroupMetrics); - } - - void GetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_GETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo); - } - - BOOL SetTileViewInfo(PLVTILEVIEWINFO pTileViewInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEVIEWINFO, 0, (LPARAM)pTileViewInfo); - } - - void GetTileInfo(PLVTILEINFO pTileInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_GETTILEINFO, 0, (LPARAM)pTileInfo); - } - - BOOL SetTileInfo(PLVTILEINFO pTileInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETTILEINFO, 0, (LPARAM)pTileInfo); - } - - BOOL GetInsertMark(LPLVINSERTMARK pInsertMark) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETINSERTMARK, 0, (LPARAM)pInsertMark); - } - - BOOL SetInsertMark(LPLVINSERTMARK pInsertMark) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETINSERTMARK, 0, (LPARAM)pInsertMark); - } - - int GetInsertMarkRect(LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETINSERTMARKRECT, 0, (LPARAM)lpRect); - } - - COLORREF GetInsertMarkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, LVM_GETINSERTMARKCOLOR, 0, 0L); - } - - COLORREF SetInsertMarkColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, LVM_SETINSERTMARKCOLOR, 0, clr); - } - - COLORREF GetOutlineColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, LVM_GETOUTLINECOLOR, 0, 0L); - } - - COLORREF SetOutlineColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, LVM_SETOUTLINECOLOR, 0, clr); - } -#endif // (_WIN32_WINNT >= 0x0501) - -#if (_WIN32_WINNT >= 0x0600) - int GetGroupCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETGROUPCOUNT, 0, 0L); - } - - BOOL GetGroupInfoByIndex(int nIndex, PLVGROUP pGroup) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPINFOBYINDEX, nIndex, (LPARAM)pGroup); - } - - BOOL GetGroupRect(int nGroupID, int nType, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpRect != NULL); - if(lpRect != NULL) - lpRect->top = nType; - return (BOOL)::SendMessage(m_hWnd, LVM_GETGROUPRECT, nGroupID, (LPARAM)lpRect); - } - - UINT GetGroupState(int nGroupID, UINT uMask) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, LVM_GETGROUPSTATE, nGroupID, (LPARAM)uMask); - } - - int GetFocusedGroup() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETFOCUSEDGROUP, 0, 0L); - } - - BOOL GetEmptyText(LPWSTR lpstrText, int cchText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETEMPTYTEXT, cchText, (LPARAM)lpstrText); - } - - BOOL GetFooterRect(LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERRECT, 0, (LPARAM)lpRect); - } - - BOOL GetFooterInfo(LPLVFOOTERINFO lpFooterInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERINFO, 0, (LPARAM)lpFooterInfo); - } - - BOOL GetFooterItemRect(int nItem, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEMRECT, nItem, (LPARAM)lpRect); - } - - BOOL GetFooterItem(int nItem, LPLVFOOTERITEM lpFooterItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETFOOTERITEM, nItem, (LPARAM)lpFooterItem); - } - - BOOL GetItemIndexRect(PLVITEMINDEX pItemIndex, int nSubItem, int nType, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pItemIndex != NULL); - ATLASSERT(lpRect != NULL); - if(lpRect != NULL) - { - lpRect->top = nSubItem; - lpRect->left = nType; - } - return (BOOL)::SendMessage(m_hWnd, LVM_GETITEMINDEXRECT, (WPARAM)pItemIndex, (LPARAM)lpRect); - } - - BOOL SetItemIndexState(PLVITEMINDEX pItemIndex, UINT uState, UINT dwMask) - { - ATLASSERT(::IsWindow(m_hWnd)); - LVITEM lvi = { 0 }; - lvi.state = uState; - lvi.stateMask = dwMask; - return (BOOL)::SendMessage(m_hWnd, LVM_SETITEMINDEXSTATE, (WPARAM)pItemIndex, (LPARAM)&lvi); - } - - BOOL GetNextItemIndex(PLVITEMINDEX pItemIndex, WORD wFlags) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_GETNEXTITEMINDEX, (WPARAM)pItemIndex, MAKELPARAM(wFlags, 0)); - } -#endif // (_WIN32_WINNT >= 0x0600) - -// Operations - int InsertColumn(int nCol, const LVCOLUMN* pColumn) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_INSERTCOLUMN, nCol, (LPARAM)pColumn); - } - - int InsertColumn(int nCol, LPCTSTR lpszColumnHeading, int nFormat = LVCFMT_LEFT, - int nWidth = -1, int nSubItem = -1, int iImage = -1, int iOrder = -1) - { - LVCOLUMN column = { 0 }; - column.mask = LVCF_TEXT|LVCF_FMT; - column.pszText = (LPTSTR)lpszColumnHeading; - column.fmt = nFormat; - if (nWidth != -1) - { - column.mask |= LVCF_WIDTH; - column.cx = nWidth; - } - if (nSubItem != -1) - { - column.mask |= LVCF_SUBITEM; - column.iSubItem = nSubItem; - } - if (iImage != -1) - { - column.mask |= LVCF_IMAGE; - column.iImage = iImage; - } - if (iOrder != -1) - { - column.mask |= LVCF_ORDER; - column.iOrder = iOrder; - } - return InsertColumn(nCol, &column); - } - - BOOL DeleteColumn(int nCol) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_DELETECOLUMN, nCol, 0L); - } - - int InsertItem(UINT nMask, int nItem, LPCTSTR lpszItem, UINT nState, UINT nStateMask, int nImage, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - LVITEM item = { 0 }; - item.mask = nMask; - item.iItem = nItem; - item.iSubItem = 0; - item.pszText = (LPTSTR)lpszItem; - item.state = nState; - item.stateMask = nStateMask; - item.iImage = nImage; - item.lParam = lParam; - return InsertItem(&item); - } - - int InsertItem(const LVITEM* pItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_INSERTITEM, 0, (LPARAM)pItem); - } - - int InsertItem(int nItem, LPCTSTR lpszItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return InsertItem(LVIF_TEXT, nItem, lpszItem, 0, 0, 0, 0); - } - - int InsertItem(int nItem, LPCTSTR lpszItem, int nImage) - { - ATLASSERT(::IsWindow(m_hWnd)); - return InsertItem(LVIF_TEXT|LVIF_IMAGE, nItem, lpszItem, 0, 0, nImage, 0); - } - - int GetNextItem(int nItem, int nFlags) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_GETNEXTITEM, nItem, MAKELPARAM(nFlags, 0)); - } - - BOOL DeleteItem(int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_DELETEITEM, nItem, 0L); - } - - BOOL DeleteAllItems() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_DELETEALLITEMS, 0, 0L); - } - - int FindItem(LVFINDINFO* pFindInfo, int nStart) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_FINDITEM, nStart, (LPARAM)pFindInfo); - } - - int HitTest(LVHITTESTINFO* pHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)pHitTestInfo); - } - - int HitTest(POINT pt, UINT* pFlags) const - { - ATLASSERT(::IsWindow(m_hWnd)); - LVHITTESTINFO hti = { 0 }; - hti.pt = pt; - int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, 0, (LPARAM)&hti); - if (pFlags != NULL) - *pFlags = hti.flags; - return nRes; - } - - BOOL EnsureVisible(int nItem, BOOL bPartialOK) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_ENSUREVISIBLE, nItem, MAKELPARAM(bPartialOK, 0)); - } - - BOOL Scroll(SIZE size) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SCROLL, size.cx, size.cy); - } - - BOOL RedrawItems(int nFirst, int nLast) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_REDRAWITEMS, nFirst, nLast); - } - - BOOL Arrange(UINT nCode) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_ARRANGE, nCode, 0L); - } - - CEdit EditLabel(int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CEdit((HWND)::SendMessage(m_hWnd, LVM_EDITLABEL, nItem, 0L)); - } - - BOOL Update(int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_UPDATE, nItem, 0L); - } - - BOOL SortItems(PFNLVCOMPARE pfnCompare, LPARAM lParamSort) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMS, (WPARAM)lParamSort, (LPARAM)pfnCompare); - } - - CImageList RemoveImageList(int nImageList) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_SETIMAGELIST, (WPARAM)nImageList, NULL)); - } - - CImageList CreateDragImage(int nItem, LPPOINT lpPoint) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, LVM_CREATEDRAGIMAGE, nItem, (LPARAM)lpPoint)); - } - - DWORD ApproximateViewRect(int cx = -1, int cy = -1, int nCount = -1) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, LVM_APPROXIMATEVIEWRECT, nCount, MAKELPARAM(cx, cy)); - } - - int SubItemHitTest(LPLVHITTESTINFO lpInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, 0, (LPARAM)lpInfo); - } - - int AddColumn(LPCTSTR strItem, int nItem, int nSubItem = -1, - int nMask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM, - int nFmt = LVCFMT_LEFT) - { - const int cxOffset = 15; - ATLASSERT(::IsWindow(m_hWnd)); - LVCOLUMN lvc = { 0 }; - lvc.mask = nMask; - lvc.fmt = nFmt; - lvc.pszText = (LPTSTR)strItem; - lvc.cx = GetStringWidth(lvc.pszText) + cxOffset; - if(nMask & LVCF_SUBITEM) - lvc.iSubItem = (nSubItem != -1) ? nSubItem : nItem; - return InsertColumn(nItem, &lvc); - } - - int AddItem(int nItem, int nSubItem, LPCTSTR strItem, int nImageIndex = -1) - { - ATLASSERT(::IsWindow(m_hWnd)); - LVITEM lvItem = { 0 }; - lvItem.mask = LVIF_TEXT; - lvItem.iItem = nItem; - lvItem.iSubItem = nSubItem; - lvItem.pszText = (LPTSTR)strItem; - if(nImageIndex != -1) - { - lvItem.mask |= LVIF_IMAGE; - lvItem.iImage = nImageIndex; - } - if(nSubItem == 0) - return InsertItem(&lvItem); - return SetItem(&lvItem) ? nItem : -1; - } - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - BOOL SortItemsEx(PFNLVCOMPARE pfnCompare, LPARAM lParamSort) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SORTITEMSEX, (WPARAM)lParamSort, (LPARAM)pfnCompare); - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -#if (_WIN32_WINNT >= 0x0501) - int InsertGroup(int nItem, PLVGROUP pGroup) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_INSERTGROUP, nItem, (LPARAM)pGroup); - } - - int AddGroup(PLVGROUP pGroup) - { - return InsertGroup(-1, pGroup); - } - - int RemoveGroup(int nGroupID) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_REMOVEGROUP, nGroupID, 0L); - } - - void MoveGroup(int nGroupID, int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_MOVEGROUP, nGroupID, nItem); - } - - void MoveItemToGroup(int nItem, int nGroupID) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_MOVEITEMTOGROUP, nItem, nGroupID); - } - - int EnableGroupView(BOOL bEnable) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_ENABLEGROUPVIEW, bEnable, 0L); - } - - int SortGroups(PFNLVGROUPCOMPARE pCompareFunc, LPVOID lpVoid = NULL) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_SORTGROUPS, (WPARAM)pCompareFunc, (LPARAM)lpVoid); - } - - void InsertGroupSorted(PLVINSERTGROUPSORTED pInsertGroupSorted) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_INSERTGROUPSORTED, (WPARAM)pInsertGroupSorted, 0L); - } - - void RemoveAllGroups() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_REMOVEALLGROUPS, 0, 0L); - } - - BOOL HasGroup(int nGroupID) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_HASGROUP, nGroupID, 0L); - } - - BOOL InsertMarkHitTest(LPPOINT lpPoint, LPLVINSERTMARK pInsertMark) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)pInsertMark); - } - - BOOL SetInfoTip(PLVSETINFOTIP pSetInfoTip) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LVM_SETINFOTIP, 0, (LPARAM)pSetInfoTip); - } - - void CancelEditLabel() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, LVM_CANCELEDITLABEL, 0, 0L); - } - - UINT MapIndexToID(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, LVM_MAPINDEXTOID, nIndex, 0L); - } - - int MapIDToIndex(UINT uID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_MAPIDTOINDEX, uID, 0L); - } -#endif // (_WIN32_WINNT >= 0x0501) - -#if (_WIN32_WINNT >= 0x0600) - int HitTestEx(LPLVHITTESTINFO lpHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo); - } - - int HitTestEx(POINT pt, UINT* pFlags) const - { - ATLASSERT(::IsWindow(m_hWnd)); - LVHITTESTINFO hti = { 0 }; - hti.pt = pt; - int nRes = (int)::SendMessage(m_hWnd, LVM_HITTEST, (WPARAM)-1, (LPARAM)&hti); - if (pFlags != NULL) - *pFlags = hti.flags; - return nRes; - } - - int SubItemHitTestEx(LPLVHITTESTINFO lpHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LVM_SUBITEMHITTEST, (WPARAM)-1, (LPARAM)lpHitTestInfo); - } -#endif // (_WIN32_WINNT >= 0x0600) - - // Note: selects only one item - BOOL SelectItem(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - - // multi-selection only: de-select all items - if((GetStyle() & LVS_SINGLESEL) == 0) - SetItemState(-1, 0, LVIS_SELECTED); - - BOOL bRet = SetItemState(nIndex, LVIS_SELECTED | LVIS_FOCUSED, LVIS_SELECTED | LVIS_FOCUSED); - if(bRet) - bRet = EnsureVisible(nIndex, FALSE); - - return bRet; - } -}; - -typedef CListViewCtrlT CListViewCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CTreeViewCtrl - -template -class CTreeViewCtrlT : public TBase -{ -public: -// Constructors - CTreeViewCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CTreeViewCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_TREEVIEW; - } - - UINT GetCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, TVM_GETCOUNT, 0, 0L); - } - - UINT GetIndent() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, TVM_GETINDENT, 0, 0L); - } - - void SetIndent(UINT nIndent) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TVM_SETINDENT, nIndent, 0L); - } - - CImageList GetImageList(int nImageListType = TVSIL_NORMAL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_GETIMAGELIST, (WPARAM)nImageListType, 0L)); - } - - CImageList SetImageList(HIMAGELIST hImageList, int nImageListType = TVSIL_NORMAL) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageListType, (LPARAM)hImageList)); - } - - BOOL GetItem(LPTVITEM pItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem); - } - - BOOL SetItem(LPTVITEM pItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem); - } - - BOOL SetItem(HTREEITEM hItem, UINT nMask, LPCTSTR lpszItem, int nImage, - int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - TVITEM item = { 0 }; - item.hItem = hItem; - item.mask = nMask; - item.pszText = (LPTSTR) lpszItem; - item.iImage = nImage; - item.iSelectedImage = nSelectedImage; - item.state = nState; - item.stateMask = nStateMask; - item.lParam = lParam; - return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)&item); - } - - BOOL GetItemText(HTREEITEM hItem, LPTSTR lpstrText, int nLen) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpstrText != NULL); - - TVITEM item = { 0 }; - item.hItem = hItem; - item.mask = TVIF_TEXT; - item.pszText = lpstrText; - item.cchTextMax = nLen; - - return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); - } - -#ifndef _ATL_NO_COM - BOOL GetItemText(HTREEITEM hItem, BSTR& bstrText) const - { - USES_CONVERSION; - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(bstrText == NULL); - TVITEM item = { 0 }; - item.hItem = hItem; - item.mask = TVIF_TEXT; - - LPTSTR lpstrText = NULL; - BOOL bRet = FALSE; - for(int nLen = 256; ; nLen *= 2) - { - ATLTRY(lpstrText = new TCHAR[nLen]); - if(lpstrText == NULL) - break; - lpstrText[0] = NULL; - item.pszText = lpstrText; - item.cchTextMax = nLen; - bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); - if(!bRet || (lstrlen(item.pszText) < nLen - 1)) - break; - delete [] lpstrText; - lpstrText = NULL; - } - - if(lpstrText != NULL) - { - if(bRet) - bstrText = ::SysAllocString(T2OLE(lpstrText)); - delete [] lpstrText; - } - - return (bstrText != NULL) ? TRUE : FALSE; - } -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - BOOL GetItemText(HTREEITEM hItem, _CSTRING_NS::CString& strText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TVITEM item = { 0 }; - item.hItem = hItem; - item.mask = TVIF_TEXT; - - strText.Empty(); - BOOL bRet = FALSE; - for(int nLen = 256; ; nLen *= 2) - { - item.pszText = strText.GetBufferSetLength(nLen); - if(item.pszText == NULL) - { - bRet = FALSE; - break; - } - item.cchTextMax = nLen; - bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); - if(!bRet || (lstrlen(item.pszText) < nLen - 1)) - break; - } - strText.ReleaseBuffer(); - return bRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - BOOL SetItemText(HTREEITEM hItem, LPCTSTR lpszItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItem(hItem, TVIF_TEXT, lpszItem, 0, 0, 0, 0, NULL); - } - - BOOL GetItemImage(HTREEITEM hItem, int& nImage, int& nSelectedImage) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TVITEM item = { 0 }; - item.hItem = hItem; - item.mask = TVIF_IMAGE|TVIF_SELECTEDIMAGE; - BOOL bRes = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); - if (bRes) - { - nImage = item.iImage; - nSelectedImage = item.iSelectedImage; - } - return bRes; - } - - BOOL SetItemImage(HTREEITEM hItem, int nImage, int nSelectedImage) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItem(hItem, TVIF_IMAGE|TVIF_SELECTEDIMAGE, NULL, nImage, nSelectedImage, 0, 0, NULL); - } - - UINT GetItemState(HTREEITEM hItem, UINT nStateMask) const - { - ATLASSERT(::IsWindow(m_hWnd)); -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - return (((UINT)::SendMessage(m_hWnd, TVM_GETITEMSTATE, (WPARAM)hItem, (LPARAM)nStateMask)) & nStateMask); -#else // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)) - TVITEM item = { 0 }; - item.hItem = hItem; - item.mask = TVIF_STATE; - item.state = 0; - item.stateMask = nStateMask; - ::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); - return (item.state & nStateMask); -#endif // !((_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE)) - } - - BOOL SetItemState(HTREEITEM hItem, UINT nState, UINT nStateMask) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItem(hItem, TVIF_STATE, NULL, 0, 0, nState, nStateMask, NULL); - } - - DWORD_PTR GetItemData(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TVITEM item = { 0 }; - item.hItem = hItem; - item.mask = TVIF_PARAM; - BOOL bRet = (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); - return (DWORD_PTR)(bRet ? item.lParam : NULL); - } - - BOOL SetItemData(HTREEITEM hItem, DWORD_PTR dwData) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItem(hItem, TVIF_PARAM, NULL, 0, 0, 0, 0, (LPARAM)dwData); - } - - CEdit GetEditControl() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CEdit((HWND)::SendMessage(m_hWnd, TVM_GETEDITCONTROL, 0, 0L)); - } - - UINT GetVisibleCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, TVM_GETVISIBLECOUNT, 0, 0L); - } - - BOOL GetItemRect(HTREEITEM hItem, LPRECT lpRect, BOOL bTextOnly) const - { - ATLASSERT(::IsWindow(m_hWnd)); - *(HTREEITEM*)lpRect = hItem; - return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMRECT, (WPARAM)bTextOnly, (LPARAM)lpRect); - } - - BOOL ItemHasChildren(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TVITEM item = { 0 }; - item.hItem = hItem; - item.mask = TVIF_CHILDREN; - ::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)&item); - return item.cChildren; - } - -#ifndef _WIN32_WCE - CToolTipCtrl GetToolTips() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_GETTOOLTIPS, 0, 0L)); - } - - CToolTipCtrl SetToolTips(HWND hWndTT) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TVM_SETTOOLTIPS, (WPARAM)hWndTT, 0L)); - } -#endif // !_WIN32_WCE - - int GetISearchString(LPTSTR lpstr) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TVM_GETISEARCHSTRING, 0, (LPARAM)lpstr); - } - - // checkboxes only - BOOL GetCheckState(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & TVS_CHECKBOXES) != 0); - UINT uRet = GetItemState(hItem, TVIS_STATEIMAGEMASK); - return (uRet >> 12) - 1; - } - - BOOL SetCheckState(HTREEITEM hItem, BOOL bCheck) - { - int nCheck = bCheck ? 2 : 1; // one based index - return SetItemState(hItem, INDEXTOSTATEIMAGEMASK(nCheck), TVIS_STATEIMAGEMASK); - } - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - COLORREF GetBkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TVM_GETBKCOLOR, 0, 0L); - } - - COLORREF SetBkColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TVM_SETBKCOLOR, 0, (LPARAM)clr); - } - - COLORREF GetInsertMarkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TVM_GETINSERTMARKCOLOR, 0, 0L); - } - - COLORREF SetInsertMarkColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TVM_SETINSERTMARKCOLOR, 0, (LPARAM)clr); - } - - int GetItemHeight() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TVM_GETITEMHEIGHT, 0, 0L); - } - - int SetItemHeight(int cyHeight) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TVM_SETITEMHEIGHT, cyHeight, 0L); - } - - int GetScrollTime() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TVM_GETSCROLLTIME, 0, 0L); - } - - int SetScrollTime(int nScrollTime) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TVM_SETSCROLLTIME, nScrollTime, 0L); - } - - COLORREF GetTextColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TVM_GETTEXTCOLOR, 0, 0L); - } - - COLORREF SetTextColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TVM_SETTEXTCOLOR, 0, (LPARAM)clr); - } - - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - COLORREF GetLineColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TVM_GETLINECOLOR, 0, 0L); - } - - COLORREF SetLineColor(COLORREF clrNew /*= CLR_DEFAULT*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TVM_SETLINECOLOR, 0, (LPARAM)clrNew); - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - BOOL GetItem(LPTVITEMEX pItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_GETITEM, 0, (LPARAM)pItem); - } - - BOOL SetItem(LPTVITEMEX pItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SETITEM, 0, (LPARAM)pItem); - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - - DWORD GetExtendedStyle() const - { -#ifndef TVM_GETEXTENDEDSTYLE - const UINT TVM_GETEXTENDEDSTYLE = (TV_FIRST + 45); -#endif - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TVM_GETEXTENDEDSTYLE, 0, 0L); - } - - DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask) - { -#ifndef TVM_SETEXTENDEDSTYLE - const UINT TVM_SETEXTENDEDSTYLE = (TV_FIRST + 44); -#endif - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TVM_SETEXTENDEDSTYLE, dwMask, dwStyle); - } - -#if (_WIN32_WINNT >= 0x0600) - BOOL SetAutoScrollInfo(UINT uPixPerSec, UINT uUpdateTime) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SETAUTOSCROLLINFO, (WPARAM)uPixPerSec, (LPARAM)uUpdateTime); - } - - DWORD GetSelectedCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TVM_GETSELECTEDCOUNT, 0, 0L); - } - - BOOL GetItemPartRect(HTREEITEM hItem, TVITEMPART partID, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TVGETITEMPARTRECTINFO gipri = { hItem, lpRect, partID }; - return (BOOL)::SendMessage(m_hWnd, TVM_GETITEMPARTRECT, 0, (LPARAM)&gipri); - } -#endif // (_WIN32_WINNT >= 0x0600) - -// Operations - HTREEITEM InsertItem(LPTVINSERTSTRUCT lpInsertStruct) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct); - } - - HTREEITEM InsertItem(LPCTSTR lpszItem, int nImage, - int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter) - { - ATLASSERT(::IsWindow(m_hWnd)); - return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter); - } - - HTREEITEM InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter) - { - ATLASSERT(::IsWindow(m_hWnd)); - return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter); - } - - HTREEITEM InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, - int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, - HTREEITEM hParent, HTREEITEM hInsertAfter) - { - ATLASSERT(::IsWindow(m_hWnd)); - TVINSERTSTRUCT tvis = { 0 }; - tvis.hParent = hParent; - tvis.hInsertAfter = hInsertAfter; - tvis.item.mask = nMask; - tvis.item.pszText = (LPTSTR) lpszItem; - tvis.item.iImage = nImage; - tvis.item.iSelectedImage = nSelectedImage; - tvis.item.state = nState; - tvis.item.stateMask = nStateMask; - tvis.item.lParam = lParam; - return (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis); - } - - BOOL DeleteItem(HTREEITEM hItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)hItem); - } - - BOOL DeleteAllItems() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_DELETEITEM, 0, (LPARAM)TVI_ROOT); - } - - BOOL Expand(HTREEITEM hItem, UINT nCode = TVE_EXPAND) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_EXPAND, nCode, (LPARAM)hItem); - } - - HTREEITEM GetNextItem(HTREEITEM hItem, UINT nCode) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem); - } - - HTREEITEM GetChildItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem); - } - - HTREEITEM GetNextSiblingItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem); - } - - HTREEITEM GetPrevSiblingItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem); - } - - HTREEITEM GetParentItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem); - } - - HTREEITEM GetFirstVisibleItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L); - } - - HTREEITEM GetNextVisibleItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem); - } - - HTREEITEM GetPrevVisibleItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem); - } - - HTREEITEM GetSelectedItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L); - } - - HTREEITEM GetDropHilightItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L); - } - - HTREEITEM GetRootItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L); - } - -#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) - HTREEITEM GetLastVisibleItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L); - } -#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0600) - HTREEITEM GetNextSelectedItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L); - } -#endif // (_WIN32_IE >= 0x0600) - - BOOL Select(HTREEITEM hItem, UINT nCode) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, nCode, (LPARAM)hItem); - } - - BOOL SelectItem(HTREEITEM hItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_CARET, (LPARAM)hItem); - } - - BOOL SelectDropTarget(HTREEITEM hItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_DROPHILITE, (LPARAM)hItem); - } - - BOOL SelectSetFirstVisible(HTREEITEM hItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SELECTITEM, TVGN_FIRSTVISIBLE, (LPARAM)hItem); - } - - CEdit EditLabel(HTREEITEM hItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CEdit((HWND)::SendMessage(m_hWnd, TVM_EDITLABEL, 0, (LPARAM)hItem)); - } - - BOOL EndEditLabelNow(BOOL bCancel) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_ENDEDITLABELNOW, bCancel, 0L); - } - - HTREEITEM HitTest(TVHITTESTINFO* pHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo); - } - - HTREEITEM HitTest(POINT pt, UINT* pFlags) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TVHITTESTINFO hti = { 0 }; - hti.pt = pt; - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti); - if (pFlags != NULL) - *pFlags = hti.flags; - return hTreeItem; - } - - BOOL SortChildren(HTREEITEM hItem, BOOL bRecurse = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDREN, (WPARAM)bRecurse, (LPARAM)hItem); - } - - BOOL EnsureVisible(HTREEITEM hItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_ENSUREVISIBLE, 0, (LPARAM)hItem); - } - - BOOL SortChildrenCB(LPTVSORTCB pSort, BOOL bRecurse = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SORTCHILDRENCB, (WPARAM)bRecurse, (LPARAM)pSort); - } - - CImageList RemoveImageList(int nImageList) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_SETIMAGELIST, (WPARAM)nImageList, NULL)); - } - - CImageList CreateDragImage(HTREEITEM hItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TVM_CREATEDRAGIMAGE, 0, (LPARAM)hItem)); - } - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - BOOL SetInsertMark(HTREEITEM hTreeItem, BOOL bAfter) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, bAfter, (LPARAM)hTreeItem); - } - - BOOL RemoveInsertMark() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TVM_SETINSERTMARK, 0, 0L); - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -#if (_WIN32_WINNT >= 0x0501) - HTREEITEM MapAccIDToHTREEITEM(UINT uID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L); - } - - UINT MapHTREEITEMToAccID(HTREEITEM hTreeItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, TVM_MAPHTREEITEMTOACCID, (WPARAM)hTreeItem, 0L); - } -#endif // (_WIN32_WINNT >= 0x0501) - -#if (_WIN32_WINNT >= 0x0600) - void ShowInfoTip(HTREEITEM hItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TVM_SHOWINFOTIP, 0, (LPARAM)hItem); - } -#endif // (_WIN32_WINNT >= 0x0600) -}; - -typedef CTreeViewCtrlT CTreeViewCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CTreeViewCtrlEx - -// forward declaration -template class CTreeViewCtrlExT; - -// Note: TBase here is for CTreeViewCtrlExT, and not for CTreeItemT itself -template -class CTreeItemT -{ -public: - HTREEITEM m_hTreeItem; - CTreeViewCtrlExT* m_pTreeView; - -// Construction - CTreeItemT(HTREEITEM hTreeItem = NULL, CTreeViewCtrlExT* pTreeView = NULL) : m_hTreeItem(hTreeItem), m_pTreeView(pTreeView) - { } - - CTreeItemT(const CTreeItemT& posSrc) - { - *this = posSrc; - } - - operator HTREEITEM() { return m_hTreeItem; } - - CTreeItemT& operator =(const CTreeItemT& itemSrc) - { - m_hTreeItem = itemSrc.m_hTreeItem; - m_pTreeView = itemSrc.m_pTreeView; - return *this; - } - -// Attributes - CTreeViewCtrlExT* GetTreeView() const { return m_pTreeView; } - - BOOL operator !() const { return m_hTreeItem == NULL; } - - BOOL IsNull() const { return m_hTreeItem == NULL; } - - BOOL GetRect(LPRECT lpRect, BOOL bTextOnly) const; - BOOL GetText(LPTSTR lpstrText, int nLen) const; -#ifndef _ATL_NO_COM - BOOL GetText(BSTR& bstrText) const; -#endif // !_ATL_NO_COM -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - BOOL GetText(_CSTRING_NS::CString& strText) const; -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - BOOL SetText(LPCTSTR lpszItem); - BOOL GetImage(int& nImage, int& nSelectedImage) const; - BOOL SetImage(int nImage, int nSelectedImage); - UINT GetState(UINT nStateMask) const; - BOOL SetState(UINT nState, UINT nStateMask); - DWORD_PTR GetData() const; - BOOL SetData(DWORD_PTR dwData); - BOOL SetItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam); - -// Operations - CTreeItemT InsertAfter(LPCTSTR lpstrItem, HTREEITEM hItemAfter, int nImageIndex) - { - return _Insert(lpstrItem, nImageIndex, hItemAfter); - } - - CTreeItemT AddHead(LPCTSTR lpstrItem, int nImageIndex) - { - return _Insert(lpstrItem, nImageIndex, TVI_FIRST); - } - - CTreeItemT AddTail(LPCTSTR lpstrItem, int nImageIndex) - { - return _Insert(lpstrItem, nImageIndex, TVI_LAST); - } - - CTreeItemT GetChild() const; - CTreeItemT GetNext(UINT nCode) const; - CTreeItemT GetNextSibling() const; - CTreeItemT GetPrevSibling() const; - CTreeItemT GetParent() const; - CTreeItemT GetFirstVisible() const; - CTreeItemT GetNextVisible() const; - CTreeItemT GetPrevVisible() const; - CTreeItemT GetSelected() const; - CTreeItemT GetDropHilight() const; - CTreeItemT GetRoot() const; -#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) - CTreeItemT GetLastVisible() const; -#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) -#if (_WIN32_IE >= 0x0600) - CTreeItemT GetNextSelected() const; -#endif // (_WIN32_IE >= 0x0600) - BOOL HasChildren() const; - BOOL Delete(); - BOOL Expand(UINT nCode = TVE_EXPAND); - BOOL Select(UINT nCode); - BOOL Select(); - BOOL SelectDropTarget(); - BOOL SelectSetFirstVisible(); - HWND EditLabel(); - HIMAGELIST CreateDragImage(); - BOOL SortChildren(BOOL bRecurse = FALSE); - BOOL EnsureVisible(); - CTreeItemT _Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter); - int GetImageIndex() const; -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - BOOL SetInsertMark(BOOL bAfter); -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) -#if (_WIN32_WINNT >= 0x0501) - UINT MapHTREEITEMToAccID() const; -#endif // (_WIN32_WINNT >= 0x0501) -#if (_WIN32_WINNT >= 0x0600) - void ShowInfoTip(); - BOOL GetPartRect(TVITEMPART partID, LPRECT lpRect) const; -#endif // (_WIN32_WINNT >= 0x0600) -}; - -typedef CTreeItemT CTreeItem; - - -template -class CTreeViewCtrlExT : public CTreeViewCtrlT< TBase > -{ -public: -// Constructors - CTreeViewCtrlExT(HWND hWnd = NULL) : CTreeViewCtrlT< TBase >(hWnd) - { } - - CTreeViewCtrlExT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Operations (overides that return CTreeItem) - CTreeItemT InsertItem(LPTVINSERTSTRUCT lpInsertStruct) - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)lpInsertStruct); - return CTreeItemT(hTreeItem, this); - } - - CTreeItemT InsertItem(LPCTSTR lpszItem, int nImage, - int nSelectedImage, HTREEITEM hParent, HTREEITEM hInsertAfter) - { - ATLASSERT(::IsWindow(m_hWnd)); - return InsertItem(TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE, lpszItem, nImage, nSelectedImage, 0, 0, 0, hParent, hInsertAfter); - } - - CTreeItemT InsertItem(LPCTSTR lpszItem, HTREEITEM hParent, HTREEITEM hInsertAfter) - { - ATLASSERT(::IsWindow(m_hWnd)); - return InsertItem(TVIF_TEXT, lpszItem, 0, 0, 0, 0, 0, hParent, hInsertAfter); - } - - CTreeItemT GetNextItem(HTREEITEM hItem, UINT nCode) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, nCode, (LPARAM)hItem); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetChildItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CHILD, (LPARAM)hItem); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetNextSiblingItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXT, (LPARAM)hItem); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetPrevSiblingItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUS, (LPARAM)hItem); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetParentItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PARENT, (LPARAM)hItem); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetFirstVisibleItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_FIRSTVISIBLE, 0L); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetNextVisibleItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTVISIBLE, (LPARAM)hItem); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetPrevVisibleItem(HTREEITEM hItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_PREVIOUSVISIBLE, (LPARAM)hItem); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetSelectedItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_CARET, 0L); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetDropHilightItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_DROPHILITE, 0L); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT GetRootItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_ROOT, 0L); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - -#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) - CTreeItemT GetLastVisibleItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_LASTVISIBLE, 0L); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } -#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0600) - CTreeItemT GetNextSelectedItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_GETNEXTITEM, TVGN_NEXTSELECTED, 0L); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } -#endif // (_WIN32_IE >= 0x0600) - - CTreeItemT HitTest(TVHITTESTINFO* pHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)pHitTestInfo); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - - CTreeItemT InsertItem(UINT nMask, LPCTSTR lpszItem, int nImage, - int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam, - HTREEITEM hParent, HTREEITEM hInsertAfter) - { - ATLASSERT(::IsWindow(m_hWnd)); - TVINSERTSTRUCT tvis = { 0 }; - tvis.hParent = hParent; - tvis.hInsertAfter = hInsertAfter; - tvis.item.mask = nMask; - tvis.item.pszText = (LPTSTR) lpszItem; - tvis.item.iImage = nImage; - tvis.item.iSelectedImage = nSelectedImage; - tvis.item.state = nState; - tvis.item.stateMask = nStateMask; - tvis.item.lParam = lParam; - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_INSERTITEM, 0, (LPARAM)&tvis); - return CTreeItemT(hTreeItem, this); - } - - CTreeItemT HitTest(POINT pt, UINT* pFlags) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TVHITTESTINFO hti = { 0 }; - hti.pt = pt; - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_HITTEST, 0, (LPARAM)&hti); - if (pFlags != NULL) - *pFlags = hti.flags; - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } - -#if (_WIN32_WINNT >= 0x0501) - CTreeItemT MapAccIDToHTREEITEM(UINT uID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - HTREEITEM hTreeItem = (HTREEITEM)::SendMessage(m_hWnd, TVM_MAPACCIDTOHTREEITEM, uID, 0L); - return CTreeItemT(hTreeItem, (CTreeViewCtrlExT*)this); - } -#endif // (_WIN32_WINNT >= 0x0501) -}; - -typedef CTreeViewCtrlExT CTreeViewCtrlEx; - - -// CTreeItem inline methods -template -inline BOOL CTreeItemT::GetRect(LPRECT lpRect, BOOL bTextOnly) const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetItemRect(m_hTreeItem,lpRect,bTextOnly); -} - -template -inline CTreeItemT CTreeItemT::GetNext(UINT nCode) const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetNextItem(m_hTreeItem,nCode); -} - -template -inline CTreeItemT CTreeItemT::GetChild() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetChildItem(m_hTreeItem); -} - -template -inline CTreeItemT CTreeItemT::GetNextSibling() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetNextSiblingItem(m_hTreeItem); -} - -template -inline CTreeItemT CTreeItemT::GetPrevSibling() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetPrevSiblingItem(m_hTreeItem); -} - -template -inline CTreeItemT CTreeItemT::GetParent() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetParentItem(m_hTreeItem); -} - -template -inline CTreeItemT CTreeItemT::GetFirstVisible() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetFirstVisibleItem(); -} - -template -inline CTreeItemT CTreeItemT::GetNextVisible() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetNextVisibleItem(m_hTreeItem); -} - -template -inline CTreeItemT CTreeItemT::GetPrevVisible() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetPrevVisibleItem(m_hTreeItem); -} - -template -inline CTreeItemT CTreeItemT::GetSelected() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetSelectedItem(); -} - -template -inline CTreeItemT CTreeItemT::GetDropHilight() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetDropHilightItem(); -} - -template -inline CTreeItemT CTreeItemT::GetRoot() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetRootItem(); -} - -#if !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) -template -inline CTreeItemT CTreeItemT::GetLastVisible() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetLastVisibleItem(); -} -#endif // !defined(_WIN32_WCE) && (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0600) -template -inline CTreeItemT CTreeItemT::GetNextSelected() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetNextSelectedItem(); -} -#endif // (_WIN32_IE >= 0x0600) - -template -inline BOOL CTreeItemT::GetText(LPTSTR lpstrText, int nLen) const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetItemText(m_hTreeItem, lpstrText, nLen); -} - -#ifndef _ATL_NO_COM -#ifdef _OLEAUTO_H_ -template -inline BOOL CTreeItemT::GetText(BSTR& bstrText) const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetItemText(m_hTreeItem, bstrText); -} -#endif // _OLEAUTO_H_ -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) -template -inline BOOL CTreeItemT::GetText(_CSTRING_NS::CString& strText) const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetItemText(m_hTreeItem, strText); -} -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - -template -inline BOOL CTreeItemT::GetImage(int& nImage, int& nSelectedImage) const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetItemImage(m_hTreeItem,nImage,nSelectedImage); -} - -template -inline UINT CTreeItemT::GetState(UINT nStateMask) const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetItemState(m_hTreeItem,nStateMask); -} - -template -inline DWORD_PTR CTreeItemT::GetData() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetItemData(m_hTreeItem); -} - -template -inline BOOL CTreeItemT::SetItem(UINT nMask, LPCTSTR lpszItem, int nImage, - int nSelectedImage, UINT nState, UINT nStateMask, LPARAM lParam) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SetItem(m_hTreeItem, nMask, lpszItem, nImage, nSelectedImage, nState, nStateMask, lParam); -} - -template -inline BOOL CTreeItemT::SetText(LPCTSTR lpszItem) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SetItemText(m_hTreeItem,lpszItem); -} - -template -inline BOOL CTreeItemT::SetImage(int nImage, int nSelectedImage) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SetItemImage(m_hTreeItem,nImage,nSelectedImage); -} - -template -inline BOOL CTreeItemT::SetState(UINT nState, UINT nStateMask) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SetItemState(m_hTreeItem,nState,nStateMask); -} - -template -inline BOOL CTreeItemT::SetData(DWORD_PTR dwData) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SetItemData(m_hTreeItem,dwData); -} - -template -inline BOOL CTreeItemT::HasChildren() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->ItemHasChildren(m_hTreeItem); -} - -template -inline BOOL CTreeItemT::Delete() -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->DeleteItem(m_hTreeItem); -} - -template -inline BOOL CTreeItemT::Expand(UINT nCode /*= TVE_EXPAND*/) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->Expand(m_hTreeItem,nCode); -} - -template -inline BOOL CTreeItemT::Select(UINT nCode) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->Select(m_hTreeItem,nCode); -} - -template -inline BOOL CTreeItemT::Select() -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SelectItem(m_hTreeItem); -} - -template -inline BOOL CTreeItemT::SelectDropTarget() -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SelectDropTarget(m_hTreeItem); -} - -template -inline BOOL CTreeItemT::SelectSetFirstVisible() -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SelectSetFirstVisible(m_hTreeItem); -} - -template -inline HWND CTreeItemT::EditLabel() -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->EditLabel(m_hTreeItem); -} - -template -inline HIMAGELIST CTreeItemT::CreateDragImage() -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->CreateDragImage(m_hTreeItem); -} - -template -inline BOOL CTreeItemT::SortChildren(BOOL bRecurse /*= FALSE*/) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SortChildren(m_hTreeItem, bRecurse); -} - -template -inline BOOL CTreeItemT::EnsureVisible() -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->EnsureVisible(m_hTreeItem); -} - -template -inline CTreeItemT CTreeItemT::_Insert(LPCTSTR lpstrItem, int nImageIndex, HTREEITEM hItemAfter) -{ - ATLASSERT(m_pTreeView != NULL); - TVINSERTSTRUCT ins = { 0 }; - ins.hParent = m_hTreeItem; - ins.hInsertAfter = hItemAfter; - ins.item.mask = TVIF_TEXT; - ins.item.pszText = (LPTSTR)lpstrItem; - if(nImageIndex != -1) - { - ins.item.mask |= TVIF_IMAGE | TVIF_SELECTEDIMAGE; - ins.item.iImage = nImageIndex; - ins.item.iSelectedImage = nImageIndex; - } - return CTreeItemT(m_pTreeView->InsertItem(&ins), m_pTreeView); -} - -template -inline int CTreeItemT::GetImageIndex() const -{ - ATLASSERT(m_pTreeView != NULL); - TVITEM item = { 0 }; - item.mask = TVIF_HANDLE | TVIF_IMAGE; - item.hItem = m_hTreeItem; - m_pTreeView->GetItem(&item); - return item.iImage; -} - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) -template -inline BOOL CTreeItemT::SetInsertMark(BOOL bAfter) -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->SetInsertMark(m_hTreeItem, bAfter); -} -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -#if (_WIN32_WINNT >= 0x0501) -template -inline UINT CTreeItemT::MapHTREEITEMToAccID() const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->MapHTREEITEMToAccID(m_hTreeItem); -} -#endif // (_WIN32_WINNT >= 0x0501) - -#if (_WIN32_WINNT >= 0x0600) -template -inline void CTreeItemT::ShowInfoTip() -{ - ATLASSERT(m_pTreeView != NULL); - m_pTreeView->ShowInfoTip(m_hTreeItem); -} - -template -inline BOOL CTreeItemT::GetPartRect(TVITEMPART partID, LPRECT lpRect) const -{ - ATLASSERT(m_pTreeView != NULL); - return m_pTreeView->GetItemPartRect(m_hTreeItem, partID, lpRect); -} -#endif // (_WIN32_WINNT >= 0x0600) - - -/////////////////////////////////////////////////////////////////////////////// -// CToolBarCtrl - -template -class CToolBarCtrlT : public TBase -{ -public: -// Construction - CToolBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CToolBarCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return TOOLBARCLASSNAME; - } - - BOOL IsButtonEnabled(int nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONENABLED, nID, 0L); - } - - BOOL IsButtonChecked(int nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONCHECKED, nID, 0L); - } - - BOOL IsButtonPressed(int nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONPRESSED, nID, 0L); - } - - BOOL IsButtonHidden(int nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return(BOOL) ::SendMessage(m_hWnd, TB_ISBUTTONHIDDEN, nID, 0L); - } - - BOOL IsButtonIndeterminate(int nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONINDETERMINATE, nID, 0L); - } - - int GetState(int nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_GETSTATE, nID, 0L); - } - - BOOL SetState(int nID, UINT nState) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETSTATE, nID, MAKELPARAM(nState, 0)); - } - - BOOL GetButton(int nIndex, LPTBBUTTON lpButton) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_GETBUTTON, nIndex, (LPARAM)lpButton); - } - - int GetButtonCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_BUTTONCOUNT, 0, 0L); - } - - BOOL GetItemRect(int nIndex, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_GETITEMRECT, nIndex, (LPARAM)lpRect); - } - - void SetButtonStructSize(int nSize = sizeof(TBBUTTON)) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_BUTTONSTRUCTSIZE, nSize, 0L); - } - - BOOL SetButtonSize(SIZE size) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(size.cx, size.cy)); - } - - BOOL SetButtonSize(int cx, int cy) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONSIZE, 0, MAKELPARAM(cx, cy)); - } - - BOOL SetBitmapSize(SIZE size) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(size.cx, size.cy)); - } - - BOOL SetBitmapSize(int cx, int cy) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETBITMAPSIZE, 0, MAKELPARAM(cx, cy)); - } - -#ifndef _WIN32_WCE - CToolTipCtrl GetToolTips() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TB_GETTOOLTIPS, 0, 0L)); - } - - void SetToolTips(HWND hWndToolTip) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L); - } -#endif // !_WIN32_WCE - - void SetNotifyWnd(HWND hWnd) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_SETPARENT, (WPARAM)hWnd, 0L); - } - - int GetRows() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_GETROWS, 0, 0L); - } - - void SetRows(int nRows, BOOL bLarger, LPRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_SETROWS, MAKELPARAM(nRows, bLarger), (LPARAM)lpRect); - } - - BOOL SetCmdID(int nIndex, UINT nID) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETCMDID, nIndex, nID); - } - - DWORD GetBitmapFlags() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TB_GETBITMAPFLAGS, 0, 0L); - } - - int GetBitmap(int nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_GETBITMAP, nID, 0L); - } - - int GetButtonText(int nID, LPTSTR lpstrText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_GETBUTTONTEXT, nID, (LPARAM)lpstrText); - } - - // nIndex - IE5 or higher only - CImageList GetImageList(int nIndex = 0) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETIMAGELIST, nIndex, 0L)); - } - - // nIndex - IE5 or higher only - CImageList SetImageList(HIMAGELIST hImageList, int nIndex = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETIMAGELIST, nIndex, (LPARAM)hImageList)); - } - - // nIndex - IE5 or higher only - CImageList GetDisabledImageList(int nIndex = 0) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETDISABLEDIMAGELIST, nIndex, 0L)); - } - - // nIndex - IE5 or higher only - CImageList SetDisabledImageList(HIMAGELIST hImageList, int nIndex = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETDISABLEDIMAGELIST, nIndex, (LPARAM)hImageList)); - } - -#ifndef _WIN32_WCE - // nIndex - IE5 or higher only - CImageList GetHotImageList(int nIndex = 0) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETHOTIMAGELIST, nIndex, 0L)); - } - - // nIndex - IE5 or higher only - CImageList SetHotImageList(HIMAGELIST hImageList, int nIndex = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETHOTIMAGELIST, nIndex, (LPARAM)hImageList)); - } -#endif // !_WIN32_WCE - - DWORD GetStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TB_GETSTYLE, 0, 0L); - } - - void SetStyle(DWORD dwStyle) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_SETSTYLE, 0, dwStyle); - } - - DWORD GetButtonSize() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L); - } - - void GetButtonSize(SIZE& size) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETBUTTONSIZE, 0, 0L); - size.cx = LOWORD(dwRet); - size.cy = HIWORD(dwRet); - } - - BOOL GetRect(int nID, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_GETRECT, nID, (LPARAM)lpRect); - } - - int GetTextRows() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_GETTEXTROWS, 0, 0L); - } - - BOOL SetButtonWidth(int cxMin, int cxMax) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONWIDTH, 0, MAKELPARAM(cxMin, cxMax)); - } - - BOOL SetIndent(int nIndent) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETINDENT, nIndent, 0L); - } - - BOOL SetMaxTextRows(int nMaxTextRows) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETMAXTEXTROWS, nMaxTextRows, 0L); - } - -#if (_WIN32_IE >= 0x0400) -#ifndef _WIN32_WCE - BOOL GetAnchorHighlight() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_GETANCHORHIGHLIGHT, 0, 0L); - } - - BOOL SetAnchorHighlight(BOOL bEnable = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETANCHORHIGHLIGHT, bEnable, 0L); - } -#endif // !_WIN32_WCE - - int GetButtonInfo(int nID, LPTBBUTTONINFO lptbbi) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_GETBUTTONINFO, nID, (LPARAM)lptbbi); - } - - BOOL SetButtonInfo(int nID, LPTBBUTTONINFO lptbbi) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)lptbbi); - } - - BOOL SetButtonInfo(int nID, DWORD dwMask, BYTE Style, BYTE State, LPCTSTR lpszItem, - int iImage, WORD cx, int iCommand, DWORD_PTR lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - TBBUTTONINFO tbbi = { 0 }; - tbbi.cbSize = sizeof(TBBUTTONINFO); - tbbi.dwMask = dwMask; - tbbi.idCommand = iCommand; - tbbi.iImage = iImage; - tbbi.fsState = State; - tbbi.fsStyle = Style; - tbbi.cx = cx; - tbbi.pszText = (LPTSTR) lpszItem; - tbbi.lParam = lParam; - return (BOOL)::SendMessage(m_hWnd, TB_SETBUTTONINFO, nID, (LPARAM)&tbbi); - } - -#ifndef _WIN32_WCE - int GetHotItem() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_GETHOTITEM, 0, 0L); - } - - int SetHotItem(int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_SETHOTITEM, nItem, 0L); - } -#endif // !_WIN32_WCE - - BOOL IsButtonHighlighted(int nButtonID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_ISBUTTONHIGHLIGHTED, nButtonID, 0L); - } - - DWORD SetDrawTextFlags(DWORD dwMask, DWORD dwFlags) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TB_SETDRAWTEXTFLAGS, dwMask, dwFlags); - } - -#ifndef _WIN32_WCE - BOOL GetColorScheme(LPCOLORSCHEME lpcs) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_GETCOLORSCHEME, 0, (LPARAM)lpcs); - } - - void SetColorScheme(LPCOLORSCHEME lpcs) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_SETCOLORSCHEME, 0, (LPARAM)lpcs); - } - - DWORD GetExtendedStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TB_GETEXTENDEDSTYLE, 0, 0L); - } - - DWORD SetExtendedStyle(DWORD dwStyle) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TB_SETEXTENDEDSTYLE, 0, dwStyle); - } - - void GetInsertMark(LPTBINSERTMARK lptbim) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_GETINSERTMARK, 0, (LPARAM)lptbim); - } - - void SetInsertMark(LPTBINSERTMARK lptbim) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_SETINSERTMARK, 0, (LPARAM)lptbim); - } - - COLORREF GetInsertMarkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TB_GETINSERTMARKCOLOR, 0, 0L); - } - - COLORREF SetInsertMarkColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, TB_SETINSERTMARKCOLOR, 0, (LPARAM)clr); - } - - BOOL GetMaxSize(LPSIZE lpSize) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_GETMAXSIZE, 0, (LPARAM)lpSize); - } - - void GetPadding(LPSIZE lpSizePadding) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpSizePadding != NULL); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_GETPADDING, 0, 0L); - lpSizePadding->cx = GET_X_LPARAM(dwRet); - lpSizePadding->cy = GET_Y_LPARAM(dwRet); - } - - void SetPadding(int cx, int cy, LPSIZE lpSizePadding = NULL) - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, TB_SETPADDING, 0, MAKELPARAM(cx, cy)); - if(lpSizePadding != NULL) - { - lpSizePadding->cx = GET_X_LPARAM(dwRet); - lpSizePadding->cy = GET_Y_LPARAM(dwRet); - } - } - - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // !_WIN32_WCE -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - int GetString(int nString, LPTSTR lpstrString, int cchMaxLen) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(cchMaxLen, nString), (LPARAM)lpstrString); - } - - int GetStringBSTR(int nString, BSTR& bstrString) const - { - USES_CONVERSION; - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(bstrString == NULL); - int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL)); - if(nLength != -1) - { - CTempBuffer buff; - LPTSTR lpstrText = buff.Allocate(nLength + 1); - if(lpstrText != NULL) - { - nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstrText); - if(nLength != -1) - bstrString = ::SysAllocString(T2OLE(lpstrText)); - } - else - { - nLength = -1; - } - } - - return nLength; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - int GetString(int nString, _CSTRING_NS::CString& str) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(0, nString), NULL)); - if(nLength != -1) - { - LPTSTR lpstr = str.GetBufferSetLength(nLength + 1); - if(lpstr != NULL) - nLength = (int)::SendMessage(m_hWnd, TB_GETSTRING, MAKEWPARAM(nLength + 1, nString), (LPARAM)lpstr); - else - nLength = -1; - str.ReleaseBuffer(); - } - return nLength; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -#if (_WIN32_WINNT >= 0x0501) - void GetMetrics(LPTBMETRICS lptbm) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_GETMETRICS, 0, (LPARAM)lptbm); - } - - void SetMetrics(LPTBMETRICS lptbm) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_SETMETRICS, 0, (LPARAM)lptbm); - } - - void SetWindowTheme(LPCWSTR lpstrTheme) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); - } -#endif // (_WIN32_WINNT >= 0x0501) - -#if (_WIN32_WINNT >= 0x0600) - CImageList GetPressedImageList(int nIndex = 0) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_GETPRESSEDIMAGELIST, nIndex, 0L)); - } - - CImageList SetPressedImageList(HIMAGELIST hImageList, int nIndex = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TB_SETPRESSEDIMAGELIST, nIndex, (LPARAM)hImageList)); - } -#endif // (_WIN32_WINNT >= 0x0600) - -// Operations - BOOL EnableButton(int nID, BOOL bEnable = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_ENABLEBUTTON, nID, MAKELPARAM(bEnable, 0)); - } - - BOOL CheckButton(int nID, BOOL bCheck = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_CHECKBUTTON, nID, MAKELPARAM(bCheck, 0)); - } - - BOOL PressButton(int nID, BOOL bPress = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_PRESSBUTTON, nID, MAKELPARAM(bPress, 0)); - } - - BOOL HideButton(int nID, BOOL bHide = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_HIDEBUTTON, nID, MAKELPARAM(bHide, 0)); - } - - BOOL Indeterminate(int nID, BOOL bIndeterminate = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_INDETERMINATE, nID, MAKELPARAM(bIndeterminate, 0)); - } - - int AddBitmap(int nNumButtons, UINT nBitmapID) - { - ATLASSERT(::IsWindow(m_hWnd)); - TBADDBITMAP tbab = { 0 }; - tbab.hInst = ModuleHelper::GetResourceInstance(); - ATLASSERT(tbab.hInst != NULL); - tbab.nID = nBitmapID; - return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab); - } - - int AddBitmap(int nNumButtons, HBITMAP hBitmap) - { - ATLASSERT(::IsWindow(m_hWnd)); - TBADDBITMAP tbab = { 0 }; - tbab.hInst = NULL; - tbab.nID = (UINT_PTR)hBitmap; - return (int)::SendMessage(m_hWnd, TB_ADDBITMAP, (WPARAM)nNumButtons, (LPARAM)&tbab); - } - - BOOL AddButtons(int nNumButtons, LPTBBUTTON lpButtons) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_ADDBUTTONS, nNumButtons, (LPARAM)lpButtons); - } - - BOOL InsertButton(int nIndex, LPTBBUTTON lpButton) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)lpButton); - } - - BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap, - INT_PTR iString, DWORD_PTR lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - TBBUTTON tbb = { 0 }; - tbb.fsStyle = Style; - tbb.fsState = State; - tbb.idCommand = iCommand; - tbb.iBitmap = iBitmap; - tbb.iString = iString; - tbb.dwData = lParam; - return (BOOL)::SendMessage(m_hWnd, TB_INSERTBUTTON, nIndex, (LPARAM)&tbb); - } - - BOOL InsertButton(int nIndex, int iCommand, BYTE Style, BYTE State, int iBitmap, - LPCTSTR lpszItem, DWORD_PTR lParam) - { - return InsertButton(nIndex, iCommand, Style, State, iBitmap, (INT_PTR)lpszItem, lParam); - } - - BOOL AddButton(LPTBBUTTON lpButton) - { - return InsertButton(-1, lpButton); - } - - BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, INT_PTR iString, DWORD_PTR lParam) - { - return InsertButton(-1, iCommand, Style, State, iBitmap, iString, lParam); - } - - BOOL AddButton(int iCommand, BYTE Style, BYTE State, int iBitmap, LPCTSTR lpszItem, DWORD_PTR lParam) - { - return InsertButton(-1, iCommand, Style, State, iBitmap, lpszItem, lParam); - } - - BOOL DeleteButton(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_DELETEBUTTON, nIndex, 0L); - } - - UINT CommandToIndex(UINT nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, TB_COMMANDTOINDEX, nID, 0L); - } - -#ifndef _WIN32_WCE - void SaveState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName) - { - ATLASSERT(::IsWindow(m_hWnd)); - TBSAVEPARAMS tbs = { 0 }; - tbs.hkr = hKeyRoot; - tbs.pszSubKey = lpszSubKey; - tbs.pszValueName = lpszValueName; - ::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)TRUE, (LPARAM)&tbs); - } - - void RestoreState(HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName) - { - ATLASSERT(::IsWindow(m_hWnd)); - TBSAVEPARAMS tbs = { 0 }; - tbs.hkr = hKeyRoot; - tbs.pszSubKey = lpszSubKey; - tbs.pszValueName = lpszValueName; - ::SendMessage(m_hWnd, TB_SAVERESTORE, (WPARAM)FALSE, (LPARAM)&tbs); - } - - void Customize() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_CUSTOMIZE, 0, 0L); - } -#endif // !_WIN32_WCE - - int AddString(UINT nStringID) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_ADDSTRING, (WPARAM)ModuleHelper::GetResourceInstance(), (LPARAM)nStringID); - } - - int AddStrings(LPCTSTR lpszStrings) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_ADDSTRING, 0, (LPARAM)lpszStrings); - } - - void AutoSize() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TB_AUTOSIZE, 0, 0L); - } - - BOOL ChangeBitmap(int nID, int nBitmap) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_CHANGEBITMAP, nID, MAKELPARAM(nBitmap, 0)); - } - - int LoadImages(int nBitmapID) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)ModuleHelper::GetResourceInstance()); - } - - int LoadStdImages(int nBitmapID) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_LOADIMAGES, nBitmapID, (LPARAM)HINST_COMMCTRL); - } - - BOOL ReplaceBitmap(LPTBREPLACEBITMAP ptbrb) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_REPLACEBITMAP, 0, (LPARAM)ptbrb); - } - -#if (_WIN32_IE >= 0x0400) - int HitTest(LPPOINT lpPoint) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TB_HITTEST, 0, (LPARAM)lpPoint); - } - -#ifndef _WIN32_WCE - BOOL InsertMarkHitTest(LPPOINT lpPoint, LPTBINSERTMARK lptbim) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)lpPoint, (LPARAM)lptbim); - } - - BOOL InsertMarkHitTest(int x, int y, LPTBINSERTMARK lptbim) const - { - ATLASSERT(::IsWindow(m_hWnd)); - POINT pt = { x, y }; - return (BOOL)::SendMessage(m_hWnd, TB_INSERTMARKHITTEST, (WPARAM)&pt, (LPARAM)lptbim); - } - - BOOL MapAccelerator(TCHAR chAccel, int& nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_MAPACCELERATOR, (WPARAM)chAccel, (LPARAM)&nID); - } - - BOOL MarkButton(int nID, BOOL bHighlight = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_MARKBUTTON, nID, MAKELPARAM(bHighlight, 0)); - } - - BOOL MoveButton(int nOldPos, int nNewPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TB_MOVEBUTTON, nOldPos, nNewPos); - } - - HRESULT GetObject(REFIID iid, LPVOID* ppvObject) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HRESULT)::SendMessage(m_hWnd, TB_GETOBJECT, (WPARAM)&iid, (LPARAM)ppvObject); - } -#endif // !_WIN32_WCE -#endif // (_WIN32_IE >= 0x0400) -}; - -typedef CToolBarCtrlT CToolBarCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CStatusBarCtrl - -template -class CStatusBarCtrlT : public TBase -{ -public: -// Constructors - CStatusBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CStatusBarCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Methods - static LPCTSTR GetWndClassName() - { - return STATUSCLASSNAME; - } - - int GetParts(int nParts, int* pParts) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, SB_GETPARTS, nParts, (LPARAM)pParts); - } - - BOOL SetParts(int nParts, int* pWidths) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, SB_SETPARTS, nParts, (LPARAM)pWidths); - } - - int GetTextLength(int nPane, int* pType = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L); - if (pType != NULL) - *pType = (int)(short)HIWORD(dwRet); - return (int)(short)LOWORD(dwRet); - } - - int GetText(int nPane, LPTSTR lpszText, int* pType = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, SB_GETTEXT, (WPARAM)nPane, (LPARAM)lpszText); - if(pType != NULL) - *pType = (int)(short)HIWORD(dwRet); - return (int)(short)LOWORD(dwRet); - } - -#ifndef _ATL_NO_COM - BOOL GetTextBSTR(int nPane, BSTR& bstrText, int* pType = NULL) const - { - USES_CONVERSION; - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - ATLASSERT(bstrText == NULL); - int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L)); - if(nLength == 0) - return FALSE; - - CTempBuffer buff; - LPTSTR lpstrText = buff.Allocate(nLength + 1); - if(lpstrText == NULL) - return FALSE; - - if(!GetText(nPane, lpstrText, pType)) - return FALSE; - - bstrText = ::SysAllocString(T2OLE(lpstrText)); - return (bstrText != NULL) ? TRUE : FALSE; - } -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - int GetText(int nPane, _CSTRING_NS::CString& strText, int* pType = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - int nLength = (int)(short)LOWORD(::SendMessage(m_hWnd, SB_GETTEXTLENGTH, (WPARAM)nPane, 0L)); - if(nLength == 0) - return 0; - - LPTSTR lpstr = strText.GetBufferSetLength(nLength); - if(lpstr == NULL) - return 0; - return GetText(nPane, lpstr, pType); - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - BOOL SetText(int nPane, LPCTSTR lpszText, int nType = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - return (BOOL)::SendMessage(m_hWnd, SB_SETTEXT, (nPane | nType), (LPARAM)lpszText); - } - - BOOL GetRect(int nPane, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - return (BOOL)::SendMessage(m_hWnd, SB_GETRECT, nPane, (LPARAM)lpRect); - } - - BOOL GetBorders(int* pBorders) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)pBorders); - } - - BOOL GetBorders(int& nHorz, int& nVert, int& nSpacing) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int borders[3] = { 0, 0, 0 }; - BOOL bResult = (BOOL)::SendMessage(m_hWnd, SB_GETBORDERS, 0, (LPARAM)&borders); - if(bResult) - { - nHorz = borders[0]; - nVert = borders[1]; - nSpacing = borders[2]; - } - return bResult; - } - - void SetMinHeight(int nMin) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, SB_SETMINHEIGHT, nMin, 0L); - } - - BOOL SetSimple(BOOL bSimple = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, SB_SIMPLE, bSimple, 0L); - } - - BOOL IsSimple() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, SB_ISSIMPLE, 0, 0L); - } - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, SB_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, SB_SETUNICODEFORMAT, bUnicode, 0L); - } - - void GetTipText(int nPane, LPTSTR lpstrText, int nSize) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - ::SendMessage(m_hWnd, SB_GETTIPTEXT, MAKEWPARAM(nPane, nSize), (LPARAM)lpstrText); - } - - void SetTipText(int nPane, LPCTSTR lpstrText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - ::SendMessage(m_hWnd, SB_SETTIPTEXT, nPane, (LPARAM)lpstrText); - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -#if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) - COLORREF SetBkColor(COLORREF clrBk) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, SB_SETBKCOLOR, 0, (LPARAM)clrBk); - } - - HICON GetIcon(int nPane) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - return (HICON)::SendMessage(m_hWnd, SB_GETICON, nPane, 0L); - } - - BOOL SetIcon(int nPane, HICON hIcon) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPane < 256); - return (BOOL)::SendMessage(m_hWnd, SB_SETICON, nPane, (LPARAM)hIcon); - } -#endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) -}; - -typedef CStatusBarCtrlT CStatusBarCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CTabCtrl - -template -class CTabCtrlT : public TBase -{ -public: -// Constructors - CTabCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CTabCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_TABCONTROL; - } - - CImageList GetImageList() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_GETIMAGELIST, 0, 0L)); - } - - CImageList SetImageList(HIMAGELIST hImageList) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, TCM_SETIMAGELIST, 0, (LPARAM)hImageList)); - } - - int GetItemCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TCM_GETITEMCOUNT, 0, 0L); - } - - BOOL GetItem(int nItem, LPTCITEM pTabCtrlItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TCM_GETITEM, nItem, (LPARAM)pTabCtrlItem); - } - - BOOL SetItem(int nItem, LPTCITEM pTabCtrlItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)pTabCtrlItem); - } - - int SetItem(int nItem, UINT mask, LPCTSTR lpszItem, DWORD dwState, DWORD dwStateMask, int iImage, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - TCITEM tci = { 0 }; - tci.mask = mask; - tci.pszText = (LPTSTR) lpszItem; - tci.dwState = dwState; - tci.dwStateMask = dwStateMask; - tci.iImage = iImage; - tci.lParam = lParam; - return (int)::SendMessage(m_hWnd, TCM_SETITEM, nItem, (LPARAM)&tci); - } - - BOOL GetItemRect(int nItem, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TCM_GETITEMRECT, nItem, (LPARAM)lpRect); - } - - int GetCurSel() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TCM_GETCURSEL, 0, 0L); - } - - int SetCurSel(int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TCM_SETCURSEL, nItem, 0L); - } - - SIZE SetItemSize(SIZE size) - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwSize = (DWORD)::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(size.cx, size.cy)); - SIZE sizeRet = { GET_X_LPARAM(dwSize), GET_Y_LPARAM(dwSize) }; - return sizeRet; - } - - void SetItemSize(int cx, int cy) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TCM_SETITEMSIZE, 0, MAKELPARAM(cx, cy)); - } - - void SetPadding(SIZE size) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TCM_SETPADDING, 0, MAKELPARAM(size.cx, size.cy)); - } - - int GetRowCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TCM_GETROWCOUNT, 0, 0L); - } - -#ifndef _WIN32_WCE - CToolTipCtrl GetTooltips() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TCM_GETTOOLTIPS, 0, 0L)); - } - - void SetTooltips(HWND hWndToolTip) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TCM_SETTOOLTIPS, (WPARAM)hWndToolTip, 0L); - } -#endif // !_WIN32_WCE - - int GetCurFocus() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TCM_GETCURFOCUS, 0, 0L); - } - - void SetCurFocus(int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TCM_SETCURFOCUS, nItem, 0L); - } - - BOOL SetItemExtra(int cbExtra) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetItemCount() == 0); // must be empty - return (BOOL)::SendMessage(m_hWnd, TCM_SETITEMEXTRA, cbExtra, 0L); - } - - int SetMinTabWidth(int nWidth = -1) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TCM_SETMINTABWIDTH, 0, nWidth); - } - -#if (_WIN32_IE >= 0x0400) - DWORD GetExtendedStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TCM_GETEXTENDEDSTYLE, 0, 0L); - } - - DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, TCM_SETEXTENDEDSTYLE, dwExMask, dwExStyle); - } - -#ifndef _WIN32_WCE - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TCM_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TCM_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // !_WIN32_WCE -#endif // (_WIN32_IE >= 0x0400) - -// Operations - int InsertItem(int nItem, LPTCITEM pTabCtrlItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)pTabCtrlItem); - } - - int InsertItem(int nItem, UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - TCITEM tci = { 0 }; - tci.mask = mask; - tci.pszText = (LPTSTR) lpszItem; - tci.iImage = iImage; - tci.lParam = lParam; - return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci); - } - - int InsertItem(int nItem, LPCTSTR lpszItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - TCITEM tci = { 0 }; - tci.mask = TCIF_TEXT; - tci.pszText = (LPTSTR) lpszItem; - return (int)::SendMessage(m_hWnd, TCM_INSERTITEM, nItem, (LPARAM)&tci); - } - - int AddItem(LPTCITEM pTabCtrlItem) - { - return InsertItem(GetItemCount(), pTabCtrlItem); - } - - int AddItem(UINT mask, LPCTSTR lpszItem, int iImage, LPARAM lParam) - { - return InsertItem(GetItemCount(), mask, lpszItem, iImage, lParam); - } - - int AddItem(LPCTSTR lpszItem) - { - return InsertItem(GetItemCount(), lpszItem); - } - - BOOL DeleteItem(int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TCM_DELETEITEM, nItem, 0L); - } - - BOOL DeleteAllItems() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TCM_DELETEALLITEMS, 0, 0L); - } - - void AdjustRect(BOOL bLarger, LPRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TCM_ADJUSTRECT, bLarger, (LPARAM)lpRect); - } - - void RemoveImage(int nImage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TCM_REMOVEIMAGE, nImage, 0L); - } - - int HitTest(TC_HITTESTINFO* pHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TCM_HITTEST, 0, (LPARAM)pHitTestInfo); - } - - void DeselectAll(BOOL bExcludeFocus = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TCM_DESELECTALL, bExcludeFocus, 0L); - } - -#if (_WIN32_IE >= 0x0400) - BOOL HighlightItem(int nIndex, BOOL bHighlight = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TCM_HIGHLIGHTITEM, nIndex, MAKELPARAM(bHighlight, 0)); - } -#endif // (_WIN32_IE >= 0x0400) -}; - -typedef CTabCtrlT CTabCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CTrackBarCtrl - -template -class CTrackBarCtrlT : public TBase -{ -public: -// Constructors - CTrackBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CTrackBarCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return TRACKBAR_CLASS; - } - - int GetLineSize() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETLINESIZE, 0, 0L); - } - - int SetLineSize(int nSize) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_SETLINESIZE, 0, nSize); - } - - int GetPageSize() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETPAGESIZE, 0, 0L); - } - - int SetPageSize(int nSize) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_SETPAGESIZE, 0, nSize); - } - - int GetRangeMin() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETRANGEMIN, 0, 0L); - } - - void SetRangeMin(int nMin, BOOL bRedraw = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETRANGEMIN, bRedraw, nMin); - } - - int GetRangeMax() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETRANGEMAX, 0, 0L); - } - - void SetRangeMax(int nMax, BOOL bRedraw = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETRANGEMAX, bRedraw, nMax); - } - - void GetRange(int& nMin, int& nMax) const - { - nMin = GetRangeMin(); - nMax = GetRangeMax(); - } - - void SetRange(int nMin, int nMax, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETRANGE, bRedraw, MAKELPARAM(nMin, nMax)); - } - - int GetSelStart() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETSELSTART, 0, 0L); - } - - void SetSelStart(int nMin) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETSELSTART, 0, (LPARAM)nMin); - } - - int GetSelEnd() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETSELEND, 0, 0L); - } - - void SetSelEnd(int nMax) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETSELEND, 0, (LPARAM)nMax); - } - - void GetSelection(int& nMin, int& nMax) const - { - nMin = GetSelStart(); - nMax = GetSelEnd(); - } - - void SetSelection(int nMin, int nMax) - { - SetSelStart(nMin); - SetSelEnd(nMax); - } - - void GetChannelRect(LPRECT lprc) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_GETCHANNELRECT, 0, (LPARAM)lprc); - } - - void GetThumbRect(LPRECT lprc) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_GETTHUMBRECT, 0, (LPARAM)lprc); - } - - int GetPos() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETPOS, 0, 0L); - } - - void SetPos(int nPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETPOS, TRUE, nPos); - } - - UINT GetNumTics() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, TBM_GETNUMTICS, 0, 0L); - } - - DWORD* GetTicArray() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD*)::SendMessage(m_hWnd, TBM_GETPTICS, 0, 0L); - } - - int GetTic(int nTic) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETTIC, nTic, 0L); - } - - BOOL SetTic(int nTic) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TBM_SETTIC, 0, nTic); - } - - int GetTicPos(int nTic) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETTICPOS, nTic, 0L); - } - - void SetTicFreq(int nFreq) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETTICFREQ, nFreq, 0L); - } - - int GetThumbLength() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_GETTHUMBLENGTH, 0, 0L); - } - - void SetThumbLength(int nLength) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETTHUMBLENGTH, nLength, 0L); - } - - void SetSel(int nStart, int nEnd, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & TBS_ENABLESELRANGE) != 0); - ::SendMessage(m_hWnd, TBM_SETSEL, bRedraw, MAKELPARAM(nStart, nEnd)); - } - - ATL::CWindow GetBuddy(BOOL bLeft = TRUE) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_GETBUDDY, bLeft, 0L)); - } - - ATL::CWindow SetBuddy(HWND hWndBuddy, BOOL bLeft = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ATL::CWindow((HWND)::SendMessage(m_hWnd, TBM_SETBUDDY, bLeft, (LPARAM)hWndBuddy)); - } - -#ifndef _WIN32_WCE - CToolTipCtrl GetToolTips() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CToolTipCtrl((HWND)::SendMessage(m_hWnd, TBM_GETTOOLTIPS, 0, 0L)); - } - - void SetToolTips(HWND hWndTT) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETTOOLTIPS, (WPARAM)hWndTT, 0L); - } - - int SetTipSide(int nSide) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, TBM_SETTIPSIDE, nSide, 0L); - } -#endif // !_WIN32_WCE - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TBM_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, TBM_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -// Operations - void ClearSel(BOOL bRedraw = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_CLEARSEL, bRedraw, 0L); - } - - void VerifyPos() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_SETPOS, FALSE, 0L); - } - - void ClearTics(BOOL bRedraw = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, TBM_CLEARTICS, bRedraw, 0L); - } -}; - -typedef CTrackBarCtrlT CTrackBarCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CUpDownCtrl - -template -class CUpDownCtrlT : public TBase -{ -public: -// Constructors - CUpDownCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CUpDownCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return UPDOWN_CLASS; - } - - UINT GetAccel(int nAccel, UDACCEL* pAccel) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETACCEL, nAccel, (LPARAM)pAccel)); - } - - BOOL SetAccel(int nAccel, UDACCEL* pAccel) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)LOWORD(::SendMessage(m_hWnd, UDM_SETACCEL, nAccel, (LPARAM)pAccel)); - } - - UINT GetBase() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)LOWORD(::SendMessage(m_hWnd, UDM_GETBASE, 0, 0L)); - } - - int SetBase(int nBase) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, UDM_SETBASE, nBase, 0L); - } - - ATL::CWindow GetBuddy() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_GETBUDDY, 0, 0L)); - } - - ATL::CWindow SetBuddy(HWND hWndBuddy) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ATL::CWindow((HWND)::SendMessage(m_hWnd, UDM_SETBUDDY, (WPARAM)hWndBuddy, 0L)); - } - - int GetPos(LPBOOL lpbError = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETPOS, 0, 0L); - // Note: Seems that Windows always sets error to TRUE if - // UDS_SETBUDDYINT style is not used - if(lpbError != NULL) - *lpbError = (HIWORD(dwRet) != 0) ? TRUE : FALSE; - return (int)(short)LOWORD(dwRet); - } - - int SetPos(int nPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)(short)LOWORD(::SendMessage(m_hWnd, UDM_SETPOS, 0, MAKELPARAM(nPos, 0))); - } - - DWORD GetRange() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L); - } - - void GetRange(int& nLower, int& nUpper) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, UDM_GETRANGE, 0, 0L); - nLower = (int)(short)HIWORD(dwRet); - nUpper = (int)(short)LOWORD(dwRet); - } - - void SetRange(int nLower, int nUpper) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, UDM_SETRANGE, 0, MAKELPARAM(nUpper, nLower)); - } - -#if (_WIN32_IE >= 0x0400) - void SetRange32(int nLower, int nUpper) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, UDM_SETRANGE32, nLower, nUpper); - } - - void GetRange32(int& nLower, int& nUpper) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, UDM_GETRANGE32, (WPARAM)&nLower, (LPARAM)&nUpper); - } - -#ifndef _WIN32_WCE - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, UDM_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, UDM_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // !_WIN32_WCE -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - int GetPos32(LPBOOL lpbError = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - // Note: Seems that Windows always sets error to TRUE if - // UDS_SETBUDDYINT style is not used - return (int)::SendMessage(m_hWnd, UDM_GETPOS32, 0, (LPARAM)lpbError); - } - - int SetPos32(int nPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, UDM_SETPOS32, 0, (LPARAM)nPos); - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) -}; - -typedef CUpDownCtrlT CUpDownCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CProgressBarCtrl - -template -class CProgressBarCtrlT : public TBase -{ -public: -// Constructors - CProgressBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CProgressBarCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return PROGRESS_CLASS; - } - - DWORD SetRange(int nLower, int nUpper) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE, 0, MAKELPARAM(nLower, nUpper)); - } - - int SetPos(int nPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETPOS, nPos, 0L)); - } - - int OffsetPos(int nPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_DELTAPOS, nPos, 0L)); - } - - int SetStep(int nStep) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_SETSTEP, nStep, 0L)); - } - - UINT GetPos() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, PBM_GETPOS, 0, 0L); - } - - void GetRange(PPBRANGE pPBRange) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pPBRange != NULL); - ::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)pPBRange); - } - - void GetRange(int& nLower, int& nUpper) const - { - ATLASSERT(::IsWindow(m_hWnd)); - PBRANGE range = { 0 }; - ::SendMessage(m_hWnd, PBM_GETRANGE, TRUE, (LPARAM)&range); - nLower = range.iLow; - nUpper = range.iHigh; - } - - int GetRangeLimit(BOOL bLowLimit) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PBM_GETRANGE, bLowLimit, (LPARAM)NULL); - } - - DWORD SetRange32(int nMin, int nMax) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, PBM_SETRANGE32, nMin, nMax); - } - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - COLORREF SetBarColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, PBM_SETBARCOLOR, 0, (LPARAM)clr); - } - - COLORREF SetBkColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, PBM_SETBKCOLOR, 0, (LPARAM)clr); - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -#if (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE) - BOOL SetMarquee(BOOL bMarquee, UINT uUpdateTime = 0U) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, PBM_SETMARQUEE, (WPARAM)bMarquee, (LPARAM)uUpdateTime); - } -#endif // (_WIN32_WINNT >= 0x0501) && defined(PBM_SETMARQUEE) - -#if (_WIN32_WINNT >= 0x0600) - int GetStep() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PBM_GETSTEP, 0, 0L); - } - - COLORREF GetBkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, PBM_GETBKCOLOR, 0, 0L); - } - - COLORREF GetBarColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, PBM_GETBARCOLOR, 0, 0L); - } - - int GetState() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PBM_GETSTATE, 0, 0L); - } - - int SetState(int nState) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PBM_SETSTATE, nState, 0L); - } -#endif // (_WIN32_WINNT >= 0x0600) - -// Operations - int StepIt() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)(short)LOWORD(::SendMessage(m_hWnd, PBM_STEPIT, 0, 0L)); - } -}; - -typedef CProgressBarCtrlT CProgressBarCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CHotKeyCtrl - -#ifndef _WIN32_WCE - -template -class CHotKeyCtrlT : public TBase -{ -public: -// Constructors - CHotKeyCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CHotKeyCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return HOTKEY_CLASS; - } - - DWORD GetHotKey() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L); - } - - void GetHotKey(WORD &wVirtualKeyCode, WORD &wModifiers) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dw = (DWORD)::SendMessage(m_hWnd, HKM_GETHOTKEY, 0, 0L); - wVirtualKeyCode = LOBYTE(LOWORD(dw)); - wModifiers = HIBYTE(LOWORD(dw)); - } - - void SetHotKey(WORD wVirtualKeyCode, WORD wModifiers) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, HKM_SETHOTKEY, MAKEWORD(wVirtualKeyCode, wModifiers), 0L); - } - - void SetRules(WORD wInvalidComb, WORD wModifiers) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, HKM_SETRULES, wInvalidComb, MAKELPARAM(wModifiers, 0)); - } -}; - -typedef CHotKeyCtrlT CHotKeyCtrl; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CAnimateCtrl - -#ifndef _WIN32_WCE - -template -class CAnimateCtrlT : public TBase -{ -public: -// Constructors - CAnimateCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CAnimateCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return ANIMATE_CLASS; - } - -// Operations - BOOL Open(ATL::_U_STRINGorID FileName) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, (LPARAM)FileName.m_lpstr); - } - - BOOL Play(UINT nFrom, UINT nTo, UINT nRep) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, nRep, MAKELPARAM(nFrom, nTo)); - } - - BOOL Stop() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, ACM_STOP, 0, 0L); - } - - BOOL Close() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, ACM_OPEN, 0, 0L); - } - - BOOL Seek(UINT nTo) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, ACM_PLAY, 0, MAKELPARAM(nTo, nTo)); - } - - // Vista only - BOOL IsPlaying() const - { -#ifndef ACM_ISPLAYING - const UINT ACM_ISPLAYING = (WM_USER+104); -#endif - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, ACM_ISPLAYING, 0, 0L); - } -}; - -typedef CAnimateCtrlT CAnimateCtrl; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CRichEditCtrl - -#ifndef _WIN32_WCE - -#ifdef _UNICODE -#if (_RICHEDIT_VER == 0x0100) -#undef RICHEDIT_CLASS -#define RICHEDIT_CLASS L"RICHEDIT" -#endif // (_RICHEDIT_VER == 0x0100) -#endif // _UNICODE - -template -class CRichEditCtrlT : public TBase -{ -public: -// Constructors - CRichEditCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CRichEditCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return RICHEDIT_CLASS; - } - - static LPCTSTR GetLibraryName() - { -#if (_RICHEDIT_VER >= 0x0200) - return _T("RICHED20.DLL"); -#else - return _T("RICHED32.DLL"); -#endif - } - - int GetLineCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETLINECOUNT, 0, 0L); - } - - BOOL GetModify() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); - } - - void SetModify(BOOL bModified = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETMODIFY, bModified, 0L); - } - - void GetRect(LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_GETRECT, 0, (LPARAM)lpRect); - } - - DWORD GetOptions() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, EM_GETOPTIONS, 0, 0L); - } - - DWORD SetOptions(WORD wOperation, DWORD dwOptions) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, EM_SETOPTIONS, wOperation, dwOptions); - } - - // NOTE: first word in lpszBuffer must contain the size of the buffer! - int GetLine(int nIndex, LPTSTR lpszBuffer) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); - } - - int GetLine(int nIndex, LPTSTR lpszBuffer, int nMaxLength) const - { - ATLASSERT(::IsWindow(m_hWnd)); - *(LPWORD)lpszBuffer = (WORD)nMaxLength; - return (int)::SendMessage(m_hWnd, EM_GETLINE, nIndex, (LPARAM)lpszBuffer); - } - - BOOL CanUndo() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); - } - - BOOL CanPaste(UINT nFormat = 0) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, nFormat, 0L); - } - - void GetSel(LONG& nStartChar, LONG& nEndChar) const - { - ATLASSERT(::IsWindow(m_hWnd)); - CHARRANGE cr = { 0, 0 }; - ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); - nStartChar = cr.cpMin; - nEndChar = cr.cpMax; - } - - void GetSel(CHARRANGE &cr) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); - } - - int SetSel(LONG nStartChar, LONG nEndChar) - { - ATLASSERT(::IsWindow(m_hWnd)); - CHARRANGE cr = { nStartChar, nEndChar }; - return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr); - } - - int SetSel(CHARRANGE &cr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_EXSETSEL, 0, (LPARAM)&cr); - } - - int SetSelAll() - { - return SetSel(0, -1); - } - - int SetSelNone() - { - return SetSel(-1, 0); - } - - DWORD GetDefaultCharFormat(CHARFORMAT& cf) const - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT); - return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf); - } - - DWORD GetSelectionCharFormat(CHARFORMAT& cf) const - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT); - return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf); - } - - DWORD GetEventMask() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, EM_GETEVENTMASK, 0, 0L); - } - - LONG GetLimitText() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_GETLIMITTEXT, 0, 0L); - } - - DWORD GetParaFormat(PARAFORMAT& pf) const - { - ATLASSERT(::IsWindow(m_hWnd)); - pf.cbSize = sizeof(PARAFORMAT); - return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf); - } - -#if (_RICHEDIT_VER >= 0x0200) - LONG GetSelText(LPTSTR lpstrBuff) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff); - } -#else // !(_RICHEDIT_VER >= 0x0200) - // RichEdit 1.0 EM_GETSELTEXT is ANSI only - LONG GetSelText(LPSTR lpstrBuff) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrBuff); - } -#endif // !(_RICHEDIT_VER >= 0x0200) - -#ifndef _ATL_NO_COM - BOOL GetSelTextBSTR(BSTR& bstrText) const - { - USES_CONVERSION; - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(bstrText == NULL); - - CHARRANGE cr = { 0, 0 }; - ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); - -#if (_RICHEDIT_VER >= 0x0200) - CTempBuffer buff; - LPTSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); - if(lpstrText == NULL) - return FALSE; - if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0) - return FALSE; - - bstrText = ::SysAllocString(T2W(lpstrText)); -#else // !(_RICHEDIT_VER >= 0x0200) - CTempBuffer buff; - LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); - if(lpstrText == NULL) - return FALSE; - if(::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText) == 0) - return FALSE; - - bstrText = ::SysAllocString(A2W(lpstrText)); -#endif // !(_RICHEDIT_VER >= 0x0200) - - return (bstrText != NULL) ? TRUE : FALSE; - } -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - LONG GetSelText(_CSTRING_NS::CString& strText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - - CHARRANGE cr = { 0, 0 }; - ::SendMessage(m_hWnd, EM_EXGETSEL, 0, (LPARAM)&cr); - -#if (_RICHEDIT_VER >= 0x0200) - LONG lLen = 0; - LPTSTR lpstrText = strText.GetBufferSetLength(cr.cpMax - cr.cpMin); - if(lpstrText != NULL) - { - lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText); - strText.ReleaseBuffer(); - } -#else // !(_RICHEDIT_VER >= 0x0200) - CTempBuffer buff; - LPSTR lpstrText = buff.Allocate(cr.cpMax - cr.cpMin + 1); - if(lpstrText == NULL) - return 0; - LONG lLen = (LONG)::SendMessage(m_hWnd, EM_GETSELTEXT, 0, (LPARAM)lpstrText); - if(lLen == 0) - return 0; - - USES_CONVERSION; - strText = A2T(lpstrText); -#endif // !(_RICHEDIT_VER >= 0x0200) - - return lLen; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - WORD GetSelectionType() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (WORD)::SendMessage(m_hWnd, EM_SELECTIONTYPE, 0, 0L); - } - - COLORREF SetBackgroundColor(COLORREF cr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 0, cr); - } - - COLORREF SetBackgroundColor() // sets to system background - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, EM_SETBKGNDCOLOR, 1, 0); - } - - BOOL SetCharFormat(CHARFORMAT& cf, WORD wFlags) - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT); - return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf); - } - - BOOL SetDefaultCharFormat(CHARFORMAT& cf) - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT); - return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf); - } - - BOOL SetSelectionCharFormat(CHARFORMAT& cf) - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT); - return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); - } - - BOOL SetWordCharFormat(CHARFORMAT& cf) - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT); - return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf); - } - - DWORD SetEventMask(DWORD dwEventMask) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, EM_SETEVENTMASK, 0, dwEventMask); - } - - BOOL SetParaFormat(PARAFORMAT& pf) - { - ATLASSERT(::IsWindow(m_hWnd)); - pf.cbSize = sizeof(PARAFORMAT); - return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf); - } - - BOOL SetTargetDevice(HDC hDC, int cxLineWidth) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETTARGETDEVICE, (WPARAM)hDC, cxLineWidth); - } - - int GetTextLength() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L); - } - - BOOL SetReadOnly(BOOL bReadOnly = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETREADONLY, bReadOnly, 0L); - } - - int GetFirstVisibleLine() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETFIRSTVISIBLELINE, 0, 0L); - } - - EDITWORDBREAKPROCEX GetWordBreakProcEx() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_GETWORDBREAKPROCEX, 0, 0L); - } - - EDITWORDBREAKPROCEX SetWordBreakProcEx(EDITWORDBREAKPROCEX pfnEditWordBreakProcEx) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (EDITWORDBREAKPROCEX)::SendMessage(m_hWnd, EM_SETWORDBREAKPROCEX, 0, (LPARAM)pfnEditWordBreakProcEx); - } - - int GetTextRange(TEXTRANGE* pTextRange) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)pTextRange); - } - -#if (_RICHEDIT_VER >= 0x0200) - int GetTextRange(LONG nStartChar, LONG nEndChar, LPTSTR lpstrText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TEXTRANGE tr = { 0 }; - tr.chrg.cpMin = nStartChar; - tr.chrg.cpMax = nEndChar; - tr.lpstrText = lpstrText; - return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr); - } -#else // !(_RICHEDIT_VER >= 0x0200) - - int GetTextRange(LONG nStartChar, LONG nEndChar, LPSTR lpstrText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - TEXTRANGE tr = { 0 }; - tr.chrg.cpMin = nStartChar; - tr.chrg.cpMax = nEndChar; - tr.lpstrText = lpstrText; - return (int)::SendMessage(m_hWnd, EM_GETTEXTRANGE, 0, (LPARAM)&tr); - } -#endif // !(_RICHEDIT_VER >= 0x0200) - -#if (_RICHEDIT_VER >= 0x0200) - DWORD GetDefaultCharFormat(CHARFORMAT2& cf) const - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT2); - return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 0, (LPARAM)&cf); - } - - BOOL SetCharFormat(CHARFORMAT2& cf, WORD wFlags) - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT2); - return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, (WPARAM)wFlags, (LPARAM)&cf); - } - - BOOL SetDefaultCharFormat(CHARFORMAT2& cf) - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT2); - return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, 0, (LPARAM)&cf); - } - - DWORD GetSelectionCharFormat(CHARFORMAT2& cf) const - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT2); - return (DWORD)::SendMessage(m_hWnd, EM_GETCHARFORMAT, 1, (LPARAM)&cf); - } - - BOOL SetSelectionCharFormat(CHARFORMAT2& cf) - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT2); - return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION, (LPARAM)&cf); - } - - BOOL SetWordCharFormat(CHARFORMAT2& cf) - { - ATLASSERT(::IsWindow(m_hWnd)); - cf.cbSize = sizeof(CHARFORMAT2); - return (BOOL)::SendMessage(m_hWnd, EM_SETCHARFORMAT, SCF_SELECTION | SCF_WORD, (LPARAM)&cf); - } - - DWORD GetParaFormat(PARAFORMAT2& pf) const - { - ATLASSERT(::IsWindow(m_hWnd)); - pf.cbSize = sizeof(PARAFORMAT2); - return (DWORD)::SendMessage(m_hWnd, EM_GETPARAFORMAT, 0, (LPARAM)&pf); - } - - BOOL SetParaFormat(PARAFORMAT2& pf) - { - ATLASSERT(::IsWindow(m_hWnd)); - pf.cbSize = sizeof(PARAFORMAT2); - return (BOOL)::SendMessage(m_hWnd, EM_SETPARAFORMAT, 0, (LPARAM)&pf); - } - - TEXTMODE GetTextMode() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (TEXTMODE)::SendMessage(m_hWnd, EM_GETTEXTMODE, 0, 0L); - } - - BOOL SetTextMode(TEXTMODE enumTextMode) - { - ATLASSERT(::IsWindow(m_hWnd)); - return !(BOOL)::SendMessage(m_hWnd, EM_SETTEXTMODE, enumTextMode, 0L); - } - - UNDONAMEID GetUndoName() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETUNDONAME, 0, 0L); - } - - UNDONAMEID GetRedoName() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UNDONAMEID)::SendMessage(m_hWnd, EM_GETREDONAME, 0, 0L); - } - - BOOL CanRedo() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L); - } - - BOOL GetAutoURLDetect() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_GETAUTOURLDETECT, 0, 0L); - } - - BOOL SetAutoURLDetect(BOOL bAutoDetect = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return !(BOOL)::SendMessage(m_hWnd, EM_AUTOURLDETECT, bAutoDetect, 0L); - } - - // this method is deprecated, please use SetAutoURLDetect - BOOL EnableAutoURLDetect(BOOL bEnable = TRUE) { return SetAutoURLDetect(bEnable); } - - UINT SetUndoLimit(UINT uUndoLimit) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_SETUNDOLIMIT, uUndoLimit, 0L); - } - - void SetPalette(HPALETTE hPalette) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETPALETTE, (WPARAM)hPalette, 0L); - } - - int GetTextEx(GETTEXTEX* pGetTextEx, LPTSTR lpstrText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)pGetTextEx, (LPARAM)lpstrText); - } - - int GetTextEx(LPTSTR lpstrText, int nTextLen, DWORD dwFlags = GT_DEFAULT, UINT uCodePage = CP_ACP, LPCSTR lpDefaultChar = NULL, LPBOOL lpUsedDefChar = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - GETTEXTEX gte = { 0 }; - gte.cb = nTextLen * sizeof(TCHAR); - gte.codepage = uCodePage; - gte.flags = dwFlags; - gte.lpDefaultChar = lpDefaultChar; - gte.lpUsedDefChar = lpUsedDefChar; - return (int)::SendMessage(m_hWnd, EM_GETTEXTEX, (WPARAM)>e, (LPARAM)lpstrText); - } - - int GetTextLengthEx(GETTEXTLENGTHEX* pGetTextLengthEx) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)pGetTextLengthEx, 0L); - } - - int GetTextLengthEx(DWORD dwFlags = GTL_DEFAULT, UINT uCodePage = CP_ACP) const - { - ATLASSERT(::IsWindow(m_hWnd)); - GETTEXTLENGTHEX gtle = { 0 }; - gtle.codepage = uCodePage; - gtle.flags = dwFlags; - return (int)::SendMessage(m_hWnd, EM_GETTEXTLENGTHEX, (WPARAM)>le, 0L); - } -#endif // (_RICHEDIT_VER >= 0x0200) - -#if (_RICHEDIT_VER >= 0x0300) - int SetTextEx(SETTEXTEX* pSetTextEx, LPCTSTR lpstrText) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)pSetTextEx, (LPARAM)lpstrText); - } - - int SetTextEx(LPCTSTR lpstrText, DWORD dwFlags = ST_DEFAULT, UINT uCodePage = CP_ACP) - { - ATLASSERT(::IsWindow(m_hWnd)); - SETTEXTEX ste = { 0 }; - ste.flags = dwFlags; - ste.codepage = uCodePage; - return (int)::SendMessage(m_hWnd, EM_SETTEXTEX, (WPARAM)&ste, (LPARAM)lpstrText); - } - - int GetEditStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_GETEDITSTYLE, 0, 0L); - } - - int SetEditStyle(int nStyle, int nMask = -1) - { - ATLASSERT(::IsWindow(m_hWnd)); - if(nMask == -1) - nMask = nStyle; // set everything specified - return (int)::SendMessage(m_hWnd, EM_SETEDITSTYLE, nStyle, nMask); - } - - BOOL SetFontSize(int nFontSizeDelta) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nFontSizeDelta >= -1637 && nFontSizeDelta <= 1638); - return (BOOL)::SendMessage(m_hWnd, EM_SETFONTSIZE, nFontSizeDelta, 0L); - } - - void GetScrollPos(LPPOINT lpPoint) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpPoint != NULL); - ::SendMessage(m_hWnd, EM_GETSCROLLPOS, 0, (LPARAM)lpPoint); - } - - void SetScrollPos(LPPOINT lpPoint) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpPoint != NULL); - ::SendMessage(m_hWnd, EM_SETSCROLLPOS, 0, (LPARAM)lpPoint); - } - - BOOL GetZoom(int& nNum, int& nDen) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_GETZOOM, (WPARAM)&nNum, (LPARAM)&nDen); - } - - BOOL SetZoom(int nNum, int nDen) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nNum >= 0 && nNum <= 64); - ATLASSERT(nDen >= 0 && nDen <= 64); - return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, nNum, nDen); - } - - BOOL SetZoomOff() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETZOOM, 0, 0L); - } -#endif // (_RICHEDIT_VER >= 0x0300) - -// Operations - void LimitText(LONG nChars = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_EXLIMITTEXT, 0, nChars); - } - - int LineFromChar(LONG nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_EXLINEFROMCHAR, 0, nIndex); - } - - POINT PosFromChar(LONG nChar) const - { - ATLASSERT(::IsWindow(m_hWnd)); - POINT point = { 0, 0 }; - ::SendMessage(m_hWnd, EM_POSFROMCHAR, (WPARAM)&point, nChar); - return point; - } - - int CharFromPos(POINT pt) const - { - ATLASSERT(::IsWindow(m_hWnd)); - POINTL ptl = { pt.x, pt.y }; - return (int)::SendMessage(m_hWnd, EM_CHARFROMPOS, 0, (LPARAM)&ptl); - } - - void EmptyUndoBuffer() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_EMPTYUNDOBUFFER, 0, 0L); - } - - int LineIndex(int nLine = -1) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_LINEINDEX, nLine, 0L); - } - - int LineLength(int nLine = -1) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, EM_LINELENGTH, nLine, 0L); - } - - BOOL LineScroll(int nLines, int nChars = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_LINESCROLL, nChars, nLines); - } - - void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM) bCanUndo, (LPARAM)lpszNewText); - } - - void SetRect(LPCRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETRECT, 0, (LPARAM)lpRect); - } - - BOOL DisplayBand(LPRECT pDisplayRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_DISPLAYBAND, 0, (LPARAM)pDisplayRect); - } - - LONG FindText(DWORD dwFlags, FINDTEXT& ft) const - { - ATLASSERT(::IsWindow(m_hWnd)); -#if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE) - return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTW, dwFlags, (LPARAM)&ft); -#else - return (LONG)::SendMessage(m_hWnd, EM_FINDTEXT, dwFlags, (LPARAM)&ft); -#endif - } - - LONG FindText(DWORD dwFlags, FINDTEXTEX& ft) const - { - ATLASSERT(::IsWindow(m_hWnd)); -#if (_RICHEDIT_VER >= 0x0200) && defined(_UNICODE) - return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEXW, dwFlags, (LPARAM)&ft); -#else - return (LONG)::SendMessage(m_hWnd, EM_FINDTEXTEX, dwFlags, (LPARAM)&ft); -#endif - } - - LONG FormatRange(FORMATRANGE& fr, BOOL bDisplay = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)&fr); - } - - LONG FormatRange(FORMATRANGE* pFormatRange, BOOL bDisplay = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_FORMATRANGE, bDisplay, (LPARAM)pFormatRange); - } - - void HideSelection(BOOL bHide = TRUE, BOOL bChangeStyle = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_HIDESELECTION, bHide, bChangeStyle); - } - - void PasteSpecial(UINT uClipFormat, DWORD dwAspect = 0, HMETAFILE hMF = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - REPASTESPECIAL reps = { dwAspect, (DWORD_PTR)hMF }; - ::SendMessage(m_hWnd, EM_PASTESPECIAL, uClipFormat, (LPARAM)&reps); - } - - void RequestResize() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_REQUESTRESIZE, 0, 0L); - } - - LONG StreamIn(UINT uFormat, EDITSTREAM& es) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, uFormat, (LPARAM)&es); - } - - LONG StreamOut(UINT uFormat, EDITSTREAM& es) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, uFormat, (LPARAM)&es); - } - - DWORD FindWordBreak(int nCode, LONG nStartChar) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, EM_FINDWORDBREAK, nCode, nStartChar); - } - - // Additional operations - void ScrollCaret() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SCROLLCARET, 0, 0L); - } - - int InsertText(long nInsertAfterChar, LPCTSTR lpstrText, BOOL bCanUndo = FALSE) - { - int nRet = SetSel(nInsertAfterChar, nInsertAfterChar); - ReplaceSel(lpstrText, bCanUndo); - return nRet; - } - - int AppendText(LPCTSTR lpstrText, BOOL bCanUndo = FALSE) - { - return InsertText(GetWindowTextLength(), lpstrText, bCanUndo); - } - - // Clipboard operations - BOOL Undo() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_UNDO, 0, 0L); - } - - void Clear() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); - } - - void Copy() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_COPY, 0, 0L); - } - - void Cut() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_CUT, 0, 0L); - } - - void Paste() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); - } - - // OLE support - IRichEditOle* GetOleInterface() const - { - ATLASSERT(::IsWindow(m_hWnd)); - IRichEditOle *pRichEditOle = NULL; - ::SendMessage(m_hWnd, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle); - return pRichEditOle; - } - - BOOL SetOleCallback(IRichEditOleCallback* pCallback) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETOLECALLBACK, 0, (LPARAM)pCallback); - } - -#if (_RICHEDIT_VER >= 0x0200) - BOOL Redo() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_REDO, 0, 0L); - } - - void StopGroupTyping() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_STOPGROUPTYPING, 0, 0L); - } - - void ShowScrollBar(int nBarType, BOOL bVisible = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SHOWSCROLLBAR, nBarType, bVisible); - } -#endif // (_RICHEDIT_VER >= 0x0200) - -#if (_RICHEDIT_VER >= 0x0300) - BOOL SetTabStops(int nTabStops, LPINT rgTabStops) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, nTabStops, (LPARAM)rgTabStops); - } - - BOOL SetTabStops() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 0, 0L); - } - - BOOL SetTabStops(const int& cxEachStop) // takes an 'int' - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_SETTABSTOPS, 1, (LPARAM)(LPINT)&cxEachStop); - } -#endif // (_RICHEDIT_VER >= 0x0300) -}; - -typedef CRichEditCtrlT CRichEditCtrl; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CRichEditCommands - message handlers for standard EDIT commands - -#ifndef _WIN32_WCE - -// Chain to CRichEditCommands message map. Your class must also derive from CRichEditCtrl. -// Example: -// class CMyRichEdit : public CWindowImpl, -// public CRichEditCommands -// { -// public: -// BEGIN_MSG_MAP(CMyRichEdit) -// // your handlers... -// CHAIN_MSG_MAP_ALT(CRichEditCommands, 1) -// END_MSG_MAP() -// // other stuff... -// }; - -template -class CRichEditCommands : public CEditCommands< T > -{ -public: - BEGIN_MSG_MAP(CRichEditCommands< T >) - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_EDIT_CLEAR, CEditCommands< T >::OnEditClear) - COMMAND_ID_HANDLER(ID_EDIT_CLEAR_ALL, CEditCommands< T >::OnEditClearAll) - COMMAND_ID_HANDLER(ID_EDIT_COPY, CEditCommands< T >::OnEditCopy) - COMMAND_ID_HANDLER(ID_EDIT_CUT, CEditCommands< T >::OnEditCut) - COMMAND_ID_HANDLER(ID_EDIT_PASTE, CEditCommands< T >::OnEditPaste) - COMMAND_ID_HANDLER(ID_EDIT_SELECT_ALL, CEditCommands< T >::OnEditSelectAll) - COMMAND_ID_HANDLER(ID_EDIT_UNDO, CEditCommands< T >::OnEditUndo) -#if (_RICHEDIT_VER >= 0x0200) - COMMAND_ID_HANDLER(ID_EDIT_REDO, OnEditRedo) -#endif // (_RICHEDIT_VER >= 0x0200) - END_MSG_MAP() - -#if (_RICHEDIT_VER >= 0x0200) - LRESULT OnEditRedo(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->Redo(); - return 0; - } -#endif // (_RICHEDIT_VER >= 0x0200) - -// State (update UI) helpers - BOOL CanCut() const - { return HasSelection(); } - - BOOL CanCopy() const - { return HasSelection(); } - - BOOL CanClear() const - { return HasSelection(); } - -// Implementation - BOOL HasSelection() const - { - const T* pT = static_cast(this); - return (pT->GetSelectionType() != SEL_EMPTY); - } -}; - -#endif // _WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CDragListBox - -#ifndef _WIN32_WCE - -template -class CDragListBoxT : public CListBoxT< TBase > -{ -public: -// Constructors - CDragListBoxT(HWND hWnd = NULL) : CListBoxT< TBase >(hWnd) - { } - - CDragListBoxT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - if(hWnd != NULL) - MakeDragList(); - return hWnd; - } - -// Operations - BOOL MakeDragList() - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((GetStyle() & (LBS_MULTIPLESEL | LBS_EXTENDEDSEL)) == 0); - return ::MakeDragList(m_hWnd); - } - - int LBItemFromPt(POINT pt, BOOL bAutoScroll = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::LBItemFromPt(m_hWnd, pt, bAutoScroll); - } - - void DrawInsert(int nItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::DrawInsert(GetParent(), m_hWnd, nItem); - } - - static UINT GetDragListMessage() - { - static UINT uDragListMessage = 0; - if(uDragListMessage == 0) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CDragListBox::GetDragListMessage.\n")); - ATLASSERT(FALSE); - return 0; - } - - if(uDragListMessage == 0) - uDragListMessage = ::RegisterWindowMessage(DRAGLISTMSGSTRING); - - lock.Unlock(); - } - ATLASSERT(uDragListMessage != 0); - return uDragListMessage; - } -}; - -typedef CDragListBoxT CDragListBox; - -template -class CDragListNotifyImpl -{ -public: - BEGIN_MSG_MAP(CDragListNotifyImpl< T >) - MESSAGE_HANDLER(CDragListBox::GetDragListMessage(), OnDragListNotify) - END_MSG_MAP() - - LRESULT OnDragListNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - uMsg; // avoid level 4 warning - ATLASSERT(uMsg == CDragListBox::GetDragListMessage()); - T* pT = static_cast(this); - LPDRAGLISTINFO lpDragListInfo = (LPDRAGLISTINFO)lParam; - LRESULT lRet = 0; - switch(lpDragListInfo->uNotification) - { - case DL_BEGINDRAG: - lRet = (LPARAM)pT->OnBeginDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); - break; - case DL_CANCELDRAG: - pT->OnCancelDrag((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); - break; - case DL_DRAGGING: - lRet = (LPARAM)pT->OnDragging((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); - break; - case DL_DROPPED: - pT->OnDropped((int)wParam, lpDragListInfo->hWnd, lpDragListInfo->ptCursor); - break; - default: - ATLTRACE2(atlTraceUI, 0, _T("Unknown DragListBox notification\n")); - bHandled = FALSE; // don't handle it - break; - } - return lRet; - } - -// Overrideables - BOOL OnBeginDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) - { - return TRUE; // allow dragging - } - - void OnCancelDrag(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) - { - // nothing to do - } - - int OnDragging(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) - { - return 0; // don't change cursor - } - - void OnDropped(int /*nCtlID*/, HWND /*hWndDragList*/, POINT /*ptCursor*/) - { - // nothing to do - } -}; - -#endif // _WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CReBarCtrl - -template -class CReBarCtrlT : public TBase -{ -public: -// Constructors - CReBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CReBarCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return REBARCLASSNAME; - } - - UINT GetBandCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, RB_GETBANDCOUNT, 0, 0L); - } - - BOOL GetBandInfo(int nBand, LPREBARBANDINFO lprbbi) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_GETBANDINFO, nBand, (LPARAM)lprbbi); - } - - BOOL SetBandInfo(int nBand, LPREBARBANDINFO lprbbi) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_SETBANDINFO, nBand, (LPARAM)lprbbi); - } - - BOOL GetBarInfo(LPREBARINFO lprbi) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)lprbi); - } - - BOOL SetBarInfo(LPREBARINFO lprbi) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)lprbi); - } - - CImageList GetImageList() const - { - ATLASSERT(::IsWindow(m_hWnd)); - REBARINFO rbi = { 0 }; - rbi.cbSize = sizeof(REBARINFO); - rbi.fMask = RBIM_IMAGELIST; - if( (BOOL)::SendMessage(m_hWnd, RB_GETBARINFO, 0, (LPARAM)&rbi) == FALSE ) return CImageList(); - return CImageList(rbi.himl); - } - - BOOL SetImageList(HIMAGELIST hImageList) - { - ATLASSERT(::IsWindow(m_hWnd)); - REBARINFO rbi = { 0 }; - rbi.cbSize = sizeof(REBARINFO); - rbi.fMask = RBIM_IMAGELIST; - rbi.himl = hImageList; - return (BOOL)::SendMessage(m_hWnd, RB_SETBARINFO, 0, (LPARAM)&rbi); - } - - UINT GetRowCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, RB_GETROWCOUNT, 0, 0L); - } - - UINT GetRowHeight(int nBand) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, RB_GETROWHEIGHT, nBand, 0L); - } - -#if (_WIN32_IE >= 0x0400) - COLORREF GetTextColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, RB_GETTEXTCOLOR, 0, 0L); - } - - COLORREF SetTextColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, RB_SETTEXTCOLOR, 0, (LPARAM)clr); - } - - COLORREF GetBkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, RB_GETBKCOLOR, 0, 0L); - } - - COLORREF SetBkColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, RB_SETBKCOLOR, 0, (LPARAM)clr); - } - - UINT GetBarHeight() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, RB_GETBARHEIGHT, 0, 0L); - } - - BOOL GetRect(int nBand, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_GETRECT, nBand, (LPARAM)lpRect); - } - -#ifndef _WIN32_WCE - CToolTipCtrl GetToolTips() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CToolTipCtrl((HWND)::SendMessage(m_hWnd, RB_GETTOOLTIPS, 0, 0L)); - } - - void SetToolTips(HWND hwndToolTip) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_SETTOOLTIPS, (WPARAM)hwndToolTip, 0L); - } -#endif // !_WIN32_WCE - - void GetBandBorders(int nBand, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpRect != NULL); - ::SendMessage(m_hWnd, RB_GETBANDBORDERS, nBand, (LPARAM)lpRect); - } - -#ifndef _WIN32_WCE - BOOL GetColorScheme(LPCOLORSCHEME lpColorScheme) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpColorScheme != NULL); - return (BOOL)::SendMessage(m_hWnd, RB_GETCOLORSCHEME, 0, (LPARAM)lpColorScheme); - } - - void SetColorScheme(LPCOLORSCHEME lpColorScheme) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpColorScheme != NULL); - ::SendMessage(m_hWnd, RB_SETCOLORSCHEME, 0, (LPARAM)lpColorScheme); - } - - HPALETTE GetPalette() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HPALETTE)::SendMessage(m_hWnd, RB_GETPALETTE, 0, 0L); - } - - HPALETTE SetPalette(HPALETTE hPalette) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HPALETTE)::SendMessage(m_hWnd, RB_SETPALETTE, 0, (LPARAM)hPalette); - } - - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // !_WIN32_WCE -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_WINNT >= 0x0501) - // requires uxtheme.h to be included to use MARGINS struct -#ifndef _UXTHEME_H_ - typedef struct _MARGINS* PMARGINS; -#endif // !_UXTHEME_H_ - void GetBandMargins(PMARGINS pMargins) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_GETBANDMARGINS, 0, (LPARAM)pMargins); - } - - void SetWindowTheme(LPCWSTR lpstrTheme) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); - } -#endif // (_WIN32_WINNT >= 0x0501) - -#if (_WIN32_IE >= 0x0600) - DWORD GetExtendedStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, RB_GETEXTENDEDSTYLE, 0, 0L); - } - - DWORD SetExtendedStyle(DWORD dwStyle, DWORD dwMask) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, RB_SETEXTENDEDSTYLE, dwMask, dwStyle); - } -#endif // (_WIN32_IE >= 0x0600) - -// Operations - BOOL InsertBand(int nBand, LPREBARBANDINFO lprbbi) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_INSERTBAND, nBand, (LPARAM)lprbbi); - } - - BOOL AddBand(LPREBARBANDINFO lprbbi) - { - return InsertBand(-1, lprbbi); - } - - BOOL DeleteBand(int nBand) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_DELETEBAND, nBand, 0L); - } - - ATL::CWindow SetNotifyWnd(HWND hWnd) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ATL::CWindow((HWND)::SendMessage(m_hWnd, RB_SETPARENT, (WPARAM)hWnd, 0L)); - } - -#if (_WIN32_IE >= 0x0400) - void BeginDrag(int nBand, DWORD dwPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, dwPos); - } - - void BeginDrag(int nBand, int xPos, int yPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_BEGINDRAG, nBand, MAKELPARAM(xPos, yPos)); - } - - void EndDrag() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_ENDDRAG, 0, 0L); - } - - void DragMove(DWORD dwPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_DRAGMOVE, 0, dwPos); - } - - void DragMove(int xPos, int yPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_DRAGMOVE, 0, MAKELPARAM(xPos, yPos)); - } - -#ifndef _WIN32_WCE - void GetDropTarget(IDropTarget** ppDropTarget) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_GETDROPTARGET, 0, (LPARAM)ppDropTarget); - } -#endif // !_WIN32_WCE - - void MaximizeBand(int nBand, BOOL bIdeal = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_MAXIMIZEBAND, nBand, bIdeal); - } - - void MinimizeBand(int nBand) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_MINIMIZEBAND, nBand, 0L); - } - - BOOL SizeToRect(LPRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_SIZETORECT, 0, (LPARAM)lpRect); - } - - int IdToIndex(UINT uBandID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, RB_IDTOINDEX, uBandID, 0L); - } - - int HitTest(LPRBHITTESTINFO lprbht) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, RB_HITTEST, 0, (LPARAM)lprbht); - } - - BOOL ShowBand(int nBand, BOOL bShow) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_SHOWBAND, nBand, bShow); - } - -#ifndef _WIN32_WCE - BOOL MoveBand(int nBand, int nNewPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nNewPos >= 0 && nNewPos <= ((int)GetBandCount() - 1)); - return (BOOL)::SendMessage(m_hWnd, RB_MOVEBAND, nBand, nNewPos); - } -#endif // !_WIN32_WCE -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - void PushChevron(int nBand, LPARAM lAppValue) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, RB_PUSHCHEVRON, nBand, lAppValue); - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -// Extra operations -#if (_WIN32_IE >= 0x0400) - void LockBands(bool bLock) - { - int nBandCount = GetBandCount(); - for(int i =0; i < nBandCount; i++) - { - REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() }; - rbbi.fMask = RBBIM_STYLE; - BOOL bRet = GetBandInfo(i, &rbbi); - ATLASSERT(bRet); - - if((rbbi.fStyle & RBBS_GRIPPERALWAYS) == 0) - { - rbbi.fStyle |= RBBS_GRIPPERALWAYS; - bRet = SetBandInfo(i, &rbbi); - ATLASSERT(bRet); - rbbi.fStyle &= ~RBBS_GRIPPERALWAYS; - } - - if(bLock) - rbbi.fStyle |= RBBS_NOGRIPPER; - else - rbbi.fStyle &= ~RBBS_NOGRIPPER; - - bRet = SetBandInfo(i, &rbbi); - ATLASSERT(bRet); - } - } -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_WINNT >= 0x0600) - BOOL SetBandWidth(int nBand, int cxWidth) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, RB_SETBANDWIDTH, nBand, cxWidth); - } -#endif // (_WIN32_WINNT >= 0x0600) -}; - -typedef CReBarCtrlT CReBarCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CComboBoxEx - -#ifndef _WIN32_WCE - -template -class CComboBoxExT : public CComboBoxT< TBase > -{ -public: -// Constructors - CComboBoxExT(HWND hWnd = NULL) : CComboBoxT< TBase >(hWnd) - { } - - CComboBoxExT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_COMBOBOXEX; - } - - CImageList GetImageList() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_GETIMAGELIST, 0, 0L)); - } - - CImageList SetImageList(HIMAGELIST hImageList) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CImageList((HIMAGELIST)::SendMessage(m_hWnd, CBEM_SETIMAGELIST, 0, (LPARAM)hImageList)); - } - -#if (_WIN32_IE >= 0x0400) - DWORD GetExtendedStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, CBEM_GETEXTENDEDSTYLE, 0, 0L); - } - - DWORD SetExtendedStyle(DWORD dwExMask, DWORD dwExStyle) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, CBEM_SETEXTENDEDSTYLE, dwExMask, dwExStyle); - } - - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CBEM_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CBEM_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_WINNT >= 0x0501) - void SetWindowTheme(LPCWSTR lpstrTheme) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, CBEM_SETWINDOWTHEME, 0, (LPARAM)lpstrTheme); - } -#endif // (_WIN32_WINNT >= 0x0501) - -// Operations - int InsertItem(const COMBOBOXEXITEM* lpcCBItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)lpcCBItem); - } - - int InsertItem(UINT nMask, int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage, - int iIndent, int iOverlay, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - COMBOBOXEXITEM cbex = { 0 }; - cbex.mask = nMask; - cbex.iItem = nIndex; - cbex.pszText = (LPTSTR) lpszItem; - cbex.iImage = nImage; - cbex.iSelectedImage = nSelImage; - cbex.iIndent = iIndent; - cbex.iOverlay = iOverlay; - cbex.lParam = lParam; - return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex); - } - - int InsertItem(int nIndex, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - COMBOBOXEXITEM cbex = { 0 }; - cbex.mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE | CBEIF_INDENT | CBEIF_LPARAM; - cbex.iItem = nIndex; - cbex.pszText = (LPTSTR) lpszItem; - cbex.iImage = nImage; - cbex.iSelectedImage = nSelImage; - cbex.iIndent = iIndent; - cbex.lParam = lParam; - return (int)::SendMessage(m_hWnd, CBEM_INSERTITEM, 0, (LPARAM)&cbex); - } - - int AddItem(UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, int iOverlay, LPARAM lParam) - { - return InsertItem(nMask, -1, lpszItem, nImage, nSelImage, iIndent, iOverlay, lParam); - } - - int AddItem(LPCTSTR lpszItem, int nImage, int nSelImage, int iIndent, LPARAM lParam = 0) - { - return InsertItem(-1, lpszItem, nImage, nSelImage, iIndent, lParam); - } - - int DeleteItem(int nIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, CBEM_DELETEITEM, nIndex, 0L); - } - - BOOL GetItem(PCOMBOBOXEXITEM pCBItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)pCBItem); - } - - BOOL SetItem(const COMBOBOXEXITEM* lpcCBItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)lpcCBItem); - } - - int SetItem(int nIndex, UINT nMask, LPCTSTR lpszItem, int nImage, int nSelImage, - int iIndent, int iOverlay, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - COMBOBOXEXITEM cbex = { 0 }; - cbex.mask = nMask; - cbex.iItem = nIndex; - cbex.pszText = (LPTSTR) lpszItem; - cbex.iImage = nImage; - cbex.iSelectedImage = nSelImage; - cbex.iIndent = iIndent; - cbex.iOverlay = iOverlay; - cbex.lParam = lParam; - return (int)::SendMessage(m_hWnd, CBEM_SETITEM, 0, (LPARAM)&cbex); - } - - BOOL GetItemText(int nIndex, LPTSTR lpszItem, int nLen) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpszItem != NULL); - - COMBOBOXEXITEM cbex = { 0 }; - cbex.mask = CBEIF_TEXT; - cbex.iItem = nIndex; - cbex.pszText = lpszItem; - cbex.cchTextMax = nLen; - - return (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); - } - -#ifndef _ATL_NO_COM - BOOL GetItemText(int nIndex, BSTR& bstrText) const - { - USES_CONVERSION; - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(bstrText == NULL); - - COMBOBOXEXITEM cbex = { 0 }; - cbex.mask = CBEIF_TEXT; - cbex.iItem = nIndex; - - LPTSTR lpstrText = NULL; - BOOL bRet = FALSE; - for(int nLen = 256; ; nLen *= 2) - { - ATLTRY(lpstrText = new TCHAR[nLen]); - if(lpstrText == NULL) - break; - lpstrText[0] = NULL; - cbex.pszText = lpstrText; - cbex.cchTextMax = nLen; - bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); - if(!bRet || (lstrlen(cbex.pszText) < nLen - 1)) - break; - delete [] lpstrText; - lpstrText = NULL; - } - - if(lpstrText != NULL) - { - if(bRet) - bstrText = ::SysAllocString(T2OLE(lpstrText)); - delete [] lpstrText; - } - - return (bstrText != NULL) ? TRUE : FALSE; - } -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - BOOL GetItemText(int nIndex, _CSTRING_NS::CString& strText) const - { - ATLASSERT(::IsWindow(m_hWnd)); - - COMBOBOXEXITEM cbex = { 0 }; - cbex.mask = CBEIF_TEXT; - cbex.iItem = nIndex; - - strText.Empty(); - BOOL bRet = FALSE; - for(int nLen = 256; ; nLen *= 2) - { - cbex.pszText = strText.GetBufferSetLength(nLen); - if(cbex.pszText == NULL) - { - bRet = FALSE; - break; - } - cbex.cchTextMax = nLen; - bRet = (BOOL)::SendMessage(m_hWnd, CBEM_GETITEM, 0, (LPARAM)&cbex); - if(!bRet || (lstrlen(cbex.pszText) < nLen - 1)) - break; - } - strText.ReleaseBuffer(); - return bRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - BOOL SetItemText(int nIndex, LPCTSTR lpszItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return SetItem(nIndex, CBEIF_TEXT, lpszItem, 0, 0, 0, 0, 0); - } - - CComboBox GetComboCtrl() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CComboBox((HWND)::SendMessage(m_hWnd, CBEM_GETCOMBOCONTROL, 0, 0L)); - } - - CEdit GetEditCtrl() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CEdit((HWND)::SendMessage(m_hWnd, CBEM_GETEDITCONTROL, 0, 0L)); - } - - BOOL HasEditChanged() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, CBEM_HASEDITCHANGED, 0, 0L); - } - -// Non-functional - int AddString(LPCTSTR /*lpszItem*/) - { - ATLASSERT(FALSE); // Not available in CComboBoxEx; use InsertItem - return 0; - } - - int InsertString(int /*nIndex*/, LPCTSTR /*lpszString*/) - { - ATLASSERT(FALSE); // Not available in CComboBoxEx; use InsertItem - return 0; - } - - int Dir(UINT /*attr*/, LPCTSTR /*lpszWildCard*/) - { - ATLASSERT(FALSE); // Not available in CComboBoxEx - return 0; - } - - int FindString(int /*nStartAfter*/, LPCTSTR /*lpszString*/) const - { - ATLASSERT(FALSE); // Not available in CComboBoxEx; try FindStringExact - return 0; - } -}; - -typedef CComboBoxExT CComboBoxEx; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CMonthCalendarCtrl - -template -class CMonthCalendarCtrlT : public TBase -{ -public: -// Constructors - CMonthCalendarCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CMonthCalendarCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return MONTHCAL_CLASS; - } - - COLORREF GetColor(int nColorType) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, MCM_GETCOLOR, nColorType, 0L); - } - - COLORREF SetColor(int nColorType, COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, MCM_SETCOLOR, nColorType, clr); - } - - BOOL GetCurSel(LPSYSTEMTIME lpSysTime) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_GETCURSEL, 0, (LPARAM)lpSysTime); - } - - BOOL SetCurSel(LPSYSTEMTIME lpSysTime) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_SETCURSEL, 0, (LPARAM)lpSysTime); - } - - int GetFirstDayOfWeek(BOOL* pbLocaleVal = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_GETFIRSTDAYOFWEEK, 0, 0L); - if(pbLocaleVal != NULL) - *pbLocaleVal = (BOOL)HIWORD(dwRet); - return (int)(short)LOWORD(dwRet); - } - - int SetFirstDayOfWeek(int nDay, BOOL* pbLocaleVal = NULL) - { - ATLASSERT(::IsWindow(m_hWnd)); - DWORD dwRet = (DWORD)::SendMessage(m_hWnd, MCM_SETFIRSTDAYOFWEEK, 0, nDay); - if(pbLocaleVal != NULL) - *pbLocaleVal = (BOOL)HIWORD(dwRet); - return (int)(short)LOWORD(dwRet); - } - - int GetMaxSelCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, MCM_GETMAXSELCOUNT, 0, 0L); - } - - BOOL SetMaxSelCount(int nMax) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_SETMAXSELCOUNT, nMax, 0L); - } - - int GetMonthDelta() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, MCM_GETMONTHDELTA, 0, 0L); - } - - int SetMonthDelta(int nDelta) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, MCM_SETMONTHDELTA, nDelta, 0L); - } - - DWORD GetRange(LPSYSTEMTIME lprgSysTimeArray) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, MCM_GETRANGE, 0, (LPARAM)lprgSysTimeArray); - } - - BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_SETRANGE, dwFlags, (LPARAM)lprgSysTimeArray); - } - - BOOL GetSelRange(LPSYSTEMTIME lprgSysTimeArray) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_GETSELRANGE, 0, (LPARAM)lprgSysTimeArray); - } - - BOOL SetSelRange(LPSYSTEMTIME lprgSysTimeArray) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_SETSELRANGE, 0, (LPARAM)lprgSysTimeArray); - } - - BOOL GetToday(LPSYSTEMTIME lpSysTime) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_GETTODAY, 0, (LPARAM)lpSysTime); - } - - void SetToday(LPSYSTEMTIME lpSysTime) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, MCM_SETTODAY, 0, (LPARAM)lpSysTime); - } - - BOOL GetMinReqRect(LPRECT lpRectInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_GETMINREQRECT, 0, (LPARAM)lpRectInfo); - } - - int GetMaxTodayWidth() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, MCM_GETMAXTODAYWIDTH, 0, 0L); - } - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - BOOL GetUnicodeFormat() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_GETUNICODEFORMAT, 0, 0L); - } - - BOOL SetUnicodeFormat(BOOL bUnicode = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_SETUNICODEFORMAT, bUnicode, 0L); - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) - DWORD GetCurrentView() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, MCM_GETCURRENTVIEW, 0, 0L); - } - - BOOL SetCurrentView(DWORD dwView) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_SETCURRENTVIEW, 0, dwView); - } - - DWORD GetCalendarCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, MCM_GETCALENDARCOUNT, 0, 0L); - } - - BOOL GetCalendarGridInfo(PMCGRIDINFO pGridInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_GETCALENDARGRIDINFO, 0, (LPARAM)pGridInfo); - } - - CALID GetCALID() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (CALID)::SendMessage(m_hWnd, MCM_GETCALID, 0, 0L); - } - - void SetCALID(CALID calid) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, MCM_SETCALID, (LPARAM)calid, 0L); - } - - int GetCalendarBorder() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, MCM_GETCALENDARBORDER, 0, 0L); - } - - void SetCalendarBorder(int cxyBorder, BOOL bSet = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, MCM_SETCALENDARBORDER, (WPARAM)bSet, (LPARAM)cxyBorder); - } -#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) - -// Operations - int GetMonthRange(DWORD dwFlags, LPSYSTEMTIME lprgSysTimeArray) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, MCM_GETMONTHRANGE, dwFlags, (LPARAM)lprgSysTimeArray); - } - - BOOL SetDayState(int nMonths, LPMONTHDAYSTATE lpDayStateArray) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, MCM_SETDAYSTATE, nMonths, (LPARAM)lpDayStateArray); - } - - DWORD HitTest(PMCHITTESTINFO pMCHitTest) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, MCM_HITTEST, 0, (LPARAM)pMCHitTest); - } - -#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) - void SizeRectToMin(LPRECT lpRect) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, MCM_SIZERECTTOMIN, 0, (LPARAM)lpRect); - } -#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) -}; - -typedef CMonthCalendarCtrlT CMonthCalendarCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CDateTimePickerCtrl - -template -class CDateTimePickerCtrlT : public TBase -{ -public: -// Constructors - CDateTimePickerCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CDateTimePickerCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Operations - static LPCTSTR GetWndClassName() - { - return DATETIMEPICK_CLASS; - } - - BOOL SetFormat(LPCTSTR lpszFormat) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, DTM_SETFORMAT, 0, (LPARAM)lpszFormat); - } - - COLORREF GetMonthCalColor(int nColorType) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, DTM_GETMCCOLOR, nColorType, 0L); - } - - COLORREF SetMonthCalColor(int nColorType, COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, DTM_SETMCCOLOR, nColorType, clr); - } - - DWORD GetRange(LPSYSTEMTIME lpSysTimeArray) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, DTM_GETRANGE, 0, (LPARAM)lpSysTimeArray); - } - - BOOL SetRange(DWORD dwFlags, LPSYSTEMTIME lpSysTimeArray) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, DTM_SETRANGE, dwFlags, (LPARAM)lpSysTimeArray); - } - - DWORD GetSystemTime(LPSYSTEMTIME lpSysTime) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, DTM_GETSYSTEMTIME, 0, (LPARAM)lpSysTime); - } - - BOOL SetSystemTime(DWORD dwFlags, LPSYSTEMTIME lpSysTime) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, DTM_SETSYSTEMTIME, dwFlags, (LPARAM)lpSysTime); - } - - CMonthCalendarCtrl GetMonthCal() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CMonthCalendarCtrl((HWND)::SendMessage(m_hWnd, DTM_GETMONTHCAL, 0, 0L)); - } - -#if (_WIN32_IE >= 0x0400) - CFontHandle GetMonthCalFont() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CFontHandle((HFONT)::SendMessage(m_hWnd, DTM_GETMCFONT, 0, 0L)); - } - - void SetMonthCalFont(HFONT hFont, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_SETMCFONT, (WPARAM)hFont, MAKELPARAM(bRedraw, 0)); - } -#endif // (_WIN32_IE >= 0x0400) - -#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) - DWORD GetMonthCalStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, DTM_GETMCSTYLE, 0, 0L); - } - - DWORD SetMonthCalStyle(DWORD dwStyle) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (DWORD)::SendMessage(m_hWnd, DTM_SETMCSTYLE, 0, (LPARAM)dwStyle); - } - - void GetDateTimePickerInfo(LPDATETIMEPICKERINFO lpPickerInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_GETDATETIMEPICKERINFO, 0, (LPARAM)lpPickerInfo); - } - - BOOL GetIdealSize(LPSIZE lpSize) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, DTM_GETIDEALSIZE, 0, (LPARAM)lpSize); - } - - void CloseMonthCal() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_CLOSEMONTHCAL, 0, 0L); - } -#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) -}; - -typedef CDateTimePickerCtrlT CDateTimePickerCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CFlatScrollBarImpl - support for flat scroll bars - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -template -class CFlatScrollBarImpl -{ -public: -// Initialization - BOOL FlatSB_Initialize() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::InitializeFlatSB(pT->m_hWnd); - } - - HRESULT FlatSB_Uninitialize() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::UninitializeFlatSB(pT->m_hWnd); - } - -// Flat scroll bar properties - BOOL FlatSB_GetScrollProp(UINT uIndex, LPINT lpnValue) const - { - const T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_GetScrollProp(pT->m_hWnd, uIndex, lpnValue); - } - - BOOL FlatSB_SetScrollProp(UINT uIndex, int nValue, BOOL bRedraw = TRUE) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_SetScrollProp(pT->m_hWnd, uIndex, nValue, bRedraw); - } - -// Attributes - int FlatSB_GetScrollPos(int nBar) const - { - const T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_GetScrollPos(pT->m_hWnd, nBar); - } - - int FlatSB_SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_SetScrollPos(pT->m_hWnd, nBar, nPos, bRedraw); - } - - BOOL FlatSB_GetScrollRange(int nBar, LPINT lpMinPos, LPINT lpMaxPos) const - { - const T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_GetScrollRange(pT->m_hWnd, nBar, lpMinPos, lpMaxPos); - } - - BOOL FlatSB_SetScrollRange(int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = TRUE) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_SetScrollRange(pT->m_hWnd, nBar, nMinPos, nMaxPos, bRedraw); - } - - BOOL FlatSB_GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo) const - { - const T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_GetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo); - } - - int FlatSB_SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_SetScrollInfo(pT->m_hWnd, nBar, lpScrollInfo, bRedraw); - } - -// Operations - BOOL FlatSB_ShowScrollBar(UINT nBar, BOOL bShow = TRUE) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_ShowScrollBar(pT->m_hWnd, nBar, bShow); - } - - BOOL FlatSB_EnableScrollBar(UINT uSBFlags, UINT uArrowFlags = ESB_ENABLE_BOTH) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::FlatSB_EnableScrollBar(pT->m_hWnd, uSBFlags, uArrowFlags); - } -}; - -template -class CFlatScrollBarT : public TBase, public CFlatScrollBarImpl > -{ -public: - CFlatScrollBarT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CFlatScrollBarT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } -}; - -typedef CFlatScrollBarT CFlatScrollBar; - -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// CIPAddressCtrl - -#if (_WIN32_IE >= 0x0400) - -template -class CIPAddressCtrlT : public TBase -{ -public: -// Constructors - CIPAddressCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CIPAddressCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Atteributes - static LPCTSTR GetWndClassName() - { - return WC_IPADDRESS; - } - - BOOL IsBlank() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, IPM_ISBLANK, 0, 0L); - } - - int GetAddress(LPDWORD lpdwAddress) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, IPM_GETADDRESS, 0, (LPARAM)lpdwAddress); - } - - void SetAddress(DWORD dwAddress) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IPM_SETADDRESS, 0, dwAddress); - } - - void ClearAddress() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IPM_CLEARADDRESS, 0, 0L); - } - - void SetRange(int nField, WORD wRange) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IPM_SETRANGE, nField, wRange); - } - - void SetRange(int nField, BYTE nMin, BYTE nMax) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IPM_SETRANGE, nField, MAKEIPRANGE(nMin, nMax)); - } - - void SetFocus(int nField) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IPM_SETFOCUS, nField, 0L); - } -}; - -typedef CIPAddressCtrlT CIPAddressCtrl; - -#endif // (_WIN32_IE >= 0x0400) - - -/////////////////////////////////////////////////////////////////////////////// -// CPagerCtrl - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -template -class CPagerCtrlT : public TBase -{ -public: -// Constructors - CPagerCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CPagerCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_PAGESCROLLER; - } - - int GetButtonSize() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PGM_GETBUTTONSIZE, 0, 0L); - } - - int SetButtonSize(int nButtonSize) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PGM_SETBUTTONSIZE, 0, nButtonSize); - } - - DWORD GetButtonState(int nButton) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nButton == PGB_TOPORLEFT || nButton == PGB_BOTTOMORRIGHT); - return (DWORD)::SendMessage(m_hWnd, PGM_GETBUTTONSTATE, 0, nButton); - } - - COLORREF GetBkColor() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, PGM_GETBKCOLOR, 0, 0L); - } - - COLORREF SetBkColor(COLORREF clrBk) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (COLORREF)::SendMessage(m_hWnd, PGM_SETBKCOLOR, 0, (LPARAM)clrBk); - } - - int GetBorder() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PGM_GETBORDER, 0, 0L); - } - - int SetBorder(int nBorderSize) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PGM_SETBORDER, 0, nBorderSize); - } - - int GetPos() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PGM_GETPOS, 0, 0L); - } - - int SetPos(int nPos) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PGM_SETPOS, 0, nPos); - } - -// Operations - void SetChild(HWND hWndChild) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PGM_SETCHILD, 0, (LPARAM)hWndChild); - } - - void ForwardMouse(BOOL bForward = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PGM_FORWARDMOUSE, bForward, 0L); - } - - void RecalcSize() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PGM_RECALCSIZE, 0, 0L); - } - - void GetDropTarget(IDropTarget** ppDropTarget) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(ppDropTarget != NULL); - ::SendMessage(m_hWnd, PGM_GETDROPTARGET, 0, (LPARAM)ppDropTarget); - } -}; - -typedef CPagerCtrlT CPagerCtrl; - -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// CLinkCtrl - Windows SYSLINK control - -#if (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE) - -template -class CLinkCtrlT : public TBase -{ -public: -// Constructors - CLinkCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CLinkCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - return TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - } - -// Attributes - static LPCTSTR GetWndClassName() - { -#ifdef _UNICODE - return WC_LINK; -#else // !_UNICODE - return "SysLink"; -#endif // !_UNICODE - } - - int GetIdealHeight(int cxMaxWidth = 0) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LM_GETIDEALHEIGHT, cxMaxWidth, 0L); - } - - BOOL GetItem(PLITEM pLItem) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LM_GETITEM, 0, (LPARAM)pLItem); - } - - BOOL SetItem(PLITEM pLItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LM_SETITEM, 0, (LPARAM)pLItem); - } - - // Vista only - int GetIdealSize(SIZE& size, int cxMaxWidth = 0) const - { -#ifndef LM_GETIDEALSIZE - const UINT LM_GETIDEALSIZE = LM_GETIDEALHEIGHT; -#endif - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, LM_GETIDEALSIZE, cxMaxWidth, (LPARAM)&size); - } - -// Operations - BOOL HitTest(PLHITTESTINFO pLHitTestInfo) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, LM_HITTEST, 0, (LPARAM)pLHitTestInfo); - } -}; - -typedef CLinkCtrlT CLinkCtrl; - -#endif // (_WIN32_WINNT >= 0x0501) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// CCustomDraw - MI class for custom-draw support - -template -class CCustomDraw -{ -public: -#if (_ATL_VER < 0x0700) - BOOL m_bHandledCD; - - BOOL IsMsgHandled() const - { - return m_bHandledCD; - } - - void SetMsgHandled(BOOL bHandled) - { - m_bHandledCD = bHandled; - } -#endif // !(_ATL_VER < 0x0700) - -// Message map and handlers - BEGIN_MSG_MAP(CCustomDraw< T >) - NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw) - ALT_MSG_MAP(1) - REFLECTED_NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnCustomDraw) - END_MSG_MAP() - -// message handler - LRESULT OnCustomDraw(int idCtrl, LPNMHDR pnmh, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->SetMsgHandled(TRUE); - LPNMCUSTOMDRAW lpNMCustomDraw = (LPNMCUSTOMDRAW)pnmh; - DWORD dwRet = 0; - switch(lpNMCustomDraw->dwDrawStage) - { - case CDDS_PREPAINT: - dwRet = pT->OnPrePaint(idCtrl, lpNMCustomDraw); - break; - case CDDS_POSTPAINT: - dwRet = pT->OnPostPaint(idCtrl, lpNMCustomDraw); - break; - case CDDS_PREERASE: - dwRet = pT->OnPreErase(idCtrl, lpNMCustomDraw); - break; - case CDDS_POSTERASE: - dwRet = pT->OnPostErase(idCtrl, lpNMCustomDraw); - break; - case CDDS_ITEMPREPAINT: - dwRet = pT->OnItemPrePaint(idCtrl, lpNMCustomDraw); - break; - case CDDS_ITEMPOSTPAINT: - dwRet = pT->OnItemPostPaint(idCtrl, lpNMCustomDraw); - break; - case CDDS_ITEMPREERASE: - dwRet = pT->OnItemPreErase(idCtrl, lpNMCustomDraw); - break; - case CDDS_ITEMPOSTERASE: - dwRet = pT->OnItemPostErase(idCtrl, lpNMCustomDraw); - break; -#if (_WIN32_IE >= 0x0400) - case (CDDS_ITEMPREPAINT | CDDS_SUBITEM): - dwRet = pT->OnSubItemPrePaint(idCtrl, lpNMCustomDraw); - break; -#endif // (_WIN32_IE >= 0x0400) - default: - pT->SetMsgHandled(FALSE); - break; - } - bHandled = pT->IsMsgHandled(); - return dwRet; - } - -// Overrideables - DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } - - DWORD OnPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } - - DWORD OnPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } - - DWORD OnPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } - - DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } - - DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } - - DWORD OnItemPreErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } - - DWORD OnItemPostErase(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } - -#if (_WIN32_IE >= 0x0400) - DWORD OnSubItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_DODEFAULT; - } -#endif // (_WIN32_IE >= 0x0400) -}; - - -// --- Windows CE common controls --- - -#ifdef _WIN32_WCE - -/////////////////////////////////////////////////////////////////////////////// -// CCECommandBarCtrl - -template -class CCECommandBarCtrlT : public TBase -{ -public: -// Constructors - CCECommandBarCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } - - CCECommandBarCtrlT< TBase >& operator=(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Attributes - BOOL IsVisible() const - { - return IsWindowVisible(); - } - - int GetHeight() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_Height(m_hWnd); - } - - HMENU GetMenu(WORD wButton) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_GetMenu(m_hWnd, wButton); - } - -// Operations - HWND Create(HWND hWndParent, int nCmdBarID) - { - m_hWnd = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), hWndParent, nCmdBarID); - ATLASSERT(::IsWindow(m_hWnd)); - return m_hWnd; - } - - void Destroy() - { - DestroyWindow(); - } - - BOOL Show(BOOL bShow = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_Show(m_hWnd, bShow); - } - - BOOL DrawMenuBar(WORD wButton) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_DrawMenuBar(m_hWnd, wButton); - } - - BOOL AddAdornments(DWORD dwFlags = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_AddAdornments(m_hWnd, dwFlags, 0); - } - - int AddBitmap(int nBitmapID, int nNumImages) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_AddBitmap(m_hWnd, ModuleHelper::GetResourceInstance(), nBitmapID, nNumImages, 16, 16); - } - - BOOL AddButtons(UINT uNumButtons, LPTBBUTTON lpButtons) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CommandBar_AddButtons(m_hWnd, uNumButtons, lpButtons); - } - - BOOL AddToolTips(UINT uNumToolTips, LPTSTR lpToolTips) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CommandBar_AddToolTips(m_hWnd, uNumToolTips, lpToolTips); - } - - BOOL InsertButton(int nButton, LPTBBUTTON lpButton) - { - ATLASSERT(::IsWindow(m_hWnd)); - return CommandBar_InsertButton(m_hWnd, nButton, lpButton); - } - - HWND InsertComboBox(int nWidth, UINT dwStyle, WORD wComboBoxID, WORD wButton) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_InsertComboBox(m_hWnd, ModuleHelper::GetModuleInstance(), nWidth, dwStyle, wComboBoxID, wButton); - } - - BOOL InsertMenubar(WORD wMenuID, WORD wButton) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_InsertMenubar(m_hWnd, ModuleHelper::GetResourceInstance(), wMenuID, wButton); - } - - BOOL InsertMenubarEx(ATL::_U_STRINGorID menu, WORD wButton) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBar_InsertMenubarEx(m_hWnd, ModuleHelper::GetResourceInstance(), (LPTSTR)menu.m_lpstr, wButton); - } - - BOOL IsCommandBarMessage(LPMSG lpMsg) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::IsCommandBarMessage(m_hWnd, lpMsg); - } -}; - -#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC MenuBar - typedef CCECommandBarCtrlT CMenuBarCtrl; -#else - typedef CCECommandBarCtrlT CCECommandBarCtrl; -#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) - -/////////////////////////////////////////////////////////////////////////////// -// CCECommandBandsCtrl - -template -class CCECommandBandsCtrlT : public TBase -{ -public: -// Constructors - CCECommandBandsCtrlT(HWND hWnd = NULL) : TBase(hWnd) { } - - CCECommandBandsCtrlT< TBase >& operator=(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Attributes - BOOL IsVisible() const - { - return IsWindowVisible(); - } - -#if (_WIN32_IE >= 0x0400) - UINT GetHeight() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CommandBands_Height(m_hWnd); - } -#endif // (_WIN32_IE >= 0x0400) - - HWND GetCommandBar(UINT uBand) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBands_GetCommandBar(m_hWnd, uBand); - } - - BOOL GetRestoreInformation(UINT uBand, LPCOMMANDBANDSRESTOREINFO pcbr) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBands_GetRestoreInformation(m_hWnd, uBand, pcbr); - } - -// Operations - HWND Create(HWND hWndParent, UINT wID, DWORD dwStyles, HIMAGELIST hImageList = NULL) - { - m_hWnd = ::CommandBands_Create(ModuleHelper::GetModuleInstance(), hWndParent, wID, dwStyles, hImageList); - ATLASSERT(::IsWindow(m_hWnd)); - return m_hWnd; - } - - BOOL AddAdornments(DWORD dwFlags = 0, LPREBARBANDINFO prbbi = NULL) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBands_AddAdornments(m_hWnd, ModuleHelper::GetModuleInstance(), dwFlags, prbbi); - } - - BOOL AddBands(UINT uBandCount, LPREBARBANDINFO prbbi) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBands_AddBands(m_hWnd, ModuleHelper::GetModuleInstance(), uBandCount, prbbi); - } - - BOOL Show(BOOL bShow = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::CommandBands_Show(m_hWnd, bShow); - } -}; - -typedef CCECommandBandsCtrlT CCECommandBandsCtrl; - -#endif // _WIN32_WCE - -}; // namespace WTL - -#endif // __ATLCTRLS_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlctrlw.h b/plugins/SmartAutoReplier/wtl/atlctrlw.h deleted file mode 100644 index 7f95bdfda1..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlctrlw.h +++ /dev/null @@ -1,4157 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLCTRLW_H__ -#define __ATLCTRLW_H__ - -#pragma once - -#ifdef _WIN32_WCE - #error atlctrlw.h is not supported on Windows CE -#endif - -#ifndef __ATLAPP_H__ - #error atlctrlw.h requires atlapp.h to be included first -#endif - -#ifndef __ATLCTRLS_H__ - #error atlctrlw.h requires atlctrls.h to be included first -#endif - -#if (_WIN32_IE < 0x0400) - #error atlctrlw.h requires _WIN32_IE >= 0x0400 -#endif - -// Define _WTL_CMDBAR_VISTA_MENUS as 0 to exclude Vista menus support -#if !defined(_WTL_CMDBAR_VISTA_MENUS) && (WINVER >= 0x0500) && (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) - #define _WTL_CMDBAR_VISTA_MENUS 1 -#endif - -#if _WTL_CMDBAR_VISTA_MENUS - #if !((_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501)) - #error _WTL_CMDBAR_VISTA_MENUS requires (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CCommandBarCtrlImpl -// CCommandBarCtrl -// CMDICommandBarCtrlImpl -// CMDICommandBarCtrl - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// Command Bars - -// Window Styles: -#define CBRWS_TOP CCS_TOP -#define CBRWS_BOTTOM CCS_BOTTOM -#define CBRWS_NORESIZE CCS_NORESIZE -#define CBRWS_NOPARENTALIGN CCS_NOPARENTALIGN -#define CBRWS_NODIVIDER CCS_NODIVIDER - -// Extended styles -#define CBR_EX_TRANSPARENT 0x00000001L -#define CBR_EX_SHAREMENU 0x00000002L -#define CBR_EX_ALTFOCUSMODE 0x00000004L -#define CBR_EX_TRACKALWAYS 0x00000008L -#define CBR_EX_NOVISTAMENUS 0x00000010L - -// standard command bar styles -#define ATL_SIMPLE_CMDBAR_PANE_STYLE \ - (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CBRWS_NODIVIDER | CBRWS_NORESIZE | CBRWS_NOPARENTALIGN) - -// Messages - support chevrons for frame windows -#define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND -#define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu -#define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu - -typedef struct tagCBRPOPUPMENU -{ - int cbSize; - HMENU hMenu; // popup menu do display - UINT uFlags; // TPM_* flags for ::TrackPopupMenuEx - int x; - int y; - LPTPMPARAMS lptpm; // ptr to TPMPARAMS for ::TrackPopupMenuEx -} CBRPOPUPMENU, *LPCBRPOPUPMENU; - -// helper class -template -class CSimpleStack : public ATL::CSimpleArray< T > -{ -public: - BOOL Push(T t) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - STACK-PUSH (%8.8X) size = %i\n"), t, GetSize()); -#endif - return Add(t); - } - - T Pop() - { - int nLast = GetSize() - 1; - if(nLast < 0) - return NULL; // must be able to convert to NULL - T t = m_aT[nLast]; -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - STACK-POP (%8.8X) size = %i\n"), t, GetSize()); -#endif - if(!RemoveAt(nLast)) - return NULL; - return t; - } - - T GetCurrent() - { - int nLast = GetSize() - 1; - if(nLast < 0) - return NULL; // must be able to convert to NULL - return m_aT[nLast]; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CCommandBarCtrlBase - base class for the Command Bar implementation - -class CCommandBarCtrlBase : public CToolBarCtrl -{ -public: - struct _MsgHookData - { - HHOOK hMsgHook; - DWORD dwUsage; - - _MsgHookData() : hMsgHook(NULL), dwUsage(0) - { } - }; - - typedef ATL::CSimpleMap CMsgHookMap; - static CMsgHookMap* s_pmapMsgHook; - - static HHOOK s_hCreateHook; - static bool s_bW2K; // For animation flag - static CCommandBarCtrlBase* s_pCurrentBar; - static bool s_bStaticInit; - - CSimpleStack m_stackMenuWnd; - CSimpleStack m_stackMenuHandle; - - HWND m_hWndHook; - DWORD m_dwMagic; - - - CCommandBarCtrlBase() : m_hWndHook(NULL), m_dwMagic(1314) - { - // init static variables - if(!s_bStaticInit) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlBase::CCommandBarCtrlBase.\n")); - ATLASSERT(FALSE); - return; - } - - if(!s_bStaticInit) - { - // Just in case... - AtlInitCommonControls(ICC_COOL_CLASSES | ICC_BAR_CLASSES); - // Animation on Win2000 only - s_bW2K = !AtlIsOldWindows(); - // done - s_bStaticInit = true; - } - - lock.Unlock(); - } - } - - bool IsCommandBarBase() const { return m_dwMagic == 1314; } -}; - -__declspec(selectany) CCommandBarCtrlBase::CMsgHookMap* CCommandBarCtrlBase::s_pmapMsgHook = NULL; -__declspec(selectany) HHOOK CCommandBarCtrlBase::s_hCreateHook = NULL; -__declspec(selectany) CCommandBarCtrlBase* CCommandBarCtrlBase::s_pCurrentBar = NULL; -__declspec(selectany) bool CCommandBarCtrlBase::s_bW2K = false; -__declspec(selectany) bool CCommandBarCtrlBase::s_bStaticInit = false; - - -/////////////////////////////////////////////////////////////////////////////// -// CCommandBarCtrl - ATL implementation of Command Bars - -template -class ATL_NO_VTABLE CCommandBarCtrlImpl : public ATL::CWindowImpl< T, TBase, TWinTraits > -{ -public: - DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) - -// Declarations - struct _MenuItemData // menu item data - { - DWORD dwMagic; - LPTSTR lpstrText; - UINT fType; - UINT fState; - int iButton; - - _MenuItemData() { dwMagic = 0x1313; } - bool IsCmdBarMenuItem() { return (dwMagic == 0x1313); } - }; - - struct _ToolBarData // toolbar resource data - { - WORD wVersion; - WORD wWidth; - WORD wHeight; - WORD wItemCount; - //WORD aItems[wItemCount] - - WORD* items() - { return (WORD*)(this+1); } - }; - -// Constants - enum _CmdBarDrawConstants - { - s_kcxGap = 1, - s_kcxTextMargin = 2, - s_kcxButtonMargin = 3, - s_kcyButtonMargin = 3 - }; - - enum - { - _nMaxMenuItemTextLength = 100, - _chChevronShortcut = _T('/') - }; - -#ifndef DT_HIDEPREFIX - enum { DT_HIDEPREFIX = 0x00100000 }; -#endif // !DT_HIDEPREFIX - -// Data members - HMENU m_hMenu; - HIMAGELIST m_hImageList; - ATL::CSimpleValArray m_arrCommand; - - DWORD m_dwExtendedStyle; // Command Bar specific extended styles - - ATL::CContainedWindow m_wndParent; - - bool m_bMenuActive:1; - bool m_bAttachedMenu:1; - bool m_bImagesVisible:1; - bool m_bPopupItem:1; - bool m_bContextMenu:1; - bool m_bEscapePressed:1; - bool m_bSkipMsg:1; - bool m_bParentActive:1; - bool m_bFlatMenus:1; - bool m_bUseKeyboardCues:1; - bool m_bShowKeyboardCues:1; - bool m_bAllowKeyboardCues:1; - bool m_bKeyboardInput:1; - bool m_bAlphaImages:1; - bool m_bLayoutRTL:1; - bool m_bSkipPostDown:1; - bool m_bVistaMenus:1; - - int m_nPopBtn; - int m_nNextPopBtn; - - SIZE m_szBitmap; - SIZE m_szButton; - - COLORREF m_clrMask; - CFont m_fontMenu; // used internally, only to measure text - - UINT m_uSysKey; - - HWND m_hWndFocus; // Alternate focus mode - - int m_cxExtraSpacing; - -#if _WTL_CMDBAR_VISTA_MENUS - ATL::CSimpleValArray m_arrVistaBitmap; // Bitmaps for Vista menus -#endif // _WTL_CMDBAR_VISTA_MENUS - -// Constructor/destructor - CCommandBarCtrlImpl() : - m_hMenu(NULL), - m_hImageList(NULL), - m_wndParent(this, 1), - m_bMenuActive(false), - m_bAttachedMenu(false), - m_nPopBtn(-1), - m_nNextPopBtn(-1), - m_bPopupItem(false), - m_bImagesVisible(true), - m_bSkipMsg(false), - m_uSysKey(0), - m_hWndFocus(NULL), - m_bContextMenu(false), - m_bEscapePressed(false), - m_clrMask(RGB(192, 192, 192)), - m_dwExtendedStyle(CBR_EX_TRANSPARENT | CBR_EX_SHAREMENU | CBR_EX_TRACKALWAYS), - m_bParentActive(true), - m_bFlatMenus(false), - m_bUseKeyboardCues(false), - m_bShowKeyboardCues(false), - m_bAllowKeyboardCues(true), - m_bKeyboardInput(false), - m_cxExtraSpacing(0), - m_bAlphaImages(false), - m_bLayoutRTL(false), - m_bSkipPostDown(false), - m_bVistaMenus(false) - { - SetImageSize(16, 15); // default - } - - ~CCommandBarCtrlImpl() - { - if(m_wndParent.IsWindow()) -/*scary!*/ m_wndParent.UnsubclassWindow(); - - if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0) - ::DestroyMenu(m_hMenu); - - if(m_hImageList != NULL) - ::ImageList_Destroy(m_hImageList); - } - -// Attributes - DWORD GetCommandBarExtendedStyle() const - { - return m_dwExtendedStyle; - } - - DWORD SetCommandBarExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwExtendedStyle; - if(dwMask == 0) - m_dwExtendedStyle = dwExtendedStyle; - else - m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); - return dwPrevStyle; - } - - CMenuHandle GetMenu() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return m_hMenu; - } - - COLORREF GetImageMaskColor() const - { - return m_clrMask; - } - - COLORREF SetImageMaskColor(COLORREF clrMask) - { - COLORREF clrOld = m_clrMask; - m_clrMask = clrMask; - return clrOld; - } - - bool GetImagesVisible() const - { - return m_bImagesVisible; - } - - bool SetImagesVisible(bool bVisible) - { - bool bOld = m_bImagesVisible; - m_bImagesVisible = bVisible; - return bOld; - } - - void GetImageSize(SIZE& size) const - { - size = m_szBitmap; - } - - bool SetImageSize(SIZE& size) - { - return SetImageSize(size.cx, size.cy); - } - - bool SetImageSize(int cx, int cy) - { - if(m_hImageList != NULL) - { - if(::ImageList_GetImageCount(m_hImageList) == 0) // empty - { - ::ImageList_Destroy(m_hImageList); - m_hImageList = NULL; - } - else - { - return false; // can't set, image list exists - } - } - - if(cx == 0 || cy == 0) - return false; - - m_szBitmap.cx = cx; - m_szBitmap.cy = cy; - m_szButton.cx = m_szBitmap.cx + 2 * s_kcxButtonMargin; - m_szButton.cy = m_szBitmap.cy + 2 * s_kcyButtonMargin; - - return true; - } - - bool GetAlphaImages() const - { - return m_bAlphaImages; - } - - bool SetAlphaImages(bool bAlphaImages) - { - if(m_hImageList != NULL) - { - if(::ImageList_GetImageCount(m_hImageList) == 0) // empty - { - ::ImageList_Destroy(m_hImageList); - m_hImageList = NULL; - } - else - { - return false; // can't set, image list exists - } - } - - m_bAlphaImages = bAlphaImages; - return true; - } - - HWND GetCmdBar() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L); - } - -// Methods - HWND Create(HWND hWndParent, RECT& rcPos, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - UINT nID = 0, LPVOID lpCreateParam = NULL) - { - // These styles are required for command bars - dwStyle |= TBSTYLE_LIST | TBSTYLE_FLAT; -#if (_MSC_VER >= 1300) - return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam); -#else // !(_MSC_VER >= 1300) - typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass; - return _baseClass::Create(hWndParent, rcPos, szWindowName, dwStyle, dwExStyle, nID, lpCreateParam); -#endif // !(_MSC_VER >= 1300) - } - - BOOL AttachToWindow(HWND hWnd) - { - ATLASSERT(m_hWnd == NULL); - ATLASSERT(::IsWindow(hWnd)); - BOOL bRet = SubclassWindow(hWnd); - if(bRet) - { - m_bAttachedMenu = true; - T* pT = static_cast(this); - pT->GetSystemSettings(); - } - return bRet; - } - - BOOL LoadMenu(ATL::_U_STRINGorID menu) - { - ATLASSERT(::IsWindow(m_hWnd)); - - if(m_bAttachedMenu) // doesn't work in this mode - return FALSE; - if(menu.m_lpstr == NULL) - return FALSE; - - HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr); - if(hMenu == NULL) - return FALSE; - - return AttachMenu(hMenu); - } - - BOOL AttachMenu(HMENU hMenu) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hMenu == NULL || ::IsMenu(hMenu)); - if(hMenu != NULL && !::IsMenu(hMenu)) - return FALSE; - -#if _WTL_CMDBAR_VISTA_MENUS - // remove Vista bitmaps if used - if(m_bVistaMenus && (m_hMenu != NULL)) - { - T* pT = static_cast(this); - pT->_RemoveVistaBitmapsFromMenu(); - } -#endif // _WTL_CMDBAR_VISTA_MENUS - - // destroy old menu, if needed, and set new one - if(m_hMenu != NULL && (m_dwExtendedStyle & CBR_EX_SHAREMENU) == 0) - ::DestroyMenu(m_hMenu); - - m_hMenu = hMenu; - - if(m_bAttachedMenu) // Nothing else in this mode - return TRUE; - - // Build buttons according to menu - SetRedraw(FALSE); - - // Clear all buttons - int nCount = GetButtonCount(); - for(int i = 0; i < nCount; i++) - ATLVERIFY(DeleteButton(0) != FALSE); - - // Add buttons for each menu item - if(m_hMenu != NULL) - { - int nItems = ::GetMenuItemCount(m_hMenu); - - T* pT = static_cast(this); - pT; // avoid level 4 warning - TCHAR szString[pT->_nMaxMenuItemTextLength]; - for(int i = 0; i < nItems; i++) - { - CMenuItemInfo mii; - mii.fMask = MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU; - mii.fType = MFT_STRING; - mii.dwTypeData = szString; - mii.cch = pT->_nMaxMenuItemTextLength; - BOOL bRet = ::GetMenuItemInfo(m_hMenu, i, TRUE, &mii); - ATLASSERT(bRet); - // If we have more than the buffer, we assume we have bitmaps bits - if(lstrlen(szString) > pT->_nMaxMenuItemTextLength - 1) - { - mii.fType = MFT_BITMAP; - ::SetMenuItemInfo(m_hMenu, i, TRUE, &mii); - szString[0] = 0; - } - - // NOTE: Command Bar currently supports only drop-down menu items - ATLASSERT(mii.hSubMenu != NULL); - - TBBUTTON btn = { 0 }; - btn.iBitmap = 0; - btn.idCommand = i; - btn.fsState = (BYTE)(((mii.fState & MFS_DISABLED) == 0) ? TBSTATE_ENABLED : 0); - btn.fsStyle = TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE | TBSTYLE_DROPDOWN; - btn.dwData = 0; - btn.iString = 0; - - bRet = InsertButton(-1, &btn); - ATLASSERT(bRet); - - TBBUTTONINFO bi = { 0 }; - bi.cbSize = sizeof(TBBUTTONINFO); - bi.dwMask = TBIF_TEXT; - bi.pszText = szString; - - bRet = SetButtonInfo(i, &bi); - ATLASSERT(bRet); - } - } - - SetRedraw(TRUE); - Invalidate(); - UpdateWindow(); - - return TRUE; - } - - BOOL LoadImages(ATL::_U_STRINGorID image) - { - return _LoadImagesHelper(image, false); - } - - BOOL LoadMappedImages(UINT nIDImage, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0) - { - return _LoadImagesHelper(nIDImage, true, nFlags , lpColorMap, nMapSize); - } - - BOOL _LoadImagesHelper(ATL::_U_STRINGorID image, bool bMapped, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - HINSTANCE hInstance = ModuleHelper::GetResourceInstance(); - - HRSRC hRsrc = ::FindResource(hInstance, image.m_lpstr, (LPTSTR)RT_TOOLBAR); - if(hRsrc == NULL) - return FALSE; - - HGLOBAL hGlobal = ::LoadResource(hInstance, hRsrc); - if(hGlobal == NULL) - return FALSE; - - _ToolBarData* pData = (_ToolBarData*)::LockResource(hGlobal); - if(pData == NULL) - return FALSE; - ATLASSERT(pData->wVersion == 1); - - WORD* pItems = pData->items(); - int nItems = pData->wItemCount; - - // Set internal data - SetImageSize(pData->wWidth, pData->wHeight); - - // Create image list if needed - if(m_hImageList == NULL) - { - // Check if the bitmap is 32-bit (alpha channel) bitmap (valid for Windows XP only) - T* pT = static_cast(this); - m_bAlphaImages = AtlIsAlphaBitmapResource(image); - - if(!pT->CreateInternalImageList(pData->wItemCount)) - return FALSE; - } - -#if _WTL_CMDBAR_VISTA_MENUS - int nOldImageCount = ::ImageList_GetImageCount(m_hImageList); -#endif // _WTL_CMDBAR_VISTA_MENUS - - // Add bitmap to our image list - CBitmap bmp; - if(bMapped) - { - ATLASSERT(HIWORD(PtrToUlong(image.m_lpstr)) == 0); // if mapped, must be a numeric ID - int nIDImage = (int)(short)LOWORD(PtrToUlong(image.m_lpstr)); - bmp.LoadMappedBitmap(nIDImage, (WORD)nFlags, lpColorMap, nMapSize); - } - else - { - if(m_bAlphaImages) - bmp = (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), image.m_lpstr, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE); - else - bmp.LoadBitmap(image.m_lpstr); - } - ATLASSERT(bmp.m_hBitmap != NULL); - if(bmp.m_hBitmap == NULL) - return FALSE; - if(::ImageList_AddMasked(m_hImageList, bmp, m_clrMask) == -1) - return FALSE; - - // Fill the array with command IDs - for(int i = 0; i < nItems; i++) - { - if(pItems[i] != 0) - m_arrCommand.Add(pItems[i]); - } - - int nImageCount = ::ImageList_GetImageCount(m_hImageList); - ATLASSERT(nImageCount == m_arrCommand.GetSize()); - if(nImageCount != m_arrCommand.GetSize()) - return FALSE; - -#if _WTL_CMDBAR_VISTA_MENUS - if(RunTimeHelper::IsVista()) - { - T* pT = static_cast(this); - pT->_AddVistaBitmapsFromImageList(nOldImageCount, nImageCount - nOldImageCount); - ATLASSERT(nImageCount == m_arrVistaBitmap.GetSize()); - } -#endif // _WTL_CMDBAR_VISTA_MENUS - - return TRUE; - } - - BOOL AddBitmap(ATL::_U_STRINGorID bitmap, int nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - CBitmap bmp; - bmp.LoadBitmap(bitmap.m_lpstr); - if(bmp.m_hBitmap == NULL) - return FALSE; - return AddBitmap(bmp, nCommandID); - } - - BOOL AddBitmap(HBITMAP hBitmap, UINT nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - // Create image list if it doesn't exist - if(m_hImageList == NULL) - { - if(!pT->CreateInternalImageList(1)) - return FALSE; - } - // check bitmap size - CBitmapHandle bmp = hBitmap; - SIZE size = { 0, 0 }; - bmp.GetSize(size); - if(size.cx != m_szBitmap.cx || size.cy != m_szBitmap.cy) - { - ATLASSERT(FALSE); // must match size! - return FALSE; - } - // add bitmap - int nRet = ::ImageList_AddMasked(m_hImageList, hBitmap, m_clrMask); - if(nRet == -1) - return FALSE; - BOOL bRet = m_arrCommand.Add((WORD)nCommandID); - ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize()); -#if _WTL_CMDBAR_VISTA_MENUS - if(RunTimeHelper::IsVista()) - { - pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1); - ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize()); - } -#endif // _WTL_CMDBAR_VISTA_MENUS - return bRet; - } - - BOOL AddIcon(ATL::_U_STRINGorID icon, UINT nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); - if(hIcon == NULL) - return FALSE; - return AddIcon(hIcon, nCommandID); - } - - BOOL AddIcon(HICON hIcon, UINT nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - // create image list if it doesn't exist - if(m_hImageList == NULL) - { - if(!pT->CreateInternalImageList(1)) - return FALSE; - } - - int nRet = ::ImageList_AddIcon(m_hImageList, hIcon); - if(nRet == -1) - return FALSE; - BOOL bRet = m_arrCommand.Add((WORD)nCommandID); - ATLASSERT(::ImageList_GetImageCount(m_hImageList) == m_arrCommand.GetSize()); -#if _WTL_CMDBAR_VISTA_MENUS - if(RunTimeHelper::IsVista()) - { - pT->_AddVistaBitmapFromImageList(m_arrCommand.GetSize() - 1); - ATLASSERT(m_arrVistaBitmap.GetSize() == m_arrCommand.GetSize()); - } -#endif // _WTL_CMDBAR_VISTA_MENUS - return bRet; - } - - BOOL ReplaceBitmap(ATL::_U_STRINGorID bitmap, int nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - CBitmap bmp; - bmp.LoadBitmap(bitmap.m_lpstr); - if(bmp.m_hBitmap == NULL) - return FALSE; - return ReplaceBitmap(bmp, nCommandID); - } - - BOOL ReplaceBitmap(HBITMAP hBitmap, UINT nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - BOOL bRet = FALSE; - for(int i = 0; i < m_arrCommand.GetSize(); i++) - { - if(m_arrCommand[i] == nCommandID) - { - bRet = ::ImageList_Remove(m_hImageList, i); - if(bRet) - { - m_arrCommand.RemoveAt(i); -#if _WTL_CMDBAR_VISTA_MENUS - if(RunTimeHelper::IsVista()) - { - if(m_arrVistaBitmap[i] != NULL) - ::DeleteObject(m_arrVistaBitmap[i]); - m_arrVistaBitmap.RemoveAt(i); - } -#endif // _WTL_CMDBAR_VISTA_MENUS - } - break; - } - } - if(bRet) - bRet = AddBitmap(hBitmap, nCommandID); - return bRet; - } - - BOOL ReplaceIcon(ATL::_U_STRINGorID icon, UINT nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - HICON hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); - if(hIcon == NULL) - return FALSE; - return ReplaceIcon(hIcon, nCommandID); - } - - BOOL ReplaceIcon(HICON hIcon, UINT nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - BOOL bRet = FALSE; - for(int i = 0; i < m_arrCommand.GetSize(); i++) - { - if(m_arrCommand[i] == nCommandID) - { - bRet = (::ImageList_ReplaceIcon(m_hImageList, i, hIcon) != -1); -#if _WTL_CMDBAR_VISTA_MENUS - if(RunTimeHelper::IsVista() && bRet != FALSE) - { - T* pT = static_cast(this); - pT->_ReplaceVistaBitmapFromImageList(i); - } -#endif // _WTL_CMDBAR_VISTA_MENUS - break; - } - } - return bRet; - } - - BOOL RemoveImage(int nCommandID) - { - ATLASSERT(::IsWindow(m_hWnd)); - - BOOL bRet = FALSE; - for(int i = 0; i < m_arrCommand.GetSize(); i++) - { - if(m_arrCommand[i] == nCommandID) - { - bRet = ::ImageList_Remove(m_hImageList, i); - if(bRet) - { - m_arrCommand.RemoveAt(i); -#if _WTL_CMDBAR_VISTA_MENUS - if(RunTimeHelper::IsVista()) - { - if(m_arrVistaBitmap[i] != NULL) - ::DeleteObject(m_arrVistaBitmap[i]); - m_arrVistaBitmap.RemoveAt(i); - } -#endif // _WTL_CMDBAR_VISTA_MENUS - } - break; - } - } - return bRet; - } - - BOOL RemoveAllImages() - { - ATLASSERT(::IsWindow(m_hWnd)); - - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Removing all images\n")); - BOOL bRet = ::ImageList_RemoveAll(m_hImageList); - if(bRet) - { - m_arrCommand.RemoveAll(); -#if _WTL_CMDBAR_VISTA_MENUS - for(int i = 0; i < m_arrVistaBitmap.GetSize(); i++) - { - if(m_arrVistaBitmap[i] != NULL) - ::DeleteObject(m_arrVistaBitmap[i]); - } - m_arrVistaBitmap.RemoveAll(); -#endif // _WTL_CMDBAR_VISTA_MENUS - } - return bRet; - } - - BOOL TrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(::IsMenu(hMenu)); - if(!::IsMenu(hMenu)) - return FALSE; - m_bContextMenu = true; - if(m_bUseKeyboardCues) - m_bShowKeyboardCues = m_bKeyboardInput; - T* pT = static_cast(this); - return pT->DoTrackPopupMenu(hMenu, uFlags, x, y, lpParams); - } - - BOOL SetMDIClient(HWND /*hWndMDIClient*/) - { - // Use CMDICommandBarCtrl for MDI support - ATLASSERT(FALSE); - return FALSE; - } - -// Message map and handlers - BEGIN_MSG_MAP(CCommandBarCtrlImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_INITMENU, OnInitMenu) - MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup) - MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect) - MESSAGE_HANDLER(GetAutoPopupMessage(), OnInternalAutoPopup) - MESSAGE_HANDLER(GetGetBarMessage(), OnInternalGetBar) - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) - MESSAGE_HANDLER(WM_MENUCHAR, OnMenuChar) - - MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) - MESSAGE_HANDLER(WM_KEYUP, OnKeyUp) - MESSAGE_HANDLER(WM_CHAR, OnChar) - MESSAGE_HANDLER(WM_SYSKEYDOWN, OnSysKeyDown) - MESSAGE_HANDLER(WM_SYSKEYUP, OnSysKeyUp) - MESSAGE_HANDLER(WM_SYSCHAR, OnSysChar) -// public API handlers - these stay to support chevrons in atlframe.h - MESSAGE_HANDLER(CBRM_GETMENU, OnAPIGetMenu) - MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnAPITrackPopupMenu) - MESSAGE_HANDLER(CBRM_GETCMDBAR, OnAPIGetCmdBar) - - MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem) - MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem) - - MESSAGE_HANDLER(WM_FORWARDMSG, OnForwardMsg) - ALT_MSG_MAP(1) // Parent window messages - NOTIFY_CODE_HANDLER(TBN_HOTITEMCHANGE, OnParentHotItemChange) - NOTIFY_CODE_HANDLER(TBN_DROPDOWN, OnParentDropDown) - MESSAGE_HANDLER(WM_INITMENUPOPUP, OnParentInitMenuPopup) - MESSAGE_HANDLER(GetGetBarMessage(), OnParentInternalGetBar) - MESSAGE_HANDLER(WM_SYSCOMMAND, OnParentSysCommand) - MESSAGE_HANDLER(CBRM_GETMENU, OnParentAPIGetMenu) - MESSAGE_HANDLER(WM_MENUCHAR, OnParentMenuChar) - MESSAGE_HANDLER(CBRM_TRACKPOPUPMENU, OnParentAPITrackPopupMenu) - MESSAGE_HANDLER(CBRM_GETCMDBAR, OnParentAPIGetCmdBar) - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnParentSettingChange) - - MESSAGE_HANDLER(WM_DRAWITEM, OnParentDrawItem) - MESSAGE_HANDLER(WM_MEASUREITEM, OnParentMeasureItem) - - MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate) - NOTIFY_CODE_HANDLER(NM_CUSTOMDRAW, OnParentCustomDraw) - ALT_MSG_MAP(2) // MDI client window messages - // Use CMDICommandBarCtrl for MDI support - ALT_MSG_MAP(3) // Message hook messages - MESSAGE_HANDLER(WM_MOUSEMOVE, OnHookMouseMove) - MESSAGE_HANDLER(WM_SYSKEYDOWN, OnHookSysKeyDown) - MESSAGE_HANDLER(WM_SYSKEYUP, OnHookSysKeyUp) - MESSAGE_HANDLER(WM_SYSCHAR, OnHookSysChar) - MESSAGE_HANDLER(WM_KEYDOWN, OnHookKeyDown) - MESSAGE_HANDLER(WM_NEXTMENU, OnHookNextMenu) - MESSAGE_HANDLER(WM_CHAR, OnHookChar) - END_MSG_MAP() - - LRESULT OnForwardMsg(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - LPMSG pMsg = (LPMSG)lParam; - if(pMsg->message >= WM_MOUSEFIRST && pMsg->message <= WM_MOUSELAST) - m_bKeyboardInput = false; - else if(pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) - m_bKeyboardInput = true; - LRESULT lRet = 0; - ProcessWindowMessage(pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam, lRet, 3); - return lRet; - } - - LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - // Let the toolbar initialize itself - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - // get and use system settings - T* pT = static_cast(this); - pT->GetSystemSettings(); - // Parent init - ATL::CWindow wndParent = GetParent(); - ATL::CWindow wndTopLevelParent = wndParent.GetTopLevelParent(); - m_wndParent.SubclassWindow(wndTopLevelParent); - // Toolbar Init - SetButtonStructSize(); - SetImageList(NULL); - - // Create message hook if needed - CWindowCreateCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnCreate.\n")); - ATLASSERT(FALSE); - return -1; - } - - if(s_pmapMsgHook == NULL) - { - ATLTRY(s_pmapMsgHook = new CMsgHookMap); - ATLASSERT(s_pmapMsgHook != NULL); - } - - if(s_pmapMsgHook != NULL) - { - DWORD dwThreadID = ::GetCurrentThreadId(); - _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID); - if(pData == NULL) - { - ATLTRY(pData = new _MsgHookData); - ATLASSERT(pData != NULL); - HHOOK hMsgHook = ::SetWindowsHookEx(WH_GETMESSAGE, MessageHookProc, ModuleHelper::GetModuleInstance(), dwThreadID); - ATLASSERT(hMsgHook != NULL); - if(pData != NULL && hMsgHook != NULL) - { - pData->hMsgHook = hMsgHook; - pData->dwUsage = 1; - BOOL bRet = s_pmapMsgHook->Add(dwThreadID, pData); - bRet; - ATLASSERT(bRet); - } - } - else - { - (pData->dwUsage)++; - } - } - lock.Unlock(); - - // Get layout -#if (WINVER >= 0x0500) - m_bLayoutRTL = ((GetExStyle() & WS_EX_LAYOUTRTL) != 0); -#endif // (WINVER >= 0x0500) - - return lRet; - } - - LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - -#if _WTL_CMDBAR_VISTA_MENUS - if(m_bVistaMenus && (m_hMenu != NULL)) - { - T* pT = static_cast(this); - pT->_RemoveVistaBitmapsFromMenu(); - } - - for(int i = 0; i < m_arrVistaBitmap.GetSize(); i++) - { - if(m_arrVistaBitmap[i] != NULL) - ::DeleteObject(m_arrVistaBitmap[i]); - } -#endif // _WTL_CMDBAR_VISTA_MENUS - - if(m_bAttachedMenu) // nothing to do in this mode - return lRet; - - CWindowCreateCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::OnDestroy.\n")); - ATLASSERT(FALSE); - return lRet; - } - - if(s_pmapMsgHook != NULL) - { - DWORD dwThreadID = ::GetCurrentThreadId(); - _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID); - if(pData != NULL) - { - (pData->dwUsage)--; - if(pData->dwUsage == 0) - { - BOOL bRet = ::UnhookWindowsHookEx(pData->hMsgHook); - ATLASSERT(bRet); - bRet = s_pmapMsgHook->Remove(dwThreadID); - ATLASSERT(bRet); - if(bRet) - delete pData; - } - - if(s_pmapMsgHook->GetSize() == 0) - { - delete s_pmapMsgHook; - s_pmapMsgHook = NULL; - } - } - } - - lock.Unlock(); - - return lRet; - } - - LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyDown\n")); -#endif - bHandled = FALSE; - // Simulate Alt+Space for the parent - if(wParam == VK_SPACE) - { - m_wndParent.PostMessage(WM_SYSKEYDOWN, wParam, lParam | (1 << 29)); - bHandled = TRUE; - } -#if (_WIN32_IE >= 0x0500) - else if(wParam == VK_LEFT || wParam == VK_RIGHT) - { - WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT; - - if(!m_bMenuActive) - { - T* pT = static_cast(this); - int nBtn = GetHotItem(); - int nNextBtn = (wParam == wpNext) ? pT->GetNextMenuItem(nBtn) : pT->GetPreviousMenuItem(nBtn); - if(nNextBtn == -2) - { - SetHotItem(-1); - if(pT->DisplayChevronMenu()) - bHandled = TRUE; - } - } - } -#endif // (_WIN32_IE >= 0x0500) - return 0; - } - - LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnKeyUp\n")); -#endif - if(wParam != VK_SPACE) - bHandled = FALSE; - return 0; - } - - LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnChar\n")); -#endif - if(wParam != VK_SPACE) - bHandled = FALSE; - else - return 0; - // Security - if(!m_wndParent.IsWindowEnabled() || ::GetFocus() != m_hWnd) - return 0; - - // Handle mnemonic press when we have focus - int nBtn = 0; - if(wParam != VK_RETURN && !MapAccelerator((TCHAR)LOWORD(wParam), nBtn)) - { -#if (_WIN32_IE >= 0x0500) - if((TCHAR)LOWORD(wParam) != _chChevronShortcut) -#endif // (_WIN32_IE >= 0x0500) - ::MessageBeep(0); - } - else - { -#if (_WIN32_IE >= 0x0500) - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - RECT rcBtn = { 0 }; - GetItemRect(nBtn, &rcBtn); - TBBUTTON tbb = { 0 }; - GetButton(nBtn, &tbb); - if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right) - { -#endif // (_WIN32_IE >= 0x0500) - PostMessage(WM_KEYDOWN, VK_DOWN, 0L); - if(wParam != VK_RETURN) - SetHotItem(nBtn); -#if (_WIN32_IE >= 0x0500) - } - else - { - ::MessageBeep(0); - bHandled = TRUE; - } -#endif // (_WIN32_IE >= 0x0500) - } - return 0; - } - - LRESULT OnSysKeyDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyDown\n")); -#endif - bHandled = FALSE; - return 0; - } - - LRESULT OnSysKeyUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysKeyUp\n")); -#endif - bHandled = FALSE; - return 0; - } - - LRESULT OnSysChar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnSysChar\n")); -#endif - bHandled = FALSE; - return 0; - } - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_bAttachedMenu || (m_dwExtendedStyle & CBR_EX_TRANSPARENT)) - { - bHandled = FALSE; - return 0; - } - - CDCHandle dc = (HDC)wParam; - RECT rect = { 0 }; - GetClientRect(&rect); - dc.FillRect(&rect, COLOR_MENU); - - return 1; // don't do the default erase - } - - LRESULT OnInitMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - int nIndex = GetHotItem(); - SendMessage(WM_MENUSELECT, MAKEWPARAM(nIndex, MF_POPUP|MF_HILITE), (LPARAM)m_hMenu); - bHandled = FALSE; - return 1; - } - - LRESULT OnInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - if((BOOL)HIWORD(lParam)) // System menu, do nothing - { - bHandled = FALSE; - return 1; - } - - if(!(m_bAttachedMenu || m_bMenuActive)) // Not attached or ours, do nothing - { - bHandled = FALSE; - return 1; - } - -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnInitMenuPopup\n")); -#endif - // forward to the parent or subclassed window, so it can handle update UI - LRESULT lRet = 0; - if(m_bAttachedMenu) - lRet = DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem()); - else - lRet = m_wndParent.DefWindowProc(uMsg, wParam, (lParam || m_bContextMenu) ? lParam : GetHotItem()); - -#if _WTL_CMDBAR_VISTA_MENUS - // If Vista menus are active, just set bitmaps and return - if(m_bVistaMenus) - { - CMenuHandle menu = (HMENU)wParam; - ATLASSERT(menu.m_hMenu != NULL); - - for(int i = 0; i < menu.GetMenuItemCount(); i++) - { - WORD nID = (WORD)menu.GetMenuItemID(i); - int nIndex = m_arrCommand.Find(nID); - - CMenuItemInfo mii; - mii.fMask = MIIM_BITMAP; - mii.hbmpItem = (m_bImagesVisible && (nIndex != -1)) ? m_arrVistaBitmap[nIndex] : NULL; - menu.SetMenuItemInfo(i, TRUE, &mii); - } - - return lRet; - } -#endif // _WTL_CMDBAR_VISTA_MENUS - - // Convert menu items to ownerdraw, add our data - if(m_bImagesVisible) - { - CMenuHandle menuPopup = (HMENU)wParam; - ATLASSERT(menuPopup.m_hMenu != NULL); - - T* pT = static_cast(this); - pT; // avoid level 4 warning - TCHAR szString[pT->_nMaxMenuItemTextLength]; - BOOL bRet = FALSE; - for(int i = 0; i < menuPopup.GetMenuItemCount(); i++) - { - CMenuItemInfo mii; - mii.cch = pT->_nMaxMenuItemTextLength; - mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE; - mii.dwTypeData = szString; - bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii); - ATLASSERT(bRet); - - if(!(mii.fType & MFT_OWNERDRAW)) // Not already an ownerdraw item - { - mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE; - _MenuItemData* pMI = NULL; - ATLTRY(pMI = new _MenuItemData); - ATLASSERT(pMI != NULL); - if(pMI != NULL) - { - pMI->fType = mii.fType; - pMI->fState = mii.fState; - mii.fType |= MFT_OWNERDRAW; - pMI->iButton = -1; - for(int j = 0; j < m_arrCommand.GetSize(); j++) - { - if(m_arrCommand[j] == mii.wID) - { - pMI->iButton = j; - break; - } - } - int cchLen = lstrlen(szString) + 1; - pMI->lpstrText = NULL; - ATLTRY(pMI->lpstrText = new TCHAR[cchLen]); - ATLASSERT(pMI->lpstrText != NULL); - if(pMI->lpstrText != NULL) - SecureHelper::strcpy_x(pMI->lpstrText, cchLen, szString); - mii.dwItemData = (ULONG_PTR)pMI; - bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii); - ATLASSERT(bRet); - } - } - } - - // Add it to the list - m_stackMenuHandle.Push(menuPopup.m_hMenu); - } - - return lRet; - } - - LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - if(!m_bAttachedMenu) // Not attached, do nothing, forward to parent - { - m_bPopupItem = (lParam != NULL) && ((HMENU)lParam != m_hMenu) && (HIWORD(wParam) & MF_POPUP); - if(m_wndParent.IsWindow()) - m_wndParent.SendMessage(uMsg, wParam, lParam); - bHandled = FALSE; - return 1; - } - - // Check if a menu is closing, do a cleanup - if(HIWORD(wParam) == 0xFFFF && lParam == NULL) // Menu closing - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnMenuSelect - CLOSING!!!!\n")); -#endif - ATLASSERT(m_stackMenuWnd.GetSize() == 0); - // Restore the menu items to the previous state for all menus that were converted - if(m_bImagesVisible) - { - HMENU hMenu = NULL; - while((hMenu = m_stackMenuHandle.Pop()) != NULL) - { - CMenuHandle menuPopup = hMenu; - ATLASSERT(menuPopup.m_hMenu != NULL); - // Restore state and delete menu item data - BOOL bRet = FALSE; - for(int i = 0; i < menuPopup.GetMenuItemCount(); i++) - { - CMenuItemInfo mii; - mii.fMask = MIIM_DATA | MIIM_TYPE; - bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii); - ATLASSERT(bRet); - - _MenuItemData* pMI = (_MenuItemData*)mii.dwItemData; - if(pMI != NULL && pMI->IsCmdBarMenuItem()) - { - mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE; - mii.fType = pMI->fType; - mii.dwTypeData = pMI->lpstrText; - mii.cch = lstrlen(pMI->lpstrText); - mii.dwItemData = NULL; - - bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii); - ATLASSERT(bRet); - - delete [] pMI->lpstrText; - pMI->dwMagic = 0x6666; - delete pMI; - } - } - } - } - } - - bHandled = FALSE; - return 1; - } - - LRESULT OnInternalAutoPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - int nIndex = (int)wParam; - T* pT = static_cast(this); - pT->DoPopupMenu(nIndex, false); - return 0; - } - - LRESULT OnInternalGetBar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - // Let's make sure we're not embedded in another process - if((LPVOID)wParam != NULL) - *((DWORD*)wParam) = GetCurrentProcessId(); - if(IsWindowVisible()) - return (LRESULT)static_cast(this); - else - return NULL; - } - - LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { -#ifndef SPI_GETKEYBOARDCUES - const UINT SPI_SETKEYBOARDCUES = 0x100B; -#endif // !SPI_GETKEYBOARDCUES -#ifndef SPI_GETFLATMENU - const UINT SPI_SETFLATMENU = 0x1023; -#endif // !SPI_GETFLATMENU - - if(wParam == SPI_SETNONCLIENTMETRICS || wParam == SPI_SETKEYBOARDCUES || wParam == SPI_SETFLATMENU) - { - T* pT = static_cast(this); - pT->GetSystemSettings(); - } - - return 0; - } - - LRESULT OnWindowPosChanging(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - - LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam; - int cyMin = ::GetSystemMetrics(SM_CYMENU); - if(lpWP->cy < cyMin) - lpWP->cy = cyMin; - - return lRet; - } - - LRESULT OnMenuChar(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - OnMenuChar\n")); -#endif - bHandled = TRUE; - T* pT = static_cast(this); - - LRESULT lRet; - if(m_bMenuActive && LOWORD(wParam) != 0x0D) - lRet = 0; - else - lRet = MAKELRESULT(1, 1); - - if(m_bMenuActive && HIWORD(wParam) == MF_POPUP) - { - // Convert character to lower/uppercase and possibly Unicode, using current keyboard layout - TCHAR ch = (TCHAR)LOWORD(wParam); - CMenuHandle menu = (HMENU)lParam; - int nCount = ::GetMenuItemCount(menu); - int nRetCode = MNC_EXECUTE; - BOOL bRet = FALSE; - TCHAR szString[pT->_nMaxMenuItemTextLength]; - WORD wMnem = 0; - bool bFound = false; - for(int i = 0; i < nCount; i++) - { - CMenuItemInfo mii; - mii.cch = pT->_nMaxMenuItemTextLength; - mii.fMask = MIIM_CHECKMARKS | MIIM_DATA | MIIM_ID | MIIM_STATE | MIIM_SUBMENU | MIIM_TYPE; - mii.dwTypeData = szString; - bRet = menu.GetMenuItemInfo(i, TRUE, &mii); - if(!bRet || (mii.fType & MFT_SEPARATOR)) - continue; - _MenuItemData* pmd = (_MenuItemData*)mii.dwItemData; - if(pmd != NULL && pmd->IsCmdBarMenuItem()) - { - LPTSTR p = pmd->lpstrText; - - if(p != NULL) - { - while(*p && *p != _T('&')) - p = ::CharNext(p); - if(p != NULL && *p) - { - DWORD dwP = MAKELONG(*(++p), 0); - DWORD dwC = MAKELONG(ch, 0); - if(::CharLower((LPTSTR)ULongToPtr(dwP)) == ::CharLower((LPTSTR)ULongToPtr(dwC))) - { - if(!bFound) - { - wMnem = (WORD)i; - bFound = true; - } - else - { - nRetCode = MNC_SELECT; - break; - } - } - } - } - } - } - if(bFound) - { - if(nRetCode == MNC_EXECUTE) - { - PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); - pT->GiveFocusBack(); - } - bHandled = TRUE; - lRet = MAKELRESULT(wMnem, nRetCode); - } - } - else if(!m_bMenuActive) - { - int nBtn = 0; - if(!MapAccelerator((TCHAR)LOWORD(wParam), nBtn)) - { - bHandled = FALSE; - PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); - pT->GiveFocusBack(); - -#if (_WIN32_IE >= 0x0500) - // check if we should display chevron menu - if((TCHAR)LOWORD(wParam) == pT->_chChevronShortcut) - { - if(pT->DisplayChevronMenu()) - bHandled = TRUE; - } -#endif // (_WIN32_IE >= 0x0500) - } - else if(m_wndParent.IsWindowEnabled()) - { -#if (_WIN32_IE >= 0x0500) - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - RECT rcBtn = { 0 }; - GetItemRect(nBtn, &rcBtn); - TBBUTTON tbb = { 0 }; - GetButton(nBtn, &tbb); - if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0 && rcBtn.right <= rcClient.right) - { -#endif // (_WIN32_IE >= 0x0500) - if(m_bUseKeyboardCues && !m_bShowKeyboardCues) - { - m_bAllowKeyboardCues = true; - ShowKeyboardCues(true); - } - pT->TakeFocus(); - PostMessage(WM_KEYDOWN, VK_DOWN, 0L); - SetHotItem(nBtn); -#if (_WIN32_IE >= 0x0500) - } - else - { - ::MessageBeep(0); - } -#endif // (_WIN32_IE >= 0x0500) - } - } - - return lRet; - } - - LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - LPDRAWITEMSTRUCT lpDrawItemStruct = (LPDRAWITEMSTRUCT)lParam; - _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData; - if(lpDrawItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem()) - { - T* pT = static_cast(this); - pT->DrawItem(lpDrawItemStruct); - } - else - { - bHandled = FALSE; - } - return (LRESULT)TRUE; - } - - LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - LPMEASUREITEMSTRUCT lpMeasureItemStruct = (LPMEASUREITEMSTRUCT)lParam; - _MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData; - if(lpMeasureItemStruct->CtlType == ODT_MENU && pmd != NULL && pmd->IsCmdBarMenuItem()) - { - T* pT = static_cast(this); - pT->MeasureItem(lpMeasureItemStruct); - } - else - { - bHandled = FALSE; - } - return (LRESULT)TRUE; - } - -// API message handlers - LRESULT OnAPIGetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return (LRESULT)m_hMenu; - } - - LRESULT OnAPITrackPopupMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - if(lParam == NULL) - return FALSE; - LPCBRPOPUPMENU lpCBRPopupMenu = (LPCBRPOPUPMENU)lParam; - if(lpCBRPopupMenu->cbSize != sizeof(CBRPOPUPMENU)) - return FALSE; - - T* pT = static_cast(this); - return pT->TrackPopupMenu(lpCBRPopupMenu->hMenu, lpCBRPopupMenu->uFlags, lpCBRPopupMenu->x, lpCBRPopupMenu->y, lpCBRPopupMenu->lptpm); - } - - LRESULT OnAPIGetCmdBar(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return (LRESULT)m_hWnd; - } - -// Parent window message handlers - LRESULT OnParentHotItemChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) - { - LPNMTBHOTITEM lpNMHT = (LPNMTBHOTITEM)pnmh; - - // Check if this comes from us - if(pnmh->hwndFrom != m_hWnd) - { - bHandled = FALSE; - return 0; - } - - bool bBlockTracking = false; - if((m_dwExtendedStyle & CBR_EX_TRACKALWAYS) == 0) - { - DWORD dwProcessID; - ::GetWindowThreadProcessId(::GetActiveWindow(), &dwProcessID); - bBlockTracking = (::GetCurrentProcessId() != dwProcessID); - } - - if((!m_wndParent.IsWindowEnabled() || bBlockTracking) && (lpNMHT->dwFlags & HICF_MOUSE)) - { - return 1; - } - else - { -#ifndef HICF_LMOUSE - const DWORD HICF_LMOUSE = 0x00000080; // left mouse button selected -#endif - bHandled = FALSE; - - // Send WM_MENUSELECT to the app if it needs to display a status text - if(!(lpNMHT->dwFlags & HICF_MOUSE) - && !(lpNMHT->dwFlags & HICF_ACCELERATOR) - && !(lpNMHT->dwFlags & HICF_LMOUSE)) - { - if(lpNMHT->dwFlags & HICF_ENTERING) - m_wndParent.SendMessage(WM_MENUSELECT, 0, (LPARAM)m_hMenu); - if(lpNMHT->dwFlags & HICF_LEAVING) - m_wndParent.SendMessage(WM_MENUSELECT, MAKEWPARAM(0, 0xFFFF), NULL); - } - - return 0; - } - } - - LRESULT OnParentDropDown(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) - { - // Check if this comes from us - if(pnmh->hwndFrom != m_hWnd) - { - bHandled = FALSE; - return 1; - } - - T* pT = static_cast(this); - if(::GetFocus() != m_hWnd) - pT->TakeFocus(); - LPNMTOOLBAR pNMToolBar = (LPNMTOOLBAR)pnmh; - int nIndex = CommandToIndex(pNMToolBar->iItem); - m_bContextMenu = false; - m_bEscapePressed = false; - pT->DoPopupMenu(nIndex, true); - - return TBDDRET_DEFAULT; - } - - LRESULT OnParentInitMenuPopup(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - return OnInitMenuPopup(uMsg, wParam, lParam, bHandled); - } - - LRESULT OnParentInternalGetBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - return OnInternalGetBar(uMsg, wParam, lParam, bHandled); - } - - LRESULT OnParentSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - bHandled = FALSE; - if((m_uSysKey == VK_MENU - || (m_uSysKey == VK_F10 && !(::GetKeyState(VK_SHIFT) & 0x80)) - || m_uSysKey == VK_SPACE) - && wParam == SC_KEYMENU) - { - T* pT = static_cast(this); - if(::GetFocus() == m_hWnd) - { - pT->GiveFocusBack(); // exit menu "loop" - PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); - } - else if(m_uSysKey != VK_SPACE && !m_bSkipMsg) - { - if(m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues) - ShowKeyboardCues(true); - - pT->TakeFocus(); // enter menu "loop" - bHandled = TRUE; - } - else if(m_uSysKey != VK_SPACE) - { - bHandled = TRUE; - } - } - m_bSkipMsg = false; - return 0; - } - - LRESULT OnParentAPIGetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - return OnAPIGetMenu(uMsg, wParam, lParam, bHandled); - } - - LRESULT OnParentMenuChar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - return OnMenuChar(uMsg, wParam, lParam, bHandled); - } - - LRESULT OnParentAPITrackPopupMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - return OnAPITrackPopupMenu(uMsg, wParam, lParam, bHandled); - } - - LRESULT OnParentAPIGetCmdBar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - return OnAPIGetCmdBar(uMsg, wParam, lParam, bHandled); - } - - LRESULT OnParentSettingChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - OnSettingChange(uMsg, wParam, lParam, bHandled); - bHandled = FALSE; - return 1; - } - - LRESULT OnParentDrawItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - return OnDrawItem(uMsg, wParam, lParam, bHandled); - } - - LRESULT OnParentMeasureItem(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - return OnMeasureItem(uMsg, wParam, lParam, bHandled); - } - - LRESULT OnParentActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - m_bParentActive = (LOWORD(wParam) != WA_INACTIVE); - if(!m_bParentActive && m_bUseKeyboardCues && m_bShowKeyboardCues) - { - ShowKeyboardCues(false); // this will repaint our window - } - else - { - Invalidate(); - UpdateWindow(); - } - bHandled = FALSE; - return 1; - } - - LRESULT OnParentCustomDraw(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) - { - LRESULT lRet = CDRF_DODEFAULT; - bHandled = FALSE; - if(pnmh->hwndFrom == m_hWnd) - { - LPNMTBCUSTOMDRAW lpTBCustomDraw = (LPNMTBCUSTOMDRAW)pnmh; - if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_PREPAINT) - { - lRet = CDRF_NOTIFYITEMDRAW; - bHandled = TRUE; - } - else if(lpTBCustomDraw->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) - { - if(m_bFlatMenus) - { -#ifndef COLOR_MENUHILIGHT - const int COLOR_MENUHILIGHT = 29; -#endif // !COLOR_MENUHILIGHT - bool bDisabled = ((lpTBCustomDraw->nmcd.uItemState & CDIS_DISABLED) == CDIS_DISABLED); - if(!bDisabled && ((lpTBCustomDraw->nmcd.uItemState & CDIS_HOT) == CDIS_HOT || - (lpTBCustomDraw->nmcd.uItemState & CDIS_SELECTED) == CDIS_SELECTED)) - { - ::FillRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_MENUHILIGHT)); - ::FrameRect(lpTBCustomDraw->nmcd.hdc, &lpTBCustomDraw->nmcd.rc, ::GetSysColorBrush(COLOR_HIGHLIGHT)); - lpTBCustomDraw->clrText = ::GetSysColor(m_bParentActive ? COLOR_HIGHLIGHTTEXT : COLOR_GRAYTEXT); - } - else if(bDisabled || !m_bParentActive) - { - lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT); - } - CDCHandle dc = lpTBCustomDraw->nmcd.hdc; - dc.SetTextColor(lpTBCustomDraw->clrText); - dc.SetBkMode(lpTBCustomDraw->nStringBkMode); - HFONT hFont = GetFont(); - HFONT hFontOld = NULL; - if(hFont != NULL) - hFontOld = dc.SelectFont(hFont); - const int cchText = 200; - TCHAR szText[cchText] = { 0 }; - TBBUTTONINFO tbbi = { 0 }; - tbbi.cbSize = sizeof(TBBUTTONINFO); - tbbi.dwMask = TBIF_TEXT; - tbbi.pszText = szText; - tbbi.cchText = cchText; - GetButtonInfo((int)lpTBCustomDraw->nmcd.dwItemSpec, &tbbi); - dc.DrawText(szText, -1, &lpTBCustomDraw->nmcd.rc, DT_SINGLELINE | DT_CENTER | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX)); - if(hFont != NULL) - dc.SelectFont(hFontOld); - lRet = CDRF_SKIPDEFAULT; - bHandled = TRUE; - } - else if(!m_bParentActive) - { - lpTBCustomDraw->clrText = ::GetSysColor(COLOR_GRAYTEXT); - bHandled = TRUE; - } - } - } - return lRet; - } - -// Message hook handlers - LRESULT OnHookMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - static POINT s_point = { -1, -1 }; - DWORD dwPoint = ::GetMessagePos(); - POINT point = { GET_X_LPARAM(dwPoint), GET_Y_LPARAM(dwPoint) }; - - bHandled = FALSE; - if(m_bMenuActive) - { - if(::WindowFromPoint(point) == m_hWnd) - { - ScreenToClient(&point); - int nHit = HitTest(&point); - - if((point.x != s_point.x || point.y != s_point.y) && nHit >= 0 && nHit < ::GetMenuItemCount(m_hMenu) && nHit != m_nPopBtn && m_nPopBtn != -1) - { - TBBUTTON tbb = { 0 }; - GetButton(nHit, &tbb); - if((tbb.fsState & TBSTATE_ENABLED) != 0) - { - m_nNextPopBtn = nHit | 0xFFFF0000; - HWND hWndMenu = m_stackMenuWnd.GetCurrent(); - ATLASSERT(hWndMenu != NULL); - - // this one is needed to close a menu if mouse button was down - ::PostMessage(hWndMenu, WM_LBUTTONUP, 0, MAKELPARAM(point.x, point.y)); - // this one closes a popup menu - ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L); - - bHandled = TRUE; - } - } - } - } - else - { - ScreenToClient(&point); - } - - s_point = point; - return 0; - } - - LRESULT OnHookSysKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - bHandled = FALSE; -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSKEYDOWN (0x%2.2X)\n"), wParam); -#endif - - if(wParam == VK_MENU && m_bParentActive && m_bUseKeyboardCues && !m_bShowKeyboardCues && m_bAllowKeyboardCues) - ShowKeyboardCues(true); - - if(wParam != VK_SPACE && !m_bMenuActive && ::GetFocus() == m_hWnd) - { - m_bAllowKeyboardCues = false; - PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); - T* pT = static_cast(this); - pT->GiveFocusBack(); - m_bSkipMsg = true; - } - else - { - if(wParam == VK_SPACE && m_bUseKeyboardCues && m_bShowKeyboardCues) - { - m_bAllowKeyboardCues = true; - ShowKeyboardCues(false); - } - m_uSysKey = (UINT)wParam; - } - return 0; - } - - LRESULT OnHookSysKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(!m_bAllowKeyboardCues) - m_bAllowKeyboardCues = true; - bHandled = FALSE; - wParam; -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSKEYUP (0x%2.2X)\n"), wParam); -#endif - return 0; - } - - LRESULT OnHookSysChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - bHandled = FALSE; -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_SYSCHAR (0x%2.2X)\n"), wParam); -#endif - - if(!m_bMenuActive && m_hWndHook != m_hWnd && wParam != VK_SPACE) - bHandled = TRUE; - return 0; - } - - LRESULT OnHookKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_KEYDOWN (0x%2.2X)\n"), wParam); -#endif - bHandled = FALSE; - T* pT = static_cast(this); - - if(wParam == VK_ESCAPE && m_stackMenuWnd.GetSize() <= 1) - { - if(m_bMenuActive && !m_bContextMenu) - { - int nHot = GetHotItem(); - if(nHot == -1) - nHot = m_nPopBtn; - if(nHot == -1) - nHot = 0; - SetHotItem(nHot); - bHandled = TRUE; - pT->TakeFocus(); - m_bEscapePressed = true; // To keep focus - m_bSkipPostDown = false; - } - else if(::GetFocus() == m_hWnd && m_wndParent.IsWindow()) - { - SetHotItem(-1); - pT->GiveFocusBack(); - bHandled = TRUE; - } - } - else if(wParam == VK_RETURN || wParam == VK_UP || wParam == VK_DOWN) - { - if(!m_bMenuActive && ::GetFocus() == m_hWnd && m_wndParent.IsWindow()) - { - int nHot = GetHotItem(); - if(nHot != -1) - { - if(wParam != VK_RETURN) - { - if(!m_bSkipPostDown) - { -// IE4 only: WM_KEYDOWN doesn't generate TBN_DROPDOWN, we need to simulate a mouse click -#if (_WIN32_IE < 0x0500) - DWORD dwMajor = 0, dwMinor = 0; - ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor); - if(dwMajor <= 4 || (dwMajor == 5 && dwMinor < 80)) - { - RECT rect; - GetItemRect(nHot, &rect); - PostMessage(WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(rect.left, rect.top)); - } -#endif // (_WIN32_IE < 0x0500) - PostMessage(WM_KEYDOWN, VK_DOWN, 0L); - m_bSkipPostDown = true; - } - else - { - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - skipping posting another VK_DOWN\n")); - m_bSkipPostDown = false; - } - } - } - else - { - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Can't find hot button\n")); - } - } - if(wParam == VK_RETURN && m_bMenuActive) - { - PostMessage(TB_SETHOTITEM, (WPARAM)-1, 0L); - m_nNextPopBtn = -1; - pT->GiveFocusBack(); - } - } - else if(wParam == VK_LEFT || wParam == VK_RIGHT) - { - WPARAM wpNext = m_bLayoutRTL ? VK_LEFT : VK_RIGHT; - WPARAM wpPrev = m_bLayoutRTL ? VK_RIGHT : VK_LEFT; - - if(m_bMenuActive && !m_bContextMenu && !(wParam == wpNext && m_bPopupItem)) - { - bool bAction = false; - if(wParam == wpPrev && s_pCurrentBar->m_stackMenuWnd.GetSize() == 1) - { - m_nNextPopBtn = pT->GetPreviousMenuItem(m_nPopBtn); - if(m_nNextPopBtn != -1) - bAction = true; - } - else if(wParam == wpNext) - { - m_nNextPopBtn = pT->GetNextMenuItem(m_nPopBtn); - if(m_nNextPopBtn != -1) - bAction = true; - } - HWND hWndMenu = m_stackMenuWnd.GetCurrent(); - ATLASSERT(hWndMenu != NULL); - - // Close the popup menu - if(bAction) - { - ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L); - if(wParam == wpNext) - { - int cItem = m_stackMenuWnd.GetSize() - 1; - while(cItem >= 0) - { - hWndMenu = m_stackMenuWnd[cItem]; - if(hWndMenu != NULL) - ::PostMessage(hWndMenu, WM_KEYDOWN, VK_ESCAPE, 0L); - cItem--; - } - } -#if (_WIN32_IE >= 0x0500) - if(m_nNextPopBtn == -2) - { - m_nNextPopBtn = -1; - pT->DisplayChevronMenu(); - } -#endif // (_WIN32_IE >= 0x0500) - bHandled = TRUE; - } - } - } - return 0; - } - - LRESULT OnHookNextMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_NEXTMENU\n")); -#endif - bHandled = FALSE; - return 1; - } - - LRESULT OnHookChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook WM_CHAR (0x%2.2X)\n"), wParam); -#endif - bHandled = (wParam == VK_ESCAPE); - return 0; - } - -// Implementation - ownerdraw overrideables and helpers - void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) - { - T* pT = static_cast(this); - if(m_bFlatMenus) - pT->DrawItemFlat(lpDrawItemStruct); - else - pT->DrawItem3D(lpDrawItemStruct); - - } - - void DrawItem3D(LPDRAWITEMSTRUCT lpDrawItemStruct) - { - _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData; - CDCHandle dc = lpDrawItemStruct->hDC; - const RECT& rcItem = lpDrawItemStruct->rcItem; - T* pT = static_cast(this); - - if(pmd->fType & MFT_SEPARATOR) - { - // draw separator - RECT rc = rcItem; - rc.top += (rc.bottom - rc.top) / 2; // vertical center - dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line - } - else // not a separator - { - BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED; - BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED; - BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED; - BOOL bHasImage = FALSE; - - if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1) - bSelected = FALSE; - RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy }; // button rect - ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2); // center vertically - - int iButton = pmd->iButton; - if(iButton >= 0) - { - bHasImage = TRUE; - - // calc drawing point - SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy }; - sz.cx /= 2; - sz.cy /= 2; - POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy }; - - // fill background depending on state - if(!bChecked || (bSelected && !bDisabled)) - { - if(!bDisabled) - dc.FillRect(&rcButn, (bChecked && !bSelected) ? COLOR_3DLIGHT : COLOR_MENU); - else - dc.FillRect(&rcButn, COLOR_MENU); - } - else - { - COLORREF crTxt = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE)); - COLORREF crBk = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT)); - CBrush hbr(CDCHandle::GetHalftoneBrush()); - dc.SetBrushOrg(rcButn.left, rcButn.top); - dc.FillRect(&rcButn, hbr); - dc.SetTextColor(crTxt); - dc.SetBkColor(crBk); - } - - // draw disabled or normal - if(!bDisabled) - { - // draw pushed-in or popped-out edge - if(bSelected || bChecked) - { - RECT rc2 = rcButn; - dc.DrawEdge(&rc2, bChecked ? BDR_SUNKENOUTER : BDR_RAISEDINNER, BF_RECT); - } - // draw the image - ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT); - } - else - { - HBRUSH hBrushBackground = bChecked ? NULL : ::GetSysColorBrush(COLOR_MENU); - pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground); - } - } - else - { - // no image - look for custom checked/unchecked bitmaps - CMenuItemInfo info; - info.fMask = MIIM_CHECKMARKS | MIIM_TYPE; - ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info); - if(bChecked || info.hbmpUnchecked != NULL) - { - BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0); - bHasImage = pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked); - } - } - - // draw item text - int cxButn = m_szButton.cx; - COLORREF colorBG = ::GetSysColor(bSelected ? COLOR_HIGHLIGHT : COLOR_MENU); - if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT) - { - RECT rcBG = rcItem; - if(bHasImage) - rcBG.left += cxButn + s_kcxGap; - dc.FillRect(&rcBG, bSelected ? COLOR_HIGHLIGHT : COLOR_MENU); - } - - // calc text rectangle and colors - RECT rcText = rcItem; - rcText.left += cxButn + s_kcxGap + s_kcxTextMargin; - rcText.right -= cxButn; - dc.SetBkMode(TRANSPARENT); - COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT)); - - // font already selected by Windows - if(bDisabled && (!bSelected || colorText == colorBG)) - { - // disabled - draw shadow text shifted down and right 1 pixel (unles selected) - RECT rcDisabled = rcText; - ::OffsetRect(&rcDisabled, 1, 1); - pT->DrawMenuText(dc, rcDisabled, pmd->lpstrText, ::GetSysColor(COLOR_3DHILIGHT)); - } - pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally! - } - } - - void DrawItemFlat(LPDRAWITEMSTRUCT lpDrawItemStruct) - { - _MenuItemData* pmd = (_MenuItemData*)lpDrawItemStruct->itemData; - CDCHandle dc = lpDrawItemStruct->hDC; - const RECT& rcItem = lpDrawItemStruct->rcItem; - T* pT = static_cast(this); - -#ifndef COLOR_MENUHILIGHT - const int COLOR_MENUHILIGHT = 29; -#endif // !COLOR_MENUHILIGHT - - BOOL bDisabled = lpDrawItemStruct->itemState & ODS_GRAYED; - BOOL bSelected = lpDrawItemStruct->itemState & ODS_SELECTED; - BOOL bChecked = lpDrawItemStruct->itemState & ODS_CHECKED; - - // paint background - if(bSelected || lpDrawItemStruct->itemAction == ODA_SELECT) - { - if(bSelected) - { - dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENUHILIGHT)); - dc.FrameRect(&rcItem, ::GetSysColorBrush(COLOR_HIGHLIGHT)); - } - else - { - dc.FillRect(&rcItem, ::GetSysColorBrush(COLOR_MENU)); - } - } - - if(pmd->fType & MFT_SEPARATOR) - { - // draw separator - RECT rc = rcItem; - rc.top += (rc.bottom - rc.top) / 2; // vertical center - dc.DrawEdge(&rc, EDGE_ETCHED, BF_TOP); // draw separator line - } - else // not a separator - { - if(LOWORD(lpDrawItemStruct->itemID) == (WORD)-1) - bSelected = FALSE; - RECT rcButn = { rcItem.left, rcItem.top, rcItem.left + m_szButton.cx, rcItem.top + m_szButton.cy }; // button rect - ::OffsetRect(&rcButn, 0, ((rcItem.bottom - rcItem.top) - (rcButn.bottom - rcButn.top)) / 2); // center vertically - - // draw background and border for checked items - if(bChecked) - { - RECT rcCheck = rcButn; - ::InflateRect(&rcCheck, -1, -1); - if(bSelected) - dc.FillRect(&rcCheck, ::GetSysColorBrush(COLOR_MENU)); - dc.FrameRect(&rcCheck, ::GetSysColorBrush(COLOR_HIGHLIGHT)); - } - - int iButton = pmd->iButton; - if(iButton >= 0) - { - // calc drawing point - SIZE sz = { rcButn.right - rcButn.left - m_szBitmap.cx, rcButn.bottom - rcButn.top - m_szBitmap.cy }; - sz.cx /= 2; - sz.cy /= 2; - POINT point = { rcButn.left + sz.cx, rcButn.top + sz.cy }; - - // draw disabled or normal - if(!bDisabled) - { - ::ImageList_Draw(m_hImageList, iButton, dc, point.x, point.y, ILD_TRANSPARENT); - } - else - { - HBRUSH hBrushBackground = ::GetSysColorBrush((bSelected && !(bDisabled && bChecked)) ? COLOR_MENUHILIGHT : COLOR_MENU); - HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW); - pT->DrawBitmapDisabled(dc, iButton, point, hBrushBackground, hBrushBackground, hBrushDisabledImage); - } - } - else - { - // no image - look for custom checked/unchecked bitmaps - CMenuItemInfo info; - info.fMask = MIIM_CHECKMARKS | MIIM_TYPE; - ::GetMenuItemInfo((HMENU)lpDrawItemStruct->hwndItem, lpDrawItemStruct->itemID, MF_BYCOMMAND, &info); - if(bChecked || info.hbmpUnchecked != NULL) - { - BOOL bRadio = ((info.fType & MFT_RADIOCHECK) != 0); - pT->DrawCheckmark(dc, rcButn, bSelected, bDisabled, bRadio, bChecked ? info.hbmpChecked : info.hbmpUnchecked); - } - } - - // draw item text - int cxButn = m_szButton.cx; - // calc text rectangle and colors - RECT rcText = rcItem; - rcText.left += cxButn + s_kcxGap + s_kcxTextMargin; - rcText.right -= cxButn; - dc.SetBkMode(TRANSPARENT); - COLORREF colorText = ::GetSysColor(bDisabled ? (bSelected ? COLOR_GRAYTEXT : COLOR_3DSHADOW) : (bSelected ? COLOR_HIGHLIGHTTEXT : COLOR_MENUTEXT)); - - pT->DrawMenuText(dc, rcText, pmd->lpstrText, colorText); // finally! - } - } - - void DrawMenuText(CDCHandle& dc, RECT& rc, LPCTSTR lpstrText, COLORREF color) - { - int nTab = -1; - for(int i = 0; i < lstrlen(lpstrText); i++) - { - if(lpstrText[i] == _T('\t')) - { - nTab = i; - break; - } - } - dc.SetTextColor(color); - dc.DrawText(lpstrText, nTab, &rc, DT_SINGLELINE | DT_LEFT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX)); - if(nTab != -1) - dc.DrawText(&lpstrText[nTab + 1], -1, &rc, DT_SINGLELINE | DT_RIGHT | DT_VCENTER | (m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX)); - } - - void DrawBitmapDisabled(CDCHandle& dc, int nImage, POINT point, - HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE), - HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT), - HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW)) - { -#if (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) - if(m_bAlphaImages) - { - IMAGELISTDRAWPARAMS ildp = { 0 }; - ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS); - ildp.himl = m_hImageList; - ildp.i = nImage; - ildp.hdcDst = dc; - ildp.x = point.x; - ildp.y = point.y; - ildp.cx = 0; - ildp.cy = 0; - ildp.xBitmap = 0; - ildp.yBitmap = 0; - ildp.fStyle = ILD_TRANSPARENT; - ildp.fState = ILS_SATURATE; - ildp.Frame = 0; - ::ImageList_DrawIndirect(&ildp); - } - else -#endif // (_WIN32_WINNT >= 0x0501) && (_WIN32_IE >= 0x0501) - { - // create memory DC - CDC dcMem; - dcMem.CreateCompatibleDC(dc); - // create mono or color bitmap - CBitmap bmp; - bmp.CreateCompatibleBitmap(dc, m_szBitmap.cx, m_szBitmap.cy); - ATLASSERT(bmp.m_hBitmap != NULL); - // draw image into memory DC--fill BG white first - HBITMAP hBmpOld = dcMem.SelectBitmap(bmp); - dcMem.PatBlt(0, 0, m_szBitmap.cx, m_szBitmap.cy, WHITENESS); - // If white is the text color, we can't use the normal painting since - // it would blend with the WHITENESS, but the mask is OK - UINT uDrawStyle = (::GetSysColor(COLOR_BTNTEXT) == RGB(255, 255, 255)) ? ILD_MASK : ILD_NORMAL; - ::ImageList_Draw(m_hImageList, nImage, dcMem, 0, 0, uDrawStyle); - dc.DitherBlt(point.x, point.y, m_szBitmap.cx, m_szBitmap.cy, dcMem, NULL, 0, 0, hBrushBackground, hBrush3DEffect, hBrushDisabledImage); - dcMem.SelectBitmap(hBmpOld); // restore - } - } - - // old name - BOOL Draw3DCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck) - { - return DrawCheckmark(dc, rc, bSelected, bDisabled, bRadio, hBmpCheck); - } - - BOOL DrawCheckmark(CDCHandle& dc, const RECT& rc, BOOL bSelected, BOOL bDisabled, BOOL bRadio, HBITMAP hBmpCheck) - { - // get checkmark bitmap, if none, use Windows standard - SIZE size = { 0, 0 }; - CBitmapHandle bmp = hBmpCheck; - if(hBmpCheck != NULL) - { - bmp.GetSize(size); - } - else - { - size.cx = ::GetSystemMetrics(SM_CXMENUCHECK); - size.cy = ::GetSystemMetrics(SM_CYMENUCHECK); - bmp.CreateCompatibleBitmap(dc, size.cx, size.cy); - ATLASSERT(bmp.m_hBitmap != NULL); - } - // center bitmap in caller's rectangle - RECT rcDest = rc; - if((rc.right - rc.left) > size.cx) - { - rcDest.left = rc.left + (rc.right - rc.left - size.cx) / 2; - rcDest.right = rcDest.left + size.cx; - } - if((rc.bottom - rc.top) > size.cy) - { - rcDest.top = rc.top + (rc.bottom - rc.top - size.cy) / 2; - rcDest.bottom = rcDest.top + size.cy; - } - // paint background - if(!m_bFlatMenus) - { - if(bSelected && !bDisabled) - { - dc.FillRect(&rcDest, COLOR_MENU); - } - else - { - COLORREF clrTextOld = dc.SetTextColor(::GetSysColor(COLOR_BTNFACE)); - COLORREF clrBkOld = dc.SetBkColor(::GetSysColor(COLOR_BTNHILIGHT)); - CBrush hbr(CDCHandle::GetHalftoneBrush()); - dc.SetBrushOrg(rcDest.left, rcDest.top); - dc.FillRect(&rcDest, hbr); - dc.SetTextColor(clrTextOld); - dc.SetBkColor(clrBkOld); - } - } - - // create source image - CDC dcSource; - dcSource.CreateCompatibleDC(dc); - HBITMAP hBmpOld = dcSource.SelectBitmap(bmp); - // set colors - const COLORREF clrBlack = RGB(0, 0, 0); - const COLORREF clrWhite = RGB(255, 255, 255); - COLORREF clrTextOld = dc.SetTextColor(clrBlack); - COLORREF clrBkOld = dc.SetBkColor(clrWhite); - // create mask - CDC dcMask; - dcMask.CreateCompatibleDC(dc); - CBitmap bmpMask; - bmpMask.CreateBitmap(size.cx, size.cy, 1, 1, NULL); - HBITMAP hBmpOld1 = dcMask.SelectBitmap(bmpMask); - - // draw the checkmark transparently - int cx = rcDest.right - rcDest.left; - int cy = rcDest.bottom - rcDest.top; - if(hBmpCheck != NULL) - { - // build mask based on transparent color - dcSource.SetBkColor(m_clrMask); - dcMask.SetBkColor(clrBlack); - dcMask.SetTextColor(clrWhite); - dcMask.BitBlt(0, 0, size.cx, size.cy, dcSource, 0, 0, SRCCOPY); - // draw bitmap using the mask - dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT); - dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, SRCAND); - dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, SRCINVERT); - } - else - { - const DWORD ROP_DSno = 0x00BB0226L; - const DWORD ROP_DSa = 0x008800C6L; - const DWORD ROP_DSo = 0x00EE0086L; - const DWORD ROP_DSna = 0x00220326L; - - // draw mask - RECT rcSource = { 0, 0, min(size.cx, rc.right - rc.left), min(size.cy, rc.bottom - rc.top) }; - dcMask.DrawFrameControl(&rcSource, DFC_MENU, bRadio ? DFCS_MENUBULLET : DFCS_MENUCHECK); - - // draw shadow if disabled - if(!m_bFlatMenus && bDisabled) - { - // offset by one pixel - int x = rcDest.left + 1; - int y = rcDest.top + 1; - // paint source bitmap - const int nColor = COLOR_3DHILIGHT; - dcSource.FillRect(&rcSource, nColor); - // draw checkmark - special case black and white colors - COLORREF clrCheck = ::GetSysColor(nColor); - if(clrCheck == clrWhite) - { - dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSno); - dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSa); - } - else - { - if(clrCheck != clrBlack) - { - ATLASSERT(dcSource.GetTextColor() == clrBlack); - ATLASSERT(dcSource.GetBkColor() == clrWhite); - dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna); - } - dc.BitBlt(x, y, cx, cy, dcMask, 0, 0, ROP_DSa); - dc.BitBlt(x, y, cx, cy, dcSource, 0, 0, ROP_DSo); - } - } - - // paint source bitmap - const int nColor = bDisabled ? COLOR_BTNSHADOW : COLOR_MENUTEXT; - dcSource.FillRect(&rcSource, nColor); - // draw checkmark - special case black and white colors - COLORREF clrCheck = ::GetSysColor(nColor); - if(clrCheck == clrWhite) - { - dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSno); - dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSa); - } - else - { - if(clrCheck != clrBlack) - { - ATLASSERT(dcSource.GetTextColor() == clrBlack); - ATLASSERT(dcSource.GetBkColor() == clrWhite); - dcSource.BitBlt(0, 0, size.cx, size.cy, dcMask, 0, 0, ROP_DSna); - } - dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcMask, 0, 0, ROP_DSa); - dc.BitBlt(rcDest.left, rcDest.top, cx, cy, dcSource, 0, 0, ROP_DSo); - } - } - // restore all - dc.SetTextColor(clrTextOld); - dc.SetBkColor(clrBkOld); - dcSource.SelectBitmap(hBmpOld); - dcMask.SelectBitmap(hBmpOld1); - if(hBmpCheck == NULL) - bmp.DeleteObject(); - // draw pushed-in hilight - if(!m_bFlatMenus && !bDisabled) - { - if(rc.right - rc.left > size.cx) - ::InflateRect(&rcDest, 1,1); // inflate checkmark by one pixel all around - dc.DrawEdge(&rcDest, BDR_SUNKENOUTER, BF_RECT); - } - - return TRUE; - } - - void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) - { - _MenuItemData* pmd = (_MenuItemData*)lpMeasureItemStruct->itemData; - - if(pmd->fType & MFT_SEPARATOR) // separator - use half system height and zero width - { - lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU) / 2; - lpMeasureItemStruct->itemWidth = 0; - } - else - { - // compute size of text - use DrawText with DT_CALCRECT - CWindowDC dc(NULL); - CFont fontBold; - HFONT hOldFont = NULL; - if(pmd->fState & MFS_DEFAULT) - { - // need bold version of font - LOGFONT lf = { 0 }; - m_fontMenu.GetLogFont(lf); - lf.lfWeight += 200; - fontBold.CreateFontIndirect(&lf); - ATLASSERT(fontBold.m_hFont != NULL); - hOldFont = dc.SelectFont(fontBold); - } - else - { - hOldFont = dc.SelectFont(m_fontMenu); - } - - RECT rcText = { 0, 0, 0, 0 }; - dc.DrawText(pmd->lpstrText, -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT); - int cx = rcText.right - rcText.left; - dc.SelectFont(hOldFont); - - LOGFONT lf = { 0 }; - m_fontMenu.GetLogFont(lf); - int cy = lf.lfHeight; - if(cy < 0) - cy = -cy; - const int cyMargin = 8; - cy += cyMargin; - - // height of item is the bigger of these two - lpMeasureItemStruct->itemHeight = max(cy, (int)m_szButton.cy); - - // width is width of text plus a bunch of stuff - cx += 2 * s_kcxTextMargin; // L/R margin for readability - cx += s_kcxGap; // space between button and menu text - cx += 2 * m_szButton.cx; // button width (L=button; R=empty margin) - cx += m_cxExtraSpacing; // extra between item text and accelerator keys - - // Windows adds 1 to returned value - cx -= ::GetSystemMetrics(SM_CXMENUCHECK) - 1; - lpMeasureItemStruct->itemWidth = cx; // done deal - } - } - -// Implementation - Hook procs - static LRESULT CALLBACK CreateHookProc(int nCode, WPARAM wParam, LPARAM lParam) - { - const int cchClassName = 7; - TCHAR szClassName[cchClassName] = { 0 }; - - if(nCode == HCBT_CREATEWND) - { - HWND hWndMenu = (HWND)wParam; -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - HCBT_CREATEWND (HWND = %8.8X)\n"), hWndMenu); -#endif - - ::GetClassName(hWndMenu, szClassName, cchClassName); - if(!lstrcmp(_T("#32768"), szClassName)) - s_pCurrentBar->m_stackMenuWnd.Push(hWndMenu); - } - else if(nCode == HCBT_DESTROYWND) - { - HWND hWndMenu = (HWND)wParam; -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - HCBT_DESTROYWND (HWND = %8.8X)\n"), hWndMenu); -#endif - - ::GetClassName(hWndMenu, szClassName, cchClassName); - if(!lstrcmp(_T("#32768"), szClassName)) - { - ATLASSERT(hWndMenu == s_pCurrentBar->m_stackMenuWnd.GetCurrent()); - s_pCurrentBar->m_stackMenuWnd.Pop(); - } - } - - return ::CallNextHookEx(s_hCreateHook, nCode, wParam, lParam); - } - - static LRESULT CALLBACK MessageHookProc(int nCode, WPARAM wParam, LPARAM lParam) - { - LPMSG pMsg = (LPMSG)lParam; - - if(nCode == HC_ACTION && wParam == PM_REMOVE && pMsg->message != GetGetBarMessage() && pMsg->message != WM_FORWARDMSG) - { - CCommandBarCtrlBase* pCmdBar = NULL; - HWND hWnd = pMsg->hwnd; - DWORD dwPID = 0; - while(pCmdBar == NULL && hWnd != NULL) - { - pCmdBar = (CCommandBarCtrlBase*)::SendMessage(hWnd, GetGetBarMessage(), (WPARAM)&dwPID, 0L); - hWnd = ::GetParent(hWnd); - } - - if(pCmdBar != NULL && dwPID == GetCurrentProcessId()) - { - pCmdBar->m_hWndHook = pMsg->hwnd; - ATLASSERT(pCmdBar->IsCommandBarBase()); - - if(::IsWindow(pCmdBar->m_hWnd)) - pCmdBar->SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg); - else - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - Hook skipping message, can't find command bar!\n")); - } - } - - LRESULT lRet = 0; - ATLASSERT(s_pmapMsgHook != NULL); - if(s_pmapMsgHook != NULL) - { - DWORD dwThreadID = ::GetCurrentThreadId(); - _MsgHookData* pData = s_pmapMsgHook->Lookup(dwThreadID); - if(pData != NULL) - { - lRet = ::CallNextHookEx(pData->hMsgHook, nCode, wParam, lParam); - } - } - return lRet; - } - -// Implementation - void DoPopupMenu(int nIndex, bool bAnimate) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - DoPopupMenu, bAnimate = %s\n"), bAnimate ? "true" : "false"); -#endif - - // Menu animation flags -#ifndef TPM_VERPOSANIMATION - const UINT TPM_VERPOSANIMATION = 0x1000L; -#endif -#ifndef TPM_NOANIMATION - const UINT TPM_NOANIMATION = 0x4000L; -#endif - T* pT = static_cast(this); - - // get popup menu and it's position - RECT rect = { 0 }; - GetItemRect(nIndex, &rect); - POINT pt = { rect.left, rect.bottom }; - MapWindowPoints(NULL, &pt, 1); - MapWindowPoints(NULL, &rect); - TPMPARAMS TPMParams = { 0 }; - TPMParams.cbSize = sizeof(TPMPARAMS); - TPMParams.rcExclude = rect; - HMENU hMenuPopup = ::GetSubMenu(m_hMenu, nIndex); - ATLASSERT(hMenuPopup != NULL); - - // get button ID - TBBUTTON tbb = { 0 }; - GetButton(nIndex, &tbb); - int nCmdID = tbb.idCommand; - - m_nPopBtn = nIndex; // remember current button's index - - // press button and display popup menu - PressButton(nCmdID, TRUE); - SetHotItem(nCmdID); - pT->DoTrackPopupMenu(hMenuPopup, TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | - (s_bW2K ? (bAnimate ? TPM_VERPOSANIMATION : TPM_NOANIMATION) : 0), pt.x, pt.y, &TPMParams); - PressButton(nCmdID, FALSE); - if(::GetFocus() != m_hWnd) - SetHotItem(-1); - - m_nPopBtn = -1; // restore - - // eat next message if click is on the same button - MSG msg = { 0 }; - if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rect, msg.pt)) - ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE); - - // check if another popup menu should be displayed - if(m_nNextPopBtn != -1) - { - PostMessage(GetAutoPopupMessage(), m_nNextPopBtn & 0xFFFF); - if(!(m_nNextPopBtn & 0xFFFF0000) && !m_bPopupItem) - PostMessage(WM_KEYDOWN, VK_DOWN, 0); - m_nNextPopBtn = -1; - } - else - { - m_bContextMenu = false; - // If user didn't hit escape, give focus back - if(!m_bEscapePressed) - { - if(m_bUseKeyboardCues && m_bShowKeyboardCues) - m_bAllowKeyboardCues = false; - pT->GiveFocusBack(); - } - else - { - SetHotItem(nCmdID); - SetAnchorHighlight(TRUE); - } - } - } - - BOOL DoTrackPopupMenu(HMENU hMenu, UINT uFlags, int x, int y, LPTPMPARAMS lpParams = NULL) - { - CMenuHandle menuPopup = hMenu; - - CWindowCreateCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::DoTrackPopupMenu.\n")); - ATLASSERT(FALSE); - return FALSE; - } - - ATLASSERT(s_hCreateHook == NULL); - - s_pCurrentBar = static_cast(this); - - s_hCreateHook = ::SetWindowsHookEx(WH_CBT, CreateHookProc, ModuleHelper::GetModuleInstance(), GetCurrentThreadId()); - ATLASSERT(s_hCreateHook != NULL); - - m_bPopupItem = false; - m_bMenuActive = true; - - BOOL bTrackRet = menuPopup.TrackPopupMenuEx(uFlags, x, y, m_hWnd, lpParams); - m_bMenuActive = false; - - ::UnhookWindowsHookEx(s_hCreateHook); - - s_hCreateHook = NULL; - s_pCurrentBar = NULL; - - lock.Unlock(); - - // cleanup - convert menus back to original state -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - TrackPopupMenu - cleanup\n")); -#endif - - ATLASSERT(m_stackMenuWnd.GetSize() == 0); - - UpdateWindow(); - ATL::CWindow wndTL = GetTopLevelParent(); - wndTL.UpdateWindow(); - - // restore the menu items to the previous state for all menus that were converted - if(m_bImagesVisible) - { - HMENU hMenuSav = NULL; - while((hMenuSav = m_stackMenuHandle.Pop()) != NULL) - { - menuPopup = hMenuSav; - BOOL bRet = FALSE; - // restore state and delete menu item data - for(int i = 0; i < menuPopup.GetMenuItemCount(); i++) - { - CMenuItemInfo mii; - mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_ID; - bRet = menuPopup.GetMenuItemInfo(i, TRUE, &mii); - ATLASSERT(bRet); - - _MenuItemData* pMI = (_MenuItemData*)mii.dwItemData; - if(pMI != NULL && pMI->IsCmdBarMenuItem()) - { - mii.fMask = MIIM_DATA | MIIM_TYPE | MIIM_STATE; - mii.fType = pMI->fType; - mii.fState = pMI->fState; - mii.dwTypeData = pMI->lpstrText; - mii.cch = lstrlen(pMI->lpstrText); - mii.dwItemData = NULL; - - bRet = menuPopup.SetMenuItemInfo(i, TRUE, &mii); - // this one triggers WM_MEASUREITEM - menuPopup.ModifyMenu(i, MF_BYPOSITION | mii.fType | mii.fState, mii.wID, pMI->lpstrText); - ATLASSERT(bRet); - - delete [] pMI->lpstrText; - delete pMI; - } - } - } - } - return bTrackRet; - } - - int GetPreviousMenuItem(int nBtn) const - { - if(nBtn == -1) - return -1; -#if (_WIN32_IE >= 0x0500) - RECT rcClient; - GetClientRect(&rcClient); -#endif // (_WIN32_IE >= 0x0500) - int nNextBtn; - for(nNextBtn = nBtn - 1; nNextBtn != nBtn; nNextBtn--) - { - if(nNextBtn < 0) - nNextBtn = ::GetMenuItemCount(m_hMenu) - 1; - TBBUTTON tbb = { 0 }; - GetButton(nNextBtn, &tbb); -#if (_WIN32_IE >= 0x0500) - RECT rcBtn; - GetItemRect(nNextBtn, &rcBtn); - if(rcBtn.right > rcClient.right) - { - nNextBtn = -2; // chevron - break; - } -#endif // (_WIN32_IE >= 0x0500) - if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0) - break; - } - return (nNextBtn != nBtn) ? nNextBtn : -1; - } - - int GetNextMenuItem(int nBtn) const - { - if(nBtn == -1) - return -1; -#if (_WIN32_IE >= 0x0500) - RECT rcClient = { 0 }; - GetClientRect(&rcClient); -#endif // (_WIN32_IE >= 0x0500) - int nNextBtn = 0; - int nCount = ::GetMenuItemCount(m_hMenu); - for(nNextBtn = nBtn + 1; nNextBtn != nBtn; nNextBtn++) - { - if(nNextBtn >= nCount) - nNextBtn = 0; - TBBUTTON tbb = { 0 }; - GetButton(nNextBtn, &tbb); -#if (_WIN32_IE >= 0x0500) - RECT rcBtn = { 0 }; - GetItemRect(nNextBtn, &rcBtn); - if(rcBtn.right > rcClient.right) - { - nNextBtn = -2; // chevron - break; - } -#endif // (_WIN32_IE >= 0x0500) - if((tbb.fsState & TBSTATE_ENABLED) != 0 && (tbb.fsState & TBSTATE_HIDDEN) == 0) - break; - } - return (nNextBtn != nBtn) ? nNextBtn : -1; - } - -#if (_WIN32_IE >= 0x0500) - bool DisplayChevronMenu() - { - // assume we are in a rebar - HWND hWndReBar = GetParent(); - int nCount = (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L); - bool bRet = false; - for(int i = 0; i < nCount; i++) - { - REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_STYLE }; - BOOL bRetBandInfo = (BOOL)::SendMessage(hWndReBar, RB_GETBANDINFO, i, (LPARAM)&rbbi); - if(bRetBandInfo && rbbi.hwndChild == m_hWnd) - { - if((rbbi.fStyle & RBBS_USECHEVRON) != 0) - { - ::PostMessage(hWndReBar, RB_PUSHCHEVRON, i, 0L); - PostMessage(WM_KEYDOWN, VK_DOWN, 0L); - bRet = true; - } - break; - } - } - return bRet; - } -#endif // (_WIN32_IE >= 0x0500) - - void GetSystemSettings() - { - // refresh our font - NONCLIENTMETRICS info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; - BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); - ATLASSERT(bRet); - if(bRet) - { - LOGFONT logfont = { 0 }; - if(m_fontMenu.m_hFont != NULL) - m_fontMenu.GetLogFont(logfont); - if(logfont.lfHeight != info.lfMenuFont.lfHeight || - logfont.lfWidth != info.lfMenuFont.lfWidth || - logfont.lfEscapement != info.lfMenuFont.lfEscapement || - logfont.lfOrientation != info.lfMenuFont.lfOrientation || - logfont.lfWeight != info.lfMenuFont.lfWeight || - logfont.lfItalic != info.lfMenuFont.lfItalic || - logfont.lfUnderline != info.lfMenuFont.lfUnderline || - logfont.lfStrikeOut != info.lfMenuFont.lfStrikeOut || - logfont.lfCharSet != info.lfMenuFont.lfCharSet || - logfont.lfOutPrecision != info.lfMenuFont.lfOutPrecision || - logfont.lfClipPrecision != info.lfMenuFont.lfClipPrecision || - logfont.lfQuality != info.lfMenuFont.lfQuality || - logfont.lfPitchAndFamily != info.lfMenuFont.lfPitchAndFamily || - lstrcmp(logfont.lfFaceName, info.lfMenuFont.lfFaceName) != 0) - { - HFONT hFontMenu = ::CreateFontIndirect(&info.lfMenuFont); - ATLASSERT(hFontMenu != NULL); - if(hFontMenu != NULL) - { - if(m_fontMenu.m_hFont != NULL) - m_fontMenu.DeleteObject(); - m_fontMenu.Attach(hFontMenu); - SetFont(m_fontMenu); - AddStrings(_T("NS\0")); // for proper item height - AutoSize(); - } - } - } - - // check if we need extra spacing for menu item text - CWindowDC dc(m_hWnd); - HFONT hFontOld = dc.SelectFont(m_fontMenu); - RECT rcText = { 0, 0, 0, 0 }; - dc.DrawText(_T("\t"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT); - if((rcText.right - rcText.left) < 4) - { - ::SetRectEmpty(&rcText); - dc.DrawText(_T("x"), -1, &rcText, DT_SINGLELINE | DT_LEFT | DT_VCENTER | DT_CALCRECT); - m_cxExtraSpacing = rcText.right - rcText.left; - } - else - { - m_cxExtraSpacing = 0; - } - dc.SelectFont(hFontOld); - - // get Windows version - OSVERSIONINFO ovi = { sizeof(OSVERSIONINFO) }; - ::GetVersionEx(&ovi); - - // query keyboard cues mode (Windows 2000 or later) - if(ovi.dwMajorVersion >= 5) - { -#ifndef SPI_GETKEYBOARDCUES - const UINT SPI_GETKEYBOARDCUES = 0x100A; -#endif // !SPI_GETKEYBOARDCUES - BOOL bRetVal = TRUE; - bRet = ::SystemParametersInfo(SPI_GETKEYBOARDCUES, 0, &bRetVal, 0); - m_bUseKeyboardCues = (bRet && !bRetVal); - m_bAllowKeyboardCues = true; - ShowKeyboardCues(!m_bUseKeyboardCues); - } - - // query flat menu mode (Windows XP or later) - if((ovi.dwMajorVersion == 5 && ovi.dwMinorVersion >= 1) || (ovi.dwMajorVersion > 5)) - { -#ifndef SPI_GETFLATMENU - const UINT SPI_GETFLATMENU = 0x1022; -#endif // !SPI_GETFLATMENU - BOOL bRetVal = FALSE; - bRet = ::SystemParametersInfo(SPI_GETFLATMENU, 0, &bRetVal, 0); - m_bFlatMenus = (bRet && bRetVal); - } - -#if _WTL_CMDBAR_VISTA_MENUS - // check if we should use Vista menus - bool bVistaMenus = (RunTimeHelper::IsVista() && RunTimeHelper::IsCommCtrl6() && ((m_dwExtendedStyle & CBR_EX_NOVISTAMENUS) == 0)); - - if(bVistaMenus) - { - HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); - if(hThemeDLL != NULL) - { - typedef BOOL (STDAPICALLTYPE *PFN_IsThemeActive)(); - PFN_IsThemeActive pfnIsThemeActive = (PFN_IsThemeActive)::GetProcAddress(hThemeDLL, "IsThemeActive"); - ATLASSERT(pfnIsThemeActive != NULL); - bVistaMenus = bVistaMenus && (pfnIsThemeActive != NULL) && (pfnIsThemeActive() != FALSE); - - typedef BOOL (STDAPICALLTYPE *PFN_IsAppThemed)(); - PFN_IsAppThemed pfnIsAppThemed = (PFN_IsAppThemed)::GetProcAddress(hThemeDLL, "IsAppThemed"); - ATLASSERT(pfnIsAppThemed != NULL); - bVistaMenus = bVistaMenus && (pfnIsAppThemed != NULL) && (pfnIsAppThemed() != FALSE); - - ::FreeLibrary(hThemeDLL); - } - } - - if(!bVistaMenus && m_bVistaMenus && (m_hMenu != NULL) && (m_arrCommand.GetSize() > 0)) - { - T* pT = static_cast(this); - pT->_RemoveVistaBitmapsFromMenu(); - } - - m_bVistaMenus = bVistaMenus; -#endif // _WTL_CMDBAR_VISTA_MENUS - -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("CmdBar - GetSystemSettings:\n m_bFlatMenus = %s\n m_bUseKeyboardCues = %s m_bVistaMenus = %s\n"), - m_bFlatMenus ? "true" : "false", m_bUseKeyboardCues ? "true" : "false", m_bVistaMenus ? "true" : "false"); -#endif - } - -// Implementation - alternate focus mode support - void TakeFocus() - { - if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_hWndFocus == NULL) - m_hWndFocus = ::GetFocus(); - SetFocus(); - } - - void GiveFocusBack() - { - if(m_bParentActive) - { - if((m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && ::IsWindow(m_hWndFocus)) - ::SetFocus(m_hWndFocus); - else if(!(m_dwExtendedStyle & CBR_EX_ALTFOCUSMODE) && m_wndParent.IsWindow()) - m_wndParent.SetFocus(); - } - m_hWndFocus = NULL; - SetAnchorHighlight(FALSE); - if(m_bUseKeyboardCues && m_bShowKeyboardCues) - ShowKeyboardCues(false); - m_bSkipPostDown = false; - } - - void ShowKeyboardCues(bool bShow) - { - m_bShowKeyboardCues = bShow; - SetDrawTextFlags(DT_HIDEPREFIX, m_bShowKeyboardCues ? 0 : DT_HIDEPREFIX); - Invalidate(); - UpdateWindow(); - } - -// Implementation - internal message helpers - static UINT GetAutoPopupMessage() - { - static UINT uAutoPopupMessage = 0; - if(uAutoPopupMessage == 0) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetAutoPopupMessage.\n")); - ATLASSERT(FALSE); - return 0; - } - - if(uAutoPopupMessage == 0) - uAutoPopupMessage = ::RegisterWindowMessage(_T("WTL_CmdBar_InternalAutoPopupMsg")); - - lock.Unlock(); - } - ATLASSERT(uAutoPopupMessage != 0); - return uAutoPopupMessage; - } - - static UINT GetGetBarMessage() - { - static UINT uGetBarMessage = 0; - if(uGetBarMessage == 0) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CCommandBarCtrlImpl::GetGetBarMessage.\n")); - ATLASSERT(FALSE); - return 0; - } - - if(uGetBarMessage == 0) - uGetBarMessage = ::RegisterWindowMessage(_T("WTL_CmdBar_InternalGetBarMsg")); - - lock.Unlock(); - } - ATLASSERT(uGetBarMessage != 0); - return uGetBarMessage; - } - -// Implementation - bool CreateInternalImageList(int cImages) - { - UINT uFlags = (m_bAlphaImages ? ILC_COLOR32 : ILC_COLOR24) | ILC_MASK; - m_hImageList = ::ImageList_Create(m_szBitmap.cx, m_szBitmap.cy, uFlags, cImages, 1); - ATLASSERT(m_hImageList != NULL); - return (m_hImageList != NULL); - } - -// Implementation - support for Vista menus -#if _WTL_CMDBAR_VISTA_MENUS - void _AddVistaBitmapsFromImageList(int nStartIndex, int nCount) - { - // Create display compatible memory DC - CClientDC dc(NULL); - CDC dcMem; - dcMem.CreateCompatibleDC(dc); - HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); - - T* pT = static_cast(this); - // Create bitmaps for all menu items - for(int i = 0; i < nCount; i++) - { - HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nStartIndex + i, dc, dcMem); - dcMem.SelectBitmap(hBitmapSave); - m_arrVistaBitmap.Add(hBitmap); - } - } - - void _AddVistaBitmapFromImageList(int nIndex) - { - // Create display compatible memory DC - CClientDC dc(NULL); - CDC dcMem; - dcMem.CreateCompatibleDC(dc); - HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); - - // Create bitmap for menu item - T* pT = static_cast(this); - HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem); - - // Select saved bitmap back and add bitmap to the array - dcMem.SelectBitmap(hBitmapSave); - m_arrVistaBitmap.Add(hBitmap); - } - - void _ReplaceVistaBitmapFromImageList(int nIndex) - { - // Delete existing bitmap - if(m_arrVistaBitmap[nIndex] != NULL) - ::DeleteObject(m_arrVistaBitmap[nIndex]); - - // Create display compatible memory DC - CClientDC dc(NULL); - CDC dcMem; - dcMem.CreateCompatibleDC(dc); - HBITMAP hBitmapSave = dcMem.GetCurrentBitmap(); - - // Create bitmap for menu item - T* pT = static_cast(this); - HBITMAP hBitmap = pT->_CreateVistaBitmapHelper(nIndex, dc, dcMem); - - // Select saved bitmap back and replace bitmap in the array - dcMem.SelectBitmap(hBitmapSave); - m_arrVistaBitmap.SetAtIndex(nIndex, hBitmap); - } - - HBITMAP _CreateVistaBitmapHelper(int nIndex, HDC hDCSource, HDC hDCTarget) - { - // Create 32-bit bitmap - BITMAPINFO bi = { 0 }; - bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bi.bmiHeader.biWidth = m_szBitmap.cx; - bi.bmiHeader.biHeight = m_szBitmap.cy; - bi.bmiHeader.biPlanes = 1; - bi.bmiHeader.biBitCount = 32; - bi.bmiHeader.biCompression = BI_RGB; - bi.bmiHeader.biSizeImage = 0; - bi.bmiHeader.biXPelsPerMeter = 0; - bi.bmiHeader.biYPelsPerMeter = 0; - bi.bmiHeader.biClrUsed = 0; - bi.bmiHeader.biClrImportant = 0; - HBITMAP hBitmap = ::CreateDIBSection(hDCSource, &bi, DIB_RGB_COLORS, NULL, NULL, 0); - ATLASSERT(hBitmap != NULL); - - // Select bitmap into target DC and draw from image list to it - if(hBitmap != NULL) - { - ::SelectObject(hDCTarget, hBitmap); - - IMAGELISTDRAWPARAMS ildp = { 0 }; - ildp.cbSize = sizeof(IMAGELISTDRAWPARAMS); - ildp.himl = m_hImageList; - ildp.i = nIndex; - ildp.hdcDst = hDCTarget; - ildp.x = 0; - ildp.y = 0; - ildp.cx = 0; - ildp.cy = 0; - ildp.xBitmap = 0; - ildp.yBitmap = 0; - ildp.fStyle = ILD_TRANSPARENT; - ildp.fState = ILS_ALPHA; - ildp.Frame = 255; - ::ImageList_DrawIndirect(&ildp); - } - - return hBitmap; - } - - void _RemoveVistaBitmapsFromMenu() - { - CMenuHandle menu = m_hMenu; - for(int i = 0; i < m_arrCommand.GetSize(); i++) - { - CMenuItemInfo mii; - mii.fMask = MIIM_BITMAP; - mii.hbmpItem = NULL; - menu.SetMenuItemInfo(m_arrCommand[i], FALSE, &mii); - } - } -#endif // _WTL_CMDBAR_VISTA_MENUS -}; - - -class CCommandBarCtrl : public CCommandBarCtrlImpl -{ -public: - DECLARE_WND_SUPERCLASS(_T("WTL_CommandBar"), GetWndClassName()) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CMDICommandBarCtrl - ATL implementation of Command Bars for MDI apps - -template -class ATL_NO_VTABLE CMDICommandBarCtrlImpl : public CCommandBarCtrlImpl< T, TBase, TWinTraits> -{ -public: -// Data members - ATL::CContainedWindow m_wndMDIClient; - bool m_bChildMaximized; - HWND m_hWndChildMaximized; - HICON m_hIconChildMaximized; - int m_nBtnPressed; - int m_nBtnWasPressed; - - int m_cxyOffset; // offset between nonclient elements - int m_cxIconWidth; // small icon width - int m_cyIconHeight; // small icon height - int m_cxBtnWidth; // nonclient button width - int m_cyBtnHeight; // nonclient button height - int m_cxLeft; // left nonclient area width - int m_cxRight; // right nonclient area width - -// Theme declarations and data members -#ifndef _WTL_NO_AUTO_THEME -#ifndef _UXTHEME_H_ - typedef HANDLE HTHEME; -#endif // !_UXTHEME_H_ - typedef HTHEME (STDAPICALLTYPE *PFN_OpenThemeData)(HWND hwnd, LPCWSTR pszClassList); - typedef HRESULT (STDAPICALLTYPE *PFN_CloseThemeData)(HTHEME hTheme); - typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeBackground)(HTHEME hTheme, HDC hdc, int iPartId, int iStateId, const RECT *pRect, OPTIONAL const RECT *pClipRect); - typedef HRESULT (STDAPICALLTYPE *PFN_DrawThemeParentBackground)(HWND hwnd, HDC hdc, OPTIONAL RECT* prc); - - HMODULE m_hThemeDLL; - HTHEME m_hTheme; - PFN_DrawThemeBackground m_pfnDrawThemeBackground; - PFN_DrawThemeParentBackground m_pfnDrawThemeParentBackground; -#endif // !_WTL_NO_AUTO_THEME - -// Constructor/destructor - CMDICommandBarCtrlImpl() : - m_wndMDIClient(this, 2), m_bChildMaximized(false), - m_hWndChildMaximized(NULL), m_hIconChildMaximized(NULL), - m_nBtnPressed(-1), m_nBtnWasPressed(-1), -#ifndef _WTL_NO_AUTO_THEME - m_hThemeDLL(NULL), m_hTheme(NULL), m_pfnDrawThemeBackground(NULL), m_pfnDrawThemeParentBackground(NULL), -#endif // !_WTL_NO_AUTO_THEME - m_cxyOffset(2), - m_cxIconWidth(16), m_cyIconHeight(16), - m_cxBtnWidth(16), m_cyBtnHeight(14), - m_cxLeft(20), m_cxRight(55) - { } - - ~CMDICommandBarCtrlImpl() - { - if(m_wndMDIClient.IsWindow()) -/*scary!*/ m_wndMDIClient.UnsubclassWindow(); - } - -// Operations - BOOL SetMDIClient(HWND hWndMDIClient) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(::IsWindow(hWndMDIClient)); - if(!::IsWindow(hWndMDIClient)) - return FALSE; - -#ifdef _DEBUG - // BLOCK: Test if the passed window is MDICLIENT - { - LPCTSTR lpszMDIClientClass = _T("MDICLIENT"); - const int nNameLen = 9 + 1; // "MDICLIENT" + NULL - TCHAR szClassName[nNameLen] = { 0 }; - ::GetClassName(hWndMDIClient, szClassName, nNameLen); - ATLASSERT(lstrcmpi(szClassName, lpszMDIClientClass) == 0); - } -#endif // _DEBUG - - if(m_wndMDIClient.IsWindow()) -/*scary!*/ m_wndMDIClient.UnsubclassWindow(); - - return m_wndMDIClient.SubclassWindow(hWndMDIClient); - } - -// Message maps - typedef CCommandBarCtrlImpl< T, TBase, TWinTraits > _baseClass; - BEGIN_MSG_MAP(CMDICommandBarCtrlImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) -#ifndef _WTL_NO_AUTO_THEME - MESSAGE_HANDLER(_GetThemeChangedMsg(), OnThemeChanged) -#endif // !_WTL_NO_AUTO_THEME - MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize) - MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint) - MESSAGE_HANDLER(WM_NCHITTEST, OnNcHitTest) - MESSAGE_HANDLER(WM_NCLBUTTONDOWN, OnNcLButtonDown) - MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) - MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) - MESSAGE_HANDLER(WM_NCLBUTTONDBLCLK, OnNcLButtonDblClk) - MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) - CHAIN_MSG_MAP(_baseClass) - ALT_MSG_MAP(1) // Parent window messages - MESSAGE_HANDLER(WM_ACTIVATE, OnParentActivate) - CHAIN_MSG_MAP_ALT(_baseClass, 1) - ALT_MSG_MAP(2) // MDI client window messages - MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu) - // no chaining needed since this was moved from the base class here - ALT_MSG_MAP(3) // Message hook messages - MESSAGE_RANGE_HANDLER(0, 0xFFFF, OnAllHookMessages) - CHAIN_MSG_MAP_ALT(_baseClass, 3) - END_MSG_MAP() - -// Additional MDI message handlers - LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - LRESULT lRet = _baseClass::OnCreate(uMsg, wParam, lParam, bHandled); - if(lRet == (LRESULT)-1) - return lRet; - -#ifndef _WTL_NO_AUTO_THEME - // this will fail if theming is not supported - m_hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); - if(m_hThemeDLL != NULL) - { - m_pfnDrawThemeBackground = (PFN_DrawThemeBackground)::GetProcAddress(m_hThemeDLL, "DrawThemeBackground"); - ATLASSERT(m_pfnDrawThemeBackground != NULL); - if(m_pfnDrawThemeBackground != NULL) - { - T* pT = static_cast(this); - pT->_OpenThemeData(); - } - else - { - ::FreeLibrary(m_hThemeDLL); - m_hThemeDLL = NULL; - } - m_pfnDrawThemeParentBackground = (PFN_DrawThemeParentBackground)::GetProcAddress(m_hThemeDLL, "DrawThemeParentBackground"); - ATLASSERT(m_pfnDrawThemeParentBackground != NULL); - } -#endif // !_WTL_NO_AUTO_THEME - - return lRet; - } - - LRESULT OnDestroy(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - LRESULT lRet = _baseClass::OnDestroy(uMsg, wParam, lParam, bHandled); - -#ifndef _WTL_NO_AUTO_THEME - if(m_hThemeDLL != NULL) - { - T* pT = static_cast(this); - pT->_CloseThemeData(); - ::FreeLibrary(m_hThemeDLL); - m_hThemeDLL = NULL; - } -#endif // !_WTL_NO_AUTO_THEME - - return lRet; - } - -#ifndef _WTL_NO_AUTO_THEME - LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(m_hThemeDLL != NULL) - { - T* pT = static_cast(this); - pT->_CloseThemeData(); - pT->_OpenThemeData(); - } - return 0; - } -#endif // !_WTL_NO_AUTO_THEME - - LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - T* pT = static_cast(this); - pT->_AdjustBtnSize(GET_Y_LPARAM(lParam)); - return lRet; - } - - LRESULT OnNcCalcSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - - if(m_bChildMaximized && (BOOL)wParam) - { - LPNCCALCSIZE_PARAMS lpParams = (LPNCCALCSIZE_PARAMS)lParam; - if(m_bLayoutRTL) - { - lpParams->rgrc[0].left += m_cxRight; - lpParams->rgrc[0].right -= m_cxLeft; - } - else - { - lpParams->rgrc[0].left += m_cxLeft; - lpParams->rgrc[0].right -= m_cxRight; - } - } - - return lRet; - } - - LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - - if(!m_bChildMaximized) - return lRet; - - ATLASSERT(m_hWndChildMaximized != NULL && m_hIconChildMaximized != NULL); - - // get DC and window rectangle - CWindowDC dc(m_hWnd); - RECT rect; - GetWindowRect(&rect); - int cxWidth = rect.right - rect.left; - int cyHeight = rect.bottom - rect.top; - - // paint left side nonclient background and draw icon - ::SetRect(&rect, 0, 0, m_cxLeft, cyHeight); -#ifndef _WTL_NO_AUTO_THEME - if(m_hTheme != NULL) - { - if(m_pfnDrawThemeParentBackground != NULL) - m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect); - else - dc.FillRect(&rect, COLOR_WINDOW); - } - else -#endif // !_WTL_NO_AUTO_THEME - { - if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0) - dc.FillRect(&rect, COLOR_3DFACE); - else - dc.FillRect(&rect, COLOR_MENU); - } - - RECT rcIcon = { 0 }; - T* pT = static_cast(this); - pT->_CalcIconRect(cxWidth, cyHeight, rcIcon); - dc.DrawIconEx(rcIcon.left, rcIcon.top, m_hIconChildMaximized, m_cxIconWidth, m_cyIconHeight); - - // paint right side nonclient background - ::SetRect(&rect, cxWidth - m_cxRight, 0, cxWidth, cyHeight); -#ifndef _WTL_NO_AUTO_THEME - if(m_hTheme != NULL) - { - if(m_pfnDrawThemeParentBackground != NULL) - { - // this is to account for the left non-client area - POINT ptOrg = { 0, 0 }; - dc.GetViewportOrg(&ptOrg); - dc.SetViewportOrg(ptOrg.x + m_cxLeft, ptOrg.y); - ::OffsetRect(&rect, -m_cxLeft, 0); - - m_pfnDrawThemeParentBackground(m_hWnd, dc, &rect); - - // restore - dc.SetViewportOrg(ptOrg); - ::OffsetRect(&rect, m_cxLeft, 0); - } - else - { - dc.FillRect(&rect, COLOR_3DFACE); - } - } - else -#endif // !_WTL_NO_AUTO_THEME - { - if((m_dwExtendedStyle & CBR_EX_TRANSPARENT) != 0) - dc.FillRect(&rect, COLOR_3DFACE); - else - dc.FillRect(&rect, COLOR_MENU); - } - - // draw buttons - RECT arrRect[3] = { 0 }; - pT->_CalcBtnRects(cxWidth, cyHeight, arrRect); - pT->_DrawMDIButton(dc, arrRect, -1); // draw all buttons - - return lRet; - } - - LRESULT OnNcHitTest(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - if(m_bChildMaximized) - { - RECT rect = { 0 }; - GetWindowRect(&rect); - POINT pt = { GET_X_LPARAM(lParam) - rect.left, GET_Y_LPARAM(lParam) - rect.top }; - if(m_bLayoutRTL) - { - if((pt.x < m_cxRight) || (pt.x > ((rect.right - rect.left) - m_cxLeft))) - lRet = HTBORDER; - } - else - { - if((pt.x < m_cxLeft) || (pt.x > ((rect.right - rect.left) - m_cxRight))) - lRet = HTBORDER; - } - } - return lRet; - } - - LRESULT OnNcLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(!m_bChildMaximized) - { - bHandled = FALSE; - return 1; - } - - ATLASSERT(_DebugCheckChild()); - - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - RECT rect = { 0 }; - GetWindowRect(&rect); - pt.x -= rect.left; - pt.y -= rect.top; - - RECT rcIcon = { 0 }; - T* pT = static_cast(this); - pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL); - RECT arrRect[3] = { 0 }; - pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL); - - if(::PtInRect(&rcIcon, pt)) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: icon\n")); -#endif -#ifndef TPM_VERPOSANIMATION - const UINT TPM_VERPOSANIMATION = 0x1000L; // Menu animation flag -#endif - CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE); - UINT uRet = (UINT)menu.TrackPopupMenu(TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | TPM_RETURNCMD | - (s_bW2K ? TPM_VERPOSANIMATION : 0), m_bLayoutRTL ? rect.right : rect.left, rect.bottom, m_hWndChildMaximized); - - // eat next message if click is on the same button - ::OffsetRect(&rcIcon, rect.left, rect.top); - MSG msg = { 0 }; - if(::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rcIcon, msg.pt)) - ::PeekMessage(&msg, m_hWnd, WM_NCLBUTTONDOWN, WM_NCLBUTTONDOWN, PM_REMOVE); - - if(uRet != 0) - ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uRet, 0L); - } - else if(::PtInRect(&arrRect[0], pt)) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: close button\n")); -#endif - m_nBtnWasPressed = m_nBtnPressed = 0; - } - else if(::PtInRect(&arrRect[1], pt)) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: restore button\n")); -#endif - m_nBtnWasPressed = m_nBtnPressed = 1; - } - else if(::PtInRect(&arrRect[2], pt)) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonDown: minimize button\n")); -#endif - m_nBtnWasPressed = m_nBtnPressed = 2; - } - else - { - bHandled = FALSE; - } - - // draw the button state if it was pressed - if(m_nBtnPressed != -1) - { - SetCapture(); - CWindowDC dc(m_hWnd); - pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect); - pT->_DrawMDIButton(dc, arrRect, m_nBtnPressed); - } - - return 0; - } - - LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1) - { - bHandled = FALSE; - return 1; - } - - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - ClientToScreen(&pt); - RECT rect = { 0 }; - GetWindowRect(&rect); - pt.x -= rect.left; - pt.y -= rect.top; - RECT arrRect[3] = { 0 }; - T* pT = static_cast(this); - pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL); - int nOldBtnPressed = m_nBtnPressed; - m_nBtnPressed = ::PtInRect(&arrRect[m_nBtnWasPressed], pt) ? m_nBtnWasPressed : -1; - if(nOldBtnPressed != m_nBtnPressed) - { - CWindowDC dc(m_hWnd); - pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect); - pT->_DrawMDIButton(dc, arrRect, (m_nBtnPressed != -1) ? m_nBtnPressed : nOldBtnPressed); - } - - return 0; - } - - LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(!m_bChildMaximized || ::GetCapture() != m_hWnd || m_nBtnWasPressed == -1) - { - bHandled = FALSE; - return 1; - } - - ATLASSERT(_DebugCheckChild()); - - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - ClientToScreen(&pt); - RECT rect = { 0 }; - GetWindowRect(&rect); - pt.x -= rect.left; - pt.y -= rect.top; - - int nBtn = m_nBtnWasPressed; - ReleaseCapture(); - - RECT arrRect[3] = { 0 }; - T* pT = static_cast(this); - pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL); - if(::PtInRect(&arrRect[nBtn], pt)) - { - switch(nBtn) - { - case 0: // close -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: close button\n")); -#endif - ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_CLOSE, 0L); - break; - case 1: // restore -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: restore button\n")); -#endif - ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_RESTORE, 0L); - break; - case 2: // minimize -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - LButtonUp: minimize button\n")); -#endif - ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, SC_MINIMIZE, 0L); - break; - default: - break; - } - } - - return 0; - } - - LRESULT OnNcLButtonDblClk(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(!m_bChildMaximized || m_nBtnWasPressed != -1) - { - bHandled = FALSE; - return 1; - } - - ATLASSERT(_DebugCheckChild()); - - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - RECT rect = { 0 }; - GetWindowRect(&rect); - pt.x -= rect.left; - pt.y -= rect.top; - - RECT rcIcon = { 0 }; - T* pT = static_cast(this); - pT->_CalcIconRect(rect.right - rect.left, rect.bottom - rect.top, rcIcon, m_bLayoutRTL); - RECT arrRect[3] = { 0 }; - pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect, m_bLayoutRTL); - - if(::PtInRect(&rcIcon, pt)) - { - CMenuHandle menu = ::GetSystemMenu(m_hWndChildMaximized, FALSE); - UINT uDefID = menu.GetMenuDefaultItem(); - if(uDefID == (UINT)-1) - uDefID = SC_CLOSE; - ::SendMessage(m_hWndChildMaximized, WM_SYSCOMMAND, uDefID, 0L); - } - - return 0; - } - - LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_bChildMaximized) - { - if(m_nBtnPressed != -1) - { - ATLASSERT(m_nBtnPressed == m_nBtnWasPressed); // must be - m_nBtnPressed = -1; - RECT rect = { 0 }; - GetWindowRect(&rect); - RECT arrRect[3] = { 0 }; - T* pT = static_cast(this); - pT->_CalcBtnRects(rect.right - rect.left, rect.bottom - rect.top, arrRect); - CWindowDC dc(m_hWnd); - pT->_DrawMDIButton(dc, arrRect, m_nBtnWasPressed); - } - m_nBtnWasPressed = -1; - } - else - { - bHandled = FALSE; - } - return 0; - } - -// Parent window message handlers - LRESULT OnParentActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - m_bParentActive = (LOWORD(wParam) != WA_INACTIVE); - RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW); - bHandled = FALSE; - return 1; - } - -// MDI client window message handlers - LRESULT OnMDISetMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - m_wndMDIClient.DefWindowProc(uMsg, NULL, lParam); - HMENU hOldMenu = GetMenu(); - BOOL bRet = AttachMenu((HMENU)wParam); - bRet; // avoid level 4 warning - ATLASSERT(bRet); - -#if (_WIN32_IE >= 0x0400) - T* pT = static_cast(this); - pT->UpdateRebarBandIdealSize(); -#endif // (_WIN32_IE >= 0x0400) - - return (LRESULT)hOldMenu; - } - -// All messages from the message hook - LRESULT OnAllHookMessages(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->_ProcessAllHookMessages(uMsg, wParam, lParam); - - bHandled = FALSE; - return 1; - } - -// Overrideables - // override this to provide different ideal size - void UpdateRebarBandIdealSize() - { - // assuming we are in a rebar, change ideal size to our size - // we hope that if we are not in a rebar, nCount will be 0 - int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L); - for(int i = 0; i < nCount; i++) - { - REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE }; - ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi); - if(rbi.hwndChild == m_hWnd) - { - rbi.fMask = RBBIM_IDEALSIZE; - rbi.cxIdeal = m_bChildMaximized ? m_cxLeft + m_cxRight : 0; - int nBtnCount = GetButtonCount(); - if(nBtnCount > 0) - { - RECT rect = { 0 }; - GetItemRect(nBtnCount - 1, &rect); - rbi.cxIdeal += rect.right; - } - ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi); - break; - } - } - } - - // all hook messages - check for the maximized MDI child window change - void _ProcessAllHookMessages(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/) - { - if(uMsg == WM_MDIGETACTIVE || uMsg == WM_MDISETMENU) - return; - - BOOL bMaximized = FALSE; - HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized); - bool bMaxOld = m_bChildMaximized; - m_bChildMaximized = (hWndChild != NULL && bMaximized); - HICON hIconOld = m_hIconChildMaximized; - - if(m_bChildMaximized) - { - if(m_hWndChildMaximized != hWndChild) - { - ATL::CWindow wnd = m_hWndChildMaximized = hWndChild; - m_hIconChildMaximized = wnd.GetIcon(FALSE); - if(m_hIconChildMaximized == NULL) - { - m_hIconChildMaximized = wnd.GetIcon(TRUE); - if(m_hIconChildMaximized == NULL) - { - // no icon set with WM_SETICON, get the class one -// need conditional code because types don't match in winuser.h -#ifdef _WIN64 - m_hIconChildMaximized = (HICON)::GetClassLongPtr(wnd, GCLP_HICONSM); -#else - m_hIconChildMaximized = (HICON)LongToHandle(::GetClassLongPtr(wnd, GCLP_HICONSM)); -#endif - } - } - } - } - else - { - m_hWndChildMaximized = NULL; - m_hIconChildMaximized = NULL; - } - - if(bMaxOld != m_bChildMaximized) - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - All messages hook change: m_bChildMaximized = %s\n"), m_bChildMaximized ? "true" : "false"); -#endif - // assuming we are in a rebar, change our size to accomodate new state - // we hope that if we are not in a rebar, nCount will be 0 - int nCount = (int)::SendMessage(GetParent(), RB_GETBANDCOUNT, 0, 0L); - int cxDiff = (m_bChildMaximized ? 1 : -1) * (m_cxLeft + m_cxRight); - for(int i = 0; i < nCount; i++) - { -#if (_WIN32_IE >= 0x0500) - REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_STYLE }; - ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi); - if(rbi.hwndChild == m_hWnd) - { - if((rbi.fStyle & RBBS_USECHEVRON) != 0) - { - rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE; - rbi.cxMinChild += cxDiff; - rbi.cxIdeal += cxDiff; - ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi); - } - break; - } -#elif (_WIN32_IE >= 0x0400) - REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_IDEALSIZE }; - ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi); - if(rbi.hwndChild == m_hWnd) - { - rbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE; - rbi.cxMinChild += cxDiff; - rbi.cxIdeal += cxDiff; - ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi); - break; - } -#else // (_WIN32_IE < 0x0400) - REBARBANDINFO rbi = { RunTimeHelper::SizeOf_REBARBANDINFO(), RBBIM_CHILD | RBBIM_CHILDSIZE }; - ::SendMessage(GetParent(), RB_GETBANDINFO, i, (LPARAM)&rbi); - if(rbi.hwndChild == m_hWnd) - { - rbi.fMask = RBBIM_CHILDSIZE; - rbi.cxMinChild += cxDiff; - ::SendMessage(GetParent(), RB_SETBANDINFO, i, (LPARAM)&rbi); - break; - } -#endif // (_WIN32_IE < 0x0400) - } - } - - if(bMaxOld != m_bChildMaximized || hIconOld != m_hIconChildMaximized) - { - // force size change and redraw everything - RECT rect = { 0 }; - GetWindowRect(&rect); - ::MapWindowPoints(NULL, GetParent(), (LPPOINT)&rect, 2); - SetRedraw(FALSE); - SetWindowPos(NULL, 0, 0, 1, 1, SWP_NOZORDER | SWP_NOMOVE); - SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE); - SetRedraw(TRUE); - RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW); - } - } - -// Implementation - void GetSystemSettings() - { -#ifdef _CMDBAR_EXTRA_TRACE - ATLTRACE2(atlTraceUI, 0, _T("MDI CmdBar - GetSystemSettings\n")); -#endif - _baseClass::GetSystemSettings(); - - NONCLIENTMETRICS info = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; - BOOL bRet = ::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(info), &info, 0); - ATLASSERT(bRet); - if(bRet) - { - m_cxIconWidth = ::GetSystemMetrics(SM_CXSMICON); - m_cyIconHeight = ::GetSystemMetrics(SM_CYSMICON); - m_cxLeft = m_cxIconWidth; - -#ifndef _WTL_NO_AUTO_THEME - if(m_hTheme != NULL) - { - m_cxBtnWidth = info.iCaptionWidth - 2 * m_cxyOffset; - m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset; - m_cxRight = 3 * m_cxBtnWidth; - } - else -#endif // !_WTL_NO_AUTO_THEME - { - m_cxBtnWidth = info.iCaptionWidth - m_cxyOffset; - m_cyBtnHeight = info.iCaptionHeight - 2 * m_cxyOffset; - m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset; - } - } - - RECT rect = { 0 }; - GetClientRect(&rect); - T* pT = static_cast(this); - pT->_AdjustBtnSize(rect.bottom); - } - - void _AdjustBtnSize(int cyHeight) - { - if(cyHeight > 1 && m_cyBtnHeight > cyHeight) - { -#ifndef _WTL_NO_AUTO_THEME - if(m_hTheme != NULL) - { - m_cyBtnHeight = cyHeight; - m_cxBtnWidth = cyHeight; - m_cxRight = 3 * m_cxBtnWidth; - } - else -#endif // !_WTL_NO_AUTO_THEME - { - m_cyBtnHeight = cyHeight; - m_cxBtnWidth = cyHeight + m_cxyOffset; - m_cxRight = 3 * m_cxBtnWidth + m_cxyOffset; - } - } - } - - void _CalcIconRect(int cxWidth, int cyHeight, RECT& rect, bool bInvertX = false) const - { - int xStart = (m_cxLeft - m_cxIconWidth) / 2; - if(xStart < 0) - xStart = 0; - int yStart = (cyHeight - m_cyIconHeight) / 2; - if(yStart < 0) - yStart = 0; - - if(bInvertX) - ::SetRect(&rect, cxWidth - (xStart + m_cxBtnWidth), yStart, cxWidth - xStart, yStart + m_cyBtnHeight); - else - ::SetRect(&rect, xStart, yStart, xStart + m_cxBtnWidth, yStart + m_cyBtnHeight); - } - - void _CalcBtnRects(int cxWidth, int cyHeight, RECT arrRect[3], bool bInvertX = false) const - { - int yStart = (cyHeight - m_cyBtnHeight) / 2; - if(yStart < 0) - yStart = 0; - - RECT rcBtn = { cxWidth - m_cxBtnWidth, yStart, cxWidth, yStart + m_cyBtnHeight }; - int nDirection = -1; - if(bInvertX) - { - ::SetRect(&rcBtn, 0, yStart, m_cxBtnWidth, yStart + m_cyBtnHeight); - nDirection = 1; - } - - arrRect[0] = rcBtn; -#ifndef _WTL_NO_AUTO_THEME - if(m_hTheme != NULL) - ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0); - else -#endif // !_WTL_NO_AUTO_THEME - ::OffsetRect(&rcBtn, nDirection * (m_cxBtnWidth + m_cxyOffset), 0); - arrRect[1] = rcBtn; - ::OffsetRect(&rcBtn, nDirection * m_cxBtnWidth, 0); - arrRect[2] = rcBtn; - } - - void _DrawMDIButton(CWindowDC& dc, LPRECT pRects, int nBtn) - { -#ifndef _WTL_NO_AUTO_THEME - if(m_hTheme != NULL) - { -#ifndef TMSCHEMA_H - const int WP_MDICLOSEBUTTON = 20; - const int CBS_NORMAL = 1; - const int CBS_PUSHED = 3; - const int CBS_DISABLED = 4; - const int WP_MDIRESTOREBUTTON = 22; - const int RBS_NORMAL = 1; - const int RBS_PUSHED = 3; - const int RBS_DISABLED = 4; - const int WP_MDIMINBUTTON = 16; - const int MINBS_NORMAL = 1; - const int MINBS_PUSHED = 3; - const int MINBS_DISABLED = 4; -#endif // TMSCHEMA_H - if(nBtn == -1 || nBtn == 0) - m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDICLOSEBUTTON, m_bParentActive ? ((m_nBtnPressed == 0) ? CBS_PUSHED : CBS_NORMAL) : CBS_DISABLED, &pRects[0], NULL); - if(nBtn == -1 || nBtn == 1) - m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIRESTOREBUTTON, m_bParentActive ? ((m_nBtnPressed == 1) ? RBS_PUSHED : RBS_NORMAL) : RBS_DISABLED, &pRects[1], NULL); - if(nBtn == -1 || nBtn == 2) - m_pfnDrawThemeBackground(m_hTheme, dc, WP_MDIMINBUTTON, m_bParentActive ? ((m_nBtnPressed == 2) ? MINBS_PUSHED : MINBS_NORMAL) : MINBS_DISABLED, &pRects[2], NULL); - } - else -#endif // !_WTL_NO_AUTO_THEME - { - if(nBtn == -1 || nBtn == 0) - dc.DrawFrameControl(&pRects[0], DFC_CAPTION, DFCS_CAPTIONCLOSE | ((m_nBtnPressed == 0) ? DFCS_PUSHED : 0)); - if(nBtn == -1 || nBtn == 1) - dc.DrawFrameControl(&pRects[1], DFC_CAPTION, DFCS_CAPTIONRESTORE | ((m_nBtnPressed == 1) ? DFCS_PUSHED : 0)); - if(nBtn == -1 || nBtn == 2) - dc.DrawFrameControl(&pRects[2], DFC_CAPTION, DFCS_CAPTIONMIN | ((m_nBtnPressed == 2) ? DFCS_PUSHED : 0)); - } - } - -#ifndef _WTL_NO_AUTO_THEME - static UINT _GetThemeChangedMsg() - { -#ifndef WM_THEMECHANGED - static const UINT WM_THEMECHANGED = 0x031A; -#endif // !WM_THEMECHANGED - return WM_THEMECHANGED; - } - - void _OpenThemeData() - { - ATLASSERT(m_hThemeDLL != NULL); - - PFN_OpenThemeData pfnOpenThemeData = (PFN_OpenThemeData)::GetProcAddress(m_hThemeDLL, "OpenThemeData"); - ATLASSERT(pfnOpenThemeData != NULL); - if(pfnOpenThemeData != NULL) - m_hTheme = pfnOpenThemeData(m_hWnd, L"Window"); - } - - void _CloseThemeData() - { - ATLASSERT(m_hThemeDLL != NULL); - - if(m_hTheme == NULL) - return; // nothing to do - - PFN_CloseThemeData pfnCloseThemeData = (PFN_CloseThemeData)::GetProcAddress(m_hThemeDLL, "CloseThemeData"); - ATLASSERT(pfnCloseThemeData != NULL); - if(pfnCloseThemeData != NULL) - { - pfnCloseThemeData(m_hTheme); - m_hTheme = NULL; - } - } -#endif // !_WTL_NO_AUTO_THEME - - bool _DebugCheckChild() - { -#ifdef _DEBUG - BOOL bMaximized = FALSE; - HWND hWndChild = (HWND)::SendMessage(m_wndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized); - return (bMaximized && hWndChild == m_hWndChildMaximized); -#else // !_DEBUG - return true; -#endif // !_DEBUG - } -}; - -class CMDICommandBarCtrl : public CMDICommandBarCtrlImpl -{ -public: - DECLARE_WND_SUPERCLASS(_T("WTL_MDICommandBar"), GetWndClassName()) -}; - -}; // namespace WTL - -#endif // __ATLCTRLW_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlctrlx.h b/plugins/SmartAutoReplier/wtl/atlctrlx.h deleted file mode 100644 index 65d8f934a5..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlctrlx.h +++ /dev/null @@ -1,5004 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLCTRLX_H__ -#define __ATLCTRLX_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlctrlx.h requires atlapp.h to be included first -#endif - -#ifndef __ATLCTRLS_H__ - #error atlctrlx.h requires atlctrls.h to be included first -#endif - -#ifndef WM_UPDATEUISTATE - #define WM_UPDATEUISTATE 0x0128 -#endif // !WM_UPDATEUISTATE - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CBitmapButtonImpl -// CBitmapButton -// CCheckListViewCtrlImpl -// CCheckListViewCtrl -// CHyperLinkImpl -// CHyperLink -// CWaitCursor -// CCustomWaitCursor -// CMultiPaneStatusBarCtrlImpl -// CMultiPaneStatusBarCtrl -// CPaneContainerImpl -// CPaneContainer -// CSortListViewImpl -// CSortListViewCtrlImpl -// CSortListViewCtrl -// CTabViewImpl -// CTabView - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CBitmapButton - bitmap button implementation - -#ifndef _WIN32_WCE - -// bitmap button extended styles -#define BMPBTN_HOVER 0x00000001 -#define BMPBTN_AUTO3D_SINGLE 0x00000002 -#define BMPBTN_AUTO3D_DOUBLE 0x00000004 -#define BMPBTN_AUTOSIZE 0x00000008 -#define BMPBTN_SHAREIMAGELISTS 0x00000010 -#define BMPBTN_AUTOFIRE 0x00000020 - -template -class ATL_NO_VTABLE CBitmapButtonImpl : public ATL::CWindowImpl< T, TBase, TWinTraits> -{ -public: - DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) - - enum - { - _nImageNormal = 0, - _nImagePushed, - _nImageFocusOrHover, - _nImageDisabled, - - _nImageCount = 4, - }; - - enum - { - ID_TIMER_FIRST = 1000, - ID_TIMER_REPEAT = 1001 - }; - - // Bitmap button specific extended styles - DWORD m_dwExtendedStyle; - - CImageList m_ImageList; - int m_nImage[_nImageCount]; - - CToolTipCtrl m_tip; - LPTSTR m_lpstrToolTipText; - - // Internal states - unsigned m_fMouseOver:1; - unsigned m_fFocus:1; - unsigned m_fPressed:1; - - -// Constructor/Destructor - CBitmapButtonImpl(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE, HIMAGELIST hImageList = NULL) : - m_ImageList(hImageList), m_dwExtendedStyle(dwExtendedStyle), - m_lpstrToolTipText(NULL), - m_fMouseOver(0), m_fFocus(0), m_fPressed(0) - { - m_nImage[_nImageNormal] = -1; - m_nImage[_nImagePushed] = -1; - m_nImage[_nImageFocusOrHover] = -1; - m_nImage[_nImageDisabled] = -1; - } - - ~CBitmapButtonImpl() - { - if((m_dwExtendedStyle & BMPBTN_SHAREIMAGELISTS) == 0) - m_ImageList.Destroy(); - delete [] m_lpstrToolTipText; - } - - // overridden to provide proper initialization - BOOL SubclassWindow(HWND hWnd) - { -#if (_MSC_VER >= 1300) - BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd); -#else // !(_MSC_VER >= 1300) - typedef ATL::CWindowImpl< T, TBase, TWinTraits> _baseClass; - BOOL bRet = _baseClass::SubclassWindow(hWnd); -#endif // !(_MSC_VER >= 1300) - if(bRet) - Init(); - return bRet; - } - -// Attributes - DWORD GetBitmapButtonExtendedStyle() const - { - return m_dwExtendedStyle; - } - - DWORD SetBitmapButtonExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwExtendedStyle; - if(dwMask == 0) - m_dwExtendedStyle = dwExtendedStyle; - else - m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); - return dwPrevStyle; - } - - HIMAGELIST GetImageList() const - { - return m_ImageList; - } - - HIMAGELIST SetImageList(HIMAGELIST hImageList) - { - HIMAGELIST hImageListPrev = m_ImageList; - m_ImageList = hImageList; - if((m_dwExtendedStyle & BMPBTN_AUTOSIZE) != 0 && ::IsWindow(m_hWnd)) - SizeToImage(); - return hImageListPrev; - } - - int GetToolTipTextLength() const - { - return (m_lpstrToolTipText == NULL) ? -1 : lstrlen(m_lpstrToolTipText); - } - - bool GetToolTipText(LPTSTR lpstrText, int nLength) const - { - ATLASSERT(lpstrText != NULL); - if(m_lpstrToolTipText == NULL) - return false; - - errno_t nRet = SecureHelper::strncpy_x(lpstrText, nLength, m_lpstrToolTipText, _TRUNCATE); - - return (nRet == 0 || nRet == STRUNCATE); - } - - bool SetToolTipText(LPCTSTR lpstrText) - { - if(m_lpstrToolTipText != NULL) - { - delete [] m_lpstrToolTipText; - m_lpstrToolTipText = NULL; - } - - if(lpstrText == NULL) - { - if(m_tip.IsWindow()) - m_tip.Activate(FALSE); - return true; - } - - int cchLen = lstrlen(lpstrText) + 1; - ATLTRY(m_lpstrToolTipText = new TCHAR[cchLen]); - if(m_lpstrToolTipText == NULL) - return false; - - SecureHelper::strcpy_x(m_lpstrToolTipText, cchLen, lpstrText); - if(m_tip.IsWindow()) - { - m_tip.Activate(TRUE); - m_tip.AddTool(m_hWnd, m_lpstrToolTipText); - } - - return true; - } - -// Operations - void SetImages(int nNormal, int nPushed = -1, int nFocusOrHover = -1, int nDisabled = -1) - { - if(nNormal != -1) - m_nImage[_nImageNormal] = nNormal; - if(nPushed != -1) - m_nImage[_nImagePushed] = nPushed; - if(nFocusOrHover != -1) - m_nImage[_nImageFocusOrHover] = nFocusOrHover; - if(nDisabled != -1) - m_nImage[_nImageDisabled] = nDisabled; - } - - BOOL SizeToImage() - { - ATLASSERT(::IsWindow(m_hWnd) && m_ImageList.m_hImageList != NULL); - int cx = 0; - int cy = 0; - if(!m_ImageList.GetIconSize(cx, cy)) - return FALSE; - return ResizeClient(cx, cy); - } - -// Overrideables - void DoPaint(CDCHandle dc) - { - ATLASSERT(m_ImageList.m_hImageList != NULL); // image list must be set - ATLASSERT(m_nImage[0] != -1); // main bitmap must be set - - // set bitmap according to the current button state - int nImage = -1; - bool bHover = IsHoverMode(); - if(!IsWindowEnabled()) - nImage = m_nImage[_nImageDisabled]; - else if(m_fPressed == 1) - nImage = m_nImage[_nImagePushed]; - else if((!bHover && m_fFocus == 1) || (bHover && m_fMouseOver == 1)) - nImage = m_nImage[_nImageFocusOrHover]; - if(nImage == -1) // not there, use default one - nImage = m_nImage[_nImageNormal]; - - // draw the button image - int xyPos = 0; - if((m_fPressed == 1) && ((m_dwExtendedStyle & (BMPBTN_AUTO3D_SINGLE | BMPBTN_AUTO3D_DOUBLE)) != 0) && (m_nImage[_nImagePushed] == -1)) - xyPos = 1; - m_ImageList.Draw(dc, nImage, xyPos, xyPos, ILD_NORMAL); - - // draw 3D border if required - if((m_dwExtendedStyle & (BMPBTN_AUTO3D_SINGLE | BMPBTN_AUTO3D_DOUBLE)) != 0) - { - RECT rect; - GetClientRect(&rect); - - if(m_fPressed == 1) - dc.DrawEdge(&rect, ((m_dwExtendedStyle & BMPBTN_AUTO3D_SINGLE) != 0) ? BDR_SUNKENOUTER : EDGE_SUNKEN, BF_RECT); - else if(!bHover || m_fMouseOver == 1) - dc.DrawEdge(&rect, ((m_dwExtendedStyle & BMPBTN_AUTO3D_SINGLE) != 0) ? BDR_RAISEDINNER : EDGE_RAISED, BF_RECT); - - if(!bHover && m_fFocus == 1) - { - ::InflateRect(&rect, -2 * ::GetSystemMetrics(SM_CXEDGE), -2 * ::GetSystemMetrics(SM_CYEDGE)); - dc.DrawFocusRect(&rect); - } - } - } - -// Message map and handlers - BEGIN_MSG_MAP(CBitmapButtonImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_PAINT, OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) - MESSAGE_HANDLER(WM_SETFOCUS, OnFocus) - MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus) - MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) - MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDblClk) - MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) - MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) - MESSAGE_HANDLER(WM_ENABLE, OnEnable) - MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) - MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave) - MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) - MESSAGE_HANDLER(WM_KEYUP, OnKeyUp) - MESSAGE_HANDLER(WM_TIMER, OnTimer) - MESSAGE_HANDLER(WM_UPDATEUISTATE, OnUpdateUiState) - END_MSG_MAP() - - LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - Init(); - bHandled = FALSE; - return 1; - } - - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_tip.IsWindow()) - { - m_tip.DestroyWindow(); - m_tip.m_hWnd = NULL; - } - bHandled = FALSE; - return 1; - } - - LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - MSG msg = { m_hWnd, uMsg, wParam, lParam }; - if(m_tip.IsWindow()) - m_tip.RelayEvent(&msg); - bHandled = FALSE; - return 1; - } - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; // no background needed - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - if(wParam != NULL) - { - pT->DoPaint((HDC)wParam); - } - else - { - CPaintDC dc(m_hWnd); - pT->DoPaint(dc.m_hDC); - } - return 0; - } - - LRESULT OnFocus(UINT uMsg, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - m_fFocus = (uMsg == WM_SETFOCUS) ? 1 : 0; - Invalidate(); - UpdateWindow(); - bHandled = FALSE; - return 1; - } - - LRESULT OnLButtonDown(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = 0; - if(IsHoverMode()) - SetCapture(); - else - lRet = DefWindowProc(uMsg, wParam, lParam); - if(::GetCapture() == m_hWnd) - { - m_fPressed = 1; - Invalidate(); - UpdateWindow(); - } - if((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0) - { - int nElapse = 250; - int nDelay = 0; - if(::SystemParametersInfo(SPI_GETKEYBOARDDELAY, 0, &nDelay, 0)) - nElapse += nDelay * 250; // all milli-seconds - SetTimer(ID_TIMER_FIRST, nElapse); - } - return lRet; - } - - LRESULT OnLButtonDblClk(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = 0; - if(!IsHoverMode()) - lRet = DefWindowProc(uMsg, wParam, lParam); - if(::GetCapture() != m_hWnd) - SetCapture(); - if(m_fPressed == 0) - { - m_fPressed = 1; - Invalidate(); - UpdateWindow(); - } - return lRet; - } - - LRESULT OnLButtonUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = 0; - bool bHover = IsHoverMode(); - if(!bHover) - lRet = DefWindowProc(uMsg, wParam, lParam); - if(::GetCapture() == m_hWnd) - { - if(bHover && m_fPressed == 1) - ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); - ::ReleaseCapture(); - } - return lRet; - } - - LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_fPressed == 1) - { - m_fPressed = 0; - Invalidate(); - UpdateWindow(); - } - bHandled = FALSE; - return 1; - } - - LRESULT OnEnable(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - Invalidate(); - UpdateWindow(); - bHandled = FALSE; - return 1; - } - - LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(::GetCapture() == m_hWnd) - { - POINT ptCursor = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - ClientToScreen(&ptCursor); - RECT rect = { 0 }; - GetWindowRect(&rect); - unsigned int uPressed = ::PtInRect(&rect, ptCursor) ? 1 : 0; - if(m_fPressed != uPressed) - { - m_fPressed = uPressed; - Invalidate(); - UpdateWindow(); - } - } - else if(IsHoverMode() && m_fMouseOver == 0) - { - m_fMouseOver = 1; - Invalidate(); - UpdateWindow(); - StartTrackMouseLeave(); - } - bHandled = FALSE; - return 1; - } - - LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(m_fMouseOver == 1) - { - m_fMouseOver = 0; - Invalidate(); - UpdateWindow(); - } - return 0; - } - - LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(wParam == VK_SPACE && IsHoverMode()) - return 0; // ignore if in hover mode - if(wParam == VK_SPACE && m_fPressed == 0) - { - m_fPressed = 1; - Invalidate(); - UpdateWindow(); - } - bHandled = FALSE; - return 1; - } - - LRESULT OnKeyUp(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(wParam == VK_SPACE && IsHoverMode()) - return 0; // ignore if in hover mode - if(wParam == VK_SPACE && m_fPressed == 1) - { - m_fPressed = 0; - Invalidate(); - UpdateWindow(); - } - bHandled = FALSE; - return 1; - } - - LRESULT OnTimer(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - ATLASSERT((m_dwExtendedStyle & BMPBTN_AUTOFIRE) != 0); - switch(wParam) // timer ID - { - case ID_TIMER_FIRST: - KillTimer(ID_TIMER_FIRST); - if(m_fPressed == 1) - { - ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); - int nElapse = 250; - int nRepeat = 40; - if(::SystemParametersInfo(SPI_GETKEYBOARDSPEED, 0, &nRepeat, 0)) - nElapse = 10000 / (10 * nRepeat + 25); // milli-seconds, approximated - SetTimer(ID_TIMER_REPEAT, nElapse); - } - break; - case ID_TIMER_REPEAT: - if(m_fPressed == 1) - ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); - else if(::GetCapture() != m_hWnd) - KillTimer(ID_TIMER_REPEAT); - break; - default: // not our timer - break; - } - return 0; - } - - LRESULT OnUpdateUiState(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - // If the control is subclassed or superclassed, this message can cause - // repainting without WM_PAINT. We don't use this state, so just do nothing. - return 0; - } - -// Implementation - void Init() - { - // We need this style to prevent Windows from painting the button - ModifyStyle(0, BS_OWNERDRAW); - - // create a tool tip - m_tip.Create(m_hWnd); - ATLASSERT(m_tip.IsWindow()); - if(m_tip.IsWindow() && m_lpstrToolTipText != NULL) - { - m_tip.Activate(TRUE); - m_tip.AddTool(m_hWnd, m_lpstrToolTipText); - } - - if(m_ImageList.m_hImageList != NULL && (m_dwExtendedStyle & BMPBTN_AUTOSIZE) != 0) - SizeToImage(); - } - - BOOL StartTrackMouseLeave() - { - TRACKMOUSEEVENT tme = { 0 }; - tme.cbSize = sizeof(tme); - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = m_hWnd; - return _TrackMouseEvent(&tme); - } - - bool IsHoverMode() const - { - return ((m_dwExtendedStyle & BMPBTN_HOVER) != 0); - } -}; - -class CBitmapButton : public CBitmapButtonImpl -{ -public: - DECLARE_WND_SUPERCLASS(_T("WTL_BitmapButton"), GetWndClassName()) - - CBitmapButton(DWORD dwExtendedStyle = BMPBTN_AUTOSIZE, HIMAGELIST hImageList = NULL) : - CBitmapButtonImpl(dwExtendedStyle, hImageList) - { } -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CCheckListCtrlView - list view control with check boxes - -template -class CCheckListViewCtrlImplTraits -{ -public: - static DWORD GetWndStyle(DWORD dwStyle) - { - return (dwStyle == 0) ? t_dwStyle : dwStyle; - } - - static DWORD GetWndExStyle(DWORD dwExStyle) - { - return (dwExStyle == 0) ? t_dwExStyle : dwExStyle; - } - - static DWORD GetExtendedLVStyle() - { - return t_dwExListViewStyle; - } -}; - -typedef CCheckListViewCtrlImplTraits CCheckListViewCtrlTraits; - -template -class ATL_NO_VTABLE CCheckListViewCtrlImpl : public ATL::CWindowImpl -{ -public: - DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) - -// Attributes - static DWORD GetExtendedLVStyle() - { - return TWinTraits::GetExtendedLVStyle(); - } - -// Operations - BOOL SubclassWindow(HWND hWnd) - { -#if (_MSC_VER >= 1300) - BOOL bRet = ATL::CWindowImplBaseT< TBase, TWinTraits>::SubclassWindow(hWnd); -#else // !(_MSC_VER >= 1300) - typedef ATL::CWindowImplBaseT< TBase, TWinTraits> _baseClass; - BOOL bRet = _baseClass::SubclassWindow(hWnd); -#endif // !(_MSC_VER >= 1300) - if(bRet) - { - T* pT = static_cast(this); - pT; - ATLASSERT((pT->GetExtendedLVStyle() & LVS_EX_CHECKBOXES) != 0); - SetExtendedListViewStyle(pT->GetExtendedLVStyle()); - } - return bRet; - } - - void CheckSelectedItems(int nCurrItem) - { - // first check if this item is selected - LVITEM lvi = { 0 }; - lvi.iItem = nCurrItem; - lvi.iSubItem = 0; - lvi.mask = LVIF_STATE; - lvi.stateMask = LVIS_SELECTED; - GetItem(&lvi); - // if item is not selected, don't do anything - if(!(lvi.state & LVIS_SELECTED)) - return; - // new check state will be reverse of the current state, - BOOL bCheck = !GetCheckState(nCurrItem); - int nItem = -1; - int nOldItem = -1; - while((nItem = GetNextItem(nOldItem, LVNI_SELECTED)) != -1) - { - if(nItem != nCurrItem) - SetCheckState(nItem, bCheck); - nOldItem = nItem; - } - } - -// Implementation - BEGIN_MSG_MAP(CCheckListViewCtrlImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) - MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDown) - MESSAGE_HANDLER(WM_KEYDOWN, OnKeyDown) - END_MSG_MAP() - - LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - // first let list view control initialize everything - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - T* pT = static_cast(this); - pT; - ATLASSERT((pT->GetExtendedLVStyle() & LVS_EX_CHECKBOXES) != 0); - SetExtendedListViewStyle(pT->GetExtendedLVStyle()); - return lRet; - } - - LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - POINT ptMsg = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - LVHITTESTINFO lvh = { 0 }; - lvh.pt = ptMsg; - if(HitTest(&lvh) != -1 && lvh.flags == LVHT_ONITEMSTATEICON && ::GetKeyState(VK_CONTROL) >= 0) - { - T* pT = static_cast(this); - pT->CheckSelectedItems(lvh.iItem); - } - bHandled = FALSE; - return 1; - } - - LRESULT OnKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(wParam == VK_SPACE) - { - int nCurrItem = GetNextItem(-1, LVNI_FOCUSED); - if(nCurrItem != -1 && ::GetKeyState(VK_CONTROL) >= 0) - { - T* pT = static_cast(this); - pT->CheckSelectedItems(nCurrItem); - } - } - bHandled = FALSE; - return 1; - } -}; - -class CCheckListViewCtrl : public CCheckListViewCtrlImpl -{ -public: - DECLARE_WND_SUPERCLASS(_T("WTL_CheckListView"), GetWndClassName()) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CHyperLink - hyper link control implementation - -#if (WINVER < 0x0500) && !defined(_WIN32_WCE) -__declspec(selectany) struct -{ - enum { cxWidth = 32, cyHeight = 32 }; - int xHotSpot; - int yHotSpot; - unsigned char arrANDPlane[cxWidth * cyHeight / 8]; - unsigned char arrXORPlane[cxWidth * cyHeight / 8]; -} _AtlHyperLink_CursorData = -{ - 5, 0, - { - 0xF9, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, - 0xF0, 0xFF, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xF0, 0x01, 0xFF, 0xFF, - 0xF0, 0x00, 0xFF, 0xFF, 0x10, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, - 0x80, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xC0, 0x00, 0x7F, 0xFF, 0xE0, 0x00, 0x7F, 0xFF, - 0xE0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xF0, 0x00, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, - 0xF8, 0x01, 0xFF, 0xFF, 0xF8, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF - }, - { - 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, - 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0xC0, 0x00, 0x00, 0x06, 0xD8, 0x00, 0x00, - 0x06, 0xDA, 0x00, 0x00, 0x06, 0xDB, 0x00, 0x00, 0x67, 0xFB, 0x00, 0x00, 0x77, 0xFF, 0x00, 0x00, - 0x37, 0xFF, 0x00, 0x00, 0x17, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x0F, 0xFF, 0x00, 0x00, - 0x0F, 0xFE, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x07, 0xFE, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x00, - 0x03, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 - } -}; -#endif // (WINVER < 0x0500) && !defined(_WIN32_WCE) - -#define HLINK_UNDERLINED 0x00000000 -#define HLINK_NOTUNDERLINED 0x00000001 -#define HLINK_UNDERLINEHOVER 0x00000002 -#define HLINK_COMMANDBUTTON 0x00000004 -#define HLINK_NOTIFYBUTTON 0x0000000C -#define HLINK_USETAGS 0x00000010 -#define HLINK_USETAGSBOLD 0x00000030 -#define HLINK_NOTOOLTIP 0x00000040 -#define HLINK_AUTOCREATELINKFONT 0x00000080 -#define HLINK_SINGLELINE 0x00000100 - -// Notes: -// - HLINK_USETAGS and HLINK_USETAGSBOLD are always left-aligned -// - When HLINK_USETAGSBOLD is used, the underlined styles will be ignored - -template -class ATL_NO_VTABLE CHyperLinkImpl : public ATL::CWindowImpl< T, TBase, TWinTraits > -{ -public: - LPTSTR m_lpstrLabel; - LPTSTR m_lpstrHyperLink; - - HCURSOR m_hCursor; - HFONT m_hFontLink; - HFONT m_hFontNormal; - - RECT m_rcLink; -#ifndef _WIN32_WCE - CToolTipCtrl m_tip; -#endif // !_WIN32_WCE - - COLORREF m_clrLink; - COLORREF m_clrVisited; - - DWORD m_dwExtendedStyle; // Hyper Link specific extended styles - - bool m_bPaintLabel:1; - bool m_bVisited:1; - bool m_bHover:1; - bool m_bInternalLinkFont:1; - bool m_bInternalNormalFont:1; - - -// Constructor/Destructor - CHyperLinkImpl(DWORD dwExtendedStyle = HLINK_UNDERLINED) : - m_lpstrLabel(NULL), m_lpstrHyperLink(NULL), - m_hCursor(NULL), m_hFontLink(NULL), m_hFontNormal(NULL), - m_clrLink(RGB(0, 0, 255)), m_clrVisited(RGB(128, 0, 128)), - m_dwExtendedStyle(dwExtendedStyle), - m_bPaintLabel(true), m_bVisited(false), - m_bHover(false), m_bInternalLinkFont(false), m_bInternalNormalFont(false) - { - ::SetRectEmpty(&m_rcLink); - } - - ~CHyperLinkImpl() - { - delete [] m_lpstrLabel; - delete [] m_lpstrHyperLink; -#if (WINVER < 0x0500) && !defined(_WIN32_WCE) - // It was created, not loaded, so we have to destroy it - if(m_hCursor != NULL) - ::DestroyCursor(m_hCursor); -#endif // (WINVER < 0x0500) && !defined(_WIN32_WCE) - } - -// Attributes - DWORD GetHyperLinkExtendedStyle() const - { - return m_dwExtendedStyle; - } - - DWORD SetHyperLinkExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwExtendedStyle; - if(dwMask == 0) - m_dwExtendedStyle = dwExtendedStyle; - else - m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); - return dwPrevStyle; - } - - bool GetLabel(LPTSTR lpstrBuffer, int nLength) const - { - if(m_lpstrLabel == NULL) - return false; - ATLASSERT(lpstrBuffer != NULL); - if(nLength <= lstrlen(m_lpstrLabel)) - return false; - - SecureHelper::strcpy_x(lpstrBuffer, nLength, m_lpstrLabel); - - return true; - } - - bool SetLabel(LPCTSTR lpstrLabel) - { - delete [] m_lpstrLabel; - m_lpstrLabel = NULL; - int cchLen = lstrlen(lpstrLabel) + 1; - ATLTRY(m_lpstrLabel = new TCHAR[cchLen]); - if(m_lpstrLabel == NULL) - return false; - - SecureHelper::strcpy_x(m_lpstrLabel, cchLen, lpstrLabel); - T* pT = static_cast(this); - pT->CalcLabelRect(); - - if(m_hWnd != NULL) - SetWindowText(lpstrLabel); // Set this for accessibility - - return true; - } - - bool GetHyperLink(LPTSTR lpstrBuffer, int nLength) const - { - if(m_lpstrHyperLink == NULL) - return false; - ATLASSERT(lpstrBuffer != NULL); - if(nLength <= lstrlen(m_lpstrHyperLink)) - return false; - - SecureHelper::strcpy_x(lpstrBuffer, nLength, m_lpstrHyperLink); - - return true; - } - - bool SetHyperLink(LPCTSTR lpstrLink) - { - delete [] m_lpstrHyperLink; - m_lpstrHyperLink = NULL; - int cchLen = lstrlen(lpstrLink) + 1; - ATLTRY(m_lpstrHyperLink = new TCHAR[cchLen]); - if(m_lpstrHyperLink == NULL) - return false; - - SecureHelper::strcpy_x(m_lpstrHyperLink, cchLen, lpstrLink); - if(m_lpstrLabel == NULL) - { - T* pT = static_cast(this); - pT->CalcLabelRect(); - } -#ifndef _WIN32_WCE - if(m_tip.IsWindow()) - { - m_tip.Activate(TRUE); - m_tip.AddTool(m_hWnd, m_lpstrHyperLink, &m_rcLink, 1); - } -#endif // !_WIN32_WCE - return true; - } - - HFONT GetLinkFont() const - { - return m_hFontLink; - } - - void SetLinkFont(HFONT hFont) - { - if(m_bInternalLinkFont) - { - ::DeleteObject(m_hFontLink); - m_bInternalLinkFont = false; - } - - m_hFontLink = hFont; - - T* pT = static_cast(this); - pT->CalcLabelRect(); - } - - int GetIdealHeight() const - { - ATLASSERT(::IsWindow(m_hWnd)); - if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL) - return -1; - if(!m_bPaintLabel) - return -1; - - UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK; - - CClientDC dc(m_hWnd); - RECT rect = { 0 }; - GetClientRect(&rect); - HFONT hFontOld = dc.SelectFont(m_hFontNormal); - RECT rcText = rect; - dc.DrawText(_T("NS"), -1, &rcText, DT_LEFT | uFormat | DT_CALCRECT); - dc.SelectFont(m_hFontLink); - RECT rcLink = rect; - dc.DrawText(_T("NS"), -1, &rcLink, DT_LEFT | uFormat | DT_CALCRECT); - dc.SelectFont(hFontOld); - return max(rcText.bottom - rcText.top, rcLink.bottom - rcLink.top); - } - - bool GetIdealSize(SIZE& size) const - { - int cx = 0, cy = 0; - bool bRet = GetIdealSize(cx, cy); - if(bRet) - { - size.cx = cx; - size.cy = cy; - } - return bRet; - } - - bool GetIdealSize(int& cx, int& cy) const - { - ATLASSERT(::IsWindow(m_hWnd)); - if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL) - return false; - if(!m_bPaintLabel) - return false; - - CClientDC dc(m_hWnd); - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - RECT rcAll = rcClient; - - if(IsUsingTags()) - { - // find tags and label parts - LPTSTR lpstrLeft = NULL; - int cchLeft = 0; - LPTSTR lpstrLink = NULL; - int cchLink = 0; - LPTSTR lpstrRight = NULL; - int cchRight = 0; - - const T* pT = static_cast(this); - pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight); - - // get label part rects - UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK; - - HFONT hFontOld = dc.SelectFont(m_hFontNormal); - RECT rcLeft = rcClient; - dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | uFormat | DT_CALCRECT); - - dc.SelectFont(m_hFontLink); - RECT rcLink = { rcLeft.right, rcLeft.top, rcClient.right, rcClient.bottom }; - dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | uFormat | DT_CALCRECT); - - dc.SelectFont(m_hFontNormal); - RECT rcRight = { rcLink.right, rcLink.top, rcClient.right, rcClient.bottom }; - dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | uFormat | DT_CALCRECT); - - dc.SelectFont(hFontOld); - - int cyMax = max(rcLeft.bottom, max(rcLink.bottom, rcRight.bottom)); - ::SetRect(&rcAll, rcLeft.left, rcLeft.top, rcRight.right, cyMax); - } - else - { - HFONT hOldFont = NULL; - if(m_hFontLink != NULL) - hOldFont = dc.SelectFont(m_hFontLink); - LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; - DWORD dwStyle = GetStyle(); - UINT uFormat = DT_LEFT; - if (dwStyle & SS_CENTER) - uFormat = DT_CENTER; - else if (dwStyle & SS_RIGHT) - uFormat = DT_RIGHT; - uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK; - dc.DrawText(lpstrText, -1, &rcAll, uFormat | DT_CALCRECT); - if(m_hFontLink != NULL) - dc.SelectFont(hOldFont); - if (dwStyle & SS_CENTER) - { - int dx = (rcClient.right - rcAll.right) / 2; - ::OffsetRect(&rcAll, dx, 0); - } - else if (dwStyle & SS_RIGHT) - { - int dx = rcClient.right - rcAll.right; - ::OffsetRect(&rcAll, dx, 0); - } - } - - cx = rcAll.right - rcAll.left; - cy = rcAll.bottom - rcAll.top; - - return true; - } - - // for command buttons only - bool GetToolTipText(LPTSTR lpstrBuffer, int nLength) const - { - ATLASSERT(IsCommandButton()); - return GetHyperLink(lpstrBuffer, nLength); - } - - bool SetToolTipText(LPCTSTR lpstrToolTipText) - { - ATLASSERT(IsCommandButton()); - return SetHyperLink(lpstrToolTipText); - } - -// Operations - BOOL SubclassWindow(HWND hWnd) - { - ATLASSERT(m_hWnd == NULL); - ATLASSERT(::IsWindow(hWnd)); - if(m_hFontNormal == NULL) - m_hFontNormal = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L); -#if (_MSC_VER >= 1300) - BOOL bRet = ATL::CWindowImpl< T, TBase, TWinTraits>::SubclassWindow(hWnd); -#else // !(_MSC_VER >= 1300) - typedef ATL::CWindowImpl< T, TBase, TWinTraits> _baseClass; - BOOL bRet = _baseClass::SubclassWindow(hWnd); -#endif // !(_MSC_VER >= 1300) - if(bRet) - { - T* pT = static_cast(this); - pT->Init(); - } - return bRet; - } - - bool Navigate() - { - ATLASSERT(::IsWindow(m_hWnd)); - bool bRet = true; - if(IsNotifyButton()) - { - NMHDR nmhdr = { m_hWnd, GetDlgCtrlID(), NM_CLICK }; - ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr); - } - else if(IsCommandButton()) - { - ::SendMessage(GetParent(), WM_COMMAND, MAKEWPARAM(GetDlgCtrlID(), BN_CLICKED), (LPARAM)m_hWnd); - } - else - { - ATLASSERT(m_lpstrHyperLink != NULL); -#ifndef _WIN32_WCE - DWORD_PTR dwRet = (DWORD_PTR)::ShellExecute(0, _T("open"), m_lpstrHyperLink, 0, 0, SW_SHOWNORMAL); - bRet = (dwRet > 32); -#else // CE specific - SHELLEXECUTEINFO shExeInfo = { sizeof(SHELLEXECUTEINFO), 0, 0, L"open", m_lpstrHyperLink, 0, 0, SW_SHOWNORMAL, 0, 0, 0, 0, 0, 0, 0 }; - ::ShellExecuteEx(&shExeInfo); - DWORD_PTR dwRet = (DWORD_PTR)shExeInfo.hInstApp; - bRet = (dwRet == 0) || (dwRet > 32); -#endif // _WIN32_WCE - ATLASSERT(bRet); - if(bRet) - { - m_bVisited = true; - Invalidate(); - } - } - return bRet; - } - - void CreateLinkFontFromNormal() - { - if(m_bInternalLinkFont) - { - ::DeleteObject(m_hFontLink); - m_bInternalLinkFont = false; - } - - CFontHandle font = (m_hFontNormal != NULL) ? m_hFontNormal : (HFONT)::GetStockObject(SYSTEM_FONT); - LOGFONT lf = { 0 }; - font.GetLogFont(&lf); - - if(IsUsingTagsBold()) - lf.lfWeight = FW_BOLD; - else if(!IsNotUnderlined()) - lf.lfUnderline = TRUE; - - m_hFontLink = ::CreateFontIndirect(&lf); - m_bInternalLinkFont = true; - ATLASSERT(m_hFontLink != NULL); - } - -// Message map and handlers - BEGIN_MSG_MAP(CHyperLinkImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_RANGE_HANDLER(WM_MOUSEFIRST, WM_MOUSELAST, OnMouseMessage) -#endif // !_WIN32_WCE - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_PAINT, OnPaint) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) -#endif // !_WIN32_WCE - MESSAGE_HANDLER(WM_SETFOCUS, OnFocus) - MESSAGE_HANDLER(WM_KILLFOCUS, OnFocus) - MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_MOUSELEAVE, OnMouseLeave) -#endif // !_WIN32_WCE - MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) - MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) - MESSAGE_HANDLER(WM_CHAR, OnChar) - MESSAGE_HANDLER(WM_GETDLGCODE, OnGetDlgCode) - MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) - MESSAGE_HANDLER(WM_ENABLE, OnEnable) - MESSAGE_HANDLER(WM_GETFONT, OnGetFont) - MESSAGE_HANDLER(WM_SETFONT, OnSetFont) - MESSAGE_HANDLER(WM_UPDATEUISTATE, OnUpdateUiState) - MESSAGE_HANDLER(WM_SIZE, OnSize) - END_MSG_MAP() - - LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->Init(); - return 0; - } - -#ifndef _WIN32_WCE - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_tip.IsWindow()) - { - m_tip.DestroyWindow(); - m_tip.m_hWnd = NULL; - } - - if(m_bInternalLinkFont) - { - ::DeleteObject(m_hFontLink); - m_hFontLink = NULL; - m_bInternalLinkFont = false; - } - - if(m_bInternalNormalFont) - { - ::DeleteObject(m_hFontNormal); - m_hFontNormal = NULL; - m_bInternalNormalFont = false; - } - - bHandled = FALSE; - return 1; - } - - LRESULT OnMouseMessage(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - MSG msg = { m_hWnd, uMsg, wParam, lParam }; - if(m_tip.IsWindow() && IsUsingToolTip()) - m_tip.RelayEvent(&msg); - bHandled = FALSE; - return 1; - } -#endif // !_WIN32_WCE - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; // no background painting needed (we do it all during WM_PAINT) - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(!m_bPaintLabel) - { - bHandled = FALSE; - return 1; - } - - T* pT = static_cast(this); - if(wParam != NULL) - { - pT->DoEraseBackground((HDC)wParam); - pT->DoPaint((HDC)wParam); - } - else - { - CPaintDC dc(m_hWnd); - pT->DoEraseBackground(dc.m_hDC); - pT->DoPaint(dc.m_hDC); - } - - return 0; - } - - LRESULT OnFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_bPaintLabel) - Invalidate(); - else - bHandled = FALSE; - return 0; - } - - LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - if((m_lpstrHyperLink != NULL || IsCommandButton()) && ::PtInRect(&m_rcLink, pt)) - { - ::SetCursor(m_hCursor); - if(IsUnderlineHover()) - { - if(!m_bHover) - { - m_bHover = true; - InvalidateRect(&m_rcLink); - UpdateWindow(); -#ifndef _WIN32_WCE - StartTrackMouseLeave(); -#endif // !_WIN32_WCE - } - } - } - else - { - if(IsUnderlineHover()) - { - if(m_bHover) - { - m_bHover = false; - InvalidateRect(&m_rcLink); - UpdateWindow(); - } - } - bHandled = FALSE; - } - return 0; - } - -#ifndef _WIN32_WCE - LRESULT OnMouseLeave(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(IsUnderlineHover() && m_bHover) - { - m_bHover = false; - InvalidateRect(&m_rcLink); - UpdateWindow(); - } - return 0; - } -#endif // !_WIN32_WCE - - LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - if(::PtInRect(&m_rcLink, pt)) - { - SetFocus(); - SetCapture(); - } - return 0; - } - - LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - if(GetCapture() == m_hWnd) - { - ReleaseCapture(); - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - if(::PtInRect(&m_rcLink, pt)) - { - T* pT = static_cast(this); - pT->Navigate(); - } - } - return 0; - } - - LRESULT OnChar(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(wParam == VK_RETURN || wParam == VK_SPACE) - { - T* pT = static_cast(this); - pT->Navigate(); - } - return 0; - } - - LRESULT OnGetDlgCode(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return DLGC_WANTCHARS; - } - - LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - POINT pt = { 0, 0 }; - GetCursorPos(&pt); - ScreenToClient(&pt); - if((m_lpstrHyperLink != NULL || IsCommandButton()) && ::PtInRect(&m_rcLink, pt)) - { - return TRUE; - } - bHandled = FALSE; - return FALSE; - } - - LRESULT OnEnable(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - Invalidate(); - UpdateWindow(); - return 0; - } - - LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return (LRESULT)m_hFontNormal; - } - - LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - if(m_bInternalNormalFont) - { - ::DeleteObject(m_hFontNormal); - m_bInternalNormalFont = false; - } - - bool bCreateLinkFont = m_bInternalLinkFont; - - m_hFontNormal = (HFONT)wParam; - - if(bCreateLinkFont || IsAutoCreateLinkFont()) - CreateLinkFontFromNormal(); - - T* pT = static_cast(this); - pT->CalcLabelRect(); - - if((BOOL)lParam) - { - Invalidate(); - UpdateWindow(); - } - - return 0; - } - - LRESULT OnUpdateUiState(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - // If the control is subclassed or superclassed, this message can cause - // repainting without WM_PAINT. We don't use this state, so just do nothing. - return 0; - } - - LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->CalcLabelRect(); - pT->Invalidate(); - return 0; - } - -// Implementation - void Init() - { - ATLASSERT(::IsWindow(m_hWnd)); - - // Check if we should paint a label - const int cchBuff = 8; - TCHAR szBuffer[cchBuff] = { 0 }; - if(::GetClassName(m_hWnd, szBuffer, cchBuff)) - { - if(lstrcmpi(szBuffer, _T("static")) == 0) - { - ModifyStyle(0, SS_NOTIFY); // we need this - DWORD dwStyle = GetStyle() & 0x000000FF; -#ifndef _WIN32_WCE - if(dwStyle == SS_ICON || dwStyle == SS_BLACKRECT || dwStyle == SS_GRAYRECT || - dwStyle == SS_WHITERECT || dwStyle == SS_BLACKFRAME || dwStyle == SS_GRAYFRAME || - dwStyle == SS_WHITEFRAME || dwStyle == SS_OWNERDRAW || - dwStyle == SS_BITMAP || dwStyle == SS_ENHMETAFILE) -#else // CE specific - if(dwStyle == SS_ICON || dwStyle == SS_BITMAP) -#endif // _WIN32_WCE - m_bPaintLabel = false; - } - } - - // create or load a cursor -#if (WINVER >= 0x0500) || defined(_WIN32_WCE) - m_hCursor = ::LoadCursor(NULL, IDC_HAND); -#else - m_hCursor = ::CreateCursor(ModuleHelper::GetModuleInstance(), _AtlHyperLink_CursorData.xHotSpot, _AtlHyperLink_CursorData.yHotSpot, _AtlHyperLink_CursorData.cxWidth, _AtlHyperLink_CursorData.cyHeight, _AtlHyperLink_CursorData.arrANDPlane, _AtlHyperLink_CursorData.arrXORPlane); -#endif - ATLASSERT(m_hCursor != NULL); - - // set fonts - if(m_bPaintLabel) - { - if(m_hFontNormal == NULL) - { - m_hFontNormal = AtlCreateControlFont(); - m_bInternalNormalFont = true; - } - - if(m_hFontLink == NULL) - CreateLinkFontFromNormal(); - } - -#ifndef _WIN32_WCE - // create a tool tip - m_tip.Create(m_hWnd); - ATLASSERT(m_tip.IsWindow()); -#endif // !_WIN32_WCE - - // set label (defaults to window text) - if(m_lpstrLabel == NULL) - { - int nLen = GetWindowTextLength(); - if(nLen > 0) - { - ATLTRY(m_lpstrLabel = new TCHAR[nLen + 1]); - if(m_lpstrLabel != NULL) - ATLVERIFY(GetWindowText(m_lpstrLabel, nLen + 1) > 0); - } - } - - T* pT = static_cast(this); - pT->CalcLabelRect(); - - // set hyperlink (defaults to label), or just activate tool tip if already set - if(m_lpstrHyperLink == NULL && !IsCommandButton()) - { - if(m_lpstrLabel != NULL) - SetHyperLink(m_lpstrLabel); - } -#ifndef _WIN32_WCE - else - { - m_tip.Activate(TRUE); - m_tip.AddTool(m_hWnd, m_lpstrHyperLink, &m_rcLink, 1); - } -#endif // !_WIN32_WCE - - // set link colors - if(m_bPaintLabel) - { - CRegKeyEx rk; - LONG lRet = rk.Open(HKEY_CURRENT_USER, _T("Software\\Microsoft\\Internet Explorer\\Settings")); - if(lRet == ERROR_SUCCESS) - { - const int cchValue = 12; - TCHAR szValue[cchValue] = { 0 }; - ULONG ulCount = cchValue; - lRet = rk.QueryStringValue(_T("Anchor Color"), szValue, &ulCount); - if(lRet == ERROR_SUCCESS) - { - COLORREF clr = pT->_ParseColorString(szValue); - ATLASSERT(clr != CLR_INVALID); - if(clr != CLR_INVALID) - m_clrLink = clr; - } - - ulCount = cchValue; - lRet = rk.QueryStringValue(_T("Anchor Color Visited"), szValue, &ulCount); - if(lRet == ERROR_SUCCESS) - { - COLORREF clr = pT->_ParseColorString(szValue); - ATLASSERT(clr != CLR_INVALID); - if(clr != CLR_INVALID) - m_clrVisited = clr; - } - } - } - } - - static COLORREF _ParseColorString(LPTSTR lpstr) - { - int c[3] = { -1, -1, -1 }; - LPTSTR p = NULL; - for(int i = 0; i < 2; i++) - { - for(p = lpstr; *p != _T('\0'); p = ::CharNext(p)) - { - if(*p == _T(',')) - { - *p = _T('\0'); - c[i] = T::_xttoi(lpstr); - lpstr = &p[1]; - break; - } - } - if(c[i] == -1) - return CLR_INVALID; - } - if(*lpstr == _T('\0')) - return CLR_INVALID; - c[2] = T::_xttoi(lpstr); - - return RGB(c[0], c[1], c[2]); - } - - bool CalcLabelRect() - { - if(!::IsWindow(m_hWnd)) - return false; - if(m_lpstrLabel == NULL && m_lpstrHyperLink == NULL) - return false; - - CClientDC dc(m_hWnd); - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - m_rcLink = rcClient; - if(!m_bPaintLabel) - return true; - - if(IsUsingTags()) - { - // find tags and label parts - LPTSTR lpstrLeft = NULL; - int cchLeft = 0; - LPTSTR lpstrLink = NULL; - int cchLink = 0; - LPTSTR lpstrRight = NULL; - int cchRight = 0; - - T* pT = static_cast(this); - pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight); - ATLASSERT(lpstrLink != NULL); - ATLASSERT(cchLink > 0); - - // get label part rects - HFONT hFontOld = dc.SelectFont(m_hFontNormal); - - UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK; - - RECT rcLeft = rcClient; - if(lpstrLeft != NULL) - dc.DrawText(lpstrLeft, cchLeft, &rcLeft, DT_LEFT | uFormat | DT_CALCRECT); - - dc.SelectFont(m_hFontLink); - RECT rcLink = rcClient; - if(lpstrLeft != NULL) - rcLink.left = rcLeft.right; - dc.DrawText(lpstrLink, cchLink, &rcLink, DT_LEFT | uFormat | DT_CALCRECT); - - dc.SelectFont(hFontOld); - - m_rcLink = rcLink; - } - else - { - HFONT hOldFont = NULL; - if(m_hFontLink != NULL) - hOldFont = dc.SelectFont(m_hFontLink); - LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; - DWORD dwStyle = GetStyle(); - UINT uFormat = DT_LEFT; - if (dwStyle & SS_CENTER) - uFormat = DT_CENTER; - else if (dwStyle & SS_RIGHT) - uFormat = DT_RIGHT; - uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK; - dc.DrawText(lpstrText, -1, &m_rcLink, uFormat | DT_CALCRECT); - if(m_hFontLink != NULL) - dc.SelectFont(hOldFont); - if (dwStyle & SS_CENTER) - { - int dx = (rcClient.right - m_rcLink.right) / 2; - ::OffsetRect(&m_rcLink, dx, 0); - } - else if (dwStyle & SS_RIGHT) - { - int dx = rcClient.right - m_rcLink.right; - ::OffsetRect(&m_rcLink, dx, 0); - } - } - - return true; - } - - void CalcLabelParts(LPTSTR& lpstrLeft, int& cchLeft, LPTSTR& lpstrLink, int& cchLink, LPTSTR& lpstrRight, int& cchRight) const - { - lpstrLeft = NULL; - cchLeft = 0; - lpstrLink = NULL; - cchLink = 0; - lpstrRight = NULL; - cchRight = 0; - - LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; - int cchText = lstrlen(lpstrText); - bool bOutsideLink = true; - for(int i = 0; i < cchText; i++) - { - if(lpstrText[i] != _T('<')) - continue; - - if(bOutsideLink) - { - if(::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, &lpstrText[i], 3, _T(""), 3) == CSTR_EQUAL) - { - if(i > 0) - { - lpstrLeft = lpstrText; - cchLeft = i; - } - lpstrLink = &lpstrText[i + 3]; - bOutsideLink = false; - } - } - else - { - if(::CompareString(LOCALE_USER_DEFAULT, NORM_IGNORECASE, &lpstrText[i], 4, _T(""), 4) == CSTR_EQUAL) - { - cchLink = i - 3 - cchLeft; - if(lpstrText[i + 4] != 0) - { - lpstrRight = &lpstrText[i + 4]; - cchRight = cchText - (i + 4); - break; - } - } - } - } - - } - - void DoEraseBackground(CDCHandle dc) - { - HBRUSH hBrush = (HBRUSH)::SendMessage(GetParent(), WM_CTLCOLORSTATIC, (WPARAM)dc.m_hDC, (LPARAM)m_hWnd); - if(hBrush != NULL) - { - RECT rect = { 0 }; - GetClientRect(&rect); - dc.FillRect(&rect, hBrush); - } - } - - void DoPaint(CDCHandle dc) - { - if(IsUsingTags()) - { - // find tags and label parts - LPTSTR lpstrLeft = NULL; - int cchLeft = 0; - LPTSTR lpstrLink = NULL; - int cchLink = 0; - LPTSTR lpstrRight = NULL; - int cchRight = 0; - - T* pT = static_cast(this); - pT->CalcLabelParts(lpstrLeft, cchLeft, lpstrLink, cchLink, lpstrRight, cchRight); - - // get label part rects - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - - dc.SetBkMode(TRANSPARENT); - HFONT hFontOld = dc.SelectFont(m_hFontNormal); - - UINT uFormat = IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK; - - if(lpstrLeft != NULL) - dc.DrawText(lpstrLeft, cchLeft, &rcClient, DT_LEFT | uFormat); - - COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT))); - if(m_hFontLink != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover))) - dc.SelectFont(m_hFontLink); - else - dc.SelectFont(m_hFontNormal); - - dc.DrawText(lpstrLink, cchLink, &m_rcLink, DT_LEFT | uFormat); - - dc.SetTextColor(clrOld); - dc.SelectFont(m_hFontNormal); - if(lpstrRight != NULL) - { - RECT rcRight = { m_rcLink.right, m_rcLink.top, rcClient.right, rcClient.bottom }; - dc.DrawText(lpstrRight, cchRight, &rcRight, DT_LEFT | uFormat); - } - - if(GetFocus() == m_hWnd) - dc.DrawFocusRect(&m_rcLink); - - dc.SelectFont(hFontOld); - } - else - { - dc.SetBkMode(TRANSPARENT); - COLORREF clrOld = dc.SetTextColor(IsWindowEnabled() ? (m_bVisited ? m_clrVisited : m_clrLink) : (::GetSysColor(COLOR_GRAYTEXT))); - - HFONT hFontOld = NULL; - if(m_hFontLink != NULL && (!IsUnderlineHover() || (IsUnderlineHover() && m_bHover))) - hFontOld = dc.SelectFont(m_hFontLink); - else - hFontOld = dc.SelectFont(m_hFontNormal); - - LPTSTR lpstrText = (m_lpstrLabel != NULL) ? m_lpstrLabel : m_lpstrHyperLink; - - DWORD dwStyle = GetStyle(); - UINT uFormat = DT_LEFT; - if (dwStyle & SS_CENTER) - uFormat = DT_CENTER; - else if (dwStyle & SS_RIGHT) - uFormat = DT_RIGHT; - uFormat |= IsSingleLine() ? DT_SINGLELINE : DT_WORDBREAK; - - dc.DrawText(lpstrText, -1, &m_rcLink, uFormat); - - if(GetFocus() == m_hWnd) - dc.DrawFocusRect(&m_rcLink); - - dc.SetTextColor(clrOld); - dc.SelectFont(hFontOld); - } - } - -#ifndef _WIN32_WCE - BOOL StartTrackMouseLeave() - { - TRACKMOUSEEVENT tme = { 0 }; - tme.cbSize = sizeof(tme); - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = m_hWnd; - return _TrackMouseEvent(&tme); - } -#endif // !_WIN32_WCE - -// Implementation helpers - bool IsUnderlined() const - { - return ((m_dwExtendedStyle & (HLINK_NOTUNDERLINED | HLINK_UNDERLINEHOVER)) == 0); - } - - bool IsNotUnderlined() const - { - return ((m_dwExtendedStyle & HLINK_NOTUNDERLINED) != 0); - } - - bool IsUnderlineHover() const - { - return ((m_dwExtendedStyle & HLINK_UNDERLINEHOVER) != 0); - } - - bool IsCommandButton() const - { - return ((m_dwExtendedStyle & HLINK_COMMANDBUTTON) != 0); - } - - bool IsNotifyButton() const - { - return ((m_dwExtendedStyle & HLINK_NOTIFYBUTTON) == HLINK_NOTIFYBUTTON); - } - - bool IsUsingTags() const - { - return ((m_dwExtendedStyle & HLINK_USETAGS) != 0); - } - - bool IsUsingTagsBold() const - { - return ((m_dwExtendedStyle & HLINK_USETAGSBOLD) == HLINK_USETAGSBOLD); - } - - bool IsUsingToolTip() const - { - return ((m_dwExtendedStyle & HLINK_NOTOOLTIP) == 0); - } - - bool IsAutoCreateLinkFont() const - { - return ((m_dwExtendedStyle & HLINK_AUTOCREATELINKFONT) == HLINK_AUTOCREATELINKFONT); - } - - bool IsSingleLine() const - { - return ((m_dwExtendedStyle & HLINK_SINGLELINE) == HLINK_SINGLELINE); - } - - static int _xttoi(const TCHAR* nptr) - { -#ifndef _ATL_MIN_CRT - return _ttoi(nptr); -#else // _ATL_MIN_CRT - while(*nptr == _T(' ')) // skip spaces - ++nptr; - - int c = (int)(_TUCHAR)*nptr++; - int sign = c; // save sign indication - if (c == _T('-') || c == _T('+')) - c = (int)(_TUCHAR)*nptr++; // skip sign - - int total = 0; - while((TCHAR)c >= _T('0') && (TCHAR)c <= _T('9')) - { - total = 10 * total + ((TCHAR)c - _T('0')); // accumulate digit - c = (int)(_TUCHAR)*nptr++; // get next char - } - - // return result, negated if necessary - return ((TCHAR)sign != _T('-')) ? total : -total; -#endif // _ATL_MIN_CRT - } -}; - -class CHyperLink : public CHyperLinkImpl -{ -public: - DECLARE_WND_CLASS(_T("WTL_HyperLink")) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CWaitCursor - displays a wait cursor - -class CWaitCursor -{ -public: -// Data - HCURSOR m_hWaitCursor; - HCURSOR m_hOldCursor; - bool m_bInUse; - -// Constructor/destructor - CWaitCursor(bool bSet = true, LPCTSTR lpstrCursor = IDC_WAIT, bool bSys = true) : m_hOldCursor(NULL), m_bInUse(false) - { - HINSTANCE hInstance = bSys ? NULL : ModuleHelper::GetResourceInstance(); - m_hWaitCursor = ::LoadCursor(hInstance, lpstrCursor); - ATLASSERT(m_hWaitCursor != NULL); - - if(bSet) - Set(); - } - - ~CWaitCursor() - { - Restore(); - } - -// Methods - bool Set() - { - if(m_bInUse) - return false; - m_hOldCursor = ::SetCursor(m_hWaitCursor); - m_bInUse = true; - return true; - } - - bool Restore() - { - if(!m_bInUse) - return false; - ::SetCursor(m_hOldCursor); - m_bInUse = false; - return true; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CCustomWaitCursor - for custom and animated cursors - -class CCustomWaitCursor : public CWaitCursor -{ -public: -// Constructor/destructor - CCustomWaitCursor(ATL::_U_STRINGorID cursor, bool bSet = true, HINSTANCE hInstance = NULL) : - CWaitCursor(false, IDC_WAIT, true) - { - if(hInstance == NULL) - hInstance = ModuleHelper::GetResourceInstance(); - m_hWaitCursor = (HCURSOR)::LoadImage(hInstance, cursor.m_lpstr, IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE); - - if(bSet) - Set(); - } - - ~CCustomWaitCursor() - { - Restore(); -#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) - ::DestroyCursor(m_hWaitCursor); -#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CMultiPaneStatusBarCtrl - Status Bar with multiple panes - -template -class ATL_NO_VTABLE CMultiPaneStatusBarCtrlImpl : public ATL::CWindowImpl< T, TBase > -{ -public: - DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) - -// Data - enum { m_cxPaneMargin = 3 }; - - int m_nPanes; - int* m_pPane; - -// Constructor/destructor - CMultiPaneStatusBarCtrlImpl() : m_nPanes(0), m_pPane(NULL) - { } - - ~CMultiPaneStatusBarCtrlImpl() - { - delete [] m_pPane; - } - -// Methods - HWND Create(HWND hWndParent, LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR) - { -#if (_MSC_VER >= 1300) - return ATL::CWindowImpl< T, TBase >::Create(hWndParent, rcDefault, lpstrText, dwStyle, 0, nID); -#else // !(_MSC_VER >= 1300) - typedef ATL::CWindowImpl< T, TBase > _baseClass; - return _baseClass::Create(hWndParent, rcDefault, lpstrText, dwStyle, 0, nID); -#endif // !(_MSC_VER >= 1300) - } - - HWND Create(HWND hWndParent, UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR) - { - const int cchMax = 128; // max text length is 127 for status bars (+1 for null) - TCHAR szText[cchMax]; - szText[0] = 0; - ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax); - return Create(hWndParent, szText, dwStyle, nID); - } - - BOOL SetPanes(int* pPanes, int nPanes, bool bSetText = true) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPanes > 0); - - m_nPanes = nPanes; - delete [] m_pPane; - m_pPane = NULL; - - ATLTRY(m_pPane = new int[nPanes]); - ATLASSERT(m_pPane != NULL); - if(m_pPane == NULL) - return FALSE; - - CTempBuffer buff; - int* pPanesPos = buff.Allocate(nPanes); - ATLASSERT(pPanesPos != NULL); - if(pPanesPos == NULL) - return FALSE; - - SecureHelper::memcpy_x(m_pPane, nPanes * sizeof(int), pPanes, nPanes * sizeof(int)); - - // get status bar DC and set font - CClientDC dc(m_hWnd); - HFONT hOldFont = dc.SelectFont(GetFont()); - - // get status bar borders - int arrBorders[3] = { 0 }; - GetBorders(arrBorders); - - const int cchBuff = 128; - TCHAR szBuff[cchBuff] = { 0 }; - SIZE size = { 0, 0 }; - int cxLeft = arrBorders[0]; - - // calculate right edge of each part - for(int i = 0; i < nPanes; i++) - { - if(pPanes[i] == ID_DEFAULT_PANE) - { - // make very large, will be resized later - pPanesPos[i] = INT_MAX / 2; - } - else - { - ::LoadString(ModuleHelper::GetResourceInstance(), pPanes[i], szBuff, cchBuff); - dc.GetTextExtent(szBuff, lstrlen(szBuff), &size); - T* pT = static_cast(this); - pT; - pPanesPos[i] = cxLeft + size.cx + arrBorders[2] + 2 * pT->m_cxPaneMargin; - } - cxLeft = pPanesPos[i]; - } - - BOOL bRet = SetParts(nPanes, pPanesPos); - - if(bRet && bSetText) - { - for(int i = 0; i < nPanes; i++) - { - if(pPanes[i] != ID_DEFAULT_PANE) - { - ::LoadString(ModuleHelper::GetResourceInstance(), pPanes[i], szBuff, cchBuff); - SetPaneText(m_pPane[i], szBuff); - } - } - } - - dc.SelectFont(hOldFont); - return bRet; - } - - bool GetPaneTextLength(int nPaneID, int* pcchLength = NULL, int* pnType = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return false; - - int nLength = GetTextLength(nIndex, pnType); - if(pcchLength != NULL) - *pcchLength = nLength; - - return true; - } - - BOOL GetPaneText(int nPaneID, LPTSTR lpstrText, int* pcchLength = NULL, int* pnType = NULL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return FALSE; - - int nLength = GetText(nIndex, lpstrText, pnType); - if(pcchLength != NULL) - *pcchLength = nLength; - - return TRUE; - } - - BOOL SetPaneText(int nPaneID, LPCTSTR lpstrText, int nType = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return FALSE; - - return SetText(nIndex, lpstrText, nType); - } - - BOOL GetPaneRect(int nPaneID, LPRECT lpRect) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return FALSE; - - return GetRect(nIndex, lpRect); - } - - BOOL SetPaneWidth(int nPaneID, int cxWidth) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPaneID != ID_DEFAULT_PANE); // Can't resize this one - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return FALSE; - - // get pane positions - CTempBuffer buff; - int* pPanesPos = buff.Allocate(m_nPanes); - if(pPanesPos == NULL) - return FALSE; - GetParts(m_nPanes, pPanesPos); - // calculate offset - int cxPaneWidth = pPanesPos[nIndex] - ((nIndex == 0) ? 0 : pPanesPos[nIndex - 1]); - int cxOff = cxWidth - cxPaneWidth; - // find variable width pane - int nDef = m_nPanes; - for(int i = 0; i < m_nPanes; i++) - { - if(m_pPane[i] == ID_DEFAULT_PANE) - { - nDef = i; - break; - } - } - // resize - if(nIndex < nDef) // before default pane - { - for(int i = nIndex; i < nDef; i++) - pPanesPos[i] += cxOff; - - } - else // after default one - { - for(int i = nDef; i < nIndex; i++) - pPanesPos[i] -= cxOff; - } - // set pane postions - return SetParts(m_nPanes, pPanesPos); - } - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - BOOL GetPaneTipText(int nPaneID, LPTSTR lpstrText, int nSize) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return FALSE; - - GetTipText(nIndex, lpstrText, nSize); - return TRUE; - } - - BOOL SetPaneTipText(int nPaneID, LPCTSTR lpstrText) - { - ATLASSERT(::IsWindow(m_hWnd)); - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return FALSE; - - SetTipText(nIndex, lpstrText); - return TRUE; - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -#if ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) - BOOL GetPaneIcon(int nPaneID, HICON& hIcon) const - { - ATLASSERT(::IsWindow(m_hWnd)); - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return FALSE; - - hIcon = GetIcon(nIndex); - return TRUE; - } - - BOOL SetPaneIcon(int nPaneID, HICON hIcon) - { - ATLASSERT(::IsWindow(m_hWnd)); - int nIndex = GetPaneIndexFromID(nPaneID); - if(nIndex == -1) - return FALSE; - - return SetIcon(nIndex, hIcon); - } -#endif // ((_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE)) || (defined(_WIN32_WCE) && (_WIN32_WCE >= 0x0500)) - -// Message map and handlers - BEGIN_MSG_MAP(CMultiPaneStatusBarCtrlImpl< T >) - MESSAGE_HANDLER(WM_SIZE, OnSize) - END_MSG_MAP() - - LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - if(wParam != SIZE_MINIMIZED && m_nPanes > 0) - { - T* pT = static_cast(this); - pT->UpdatePanesLayout(); - } - return lRet; - } - -// Implementation - BOOL UpdatePanesLayout() - { - // get pane positions - CTempBuffer buff; - int* pPanesPos = buff.Allocate(m_nPanes); - ATLASSERT(pPanesPos != NULL); - if(pPanesPos == NULL) - return FALSE; - int nRet = GetParts(m_nPanes, pPanesPos); - ATLASSERT(nRet == m_nPanes); - if(nRet != m_nPanes) - return FALSE; - // calculate offset - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - int cxOff = rcClient.right - pPanesPos[m_nPanes - 1]; -#ifndef _WIN32_WCE - // Move panes left if size grip box is present - if((GetStyle() & SBARS_SIZEGRIP) != 0) - cxOff -= ::GetSystemMetrics(SM_CXVSCROLL) + ::GetSystemMetrics(SM_CXEDGE); -#endif // !_WIN32_WCE - // find variable width pane - int i; - for(i = 0; i < m_nPanes; i++) - { - if(m_pPane[i] == ID_DEFAULT_PANE) - break; - } - // resize all panes from the variable one to the right - if((i < m_nPanes) && (pPanesPos[i] + cxOff) > ((i == 0) ? 0 : pPanesPos[i - 1])) - { - for(; i < m_nPanes; i++) - pPanesPos[i] += cxOff; - } - // set pane postions - return SetParts(m_nPanes, pPanesPos); - } - - int GetPaneIndexFromID(int nPaneID) const - { - for(int i = 0; i < m_nPanes; i++) - { - if(m_pPane[i] == nPaneID) - return i; - } - - return -1; // not found - } -}; - -class CMultiPaneStatusBarCtrl : public CMultiPaneStatusBarCtrlImpl -{ -public: - DECLARE_WND_SUPERCLASS(_T("WTL_MultiPaneStatusBar"), GetWndClassName()) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CPaneContainer - provides header with title and close button for panes - -// pane container extended styles -#define PANECNT_NOCLOSEBUTTON 0x00000001 -#define PANECNT_VERTICAL 0x00000002 -#define PANECNT_FLATBORDER 0x00000004 -#define PANECNT_NOBORDER 0x00000008 - -template -class ATL_NO_VTABLE CPaneContainerImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CCustomDraw< T > -{ -public: - DECLARE_WND_CLASS_EX(NULL, 0, -1) - -// Constants - enum - { - m_cxyBorder = 2, - m_cxyTextOffset = 4, - m_cxyBtnOffset = 1, - - m_cchTitle = 80, - - m_cxImageTB = 13, - m_cyImageTB = 11, - m_cxyBtnAddTB = 7, - - m_cxToolBar = m_cxImageTB + m_cxyBtnAddTB + m_cxyBorder + m_cxyBtnOffset, - - m_xBtnImageLeft = 6, - m_yBtnImageTop = 5, - m_xBtnImageRight = 12, - m_yBtnImageBottom = 11, - - m_nCloseBtnID = ID_PANE_CLOSE - }; - -// Data members - CToolBarCtrl m_tb; - ATL::CWindow m_wndClient; - int m_cxyHeader; - TCHAR m_szTitle[m_cchTitle]; - DWORD m_dwExtendedStyle; // Pane container specific extended styles - HFONT m_hFont; - bool m_bInternalFont; - - -// Constructor - CPaneContainerImpl() : m_cxyHeader(0), m_dwExtendedStyle(0), m_hFont(NULL), m_bInternalFont(false) - { - m_szTitle[0] = 0; - } - -// Attributes - DWORD GetPaneContainerExtendedStyle() const - { - return m_dwExtendedStyle; - } - - DWORD SetPaneContainerExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwExtendedStyle; - if(dwMask == 0) - m_dwExtendedStyle = dwExtendedStyle; - else - m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); - if(m_hWnd != NULL) - { - T* pT = static_cast(this); - bool bUpdate = false; - - if(((dwPrevStyle & PANECNT_NOCLOSEBUTTON) != 0) && ((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) == 0)) // add close button - { - pT->CreateCloseButton(); - bUpdate = true; - } - else if(((dwPrevStyle & PANECNT_NOCLOSEBUTTON) == 0) && ((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) != 0)) // remove close button - { - pT->DestroyCloseButton(); - bUpdate = true; - } - - if((dwPrevStyle & PANECNT_VERTICAL) != (m_dwExtendedStyle & PANECNT_VERTICAL)) // change orientation - { - pT->CalcSize(); - bUpdate = true; - } - - if((dwPrevStyle & (PANECNT_FLATBORDER | PANECNT_NOBORDER)) != - (m_dwExtendedStyle & (PANECNT_FLATBORDER | PANECNT_NOBORDER))) // change border - { - bUpdate = true; - } - - if(bUpdate) - pT->UpdateLayout(); - } - return dwPrevStyle; - } - - HWND GetClient() const - { - return m_wndClient; - } - - HWND SetClient(HWND hWndClient) - { - HWND hWndOldClient = m_wndClient; - m_wndClient = hWndClient; - if(m_hWnd != NULL) - { - T* pT = static_cast(this); - pT->UpdateLayout(); - } - return hWndOldClient; - } - - BOOL GetTitle(LPTSTR lpstrTitle, int cchLength) const - { - ATLASSERT(lpstrTitle != NULL); - - errno_t nRet = SecureHelper::strncpy_x(lpstrTitle, cchLength, m_szTitle, _TRUNCATE); - - return (nRet == 0 || nRet == STRUNCATE); - } - - BOOL SetTitle(LPCTSTR lpstrTitle) - { - ATLASSERT(lpstrTitle != NULL); - - errno_t nRet = SecureHelper::strncpy_x(m_szTitle, m_cchTitle, lpstrTitle, _TRUNCATE); - bool bRet = (nRet == 0 || nRet == STRUNCATE); - if(bRet && m_hWnd != NULL) - { - T* pT = static_cast(this); - pT->UpdateLayout(); - } - - return bRet; - } - - int GetTitleLength() const - { - return lstrlen(m_szTitle); - } - -// Methods - HWND Create(HWND hWndParent, LPCTSTR lpstrTitle = NULL, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, - DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL) - { - if(lpstrTitle != NULL) - SecureHelper::strncpy_x(m_szTitle, m_cchTitle, lpstrTitle, _TRUNCATE); -#if (_MSC_VER >= 1300) - return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam); -#else // !(_MSC_VER >= 1300) - typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass; - return _baseClass::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam); -#endif // !(_MSC_VER >= 1300) - } - - HWND Create(HWND hWndParent, UINT uTitleID, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, - DWORD dwExStyle = 0, UINT nID = 0, LPVOID lpCreateParam = NULL) - { - if(uTitleID != 0U) - ::LoadString(ModuleHelper::GetResourceInstance(), uTitleID, m_szTitle, m_cchTitle); -#if (_MSC_VER >= 1300) - return ATL::CWindowImpl< T, TBase, TWinTraits >::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam); -#else // !(_MSC_VER >= 1300) - typedef ATL::CWindowImpl< T, TBase, TWinTraits > _baseClass; - return _baseClass::Create(hWndParent, rcDefault, NULL, dwStyle, dwExStyle, nID, lpCreateParam); -#endif // !(_MSC_VER >= 1300) - } - - BOOL EnableCloseButton(BOOL bEnable) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - pT; // avoid level 4 warning - return (m_tb.m_hWnd != NULL) ? m_tb.EnableButton(pT->m_nCloseBtnID, bEnable) : FALSE; - } - - void UpdateLayout() - { - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - T* pT = static_cast(this); - pT->UpdateLayout(rcClient.right, rcClient.bottom); - } - -// Message map and handlers - BEGIN_MSG_MAP(CPaneContainerImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) - MESSAGE_HANDLER(WM_GETFONT, OnGetFont) - MESSAGE_HANDLER(WM_SETFONT, OnSetFont) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_PAINT, OnPaint) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) -#endif // !_WIN32_WCE - MESSAGE_HANDLER(WM_NOTIFY, OnNotify) - MESSAGE_HANDLER(WM_COMMAND, OnCommand) - FORWARD_NOTIFICATIONS() - END_MSG_MAP() - - LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(m_hFont == NULL) - { - // The same as AtlCreateControlFont() for horizontal pane -#ifndef _WIN32_WCE - LOGFONT lf = { 0 }; - ATLVERIFY(::SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0) != FALSE); - if(IsVertical()) - lf.lfEscapement = 900; // 90 degrees - m_hFont = ::CreateFontIndirect(&lf); -#else // CE specific - m_hFont = (HFONT)::GetStockObject(SYSTEM_FONT); - if(IsVertical()) - { - CLogFont lf(m_hFont); - lf.lfEscapement = 900; // 90 degrees - m_hFont = ::CreateFontIndirect(&lf); - } -#endif // _WIN32_WCE - m_bInternalFont = true; - } - - T* pT = static_cast(this); - pT->CalcSize(); - - if((m_dwExtendedStyle & PANECNT_NOCLOSEBUTTON) == 0) - pT->CreateCloseButton(); - - return 0; - } - - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(m_bInternalFont) - { - ::DeleteObject(m_hFont); - m_hFont = NULL; - m_bInternalFont = false; - } - - return 0; - } - - LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - return 0; - } - - LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(m_wndClient.m_hWnd != NULL) - m_wndClient.SetFocus(); - return 0; - } - - LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return (LRESULT)m_hFont; - } - - LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - if(m_bInternalFont) - { - ::DeleteObject(m_hFont); - m_bInternalFont = false; - } - - m_hFont = (HFONT)wParam; - - T* pT = static_cast(this); - pT->CalcSize(); - - if((BOOL)lParam != FALSE) - pT->UpdateLayout(); - - return 0; - } - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; // no background needed - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - if(wParam != NULL) - { - pT->DrawPaneTitle((HDC)wParam); - - if(m_wndClient.m_hWnd == NULL) // no client window - pT->DrawPane((HDC)wParam); - } - else - { - CPaintDC dc(m_hWnd); - pT->DrawPaneTitle(dc.m_hDC); - - if(m_wndClient.m_hWnd == NULL) // no client window - pT->DrawPane(dc.m_hDC); - } - - return 0; - } - - LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(m_tb.m_hWnd == NULL) - { - bHandled = FALSE; - return 1; - } - - T* pT = static_cast(this); - pT; - LPNMHDR lpnmh = (LPNMHDR)lParam; - LRESULT lRet = 0; - - // pass toolbar custom draw notifications to the base class - if(lpnmh->code == NM_CUSTOMDRAW && lpnmh->hwndFrom == m_tb.m_hWnd) - lRet = CCustomDraw< T >::OnCustomDraw(0, lpnmh, bHandled); -#ifndef _WIN32_WCE - // tooltip notifications come with the tooltip window handle and button ID, - // pass them to the parent if we don't handle them - else if(lpnmh->code == TTN_GETDISPINFO && lpnmh->idFrom == pT->m_nCloseBtnID) - bHandled = pT->GetToolTipText(lpnmh); -#endif // !_WIN32_WCE - // only let notifications not from the toolbar go to the parent - else if(lpnmh->hwndFrom != m_tb.m_hWnd && lpnmh->idFrom != pT->m_nCloseBtnID) - bHandled = FALSE; - - return lRet; - } - - LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - // if command comes from the close button, substitute HWND of the pane container instead - if(m_tb.m_hWnd != NULL && (HWND)lParam == m_tb.m_hWnd) - return ::SendMessage(GetParent(), WM_COMMAND, wParam, (LPARAM)m_hWnd); - - bHandled = FALSE; - return 1; - } - -// Custom draw overrides - DWORD OnPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW /*lpNMCustomDraw*/) - { - return CDRF_NOTIFYITEMDRAW; // we need per-item notifications - } - - DWORD OnItemPrePaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) - { - CDCHandle dc = lpNMCustomDraw->hdc; -#if (_WIN32_IE >= 0x0400) - RECT& rc = lpNMCustomDraw->rc; -#else // !(_WIN32_IE >= 0x0400) - RECT rc; - m_tb.GetItemRect(0, &rc); -#endif // !(_WIN32_IE >= 0x0400) - - dc.FillRect(&rc, COLOR_3DFACE); - - return CDRF_NOTIFYPOSTPAINT; - } - - DWORD OnItemPostPaint(int /*idCtrl*/, LPNMCUSTOMDRAW lpNMCustomDraw) - { - CDCHandle dc = lpNMCustomDraw->hdc; -#if (_WIN32_IE >= 0x0400) - RECT& rc = lpNMCustomDraw->rc; -#else // !(_WIN32_IE >= 0x0400) - RECT rc = { 0 }; - m_tb.GetItemRect(0, &rc); -#endif // !(_WIN32_IE >= 0x0400) - - RECT rcImage = { m_xBtnImageLeft, m_yBtnImageTop, m_xBtnImageRight + 1, m_yBtnImageBottom + 1 }; - ::OffsetRect(&rcImage, rc.left, rc.top); - T* pT = static_cast(this); - - if((lpNMCustomDraw->uItemState & CDIS_DISABLED) != 0) - { - RECT rcShadow = rcImage; - ::OffsetRect(&rcShadow, 1, 1); - CPen pen1; - pen1.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_3DHILIGHT)); - pT->DrawButtonImage(dc, rcShadow, pen1); - CPen pen2; - pen2.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_3DSHADOW)); - pT->DrawButtonImage(dc, rcImage, pen2); - } - else - { - if((lpNMCustomDraw->uItemState & CDIS_SELECTED) != 0) - ::OffsetRect(&rcImage, 1, 1); - CPen pen; - pen.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNTEXT)); - pT->DrawButtonImage(dc, rcImage, pen); - } - - return CDRF_DODEFAULT; // continue with the default item painting - } - -// Implementation - overrideable methods - void UpdateLayout(int cxWidth, int cyHeight) - { - ATLASSERT(::IsWindow(m_hWnd)); - RECT rect = { 0 }; - - if(IsVertical()) - { - ::SetRect(&rect, 0, 0, m_cxyHeader, cyHeight); - if(m_tb.m_hWnd != NULL) - m_tb.SetWindowPos(NULL, m_cxyBorder, m_cxyBorder + m_cxyBtnOffset, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); - - if(m_wndClient.m_hWnd != NULL) - m_wndClient.SetWindowPos(NULL, m_cxyHeader, 0, cxWidth - m_cxyHeader, cyHeight, SWP_NOZORDER); - else - rect.right = cxWidth; - } - else - { - ::SetRect(&rect, 0, 0, cxWidth, m_cxyHeader); - if(m_tb.m_hWnd != NULL) - m_tb.SetWindowPos(NULL, rect.right - m_cxToolBar, m_cxyBorder + m_cxyBtnOffset, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); - - if(m_wndClient.m_hWnd != NULL) - m_wndClient.SetWindowPos(NULL, 0, m_cxyHeader, cxWidth, cyHeight - m_cxyHeader, SWP_NOZORDER); - else - rect.bottom = cyHeight; - } - - InvalidateRect(&rect); - } - - void CreateCloseButton() - { - ATLASSERT(m_tb.m_hWnd == NULL); - // create toolbar for the "x" button - m_tb.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | CCS_NOMOVEY | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT, 0); - ATLASSERT(m_tb.IsWindow()); - - if(m_tb.m_hWnd != NULL) - { - T* pT = static_cast(this); - pT; // avoid level 4 warning - - m_tb.SetButtonStructSize(); - - TBBUTTON tbbtn = { 0 }; - tbbtn.idCommand = pT->m_nCloseBtnID; - tbbtn.fsState = TBSTATE_ENABLED; - tbbtn.fsStyle = TBSTYLE_BUTTON; - m_tb.AddButtons(1, &tbbtn); - - m_tb.SetBitmapSize(m_cxImageTB, m_cyImageTB); - m_tb.SetButtonSize(m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB); - - if(IsVertical()) - m_tb.SetWindowPos(NULL, m_cxyBorder + m_cxyBtnOffset, m_cxyBorder + m_cxyBtnOffset, m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB, SWP_NOZORDER | SWP_NOACTIVATE); - else - m_tb.SetWindowPos(NULL, 0, 0, m_cxImageTB + m_cxyBtnAddTB, m_cyImageTB + m_cxyBtnAddTB, SWP_NOZORDER | SWP_NOMOVE | SWP_NOACTIVATE); - } - } - - void DestroyCloseButton() - { - if(m_tb.m_hWnd != NULL) - m_tb.DestroyWindow(); - } - - void CalcSize() - { - T* pT = static_cast(this); - CFontHandle font = pT->GetTitleFont(); - if(font.IsNull()) - font = (HFONT)::GetStockObject(SYSTEM_FONT); - LOGFONT lf = { 0 }; - font.GetLogFont(lf); - if(IsVertical()) - { - m_cxyHeader = m_cxImageTB + m_cxyBtnAddTB + m_cxyBorder; - } - else - { - int cyFont = abs(lf.lfHeight) + m_cxyBorder + 2 * m_cxyTextOffset; - int cyBtn = m_cyImageTB + m_cxyBtnAddTB + m_cxyBorder + 2 * m_cxyBtnOffset; - m_cxyHeader = max(cyFont, cyBtn); - } - } - - HFONT GetTitleFont() const - { - return m_hFont; - } - -#ifndef _WIN32_WCE - BOOL GetToolTipText(LPNMHDR /*lpnmh*/) - { - return FALSE; - } -#endif // !_WIN32_WCE - - void DrawPaneTitle(CDCHandle dc) - { - RECT rect = { 0 }; - GetClientRect(&rect); - - UINT uBorder = BF_LEFT | BF_TOP | BF_ADJUST; - if(IsVertical()) - { - rect.right = rect.left + m_cxyHeader; - uBorder |= BF_BOTTOM; - } - else - { - rect.bottom = rect.top + m_cxyHeader; - uBorder |= BF_RIGHT; - } - - if((m_dwExtendedStyle & PANECNT_NOBORDER) == 0) - { - if((m_dwExtendedStyle & PANECNT_FLATBORDER) != 0) - uBorder |= BF_FLAT; - dc.DrawEdge(&rect, EDGE_ETCHED, uBorder); - } - dc.FillRect(&rect, COLOR_3DFACE); - - // draw title text - dc.SetTextColor(::GetSysColor(COLOR_WINDOWTEXT)); - dc.SetBkMode(TRANSPARENT); - T* pT = static_cast(this); - HFONT hFontOld = dc.SelectFont(pT->GetTitleFont()); -#ifdef _WIN32_WCE - const UINT DT_END_ELLIPSIS = 0; -#endif // _WIN32_WCE - - if(IsVertical()) - { - rect.top += m_cxyTextOffset; - rect.bottom -= m_cxyTextOffset; - if(m_tb.m_hWnd != NULL) - rect.top += m_cxToolBar;; - - RECT rcCalc = { rect.left, rect.bottom, rect.right, rect.top }; - int cxFont = dc.DrawText(m_szTitle, -1, &rcCalc, DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS | DT_CALCRECT); - RECT rcText = { 0 }; - rcText.left = (rect.right - rect.left - cxFont) / 2; - rcText.right = rcText.left + (rect.bottom - rect.top); - rcText.top = rect.bottom; - rcText.bottom = rect.top; - dc.DrawText(m_szTitle, -1, &rcText, DT_TOP | DT_SINGLELINE | DT_END_ELLIPSIS); - } - else - { - rect.left += m_cxyTextOffset; - rect.right -= m_cxyTextOffset; - if(m_tb.m_hWnd != NULL) - rect.right -= m_cxToolBar;; - - dc.DrawText(m_szTitle, -1, &rect, DT_LEFT | DT_SINGLELINE | DT_VCENTER | DT_END_ELLIPSIS); - } - - dc.SelectFont(hFontOld); - } - - // called only if pane is empty - void DrawPane(CDCHandle dc) - { - RECT rect = { 0 }; - GetClientRect(&rect); - if(IsVertical()) - rect.left += m_cxyHeader; - else - rect.top += m_cxyHeader; - if((GetExStyle() & WS_EX_CLIENTEDGE) == 0) - dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); - dc.FillRect(&rect, COLOR_APPWORKSPACE); - } - - // drawing helper - draws "x" button image - void DrawButtonImage(CDCHandle dc, RECT& rcImage, HPEN hPen) - { -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - HPEN hPenOld = dc.SelectPen(hPen); - - dc.MoveTo(rcImage.left, rcImage.top); - dc.LineTo(rcImage.right, rcImage.bottom); - dc.MoveTo(rcImage.left + 1, rcImage.top); - dc.LineTo(rcImage.right + 1, rcImage.bottom); - - dc.MoveTo(rcImage.left, rcImage.bottom - 1); - dc.LineTo(rcImage.right, rcImage.top - 1); - dc.MoveTo(rcImage.left + 1, rcImage.bottom - 1); - dc.LineTo(rcImage.right + 1, rcImage.top - 1); - - dc.SelectPen(hPenOld); -#else // (_WIN32_WCE < 400) - rcImage; - hPen; - // no support for the "x" button image -#endif // (_WIN32_WCE < 400) - } - - bool IsVertical() const - { - return ((m_dwExtendedStyle & PANECNT_VERTICAL) != 0); - } -}; - -class CPaneContainer : public CPaneContainerImpl -{ -public: - DECLARE_WND_CLASS_EX(_T("WTL_PaneContainer"), 0, -1) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CSortListViewCtrl - implements sorting for a listview control - -// sort listview extended styles -#define SORTLV_USESHELLBITMAPS 0x00000001 - -// Notification sent to parent when sort column is changed by user clicking header. -#define SLVN_SORTCHANGED LVN_LAST - -// A LPNMSORTLISTVIEW is sent with the SLVN_SORTCHANGED notification -typedef struct tagNMSORTLISTVIEW -{ - NMHDR hdr; - int iNewSortColumn; - int iOldSortColumn; -} NMSORTLISTVIEW, *LPNMSORTLISTVIEW; - -// Column sort types. Can be set on a per-column basis with the SetColumnSortType method. -enum -{ - LVCOLSORT_NONE, - LVCOLSORT_TEXT, // default - LVCOLSORT_TEXTNOCASE, - LVCOLSORT_LONG, - LVCOLSORT_DOUBLE, - LVCOLSORT_DECIMAL, - LVCOLSORT_DATETIME, - LVCOLSORT_DATE, - LVCOLSORT_TIME, - LVCOLSORT_CUSTOM, - LVCOLSORT_LAST = LVCOLSORT_CUSTOM -}; - - -template -class CSortListViewImpl -{ -public: - enum - { - m_cchCmpTextMax = 32, // overrideable - m_cxSortImage = 16, - m_cySortImage = 15, - m_cxSortArrow = 11, - m_cySortArrow = 6, - m_iSortUp = 0, // index of sort bitmaps - m_iSortDown = 1, - m_nShellSortUpID = 133 - }; - - // passed to LVCompare functions as lParam1 and lParam2 - struct LVCompareParam - { - int iItem; - DWORD_PTR dwItemData; - union - { - long lValue; - double dblValue; - DECIMAL decValue; - LPCTSTR pszValue; - }; - }; - - // passed to LVCompare functions as the lParamSort parameter - struct LVSortInfo - { - T* pT; - int iSortCol; - bool bDescending; - }; - - bool m_bSortDescending; - bool m_bCommCtrl6; - int m_iSortColumn; - CBitmap m_bmSort[2]; - int m_fmtOldSortCol; - HBITMAP m_hbmOldSortCol; - DWORD m_dwSortLVExtendedStyle; - ATL::CSimpleArray m_arrColSortType; - bool m_bUseWaitCursor; - - CSortListViewImpl() : - m_bSortDescending(false), - m_bCommCtrl6(false), - m_iSortColumn(-1), - m_fmtOldSortCol(0), - m_hbmOldSortCol(NULL), - m_dwSortLVExtendedStyle(SORTLV_USESHELLBITMAPS), - m_bUseWaitCursor(true) - { -#ifndef _WIN32_WCE - DWORD dwMajor = 0; - DWORD dwMinor = 0; - HRESULT hRet = ATL::AtlGetCommCtrlVersion(&dwMajor, &dwMinor); - m_bCommCtrl6 = SUCCEEDED(hRet) && dwMajor >= 6; -#endif // !_WIN32_WCE - } - -// Attributes - void SetSortColumn(int iCol) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - CHeaderCtrl header = pT->GetHeader(); - ATLASSERT(header.m_hWnd != NULL); - ATLASSERT(iCol >= -1 && iCol < m_arrColSortType.GetSize()); - - int iOldSortCol = m_iSortColumn; - m_iSortColumn = iCol; - if(m_bCommCtrl6) - { -#ifndef HDF_SORTUP - const int HDF_SORTUP = 0x0400; -#endif // HDF_SORTUP -#ifndef HDF_SORTDOWN - const int HDF_SORTDOWN = 0x0200; -#endif // HDF_SORTDOWN - const int nMask = HDF_SORTUP | HDF_SORTDOWN; - HDITEM hditem = { HDI_FORMAT }; - if(iOldSortCol != iCol && iOldSortCol >= 0 && header.GetItem(iOldSortCol, &hditem)) - { - hditem.fmt &= ~nMask; - header.SetItem(iOldSortCol, &hditem); - } - if(iCol >= 0 && header.GetItem(iCol, &hditem)) - { - hditem.fmt &= ~nMask; - hditem.fmt |= m_bSortDescending ? HDF_SORTDOWN : HDF_SORTUP; - header.SetItem(iCol, &hditem); - } - return; - } - - if(m_bmSort[m_iSortUp].IsNull()) - pT->CreateSortBitmaps(); - - // restore previous sort column's bitmap, if any, and format - HDITEM hditem = { HDI_BITMAP | HDI_FORMAT }; - if(iOldSortCol != iCol && iOldSortCol >= 0) - { - hditem.hbm = m_hbmOldSortCol; - hditem.fmt = m_fmtOldSortCol; - header.SetItem(iOldSortCol, &hditem); - } - - // save new sort column's bitmap and format, and add our sort bitmap - if(iCol >= 0 && header.GetItem(iCol, &hditem)) - { - if(iOldSortCol != iCol) - { - m_fmtOldSortCol = hditem.fmt; - m_hbmOldSortCol = hditem.hbm; - } - hditem.fmt &= ~HDF_IMAGE; - hditem.fmt |= HDF_BITMAP | HDF_BITMAP_ON_RIGHT; - int i = m_bSortDescending ? m_iSortDown : m_iSortUp; - hditem.hbm = m_bmSort[i]; - header.SetItem(iCol, &hditem); - } - } - - int GetSortColumn() const - { - return m_iSortColumn; - } - - void SetColumnSortType(int iCol, WORD wType) - { - ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize()); - ATLASSERT(wType >= LVCOLSORT_NONE && wType <= LVCOLSORT_LAST); - m_arrColSortType[iCol] = wType; - } - - WORD GetColumnSortType(int iCol) const - { - ATLASSERT((iCol >= 0) && iCol < m_arrColSortType.GetSize()); - return m_arrColSortType[iCol]; - } - - int GetColumnCount() const - { - const T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - CHeaderCtrl header = pT->GetHeader(); - return header.m_hWnd != NULL ? header.GetItemCount() : 0; - } - - bool IsSortDescending() const - { - return m_bSortDescending; - } - - DWORD GetSortListViewExtendedStyle() const - { - return m_dwSortLVExtendedStyle; - } - - DWORD SetSortListViewExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwSortLVExtendedStyle; - if(dwMask == 0) - m_dwSortLVExtendedStyle = dwExtendedStyle; - else - m_dwSortLVExtendedStyle = (m_dwSortLVExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); - return dwPrevStyle; - } - -// Operations - bool DoSortItems(int iCol, bool bDescending = false) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - ATLASSERT(iCol >= 0 && iCol < m_arrColSortType.GetSize()); - - WORD wType = m_arrColSortType[iCol]; - if(wType == LVCOLSORT_NONE) - return false; - - int nCount = pT->GetItemCount(); - if(nCount < 2) - { - m_bSortDescending = bDescending; - SetSortColumn(iCol); - return true; - } - - CWaitCursor waitCursor(false); - if(m_bUseWaitCursor) - waitCursor.Set(); - - LVCompareParam* pParam = NULL; - ATLTRY(pParam = new LVCompareParam[nCount]); - PFNLVCOMPARE pFunc = NULL; - TCHAR pszTemp[pT->m_cchCmpTextMax]; - bool bStrValue = false; - - switch(wType) - { - case LVCOLSORT_TEXT: - pFunc = (PFNLVCOMPARE)pT->LVCompareText; - case LVCOLSORT_TEXTNOCASE: - if(pFunc == NULL) - pFunc = (PFNLVCOMPARE)pT->LVCompareTextNoCase; - case LVCOLSORT_CUSTOM: - { - if(pFunc == NULL) - pFunc = (PFNLVCOMPARE)pT->LVCompareCustom; - - for(int i = 0; i < nCount; i++) - { - pParam[i].iItem = i; - pParam[i].dwItemData = pT->GetItemData(i); - pParam[i].pszValue = new TCHAR[pT->m_cchCmpTextMax]; - pT->GetItemText(i, iCol, (LPTSTR)pParam[i].pszValue, pT->m_cchCmpTextMax); - pT->SetItemData(i, (DWORD_PTR)&pParam[i]); - } - bStrValue = true; - } - break; - case LVCOLSORT_LONG: - { - pFunc = (PFNLVCOMPARE)pT->LVCompareLong; - for(int i = 0; i < nCount; i++) - { - pParam[i].iItem = i; - pParam[i].dwItemData = pT->GetItemData(i); - pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax); - pParam[i].lValue = pT->StrToLong(pszTemp); - pT->SetItemData(i, (DWORD_PTR)&pParam[i]); - } - } - break; - case LVCOLSORT_DOUBLE: - { - pFunc = (PFNLVCOMPARE)pT->LVCompareDouble; - for(int i = 0; i < nCount; i++) - { - pParam[i].iItem = i; - pParam[i].dwItemData = pT->GetItemData(i); - pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax); - pParam[i].dblValue = pT->StrToDouble(pszTemp); - pT->SetItemData(i, (DWORD_PTR)&pParam[i]); - } - } - break; - case LVCOLSORT_DECIMAL: - { - pFunc = (PFNLVCOMPARE)pT->LVCompareDecimal; - for(int i = 0; i < nCount; i++) - { - pParam[i].iItem = i; - pParam[i].dwItemData = pT->GetItemData(i); - pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax); - pT->StrToDecimal(pszTemp, &pParam[i].decValue); - pT->SetItemData(i, (DWORD_PTR)&pParam[i]); - } - } - break; - case LVCOLSORT_DATETIME: - case LVCOLSORT_DATE: - case LVCOLSORT_TIME: - { - pFunc = (PFNLVCOMPARE)pT->LVCompareDouble; - DWORD dwFlags = LOCALE_NOUSEROVERRIDE; - if(wType == LVCOLSORT_DATE) - dwFlags |= VAR_DATEVALUEONLY; - else if(wType == LVCOLSORT_TIME) - dwFlags |= VAR_TIMEVALUEONLY; - for(int i = 0; i < nCount; i++) - { - pParam[i].iItem = i; - pParam[i].dwItemData = pT->GetItemData(i); - pT->GetItemText(i, iCol, pszTemp, pT->m_cchCmpTextMax); - pParam[i].dblValue = pT->DateStrToDouble(pszTemp, dwFlags); - pT->SetItemData(i, (DWORD_PTR)&pParam[i]); - } - } - break; - default: - ATLTRACE2(atlTraceUI, 0, _T("Unknown value for sort type in CSortListViewImpl::DoSortItems()\n")); - break; - } // switch(wType) - - ATLASSERT(pFunc != NULL); - LVSortInfo lvsi = { pT, iCol, bDescending }; - bool bRet = ((BOOL)pT->DefWindowProc(LVM_SORTITEMS, (WPARAM)&lvsi, (LPARAM)pFunc) != FALSE); - for(int i = 0; i < nCount; i++) - { - DWORD_PTR dwItemData = pT->GetItemData(i); - LVCompareParam* p = (LVCompareParam*)dwItemData; - ATLASSERT(p != NULL); - if(bStrValue) - delete [] (TCHAR*)p->pszValue; - pT->SetItemData(i, p->dwItemData); - } - delete [] pParam; - - if(bRet) - { - m_bSortDescending = bDescending; - SetSortColumn(iCol); - } - - if(m_bUseWaitCursor) - waitCursor.Restore(); - - return bRet; - } - - void CreateSortBitmaps() - { - if((m_dwSortLVExtendedStyle & SORTLV_USESHELLBITMAPS) != 0) - { - bool bFree = false; - LPCTSTR pszModule = _T("shell32.dll"); - HINSTANCE hShell = ::GetModuleHandle(pszModule); - - if (hShell == NULL) - { - hShell = ::LoadLibrary(pszModule); - bFree = true; - } - - if (hShell != NULL) - { - bool bSuccess = true; - for(int i = m_iSortUp; i <= m_iSortDown; i++) - { - if(!m_bmSort[i].IsNull()) - m_bmSort[i].DeleteObject(); - m_bmSort[i] = (HBITMAP)::LoadImage(hShell, MAKEINTRESOURCE(m_nShellSortUpID + i), -#ifndef _WIN32_WCE - IMAGE_BITMAP, 0, 0, LR_LOADMAP3DCOLORS); -#else // CE specific - IMAGE_BITMAP, 0, 0, 0); -#endif // _WIN32_WCE - if(m_bmSort[i].IsNull()) - { - bSuccess = false; - break; - } - } - if(bFree) - ::FreeLibrary(hShell); - if(bSuccess) - return; - } - } - - T* pT = static_cast(this); - for(int i = m_iSortUp; i <= m_iSortDown; i++) - { - if(!m_bmSort[i].IsNull()) - m_bmSort[i].DeleteObject(); - - CDC dcMem; - CClientDC dc(::GetDesktopWindow()); - dcMem.CreateCompatibleDC(dc.m_hDC); - m_bmSort[i].CreateCompatibleBitmap(dc.m_hDC, m_cxSortImage, m_cySortImage); - HBITMAP hbmOld = dcMem.SelectBitmap(m_bmSort[i]); - RECT rc = {0,0,m_cxSortImage, m_cySortImage}; - pT->DrawSortBitmap(dcMem.m_hDC, i, &rc); - dcMem.SelectBitmap(hbmOld); - dcMem.DeleteDC(); - } - } - - void NotifyParentSortChanged(int iNewSortCol, int iOldSortCol) - { - T* pT = static_cast(this); - int nID = pT->GetDlgCtrlID(); - NMSORTLISTVIEW nm = { { pT->m_hWnd, nID, SLVN_SORTCHANGED }, iNewSortCol, iOldSortCol }; - ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nID, (LPARAM)&nm); - } - -// Overrideables - int CompareItemsCustom(LVCompareParam* /*pItem1*/, LVCompareParam* /*pItem2*/, int /*iSortCol*/) - { - // pItem1 and pItem2 contain valid iItem, dwItemData, and pszValue members. - // If item1 > item2 return 1, if item1 < item2 return -1, else return 0. - return 0; - } - - void DrawSortBitmap(CDCHandle dc, int iBitmap, LPRECT prc) - { - dc.FillRect(prc, ::GetSysColorBrush(COLOR_BTNFACE)); - HBRUSH hbrOld = dc.SelectBrush(::GetSysColorBrush(COLOR_BTNSHADOW)); - CPen pen; - pen.CreatePen(PS_SOLID, 0, ::GetSysColor(COLOR_BTNSHADOW)); - HPEN hpenOld = dc.SelectPen(pen); - POINT ptOrg = { (m_cxSortImage - m_cxSortArrow) / 2, (m_cySortImage - m_cySortArrow) / 2 }; - if(iBitmap == m_iSortUp) - { - POINT pts[3] = - { - { ptOrg.x + m_cxSortArrow / 2, ptOrg.y }, - { ptOrg.x, ptOrg.y + m_cySortArrow - 1 }, - { ptOrg.x + m_cxSortArrow - 1, ptOrg.y + m_cySortArrow - 1 } - }; - dc.Polygon(pts, 3); - } - else - { - POINT pts[3] = - { - { ptOrg.x, ptOrg.y }, - { ptOrg.x + m_cxSortArrow / 2, ptOrg.y + m_cySortArrow - 1 }, - { ptOrg.x + m_cxSortArrow - 1, ptOrg.y } - }; - dc.Polygon(pts, 3); - } - dc.SelectBrush(hbrOld); - dc.SelectPen(hpenOld); - } - - double DateStrToDouble(LPCTSTR lpstr, DWORD dwFlags) - { - ATLASSERT(lpstr != NULL); - if(lpstr == NULL || lpstr[0] == _T('\0')) - return 0; - - USES_CONVERSION; - HRESULT hRet = E_FAIL; - DATE dRet = 0; - if (FAILED(hRet = ::VarDateFromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, dwFlags, &dRet))) - { - ATLTRACE2(atlTraceUI, 0, _T("VarDateFromStr failed with result of 0x%8.8X\n"), hRet); - dRet = 0; - } - return dRet; - } - - long StrToLong(LPCTSTR lpstr) - { - ATLASSERT(lpstr != NULL); - if(lpstr == NULL || lpstr[0] == _T('\0')) - return 0; - - USES_CONVERSION; - HRESULT hRet = E_FAIL; - long lRet = 0; - if (FAILED(hRet = ::VarI4FromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &lRet))) - { - ATLTRACE2(atlTraceUI, 0, _T("VarI4FromStr failed with result of 0x%8.8X\n"), hRet); - lRet = 0; - } - return lRet; - } - - double StrToDouble(LPCTSTR lpstr) - { - ATLASSERT(lpstr != NULL); - if(lpstr == NULL || lpstr[0] == _T('\0')) - return 0; - - USES_CONVERSION; - HRESULT hRet = E_FAIL; - double dblRet = 0; - if (FAILED(hRet = ::VarR8FromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, &dblRet))) - { - ATLTRACE2(atlTraceUI, 0, _T("VarR8FromStr failed with result of 0x%8.8X\n"), hRet); - dblRet = 0; - } - return dblRet; - } - - bool StrToDecimal(LPCTSTR lpstr, DECIMAL* pDecimal) - { - ATLASSERT(lpstr != NULL); - ATLASSERT(pDecimal != NULL); - if(lpstr == NULL || pDecimal == NULL) - return false; - - USES_CONVERSION; - HRESULT hRet = E_FAIL; - if (FAILED(hRet = ::VarDecFromStr((LPOLESTR)T2COLE(lpstr), LANG_USER_DEFAULT, LOCALE_NOUSEROVERRIDE, pDecimal))) - { - ATLTRACE2(atlTraceUI, 0, _T("VarDecFromStr failed with result of 0x%8.8X\n"), hRet); - pDecimal->Lo64 = 0; - pDecimal->Hi32 = 0; - pDecimal->signscale = 0; - return false; - } - return true; - } - -// Overrideable PFNLVCOMPARE functions - static int CALLBACK LVCompareText(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) - { - ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); - - LVCompareParam* pParam1 = (LVCompareParam*)lParam1; - LVCompareParam* pParam2 = (LVCompareParam*)lParam2; - LVSortInfo* pInfo = (LVSortInfo*)lParamSort; - - int nRet = lstrcmp(pParam1->pszValue, pParam2->pszValue); - return pInfo->bDescending ? -nRet : nRet; - } - - static int CALLBACK LVCompareTextNoCase(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) - { - ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); - - LVCompareParam* pParam1 = (LVCompareParam*)lParam1; - LVCompareParam* pParam2 = (LVCompareParam*)lParam2; - LVSortInfo* pInfo = (LVSortInfo*)lParamSort; - - int nRet = lstrcmpi(pParam1->pszValue, pParam2->pszValue); - return pInfo->bDescending ? -nRet : nRet; - } - - static int CALLBACK LVCompareLong(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) - { - ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); - - LVCompareParam* pParam1 = (LVCompareParam*)lParam1; - LVCompareParam* pParam2 = (LVCompareParam*)lParam2; - LVSortInfo* pInfo = (LVSortInfo*)lParamSort; - - int nRet = 0; - if(pParam1->lValue > pParam2->lValue) - nRet = 1; - else if(pParam1->lValue < pParam2->lValue) - nRet = -1; - return pInfo->bDescending ? -nRet : nRet; - } - - static int CALLBACK LVCompareDouble(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) - { - ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); - - LVCompareParam* pParam1 = (LVCompareParam*)lParam1; - LVCompareParam* pParam2 = (LVCompareParam*)lParam2; - LVSortInfo* pInfo = (LVSortInfo*)lParamSort; - - int nRet = 0; - if(pParam1->dblValue > pParam2->dblValue) - nRet = 1; - else if(pParam1->dblValue < pParam2->dblValue) - nRet = -1; - return pInfo->bDescending ? -nRet : nRet; - } - - static int CALLBACK LVCompareCustom(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) - { - ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); - - LVCompareParam* pParam1 = (LVCompareParam*)lParam1; - LVCompareParam* pParam2 = (LVCompareParam*)lParam2; - LVSortInfo* pInfo = (LVSortInfo*)lParamSort; - - int nRet = pInfo->pT->CompareItemsCustom(pParam1, pParam2, pInfo->iSortCol); - return pInfo->bDescending ? -nRet : nRet; - } - -#ifndef _WIN32_WCE - static int CALLBACK LVCompareDecimal(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) - { - ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); - - LVCompareParam* pParam1 = (LVCompareParam*)lParam1; - LVCompareParam* pParam2 = (LVCompareParam*)lParam2; - LVSortInfo* pInfo = (LVSortInfo*)lParamSort; - - int nRet = (int)::VarDecCmp(&pParam1->decValue, &pParam2->decValue); - nRet--; - return pInfo->bDescending ? -nRet : nRet; - } -#else - // Compare mantissas, ignore sign and scale - static int CompareMantissas(const DECIMAL& decLeft, const DECIMAL& decRight) - { - if (decLeft.Hi32 < decRight.Hi32) - { - return -1; - } - if (decLeft.Hi32 > decRight.Hi32) - { - return 1; - } - // Here, decLeft.Hi32 == decRight.Hi32 - if (decLeft.Lo64 < decRight.Lo64) - { - return -1; - } - if (decLeft.Lo64 > decRight.Lo64) - { - return 1; - } - return 0; - } - - // return values: VARCMP_LT, VARCMP_EQ, VARCMP_GT, VARCMP_NULL - static HRESULT VarDecCmp(const DECIMAL* pdecLeft, const DECIMAL* pdecRight) - { - static const ULONG powersOfTen[] = - { - 10ul, - 100ul, - 1000ul, - 10000ul, - 100000ul, - 1000000ul, - 10000000ul, - 100000000ul, - 1000000000ul - }; - static const int largestPower = sizeof(powersOfTen) / sizeof(powersOfTen[0]); - if (!pdecLeft || !pdecRight) - { - return VARCMP_NULL; - } - - // Degenerate case - at least one comparand is of the form - // [+-]0*10^N (denormalized zero) - bool bLeftZero = (!pdecLeft->Lo64 && !pdecLeft->Hi32); - bool bRightZero = (!pdecRight->Lo64 && !pdecRight->Hi32); - if (bLeftZero && bRightZero) - { - return VARCMP_EQ; - } - bool bLeftNeg = ((pdecLeft->sign & DECIMAL_NEG) != 0); - bool bRightNeg = ((pdecRight->sign & DECIMAL_NEG) != 0); - if (bLeftZero) - { - return (bRightNeg ? VARCMP_GT : VARCMP_LT); - } - // This also covers the case where the comparands have different signs - if (bRightZero || bLeftNeg != bRightNeg) - { - return (bLeftNeg ? VARCMP_LT : VARCMP_GT); - } - - // Here both comparands have the same sign and need to be compared - // on mantissa and scale. The result is obvious when - // 1. Scales are equal (then compare mantissas) - // 2. A number with smaller scale is also the one with larger mantissa - // (then this number is obviously larger) - // In the remaining case, we would multiply the number with smaller - // scale by 10 and simultaneously increment its scale (which amounts to - // adding trailing zeros after decimal point), until the numbers fall under - // one of the two cases above - DECIMAL temp; - bool bInvert = bLeftNeg; // the final result needs to be inverted - if (pdecLeft->scale < pdecRight->scale) - { - temp = *pdecLeft; - } - else - { - temp = *pdecRight; - pdecRight = pdecLeft; - bInvert = !bInvert; - } - - // Now temp is the number with smaller (or equal) scale, and - // we can modify it freely without touching original parameters - int comp; - while ((comp = CompareMantissas(temp, *pdecRight)) < 0 && - temp.scale < pdecRight->scale) - { - // Multiply by an appropriate power of 10 - int scaleDiff = pdecRight->scale - temp.scale; - if (scaleDiff > largestPower) - { - // Keep the multiplier representable in 32bit - scaleDiff = largestPower; - } - DWORDLONG power = powersOfTen[scaleDiff - 1]; - // Multiply temp's mantissa by power - DWORDLONG product = temp.Lo32 * power; - ULONG carry = static_cast(product >> 32); - temp.Lo32 = static_cast(product); - product = temp.Mid32 * power + carry; - carry = static_cast(product >> 32); - temp.Mid32 = static_cast(product); - product = temp.Hi32 * power + carry; - if (static_cast(product >> 32)) - { - // Multiplication overflowed - pdecLeft is clearly larger - break; - } - temp.Hi32 = static_cast(product); - temp.scale = (BYTE)(temp.scale + scaleDiff); - } - if (temp.scale < pdecRight->scale) - { - comp = 1; - } - if (bInvert) - { - comp = -comp; - } - return (comp > 0 ? VARCMP_GT : comp < 0 ? VARCMP_LT : VARCMP_EQ); - } - - static int CALLBACK LVCompareDecimal(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) - { - ATLASSERT(lParam1 != NULL && lParam2 != NULL && lParamSort != NULL); - - LVCompareParam* pParam1 = (LVCompareParam*)lParam1; - LVCompareParam* pParam2 = (LVCompareParam*)lParam2; - LVSortInfo* pInfo = (LVSortInfo*)lParamSort; - - int nRet = (int)VarDecCmp(&pParam1->decValue, &pParam2->decValue); - nRet--; - return pInfo->bDescending ? -nRet : nRet; - } -#endif // !_WIN32_WCE - - BEGIN_MSG_MAP(CSortListViewImpl) - MESSAGE_HANDLER(LVM_INSERTCOLUMN, OnInsertColumn) - MESSAGE_HANDLER(LVM_DELETECOLUMN, OnDeleteColumn) - NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, OnHeaderItemClick) - NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, OnHeaderItemClick) - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) - END_MSG_MAP() - - LRESULT OnInsertColumn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam); - if(lRet == -1) - return -1; - - WORD wType = 0; - m_arrColSortType.Add(wType); - int nCount = m_arrColSortType.GetSize(); - ATLASSERT(nCount == GetColumnCount()); - - for(int i = nCount - 1; i > lRet; i--) - m_arrColSortType[i] = m_arrColSortType[i - 1]; - m_arrColSortType[(int)lRet] = LVCOLSORT_TEXT; - - if(lRet <= m_iSortColumn) - m_iSortColumn++; - - return lRet; - } - - LRESULT OnDeleteColumn(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam); - if(lRet == 0) - return 0; - - int iCol = (int)wParam; - if(m_iSortColumn == iCol) - m_iSortColumn = -1; - else if(m_iSortColumn > iCol) - m_iSortColumn--; - m_arrColSortType.RemoveAt(iCol); - - return lRet; - } - - LRESULT OnHeaderItemClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) - { - LPNMHEADER p = (LPNMHEADER)pnmh; - if(p->iButton == 0) - { - int iOld = m_iSortColumn; - bool bDescending = (m_iSortColumn == p->iItem) ? !m_bSortDescending : false; - if(DoSortItems(p->iItem, bDescending)) - NotifyParentSortChanged(p->iItem, iOld); - } - bHandled = FALSE; - return 0; - } - - LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifndef _WIN32_WCE - if(wParam == SPI_SETNONCLIENTMETRICS) - GetSystemSettings(); -#else // CE specific - wParam; // avoid level 4 warning - GetSystemSettings(); -#endif // _WIN32_WCE - bHandled = FALSE; - return 0; - } - - void GetSystemSettings() - { - if(!m_bCommCtrl6 && !m_bmSort[m_iSortUp].IsNull()) - { - T* pT = static_cast(this); - pT->CreateSortBitmaps(); - if(m_iSortColumn != -1) - SetSortColumn(m_iSortColumn); - } - } - -}; - - -typedef ATL::CWinTraits CSortListViewCtrlTraits; - -template -class ATL_NO_VTABLE CSortListViewCtrlImpl: public ATL::CWindowImpl, public CSortListViewImpl -{ -public: - DECLARE_WND_SUPERCLASS(NULL, TBase::GetWndClassName()) - - bool SortItems(int iCol, bool bDescending = false) - { - return DoSortItems(iCol, bDescending); - } - - BEGIN_MSG_MAP(CSortListViewCtrlImpl) - MESSAGE_HANDLER(LVM_INSERTCOLUMN, CSortListViewImpl::OnInsertColumn) - MESSAGE_HANDLER(LVM_DELETECOLUMN, CSortListViewImpl::OnDeleteColumn) - NOTIFY_CODE_HANDLER(HDN_ITEMCLICKA, CSortListViewImpl::OnHeaderItemClick) - NOTIFY_CODE_HANDLER(HDN_ITEMCLICKW, CSortListViewImpl::OnHeaderItemClick) - MESSAGE_HANDLER(WM_SETTINGCHANGE, CSortListViewImpl::OnSettingChange) - END_MSG_MAP() -}; - -class CSortListViewCtrl : public CSortListViewCtrlImpl -{ -public: - DECLARE_WND_SUPERCLASS(_T("WTL_SortListViewCtrl"), GetWndClassName()) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CTabView - implements tab view window - -// TabView Notifications -#define TBVN_PAGEACTIVATED (0U-741) -#define TBVN_CONTEXTMENU (0U-742) - -// Notification data for TBVN_CONTEXTMENU -struct TBVCONTEXTMENUINFO -{ - NMHDR hdr; - POINT pt; -}; - -typedef TBVCONTEXTMENUINFO* LPTBVCONTEXTMENUINFO; - - -template -class ATL_NO_VTABLE CTabViewImpl : public ATL::CWindowImpl -{ -public: - DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE) - -// Declarations and enums - struct TABVIEWPAGE - { - HWND hWnd; - LPTSTR lpstrTitle; - LPVOID pData; - }; - - struct TCITEMEXTRA - { - TCITEMHEADER tciheader; - TABVIEWPAGE tvpage; - - operator LPTCITEM() { return (LPTCITEM)this; } - }; - - enum - { - m_nTabID = 1313, - m_cxMoveMark = 6, - m_cyMoveMark = 3, - m_nMenuItemsMax = (ID_WINDOW_TABLAST - ID_WINDOW_TABFIRST + 1) - }; - -// Data members - ATL::CContainedWindowT m_tab; - int m_cyTabHeight; - - int m_nActivePage; - - int m_nInsertItem; - POINT m_ptStartDrag; - - CMenuHandle m_menu; - - int m_cchTabTextLength; - - int m_nMenuItemsCount; - - ATL::CWindow m_wndTitleBar; - LPTSTR m_lpstrTitleBarBase; - int m_cchTitleBarLength; - - CImageList m_ilDrag; - - bool m_bDestroyPageOnRemove:1; - bool m_bDestroyImageList:1; - bool m_bActivePageMenuItem:1; - bool m_bActiveAsDefaultMenuItem:1; - bool m_bEmptyMenuItem:1; - bool m_bWindowsMenuItem:1; - bool m_bNoTabDrag:1; - // internal - bool m_bTabCapture:1; - bool m_bTabDrag:1; - bool m_bInternalFont:1; - -// Constructor/destructor - CTabViewImpl() : - m_nActivePage(-1), - m_cyTabHeight(0), - m_tab(this, 1), - m_nInsertItem(-1), - m_cchTabTextLength(30), - m_nMenuItemsCount(10), - m_lpstrTitleBarBase(NULL), - m_cchTitleBarLength(100), - m_bDestroyPageOnRemove(true), - m_bDestroyImageList(true), - m_bActivePageMenuItem(true), - m_bActiveAsDefaultMenuItem(false), - m_bEmptyMenuItem(false), - m_bWindowsMenuItem(false), - m_bNoTabDrag(false), - m_bTabCapture(false), - m_bTabDrag(false), - m_bInternalFont(false) - { - m_ptStartDrag.x = 0; - m_ptStartDrag.y = 0; - } - - ~CTabViewImpl() - { - delete [] m_lpstrTitleBarBase; - } - -// Message filter function - to be called from PreTranslateMessage of the main window - BOOL PreTranslateMessage(MSG* pMsg) - { - if(IsWindow() == FALSE) - return FALSE; - - BOOL bRet = FALSE; - - // Check for TabView built-in accelerators (Ctrl+Tab/Ctrl+Shift+Tab - next/previous page) - int nCount = GetPageCount(); - if(nCount > 0) - { - bool bControl = (::GetKeyState(VK_CONTROL) < 0); - if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == VK_TAB) && bControl) - { - if(nCount > 1) - { - int nPage = m_nActivePage; - bool bShift = (::GetKeyState(VK_SHIFT) < 0); - if(bShift) - nPage = (nPage > 0) ? (nPage - 1) : (nCount - 1); - else - nPage = ((nPage >= 0) && (nPage < (nCount - 1))) ? (nPage + 1) : 0; - - SetActivePage(nPage); - T* pT = static_cast(this); - pT->OnPageActivated(m_nActivePage); - } - - bRet = TRUE; - } - } - - // If we are doing drag-drop, check for Escape key that cancels it - if(bRet == FALSE) - { - if(m_bTabCapture && pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) - { - ::ReleaseCapture(); - bRet = TRUE; - } - } - - // Pass the message to the active page - if(bRet == FALSE) - { - if(m_nActivePage != -1) - bRet = (BOOL)::SendMessage(GetPageHWND(m_nActivePage), WM_FORWARDMSG, 0, (LPARAM)pMsg); - } - - return bRet; - } - -// Attributes - int GetPageCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return m_tab.GetItemCount(); - } - - int GetActivePage() const - { - return m_nActivePage; - } - - void SetActivePage(int nPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - T* pT = static_cast(this); - - SetRedraw(FALSE); - - if(m_nActivePage != -1) - ::ShowWindow(GetPageHWND(m_nActivePage), FALSE); - m_nActivePage = nPage; - m_tab.SetCurSel(m_nActivePage); - ::ShowWindow(GetPageHWND(m_nActivePage), TRUE); - - pT->UpdateLayout(); - - SetRedraw(TRUE); - RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); - - if(::GetFocus() != m_tab.m_hWnd) - ::SetFocus(GetPageHWND(m_nActivePage)); - - pT->UpdateTitleBar(); - pT->UpdateMenu(); - } - - HIMAGELIST GetImageList() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return m_tab.GetImageList(); - } - - HIMAGELIST SetImageList(HIMAGELIST hImageList) - { - ATLASSERT(::IsWindow(m_hWnd)); - return m_tab.SetImageList(hImageList); - } - - void SetWindowMenu(HMENU hMenu) - { - ATLASSERT(::IsWindow(m_hWnd)); - - m_menu = hMenu; - - T* pT = static_cast(this); - pT->UpdateMenu(); - } - - void SetTitleBarWindow(HWND hWnd) - { - ATLASSERT(::IsWindow(m_hWnd)); - - delete [] m_lpstrTitleBarBase; - m_lpstrTitleBarBase = NULL; - - m_wndTitleBar = hWnd; - if(hWnd == NULL) - return; - - int cchLen = m_wndTitleBar.GetWindowTextLength() + 1; - ATLTRY(m_lpstrTitleBarBase = new TCHAR[cchLen]); - if(m_lpstrTitleBarBase != NULL) - { - m_wndTitleBar.GetWindowText(m_lpstrTitleBarBase, cchLen); - T* pT = static_cast(this); - pT->UpdateTitleBar(); - } - } - -// Page attributes - HWND GetPageHWND(int nPage) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_PARAM; - m_tab.GetItem(nPage, tcix); - - return tcix.tvpage.hWnd; - } - - LPCTSTR GetPageTitle(int nPage) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_PARAM; - if(m_tab.GetItem(nPage, tcix) == FALSE) - return NULL; - - return tcix.tvpage.lpstrTitle; - } - - bool SetPageTitle(int nPage, LPCTSTR lpstrTitle) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - T* pT = static_cast(this); - - int cchBuff = lstrlen(lpstrTitle) + 1; - LPTSTR lpstrBuff = NULL; - ATLTRY(lpstrBuff = new TCHAR[cchBuff]); - if(lpstrBuff == NULL) - return false; - - SecureHelper::strcpy_x(lpstrBuff, cchBuff, lpstrTitle); - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_PARAM; - if(m_tab.GetItem(nPage, tcix) == FALSE) - return false; - - CTempBuffer buff; - LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1); - if(lpstrTabText == NULL) - return false; - - delete [] tcix.tvpage.lpstrTitle; - - pT->ShortenTitle(lpstrTitle, lpstrTabText, m_cchTabTextLength + 1); - - tcix.tciheader.mask = TCIF_TEXT | TCIF_PARAM; - tcix.tciheader.pszText = lpstrTabText; - tcix.tvpage.lpstrTitle = lpstrBuff; - if(m_tab.SetItem(nPage, tcix) == FALSE) - return false; - - pT->UpdateTitleBar(); - pT->UpdateMenu(); - - return true; - } - - LPVOID GetPageData(int nPage) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_PARAM; - m_tab.GetItem(nPage, tcix); - - return tcix.tvpage.pData; - } - - LPVOID SetPageData(int nPage, LPVOID pData) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_PARAM; - m_tab.GetItem(nPage, tcix); - LPVOID pDataOld = tcix.tvpage.pData; - - tcix.tvpage.pData = pData; - m_tab.SetItem(nPage, tcix); - - return pDataOld; - } - - int GetPageImage(int nPage) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_IMAGE; - m_tab.GetItem(nPage, tcix); - - return tcix.tciheader.iImage; - } - - int SetPageImage(int nPage, int nImage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_IMAGE; - m_tab.GetItem(nPage, tcix); - int nImageOld = tcix.tciheader.iImage; - - tcix.tciheader.iImage = nImage; - m_tab.SetItem(nPage, tcix); - - return nImageOld; - } - -// Operations - bool AddPage(HWND hWndView, LPCTSTR lpstrTitle, int nImage = -1, LPVOID pData = NULL) - { - return InsertPage(GetPageCount(), hWndView, lpstrTitle, nImage, pData); - } - - bool InsertPage(int nPage, HWND hWndView, LPCTSTR lpstrTitle, int nImage = -1, LPVOID pData = NULL) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(nPage == GetPageCount() || IsValidPageIndex(nPage)); - - T* pT = static_cast(this); - - int cchBuff = lstrlen(lpstrTitle) + 1; - LPTSTR lpstrBuff = NULL; - ATLTRY(lpstrBuff = new TCHAR[cchBuff]); - if(lpstrBuff == NULL) - return false; - - SecureHelper::strcpy_x(lpstrBuff, cchBuff, lpstrTitle); - - CTempBuffer buff; - LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1); - if(lpstrTabText == NULL) - return false; - - pT->ShortenTitle(lpstrTitle, lpstrTabText, m_cchTabTextLength + 1); - - SetRedraw(FALSE); - - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM; - tcix.tciheader.pszText = lpstrTabText; - tcix.tciheader.iImage = nImage; - tcix.tvpage.hWnd = hWndView; - tcix.tvpage.lpstrTitle = lpstrBuff; - tcix.tvpage.pData = pData; - int nItem = m_tab.InsertItem(nPage, tcix); - if(nItem == -1) - { - delete [] lpstrBuff; - SetRedraw(TRUE); - return false; - } - - SetActivePage(nItem); - pT->OnPageActivated(m_nActivePage); - - if(GetPageCount() == 1) - pT->ShowTabControl(true); - - pT->UpdateLayout(); - - SetRedraw(TRUE); - RedrawWindow(NULL, NULL, RDW_FRAME | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); - - return true; - } - - void RemovePage(int nPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(IsValidPageIndex(nPage)); - - T* pT = static_cast(this); - - SetRedraw(FALSE); - - if(GetPageCount() == 1) - pT->ShowTabControl(false); - - if(m_bDestroyPageOnRemove) - ::DestroyWindow(GetPageHWND(nPage)); - else - ::ShowWindow(GetPageHWND(nPage), FALSE); - LPTSTR lpstrTitle = (LPTSTR)GetPageTitle(nPage); - delete [] lpstrTitle; - - ATLVERIFY(m_tab.DeleteItem(nPage) != FALSE); - - if(m_nActivePage == nPage) - { - m_nActivePage = -1; - - if(nPage > 0) - { - SetActivePage(nPage - 1); - } - else if(GetPageCount() > 0) - { - SetActivePage(nPage); - } - else - { - SetRedraw(TRUE); - Invalidate(); - UpdateWindow(); - pT->UpdateTitleBar(); - pT->UpdateMenu(); - } - } - else - { - nPage = (nPage < m_nActivePage) ? (m_nActivePage - 1) : m_nActivePage; - m_nActivePage = -1; - SetActivePage(nPage); - } - - pT->OnPageActivated(m_nActivePage); - } - - void RemoveAllPages() - { - ATLASSERT(::IsWindow(m_hWnd)); - - if(GetPageCount() == 0) - return; - - T* pT = static_cast(this); - - SetRedraw(FALSE); - - pT->ShowTabControl(false); - - for(int i = 0; i < GetPageCount(); i++) - { - if(m_bDestroyPageOnRemove) - ::DestroyWindow(GetPageHWND(i)); - else - ::ShowWindow(GetPageHWND(i), FALSE); - LPTSTR lpstrTitle = (LPTSTR)GetPageTitle(i); - delete [] lpstrTitle; - } - m_tab.DeleteAllItems(); - - m_nActivePage = -1; - pT->OnPageActivated(m_nActivePage); - - SetRedraw(TRUE); - Invalidate(); - UpdateWindow(); - - pT->UpdateTitleBar(); - pT->UpdateMenu(); - } - - int PageIndexFromHwnd(HWND hWnd) const - { - int nIndex = -1; - - for(int i = 0; i < GetPageCount(); i++) - { - if(GetPageHWND(i) == hWnd) - { - nIndex = i; - break; - } - } - - return nIndex; - } - - void BuildWindowMenu(HMENU hMenu, int nMenuItemsCount = 10, bool bEmptyMenuItem = true, bool bWindowsMenuItem = true, bool bActivePageMenuItem = true, bool bActiveAsDefaultMenuItem = false) - { - ATLASSERT(::IsWindow(m_hWnd)); - - CMenuHandle menu = hMenu; - T* pT = static_cast(this); - pT; // avoid level 4 warning - int nFirstPos = 0; - - // Find first menu item in our range -#ifndef _WIN32_WCE - for(nFirstPos = 0; nFirstPos < menu.GetMenuItemCount(); nFirstPos++) - { - UINT nID = menu.GetMenuItemID(nFirstPos); - if((nID >= ID_WINDOW_TABFIRST && nID <= ID_WINDOW_TABLAST) || nID == ID_WINDOW_SHOWTABLIST) - break; - } -#else // CE specific - for(nFirstPos = 0; ; nFirstPos++) - { - CMenuItemInfo mii; - mii.fMask = MIIM_ID; - BOOL bRet = menu.GetMenuItemInfo(nFirstPos, TRUE, &mii); - if(bRet == FALSE) - break; - if((mii.wID >= ID_WINDOW_TABFIRST && mii.wID <= ID_WINDOW_TABLAST) || mii.wID == ID_WINDOW_SHOWTABLIST) - break; - } -#endif // _WIN32_WCE - - // Remove all menu items for tab pages - BOOL bRet = TRUE; - while(bRet != FALSE) - bRet = menu.DeleteMenu(nFirstPos, MF_BYPOSITION); - - // Add separator if it's not already there - int nPageCount = GetPageCount(); - if((bWindowsMenuItem || (nPageCount > 0)) && (nFirstPos > 0)) - { - CMenuItemInfo mii; - mii.fMask = MIIM_TYPE; - menu.GetMenuItemInfo(nFirstPos - 1, TRUE, &mii); - if((nFirstPos <= 0) || ((mii.fType & MFT_SEPARATOR) == 0)) - { - menu.AppendMenu(MF_SEPARATOR); - nFirstPos++; - } - } - - // Add menu items for all pages - if(nPageCount > 0) - { - // Append menu items for all pages - const int cchPrefix = 3; // 2 digits + space - nMenuItemsCount = min(min(nPageCount, nMenuItemsCount), (int)m_nMenuItemsMax); - ATLASSERT(nMenuItemsCount < 100); // 2 digits only - if(nMenuItemsCount >= 100) - nMenuItemsCount = 99; - - for(int i = 0; i < nMenuItemsCount; i++) - { - LPCTSTR lpstrTitle = GetPageTitle(i); - int nLen = lstrlen(lpstrTitle); - CTempBuffer buff; - LPTSTR lpstrText = buff.Allocate(cchPrefix + nLen + 1); - ATLASSERT(lpstrText != NULL); - if(lpstrText != NULL) - { - LPCTSTR lpstrFormat = (i < 9) ? _T("&%i %s") : _T("%i %s"); - SecureHelper::wsprintf_x(lpstrText, cchPrefix + nLen + 1, lpstrFormat, i + 1, lpstrTitle); - menu.AppendMenu(MF_STRING, ID_WINDOW_TABFIRST + i, lpstrText); - } - } - - // Mark active page - if(bActivePageMenuItem && (m_nActivePage != -1)) - { -#ifndef _WIN32_WCE - if(bActiveAsDefaultMenuItem) - { - menu.SetMenuDefaultItem((UINT)-1, TRUE); - menu.SetMenuDefaultItem(nFirstPos + m_nActivePage, TRUE); - } - else -#else // CE specific - bActiveAsDefaultMenuItem; // avoid level 4 warning -#endif // _WIN32_WCE - { - menu.CheckMenuRadioItem(nFirstPos, nFirstPos + nMenuItemsCount, nFirstPos + m_nActivePage, MF_BYPOSITION); - } - } - } - else - { - if(bEmptyMenuItem) - { - menu.AppendMenu(MF_BYPOSITION | MF_STRING, ID_WINDOW_TABFIRST, pT->GetEmptyListText()); - menu.EnableMenuItem(ID_WINDOW_TABFIRST, MF_GRAYED); - } - - // Remove separator if nothing else is there - if(!bEmptyMenuItem && !bWindowsMenuItem && (nFirstPos > 0)) - { - CMenuItemInfo mii; - mii.fMask = MIIM_TYPE; - menu.GetMenuItemInfo(nFirstPos - 1, TRUE, &mii); - if((mii.fType & MFT_SEPARATOR) != 0) - menu.DeleteMenu(nFirstPos - 1, MF_BYPOSITION); - } - } - - // Add "Windows..." menu item - if(bWindowsMenuItem) - menu.AppendMenu(MF_BYPOSITION | MF_STRING, ID_WINDOW_SHOWTABLIST, pT->GetWindowsMenuItemText()); - } - -// Message map and handlers - BEGIN_MSG_MAP(CTabViewImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) - MESSAGE_HANDLER(WM_GETFONT, OnGetFont) - MESSAGE_HANDLER(WM_SETFONT, OnSetFont) - NOTIFY_HANDLER(m_nTabID, TCN_SELCHANGE, OnTabChanged) - NOTIFY_ID_HANDLER(m_nTabID, OnTabNotification) -#ifndef _WIN32_WCE - NOTIFY_CODE_HANDLER(TTN_GETDISPINFO, OnTabGetDispInfo) -#endif // !_WIN32_WCE - FORWARD_NOTIFICATIONS() - ALT_MSG_MAP(1) // tab control - MESSAGE_HANDLER(WM_LBUTTONDOWN, OnTabLButtonDown) - MESSAGE_HANDLER(WM_LBUTTONUP, OnTabLButtonUp) - MESSAGE_HANDLER(WM_CAPTURECHANGED, OnTabCaptureChanged) - MESSAGE_HANDLER(WM_MOUSEMOVE, OnTabMouseMove) - MESSAGE_HANDLER(WM_RBUTTONUP, OnTabRButtonUp) - MESSAGE_HANDLER(WM_SYSKEYDOWN, OnTabSysKeyDown) - END_MSG_MAP() - - LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->CreateTabControl(); - - return 0; - } - - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - RemoveAllPages(); - - if(m_bDestroyImageList) - { - CImageList il = m_tab.SetImageList(NULL); - if(il.m_hImageList != NULL) - il.Destroy(); - } - - if(m_bInternalFont) - { - HFONT hFont = m_tab.GetFont(); - m_tab.SetFont(NULL, FALSE); - ::DeleteObject(hFont); - m_bInternalFont = false; - } - - return 0; - } - - LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->UpdateLayout(); - return 0; - } - - LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(m_nActivePage != -1) - ::SetFocus(GetPageHWND(m_nActivePage)); - return 0; - } - - LRESULT OnGetFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return m_tab.SendMessage(WM_GETFONT); - } - - LRESULT OnSetFont(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - if(m_bInternalFont) - { - HFONT hFont = m_tab.GetFont(); - m_tab.SetFont(NULL, FALSE); - ::DeleteObject(hFont); - m_bInternalFont = false; - } - - m_tab.SendMessage(WM_SETFONT, wParam, lParam); - - T* pT = static_cast(this); - m_cyTabHeight = pT->CalcTabHeight(); - - if((BOOL)lParam != FALSE) - pT->UpdateLayout(); - - return 0; - } - - LRESULT OnTabChanged(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) - { - SetActivePage(m_tab.GetCurSel()); - T* pT = static_cast(this); - pT->OnPageActivated(m_nActivePage); - - return 0; - } - - LRESULT OnTabNotification(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) - { - // nothing to do - this just blocks all tab control - // notifications from being propagated further - return 0; - } - -#ifndef _WIN32_WCE - LRESULT OnTabGetDispInfo(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) - { - LPNMTTDISPINFO pTTDI = (LPNMTTDISPINFO)pnmh; - if(pTTDI->hdr.hwndFrom == m_tab.GetTooltips()) - { - T* pT = static_cast(this); - pT->UpdateTooltipText(pTTDI); - } - else - { - bHandled = FALSE; - } - - return 0; - } -#endif // !_WIN32_WCE - -// Tab control message handlers - LRESULT OnTabLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(!m_bNoTabDrag && (m_tab.GetItemCount() > 1)) - { - m_bTabCapture = true; - m_tab.SetCapture(); - - m_ptStartDrag.x = GET_X_LPARAM(lParam); - m_ptStartDrag.y = GET_Y_LPARAM(lParam); - } - - bHandled = FALSE; - return 0; - } - - LRESULT OnTabLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(m_bTabCapture) - { - if(m_bTabDrag) - { - TCHITTESTINFO hti = { 0 }; - hti.pt.x = GET_X_LPARAM(lParam); - hti.pt.y = GET_Y_LPARAM(lParam); - int nItem = m_tab.HitTest(&hti); - if(nItem != -1) - MovePage(m_nActivePage, nItem); - } - - ::ReleaseCapture(); - } - - bHandled = FALSE; - return 0; - } - - LRESULT OnTabCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_bTabCapture) - { - m_bTabCapture = false; - - if(m_bTabDrag) - { - m_bTabDrag = false; - T* pT = static_cast(this); - pT->DrawMoveMark(-1); - -#ifndef _WIN32_WCE - m_ilDrag.DragLeave(GetDesktopWindow()); -#endif // !_WIN32_WCE - m_ilDrag.EndDrag(); - - m_ilDrag.Destroy(); - m_ilDrag.m_hImageList = NULL; - } - } - - bHandled = FALSE; - return 0; - } - - LRESULT OnTabMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - bHandled = FALSE; - - if(m_bTabCapture) - { - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - - if(!m_bTabDrag) - { -#ifndef _WIN32_WCE - if(abs(m_ptStartDrag.x - GET_X_LPARAM(lParam)) >= ::GetSystemMetrics(SM_CXDRAG) || - abs(m_ptStartDrag.y - GET_Y_LPARAM(lParam)) >= ::GetSystemMetrics(SM_CYDRAG)) -#else // CE specific - if(abs(m_ptStartDrag.x - GET_X_LPARAM(lParam)) >= 4 || - abs(m_ptStartDrag.y - GET_Y_LPARAM(lParam)) >= 4) -#endif // _WIN32_WCE - { - T* pT = static_cast(this); - pT->GenerateDragImage(m_nActivePage); - - int cxCursor = ::GetSystemMetrics(SM_CXCURSOR); - int cyCursor = ::GetSystemMetrics(SM_CYCURSOR); - m_ilDrag.BeginDrag(0, -(cxCursor / 2), -(cyCursor / 2)); -#ifndef _WIN32_WCE - POINT ptEnter = m_ptStartDrag; - m_tab.ClientToScreen(&ptEnter); - m_ilDrag.DragEnter(GetDesktopWindow(), ptEnter); -#endif // !_WIN32_WCE - - m_bTabDrag = true; - } - } - - if(m_bTabDrag) - { - TCHITTESTINFO hti = { 0 }; - hti.pt = pt; - int nItem = m_tab.HitTest(&hti); - - T* pT = static_cast(this); - pT->SetMoveCursor(nItem != -1); - - if(m_nInsertItem != nItem) - pT->DrawMoveMark(nItem); - - m_ilDrag.DragShowNolock((nItem != -1) ? TRUE : FALSE); - m_tab.ClientToScreen(&pt); - m_ilDrag.DragMove(pt); - - bHandled = TRUE; - } - } - - return 0; - } - - LRESULT OnTabRButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - TCHITTESTINFO hti = { 0 }; - hti.pt.x = GET_X_LPARAM(lParam); - hti.pt.y = GET_Y_LPARAM(lParam); - int nItem = m_tab.HitTest(&hti); - if(nItem != -1) - { - T* pT = static_cast(this); - pT->OnContextMenu(nItem, hti.pt); - } - - return 0; - } - - LRESULT OnTabSysKeyDown(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - bool bShift = (::GetKeyState(VK_SHIFT) < 0); - if(wParam == VK_F10 && bShift) - { - if(m_nActivePage != -1) - { - RECT rect = { 0 }; - m_tab.GetItemRect(m_nActivePage, &rect); - POINT pt = { rect.left, rect.bottom }; - T* pT = static_cast(this); - pT->OnContextMenu(m_nActivePage, pt); - } - } - else - { - bHandled = FALSE; - } - - return 0; - } - -// Implementation helpers - bool IsValidPageIndex(int nPage) const - { - return (nPage >= 0 && nPage < GetPageCount()); - } - - bool MovePage(int nMovePage, int nInsertBeforePage) - { - ATLASSERT(IsValidPageIndex(nMovePage)); - ATLASSERT(IsValidPageIndex(nInsertBeforePage)); - - if(!IsValidPageIndex(nMovePage) || !IsValidPageIndex(nInsertBeforePage)) - return false; - - if(nMovePage == nInsertBeforePage) - return true; // nothing to do - - CTempBuffer buff; - LPTSTR lpstrTabText = buff.Allocate(m_cchTabTextLength + 1); - if(lpstrTabText == NULL) - return false; - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_TEXT | TCIF_IMAGE | TCIF_PARAM; - tcix.tciheader.pszText = lpstrTabText; - tcix.tciheader.cchTextMax = m_cchTabTextLength + 1; - BOOL bRet = m_tab.GetItem(nMovePage, tcix); - ATLASSERT(bRet != FALSE); - if(bRet == FALSE) - return false; - - int nInsertItem = (nInsertBeforePage > nMovePage) ? nInsertBeforePage + 1 : nInsertBeforePage; - int nNewItem = m_tab.InsertItem(nInsertItem, tcix); - ATLASSERT(nNewItem == nInsertItem); - if(nNewItem != nInsertItem) - { - ATLVERIFY(m_tab.DeleteItem(nNewItem)); - return false; - } - - if(nMovePage > nInsertBeforePage) - ATLVERIFY(m_tab.DeleteItem(nMovePage + 1) != FALSE); - else if(nMovePage < nInsertBeforePage) - ATLVERIFY(m_tab.DeleteItem(nMovePage) != FALSE); - - SetActivePage(nInsertBeforePage); - T* pT = static_cast(this); - pT->OnPageActivated(m_nActivePage); - - return true; - } - -// Implementation overrideables - bool CreateTabControl() - { -#ifndef _WIN32_WCE - m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | TCS_TOOLTIPS, 0, m_nTabID); -#else // CE specific - m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, m_nTabID); -#endif // _WIN32_WCE - ATLASSERT(m_tab.m_hWnd != NULL); - if(m_tab.m_hWnd == NULL) - return false; - - m_tab.SetFont(AtlCreateControlFont()); - m_bInternalFont = true; - - m_tab.SetItemExtra(sizeof(TABVIEWPAGE)); - - T* pT = static_cast(this); - m_cyTabHeight = pT->CalcTabHeight(); - - return true; - } - - int CalcTabHeight() - { - int nCount = m_tab.GetItemCount(); - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_TEXT; - tcix.tciheader.pszText = _T("NS"); - int nIndex = m_tab.InsertItem(nCount, tcix); - - RECT rect = { 0, 0, 1000, 1000 }; - m_tab.AdjustRect(FALSE, &rect); - - RECT rcWnd = { 0, 0, 1000, rect.top }; - ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle()); - - int nHeight = rcWnd.bottom - rcWnd.top; - - m_tab.DeleteItem(nIndex); - - return nHeight; - } - - void ShowTabControl(bool bShow) - { - m_tab.ShowWindow(bShow ? SW_SHOWNOACTIVATE : SW_HIDE); - } - - void UpdateLayout() - { - RECT rect; - GetClientRect(&rect); - - if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0)) - m_tab.SetWindowPos(NULL, 0, 0, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER); - - if(m_nActivePage != -1) - ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, m_cyTabHeight, rect.right - rect.left, rect.bottom - rect.top - m_cyTabHeight, SWP_NOZORDER); - } - - void UpdateMenu() - { - if(m_menu.m_hMenu != NULL) - BuildWindowMenu(m_menu, m_nMenuItemsCount, m_bEmptyMenuItem, m_bWindowsMenuItem, m_bActivePageMenuItem, m_bActiveAsDefaultMenuItem); - } - - void UpdateTitleBar() - { - if(!m_wndTitleBar.IsWindow() || m_lpstrTitleBarBase == NULL) - return; // nothing to do - - if(m_nActivePage != -1) - { - T* pT = static_cast(this); - LPCTSTR lpstrTitle = pT->GetPageTitle(m_nActivePage); - LPCTSTR lpstrDivider = pT->GetTitleDividerText(); - int cchBuffer = m_cchTitleBarLength + lstrlen(lpstrDivider) + lstrlen(m_lpstrTitleBarBase) + 1; - CTempBuffer buff; - LPTSTR lpstrPageTitle = buff.Allocate(cchBuffer); - ATLASSERT(lpstrPageTitle != NULL); - if(lpstrPageTitle != NULL) - { - pT->ShortenTitle(lpstrTitle, lpstrPageTitle, m_cchTitleBarLength + 1); - SecureHelper::strcat_x(lpstrPageTitle, cchBuffer, lpstrDivider); - SecureHelper::strcat_x(lpstrPageTitle, cchBuffer, m_lpstrTitleBarBase); - } - else - { - lpstrPageTitle = m_lpstrTitleBarBase; - } - - m_wndTitleBar.SetWindowText(lpstrPageTitle); - } - else - { - m_wndTitleBar.SetWindowText(m_lpstrTitleBarBase); - } - } - - void DrawMoveMark(int nItem) - { - T* pT = static_cast(this); - - if(m_nInsertItem != -1) - { - RECT rect = { 0 }; - pT->GetMoveMarkRect(rect); - m_tab.InvalidateRect(&rect); - } - - m_nInsertItem = nItem; - - if(m_nInsertItem != -1) - { - CClientDC dc(m_tab.m_hWnd); - - RECT rect = { 0 }; - pT->GetMoveMarkRect(rect); - - CPen pen; - pen.CreatePen(PS_SOLID, 1, ::GetSysColor(COLOR_WINDOWTEXT)); - CBrush brush; - brush.CreateSolidBrush(::GetSysColor(COLOR_WINDOWTEXT)); - - HPEN hPenOld = dc.SelectPen(pen); - HBRUSH hBrushOld = dc.SelectBrush(brush); - - int x = rect.left; - int y = rect.top; - POINT ptsTop[3] = { { x, y }, { x + m_cxMoveMark, y }, { x + (m_cxMoveMark / 2), y + m_cyMoveMark } }; - dc.Polygon(ptsTop, 3); - - y = rect.bottom - 1; - POINT ptsBottom[3] = { { x, y }, { x + m_cxMoveMark, y }, { x + (m_cxMoveMark / 2), y - m_cyMoveMark } }; - dc.Polygon(ptsBottom, 3); - - dc.SelectPen(hPenOld); - dc.SelectBrush(hBrushOld); - } - } - - void GetMoveMarkRect(RECT& rect) const - { - m_tab.GetClientRect(&rect); - - RECT rcItem = { 0 }; - m_tab.GetItemRect(m_nInsertItem, &rcItem); - - if(m_nInsertItem <= m_nActivePage) - { - rect.left = rcItem.left - m_cxMoveMark / 2 - 1; - rect.right = rcItem.left + m_cxMoveMark / 2; - } - else - { - rect.left = rcItem.right - m_cxMoveMark / 2 - 1; - rect.right = rcItem.right + m_cxMoveMark / 2; - } - } - - void SetMoveCursor(bool bCanMove) - { - ::SetCursor(::LoadCursor(NULL, bCanMove ? IDC_ARROW : IDC_NO)); - } - - void GenerateDragImage(int nItem) - { - ATLASSERT(IsValidPageIndex(nItem)); - -#ifndef _WIN32_WCE - RECT rcItem = { 0 }; - m_tab.GetItemRect(nItem, &rcItem); - ::InflateRect(&rcItem, 2, 2); // make bigger to cover selected item -#else // CE specific - nItem; // avoid level 4 warning - RECT rcItem = { 0, 0, 40, 20 }; -#endif // _WIN32_WCE - - ATLASSERT(m_ilDrag.m_hImageList == NULL); - m_ilDrag.Create(rcItem.right - rcItem.left, rcItem.bottom - rcItem.top, ILC_COLORDDB | ILC_MASK, 1, 1); - - CClientDC dc(m_hWnd); - CDC dcMem; - dcMem.CreateCompatibleDC(dc); - ATLASSERT(dcMem.m_hDC != NULL); - dcMem.SetViewportOrg(-rcItem.left, -rcItem.top); - - CBitmap bmp; - bmp.CreateCompatibleBitmap(dc, rcItem.right - rcItem.left, rcItem.bottom - rcItem.top); - ATLASSERT(bmp.m_hBitmap != NULL); - - HBITMAP hBmpOld = dcMem.SelectBitmap(bmp); -#ifndef _WIN32_WCE - m_tab.SendMessage(WM_PRINTCLIENT, (WPARAM)dcMem.m_hDC); -#else // CE specific - dcMem.Rectangle(&rcItem); -#endif // _WIN32_WCE - dcMem.SelectBitmap(hBmpOld); - - ATLVERIFY(m_ilDrag.Add(bmp.m_hBitmap, RGB(255, 0, 255)) != -1); - } - - void ShortenTitle(LPCTSTR lpstrTitle, LPTSTR lpstrShortTitle, int cchShortTitle) - { - if(lstrlen(lpstrTitle) >= cchShortTitle) - { - LPCTSTR lpstrEllipsis = _T("..."); - int cchEllipsis = lstrlen(lpstrEllipsis); - SecureHelper::strncpy_x(lpstrShortTitle, cchShortTitle, lpstrTitle, cchShortTitle - cchEllipsis - 1); - SecureHelper::strcat_x(lpstrShortTitle, cchShortTitle, lpstrEllipsis); - } - else - { - SecureHelper::strcpy_x(lpstrShortTitle, cchShortTitle, lpstrTitle); - } - } - -#ifndef _WIN32_WCE - void UpdateTooltipText(LPNMTTDISPINFO pTTDI) - { - ATLASSERT(pTTDI != NULL); - pTTDI->lpszText = (LPTSTR)GetPageTitle((int)pTTDI->hdr.idFrom); - } -#endif // !_WIN32_WCE - -// Text for menu items and title bar - override to provide different strings - static LPCTSTR GetEmptyListText() - { - return _T("(Empty)"); - } - - static LPCTSTR GetWindowsMenuItemText() - { - return _T("&Windows..."); - } - - static LPCTSTR GetTitleDividerText() - { - return _T(" - "); - } - -// Notifications - override to provide different behavior - void OnPageActivated(int nPage) - { - NMHDR nmhdr = { 0 }; - nmhdr.hwndFrom = m_hWnd; - nmhdr.idFrom = nPage; - nmhdr.code = TBVN_PAGEACTIVATED; - ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&nmhdr); - } - - void OnContextMenu(int nPage, POINT pt) - { - m_tab.ClientToScreen(&pt); - - TBVCONTEXTMENUINFO cmi = { 0 }; - cmi.hdr.hwndFrom = m_hWnd; - cmi.hdr.idFrom = nPage; - cmi.hdr.code = TBVN_CONTEXTMENU; - cmi.pt = pt; - ::SendMessage(GetParent(), WM_NOTIFY, GetDlgCtrlID(), (LPARAM)&cmi); - } -}; - -class CTabView : public CTabViewImpl -{ -public: - DECLARE_WND_CLASS_EX(_T("WTL_TabView"), 0, COLOR_APPWORKSPACE) -}; - -}; // namespace WTL - -#endif // __ATLCTRLX_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlddx.h b/plugins/SmartAutoReplier/wtl/atlddx.h deleted file mode 100644 index ecaf0adb01..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlddx.h +++ /dev/null @@ -1,679 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLDDX_H__ -#define __ATLDDX_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlddx.h requires atlapp.h to be included first -#endif - -#if defined(_ATL_USE_DDX_FLOAT) && defined(_ATL_MIN_CRT) - #error Cannot use floating point DDX with _ATL_MIN_CRT defined -#endif // defined(_ATL_USE_DDX_FLOAT) && defined(_ATL_MIN_CRT) - -#ifdef _ATL_USE_DDX_FLOAT - #include -#endif // _ATL_USE_DDX_FLOAT - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CWinDataExchange - - -namespace WTL -{ - -// Constants -#define DDX_LOAD FALSE -#define DDX_SAVE TRUE - -// DDX map macros -#define BEGIN_DDX_MAP(thisClass) \ - BOOL DoDataExchange(BOOL bSaveAndValidate = FALSE, UINT nCtlID = (UINT)-1) \ - { \ - bSaveAndValidate; \ - nCtlID; - -#define DDX_TEXT(nID, var) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate)) \ - return FALSE; \ - } - -#define DDX_TEXT_LEN(nID, var, len) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Text(nID, var, sizeof(var), bSaveAndValidate, TRUE, len)) \ - return FALSE; \ - } - -#define DDX_INT(nID, var) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Int(nID, var, TRUE, bSaveAndValidate)) \ - return FALSE; \ - } - -#define DDX_INT_RANGE(nID, var, min, max) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Int(nID, var, TRUE, bSaveAndValidate, TRUE, min, max)) \ - return FALSE; \ - } - -#define DDX_UINT(nID, var) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Int(nID, var, FALSE, bSaveAndValidate)) \ - return FALSE; \ - } - -#define DDX_UINT_RANGE(nID, var, min, max) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Int(nID, var, FALSE, bSaveAndValidate, TRUE, min, max)) \ - return FALSE; \ - } - -#ifdef _ATL_USE_DDX_FLOAT -#define DDX_FLOAT(nID, var) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Float(nID, var, bSaveAndValidate)) \ - return FALSE; \ - } - -#define DDX_FLOAT_RANGE(nID, var, min, max) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Float(nID, var, bSaveAndValidate, TRUE, min, max)) \ - return FALSE; \ - } -#define DDX_FLOAT_P(nID, var, precision) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Float(nID, var, bSaveAndValidate, FALSE, 0, 0, precision)) \ - return FALSE; \ - } - -#define DDX_FLOAT_P_RANGE(nID, var, min, max, precision) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - { \ - if(!DDX_Float(nID, var, bSaveAndValidate, TRUE, min, max, precision)) \ - return FALSE; \ - } -#endif // _ATL_USE_DDX_FLOAT - -#define DDX_CONTROL(nID, obj) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - DDX_Control(nID, obj, bSaveAndValidate); - -#define DDX_CONTROL_HANDLE(nID, obj) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - DDX_Control_Handle(nID, obj, bSaveAndValidate); - -#define DDX_CHECK(nID, var) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - DDX_Check(nID, var, bSaveAndValidate); - -#define DDX_RADIO(nID, var) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - DDX_Radio(nID, var, bSaveAndValidate); - -#define END_DDX_MAP() \ - return TRUE; \ - } - -// DDX support for Tab, Combo, ListBox and ListView selection index -// Note: Specialized versions require atlctrls.h to be included first -#define DDX_INDEX(CtrlClass, nID, var) \ - if(nCtlID == (UINT)-1 || nCtlID == nID) \ - DDX_Index(nID, var, bSaveAndValidate); - -#ifdef __ATLCTRLS_H__ - #define DDX_TAB_INDEX(nID, var) DDX_INDEX(WTL::CTabCtrl, nID, var) - #define DDX_COMBO_INDEX(nID, var) DDX_INDEX(WTL::CComboBox, nID, var) - #define DDX_LISTBOX_INDEX(nID, var) DDX_INDEX(WTL::CListBox, nID, var) - #define DDX_LISTVIEW_INDEX(nID, var) DDX_INDEX(WTL::CListViewCtrl, nID, var) -#endif // __ATLCTRLS_H__ - - -/////////////////////////////////////////////////////////////////////////////// -// CWinDataExchange - provides support for DDX - -template -class CWinDataExchange -{ -public: -// Data exchange method - override in your derived class - BOOL DoDataExchange(BOOL /*bSaveAndValidate*/ = FALSE, UINT /*nCtlID*/ = (UINT)-1) - { - // this one should never be called, override it in - // your derived class by implementing DDX map - ATLASSERT(FALSE); - return FALSE; - } - -// Helpers for validation error reporting - enum _XDataType - { - ddxDataNull = 0, - ddxDataText = 1, - ddxDataInt = 2, - ddxDataFloat = 3, - ddxDataDouble = 4 - }; - - struct _XTextData - { - int nLength; - int nMaxLength; - }; - - struct _XIntData - { - long nVal; - long nMin; - long nMax; - }; - - struct _XFloatData - { - double nVal; - double nMin; - double nMax; - }; - - struct _XData - { - _XDataType nDataType; - union - { - _XTextData textData; - _XIntData intData; - _XFloatData floatData; - }; - }; - -// Text exchange - BOOL DDX_Text(UINT nID, LPTSTR lpstrText, int cbSize, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0) - { - T* pT = static_cast(this); - BOOL bSuccess = TRUE; - - if(bSave) - { - HWND hWndCtrl = pT->GetDlgItem(nID); - int nRetLen = ::GetWindowText(hWndCtrl, lpstrText, cbSize / sizeof(TCHAR)); - if(nRetLen < ::GetWindowTextLength(hWndCtrl)) - bSuccess = FALSE; - } - else - { - ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength); - bSuccess = pT->SetDlgItemText(nID, lpstrText); - } - - if(!bSuccess) - { - pT->OnDataExchangeError(nID, bSave); - } - else if(bSave && bValidate) // validation - { - ATLASSERT(nLength > 0); - if(lstrlen(lpstrText) > nLength) - { - _XData data = { ddxDataText }; - data.textData.nLength = lstrlen(lpstrText); - data.textData.nMaxLength = nLength; - pT->OnDataValidateError(nID, bSave, data); - bSuccess = FALSE; - } - } - return bSuccess; - } - - BOOL DDX_Text(UINT nID, BSTR& bstrText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0) - { - T* pT = static_cast(this); - BOOL bSuccess = TRUE; - - if(bSave) - { - bSuccess = pT->GetDlgItemText(nID, bstrText); - } - else - { - USES_CONVERSION; - LPTSTR lpstrText = OLE2T(bstrText); - ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength); - bSuccess = pT->SetDlgItemText(nID, lpstrText); - } - - if(!bSuccess) - { - pT->OnDataExchangeError(nID, bSave); - } - else if(bSave && bValidate) // validation - { - ATLASSERT(nLength > 0); - if((int)::SysStringLen(bstrText) > nLength) - { - _XData data = { ddxDataText }; - data.textData.nLength = (int)::SysStringLen(bstrText); - data.textData.nMaxLength = nLength; - pT->OnDataValidateError(nID, bSave, data); - bSuccess = FALSE; - } - } - return bSuccess; - } - - BOOL DDX_Text(UINT nID, ATL::CComBSTR& bstrText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0) - { - T* pT = static_cast(this); - BOOL bSuccess = TRUE; - - if(bSave) - { - bSuccess = pT->GetDlgItemText(nID, (BSTR&)bstrText); - } - else - { - USES_CONVERSION; - LPTSTR lpstrText = OLE2T(bstrText); - ATLASSERT(!bValidate || lstrlen(lpstrText) <= nLength); - bSuccess = pT->SetDlgItemText(nID, lpstrText); - } - - if(!bSuccess) - { - pT->OnDataExchangeError(nID, bSave); - } - else if(bSave && bValidate) // validation - { - ATLASSERT(nLength > 0); - if((int)bstrText.Length() > nLength) - { - _XData data = { ddxDataText }; - data.textData.nLength = (int)bstrText.Length(); - data.textData.nMaxLength = nLength; - pT->OnDataValidateError(nID, bSave, data); - bSuccess = FALSE; - } - } - return bSuccess; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - BOOL DDX_Text(UINT nID, _CSTRING_NS::CString& strText, int /*cbSize*/, BOOL bSave, BOOL bValidate = FALSE, int nLength = 0) - { - T* pT = static_cast(this); - BOOL bSuccess = TRUE; - - if(bSave) - { - HWND hWndCtrl = pT->GetDlgItem(nID); - int nLen = ::GetWindowTextLength(hWndCtrl); - int nRetLen = -1; - LPTSTR lpstr = strText.GetBufferSetLength(nLen); - if(lpstr != NULL) - { - nRetLen = ::GetWindowText(hWndCtrl, lpstr, nLen + 1); - strText.ReleaseBuffer(); - } - if(nRetLen < nLen) - bSuccess = FALSE; - } - else - { - bSuccess = pT->SetDlgItemText(nID, strText); - } - - if(!bSuccess) - { - pT->OnDataExchangeError(nID, bSave); - } - else if(bSave && bValidate) // validation - { - ATLASSERT(nLength > 0); - if(strText.GetLength() > nLength) - { - _XData data = { ddxDataText }; - data.textData.nLength = strText.GetLength(); - data.textData.nMaxLength = nLength; - pT->OnDataValidateError(nID, bSave, data); - bSuccess = FALSE; - } - } - return bSuccess; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - -// Numeric exchange - template - BOOL DDX_Int(UINT nID, Type& nVal, BOOL bSigned, BOOL bSave, BOOL bValidate = FALSE, Type nMin = 0, Type nMax = 0) - { - T* pT = static_cast(this); - BOOL bSuccess = TRUE; - - if(bSave) - { - nVal = (Type)pT->GetDlgItemInt(nID, &bSuccess, bSigned); - } - else - { - ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax); - bSuccess = pT->SetDlgItemInt(nID, nVal, bSigned); - } - - if(!bSuccess) - { - pT->OnDataExchangeError(nID, bSave); - } - else if(bSave && bValidate) // validation - { - ATLASSERT(nMin != nMax); - if(nVal < nMin || nVal > nMax) - { - _XData data = { ddxDataInt }; - data.intData.nVal = (long)nVal; - data.intData.nMin = (long)nMin; - data.intData.nMax = (long)nMax; - pT->OnDataValidateError(nID, bSave, data); - bSuccess = FALSE; - } - } - return bSuccess; - } - -// Float exchange -#ifdef _ATL_USE_DDX_FLOAT - static BOOL _AtlSimpleFloatParse(LPCTSTR lpszText, double& d) - { - ATLASSERT(lpszText != NULL); - while (*lpszText == _T(' ') || *lpszText == _T('\t')) - lpszText++; - - TCHAR chFirst = lpszText[0]; - d = _tcstod(lpszText, (LPTSTR*)&lpszText); - if (d == 0.0 && chFirst != _T('0')) - return FALSE; // could not convert - while (*lpszText == _T(' ') || *lpszText == _T('\t')) - lpszText++; - - if (*lpszText != _T('\0')) - return FALSE; // not terminated properly - - return TRUE; - } - - BOOL DDX_Float(UINT nID, float& nVal, BOOL bSave, BOOL bValidate = FALSE, float nMin = 0.F, float nMax = 0.F, int nPrecision = FLT_DIG) - { - T* pT = static_cast(this); - BOOL bSuccess = TRUE; - const int cchBuff = 32; - TCHAR szBuff[cchBuff] = { 0 }; - - if(bSave) - { - pT->GetDlgItemText(nID, szBuff, cchBuff); - double d = 0; - if(_AtlSimpleFloatParse(szBuff, d)) - nVal = (float)d; - else - bSuccess = FALSE; - } - else - { - ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax); - SecureHelper::sprintf_x(szBuff, cchBuff, _T("%.*g"), nPrecision, nVal); - bSuccess = pT->SetDlgItemText(nID, szBuff); - } - - if(!bSuccess) - { - pT->OnDataExchangeError(nID, bSave); - } - else if(bSave && bValidate) // validation - { - ATLASSERT(nMin != nMax); - if(nVal < nMin || nVal > nMax) - { - _XData data = { ddxDataFloat }; - data.floatData.nVal = (double)nVal; - data.floatData.nMin = (double)nMin; - data.floatData.nMax = (double)nMax; - pT->OnDataValidateError(nID, bSave, data); - bSuccess = FALSE; - } - } - return bSuccess; - } - - BOOL DDX_Float(UINT nID, double& nVal, BOOL bSave, BOOL bValidate = FALSE, double nMin = 0., double nMax = 0., int nPrecision = DBL_DIG) - { - T* pT = static_cast(this); - BOOL bSuccess = TRUE; - const int cchBuff = 32; - TCHAR szBuff[cchBuff] = { 0 }; - - if(bSave) - { - pT->GetDlgItemText(nID, szBuff, cchBuff); - double d = 0; - if(_AtlSimpleFloatParse(szBuff, d)) - nVal = d; - else - bSuccess = FALSE; - } - else - { - ATLASSERT(!bValidate || nVal >= nMin && nVal <= nMax); - SecureHelper::sprintf_x(szBuff, cchBuff, _T("%.*g"), nPrecision, nVal); - bSuccess = pT->SetDlgItemText(nID, szBuff); - } - - if(!bSuccess) - { - pT->OnDataExchangeError(nID, bSave); - } - else if(bSave && bValidate) // validation - { - ATLASSERT(nMin != nMax); - if(nVal < nMin || nVal > nMax) - { - _XData data = { ddxDataFloat }; - data.floatData.nVal = nVal; - data.floatData.nMin = nMin; - data.floatData.nMax = nMax; - pT->OnDataValidateError(nID, bSave, data); - bSuccess = FALSE; - } - } - return bSuccess; - } -#endif // _ATL_USE_DDX_FLOAT - -// Full control subclassing (for CWindowImpl derived controls) - template - void DDX_Control(UINT nID, TControl& ctrl, BOOL bSave) - { - if(!bSave && ctrl.m_hWnd == NULL) - { - T* pT = static_cast(this); - ctrl.SubclassWindow(pT->GetDlgItem(nID)); - } - } - -// Simple control attaching (for HWND wrapper controls) - template - void DDX_Control_Handle(UINT nID, TControl& ctrl, BOOL bSave) - { - if(!bSave && ctrl.m_hWnd == NULL) - { - T* pT = static_cast(this); - ctrl = pT->GetDlgItem(nID); - } - } - -// Control state - void DDX_Check(UINT nID, int& nValue, BOOL bSave) - { - T* pT = static_cast(this); - HWND hWndCtrl = pT->GetDlgItem(nID); - if(bSave) - { - nValue = (int)::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L); - ATLASSERT(nValue >= 0 && nValue <= 2); - } - else - { - if(nValue < 0 || nValue > 2) - { - ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - dialog data checkbox value (%d) out of range.\n"), nValue); - nValue = 0; // default to off - } - ::SendMessage(hWndCtrl, BM_SETCHECK, nValue, 0L); - } - } - - // variant that supports bool (checked/not-checked, no intermediate state) - void DDX_Check(UINT nID, bool& bCheck, BOOL bSave) - { - int nValue = bCheck ? 1 : 0; - DDX_Check(nID, nValue, bSave); - - if(bSave) - { - if(nValue == 2) - ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - checkbox state (%d) out of supported range.\n"), nValue); - bCheck = (nValue == 1); - } - } - - void DDX_Radio(UINT nID, int& nValue, BOOL bSave) - { - T* pT = static_cast(this); - HWND hWndCtrl = pT->GetDlgItem(nID); - ATLASSERT(hWndCtrl != NULL); - - // must be first in a group of auto radio buttons - ATLASSERT(::GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP); - ATLASSERT(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON); - - if(bSave) - nValue = -1; // value if none found - - // walk all children in group - int nButton = 0; - do - { - if(::SendMessage(hWndCtrl, WM_GETDLGCODE, 0, 0L) & DLGC_RADIOBUTTON) - { - // control in group is a radio button - if(bSave) - { - if(::SendMessage(hWndCtrl, BM_GETCHECK, 0, 0L) != 0) - { - ATLASSERT(nValue == -1); // only set once - nValue = nButton; - } - } - else - { - // select button - ::SendMessage(hWndCtrl, BM_SETCHECK, (nButton == nValue), 0L); - } - nButton++; - } - else - { - ATLTRACE2(atlTraceUI, 0, _T("ATL: Warning - skipping non-radio button in group.\n")); - } - hWndCtrl = ::GetWindow(hWndCtrl, GW_HWNDNEXT); - } - while (hWndCtrl != NULL && !(GetWindowLong(hWndCtrl, GWL_STYLE) & WS_GROUP)); - } - -// DDX support for Tab, Combo, ListBox and ListView selection index - template - INT _getSel(TCtrl& tCtrl) - { - return tCtrl.GetCurSel(); - } - - template - void _setSel(TCtrl& tCtrl, INT iSel) - { - if(iSel < 0) - tCtrl.SetCurSel(-1); - else - tCtrl.SetCurSel(iSel); - } - -#ifdef __ATLCTRLS_H__ - // ListViewCtrl specialization - template <> - INT _getSel(WTL::CListViewCtrl& tCtrl) - { - return tCtrl.GetSelectedIndex(); - } - - template <> - void _setSel(WTL::CListViewCtrl& tCtrl, INT iSel) - { - if(iSel < 0) - tCtrl.SelectItem(-1); - else - tCtrl.SelectItem(iSel); - } -#endif // __ATLCTRLS_H__ - - template - void DDX_Index(UINT nID, INT& nVal, BOOL bSave) - { - T* pT = static_cast(this); - TCtrl ctrl(pT->GetDlgItem(nID)); - - if(bSave) - nVal = _getSel(ctrl); - else - _setSel(ctrl, nVal); - } - -// Overrideables - void OnDataExchangeError(UINT nCtrlID, BOOL /*bSave*/) - { - // Override to display an error message - ::MessageBeep((UINT)-1); - T* pT = static_cast(this); - ::SetFocus(pT->GetDlgItem(nCtrlID)); - } - - void OnDataValidateError(UINT nCtrlID, BOOL /*bSave*/, _XData& /*data*/) - { - // Override to display an error message - ::MessageBeep((UINT)-1); - T* pT = static_cast(this); - ::SetFocus(pT->GetDlgItem(nCtrlID)); - } -}; - -}; // namespace WTL - -#endif // __ATLDDX_H__ diff --git a/plugins/SmartAutoReplier/wtl/atldlgs.h b/plugins/SmartAutoReplier/wtl/atldlgs.h deleted file mode 100644 index a55fed4cb5..0000000000 --- a/plugins/SmartAutoReplier/wtl/atldlgs.h +++ /dev/null @@ -1,6403 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLDLGS_H__ -#define __ATLDLGS_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atldlgs.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atldlgs.h requires atlwin.h to be included first -#endif - -#include -#include - -#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) - #include -#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CFileDialogImpl -// CFileDialog -// CFileDialogEx -// CMultiFileDialogImpl -// CMultiFileDialog -// CShellFileDialogImpl -// CShellFileOpenDialogImpl -// CShellFileOpenDialog -// CShellFileSaveDialogImpl -// CShellFileSaveDialog -// CFolderDialogImpl -// CFolderDialog -// CFontDialogImpl -// CFontDialog -// CRichEditFontDialogImpl -// CRichEditFontDialog -// CColorDialogImpl -// CColorDialog -// CPrintDialogImpl -// CPrintDialog -// CPrintDialogExImpl -// CPrintDialogEx -// CPageSetupDialogImpl -// CPageSetupDialog -// CFindReplaceDialogImpl -// CFindReplaceDialog -// -// CDialogBaseUnits -// CMemDlgTemplate -// CIndirectDialogImpl -// -// CPropertySheetWindow -// CPropertySheetImpl -// CPropertySheet -// CPropertyPageWindow -// CPropertyPageImpl -// CPropertyPage -// CAxPropertyPageImpl -// CAxPropertyPage -// -// CWizard97SheetWindow -// CWizard97SheetImpl -// CWizard97Sheet -// CWizard97PageWindow -// CWizard97PageImpl -// CWizard97ExteriorPageImpl -// CWizard97InteriorPageImpl -// -// CAeroWizardFrameWindow -// CAeroWizardFrameImpl -// CAeroWizardFrame -// CAeroWizardPageWindow -// CAeroWizardPageImpl -// CAeroWizardPage -// CAeroWizardAxPageImpl -// CAeroWizardAxPage -// -// CTaskDialogConfig -// CTaskDialogImpl -// CTaskDialog -// -// Global functions: -// AtlTaskDialog() - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CFileDialogImpl - used for File Open or File Save As - -// compatibility with the old (vc6.0) headers -#if (_WIN32_WINNT >= 0x0500) && !defined(OPENFILENAME_SIZE_VERSION_400) - #ifndef CDSIZEOF_STRUCT - #define CDSIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) - #endif - #define OPENFILENAME_SIZE_VERSION_400A CDSIZEOF_STRUCT(OPENFILENAMEA,lpTemplateName) - #define OPENFILENAME_SIZE_VERSION_400W CDSIZEOF_STRUCT(OPENFILENAMEW,lpTemplateName) - #ifdef UNICODE - #define OPENFILENAME_SIZE_VERSION_400 OPENFILENAME_SIZE_VERSION_400W - #else - #define OPENFILENAME_SIZE_VERSION_400 OPENFILENAME_SIZE_VERSION_400A - #endif // !UNICODE -#endif // (_WIN32_WINNT >= 0x0500) && !defined(OPENFILENAME_SIZE_VERSION_400) - -#if !defined(_WIN32_WCE) && !defined(CDN_INCLUDEITEM) - #define CDN_INCLUDEITEM (CDN_FIRST - 0x0007) -#endif - -template -class ATL_NO_VTABLE CFileDialogImpl : public ATL::CDialogImplBase -{ -public: -#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) - OPENFILENAMEEX m_ofn; -#else - OPENFILENAME m_ofn; -#endif - BOOL m_bOpenFileDialog; // TRUE for file open, FALSE for file save - TCHAR m_szFileTitle[_MAX_FNAME]; // contains file title after return - TCHAR m_szFileName[_MAX_PATH]; // contains full path name after return - - CFileDialogImpl(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs - LPCTSTR lpszDefExt = NULL, - LPCTSTR lpszFileName = NULL, - DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, - LPCTSTR lpszFilter = NULL, - HWND hWndParent = NULL) - { - memset(&m_ofn, 0, sizeof(m_ofn)); // initialize structure to 0/NULL - m_szFileName[0] = _T('\0'); - m_szFileTitle[0] = _T('\0'); - - m_bOpenFileDialog = bOpenFileDialog; - -#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) - m_ofn.lStructSize = bOpenFileDialog ? sizeof(m_ofn) : sizeof(OPENFILENAME); -#else - m_ofn.lStructSize = sizeof(m_ofn); -#endif - -#if (_WIN32_WINNT >= 0x0500) - // adjust struct size if running on older version of Windows - if(AtlIsOldWindows()) - { - ATLASSERT(sizeof(m_ofn) > OPENFILENAME_SIZE_VERSION_400); // must be - m_ofn.lStructSize = OPENFILENAME_SIZE_VERSION_400; - } -#endif // (_WIN32_WINNT >= 0x0500) - m_ofn.lpstrFile = m_szFileName; - m_ofn.nMaxFile = _MAX_PATH; - m_ofn.lpstrDefExt = lpszDefExt; - m_ofn.lpstrFileTitle = (LPTSTR)m_szFileTitle; - m_ofn.nMaxFileTitle = _MAX_FNAME; -#ifndef _WIN32_WCE - m_ofn.Flags = dwFlags | OFN_EXPLORER | OFN_ENABLEHOOK | OFN_ENABLESIZING; -#else // CE specific - m_ofn.Flags = dwFlags | OFN_EXPLORER | OFN_ENABLEHOOK; -#endif // !_WIN32_WCE - m_ofn.lpstrFilter = lpszFilter; - m_ofn.hInstance = ModuleHelper::GetResourceInstance(); - m_ofn.lpfnHook = (LPOFNHOOKPROC)T::StartDialogProc; - m_ofn.hwndOwner = hWndParent; - - // setup initial file name - if(lpszFileName != NULL) - SecureHelper::strncpy_x(m_szFileName, _countof(m_szFileName), lpszFileName, _TRUNCATE); - } - - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) - { - ATLASSERT((m_ofn.Flags & OFN_ENABLEHOOK) != 0); - ATLASSERT(m_ofn.lpfnHook != NULL); // can still be a user hook - - ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); - - if(m_ofn.hwndOwner == NULL) // set only if not specified before - m_ofn.hwndOwner = hWndParent; - - ATLASSERT(m_hWnd == NULL); - ModuleHelper::AddCreateWndData(&m_thunk.cd, (ATL::CDialogImplBase*)this); - - BOOL bRet; - if(m_bOpenFileDialog) -#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) - bRet = ::GetOpenFileNameEx(&m_ofn); - else - bRet = ::GetSaveFileName((LPOPENFILENAME)&m_ofn); -#else - bRet = ::GetOpenFileName(&m_ofn); - else - bRet = ::GetSaveFileName(&m_ofn); -#endif - - m_hWnd = NULL; - - return bRet ? IDOK : IDCANCEL; - } - -// Attributes - ATL::CWindow GetFileDialogWindow() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return ATL::CWindow(GetParent()); - } - - int GetFilePath(LPTSTR lpstrFilePath, int nLength) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); - - return (int)GetFileDialogWindow().SendMessage(CDM_GETFILEPATH, nLength, (LPARAM)lpstrFilePath); - } - - int GetFolderIDList(LPVOID lpBuff, int nLength) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); - - return (int)GetFileDialogWindow().SendMessage(CDM_GETFOLDERIDLIST, nLength, (LPARAM)lpBuff); - } - - int GetFolderPath(LPTSTR lpstrFolderPath, int nLength) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); - - return (int)GetFileDialogWindow().SendMessage(CDM_GETFOLDERPATH, nLength, (LPARAM)lpstrFolderPath); - } - - int GetSpec(LPTSTR lpstrSpec, int nLength) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); - - return (int)GetFileDialogWindow().SendMessage(CDM_GETSPEC, nLength, (LPARAM)lpstrSpec); - } - - void SetControlText(int nCtrlID, LPCTSTR lpstrText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); - - GetFileDialogWindow().SendMessage(CDM_SETCONTROLTEXT, nCtrlID, (LPARAM)lpstrText); - } - - void SetDefExt(LPCTSTR lpstrExt) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); - - GetFileDialogWindow().SendMessage(CDM_SETDEFEXT, 0, (LPARAM)lpstrExt); - } - - BOOL GetReadOnlyPref() const // return TRUE if readonly checked - { - return ((m_ofn.Flags & OFN_READONLY) != 0) ? TRUE : FALSE; - } - -// Operations - void HideControl(int nCtrlID) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((m_ofn.Flags & OFN_EXPLORER) != 0); - - GetFileDialogWindow().SendMessage(CDM_HIDECONTROL, nCtrlID); - } - -// Special override for common dialogs - BOOL EndDialog(INT_PTR /*nRetCode*/ = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - GetFileDialogWindow().SendMessage(WM_COMMAND, MAKEWPARAM(IDCANCEL, 0)); - return TRUE; - } - -// Message map and handlers - BEGIN_MSG_MAP(CFileDialogImpl) - NOTIFY_CODE_HANDLER(CDN_FILEOK, _OnFileOK) - NOTIFY_CODE_HANDLER(CDN_FOLDERCHANGE, _OnFolderChange) - NOTIFY_CODE_HANDLER(CDN_HELP, _OnHelp) - NOTIFY_CODE_HANDLER(CDN_INITDONE, _OnInitDone) - NOTIFY_CODE_HANDLER(CDN_SELCHANGE, _OnSelChange) - NOTIFY_CODE_HANDLER(CDN_SHAREVIOLATION, _OnShareViolation) - NOTIFY_CODE_HANDLER(CDN_TYPECHANGE, _OnTypeChange) -#ifndef _WIN32_WCE - NOTIFY_CODE_HANDLER(CDN_INCLUDEITEM, _OnIncludeItem) -#endif // !_WIN32_WCE - END_MSG_MAP() - - LRESULT _OnFileOK(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - return !pT->OnFileOK((LPOFNOTIFY)pnmh); - } - - LRESULT _OnFolderChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - pT->OnFolderChange((LPOFNOTIFY)pnmh); - return 0; - } - - LRESULT _OnHelp(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - pT->OnHelp((LPOFNOTIFY)pnmh); - return 0; - } - - LRESULT _OnInitDone(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - pT->OnInitDone((LPOFNOTIFY)pnmh); - return 0; - } - - LRESULT _OnSelChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - pT->OnSelChange((LPOFNOTIFY)pnmh); - return 0; - } - - LRESULT _OnShareViolation(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - return pT->OnShareViolation((LPOFNOTIFY)pnmh); - } - - LRESULT _OnTypeChange(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - pT->OnTypeChange((LPOFNOTIFY)pnmh); - return 0; - } - -#ifndef _WIN32_WCE - LRESULT _OnIncludeItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - ATLASSERT(::IsWindow(m_hWnd)); - T* pT = static_cast(this); - return pT->OnIncludeItem((LPOFNOTIFYEX)pnmh); - } -#endif // !_WIN32_WCE - -// Overrideables - BOOL OnFileOK(LPOFNOTIFY /*lpon*/) - { - return TRUE; - } - - void OnFolderChange(LPOFNOTIFY /*lpon*/) - { - } - - void OnHelp(LPOFNOTIFY /*lpon*/) - { - } - - void OnInitDone(LPOFNOTIFY /*lpon*/) - { - } - - void OnSelChange(LPOFNOTIFY /*lpon*/) - { - } - - int OnShareViolation(LPOFNOTIFY /*lpon*/) - { - return 0; - } - - void OnTypeChange(LPOFNOTIFY /*lpon*/) - { - } - -#ifndef _WIN32_WCE - BOOL OnIncludeItem(LPOFNOTIFYEX /*lponex*/) - { - return TRUE; // include item - } -#endif // !_WIN32_WCE -}; - -class CFileDialog : public CFileDialogImpl -{ -public: - CFileDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs - LPCTSTR lpszDefExt = NULL, - LPCTSTR lpszFileName = NULL, - DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, - LPCTSTR lpszFilter = NULL, - HWND hWndParent = NULL) - : CFileDialogImpl(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent) - { } - - // override base class map and references to handlers - DECLARE_EMPTY_MSG_MAP() -}; - -#if defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) -class CFileDialogEx : public CFileDialogImpl -{ -public: - CFileDialogEx( // Supports only FileOpen - LPCTSTR lpszDefExt = NULL, - LPCTSTR lpszFileName = NULL, - DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, - OFN_EXFLAG ExFlags = OFN_EXFLAG_THUMBNAILVIEW, - OFN_SORTORDER dwSortOrder = OFN_SORTORDER_AUTO, - LPCTSTR lpszFilter = NULL, - HWND hWndParent = NULL) - : CFileDialogImpl(TRUE, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent) - { - m_ofn.ExFlags = ExFlags; - m_ofn.dwSortOrder = dwSortOrder; - } - - // override base class map and references to handlers - DECLARE_EMPTY_MSG_MAP() -}; -#endif // defined(__AYGSHELL_H__) && (_WIN32_WCE >= 0x0501) - - -/////////////////////////////////////////////////////////////////////////////// -// Multi File Dialog - Multi-select File Open dialog - -#ifndef _WIN32_WCE - -// The class dynamically resizes the buffer as the file selection changes -// (as described in Knowledge Base article 131462). It also expands selected -// shortcut files to take into account the full path of the target file. -// Note that this doesn't work on Win9x for the old style dialogs, as well as -// on NT for non-Unicode builds. - -#ifndef _WTL_FIXED_OFN_BUFFER_LENGTH - #define _WTL_FIXED_OFN_BUFFER_LENGTH 0x10000 -#endif - -template -class ATL_NO_VTABLE CMultiFileDialogImpl : public CFileDialogImpl< T > -{ -public: - mutable LPCTSTR m_pNextFile; -#ifndef _UNICODE - bool m_bIsNT; -#endif - - CMultiFileDialogImpl( - LPCTSTR lpszDefExt = NULL, - LPCTSTR lpszFileName = NULL, - DWORD dwFlags = OFN_HIDEREADONLY, - LPCTSTR lpszFilter = NULL, - HWND hWndParent = NULL) - : CFileDialogImpl(TRUE, lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent), - m_pNextFile(NULL) - { - m_ofn.Flags |= OFN_ALLOWMULTISELECT; // Force multiple selection mode - -#ifndef _UNICODE - OSVERSIONINFO ovi = { sizeof(ovi) }; - ::GetVersionEx(&ovi); - m_bIsNT = (ovi.dwPlatformId == VER_PLATFORM_WIN32_NT); - if (m_bIsNT) - { - // On NT platforms, GetOpenFileNameA thunks to GetOpenFileNameW and there - // is absolutely nothing we can do except to start off with a large buffer. - ATLVERIFY(ResizeFilenameBuffer(_WTL_FIXED_OFN_BUFFER_LENGTH)); - } -#endif - } - - ~CMultiFileDialogImpl() - { - if (m_ofn.lpstrFile != m_szFileName) // Free the buffer if we allocated it - delete[] m_ofn.lpstrFile; - } - -// Operations - // Get the directory that the files were chosen from. - // The function returns the number of characters copied, not including the terminating zero. - // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero. - // If the function fails, the return value is zero. - int GetDirectory(LPTSTR pBuffer, int nBufLen) const - { - if (m_ofn.lpstrFile == NULL) - return 0; - - LPCTSTR pStr = m_ofn.lpstrFile; - int nLength = lstrlen(pStr); - if (pStr[nLength + 1] == 0) - { - // The OFN buffer contains a single item so extract its path. - LPCTSTR pSep = _strrchr(pStr, _T('\\')); - if (pSep != NULL) - nLength = (int)(DWORD_PTR)(pSep - pStr); - } - - int nRet = 0; - if (pBuffer == NULL) // If the buffer is NULL, return the required length - { - nRet = nLength + 1; - } - else if (nBufLen > nLength) - { - SecureHelper::strncpy_x(pBuffer, nBufLen, pStr, nLength); - nRet = nLength; - } - - return nRet; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - bool GetDirectory(_CSTRING_NS::CString& strDir) const - { - bool bRet = false; - - int nLength = GetDirectory(NULL, 0); - if (nLength > 0) - { - bRet = (GetDirectory(strDir.GetBuffer(nLength), nLength) > 0); - strDir.ReleaseBuffer(nLength - 1); - } - - return bRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - // Get the first filename as a pointer into the buffer. - LPCTSTR GetFirstFileName() const - { - if (m_ofn.lpstrFile == NULL) - return NULL; - - m_pNextFile = NULL; // Reset internal buffer pointer - - LPCTSTR pStr = m_ofn.lpstrFile; - int nLength = lstrlen(pStr); - if (pStr[nLength + 1] != 0) - { - // Multiple items were selected. The first string is the directory, - // so skip forwards to the second string. - pStr += nLength + 1; - - // Set up m_pNext so it points to the second item (or null). - m_pNextFile = pStr; - GetNextFileName(); - } - else - { - // A single item was selected. Skip forward past the path. - LPCTSTR pSep = _strrchr(pStr, _T('\\')); - if (pSep != NULL) - pStr = pSep + 1; - } - - return pStr; - } - - // Get the next filename as a pointer into the buffer. - LPCTSTR GetNextFileName() const - { - if (m_pNextFile == NULL) - return NULL; - - LPCTSTR pStr = m_pNextFile; - // Set "m_pNextFile" to point to the next file name, or null if we - // have reached the last file in the list. - int nLength = lstrlen(pStr); - m_pNextFile = (pStr[nLength + 1] != 0) ? &pStr[nLength + 1] : NULL; - - return pStr; - } - - // Get the first filename as a full path. - // The function returns the number of characters copied, not including the terminating zero. - // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero. - // If the function fails, the return value is zero. - int GetFirstPathName(LPTSTR pBuffer, int nBufLen) const - { - LPCTSTR pStr = GetFirstFileName(); - int nLengthDir = GetDirectory(NULL, 0); - if((pStr == NULL) || (nLengthDir == 0)) - return 0; - - // Figure out the required length. - int nLengthTotal = nLengthDir + lstrlen(pStr); - - int nRet = 0; - if(pBuffer == NULL) // If the buffer is NULL, return the required length - { - nRet = nLengthTotal + 1; - } - else if (nBufLen > nLengthTotal) // If the buffer is big enough, go ahead and construct the path - { - GetDirectory(pBuffer, nBufLen); - SecureHelper::strcat_x(pBuffer, nBufLen, _T("\\")); - SecureHelper::strcat_x(pBuffer, nBufLen, pStr); - nRet = nLengthTotal; - } - - return nRet; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - bool GetFirstPathName(_CSTRING_NS::CString& strPath) const - { - bool bRet = false; - - int nLength = GetFirstPathName(NULL, 0); - if (nLength > 0) - { - bRet = (GetFirstPathName(strPath.GetBuffer(nLength), nLength) > 0); - strPath.ReleaseBuffer(nLength - 1); - } - - return bRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - // Get the next filename as a full path. - // The function returns the number of characters copied, not including the terminating zero. - // If the buffer is NULL, the function returns the required size, in characters, including the terminating zero. - // If the function fails, the return value is zero. - // The internal position marker is moved forward only if the function succeeds and the buffer was large enough. - int GetNextPathName(LPTSTR pBuffer, int nBufLen) const - { - if (m_pNextFile == NULL) - return 0; - - int nRet = 0; - LPCTSTR pStr = m_pNextFile; - // Does the filename contain a backslash? - if (_strrchr(pStr, _T('\\')) != NULL) - { - // Yes, so we'll assume it's a full path. - int nLength = lstrlen(pStr); - - if (pBuffer == NULL) // If the buffer is NULL, return the required length - { - nRet = nLength + 1; - } - else if (nBufLen > nLength) // The buffer is big enough, so go ahead and copy the filename - { - SecureHelper::strcpy_x(pBuffer, nBufLen, GetNextFileName()); - nRet = nBufLen; - } - } - else - { - // The filename is relative, so construct the full path. - int nLengthDir = GetDirectory(NULL, 0); - if (nLengthDir > 0) - { - // Calculate the required space. - int nLengthTotal = nLengthDir + lstrlen(pStr); - - if(pBuffer == NULL) // If the buffer is NULL, return the required length - { - nRet = nLengthTotal + 1; - } - else if (nBufLen > nLengthTotal) // If the buffer is big enough, go ahead and construct the path - { - GetDirectory(pBuffer, nBufLen); - SecureHelper::strcat_x(pBuffer, nBufLen, _T("\\")); - SecureHelper::strcat_x(pBuffer, nBufLen, GetNextFileName()); - nRet = nLengthTotal; - } - } - } - - return nRet; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - bool GetNextPathName(_CSTRING_NS::CString& strPath) const - { - bool bRet = false; - - int nLength = GetNextPathName(NULL, 0); - if (nLength > 0) - { - bRet = (GetNextPathName(strPath.GetBuffer(nLength), nLength) > 0); - strPath.ReleaseBuffer(nLength - 1); - } - - return bRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - -// Implementation - bool ResizeFilenameBuffer(DWORD dwLength) - { - if (dwLength > m_ofn.nMaxFile) - { - // Free the old buffer. - if (m_ofn.lpstrFile != m_szFileName) - { - delete[] m_ofn.lpstrFile; - m_ofn.lpstrFile = NULL; - m_ofn.nMaxFile = 0; - } - - // Allocate the new buffer. - LPTSTR lpstrBuff = NULL; - ATLTRY(lpstrBuff = new TCHAR[dwLength]); - if (lpstrBuff != NULL) - { - m_ofn.lpstrFile = lpstrBuff; - m_ofn.lpstrFile[0] = 0; - m_ofn.nMaxFile = dwLength; - } - } - - return (m_ofn.lpstrFile != NULL); - } - - void OnSelChange(LPOFNOTIFY /*lpon*/) - { -#ifndef _UNICODE - // There is no point resizing the buffer in ANSI builds running on NT. - if (m_bIsNT) - return; -#endif - - // Get the buffer length required to hold the spec. - int nLength = GetSpec(NULL, 0); - if (nLength <= 1) - return; // no files are selected, presumably - - // Add room for the directory, and an extra terminating zero. - nLength += GetFolderPath(NULL, 0) + 1; - - if (!ResizeFilenameBuffer(nLength)) - { - ATLASSERT(FALSE); - return; - } - - // If we are not following links then our work is done. - if ((m_ofn.Flags & OFN_NODEREFERENCELINKS) != 0) - return; - - // Get the file spec, which is the text in the edit control. - if (GetSpec(m_ofn.lpstrFile, m_ofn.nMaxFile) <= 0) - return; - - // Get the ID-list of the current folder. - int nBytes = GetFolderIDList(NULL, 0); - CTempBuffer idlist; - idlist.AllocateBytes(nBytes); - if ((nBytes <= 0) || (GetFolderIDList(idlist, nBytes) <= 0)) - return; - - // First bind to the desktop folder, then to the current folder. - ATL::CComPtr pDesktop, pFolder; - if (FAILED(::SHGetDesktopFolder(&pDesktop))) - return; - if (FAILED(pDesktop->BindToObject(idlist, NULL, IID_IShellFolder, (void**)&pFolder))) - return; - - // Work through the file spec, looking for quoted filenames. If we find a shortcut file, then - // we need to add enough extra buffer space to hold its target path. - DWORD nExtraChars = 0; - bool bInsideQuotes = false; - LPCTSTR pAnchor = m_ofn.lpstrFile; - LPCTSTR pChar = m_ofn.lpstrFile; - for ( ; *pChar; ++pChar) - { - // Look for quotation marks. - if (*pChar == _T('\"')) - { - // We are either entering or leaving a passage of quoted text. - bInsideQuotes = !bInsideQuotes; - - // Is it an opening or closing quote? - if (bInsideQuotes) - { - // We found an opening quote, so set "pAnchor" to the following character. - pAnchor = pChar + 1; - } - else // closing quote - { - // Each quoted entity should be shorter than MAX_PATH. - if (pChar - pAnchor >= MAX_PATH) - return; - - // Get the ID-list and attributes of the file. - USES_CONVERSION; - int nFileNameLength = (int)(DWORD_PTR)(pChar - pAnchor); - TCHAR szFileName[MAX_PATH]; - SecureHelper::strncpy_x(szFileName, MAX_PATH, pAnchor, nFileNameLength); - LPITEMIDLIST pidl = NULL; - DWORD dwAttrib = SFGAO_LINK; - if (SUCCEEDED(pFolder->ParseDisplayName(NULL, NULL, T2W(szFileName), NULL, &pidl, &dwAttrib))) - { - // Is it a shortcut file? - if (dwAttrib & SFGAO_LINK) - { - // Bind to its IShellLink interface. - ATL::CComPtr pLink; - if (SUCCEEDED(pFolder->BindToObject(pidl, NULL, IID_IShellLink, (void**)&pLink))) - { - // Get the shortcut's target path. - TCHAR szPath[MAX_PATH]; - if (SUCCEEDED(pLink->GetPath(szPath, MAX_PATH, NULL, 0))) - { - // If the target path is longer than the shortcut name, then add on the number - // of extra characters that are required. - int nNewLength = lstrlen(szPath); - if (nNewLength > nFileNameLength) - nExtraChars += nNewLength - nFileNameLength; - } - } - } - - // Free the ID-list returned by ParseDisplayName. - ::CoTaskMemFree(pidl); - } - } - } - } - - // If we need more space for shortcut targets, then reallocate. - if (nExtraChars > 0) - ATLVERIFY(ResizeFilenameBuffer(m_ofn.nMaxFile + nExtraChars)); - } - - // Helper for _ATL_MIN_CRT - static const TCHAR* _strrchr(const TCHAR* p, TCHAR ch) - { -#ifndef _ATL_MIN_CRT - return _tcsrchr(p, ch); -#else // _ATL_MIN_CRT - const TCHAR* lpsz = NULL; - while (*p != 0) - { - if (*p == ch) - lpsz = p; - p = ::CharNext(p); - } - return lpsz; -#endif // _ATL_MIN_CRT - } -}; - -class CMultiFileDialog : public CMultiFileDialogImpl -{ -public: - CMultiFileDialog( - LPCTSTR lpszDefExt = NULL, - LPCTSTR lpszFileName = NULL, - DWORD dwFlags = OFN_HIDEREADONLY, - LPCTSTR lpszFilter = NULL, - HWND hWndParent = NULL) - : CMultiFileDialogImpl(lpszDefExt, lpszFileName, dwFlags, lpszFilter, hWndParent) - { } - - BEGIN_MSG_MAP(CMultiFileDialog) - CHAIN_MSG_MAP(CMultiFileDialogImpl) - END_MSG_MAP() -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// Shell File Dialog - new Shell File Open and Save dialogs in Vista - -// Note: Use GetPtr() to access dialog interface methods. -// Example: -// CShellFileOpenDialog dlg; -// dlg.GetPtr()->SetTitle(L"MyFileOpenDialog"); - -#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) - -/////////////////////////////////////////////////////////////////////////////// -// CShellFileDialogImpl - base class for CShellFileOpenDialogImpl and CShellFileSaveDialogImpl - -template -class ATL_NO_VTABLE CShellFileDialogImpl : public IFileDialogEvents -{ -public: -// Operations - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) - { - INT_PTR nRet = -1; - - T* pT = static_cast(this); - if(pT->m_spFileDlg == NULL) - { - ATLASSERT(FALSE); - return nRet; - } - - DWORD dwCookie = 0; - pT->_Advise(dwCookie); - - HRESULT hRet = pT->m_spFileDlg->Show(hWndParent); - if(SUCCEEDED(hRet)) - nRet = IDOK; - else if(hRet == HRESULT_FROM_WIN32(ERROR_CANCELLED)) - nRet = IDCANCEL; - else - ATLASSERT(FALSE); // error - - pT->_Unadvise(dwCookie); - - return nRet; - } - - bool IsNull() const - { - const T* pT = static_cast(this); - return (pT->m_spFileDlg == NULL); - } - -// Operations - get file path after dialog returns - HRESULT GetFilePath(LPWSTR lpstrFilePath, int cchLength) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg != NULL); - - ATL::CComPtr spItem; - HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem); - - if(SUCCEEDED(hRet)) - hRet = GetFileNameFromShellItem(spItem, SIGDN_FILESYSPATH, lpstrFilePath, cchLength); - - return hRet; - } - - HRESULT GetFileTitle(LPWSTR lpstrFileTitle, int cchLength) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg != NULL); - - ATL::CComPtr spItem; - HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem); - - if(SUCCEEDED(hRet)) - hRet = GetFileNameFromShellItem(spItem, SIGDN_NORMALDISPLAY, lpstrFileTitle, cchLength); - - return hRet; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - HRESULT GetFilePath(_CSTRING_NS::CString& strFilePath) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg != NULL); - - ATL::CComPtr spItem; - HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem); - - if(SUCCEEDED(hRet)) - hRet = GetFileNameFromShellItem(spItem, SIGDN_FILESYSPATH, strFilePath); - - return hRet; - } - - HRESULT GetFileTitle(_CSTRING_NS::CString& strFileTitle) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg != NULL); - - ATL::CComPtr spItem; - HRESULT hRet = pT->m_spFileDlg->GetResult(&spItem); - - if(SUCCEEDED(hRet)) - hRet = GetFileNameFromShellItem(spItem, SIGDN_NORMALDISPLAY, strFileTitle); - - return hRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - -// Helpers for IShellItem - static HRESULT GetFileNameFromShellItem(IShellItem* pShellItem, SIGDN type, LPWSTR lpstr, int cchLength) - { - ATLASSERT(pShellItem != NULL); - - LPWSTR lpstrName = NULL; - HRESULT hRet = pShellItem->GetDisplayName(type, &lpstrName); - - if(SUCCEEDED(hRet)) - { - if(lstrlenW(lpstrName) < cchLength) - { - SecureHelper::strcpyW_x(lpstr, cchLength, lpstrName); - } - else - { - ATLASSERT(FALSE); - hRet = DISP_E_BUFFERTOOSMALL; - } - - ::CoTaskMemFree(lpstrName); - } - - return hRet; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - static HRESULT GetFileNameFromShellItem(IShellItem* pShellItem, SIGDN type, _CSTRING_NS::CString& str) - { - ATLASSERT(pShellItem != NULL); - - LPWSTR lpstrName = NULL; - HRESULT hRet = pShellItem->GetDisplayName(type, &lpstrName); - - if(SUCCEEDED(hRet)) - { - str = lpstrName; - ::CoTaskMemFree(lpstrName); - } - - return hRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - -// Implementation - void _Advise(DWORD& dwCookie) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg != NULL); - HRESULT hRet = pT->m_spFileDlg->Advise((IFileDialogEvents*)this, &dwCookie); - ATLVERIFY(SUCCEEDED(hRet)); - } - - void _Unadvise(DWORD dwCookie) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg != NULL); - HRESULT hRet = pT->m_spFileDlg->Unadvise(dwCookie); - ATLVERIFY(SUCCEEDED(hRet)); - } - - void _Init(LPCWSTR lpszFileName, DWORD dwOptions, LPCWSTR lpszDefExt, const COMDLG_FILTERSPEC* arrFilterSpec, UINT uFilterSpecCount) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg != NULL); - - HRESULT hRet = E_FAIL; - - if(lpszFileName != NULL) - { - hRet = pT->m_spFileDlg->SetFileName(lpszFileName); - ATLASSERT(SUCCEEDED(hRet)); - } - - hRet = pT->m_spFileDlg->SetOptions(dwOptions); - ATLASSERT(SUCCEEDED(hRet)); - - if(lpszDefExt != NULL) - { - hRet = pT->m_spFileDlg->SetDefaultExtension(lpszDefExt); - ATLASSERT(SUCCEEDED(hRet)); - } - - if(arrFilterSpec != NULL && uFilterSpecCount != 0U) - { - hRet = pT->m_spFileDlg->SetFileTypes(uFilterSpecCount, arrFilterSpec); - ATLASSERT(SUCCEEDED(hRet)); - } - } - -// Implementation - IUnknown interface - STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) - { - if(ppvObject == NULL) - return E_POINTER; - - T* pT = static_cast(this); - if(IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IFileDialogEvents)) - { - *ppvObject = (IFileDialogEvents*)pT; - // AddRef() not needed - return S_OK; - } - - return E_NOINTERFACE; - } - - virtual ULONG STDMETHODCALLTYPE AddRef() - { - return 1; - } - - virtual ULONG STDMETHODCALLTYPE Release() - { - return 1; - } - -// Implementation - IFileDialogEvents interface - virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFileOk(IFileDialog* pfd) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); - pfd; // avoid level 4 warning - return pT->OnFileOk(); - } - - virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFolderChanging(IFileDialog* pfd, IShellItem* psiFolder) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); - pfd; // avoid level 4 warning - return pT->OnFolderChanging(psiFolder); - } - - virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnFolderChange(IFileDialog* pfd) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); - pfd; // avoid level 4 warning - return pT->OnFolderChange(); - } - - virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnSelectionChange(IFileDialog* pfd) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); - pfd; // avoid level 4 warning - return pT->OnSelectionChange(); - } - - virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnShareViolation(IFileDialog* pfd, IShellItem* psi, FDE_SHAREVIOLATION_RESPONSE* pResponse) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); - pfd; // avoid level 4 warning - return pT->OnShareViolation(psi, pResponse); - } - - virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnTypeChange(IFileDialog* pfd) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); - pfd; // avoid level 4 warning - return pT->OnTypeChange(); - } - - virtual HRESULT STDMETHODCALLTYPE IFileDialogEvents::OnOverwrite(IFileDialog* pfd, IShellItem* psi, FDE_OVERWRITE_RESPONSE* pResponse) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_spFileDlg.IsEqualObject(pfd)); - pfd; // avoid level 4 warning - return pT->OnOverwrite(psi, pResponse); - } - -// Overrideables - Event handlers - HRESULT OnFileOk() - { - return E_NOTIMPL; - } - - HRESULT OnFolderChanging(IShellItem* /*psiFolder*/) - { - return E_NOTIMPL; - } - - HRESULT OnFolderChange() - { - return E_NOTIMPL; - } - - HRESULT OnSelectionChange() - { - return E_NOTIMPL; - } - - HRESULT OnShareViolation(IShellItem* /*psi*/, FDE_SHAREVIOLATION_RESPONSE* /*pResponse*/) - { - return E_NOTIMPL; - } - - HRESULT OnTypeChange() - { - return E_NOTIMPL; - } - - HRESULT OnOverwrite(IShellItem* /*psi*/, FDE_OVERWRITE_RESPONSE* /*pResponse*/) - { - return E_NOTIMPL; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CShellFileOpenDialogImpl - implements new Shell File Open dialog - -template -class ATL_NO_VTABLE CShellFileOpenDialogImpl : public CShellFileDialogImpl< T > -{ -public: - ATL::CComPtr m_spFileDlg; - - CShellFileOpenDialogImpl(LPCWSTR lpszFileName = NULL, - DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST, - LPCWSTR lpszDefExt = NULL, - const COMDLG_FILTERSPEC* arrFilterSpec = NULL, - UINT uFilterSpecCount = 0U) - { - HRESULT hRet = m_spFileDlg.CoCreateInstance(CLSID_FileOpenDialog); - - if(SUCCEEDED(hRet)) - _Init(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount); - } - - IFileOpenDialog* GetPtr() - { - return m_spFileDlg; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CShellFileOpenDialog - new Shell File Open dialog without events - -class CShellFileOpenDialog : public CShellFileOpenDialogImpl -{ -public: - CShellFileOpenDialog(LPCWSTR lpszFileName = NULL, - DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_FILEMUSTEXIST, - LPCWSTR lpszDefExt = NULL, - const COMDLG_FILTERSPEC* arrFilterSpec = NULL, - UINT uFilterSpecCount = 0U) : CShellFileOpenDialogImpl(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount) - { } - -// Implementation (remove _Advise/_Unadvise code using template magic) - void _Advise(DWORD& /*dwCookie*/) - { } - - void _Unadvise(DWORD /*dwCookie*/) - { } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CShellFileSaveDialogImpl - implements new Shell File Save dialog - -template -class ATL_NO_VTABLE CShellFileSaveDialogImpl : public CShellFileDialogImpl< T > -{ -public: - ATL::CComPtr m_spFileDlg; - - CShellFileSaveDialogImpl(LPCWSTR lpszFileName = NULL, - DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_OVERWRITEPROMPT, - LPCWSTR lpszDefExt = NULL, - const COMDLG_FILTERSPEC* arrFilterSpec = NULL, - UINT uFilterSpecCount = 0U) - { - HRESULT hRet = m_spFileDlg.CoCreateInstance(CLSID_FileSaveDialog); - - if(SUCCEEDED(hRet)) - _Init(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount); - } - - IFileSaveDialog* GetPtr() - { - return m_spFileDlg; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CShellFileSaveDialog - new Shell File Save dialog without events - -class CShellFileSaveDialog : public CShellFileSaveDialogImpl -{ -public: - CShellFileSaveDialog(LPCWSTR lpszFileName = NULL, - DWORD dwOptions = FOS_FORCEFILESYSTEM | FOS_PATHMUSTEXIST | FOS_OVERWRITEPROMPT, - LPCWSTR lpszDefExt = NULL, - const COMDLG_FILTERSPEC* arrFilterSpec = NULL, - UINT uFilterSpecCount = 0U) : CShellFileSaveDialogImpl(lpszFileName, dwOptions, lpszDefExt, arrFilterSpec, uFilterSpecCount) - { } - -// Implementation (remove _Advise/_Unadvise code using template magic) - void _Advise(DWORD& /*dwCookie*/) - { } - - void _Unadvise(DWORD /*dwCookie*/) - { } -}; - -#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// CFolderDialogImpl - used for browsing for a folder - -#ifndef _WIN32_WCE - -template -class ATL_NO_VTABLE CFolderDialogImpl -{ -public: - BROWSEINFO m_bi; - LPCTSTR m_lpstrInitialFolder; - LPCITEMIDLIST m_pidlInitialSelection; - bool m_bExpandInitialSelection; - TCHAR m_szFolderDisplayName[MAX_PATH]; - TCHAR m_szFolderPath[MAX_PATH]; - LPITEMIDLIST m_pidlSelected; - HWND m_hWnd; // used only in the callback function - -// Constructor - CFolderDialogImpl(HWND hWndParent = NULL, LPCTSTR lpstrTitle = NULL, UINT uFlags = BIF_RETURNONLYFSDIRS) : - m_lpstrInitialFolder(NULL), m_pidlInitialSelection(NULL), m_bExpandInitialSelection(false), m_pidlSelected(NULL), m_hWnd(NULL) - { - memset(&m_bi, 0, sizeof(m_bi)); // initialize structure to 0/NULL - - m_bi.hwndOwner = hWndParent; - m_bi.pidlRoot = NULL; - m_bi.pszDisplayName = m_szFolderDisplayName; - m_bi.lpszTitle = lpstrTitle; - m_bi.ulFlags = uFlags; - m_bi.lpfn = BrowseCallbackProc; - m_bi.lParam = (LPARAM)static_cast(this); - - m_szFolderPath[0] = 0; - m_szFolderDisplayName[0] = 0; - } - - ~CFolderDialogImpl() - { - ::CoTaskMemFree(m_pidlSelected); - } - -// Operations - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) - { - if(m_bi.hwndOwner == NULL) // set only if not specified before - m_bi.hwndOwner = hWndParent; - - // Clear out any previous results - m_szFolderPath[0] = 0; - m_szFolderDisplayName[0] = 0; - ::CoTaskMemFree(m_pidlSelected); - - INT_PTR nRet = IDCANCEL; - m_pidlSelected = ::SHBrowseForFolder(&m_bi); - - if(m_pidlSelected != NULL) - { - nRet = IDOK; - - // If BIF_RETURNONLYFSDIRS is set, we try to get the filesystem path. - // Otherwise, the caller must handle the ID-list directly. - if((m_bi.ulFlags & BIF_RETURNONLYFSDIRS) != 0) - { - if(::SHGetPathFromIDList(m_pidlSelected, m_szFolderPath) == FALSE) - nRet = IDCANCEL; - } - } - - return nRet; - } - - // Methods to call before DoModal - void SetInitialFolder(LPCTSTR lpstrInitialFolder, bool bExpand = true) - { - // lpstrInitialFolder may be a file if BIF_BROWSEINCLUDEFILES is specified - m_lpstrInitialFolder = lpstrInitialFolder; - m_bExpandInitialSelection = bExpand; - } - - void SetInitialSelection(LPCITEMIDLIST pidl, bool bExpand = true) - { - m_pidlInitialSelection = pidl; - m_bExpandInitialSelection = bExpand; - } - - // Methods to call after DoModal - LPITEMIDLIST GetSelectedItem(bool bDetach = false) - { - LPITEMIDLIST pidl = m_pidlSelected; - if(bDetach) - m_pidlSelected = NULL; - - return pidl; - } - - LPCTSTR GetFolderPath() const - { - return m_szFolderPath; - } - - LPCTSTR GetFolderDisplayName() const - { - return m_szFolderDisplayName; - } - - int GetFolderImageIndex() const - { - return m_bi.iImage; - } - -// Callback function and overrideables - static int CALLBACK BrowseCallbackProc(HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData) - { -#ifndef BFFM_VALIDATEFAILED - #ifdef UNICODE - const int BFFM_VALIDATEFAILED = 4; - #else - const int BFFM_VALIDATEFAILED = 3; - #endif -#endif // !BFFM_VALIDATEFAILED -#ifndef BFFM_IUNKNOWN - const int BFFM_IUNKNOWN = 5; -#endif // !BFFM_IUNKNOWN -#ifndef BIF_NEWDIALOGSTYLE - const UINT BIF_NEWDIALOGSTYLE = 0x0040; -#endif // !BIF_NEWDIALOGSTYLE - - int nRet = 0; - T* pT = (T*)lpData; - bool bClear = false; - if(pT->m_hWnd == NULL) - { - pT->m_hWnd = hWnd; - bClear = true; - } - else - { - ATLASSERT(pT->m_hWnd == hWnd); - } - - switch(uMsg) - { - case BFFM_INITIALIZED: - // Set initial selection - // Note that m_pidlInitialSelection, if set, takes precedence over m_lpstrInitialFolder - if(pT->m_pidlInitialSelection != NULL) - pT->SetSelection(pT->m_pidlInitialSelection); - else if(pT->m_lpstrInitialFolder != NULL) - pT->SetSelection(pT->m_lpstrInitialFolder); - - // Expand initial selection if appropriate - if(pT->m_bExpandInitialSelection && ((pT->m_bi.ulFlags & BIF_NEWDIALOGSTYLE) != 0)) - { - if(pT->m_pidlInitialSelection != NULL) - pT->SetExpanded(pT->m_pidlInitialSelection); - else if(pT->m_lpstrInitialFolder != NULL) - pT->SetExpanded(pT->m_lpstrInitialFolder); - } - pT->OnInitialized(); - break; - case BFFM_SELCHANGED: - pT->OnSelChanged((LPITEMIDLIST)lParam); - break; - case BFFM_VALIDATEFAILED: - nRet = pT->OnValidateFailed((LPCTSTR)lParam); - break; - case BFFM_IUNKNOWN: - pT->OnIUnknown((IUnknown*)lParam); - break; - default: - ATLTRACE2(atlTraceUI, 0, _T("Unknown message received in CFolderDialogImpl::BrowseCallbackProc\n")); - break; - } - - if(bClear) - pT->m_hWnd = NULL; - return nRet; - } - - void OnInitialized() - { - } - - void OnSelChanged(LPITEMIDLIST /*pItemIDList*/) - { - } - - int OnValidateFailed(LPCTSTR /*lpstrFolderPath*/) - { - return 1; // 1=continue, 0=EndDialog - } - - void OnIUnknown(IUnknown* /*pUnknown*/) - { - } - - // Commands - valid to call only from handlers - void EnableOK(BOOL bEnable) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, BFFM_ENABLEOK, 0, bEnable); - } - - void SetSelection(LPCITEMIDLIST pItemIDList) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, BFFM_SETSELECTION, FALSE, (LPARAM)pItemIDList); - } - - void SetSelection(LPCTSTR lpstrFolderPath) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, BFFM_SETSELECTION, TRUE, (LPARAM)lpstrFolderPath); - } - - void SetStatusText(LPCTSTR lpstrText) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, BFFM_SETSTATUSTEXT, 0, (LPARAM)lpstrText); - } - - void SetOKText(LPCTSTR lpstrOKText) - { -#ifndef BFFM_SETOKTEXT - const UINT BFFM_SETOKTEXT = WM_USER + 105; -#endif - ATLASSERT(m_hWnd != NULL); - USES_CONVERSION; - LPCWSTR lpstr = T2CW(lpstrOKText); - ::SendMessage(m_hWnd, BFFM_SETOKTEXT, 0, (LPARAM)lpstr); - } - - void SetExpanded(LPCITEMIDLIST pItemIDList) - { -#ifndef BFFM_SETEXPANDED - const UINT BFFM_SETEXPANDED = WM_USER + 106; -#endif - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, BFFM_SETEXPANDED, FALSE, (LPARAM)pItemIDList); - } - - void SetExpanded(LPCTSTR lpstrFolderPath) - { -#ifndef BFFM_SETEXPANDED - const UINT BFFM_SETEXPANDED = WM_USER + 106; -#endif - ATLASSERT(m_hWnd != NULL); - USES_CONVERSION; - LPCWSTR lpstr = T2CW(lpstrFolderPath); - ::SendMessage(m_hWnd, BFFM_SETEXPANDED, TRUE, (LPARAM)lpstr); - } -}; - -class CFolderDialog : public CFolderDialogImpl -{ -public: - CFolderDialog(HWND hWndParent = NULL, LPCTSTR lpstrTitle = NULL, UINT uFlags = BIF_RETURNONLYFSDIRS) - : CFolderDialogImpl(hWndParent, lpstrTitle, uFlags) - { } -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CCommonDialogImplBase - base class for common dialog classes - -class ATL_NO_VTABLE CCommonDialogImplBase : public ATL::CWindowImplBase -{ -public: - static UINT_PTR APIENTRY HookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) - { - if(uMsg != WM_INITDIALOG) - return 0; - CCommonDialogImplBase* pT = (CCommonDialogImplBase*)ModuleHelper::ExtractCreateWndData(); - ATLASSERT(pT != NULL); - ATLASSERT(pT->m_hWnd == NULL); - ATLASSERT(::IsWindow(hWnd)); - // subclass dialog's window - if(!pT->SubclassWindow(hWnd)) - { - ATLTRACE2(atlTraceUI, 0, _T("Subclassing a common dialog failed\n")); - return 0; - } - // check message map for WM_INITDIALOG handler - LRESULT lRes = 0; - if(pT->ProcessWindowMessage(pT->m_hWnd, uMsg, wParam, lParam, lRes, 0) == FALSE) - return 0; - return lRes; - } - -// Special override for common dialogs - BOOL EndDialog(INT_PTR /*nRetCode*/ = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - SendMessage(WM_COMMAND, MAKEWPARAM(IDABORT, 0)); - return TRUE; - } - -// Implementation - try to override these, to prevent errors - HWND Create(HWND, ATL::_U_RECT, LPCTSTR, DWORD, DWORD, ATL::_U_MENUorID, ATOM, LPVOID) - { - ATLASSERT(FALSE); // should not be called - return NULL; - } - - static LRESULT CALLBACK StartWindowProc(HWND /*hWnd*/, UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/) - { - ATLASSERT(FALSE); // should not be called - return 0; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CFontDialogImpl - font selection dialog - -#ifndef _WIN32_WCE - -template -class ATL_NO_VTABLE CFontDialogImpl : public CCommonDialogImplBase -{ -public: - enum { _cchStyleName = 64 }; - - CHOOSEFONT m_cf; - TCHAR m_szStyleName[_cchStyleName]; // contains style name after return - LOGFONT m_lf; // default LOGFONT to store the info - -// Constructors - CFontDialogImpl(LPLOGFONT lplfInitial = NULL, - DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, - HDC hDCPrinter = NULL, - HWND hWndParent = NULL) - { - memset(&m_cf, 0, sizeof(m_cf)); - memset(&m_lf, 0, sizeof(m_lf)); - memset(&m_szStyleName, 0, sizeof(m_szStyleName)); - - m_cf.lStructSize = sizeof(m_cf); - m_cf.hwndOwner = hWndParent; - m_cf.rgbColors = RGB(0, 0, 0); - m_cf.lpszStyle = (LPTSTR)&m_szStyleName; - m_cf.Flags = dwFlags | CF_ENABLEHOOK; - m_cf.lpfnHook = (LPCFHOOKPROC)T::HookProc; - - if(lplfInitial != NULL) - { - m_cf.lpLogFont = lplfInitial; - m_cf.Flags |= CF_INITTOLOGFONTSTRUCT; - m_lf = *lplfInitial; - } - else - { - m_cf.lpLogFont = &m_lf; - } - - if(hDCPrinter != NULL) - { - m_cf.hDC = hDCPrinter; - m_cf.Flags |= CF_PRINTERFONTS; - } - } - -// Operations - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) - { - ATLASSERT((m_cf.Flags & CF_ENABLEHOOK) != 0); - ATLASSERT(m_cf.lpfnHook != NULL); // can still be a user hook - - if(m_cf.hwndOwner == NULL) // set only if not specified before - m_cf.hwndOwner = hWndParent; - - ATLASSERT(m_hWnd == NULL); - ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); - - BOOL bRet = ::ChooseFont(&m_cf); - - m_hWnd = NULL; - - if(bRet) // copy logical font from user's initialization buffer (if needed) - SecureHelper::memcpy_x(&m_lf, sizeof(m_lf), m_cf.lpLogFont, sizeof(m_lf)); - - return bRet ? IDOK : IDCANCEL; - } - - // works only when the dialog is dislayed or after - void GetCurrentFont(LPLOGFONT lplf) const - { - ATLASSERT(lplf != NULL); - - if(m_hWnd != NULL) - ::SendMessage(m_hWnd, WM_CHOOSEFONT_GETLOGFONT, 0, (LPARAM)lplf); - else - *lplf = m_lf; - } - - // works only when the dialog is dislayed or before -#ifndef _WIN32_WCE - void SetLogFont(LPLOGFONT lplf) - { - ATLASSERT(lplf != NULL); -#ifndef WM_CHOOSEFONT_SETLOGFONT - const UINT WM_CHOOSEFONT_SETLOGFONT = (WM_USER + 101); -#endif - if(m_hWnd != NULL) - { - ::SendMessage(m_hWnd, WM_CHOOSEFONT_SETLOGFONT, 0, (LPARAM)lplf); - } - else - { - m_lf = *lplf; - m_cf.Flags |= CF_INITTOLOGFONTSTRUCT; - } - } - - void SetFlags(DWORD dwFlags) - { -#ifndef WM_CHOOSEFONT_SETFLAGS - const UINT WM_CHOOSEFONT_SETFLAGS = (WM_USER + 102); -#endif - if(m_hWnd != NULL) - { - CHOOSEFONT cf = { sizeof(CHOOSEFONT) }; - cf.Flags = dwFlags; - ::SendMessage(m_hWnd, WM_CHOOSEFONT_SETFLAGS, 0, (LPARAM)&cf); - } - else - { - m_cf.Flags = dwFlags; - } - } -#endif // !_WIN32_WCE - - // Helpers for parsing information after successful return - LPCTSTR GetFaceName() const // return the face name of the font - { - return (LPCTSTR)m_cf.lpLogFont->lfFaceName; - } - - LPCTSTR GetStyleName() const // return the style name of the font - { - return m_cf.lpszStyle; - } - - int GetSize() const // return the pt size of the font - { - return m_cf.iPointSize; - } - - COLORREF GetColor() const // return the color of the font - { - return m_cf.rgbColors; - } - - int GetWeight() const // return the chosen font weight - { - return (int)m_cf.lpLogFont->lfWeight; - } - - BOOL IsStrikeOut() const // return TRUE if strikeout - { - return (m_cf.lpLogFont->lfStrikeOut) ? TRUE : FALSE; - } - - BOOL IsUnderline() const // return TRUE if underline - { - return (m_cf.lpLogFont->lfUnderline) ? TRUE : FALSE; - } - - BOOL IsBold() const // return TRUE if bold font - { - return (m_cf.lpLogFont->lfWeight == FW_BOLD) ? TRUE : FALSE; - } - - BOOL IsItalic() const // return TRUE if italic font - { - return m_cf.lpLogFont->lfItalic ? TRUE : FALSE; - } -}; - -class CFontDialog : public CFontDialogImpl -{ -public: - CFontDialog(LPLOGFONT lplfInitial = NULL, - DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS, - HDC hDCPrinter = NULL, - HWND hWndParent = NULL) - : CFontDialogImpl(lplfInitial, dwFlags, hDCPrinter, hWndParent) - { } - - DECLARE_EMPTY_MSG_MAP() -}; - -#endif // _WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CRichEditFontDialogImpl - font selection for the Rich Edit ctrl - -#if defined(_RICHEDIT_) && !defined(_WIN32_WCE) - -template -class ATL_NO_VTABLE CRichEditFontDialogImpl : public CFontDialogImpl< T > -{ -public: - CRichEditFontDialogImpl(const CHARFORMAT& charformat, - DWORD dwFlags = CF_SCREENFONTS, - HDC hDCPrinter = NULL, - HWND hWndParent = NULL) - : CFontDialogImpl< T >(NULL, dwFlags, hDCPrinter, hWndParent) - { - m_cf.Flags |= CF_INITTOLOGFONTSTRUCT; - m_cf.Flags |= FillInLogFont(charformat); - m_cf.lpLogFont = &m_lf; - - if((charformat.dwMask & CFM_COLOR) != 0) - m_cf.rgbColors = charformat.crTextColor; - } - - void GetCharFormat(CHARFORMAT& cf) const - { - USES_CONVERSION; - cf.dwEffects = 0; - cf.dwMask = 0; - if((m_cf.Flags & CF_NOSTYLESEL) == 0) - { - cf.dwMask |= CFM_BOLD | CFM_ITALIC; - cf.dwEffects |= IsBold() ? CFE_BOLD : 0; - cf.dwEffects |= IsItalic() ? CFE_ITALIC : 0; - } - if((m_cf.Flags & CF_NOSIZESEL) == 0) - { - cf.dwMask |= CFM_SIZE; - // GetSize() returns in tenths of points so mulitply by 2 to get twips - cf.yHeight = GetSize() * 2; - } - - if((m_cf.Flags & CF_NOFACESEL) == 0) - { - cf.dwMask |= CFM_FACE; - cf.bPitchAndFamily = m_cf.lpLogFont->lfPitchAndFamily; -#if (_RICHEDIT_VER >= 0x0200) - SecureHelper::strcpy_x(cf.szFaceName, _countof(cf.szFaceName), GetFaceName()); -#else // !(_RICHEDIT_VER >= 0x0200) - SecureHelper::strcpyA_x(cf.szFaceName, _countof(cf.szFaceName), T2A((LPTSTR)(LPCTSTR)GetFaceName())); -#endif // !(_RICHEDIT_VER >= 0x0200) - } - - if((m_cf.Flags & CF_EFFECTS) != 0) - { - cf.dwMask |= CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR; - cf.dwEffects |= IsUnderline() ? CFE_UNDERLINE : 0; - cf.dwEffects |= IsStrikeOut() ? CFE_STRIKEOUT : 0; - cf.crTextColor = GetColor(); - } - if((m_cf.Flags & CF_NOSCRIPTSEL) == 0) - { - cf.bCharSet = m_cf.lpLogFont->lfCharSet; - cf.dwMask |= CFM_CHARSET; - } - cf.yOffset = 0; - } - - DWORD FillInLogFont(const CHARFORMAT& cf) - { - USES_CONVERSION; - DWORD dwFlags = 0; - if((cf.dwMask & CFM_SIZE) != 0) - { - HDC hDC = ::CreateDC(_T("DISPLAY"), NULL, NULL, NULL); - LONG yPerInch = ::GetDeviceCaps(hDC, LOGPIXELSY); - m_lf.lfHeight = -(int)((cf.yHeight * yPerInch) / 1440); - } - else - m_lf.lfHeight = 0; - - m_lf.lfWidth = 0; - m_lf.lfEscapement = 0; - m_lf.lfOrientation = 0; - - if((cf.dwMask & (CFM_ITALIC | CFM_BOLD)) == (CFM_ITALIC | CFM_BOLD)) - { - m_lf.lfWeight = ((cf.dwEffects & CFE_BOLD) != 0) ? FW_BOLD : FW_NORMAL; - m_lf.lfItalic = (BYTE)(((cf.dwEffects & CFE_ITALIC) != 0) ? TRUE : FALSE); - } - else - { - dwFlags |= CF_NOSTYLESEL; - m_lf.lfWeight = FW_DONTCARE; - m_lf.lfItalic = FALSE; - } - - if((cf.dwMask & (CFM_UNDERLINE | CFM_STRIKEOUT | CFM_COLOR)) == (CFM_UNDERLINE|CFM_STRIKEOUT|CFM_COLOR)) - { - dwFlags |= CF_EFFECTS; - m_lf.lfUnderline = (BYTE)(((cf.dwEffects & CFE_UNDERLINE) != 0) ? TRUE : FALSE); - m_lf.lfStrikeOut = (BYTE)(((cf.dwEffects & CFE_STRIKEOUT) != 0) ? TRUE : FALSE); - } - else - { - m_lf.lfUnderline = (BYTE)FALSE; - m_lf.lfStrikeOut = (BYTE)FALSE; - } - - if((cf.dwMask & CFM_CHARSET) != 0) - m_lf.lfCharSet = cf.bCharSet; - else - dwFlags |= CF_NOSCRIPTSEL; - m_lf.lfOutPrecision = OUT_DEFAULT_PRECIS; - m_lf.lfClipPrecision = CLIP_DEFAULT_PRECIS; - m_lf.lfQuality = DEFAULT_QUALITY; - if((cf.dwMask & CFM_FACE) != 0) - { - m_lf.lfPitchAndFamily = cf.bPitchAndFamily; -#if (_RICHEDIT_VER >= 0x0200) - SecureHelper::strcpy_x(m_lf.lfFaceName, _countof(m_lf.lfFaceName), cf.szFaceName); -#else // !(_RICHEDIT_VER >= 0x0200) - SecureHelper::strcpy_x(m_lf.lfFaceName, _countof(m_lf.lfFaceName), A2T((LPSTR)cf.szFaceName)); -#endif // !(_RICHEDIT_VER >= 0x0200) - } - else - { - m_lf.lfPitchAndFamily = DEFAULT_PITCH|FF_DONTCARE; - m_lf.lfFaceName[0] = (TCHAR)0; - } - return dwFlags; - } -}; - -class CRichEditFontDialog : public CRichEditFontDialogImpl -{ -public: - CRichEditFontDialog(const CHARFORMAT& charformat, - DWORD dwFlags = CF_SCREENFONTS, - HDC hDCPrinter = NULL, - HWND hWndParent = NULL) - : CRichEditFontDialogImpl(charformat, dwFlags, hDCPrinter, hWndParent) - { } - - DECLARE_EMPTY_MSG_MAP() -}; - -#endif // defined(_RICHEDIT_) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// CColorDialogImpl - color selection - -#if !defined(_WIN32_WCE) || ((_WIN32_WCE > 420) && !(defined(WIN32_PLATFORM_WFSP) && (_WIN32_WCE > 0x0500))) - -#ifdef _WIN32_WCE - #pragma comment(lib, "commdlg.lib") - - #ifndef SETRGBSTRING - #define SETRGBSTRING _T("commdlg_SetRGBColor") - #endif - - #ifndef COLOROKSTRING - #define COLOROKSTRING _T("commdlg_ColorOK") - #endif -#endif - -template -class ATL_NO_VTABLE CColorDialogImpl : public CCommonDialogImplBase -{ -public: - CHOOSECOLOR m_cc; - -// Constructor - CColorDialogImpl(COLORREF clrInit = 0, DWORD dwFlags = 0, HWND hWndParent = NULL) - { - memset(&m_cc, 0, sizeof(m_cc)); - - m_cc.lStructSize = sizeof(m_cc); - m_cc.lpCustColors = GetCustomColors(); - m_cc.hwndOwner = hWndParent; - m_cc.Flags = dwFlags | CC_ENABLEHOOK; - m_cc.lpfnHook = (LPCCHOOKPROC)T::HookProc; - - if(clrInit != 0) - { - m_cc.rgbResult = clrInit; - m_cc.Flags |= CC_RGBINIT; - } - } - -// Operations - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) - { - ATLASSERT((m_cc.Flags & CC_ENABLEHOOK) != 0); - ATLASSERT(m_cc.lpfnHook != NULL); // can still be a user hook - - if(m_cc.hwndOwner == NULL) // set only if not specified before - m_cc.hwndOwner = hWndParent; - - ATLASSERT(m_hWnd == NULL); - ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); - - BOOL bRet = ::ChooseColor(&m_cc); - - m_hWnd = NULL; - - return bRet ? IDOK : IDCANCEL; - } - - // Set the current color while dialog is displayed - void SetCurrentColor(COLORREF clr) - { - ATLASSERT(::IsWindow(m_hWnd)); - SendMessage(_GetSetRGBMessage(), 0, (LPARAM)clr); - } - - // Get the selected color after DoModal returns, or in OnColorOK - COLORREF GetColor() const - { - return m_cc.rgbResult; - } - -// Special override for the color dialog - static UINT_PTR APIENTRY HookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) - { - if(uMsg != WM_INITDIALOG && uMsg != _GetColorOKMessage()) - return 0; - - LPCHOOSECOLOR lpCC = (LPCHOOSECOLOR)lParam; - CCommonDialogImplBase* pT = NULL; - - if(uMsg == WM_INITDIALOG) - { - pT = (CCommonDialogImplBase*)ModuleHelper::ExtractCreateWndData(); - lpCC->lCustData = (LPARAM)pT; - ATLASSERT(pT != NULL); - ATLASSERT(pT->m_hWnd == NULL); - ATLASSERT(::IsWindow(hWnd)); - // subclass dialog's window - if(!pT->SubclassWindow(hWnd)) - { - ATLTRACE2(atlTraceUI, 0, _T("Subclassing a Color common dialog failed\n")); - return 0; - } - } - else if(uMsg == _GetColorOKMessage()) - { - pT = (CCommonDialogImplBase*)lpCC->lCustData; - ATLASSERT(pT != NULL); - ATLASSERT(::IsWindow(pT->m_hWnd)); - } - - // pass to the message map - LRESULT lRes; - if(pT->ProcessWindowMessage(pT->m_hWnd, uMsg, wParam, lParam, lRes, 0) == FALSE) - return 0; - return lRes; - } - -// Helpers - static COLORREF* GetCustomColors() - { - static COLORREF rgbCustomColors[16] = - { - RGB(255, 255, 255), RGB(255, 255, 255), - RGB(255, 255, 255), RGB(255, 255, 255), - RGB(255, 255, 255), RGB(255, 255, 255), - RGB(255, 255, 255), RGB(255, 255, 255), - RGB(255, 255, 255), RGB(255, 255, 255), - RGB(255, 255, 255), RGB(255, 255, 255), - RGB(255, 255, 255), RGB(255, 255, 255), - RGB(255, 255, 255), RGB(255, 255, 255), - }; - - return rgbCustomColors; - } - - static UINT _GetSetRGBMessage() - { - static UINT uSetRGBMessage = 0; - if(uSetRGBMessage == 0) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CColorDialogImpl::_GetSetRGBMessage.\n")); - ATLASSERT(FALSE); - return 0; - } - - if(uSetRGBMessage == 0) - uSetRGBMessage = ::RegisterWindowMessage(SETRGBSTRING); - - lock.Unlock(); - } - ATLASSERT(uSetRGBMessage != 0); - return uSetRGBMessage; - } - - static UINT _GetColorOKMessage() - { - static UINT uColorOKMessage = 0; - if(uColorOKMessage == 0) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CColorDialogImpl::_GetColorOKMessage.\n")); - ATLASSERT(FALSE); - return 0; - } - - if(uColorOKMessage == 0) - uColorOKMessage = ::RegisterWindowMessage(COLOROKSTRING); - - lock.Unlock(); - } - ATLASSERT(uColorOKMessage != 0); - return uColorOKMessage; - } - -// Message map and handlers - BEGIN_MSG_MAP(CColorDialogImpl) - MESSAGE_HANDLER(_GetColorOKMessage(), _OnColorOK) - END_MSG_MAP() - - LRESULT _OnColorOK(UINT, WPARAM, LPARAM, BOOL&) - { - T* pT = static_cast(this); - return pT->OnColorOK(); - } - -// Overrideable - BOOL OnColorOK() // validate color - { - return FALSE; - } -}; - -class CColorDialog : public CColorDialogImpl -{ -public: - CColorDialog(COLORREF clrInit = 0, DWORD dwFlags = 0, HWND hWndParent = NULL) - : CColorDialogImpl(clrInit, dwFlags, hWndParent) - { } - - // override base class map and references to handlers - DECLARE_EMPTY_MSG_MAP() -}; - -#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE > 420) && !(defined(WIN32_PLATFORM_WFSP) && (_WIN32_WCE > 0x0500))) - - -/////////////////////////////////////////////////////////////////////////////// -// CPrintDialogImpl - used for Print... and PrintSetup... - -#ifndef _WIN32_WCE - -// global helper -static HDC _AtlCreateDC(HGLOBAL hDevNames, HGLOBAL hDevMode) -{ - if(hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDevNames = (LPDEVNAMES)::GlobalLock(hDevNames); - LPDEVMODE lpDevMode = (hDevMode != NULL) ? (LPDEVMODE)::GlobalLock(hDevMode) : NULL; - - if(lpDevNames == NULL) - return NULL; - - HDC hDC = ::CreateDC((LPCTSTR)lpDevNames + lpDevNames->wDriverOffset, - (LPCTSTR)lpDevNames + lpDevNames->wDeviceOffset, - (LPCTSTR)lpDevNames + lpDevNames->wOutputOffset, - lpDevMode); - - ::GlobalUnlock(hDevNames); - if(hDevMode != NULL) - ::GlobalUnlock(hDevMode); - return hDC; -} - -template -class ATL_NO_VTABLE CPrintDialogImpl : public CCommonDialogImplBase -{ -public: - // print dialog parameter block (note this is a reference) - PRINTDLG& m_pd; - -// Constructors - CPrintDialogImpl(BOOL bPrintSetupOnly = FALSE, // TRUE for Print Setup, FALSE for Print Dialog - DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION, - HWND hWndParent = NULL) - : m_pd(m_pdActual) - { - memset(&m_pdActual, 0, sizeof(m_pdActual)); - - m_pd.lStructSize = sizeof(m_pdActual); - m_pd.hwndOwner = hWndParent; - m_pd.Flags = (dwFlags | PD_ENABLEPRINTHOOK | PD_ENABLESETUPHOOK); - m_pd.lpfnPrintHook = (LPPRINTHOOKPROC)T::HookProc; - m_pd.lpfnSetupHook = (LPSETUPHOOKPROC)T::HookProc; - - if(bPrintSetupOnly) - m_pd.Flags |= PD_PRINTSETUP; - else - m_pd.Flags |= PD_RETURNDC; - - m_pd.Flags &= ~PD_RETURNIC; // do not support information context - } - -// Operations - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) - { - ATLASSERT((m_pd.Flags & PD_ENABLEPRINTHOOK) != 0); - ATLASSERT((m_pd.Flags & PD_ENABLESETUPHOOK) != 0); - ATLASSERT(m_pd.lpfnPrintHook != NULL); // can still be a user hook - ATLASSERT(m_pd.lpfnSetupHook != NULL); // can still be a user hook - ATLASSERT((m_pd.Flags & PD_RETURNDEFAULT) == 0); // use GetDefaults for this - - if(m_pd.hwndOwner == NULL) // set only if not specified before - m_pd.hwndOwner = hWndParent; - - ATLASSERT(m_hWnd == NULL); - ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); - - BOOL bRet = ::PrintDlg(&m_pd); - - m_hWnd = NULL; - - return bRet ? IDOK : IDCANCEL; - } - - // GetDefaults will not display a dialog but will get device defaults - BOOL GetDefaults() - { - m_pd.Flags |= PD_RETURNDEFAULT; - ATLASSERT(m_pd.hDevMode == NULL); // must be NULL - ATLASSERT(m_pd.hDevNames == NULL); // must be NULL - - return ::PrintDlg(&m_pd); - } - - // Helpers for parsing information after successful return num. copies requested - int GetCopies() const - { - if((m_pd.Flags & PD_USEDEVMODECOPIES) != 0) - { - LPDEVMODE lpDevMode = GetDevMode(); - return (lpDevMode != NULL) ? lpDevMode->dmCopies : -1; - } - - return m_pd.nCopies; - } - - BOOL PrintCollate() const // TRUE if collate checked - { - return ((m_pd.Flags & PD_COLLATE) != 0) ? TRUE : FALSE; - } - - BOOL PrintSelection() const // TRUE if printing selection - { - return ((m_pd.Flags & PD_SELECTION) != 0) ? TRUE : FALSE; - } - - BOOL PrintAll() const // TRUE if printing all pages - { - return (!PrintRange() && !PrintSelection()) ? TRUE : FALSE; - } - - BOOL PrintRange() const // TRUE if printing page range - { - return ((m_pd.Flags & PD_PAGENUMS) != 0) ? TRUE : FALSE; - } - - BOOL PrintToFile() const // TRUE if printing to a file - { - return ((m_pd.Flags & PD_PRINTTOFILE) != 0) ? TRUE : FALSE; - } - - int GetFromPage() const // starting page if valid - { - return PrintRange() ? m_pd.nFromPage : -1; - } - - int GetToPage() const // ending page if valid - { - return PrintRange() ? m_pd.nToPage : -1; - } - - LPDEVMODE GetDevMode() const // return DEVMODE - { - if(m_pd.hDevMode == NULL) - return NULL; - - return (LPDEVMODE)::GlobalLock(m_pd.hDevMode); - } - - LPCTSTR GetDriverName() const // return driver name - { - if(m_pd.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames); - if(lpDev == NULL) - return NULL; - - return (LPCTSTR)lpDev + lpDev->wDriverOffset; - } - - LPCTSTR GetDeviceName() const // return device name - { - if(m_pd.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames); - if(lpDev == NULL) - return NULL; - - return (LPCTSTR)lpDev + lpDev->wDeviceOffset; - } - - LPCTSTR GetPortName() const // return output port name - { - if(m_pd.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pd.hDevNames); - if(lpDev == NULL) - return NULL; - - return (LPCTSTR)lpDev + lpDev->wOutputOffset; - } - - HDC GetPrinterDC() const // return HDC (caller must delete) - { - ATLASSERT((m_pd.Flags & PD_RETURNDC) != 0); - return m_pd.hDC; - } - - // This helper creates a DC based on the DEVNAMES and DEVMODE structures. - // This DC is returned, but also stored in m_pd.hDC as though it had been - // returned by CommDlg. It is assumed that any previously obtained DC - // has been/will be deleted by the user. This may be - // used without ever invoking the print/print setup dialogs. - HDC CreatePrinterDC() - { - m_pd.hDC = _AtlCreateDC(m_pd.hDevNames, m_pd.hDevMode); - return m_pd.hDC; - } - -// Implementation - PRINTDLG m_pdActual; // the Print/Print Setup need to share this - - // The following handle the case of print setup... from the print dialog - CPrintDialogImpl(PRINTDLG& pdInit) : m_pd(pdInit) - { } - - BEGIN_MSG_MAP(CPrintDialogImpl) -#ifdef psh1 - COMMAND_ID_HANDLER(psh1, OnPrintSetup) // print setup button when print is displayed -#else // !psh1 - COMMAND_ID_HANDLER(0x0400, OnPrintSetup) // value from dlgs.h -#endif // !psh1 - END_MSG_MAP() - - LRESULT OnPrintSetup(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& /*bHandled*/) - { - T dlgSetup(m_pd); - ModuleHelper::AddCreateWndData(&dlgSetup.m_thunk.cd, (CCommonDialogImplBase*)&dlgSetup); - return DefWindowProc(WM_COMMAND, MAKEWPARAM(wID, wNotifyCode), (LPARAM)hWndCtl); - } -}; - -class CPrintDialog : public CPrintDialogImpl -{ -public: - CPrintDialog(BOOL bPrintSetupOnly = FALSE, - DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION, - HWND hWndParent = NULL) - : CPrintDialogImpl(bPrintSetupOnly, dwFlags, hWndParent) - { } - - CPrintDialog(PRINTDLG& pdInit) : CPrintDialogImpl(pdInit) - { } -}; - -#endif // _WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CPrintDialogExImpl - new print dialog for Windows 2000 - -#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) - -}; // namespace WTL - -#include - -extern "C" const __declspec(selectany) IID IID_IPrintDialogCallback = {0x5852a2c3, 0x6530, 0x11d1, {0xb6, 0xa3, 0x0, 0x0, 0xf8, 0x75, 0x7b, 0xf9}}; -extern "C" const __declspec(selectany) IID IID_IPrintDialogServices = {0x509aaeda, 0x5639, 0x11d1, {0xb6, 0xa1, 0x0, 0x0, 0xf8, 0x75, 0x7b, 0xf9}}; - -namespace WTL -{ - -template -class ATL_NO_VTABLE CPrintDialogExImpl : - public ATL::CWindow, - public ATL::CMessageMap, - public IPrintDialogCallback, - public ATL::IObjectWithSiteImpl< T > -{ -public: - PRINTDLGEX m_pdex; - -// Constructor - CPrintDialogExImpl(DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_NOCURRENTPAGE, - HWND hWndParent = NULL) - { - memset(&m_pdex, 0, sizeof(m_pdex)); - - m_pdex.lStructSize = sizeof(PRINTDLGEX); - m_pdex.hwndOwner = hWndParent; - m_pdex.Flags = dwFlags; - m_pdex.nStartPage = START_PAGE_GENERAL; - // callback object will be set in DoModal - - m_pdex.Flags &= ~PD_RETURNIC; // do not support information context - } - -// Operations - HRESULT DoModal(HWND hWndParent = ::GetActiveWindow()) - { - ATLASSERT(m_hWnd == NULL); - ATLASSERT((m_pdex.Flags & PD_RETURNDEFAULT) == 0); // use GetDefaults for this - - if(m_pdex.hwndOwner == NULL) // set only if not specified before - m_pdex.hwndOwner = hWndParent; - - T* pT = static_cast(this); - m_pdex.lpCallback = (IUnknown*)(IPrintDialogCallback*)pT; - - HRESULT hResult = ::PrintDlgEx(&m_pdex); - - m_hWnd = NULL; - - return hResult; - } - - BOOL EndDialog(INT_PTR /*nRetCode*/ = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - SendMessage(WM_COMMAND, MAKEWPARAM(IDABORT, 0)); - return TRUE; - } - - // GetDefaults will not display a dialog but will get device defaults - HRESULT GetDefaults() - { - m_pdex.Flags |= PD_RETURNDEFAULT; - ATLASSERT(m_pdex.hDevMode == NULL); // must be NULL - ATLASSERT(m_pdex.hDevNames == NULL); // must be NULL - - return ::PrintDlgEx(&m_pdex); - } - - // Helpers for parsing information after successful return num. copies requested - int GetCopies() const - { - if((m_pdex.Flags & PD_USEDEVMODECOPIES) != 0) - { - LPDEVMODE lpDevMode = GetDevMode(); - return (lpDevMode != NULL) ? lpDevMode->dmCopies : -1; - } - - return m_pdex.nCopies; - } - - BOOL PrintCollate() const // TRUE if collate checked - { - return ((m_pdex.Flags & PD_COLLATE) != 0) ? TRUE : FALSE; - } - - BOOL PrintSelection() const // TRUE if printing selection - { - return ((m_pdex.Flags & PD_SELECTION) != 0) ? TRUE : FALSE; - } - - BOOL PrintAll() const // TRUE if printing all pages - { - return (!PrintRange() && !PrintSelection()) ? TRUE : FALSE; - } - - BOOL PrintRange() const // TRUE if printing page range - { - return ((m_pdex.Flags & PD_PAGENUMS) != 0) ? TRUE : FALSE; - } - - BOOL PrintToFile() const // TRUE if printing to a file - { - return ((m_pdex.Flags & PD_PRINTTOFILE) != 0) ? TRUE : FALSE; - } - - LPDEVMODE GetDevMode() const // return DEVMODE - { - if(m_pdex.hDevMode == NULL) - return NULL; - - return (LPDEVMODE)::GlobalLock(m_pdex.hDevMode); - } - - LPCTSTR GetDriverName() const // return driver name - { - if(m_pdex.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames); - if(lpDev == NULL) - return NULL; - - return (LPCTSTR)lpDev + lpDev->wDriverOffset; - } - - LPCTSTR GetDeviceName() const // return device name - { - if(m_pdex.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames); - if(lpDev == NULL) - return NULL; - - return (LPCTSTR)lpDev + lpDev->wDeviceOffset; - } - - LPCTSTR GetPortName() const // return output port name - { - if(m_pdex.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_pdex.hDevNames); - if(lpDev == NULL) - return NULL; - - return (LPCTSTR)lpDev + lpDev->wOutputOffset; - } - - HDC GetPrinterDC() const // return HDC (caller must delete) - { - ATLASSERT((m_pdex.Flags & PD_RETURNDC) != 0); - return m_pdex.hDC; - } - - // This helper creates a DC based on the DEVNAMES and DEVMODE structures. - // This DC is returned, but also stored in m_pdex.hDC as though it had been - // returned by CommDlg. It is assumed that any previously obtained DC - // has been/will be deleted by the user. This may be - // used without ever invoking the print/print setup dialogs. - HDC CreatePrinterDC() - { - m_pdex.hDC = _AtlCreateDC(m_pdex.hDevNames, m_pdex.hDevMode); - return m_pdex.hDC; - } - -// Implementation - interfaces - -// IUnknown - STDMETHOD(QueryInterface)(REFIID riid, void** ppvObject) - { - if(ppvObject == NULL) - return E_POINTER; - - T* pT = static_cast(this); - if(IsEqualGUID(riid, IID_IUnknown) || IsEqualGUID(riid, IID_IPrintDialogCallback)) - { - *ppvObject = (IPrintDialogCallback*)pT; - // AddRef() not needed - return S_OK; - } - else if(IsEqualGUID(riid, IID_IObjectWithSite)) - { - *ppvObject = (IObjectWithSite*)pT; - // AddRef() not needed - return S_OK; - } - - return E_NOINTERFACE; - } - - virtual ULONG STDMETHODCALLTYPE AddRef() - { - return 1; - } - - virtual ULONG STDMETHODCALLTYPE Release() - { - return 1; - } - -// IPrintDialogCallback - STDMETHOD(InitDone)() - { - return S_FALSE; - } - - STDMETHOD(SelectionChange)() - { - return S_FALSE; - } - - STDMETHOD(HandleMessage)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT* plResult) - { - // set up m_hWnd the first time - if(m_hWnd == NULL) - Attach(hWnd); - - // call message map - HRESULT hRet = ProcessWindowMessage(hWnd, uMsg, wParam, lParam, *plResult, 0) ? S_OK : S_FALSE; - if(hRet == S_OK && uMsg == WM_NOTIFY) // return in DWLP_MSGRESULT - ::SetWindowLongPtr(GetParent(), DWLP_MSGRESULT, (LONG_PTR)*plResult); - - if(uMsg == WM_INITDIALOG && hRet == S_OK && (BOOL)*plResult != FALSE) - hRet = S_FALSE; - - return hRet; - } -}; - -class CPrintDialogEx : public CPrintDialogExImpl -{ -public: - CPrintDialogEx( - DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES | PD_NOPAGENUMS | PD_NOSELECTION | PD_NOCURRENTPAGE, - HWND hWndParent = NULL) - : CPrintDialogExImpl(dwFlags, hWndParent) - { } - - DECLARE_EMPTY_MSG_MAP() -}; - -#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// CPageSetupDialogImpl - Page Setup dialog - -#ifndef _WIN32_WCE - -template -class ATL_NO_VTABLE CPageSetupDialogImpl : public CCommonDialogImplBase -{ -public: - PAGESETUPDLG m_psd; - ATL::CWndProcThunk m_thunkPaint; - -// Constructors - CPageSetupDialogImpl(DWORD dwFlags = PSD_MARGINS | PSD_INWININIINTLMEASURE, HWND hWndParent = NULL) - { - memset(&m_psd, 0, sizeof(m_psd)); - - m_psd.lStructSize = sizeof(m_psd); - m_psd.hwndOwner = hWndParent; - m_psd.Flags = (dwFlags | PSD_ENABLEPAGESETUPHOOK | PSD_ENABLEPAGEPAINTHOOK); - m_psd.lpfnPageSetupHook = (LPPAGESETUPHOOK)T::HookProc; - m_thunkPaint.Init((WNDPROC)T::PaintHookProc, this); -#if (_ATL_VER >= 0x0700) - m_psd.lpfnPagePaintHook = (LPPAGEPAINTHOOK)m_thunkPaint.GetWNDPROC(); -#else - m_psd.lpfnPagePaintHook = (LPPAGEPAINTHOOK)&(m_thunkPaint.thunk); -#endif - } - - DECLARE_EMPTY_MSG_MAP() - -// Attributes - LPDEVMODE GetDevMode() const // return DEVMODE - { - if(m_psd.hDevMode == NULL) - return NULL; - - return (LPDEVMODE)::GlobalLock(m_psd.hDevMode); - } - - LPCTSTR GetDriverName() const // return driver name - { - if(m_psd.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames); - return (LPCTSTR)lpDev + lpDev->wDriverOffset; - } - - LPCTSTR GetDeviceName() const // return device name - { - if(m_psd.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames); - return (LPCTSTR)lpDev + lpDev->wDeviceOffset; - } - - LPCTSTR GetPortName() const // return output port name - { - if(m_psd.hDevNames == NULL) - return NULL; - - LPDEVNAMES lpDev = (LPDEVNAMES)::GlobalLock(m_psd.hDevNames); - return (LPCTSTR)lpDev + lpDev->wOutputOffset; - } - - HDC CreatePrinterDC() - { - return _AtlCreateDC(m_psd.hDevNames, m_psd.hDevMode); - } - - SIZE GetPaperSize() const - { - SIZE size; - size.cx = m_psd.ptPaperSize.x; - size.cy = m_psd.ptPaperSize.y; - return size; - } - - void GetMargins(LPRECT lpRectMargins, LPRECT lpRectMinMargins) const - { - if(lpRectMargins != NULL) - *lpRectMargins = m_psd.rtMargin; - if(lpRectMinMargins != NULL) - *lpRectMinMargins = m_psd.rtMinMargin; - } - -// Operations - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) - { - ATLASSERT((m_psd.Flags & PSD_ENABLEPAGESETUPHOOK) != 0); - ATLASSERT((m_psd.Flags & PSD_ENABLEPAGEPAINTHOOK) != 0); - ATLASSERT(m_psd.lpfnPageSetupHook != NULL); // can still be a user hook - ATLASSERT(m_psd.lpfnPagePaintHook != NULL); // can still be a user hook - - if(m_psd.hwndOwner == NULL) // set only if not specified before - m_psd.hwndOwner = hWndParent; - - ATLASSERT(m_hWnd == NULL); - ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); - - BOOL bRet = ::PageSetupDlg(&m_psd); - - m_hWnd = NULL; - - return bRet ? IDOK : IDCANCEL; - } - -// Implementation - static UINT_PTR CALLBACK PaintHookProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) - { - T* pT = (T*)hWnd; - UINT_PTR uRet = 0; - switch(uMsg) - { - case WM_PSD_PAGESETUPDLG: - uRet = pT->PreDrawPage(LOWORD(wParam), HIWORD(wParam), (LPPAGESETUPDLG)lParam); - break; - case WM_PSD_FULLPAGERECT: - case WM_PSD_MINMARGINRECT: - case WM_PSD_MARGINRECT: - case WM_PSD_GREEKTEXTRECT: - case WM_PSD_ENVSTAMPRECT: - case WM_PSD_YAFULLPAGERECT: - uRet = pT->OnDrawPage(uMsg, (HDC)wParam, (LPRECT)lParam); - break; - default: - ATLTRACE2(atlTraceUI, 0, _T("CPageSetupDialogImpl::PaintHookProc - unknown message received\n")); - break; - } - return uRet; - } - -// Overridables - UINT_PTR PreDrawPage(WORD /*wPaper*/, WORD /*wFlags*/, LPPAGESETUPDLG /*pPSD*/) - { - // return 1 to prevent any more drawing - return 0; - } - - UINT_PTR OnDrawPage(UINT /*uMsg*/, HDC /*hDC*/, LPRECT /*lpRect*/) - { - return 0; // do the default - } -}; - -class CPageSetupDialog : public CPageSetupDialogImpl -{ -public: - CPageSetupDialog(DWORD dwFlags = PSD_MARGINS | PSD_INWININIINTLMEASURE, HWND hWndParent = NULL) - : CPageSetupDialogImpl(dwFlags, hWndParent) - { } - - // override PaintHookProc and references to handlers - static UINT_PTR CALLBACK PaintHookProc(HWND, UINT, WPARAM, LPARAM) - { - return 0; - } -}; - -#endif // _WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CFindReplaceDialogImpl - Find/FindReplace modeless dialogs - -#ifndef _WIN32_WCE - -template -class ATL_NO_VTABLE CFindReplaceDialogImpl : public CCommonDialogImplBase -{ -public: - enum { _cchFindReplaceBuffer = 128 }; - - FINDREPLACE m_fr; - TCHAR m_szFindWhat[_cchFindReplaceBuffer]; - TCHAR m_szReplaceWith[_cchFindReplaceBuffer]; - -// Constructors - CFindReplaceDialogImpl() - { - memset(&m_fr, 0, sizeof(m_fr)); - m_szFindWhat[0] = _T('\0'); - m_szReplaceWith[0] = _T('\0'); - - m_fr.lStructSize = sizeof(m_fr); - m_fr.Flags = FR_ENABLEHOOK; - m_fr.lpfnHook = (LPFRHOOKPROC)T::HookProc; - m_fr.lpstrFindWhat = (LPTSTR)m_szFindWhat; - m_fr.wFindWhatLen = _cchFindReplaceBuffer; - m_fr.lpstrReplaceWith = (LPTSTR)m_szReplaceWith; - m_fr.wReplaceWithLen = _cchFindReplaceBuffer; - } - - // Note: You must allocate the object on the heap. - // If you do not, you must override OnFinalMessage() - virtual void OnFinalMessage(HWND /*hWnd*/) - { - delete this; - } - - HWND Create(BOOL bFindDialogOnly, // TRUE for Find, FALSE for FindReplace - LPCTSTR lpszFindWhat, - LPCTSTR lpszReplaceWith = NULL, - DWORD dwFlags = FR_DOWN, - HWND hWndParent = NULL) - { - ATLASSERT((m_fr.Flags & FR_ENABLEHOOK) != 0); - ATLASSERT(m_fr.lpfnHook != NULL); - - m_fr.Flags |= dwFlags; - - if(hWndParent == NULL) - m_fr.hwndOwner = ::GetActiveWindow(); - else - m_fr.hwndOwner = hWndParent; - ATLASSERT(m_fr.hwndOwner != NULL); // must have an owner for modeless dialog - - if(lpszFindWhat != NULL) - SecureHelper::strncpy_x(m_szFindWhat, _countof(m_szFindWhat), lpszFindWhat, _TRUNCATE); - - if(lpszReplaceWith != NULL) - SecureHelper::strncpy_x(m_szReplaceWith, _countof(m_szReplaceWith), lpszReplaceWith, _TRUNCATE); - - ATLASSERT(m_hWnd == NULL); - ModuleHelper::AddCreateWndData(&m_thunk.cd, (CCommonDialogImplBase*)this); - - HWND hWnd = NULL; - if(bFindDialogOnly) - hWnd = ::FindText(&m_fr); - else - hWnd = ::ReplaceText(&m_fr); - - ATLASSERT(m_hWnd == hWnd); - return hWnd; - } - - static const UINT GetFindReplaceMsg() - { - static const UINT nMsgFindReplace = ::RegisterWindowMessage(FINDMSGSTRING); - return nMsgFindReplace; - } - // call while handling FINDMSGSTRING registered message - // to retreive the object - static T* PASCAL GetNotifier(LPARAM lParam) - { - ATLASSERT(lParam != NULL); - T* pDlg = (T*)(lParam - offsetof(T, m_fr)); - return pDlg; - } - -// Operations - // Helpers for parsing information after successful return - LPCTSTR GetFindString() const // get find string - { - return (LPCTSTR)m_fr.lpstrFindWhat; - } - - LPCTSTR GetReplaceString() const // get replacement string - { - return (LPCTSTR)m_fr.lpstrReplaceWith; - } - - BOOL SearchDown() const // TRUE if search down, FALSE is up - { - return ((m_fr.Flags & FR_DOWN) != 0) ? TRUE : FALSE; - } - - BOOL FindNext() const // TRUE if command is find next - { - return ((m_fr.Flags & FR_FINDNEXT) != 0) ? TRUE : FALSE; - } - - BOOL MatchCase() const // TRUE if matching case - { - return ((m_fr.Flags & FR_MATCHCASE) != 0) ? TRUE : FALSE; - } - - BOOL MatchWholeWord() const // TRUE if matching whole words only - { - return ((m_fr.Flags & FR_WHOLEWORD) != 0) ? TRUE : FALSE; - } - - BOOL ReplaceCurrent() const // TRUE if replacing current string - { - return ((m_fr. Flags & FR_REPLACE) != 0) ? TRUE : FALSE; - } - - BOOL ReplaceAll() const // TRUE if replacing all occurrences - { - return ((m_fr.Flags & FR_REPLACEALL) != 0) ? TRUE : FALSE; - } - - BOOL IsTerminating() const // TRUE if terminating dialog - { - return ((m_fr.Flags & FR_DIALOGTERM) != 0) ? TRUE : FALSE ; - } -}; - -class CFindReplaceDialog : public CFindReplaceDialogImpl -{ -public: - DECLARE_EMPTY_MSG_MAP() -}; - -#endif // !_WIN32_WCE - - -///////////////////////////////////////////////////////////////////////// -// CDialogBaseUnits - Dialog Units helper -// - -class CDialogBaseUnits -{ -public: - SIZE m_sizeUnits; - -// Constructors - CDialogBaseUnits() - { - // The base units of the out-dated System Font - LONG nDlgBaseUnits = ::GetDialogBaseUnits(); - m_sizeUnits.cx = LOWORD(nDlgBaseUnits); - m_sizeUnits.cy = HIWORD(nDlgBaseUnits); - } - - CDialogBaseUnits(HWND hWnd) - { - if(!InitDialogBaseUnits(hWnd)) { - LONG nDlgBaseUnits = ::GetDialogBaseUnits(); - m_sizeUnits.cx = LOWORD(nDlgBaseUnits); - m_sizeUnits.cy = HIWORD(nDlgBaseUnits); - } - } - - CDialogBaseUnits(HFONT hFont, HWND hWnd = NULL) - { - if(!InitDialogBaseUnits(hFont, hWnd)) { - LONG nDlgBaseUnits = ::GetDialogBaseUnits(); - m_sizeUnits.cx = LOWORD(nDlgBaseUnits); - m_sizeUnits.cy = HIWORD(nDlgBaseUnits); - } - } - - CDialogBaseUnits(LOGFONT lf, HWND hWnd = NULL) - { - if(!InitDialogBaseUnits(lf, hWnd)) { - LONG nDlgBaseUnits = ::GetDialogBaseUnits(); - m_sizeUnits.cx = LOWORD(nDlgBaseUnits); - m_sizeUnits.cy = HIWORD(nDlgBaseUnits); - } - } - -// Operations - BOOL InitDialogBaseUnits(HWND hWnd) - { - ATLASSERT(::IsWindow(hWnd)); - RECT rc = { 0, 0, 4, 8 }; - if(!::MapDialogRect(hWnd, &rc)) return FALSE; - m_sizeUnits.cx = rc.right; - m_sizeUnits.cy = rc.bottom; - return TRUE; - } - - BOOL InitDialogBaseUnits(LOGFONT lf, HWND hWnd = NULL) - { - CFont font; - font.CreateFontIndirect(&lf); - if(font.IsNull()) return FALSE; - return InitDialogBaseUnits(font, hWnd); - } - - BOOL InitDialogBaseUnits(HFONT hFont, HWND hWnd = NULL) - { - ATLASSERT(hFont != NULL); - CWindowDC dc = hWnd; - TEXTMETRIC tmText = { 0 }; - SIZE sizeText = { 0 }; - HFONT hFontOld = dc.SelectFont(hFont); - dc.GetTextMetrics(&tmText); - m_sizeUnits.cy = tmText.tmHeight + tmText.tmExternalLeading; - dc.GetTextExtent(_T("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"), 52, &sizeText); - m_sizeUnits.cx = (sizeText.cx + 26) / 52; - dc.SelectFont(hFontOld); - return TRUE; - } - - SIZE GetDialogBaseUnits() const - { - return m_sizeUnits; - } - - INT MapDialogPixelsX(INT x) const - { - return ::MulDiv(x, 4, m_sizeUnits.cx); // Pixels X to DLU - } - - INT MapDialogPixelsY(INT y) const - { - return ::MulDiv(y, 8, m_sizeUnits.cy); // Pixels Y to DLU - } - - POINT MapDialogPixels(POINT pt) const - { - POINT out = { MapDialogPixelsX(pt.x), MapDialogPixelsY(pt.y) }; - return out; - } - - SIZE MapDialogPixels(SIZE input) const - { - SIZE out = { MapDialogPixelsX(input.cx), MapDialogPixelsY(input.cy) }; - return out; - } - - RECT MapDialogPixels(RECT input) const - { - RECT out = { MapDialogPixelsX(input.left), MapDialogPixelsY(input.top), MapDialogPixelsX(input.right), MapDialogPixelsY(input.bottom) }; - return out; - } - - INT MapDialogUnitsX(INT x) const - { - return ::MulDiv(x, m_sizeUnits.cx, 4); // DLU to Pixels X - } - - INT MapDialogUnitsY(INT y) const - { - return ::MulDiv(y, m_sizeUnits.cx, 8); // DLU to Pixels Y - } - - POINT MapDialogUnits(POINT pt) const - { - POINT out = { MapDialogUnitsX(pt.x), MapDialogUnitsY(pt.y) }; - return out; - } - - SIZE MapDialogUnits(SIZE input) const - { - SIZE out = { MapDialogUnitsX(input.cx), MapDialogUnitsY(input.cy) }; - return out; - } - - RECT MapDialogUnits(RECT input) const - { - RECT out = { MapDialogUnitsX(input.left), MapDialogUnitsY(input.top), MapDialogUnitsX(input.right), MapDialogUnitsY(input.bottom) }; - return out; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CMemDlgTemplate - in-memory dialog template - DLGTEMPLATE or DLGTEMPLATEEX - -#if (_ATL_VER >= 0x800) - typedef ATL::_DialogSplitHelper::DLGTEMPLATEEX DLGTEMPLATEEX; - typedef ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX DLGITEMTEMPLATEEX; -#else // (_ATL_VER >= 0x800) - typedef ATL::_DialogSizeHelper::_ATL_DLGTEMPLATEEX DLGTEMPLATEEX; - #pragma pack(push, 4) - struct DLGITEMTEMPLATEEX - { - DWORD helpID; - DWORD exStyle; - DWORD style; - short x; - short y; - short cx; - short cy; - DWORD id; - }; - #pragma pack(pop) -#endif // (_ATL_VER >= 0x800) - - -class CMemDlgTemplate -{ -public: - enum StdCtrlType - { - CTRL_BUTTON = 0x0080, - CTRL_EDIT = 0x0081, - CTRL_STATIC = 0x0082, - CTRL_LISTBOX = 0x0083, - CTRL_SCROLLBAR = 0x0084, - CTRL_COMBOBOX = 0x0085 - }; - - CMemDlgTemplate() : m_hData(NULL), m_pData(NULL), m_pPtr(NULL), m_cAllocated(0) - { } - - ~CMemDlgTemplate() - { - Reset(); - } - - bool IsValid() const - { - return (m_pData != NULL); - } - - bool IsTemplateEx() const - { - return (IsValid() && ((DLGTEMPLATEEX*)m_pData)->signature == 0xFFFF); - } - - LPDLGTEMPLATE GetTemplatePtr() - { - return reinterpret_cast(m_pData); - } - - DLGTEMPLATEEX* GetTemplateExPtr() - { - return reinterpret_cast(m_pData); - } - - void Reset() - { - if (IsValid()) { -#ifndef UNDER_CE - ::GlobalUnlock(m_pData); -#endif - ATLVERIFY(::GlobalFree(m_hData) == NULL); - } - - m_hData = NULL; - m_pData = NULL; - m_pPtr = NULL; - m_cAllocated = 0; - } - - void Create(bool bDlgEx, LPCTSTR lpszCaption, RECT rc, DWORD dwStyle = 0, DWORD dwExStyle = 0, - LPCTSTR lpstrFontName = NULL, WORD wFontSize = 0, WORD wWeight = 0, BYTE bItalic = 0, BYTE bCharset = 0, DWORD dwHelpID = 0, - ATL::_U_STRINGorID ClassName = 0U, ATL::_U_STRINGorID Menu = 0U) - { - Create(bDlgEx, lpszCaption, (short) rc.left, (short) rc.top, (short) (rc.right - rc.left), (short) (rc.bottom - rc.top), dwStyle, dwExStyle, - lpstrFontName, wFontSize, wWeight, bItalic, bCharset, dwHelpID, ClassName.m_lpstr, Menu.m_lpstr); - } - - void Create(bool bDlgEx, LPCTSTR lpszCaption, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle = 0, DWORD dwExStyle = 0, - LPCTSTR lpstrFontName = NULL, WORD wFontSize = 0, WORD wWeight = 0, BYTE bItalic = 0, BYTE bCharset = 0, DWORD dwHelpID = 0, - ATL::_U_STRINGorID ClassName = 0U, ATL::_U_STRINGorID Menu = 0U) - { - // Should have DS_SETFONT style to set the dialog font name and size - if (lpstrFontName != NULL) - { - dwStyle |= DS_SETFONT; - } - else - { - dwStyle &= ~DS_SETFONT; - } - - if (bDlgEx) - { - DLGTEMPLATEEX dlg = {1, 0xFFFF, dwHelpID, dwExStyle, dwStyle, 0, nX, nY, nWidth, nHeight}; - AddData(&dlg, sizeof(dlg)); - } - else - { - DLGTEMPLATE dlg = {dwStyle, dwExStyle, 0, nX, nY, nWidth, nHeight}; - AddData(&dlg, sizeof(dlg)); - } - -#ifndef _WIN32_WCE - if (Menu.m_lpstr == NULL) - { - WORD menuData = 0; - AddData(&menuData, sizeof(WORD)); - } - else if (IS_INTRESOURCE(Menu.m_lpstr)) - { - WORD menuData[] = {0xFFFF, (WORD)Menu.m_lpstr}; - AddData(menuData, sizeof(menuData)); - } - else - { - AddString(Menu.m_lpstr); - } -#else // _WIN32_WCE - // Windows CE doesn't support the addition of menus to a dialog box - ATLASSERT(Menu.m_lpstr == NULL); - Menu.m_lpstr; // avoid level 4 warning - WORD menuData = 0; - AddData(&menuData, sizeof(WORD)); -#endif // _WIN32_WCE - - if (ClassName.m_lpstr == NULL) - { - WORD classData = 0; - AddData(&classData, sizeof(WORD)); - } - else if (IS_INTRESOURCE(ClassName.m_lpstr)) - { - WORD classData[] = {0xFFFF, (WORD)ClassName.m_lpstr}; - AddData(classData, sizeof(classData)); - } - else - { - AddString(ClassName.m_lpstr); - } - - // Set dialog caption - AddString(lpszCaption); - - if (lpstrFontName != NULL) - { - AddData(&wFontSize, sizeof(wFontSize)); - - if (bDlgEx) - { - AddData(&wWeight, sizeof(wWeight)); - AddData(&bItalic, sizeof(bItalic)); - AddData(&bCharset, sizeof(bCharset)); - } - - AddString(lpstrFontName); - } - } - - void AddControl(ATL::_U_STRINGorID ClassName, WORD wId, RECT rc, DWORD dwStyle, DWORD dwExStyle, - ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0) - { - AddControl(ClassName.m_lpstr, wId, (short) rc.left, (short) rc.top, (short) (rc.right - rc.left), (short) (rc.bottom - rc.top), dwStyle, dwExStyle, - Text.m_lpstr, pCreationData, nCreationData, dwHelpID); - } - - void AddControl(ATL::_U_STRINGorID ClassName, WORD wId, short nX, short nY, short nWidth, short nHeight, DWORD dwStyle, DWORD dwExStyle, - ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0) - { - ATLASSERT(IsValid()); - - // DWORD align data - m_pPtr = (LPBYTE)(DWORD_PTR)((DWORD)(DWORD_PTR)(m_pPtr + 3) & (~3)); - - if (IsTemplateEx()) - { - DLGTEMPLATEEX* dlg = (DLGTEMPLATEEX*)m_pData; - dlg->cDlgItems++; - - DLGITEMTEMPLATEEX item = {dwHelpID, ATL::CControlWinTraits::GetWndExStyle(0) | dwExStyle, ATL::CControlWinTraits::GetWndStyle(0) | dwStyle, nX, nY, nWidth, nHeight, wId}; - AddData(&item, sizeof(item)); - } - else - { - LPDLGTEMPLATE dlg = (LPDLGTEMPLATE)m_pData; - dlg->cdit++; - - DLGITEMTEMPLATE item = {ATL::CControlWinTraits::GetWndStyle(0) | dwStyle, ATL::CControlWinTraits::GetWndExStyle(0) | dwExStyle, nX, nY, nWidth, nHeight, wId}; - AddData(&item, sizeof(item)); - } - - ATLASSERT(ClassName.m_lpstr != NULL); - if (IS_INTRESOURCE(ClassName.m_lpstr)) - { - WORD wData[] = {0xFFFF, (WORD)ClassName.m_lpstr}; - AddData(wData, sizeof(wData)); - } - else - { - AddString(ClassName.m_lpstr); - } - - if (Text.m_lpstr == NULL) - { - WORD classData = 0; - AddData(&classData, sizeof(WORD)); - } - else if (IS_INTRESOURCE(Text.m_lpstr)) - { - WORD wData[] = {0xFFFF, (WORD)Text.m_lpstr}; - AddData(wData, sizeof(wData)); - } - else - { - AddString(Text.m_lpstr); - } - - AddData(&nCreationData, sizeof(nCreationData)); - - if ((nCreationData != 0)) - { - ATLASSERT(pCreationData != NULL); - AddData(pCreationData, nCreationData * sizeof(WORD)); - } - } - - void AddStdControl(StdCtrlType CtrlType, WORD wId, short nX, short nY, short nWidth, short nHeight, - DWORD dwStyle, DWORD dwExStyle, ATL::_U_STRINGorID Text, const WORD* pCreationData = NULL, WORD nCreationData = 0, DWORD dwHelpID = 0) - { - AddControl(CtrlType, wId, nX, nY, nWidth, nHeight, dwStyle, dwExStyle, Text, pCreationData, nCreationData, dwHelpID); - } - - void AddData(LPCVOID pData, size_t nData) - { - ATLASSERT(pData != NULL); - - const SIZE_T ALLOCATION_INCREMENT = 1024; - - if (m_pData == NULL) - { - m_cAllocated = ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT; - m_hData = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, m_cAllocated); - ATLASSERT(m_hData != NULL); -#ifndef UNDER_CE - m_pPtr = m_pData = static_cast(::GlobalLock(m_hData)); -#else - m_pPtr = m_pData = static_cast(m_hData); -#endif - ATLASSERT(m_pData != NULL); - } - else if (((m_pPtr - m_pData) + nData) > m_cAllocated) - { - SIZE_T ptrPos = (m_pPtr - m_pData); - m_cAllocated += ((nData / ALLOCATION_INCREMENT) + 1) * ALLOCATION_INCREMENT; -#ifndef UNDER_CE - ::GlobalUnlock(m_pData); -#endif - m_hData = ::GlobalReAlloc(m_hData, m_cAllocated, GMEM_MOVEABLE | GMEM_ZEROINIT); - ATLASSERT(m_hData != NULL); -#ifndef UNDER_CE - m_pData = static_cast(::GlobalLock(m_hData)); -#else - m_pData = static_cast(m_hData); -#endif - ATLASSERT(m_pData != NULL); - m_pPtr = m_pData + ptrPos; - } - - SecureHelper::memcpy_x(m_pPtr, m_cAllocated - (m_pPtr - m_pData), pData, nData); - - m_pPtr += nData; - } - - void AddString(LPCTSTR lpszStr) - { - if (lpszStr == NULL) - { - WCHAR szEmpty = 0; - AddData(&szEmpty, sizeof(szEmpty)); - } - else - { - USES_CONVERSION; - LPCWSTR lpstr = T2CW(lpszStr); - int nSize = lstrlenW(lpstr) + 1; - AddData(lpstr, nSize * sizeof(WCHAR)); - } - } - - HANDLE m_hData; - LPBYTE m_pData; - LPBYTE m_pPtr; - SIZE_T m_cAllocated; -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Dialog and control macros for indirect dialogs - -// for DLGTEMPLATE -#define BEGIN_DIALOG(x, y, width, height) \ - void DoInitTemplate() \ - { \ - bool bExTemplate = false; \ - short nX = x, nY = y, nWidth = width, nHeight = height; \ - LPCTSTR szCaption = NULL; \ - DWORD dwStyle = WS_POPUP | WS_BORDER | WS_SYSMENU; \ - DWORD dwExStyle = 0; \ - LPCTSTR szFontName = NULL; \ - WORD wFontSize = 0; \ - WORD wWeight = 0; \ - BYTE bItalic = 0; \ - BYTE bCharset = 0; \ - DWORD dwHelpID = 0; \ - ATL::_U_STRINGorID Menu = 0U; \ - ATL::_U_STRINGorID ClassName = 0U; - -// for DLGTEMPLATEEX -#define BEGIN_DIALOG_EX(x, y, width, height, helpID) \ - void DoInitTemplate() \ - { \ - bool bExTemplate = true; \ - short nX = x, nY = y, nWidth = width, nHeight = height; \ - LPCTSTR szCaption = NULL; \ - DWORD dwStyle = WS_POPUP | WS_BORDER | WS_SYSMENU; \ - DWORD dwExStyle = 0; \ - LPCTSTR szFontName = NULL; \ - WORD wFontSize = 0; \ - WORD wWeight = 0; \ - BYTE bItalic = 0; \ - BYTE bCharset = 0; \ - DWORD dwHelpID = helpID; \ - ATL::_U_STRINGorID Menu = 0U; \ - ATL::_U_STRINGorID ClassName = 0U; - -#define END_DIALOG() \ - m_Template.Create(bExTemplate, szCaption, nX, nY, nWidth, nHeight, dwStyle, dwExStyle, szFontName, wFontSize, wWeight, bItalic, bCharset, dwHelpID, ClassName, Menu); \ - }; - -#define DIALOG_CAPTION(caption) \ - szCaption = caption; -#define DIALOG_STYLE(style) \ - dwStyle = style; -#define DIALOG_EXSTYLE(exStyle) \ - dwExStyle = exStyle; -#define DIALOG_FONT(pointSize, typeFace) \ - wFontSize = pointSize; \ - szFontName = typeFace; -#define DIALOG_FONT_EX(pointsize, typeface, weight, italic, charset) \ - ATLASSERT(bExTemplate); \ - wFontSize = pointsize; \ - szFontName = typeface; \ - wWeight = weight; \ - bItalic = italic; \ - bCharset = charset; -#define DIALOG_MENU(menuName) \ - Menu = menuName; -#define DIALOG_CLASS(className) \ - ClassName = className; - -#define BEGIN_CONTROLS_MAP() \ - void DoInitControls() \ - { - -#define END_CONTROLS_MAP() \ - }; - - -#define CONTROL_LTEXT(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_LEFT | WS_GROUP, exStyle, text, NULL, 0); -#define CONTROL_CTEXT(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_CENTER | WS_GROUP, exStyle, text, NULL, 0); -#define CONTROL_RTEXT(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_RIGHT | WS_GROUP, exStyle, text, NULL, 0); -#define CONTROL_PUSHBUTTON(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_PUSHBUTTON | WS_TABSTOP, exStyle, text, NULL, 0); -#define CONTROL_DEFPUSHBUTTON(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_DEFPUSHBUTTON | WS_TABSTOP, exStyle, text, NULL, 0); -#ifndef _WIN32_WCE -#define CONTROL_PUSHBOX(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_PUSHBOX | WS_TABSTOP, exStyle, text, NULL, 0); -#endif // !_WIN32_WCE -#define CONTROL_STATE3(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_3STATE | WS_TABSTOP, exStyle, text, NULL, 0); -#define CONTROL_AUTO3STATE(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTO3STATE | WS_TABSTOP, exStyle, text, NULL, 0); -#define CONTROL_CHECKBOX(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_CHECKBOX | WS_TABSTOP, exStyle, text, NULL, 0); -#define CONTROL_AUTOCHECKBOX(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTOCHECKBOX | WS_TABSTOP, exStyle, text, NULL, 0); -#define CONTROL_RADIOBUTTON(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_RADIOBUTTON | WS_TABSTOP, exStyle, text, NULL, 0); -#define CONTROL_AUTORADIOBUTTON(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_AUTORADIOBUTTON | WS_TABSTOP, exStyle, text, NULL, 0); -#define CONTROL_COMBOBOX(id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_COMBOBOX, (WORD)id, x, y, width, height, style | CBS_DROPDOWN | WS_TABSTOP, exStyle, (LPCTSTR)NULL, NULL, 0); -#define CONTROL_EDITTEXT(id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_EDIT, (WORD)id, x, y, width, height, style | ES_LEFT | WS_BORDER | WS_TABSTOP, exStyle, (LPCTSTR)NULL, NULL, 0); -#define CONTROL_GROUPBOX(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_BUTTON, (WORD)id, x, y, width, height, style | BS_GROUPBOX, exStyle, text, NULL, 0); -#define CONTROL_LISTBOX(id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_LISTBOX, (WORD)id, x, y, width, height, style | LBS_NOTIFY | WS_BORDER, exStyle, (LPCTSTR)NULL, NULL, 0); -#define CONTROL_SCROLLBAR(id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_SCROLLBAR, (WORD)id, x, y, width, height, style | SBS_HORZ, exStyle, (LPCTSTR)NULL, NULL, 0); -#define CONTROL_ICON(text, id, x, y, width, height, style, exStyle) \ - m_Template.AddStdControl(WTL::CMemDlgTemplate::CTRL_STATIC, (WORD)id, x, y, width, height, style | SS_ICON, exStyle, text, NULL, 0); -#define CONTROL_CONTROL(text, id, className, style, x, y, width, height, exStyle) \ - m_Template.AddControl(className, (WORD)id, x, y, width, height, style, exStyle, text, NULL, 0); - - -/////////////////////////////////////////////////////////////////////////////// -// CIndirectDialogImpl - dialogs with template in memory - -template > -class ATL_NO_VTABLE CIndirectDialogImpl : public TBase -{ -public: - enum { IDD = 0 }; // no dialog template resource - - TDlgTemplate m_Template; - - void CreateTemplate() - { - T* pT = static_cast(this); - pT->DoInitTemplate(); - pT->DoInitControls(); - } - - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_hWnd == NULL); - - if (!m_Template.IsValid()) - CreateTemplate(); - -#if (_ATL_VER >= 0x0800) - // Allocate the thunk structure here, where we can fail gracefully. - BOOL result = m_thunk.Init(NULL, NULL); - if (result == FALSE) - { - SetLastError(ERROR_OUTOFMEMORY); - return -1; - } -#endif // (_ATL_VER >= 0x0800) - - ModuleHelper::AddCreateWndData(&m_thunk.cd, pT); - -#ifdef _DEBUG - m_bModal = true; -#endif // _DEBUG - - return ::DialogBoxIndirectParam(ModuleHelper::GetResourceInstance(), m_Template.GetTemplatePtr(), hWndParent, (DLGPROC)T::StartDialogProc, dwInitParam); - } - - HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL) - { - T* pT = static_cast(this); - ATLASSERT(pT->m_hWnd == NULL); - - if (!m_Template.IsValid()) - CreateTemplate(); - -#if (_ATL_VER >= 0x0800) - // Allocate the thunk structure here, where we can fail gracefully. - BOOL result = m_thunk.Init(NULL, NULL); - if (result == FALSE) - { - SetLastError(ERROR_OUTOFMEMORY); - return NULL; - } -#endif // (_ATL_VER >= 0x0800) - - ModuleHelper::AddCreateWndData(&m_thunk.cd, pT); - -#ifdef _DEBUG - m_bModal = false; -#endif // _DEBUG - - HWND hWnd = ::CreateDialogIndirectParam(ModuleHelper::GetResourceInstance(), (LPCDLGTEMPLATE)m_Template.GetTemplatePtr(), hWndParent, (DLGPROC)T::StartDialogProc, dwInitParam); - ATLASSERT(m_hWnd == hWnd); - - return hWnd; - } - - // for CComControl - HWND Create(HWND hWndParent, RECT&, LPARAM dwInitParam = NULL) - { - return Create(hWndParent, dwInitParam); - } - - void DoInitTemplate() - { - ATLASSERT(FALSE); // MUST be defined in derived class - } - - void DoInitControls() - { - ATLASSERT(FALSE); // MUST be defined in derived class - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CPropertySheetWindow - client side for a property sheet - -class CPropertySheetWindow : public ATL::CWindow -{ -public: -// Constructors - CPropertySheetWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd) - { } - - CPropertySheetWindow& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Attributes - int GetPageCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - HWND hWndTabCtrl = GetTabControl(); - ATLASSERT(hWndTabCtrl != NULL); - return (int)::SendMessage(hWndTabCtrl, TCM_GETITEMCOUNT, 0, 0L); - } - - HWND GetActivePage() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HWND)::SendMessage(m_hWnd, PSM_GETCURRENTPAGEHWND, 0, 0L); - } - - int GetActiveIndex() const - { - ATLASSERT(::IsWindow(m_hWnd)); - HWND hWndTabCtrl = GetTabControl(); - ATLASSERT(hWndTabCtrl != NULL); - return (int)::SendMessage(hWndTabCtrl, TCM_GETCURSEL, 0, 0L); - } - - BOOL SetActivePage(int nPageIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSEL, nPageIndex, 0L); - } - - BOOL SetActivePage(HPROPSHEETPAGE hPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hPage != NULL); - return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSEL, 0, (LPARAM)hPage); - } - - BOOL SetActivePageByID(int nPageID) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, PSM_SETCURSELID, 0, nPageID); - } - - void SetTitle(LPCTSTR lpszText, UINT nStyle = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT((nStyle & ~PSH_PROPTITLE) == 0); // only PSH_PROPTITLE is valid - ATLASSERT(lpszText != NULL); - ::SendMessage(m_hWnd, PSM_SETTITLE, nStyle, (LPARAM)lpszText); - } - - HWND GetTabControl() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HWND)::SendMessage(m_hWnd, PSM_GETTABCONTROL, 0, 0L); - } - - void SetFinishText(LPCTSTR lpszText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_SETFINISHTEXT, 0, (LPARAM)lpszText); - } - - void SetWizardButtons(DWORD dwFlags) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::PostMessage(m_hWnd, PSM_SETWIZBUTTONS, 0, dwFlags); - } - -// Operations - BOOL AddPage(HPROPSHEETPAGE hPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hPage != NULL); - return (BOOL)::SendMessage(m_hWnd, PSM_ADDPAGE, 0, (LPARAM)hPage); - } - - BOOL AddPage(LPCPROPSHEETPAGE pPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pPage != NULL); - HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage); - if(hPage == NULL) - return FALSE; - return (BOOL)::SendMessage(m_hWnd, PSM_ADDPAGE, 0, (LPARAM)hPage); - } - -#ifndef _WIN32_WCE - BOOL InsertPage(int nNewPageIndex, HPROPSHEETPAGE hPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hPage != NULL); - return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, nNewPageIndex, (LPARAM)hPage); - } - - BOOL InsertPage(int nNewPageIndex, LPCPROPSHEETPAGE pPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pPage != NULL); - HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage); - if(hPage == NULL) - return FALSE; - return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, nNewPageIndex, (LPARAM)hPage); - } - - BOOL InsertPage(HPROPSHEETPAGE hPageInsertAfter, HPROPSHEETPAGE hPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hPage != NULL); - return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, (WPARAM)hPageInsertAfter, (LPARAM)hPage); - } - - BOOL InsertPage(HPROPSHEETPAGE hPageInsertAfter, LPCPROPSHEETPAGE pPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pPage != NULL); - HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage); - if(hPage == NULL) - return FALSE; - return (BOOL)::SendMessage(m_hWnd, PSM_INSERTPAGE, (WPARAM)hPageInsertAfter, (LPARAM)hPage); - } -#endif // !_WIN32_WCE - - void RemovePage(int nPageIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_REMOVEPAGE, nPageIndex, 0L); - } - - void RemovePage(HPROPSHEETPAGE hPage) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(hPage != NULL); - ::SendMessage(m_hWnd, PSM_REMOVEPAGE, 0, (LPARAM)hPage); - } - - BOOL PressButton(int nButton) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, PSM_PRESSBUTTON, nButton, 0L); - } - - BOOL Apply() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, PSM_APPLY, 0, 0L); - } - - void CancelToClose() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_CANCELTOCLOSE, 0, 0L); - } - - void SetModified(HWND hWndPage, BOOL bChanged = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(::IsWindow(hWndPage)); - UINT uMsg = bChanged ? PSM_CHANGED : PSM_UNCHANGED; - ::SendMessage(m_hWnd, uMsg, (WPARAM)hWndPage, 0L); - } - - LRESULT QuerySiblings(WPARAM wParam, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - return ::SendMessage(m_hWnd, PSM_QUERYSIBLINGS, wParam, lParam); - } - - void RebootSystem() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_REBOOTSYSTEM, 0, 0L); - } - - void RestartWindows() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_RESTARTWINDOWS, 0, 0L); - } - - BOOL IsDialogMessage(LPMSG lpMsg) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, PSM_ISDIALOGMESSAGE, 0, (LPARAM)lpMsg); - } - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - int HwndToIndex(HWND hWnd) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PSM_HWNDTOINDEX, (WPARAM)hWnd, 0L); - } - - HWND IndexToHwnd(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HWND)::SendMessage(m_hWnd, PSM_INDEXTOHWND, nIndex, 0L); - } - - int PageToIndex(HPROPSHEETPAGE hPage) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PSM_PAGETOINDEX, 0, (LPARAM)hPage); - } - - HPROPSHEETPAGE IndexToPage(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HPROPSHEETPAGE)::SendMessage(m_hWnd, PSM_INDEXTOPAGE, nIndex, 0L); - } - - int IdToIndex(int nID) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PSM_IDTOINDEX, 0, nID); - } - - int IndexToId(int nIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PSM_INDEXTOID, nIndex, 0L); - } - - int GetResult() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, PSM_GETRESULT, 0, 0L); - } - - BOOL RecalcPageSizes() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, PSM_RECALCPAGESIZES, 0, 0L); - } - - void SetHeaderTitle(int nIndex, LPCTSTR lpstrHeaderTitle) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_SETHEADERTITLE, nIndex, (LPARAM)lpstrHeaderTitle); - } - - void SetHeaderSubTitle(int nIndex, LPCTSTR lpstrHeaderSubTitle) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_SETHEADERSUBTITLE, nIndex, (LPARAM)lpstrHeaderSubTitle); - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -// Implementation - override to prevent usage - HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL) - { - ATLASSERT(FALSE); - return NULL; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CPropertySheetImpl - implements a property sheet - -template -class ATL_NO_VTABLE CPropertySheetImpl : public ATL::CWindowImplBaseT< TBase > -{ -public: - PROPSHEETHEADER m_psh; - ATL::CSimpleArray m_arrPages; - -#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific - #ifndef PROPSHEET_LINK_SIZE - #define PROPSHEET_LINK_SIZE 128 - #endif // PROPSHEET_LINK_SIZE - TCHAR m_szLink[PROPSHEET_LINK_SIZE]; - static LPCTSTR m_pszTitle; - static LPCTSTR m_pszLink; -#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) - -// Construction/Destruction - CPropertySheetImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) - { - memset(&m_psh, 0, sizeof(PROPSHEETHEADER)); - m_psh.dwSize = sizeof(PROPSHEETHEADER); - m_psh.dwFlags = PSH_USECALLBACK; - m_psh.hInstance = ModuleHelper::GetResourceInstance(); - m_psh.phpage = NULL; // will be set later - m_psh.nPages = 0; // will be set later - m_psh.pszCaption = title.m_lpstr; - m_psh.nStartPage = uStartPage; - m_psh.hwndParent = hWndParent; // if NULL, will be set in DoModal/Create - m_psh.pfnCallback = T::PropSheetCallback; - -#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific - m_psh.dwFlags |= PSH_MAXIMIZE; - m_szLink[0] = 0; -#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) - } - - ~CPropertySheetImpl() - { - if(m_arrPages.GetSize() > 0) // sheet never created, destroy all pages - { - for(int i = 0; i < m_arrPages.GetSize(); i++) - ::DestroyPropertySheetPage((HPROPSHEETPAGE)m_arrPages[i]); - } - } - -// Callback function and overrideables - static int CALLBACK PropSheetCallback(HWND hWnd, UINT uMsg, LPARAM lParam) - { - lParam; // avoid level 4 warning - int nRet = 0; - - if(uMsg == PSCB_INITIALIZED) - { - ATLASSERT(hWnd != NULL); - T* pT = (T*)ModuleHelper::ExtractCreateWndData(); - // subclass the sheet window - pT->SubclassWindow(hWnd); - // remove page handles array - pT->_CleanUpPages(); - -#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific - m_pszTitle = pT->m_psh.pszCaption; - if(*pT->m_szLink != 0) - m_pszLink = pT->m_szLink; -#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific - - pT->OnSheetInitialized(); - } -#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific uMsg - else - { - switch(uMsg) - { - case PSCB_GETVERSION : - nRet = COMCTL32_VERSION; - break; - case PSCB_GETTITLE : - if(m_pszTitle != NULL) - { - lstrcpy((LPTSTR)lParam, m_pszTitle); - m_pszTitle = NULL; - } - break; - case PSCB_GETLINKTEXT: - if(m_pszLink != NULL) - { - lstrcpy((LPTSTR)lParam, m_pszLink); - m_pszLink = NULL; - } - break; - default: - break; - } - } -#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) - - return nRet; - } - - void OnSheetInitialized() - { - } - -// Create method - HWND Create(HWND hWndParent = NULL) - { - ATLASSERT(m_hWnd == NULL); - - m_psh.dwFlags |= PSH_MODELESS; - if(m_psh.hwndParent == NULL) - m_psh.hwndParent = hWndParent; - m_psh.phpage = (HPROPSHEETPAGE*)m_arrPages.GetData(); - m_psh.nPages = m_arrPages.GetSize(); - - T* pT = static_cast(this); - ModuleHelper::AddCreateWndData(&pT->m_thunk.cd, pT); - - HWND hWnd = (HWND)::PropertySheet(&m_psh); - _CleanUpPages(); // ensure clean-up, required if call failed - - ATLASSERT(m_hWnd == hWnd); - - return hWnd; - } - - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow()) - { - ATLASSERT(m_hWnd == NULL); - - m_psh.dwFlags &= ~PSH_MODELESS; - if(m_psh.hwndParent == NULL) - m_psh.hwndParent = hWndParent; - m_psh.phpage = (HPROPSHEETPAGE*)m_arrPages.GetData(); - m_psh.nPages = m_arrPages.GetSize(); - - T* pT = static_cast(this); - ModuleHelper::AddCreateWndData(&pT->m_thunk.cd, pT); - - INT_PTR nRet = ::PropertySheet(&m_psh); - _CleanUpPages(); // ensure clean-up, required if call failed - - return nRet; - } - - // implementation helper - clean up pages array - void _CleanUpPages() - { - m_psh.nPages = 0; - m_psh.phpage = NULL; - m_arrPages.RemoveAll(); - } - -// Attributes (extended overrides of client class methods) -// These now can be called before the sheet is created -// Note: Calling these after the sheet is created gives unpredictable results - int GetPageCount() const - { - if(m_hWnd == NULL) // not created yet - return m_arrPages.GetSize(); - return TBase::GetPageCount(); - } - - int GetActiveIndex() const - { - if(m_hWnd == NULL) // not created yet - return m_psh.nStartPage; - return TBase::GetActiveIndex(); - } - - HPROPSHEETPAGE GetPage(int nPageIndex) const - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - return (HPROPSHEETPAGE)m_arrPages[nPageIndex]; - } - - int GetPageIndex(HPROPSHEETPAGE hPage) const - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - return m_arrPages.Find((HPROPSHEETPAGE&)hPage); - } - - BOOL SetActivePage(int nPageIndex) - { - if(m_hWnd == NULL) // not created yet - { - ATLASSERT(nPageIndex >= 0 && nPageIndex < m_arrPages.GetSize()); - m_psh.nStartPage = nPageIndex; - return TRUE; - } - return TBase::SetActivePage(nPageIndex); - } - - BOOL SetActivePage(HPROPSHEETPAGE hPage) - { - ATLASSERT(hPage != NULL); - if (m_hWnd == NULL) // not created yet - { - int nPageIndex = GetPageIndex(hPage); - if(nPageIndex == -1) - return FALSE; - - return SetActivePage(nPageIndex); - } - return TBase::SetActivePage(hPage); - - } - - void SetTitle(LPCTSTR lpszText, UINT nStyle = 0) - { - ATLASSERT((nStyle & ~PSH_PROPTITLE) == 0); // only PSH_PROPTITLE is valid - ATLASSERT(lpszText != NULL); - - if(m_hWnd == NULL) - { - // set internal state - m_psh.pszCaption = lpszText; // must exist until sheet is created - m_psh.dwFlags &= ~PSH_PROPTITLE; - m_psh.dwFlags |= nStyle; - } - else - { - // set external state - TBase::SetTitle(lpszText, nStyle); - } - } - -#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC specific Link field - void SetLinkText(LPCTSTR lpszText) - { - ATLASSERT(lpszText != NULL); - ATLASSERT(lstrlen(lpszText) < PROPSHEET_LINK_SIZE); - lstrcpy(m_szLink, lpszText); - } -#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) - - void SetWizardMode() - { - m_psh.dwFlags |= PSH_WIZARD; - } - - void EnableHelp() - { - m_psh.dwFlags |= PSH_HASHELP; - } - -// Operations - BOOL AddPage(HPROPSHEETPAGE hPage) - { - ATLASSERT(hPage != NULL); - BOOL bRet = FALSE; - if(m_hWnd != NULL) - bRet = TBase::AddPage(hPage); - else // sheet not created yet, use internal data - bRet = m_arrPages.Add((HPROPSHEETPAGE&)hPage); - return bRet; - } - - BOOL AddPage(LPCPROPSHEETPAGE pPage) - { - ATLASSERT(pPage != NULL); - HPROPSHEETPAGE hPage = ::CreatePropertySheetPage(pPage); - if(hPage == NULL) - return FALSE; - BOOL bRet = AddPage(hPage); - if(!bRet) - ::DestroyPropertySheetPage(hPage); - return bRet; - } - - BOOL RemovePage(HPROPSHEETPAGE hPage) - { - ATLASSERT(hPage != NULL); - if (m_hWnd == NULL) // not created yet - { - int nPage = GetPageIndex(hPage); - if(nPage == -1) - return FALSE; - return RemovePage(nPage); - } - TBase::RemovePage(hPage); - return TRUE; - - } - - BOOL RemovePage(int nPageIndex) - { - BOOL bRet = TRUE; - if(m_hWnd != NULL) - TBase::RemovePage(nPageIndex); - else // sheet not created yet, use internal data - bRet = m_arrPages.RemoveAt(nPageIndex); - return bRet; - } - -#if (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - void SetHeader(LPCTSTR szbmHeader) - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - - m_psh.dwFlags &= ~PSH_WIZARD; - m_psh.dwFlags |= (PSH_HEADER | PSH_WIZARD97); - m_psh.pszbmHeader = szbmHeader; - } - - void SetHeader(HBITMAP hbmHeader) - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - - m_psh.dwFlags &= ~PSH_WIZARD; - m_psh.dwFlags |= (PSH_HEADER | PSH_USEHBMHEADER | PSH_WIZARD97); - m_psh.hbmHeader = hbmHeader; - } - - void SetWatermark(LPCTSTR szbmWatermark, HPALETTE hplWatermark = NULL) - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - - m_psh.dwFlags &= ~PSH_WIZARD; - m_psh.dwFlags |= PSH_WATERMARK | PSH_WIZARD97; - m_psh.pszbmWatermark = szbmWatermark; - - if (hplWatermark != NULL) - { - m_psh.dwFlags |= PSH_USEHPLWATERMARK; - m_psh.hplWatermark = hplWatermark; - } - } - - void SetWatermark(HBITMAP hbmWatermark, HPALETTE hplWatermark = NULL) - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - - m_psh.dwFlags &= ~PSH_WIZARD; - m_psh.dwFlags |= (PSH_WATERMARK | PSH_USEHBMWATERMARK | PSH_WIZARD97); - m_psh.hbmWatermark = hbmWatermark; - - if (hplWatermark != NULL) - { - m_psh.dwFlags |= PSH_USEHPLWATERMARK; - m_psh.hplWatermark = hplWatermark; - } - } - - void StretchWatermark(bool bStretchWatermark) - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - if (bStretchWatermark) - m_psh.dwFlags |= PSH_STRETCHWATERMARK; - else - m_psh.dwFlags &= ~PSH_STRETCHWATERMARK; - } -#endif // (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -// Message map and handlers - BEGIN_MSG_MAP(CPropertySheetImpl) - MESSAGE_HANDLER(WM_COMMAND, OnCommand) - MESSAGE_HANDLER(WM_SYSCOMMAND, OnSysCommand) - END_MSG_MAP() - - LRESULT OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRet = DefWindowProc(uMsg, wParam, lParam); - if(HIWORD(wParam) == BN_CLICKED && (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) && - ((m_psh.dwFlags & PSH_MODELESS) != 0) && (GetActivePage() == NULL)) - DestroyWindow(); - return lRet; - } - - LRESULT OnSysCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(((m_psh.dwFlags & PSH_MODELESS) == PSH_MODELESS) && ((wParam & 0xFFF0) == SC_CLOSE)) - SendMessage(WM_CLOSE); - else - bHandled = FALSE; - return 0; - } -}; - -#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) // PPC static pointers -template < class T, class TBase > -LPCWSTR CPropertySheetImpl::m_pszTitle = NULL; -template < class T, class TBase> -LPCWSTR CPropertySheetImpl::m_pszLink = NULL; -#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) - -// for non-customized sheets -class CPropertySheet : public CPropertySheetImpl -{ -public: - CPropertySheet(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) - : CPropertySheetImpl(title, uStartPage, hWndParent) - { } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CPropertyPageWindow - client side for a property page - -class CPropertyPageWindow : public ATL::CWindow -{ -public: -// Constructors - CPropertyPageWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd) - { } - - CPropertyPageWindow& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Attributes - CPropertySheetWindow GetPropertySheet() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CPropertySheetWindow(GetParent()); - } - -// Operations - BOOL Apply() - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - return GetPropertySheet().Apply(); - } - - void CancelToClose() - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetPropertySheet().CancelToClose(); - } - - void SetModified(BOOL bChanged = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetPropertySheet().SetModified(m_hWnd, bChanged); - } - - LRESULT QuerySiblings(WPARAM wParam, LPARAM lParam) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - return GetPropertySheet().QuerySiblings(wParam, lParam); - } - - void RebootSystem() - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetPropertySheet().RebootSystem(); - } - - void RestartWindows() - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetPropertySheet().RestartWindows(); - } - - void SetWizardButtons(DWORD dwFlags) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetPropertySheet().SetWizardButtons(dwFlags); - } - -// Implementation - overrides to prevent usage - HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL) - { - ATLASSERT(FALSE); - return NULL; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CPropertyPageImpl - implements a property page - -template -class ATL_NO_VTABLE CPropertyPageImpl : public ATL::CDialogImplBaseT< TBase > -{ -public: - PROPSHEETPAGE m_psp; - - operator PROPSHEETPAGE*() { return &m_psp; } - -// Construction - CPropertyPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) - { - // initialize PROPSHEETPAGE struct - memset(&m_psp, 0, sizeof(PROPSHEETPAGE)); - m_psp.dwSize = sizeof(PROPSHEETPAGE); - m_psp.dwFlags = PSP_USECALLBACK; - m_psp.hInstance = ModuleHelper::GetResourceInstance(); - T* pT = static_cast(this); - m_psp.pszTemplate = MAKEINTRESOURCE(pT->IDD); - m_psp.pfnDlgProc = (DLGPROC)T::StartDialogProc; - m_psp.pfnCallback = T::PropPageCallback; - m_psp.lParam = (LPARAM)pT; - - if(title.m_lpstr != NULL) - SetTitle(title); - } - -// Callback function and overrideables - static UINT CALLBACK PropPageCallback(HWND hWnd, UINT uMsg, LPPROPSHEETPAGE ppsp) - { - hWnd; // avoid level 4 warning - ATLASSERT(hWnd == NULL); - T* pT = (T*)ppsp->lParam; - UINT uRet = 0; - - switch(uMsg) - { - case PSPCB_CREATE: - { - ATL::CDialogImplBaseT< TBase >* pPage = (ATL::CDialogImplBaseT< TBase >*)pT; - ModuleHelper::AddCreateWndData(&pPage->m_thunk.cd, pPage); - uRet = pT->OnPageCreate() ? 1 : 0; - } - break; -#if (_WIN32_IE >= 0x0500) - case PSPCB_ADDREF: - pT->OnPageAddRef(); - break; -#endif // (_WIN32_IE >= 0x0500) - case PSPCB_RELEASE: - pT->OnPageRelease(); - break; - default: - break; - } - - return uRet; - } - - bool OnPageCreate() - { - return true; // true - allow page to be created, false - prevent creation - } - -#if (_WIN32_IE >= 0x0500) - void OnPageAddRef() - { - } -#endif // (_WIN32_IE >= 0x0500) - - void OnPageRelease() - { - } - -// Create method - HPROPSHEETPAGE Create() - { - return ::CreatePropertySheetPage(&m_psp); - } - -// Attributes - void SetTitle(ATL::_U_STRINGorID title) - { - m_psp.pszTitle = title.m_lpstr; - m_psp.dwFlags |= PSP_USETITLE; - } - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - void SetHeaderTitle(LPCTSTR lpstrHeaderTitle) - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - m_psp.dwFlags |= PSP_USEHEADERTITLE; - m_psp.pszHeaderTitle = lpstrHeaderTitle; - } - - void SetHeaderSubTitle(LPCTSTR lpstrHeaderSubTitle) - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - m_psp.dwFlags |= PSP_USEHEADERSUBTITLE; - m_psp.pszHeaderSubTitle = lpstrHeaderSubTitle; - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -// Operations - void EnableHelp() - { - m_psp.dwFlags |= PSP_HASHELP; - } - -// Message map and handlers - BEGIN_MSG_MAP(CPropertyPageImpl) - MESSAGE_HANDLER(WM_NOTIFY, OnNotify) - END_MSG_MAP() - - // NOTE: Define _WTL_NEW_PAGE_NOTIFY_HANDLERS to use new notification - // handlers that return direct values without any restrictions - LRESULT OnNotify(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { -#ifndef _WIN32_WCE - // This notification is sometimes received on Windows CE after the window is already destroyed - ATLASSERT(::IsWindow(m_hWnd)); -#endif - NMHDR* pNMHDR = (NMHDR*)lParam; - - // don't handle messages not from the page/sheet itself - if(pNMHDR->hwndFrom != m_hWnd && pNMHDR->hwndFrom != ::GetParent(m_hWnd)) - { - bHandled = FALSE; - return 1; - } -#ifdef _WIN32_WCE - ATLASSERT(::IsWindow(m_hWnd)); -#endif - - T* pT = static_cast(this); - LRESULT lResult = 0; - switch(pNMHDR->code) - { -#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS - case PSN_SETACTIVE: - lResult = pT->OnSetActive(); - break; - case PSN_KILLACTIVE: - lResult = pT->OnKillActive(); - break; - case PSN_APPLY: - lResult = pT->OnApply(); - break; - case PSN_RESET: - pT->OnReset(); - break; - case PSN_QUERYCANCEL: - lResult = pT->OnQueryCancel(); - break; - case PSN_WIZNEXT: - lResult = pT->OnWizardNext(); - break; - case PSN_WIZBACK: - lResult = pT->OnWizardBack(); - break; - case PSN_WIZFINISH: - lResult = pT->OnWizardFinish(); - break; - case PSN_HELP: - pT->OnHelp(); - break; -#ifndef _WIN32_WCE -#if (_WIN32_IE >= 0x0400) - case PSN_GETOBJECT: - if(!pT->OnGetObject((LPNMOBJECTNOTIFY)lParam)) - bHandled = FALSE; - break; -#endif // (_WIN32_IE >= 0x0400) -#if (_WIN32_IE >= 0x0500) - case PSN_TRANSLATEACCELERATOR: - { - LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam; - lResult = pT->OnTranslateAccelerator((LPMSG)lpPSHNotify->lParam); - } - break; - case PSN_QUERYINITIALFOCUS: - { - LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam; - lResult = (LRESULT)pT->OnQueryInitialFocus((HWND)lpPSHNotify->lParam); - } - break; -#endif // (_WIN32_IE >= 0x0500) -#endif // !_WIN32_WCE - -#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS - case PSN_SETACTIVE: - lResult = pT->OnSetActive() ? 0 : -1; - break; - case PSN_KILLACTIVE: - lResult = !pT->OnKillActive(); - break; - case PSN_APPLY: - lResult = pT->OnApply() ? PSNRET_NOERROR : PSNRET_INVALID_NOCHANGEPAGE; - break; - case PSN_RESET: - pT->OnReset(); - break; - case PSN_QUERYCANCEL: - lResult = !pT->OnQueryCancel(); - break; - case PSN_WIZNEXT: - lResult = pT->OnWizardNext(); - break; - case PSN_WIZBACK: - lResult = pT->OnWizardBack(); - break; - case PSN_WIZFINISH: - lResult = !pT->OnWizardFinish(); - break; - case PSN_HELP: - pT->OnHelp(); - break; -#ifndef _WIN32_WCE -#if (_WIN32_IE >= 0x0400) - case PSN_GETOBJECT: - if(!pT->OnGetObject((LPNMOBJECTNOTIFY)lParam)) - bHandled = FALSE; - break; -#endif // (_WIN32_IE >= 0x0400) -#if (_WIN32_IE >= 0x0500) - case PSN_TRANSLATEACCELERATOR: - { - LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam; - lResult = pT->OnTranslateAccelerator((LPMSG)lpPSHNotify->lParam) ? PSNRET_MESSAGEHANDLED : PSNRET_NOERROR; - } - break; - case PSN_QUERYINITIALFOCUS: - { - LPPSHNOTIFY lpPSHNotify = (LPPSHNOTIFY)lParam; - lResult = (LRESULT)pT->OnQueryInitialFocus((HWND)lpPSHNotify->lParam); - } - break; -#endif // (_WIN32_IE >= 0x0500) -#endif // !_WIN32_WCE - -#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS - default: - bHandled = FALSE; // not handled - } - - return lResult; - } - -// Overridables - // NOTE: Define _WTL_NEW_PAGE_NOTIFY_HANDLERS to use new notification - // handlers that return direct values without any restrictions -#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS - int OnSetActive() - { - // 0 = allow activate - // -1 = go back that was active - // page ID = jump to page - return 0; - } - - BOOL OnKillActive() - { - // FALSE = allow deactivate - // TRUE = prevent deactivation - return FALSE; - } - - int OnApply() - { - // PSNRET_NOERROR = apply OK - // PSNRET_INVALID = apply not OK, return to this page - // PSNRET_INVALID_NOCHANGEPAGE = apply not OK, don't change focus - return PSNRET_NOERROR; - } - - void OnReset() - { - } - - BOOL OnQueryCancel() - { - // FALSE = allow cancel - // TRUE = prevent cancel - return FALSE; - } - - int OnWizardBack() - { - // 0 = goto previous page - // -1 = prevent page change - // >0 = jump to page by dlg ID - return 0; - } - - int OnWizardNext() - { - // 0 = goto next page - // -1 = prevent page change - // >0 = jump to page by dlg ID - return 0; - } - - INT_PTR OnWizardFinish() - { - // FALSE = allow finish - // TRUE = prevent finish - // HWND = prevent finish and set focus to HWND (CommCtrl 5.80 only) - return FALSE; - } - - void OnHelp() - { - } - -#ifndef _WIN32_WCE -#if (_WIN32_IE >= 0x0400) - BOOL OnGetObject(LPNMOBJECTNOTIFY /*lpObjectNotify*/) - { - return FALSE; // not processed - } -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) - int OnTranslateAccelerator(LPMSG /*lpMsg*/) - { - // PSNRET_NOERROR - message not handled - // PSNRET_MESSAGEHANDLED - message handled - return PSNRET_NOERROR; - } - - HWND OnQueryInitialFocus(HWND /*hWndFocus*/) - { - // NULL = set focus to default control - // HWND = set focus to HWND - return NULL; - } -#endif // (_WIN32_IE >= 0x0500) -#endif // !_WIN32_WCE - -#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS - BOOL OnSetActive() - { - return TRUE; - } - - BOOL OnKillActive() - { - return TRUE; - } - - BOOL OnApply() - { - return TRUE; - } - - void OnReset() - { - } - - BOOL OnQueryCancel() - { - return TRUE; // ok to cancel - } - - int OnWizardBack() - { - // 0 = goto previous page - // -1 = prevent page change - // >0 = jump to page by dlg ID - return 0; - } - - int OnWizardNext() - { - // 0 = goto next page - // -1 = prevent page change - // >0 = jump to page by dlg ID - return 0; - } - - BOOL OnWizardFinish() - { - return TRUE; - } - - void OnHelp() - { - } - -#ifndef _WIN32_WCE -#if (_WIN32_IE >= 0x0400) - BOOL OnGetObject(LPNMOBJECTNOTIFY /*lpObjectNotify*/) - { - return FALSE; // not processed - } -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) - BOOL OnTranslateAccelerator(LPMSG /*lpMsg*/) - { - return FALSE; // not translated - } - - HWND OnQueryInitialFocus(HWND /*hWndFocus*/) - { - return NULL; // default - } -#endif // (_WIN32_IE >= 0x0500) -#endif // !_WIN32_WCE - -#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS -}; - -// for non-customized pages -template -class CPropertyPage : public CPropertyPageImpl > -{ -public: - enum { IDD = t_wDlgTemplateID }; - - CPropertyPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CPropertyPageImpl(title) - { } - - DECLARE_EMPTY_MSG_MAP() -}; - -/////////////////////////////////////////////////////////////////////////////// -// CAxPropertyPageImpl - property page that hosts ActiveX controls - -#ifndef _ATL_NO_HOSTING - -// Note: You must #include to use these classes - -template -class ATL_NO_VTABLE CAxPropertyPageImpl : public CPropertyPageImpl< T, TBase > -{ -public: -// Data members - HGLOBAL m_hInitData; - HGLOBAL m_hDlgRes; - HGLOBAL m_hDlgResSplit; - -// Constructor/destructor - CAxPropertyPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : - CPropertyPageImpl< T, TBase >(title), - m_hInitData(NULL), m_hDlgRes(NULL), m_hDlgResSplit(NULL) - { - T* pT = static_cast(this); - pT; // avoid level 4 warning - - // initialize ActiveX hosting and modify dialog template - ATL::AtlAxWinInit(); - - HINSTANCE hInstance = ModuleHelper::GetResourceInstance(); - LPCTSTR lpTemplateName = MAKEINTRESOURCE(pT->IDD); - HRSRC hDlg = ::FindResource(hInstance, lpTemplateName, (LPTSTR)RT_DIALOG); - if(hDlg != NULL) - { - HRSRC hDlgInit = ::FindResource(hInstance, lpTemplateName, (LPTSTR)_ATL_RT_DLGINIT); - - BYTE* pInitData = NULL; - if(hDlgInit != NULL) - { - m_hInitData = ::LoadResource(hInstance, hDlgInit); - pInitData = (BYTE*)::LockResource(m_hInitData); - } - - m_hDlgRes = ::LoadResource(hInstance, hDlg); - DLGTEMPLATE* pDlg = (DLGTEMPLATE*)::LockResource(m_hDlgRes); - LPCDLGTEMPLATE lpDialogTemplate = ATL::_DialogSplitHelper::SplitDialogTemplate(pDlg, pInitData); - if(lpDialogTemplate != pDlg) - m_hDlgResSplit = GlobalHandle(lpDialogTemplate); - - // set up property page to use in-memory dialog template - if(lpDialogTemplate != NULL) - { - m_psp.dwFlags |= PSP_DLGINDIRECT; - m_psp.pResource = lpDialogTemplate; - } - else - { - ATLASSERT(FALSE && _T("CAxPropertyPageImpl - ActiveX initializtion failed!")); - } - } - else - { - ATLASSERT(FALSE && _T("CAxPropertyPageImpl - Cannot find dialog template!")); - } - } - - ~CAxPropertyPageImpl() - { - if(m_hInitData != NULL) - { - UnlockResource(m_hInitData); - FreeResource(m_hInitData); - } - if(m_hDlgRes != NULL) - { - UnlockResource(m_hDlgRes); - FreeResource(m_hDlgRes); - } - if(m_hDlgResSplit != NULL) - { - ::GlobalFree(m_hDlgResSplit); - } - } - -// Methods - // call this one to handle keyboard message for ActiveX controls - BOOL PreTranslateMessage(LPMSG pMsg) - { - if ((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) && - (pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST)) - return FALSE; - // find a direct child of the dialog from the window that has focus - HWND hWndCtl = ::GetFocus(); - if (IsChild(hWndCtl) && ::GetParent(hWndCtl) != m_hWnd) - { - do - { - hWndCtl = ::GetParent(hWndCtl); - } - while (::GetParent(hWndCtl) != m_hWnd); - } - // give controls a chance to translate this message - return (BOOL)::SendMessage(hWndCtl, WM_FORWARDMSG, 0, (LPARAM)pMsg); - } - -// Overridables -#if (_WIN32_IE >= 0x0500) - // new default implementation for ActiveX hosting pages -#ifdef _WTL_NEW_PAGE_NOTIFY_HANDLERS - int OnTranslateAccelerator(LPMSG lpMsg) - { - T* pT = static_cast(this); - return (pT->PreTranslateMessage(lpMsg) != FALSE) ? PSNRET_MESSAGEHANDLED : PSNRET_NOERROR; - } -#else // !_WTL_NEW_PAGE_NOTIFY_HANDLERS - BOOL OnTranslateAccelerator(LPMSG lpMsg) - { - T* pT = static_cast(this); - return pT->PreTranslateMessage(lpMsg); - } -#endif // !_WTL_NEW_PAGE_NOTIFY_HANDLERS -#endif // (_WIN32_IE >= 0x0500) - -// Support for new stuff in ATL7 -#if (_ATL_VER >= 0x0700) - int GetIDD() - { - return( static_cast(this)->IDD ); - } - - virtual DLGPROC GetDialogProc() - { - return DialogProc; - } - - static INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) - { - CAxPropertyPageImpl< T, TBase >* pThis = (CAxPropertyPageImpl< T, TBase >*)hWnd; - if (uMsg == WM_INITDIALOG) - { - HRESULT hr; - if (FAILED(hr = pThis->CreateActiveXControls(pThis->GetIDD()))) - { - ATLASSERT(FALSE); - return FALSE; - } - } - return CPropertyPageImpl< T, TBase >::DialogProc(hWnd, uMsg, wParam, lParam); - } - -// ActiveX controls creation - virtual HRESULT CreateActiveXControls(UINT nID) - { - // Load dialog template and InitData - HRSRC hDlgInit = ::FindResource(ATL::_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(nID), (LPTSTR)_ATL_RT_DLGINIT); - BYTE* pInitData = NULL; - HGLOBAL hData = NULL; - HRESULT hr = S_OK; - if (hDlgInit != NULL) - { - hData = ::LoadResource(ATL::_AtlBaseModule.GetResourceInstance(), hDlgInit); - if (hData != NULL) - pInitData = (BYTE*) ::LockResource(hData); - } - - HRSRC hDlg = ::FindResource(ATL::_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(nID), (LPTSTR)RT_DIALOG); - if (hDlg != NULL) - { - HGLOBAL hResource = ::LoadResource(ATL::_AtlBaseModule.GetResourceInstance(), hDlg); - DLGTEMPLATE* pDlg = NULL; - if (hResource != NULL) - { - pDlg = (DLGTEMPLATE*) ::LockResource(hResource); - if (pDlg != NULL) - { - // Get first control on the template - BOOL bDialogEx = ATL::_DialogSplitHelper::IsDialogEx(pDlg); - WORD nItems = ATL::_DialogSplitHelper::DlgTemplateItemCount(pDlg); - - // Get first control on the dialog - DLGITEMTEMPLATE* pItem = ATL::_DialogSplitHelper::FindFirstDlgItem(pDlg); - HWND hWndPrev = GetWindow(GW_CHILD); - - // Create all ActiveX cotnrols in the dialog template and place them in the correct tab order (z-order) - for (WORD nItem = 0; nItem < nItems; nItem++) - { - DWORD wID = bDialogEx ? ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->id : pItem->id; - if (ATL::_DialogSplitHelper::IsActiveXControl(pItem, bDialogEx)) - { - BYTE* pData = NULL; - DWORD dwLen = ATL::_DialogSplitHelper::FindCreateData(wID, pInitData, &pData); - ATL::CComPtr spStream; - if (dwLen != 0) - { - HGLOBAL h = GlobalAlloc(GHND, dwLen); - if (h != NULL) - { - BYTE* pBytes = (BYTE*) GlobalLock(h); - BYTE* pSource = pData; - SecureHelper::memcpy_x(pBytes, dwLen, pSource, dwLen); - GlobalUnlock(h); - CreateStreamOnHGlobal(h, TRUE, &spStream); - } - else - { - hr = E_OUTOFMEMORY; - break; - } - } - - ATL::CComBSTR bstrLicKey; - hr = ATL::_DialogSplitHelper::ParseInitData(spStream, &bstrLicKey.m_str); - if (SUCCEEDED(hr)) - { - ATL::CAxWindow2 wnd; - // Get control caption. - LPWSTR pszClassName = - bDialogEx ? - (LPWSTR)(((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem) + 1) : - (LPWSTR)(pItem + 1); - // Get control rect. - RECT rect; - rect.left = - bDialogEx ? - ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->x : - pItem->x; - rect.top = - bDialogEx ? - ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->y : - pItem->y; - rect.right = rect.left + - (bDialogEx ? - ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->cx : - pItem->cx); - rect.bottom = rect.top + - (bDialogEx ? - ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->cy : - pItem->cy); - - // Convert from dialog units to screen units - MapDialogRect(&rect); - - // Create AxWindow with a NULL caption. - wnd.Create(m_hWnd, - &rect, - NULL, - (bDialogEx ? - ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->style : - pItem->style) | WS_TABSTOP, - bDialogEx ? - ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->exStyle : - 0, - bDialogEx ? - ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->id : - pItem->id, - NULL); - - if (wnd != NULL) - { -#ifndef _WIN32_WCE - // Set the Help ID - if (bDialogEx && ((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->helpID != 0) - wnd.SetWindowContextHelpId(((ATL::_DialogSplitHelper::DLGITEMTEMPLATEEX*)pItem)->helpID); -#endif // !_WIN32_WCE - // Try to create the ActiveX control. - hr = wnd.CreateControlLic(pszClassName, spStream, NULL, bstrLicKey); - if (FAILED(hr)) - break; - // Set the correct tab position. - if (nItem == 0) - hWndPrev = HWND_TOP; - wnd.SetWindowPos(hWndPrev, 0,0,0,0,SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE); - hWndPrev = wnd; - } - else - { - hr = ATL::AtlHresultFromLastError(); - } - } - } - else - { - if (nItem != 0) - hWndPrev = ::GetWindow(hWndPrev, GW_HWNDNEXT); - } - pItem = ATL::_DialogSplitHelper::FindNextDlgItem(pItem, bDialogEx); - } - } - else - hr = ATL::AtlHresultFromLastError(); - } - else - hr = ATL::AtlHresultFromLastError(); - } - return hr; - } - -// Event handling support - HRESULT AdviseSinkMap(bool bAdvise) - { - if(!bAdvise && m_hWnd == NULL) - { - // window is gone, controls are already unadvised - ATLTRACE2(atlTraceUI, 0, _T("CAxPropertyPageImpl::AdviseSinkMap called after the window was destroyed\n")); - return S_OK; - } - HRESULT hRet = E_NOTIMPL; - __if_exists(T::_GetSinkMapFinder) - { - T* pT = static_cast(this); - hRet = AtlAdviseSinkMap(pT, bAdvise); - } - return hRet; - } - -// Message map and handlers - typedef CPropertyPageImpl< T, TBase> _baseClass; - BEGIN_MSG_MAP(CAxPropertyPageImpl) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - CHAIN_MSG_MAP(_baseClass) - END_MSG_MAP() - - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - // initialize controls in dialog with DLGINIT resource section - ExecuteDlgInit(static_cast(this)->IDD); - AdviseSinkMap(true); - bHandled = FALSE; - return 1; - } - - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - AdviseSinkMap(false); - bHandled = FALSE; - return 1; - } -#endif // (_ATL_VER >= 0x0700) -}; - -// for non-customized pages -template -class CAxPropertyPage : public CAxPropertyPageImpl > -{ -public: - enum { IDD = t_wDlgTemplateID }; - - CAxPropertyPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAxPropertyPageImpl(title) - { } - -#if (_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700) - // not empty so we handle accelerators/create controls - BEGIN_MSG_MAP(CAxPropertyPage) - CHAIN_MSG_MAP(CAxPropertyPageImpl >) - END_MSG_MAP() -#else // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)) - DECLARE_EMPTY_MSG_MAP() -#endif // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)) -}; - -#endif // _ATL_NO_HOSTING - - -/////////////////////////////////////////////////////////////////////////////// -// Wizard97 Support - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -// Sample wizard dialog resources: -// -// IDD_WIZ97_INTERIOR_BLANK DIALOG 0, 0, 317, 143 -// STYLE DS_SETFONT | WS_CHILD | WS_DISABLED | WS_CAPTION -// CAPTION "Wizard97 Property Page - Interior" -// FONT 8, "MS Shell Dlg" -// BEGIN -// END -// -// IDD_WIZ97_EXTERIOR_BLANK DIALOGEX 0, 0, 317, 193 -// STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | WS_DISABLED | WS_CAPTION -// CAPTION "Wizard97 Property Page - Welcome/Complete" -// FONT 8, "MS Shell Dlg", 0, 0, 0x0 -// BEGIN -// LTEXT "Welcome to the X Wizard",IDC_WIZ97_EXTERIOR_TITLE,115,8, -// 195,24 -// LTEXT "Wizard Explanation\r\n(The height of the static text should be in multiples of 8 dlus)", -// IDC_STATIC,115,40,195,16 -// LTEXT "h",IDC_WIZ97_BULLET1,118,64,8,8 -// LTEXT "List Item 1 (the h is turned into a bullet)",IDC_STATIC, -// 127,63,122,8 -// LTEXT "h",IDC_WIZ97_BULLET2,118,79,8,8 -// LTEXT "List Item 2. Keep 7 dlus between paragraphs",IDC_STATIC, -// 127,78,33,8 -// CONTROL "&Do not show this Welcome page again", -// IDC_WIZ97_WELCOME_NOTAGAIN,"Button",BS_AUTOCHECKBOX | -// WS_TABSTOP,115,169,138,10 -// END -// -// GUIDELINES DESIGNINFO -// BEGIN -// IDD_WIZ97_INTERIOR_BLANK, DIALOG -// BEGIN -// LEFTMARGIN, 7 -// RIGHTMARGIN, 310 -// VERTGUIDE, 21 -// VERTGUIDE, 31 -// VERTGUIDE, 286 -// VERTGUIDE, 296 -// TOPMARGIN, 7 -// BOTTOMMARGIN, 136 -// HORZGUIDE, 8 -// END -// -// IDD_WIZ97_EXTERIOR_BLANK, DIALOG -// BEGIN -// RIGHTMARGIN, 310 -// VERTGUIDE, 115 -// VERTGUIDE, 118 -// VERTGUIDE, 127 -// TOPMARGIN, 7 -// BOTTOMMARGIN, 186 -// HORZGUIDE, 8 -// HORZGUIDE, 32 -// HORZGUIDE, 40 -// HORZGUIDE, 169 -// END -// END - -/////////////////////////////////////////////////////////////////////////////// -// CWizard97SheetWindow - client side for a Wizard 97 style wizard sheet - -class CWizard97SheetWindow : public CPropertySheetWindow -{ -public: -// Constructors - CWizard97SheetWindow(HWND hWnd = NULL) : CPropertySheetWindow(hWnd) - { } - - CWizard97SheetWindow& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Operations - HFONT GetExteriorPageTitleFont(void) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HFONT)::SendMessage(m_hWnd, GetMessage_GetExteriorPageTitleFont(), 0, 0L); - } - - HFONT GetBulletFont(void) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HFONT)::SendMessage(m_hWnd, GetMessage_GetBulletFont(), 0, 0L); - } - -// Helpers - static UINT GetMessage_GetExteriorPageTitleFont() - { - static UINT uGetExteriorPageTitleFont = 0; - if(uGetExteriorPageTitleFont == 0) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CWizard97SheetWindow::GetMessage_GetExteriorPageTitleFont().\n")); - ATLASSERT(FALSE); - return 0; - } - - if(uGetExteriorPageTitleFont == 0) - uGetExteriorPageTitleFont = ::RegisterWindowMessage(_T("GetExteriorPageTitleFont_531AF056-B8BE-4c4c-B786-AC608DF0DF12")); - - lock.Unlock(); - } - ATLASSERT(uGetExteriorPageTitleFont != 0); - return uGetExteriorPageTitleFont; - } - - static UINT GetMessage_GetBulletFont() - { - static UINT uGetBulletFont = 0; - if(uGetBulletFont == 0) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CWizard97SheetWindow::GetMessage_GetBulletFont().\n")); - ATLASSERT(FALSE); - return 0; - } - - if(uGetBulletFont == 0) - uGetBulletFont = ::RegisterWindowMessage(_T("GetBulletFont_AD347D08-8F65-45ef-982E-6352E8218AD5")); - - lock.Unlock(); - } - ATLASSERT(uGetBulletFont != 0); - return uGetBulletFont; - } - -// Implementation - override to prevent usage - HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL) - { - ATLASSERT(FALSE); - return NULL; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CWizard97SheetImpl - implements a Wizard 97 style wizard sheet - -template -class ATL_NO_VTABLE CWizard97SheetImpl : public CPropertySheetImpl< T, TBase > -{ -protected: -// Typedefs - typedef CWizard97SheetImpl< T, TBase > thisClass; - typedef CPropertySheetImpl< T, TBase > baseClass; - -// Member variables - CFont m_fontExteriorPageTitle; // Welcome and Completion page title font - CFont m_fontBullet; // Bullet font (used on static text 'h' to produce a small bullet) - bool m_bReceivedFirstSizeMessage; - -public: - CWizard97SheetImpl(ATL::_U_STRINGorID title, ATL::_U_STRINGorID headerBitmap, ATL::_U_STRINGorID watermarkBitmap, UINT uStartPage = 0, HWND hWndParent = NULL) : - baseClass(title, uStartPage, hWndParent), - m_bReceivedFirstSizeMessage(false) - { - m_psh.dwFlags &= ~(PSH_NOCONTEXTHELP); - m_psh.dwFlags &= ~(PSH_WIZARD | PSH_WIZARD_LITE); - - m_psh.dwFlags |= (PSH_HASHELP | PSH_WIZARDCONTEXTHELP); - m_psh.dwFlags |= PSH_WIZARD97; - - baseClass::SetHeader(headerBitmap.m_lpstr); - baseClass::SetWatermark(watermarkBitmap.m_lpstr); - } - -// Overrides from base class - void OnSheetInitialized() - { - T* pT = static_cast(this); - pT->_InitializeFonts(); - - // We'd like to center the wizard here, but its too early. - // Instead, we'll do CenterWindow upon our first WM_SIZE message - } - -// Initialization - void _InitializeFonts() - { - // Setup the Title and Bullet Font - // (Property pages can send the "get external page title font" and "get bullet font" messages) - // The derived class needs to do the actual SetFont for the dialog items) - - CFontHandle fontThisDialog = this->GetFont(); - CClientDC dcScreen(NULL); - - LOGFONT titleLogFont = {0}; - LOGFONT bulletLogFont = {0}; - fontThisDialog.GetLogFont(&titleLogFont); - fontThisDialog.GetLogFont(&bulletLogFont); - - // The Wizard 97 Spec recommends to do the Title Font - // as Verdana Bold, 12pt. - titleLogFont.lfCharSet = DEFAULT_CHARSET; - titleLogFont.lfWeight = FW_BOLD; - SecureHelper::strcpy_x(titleLogFont.lfFaceName, _countof(titleLogFont.lfFaceName), _T("Verdana Bold")); - INT titleFontPointSize = 12; - titleLogFont.lfHeight = -::MulDiv(titleFontPointSize, dcScreen.GetDeviceCaps(LOGPIXELSY), 72); - m_fontExteriorPageTitle.CreateFontIndirect(&titleLogFont); - - // The Wizard 97 Spec recommends to do Bullets by having - // static text of "h" in the Marlett font. - bulletLogFont.lfCharSet = DEFAULT_CHARSET; - bulletLogFont.lfWeight = FW_NORMAL; - SecureHelper::strcpy_x(bulletLogFont.lfFaceName, _countof(bulletLogFont.lfFaceName), _T("Marlett")); - INT bulletFontSize = 8; - bulletLogFont.lfHeight = -::MulDiv(bulletFontSize, dcScreen.GetDeviceCaps(LOGPIXELSY), 72); - m_fontBullet.CreateFontIndirect(&bulletLogFont); - } - -// Message Handling - BEGIN_MSG_MAP(thisClass) - MESSAGE_HANDLER(CWizard97SheetWindow::GetMessage_GetExteriorPageTitleFont(), OnGetExteriorPageTitleFont) - MESSAGE_HANDLER(CWizard97SheetWindow::GetMessage_GetBulletFont(), OnGetBulletFont) - MESSAGE_HANDLER(WM_SIZE, OnSize) - CHAIN_MSG_MAP(baseClass) - END_MSG_MAP() - - LRESULT OnGetExteriorPageTitleFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return (LRESULT)(HFONT)m_fontExteriorPageTitle; - } - - LRESULT OnGetBulletFont(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return (LRESULT)(HFONT)m_fontBullet; - } - - LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(!m_bReceivedFirstSizeMessage) - { - m_bReceivedFirstSizeMessage = true; - this->CenterWindow(); - } - - bHandled = FALSE; - return 0; - } -}; - -// for non-customized sheets -class CWizard97Sheet : public CWizard97SheetImpl -{ -protected: -// Typedefs - typedef CWizard97Sheet thisClass; - typedef CWizard97SheetImpl baseClass; - -public: - CWizard97Sheet(ATL::_U_STRINGorID title, ATL::_U_STRINGorID headerBitmap, ATL::_U_STRINGorID watermarkBitmap, UINT uStartPage = 0, HWND hWndParent = NULL) : - baseClass(title, headerBitmap, watermarkBitmap, uStartPage, hWndParent) - { } - - BEGIN_MSG_MAP(thisClass) - CHAIN_MSG_MAP(baseClass) - END_MSG_MAP() -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CWizard97PageWindow - client side for a Wizard 97 style wizard page - -#define WIZARD97_EXTERIOR_CXDLG 317 -#define WIZARD97_EXTERIOR_CYDLG 193 - -#define WIZARD97_INTERIOR_CXDLG 317 -#define WIZARD97_INTERIOR_CYDLG 143 - -class CWizard97PageWindow : public CPropertyPageWindow -{ -public: -// Constructors - CWizard97PageWindow(HWND hWnd = NULL) : CPropertyPageWindow(hWnd) - { } - - CWizard97PageWindow& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Attributes - CWizard97SheetWindow GetPropertySheet() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return CWizard97SheetWindow(GetParent()); - } - -// Operations - HFONT GetExteriorPageTitleFont(void) - { - ATLASSERT(::IsWindow(m_hWnd)); - return GetPropertySheet().GetExteriorPageTitleFont(); - } - - HFONT GetBulletFont(void) - { - ATLASSERT(::IsWindow(m_hWnd)); - return GetPropertySheet().GetBulletFont(); - } - -// Implementation - overrides to prevent usage - HWND Create(LPCTSTR, HWND, ATL::_U_RECT = NULL, LPCTSTR = NULL, DWORD = 0, DWORD = 0, ATL::_U_MENUorID = 0U, LPVOID = NULL) - { - ATLASSERT(FALSE); - return NULL; - } - -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CWizard97PageImpl - implements a Wizard 97 style wizard page - -template -class ATL_NO_VTABLE CWizard97PageImpl : public CPropertyPageImpl< T, TBase > -{ -protected: -// Typedefs - typedef CWizard97PageImpl< T, TBase > thisClass; - typedef CPropertyPageImpl< T, TBase > baseClass; - -public: - CWizard97PageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title) - { } - -// Message Handling - BEGIN_MSG_MAP(thisClass) - CHAIN_MSG_MAP(baseClass) - END_MSG_MAP() -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CWizard97ExteriorPageImpl - implements a Wizard 97 style exterior wizard page - -template -class ATL_NO_VTABLE CWizard97ExteriorPageImpl : public CPropertyPageImpl< T, TBase > -{ -protected: -// Typedefs - typedef CWizard97ExteriorPageImpl< T, TBase > thisClass; - typedef CPropertyPageImpl< T, TBase > baseClass; - -public: -// Constructors - CWizard97ExteriorPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title) - { - m_psp.dwFlags |= PSP_HASHELP; - m_psp.dwFlags |= PSP_HIDEHEADER; - } - -// Message Handling - BEGIN_MSG_MAP(thisClass) - CHAIN_MSG_MAP(baseClass) - END_MSG_MAP() -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CWizard97InteriorPageImpl - implements a Wizard 97 style interior wizard page - -template -class ATL_NO_VTABLE CWizard97InteriorPageImpl : public CPropertyPageImpl< T, TBase > -{ -protected: -// Typedefs - typedef CWizard97InteriorPageImpl< T, TBase > thisClass; - typedef CPropertyPageImpl< T, TBase > baseClass; - -public: -// Constructors - CWizard97InteriorPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : baseClass(title) - { - m_psp.dwFlags |= PSP_HASHELP; - m_psp.dwFlags &= ~PSP_HIDEHEADER; - m_psp.dwFlags |= PSP_USEHEADERTITLE | PSP_USEHEADERSUBTITLE; - - // Be sure to have the derived class define this in the constructor. - // We'll default it to something obvious in case its forgotten. - baseClass::SetHeaderTitle(_T("Call SetHeaderTitle in Derived Class")); - baseClass::SetHeaderSubTitle(_T("Call SetHeaderSubTitle in the constructor of the Derived Class.")); - } - -// Message Handling - BEGIN_MSG_MAP(thisClass) - CHAIN_MSG_MAP(baseClass) - END_MSG_MAP() -}; - -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// Aero Wizard support - -#if (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) - -/////////////////////////////////////////////////////////////////////////////// -// CAeroWizardFrameWindow - client side for an Aero Wizard frame window - -class CAeroWizardFrameWindow : public CPropertySheetWindow -{ -public: -// Constructors - CAeroWizardFrameWindow(HWND hWnd = NULL) : CPropertySheetWindow(hWnd) - { } - - CAeroWizardFrameWindow& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Operations - new, Aero Wizard only - void SetNextText(LPCWSTR lpszText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_SETNEXTTEXT, 0, (LPARAM)lpszText); - } - - void ShowWizardButtons(DWORD dwButtons, DWORD dwStates) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::PostMessage(m_hWnd, PSM_SHOWWIZBUTTONS, (WPARAM)dwStates, (LPARAM)dwButtons); - } - - void EnableWizardButtons(DWORD dwButtons, DWORD dwStates) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::PostMessage(m_hWnd, PSM_ENABLEWIZBUTTONS, (WPARAM)dwStates, (LPARAM)dwButtons); - } - - void SetButtonText(DWORD dwButton, LPCWSTR lpszText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, PSM_SETBUTTONTEXT, (WPARAM)dwButton, (LPARAM)lpszText); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAeroWizardFrameImpl - implements an Aero Wizard frame - -template -class ATL_NO_VTABLE CAeroWizardFrameImpl : public CPropertySheetImpl -{ -public: -// Constructor - CAeroWizardFrameImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) : - CPropertySheetImpl(title, uStartPage, hWndParent) - { - m_psh.dwFlags |= PSH_WIZARD | PSH_AEROWIZARD; - } - -// Operations - void EnableResizing() - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - m_psh.dwFlags |= PSH_RESIZABLE; - } - - void UseHeaderBitmap() - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - m_psh.dwFlags |= PSH_HEADERBITMAP; - } - - void SetNoMargin() - { - ATLASSERT(m_hWnd == NULL); // can't do this after it's created - m_psh.dwFlags |= PSH_NOMARGIN; - } - -// Override to prevent use - HWND Create(HWND /*hWndParent*/ = NULL) - { - ATLASSERT(FALSE); // not supported for Aero Wizard - return NULL; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAeroWizardFrame - for non-customized frames - -class CAeroWizardFrame : public CAeroWizardFrameImpl -{ -public: - CAeroWizardFrame(ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uStartPage = 0, HWND hWndParent = NULL) - : CAeroWizardFrameImpl(title, uStartPage, hWndParent) - { } - - BEGIN_MSG_MAP(CAeroWizardFrame) - MESSAGE_HANDLER(WM_COMMAND, CAeroWizardFrameImpl::OnCommand) - END_MSG_MAP() -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAeroWizardPageWindow - client side for an Aero Wizard page - -class CAeroWizardPageWindow : public CPropertyPageWindow -{ -public: -// Constructors - CAeroWizardPageWindow(HWND hWnd = NULL) : CPropertyPageWindow(hWnd) - { } - - CAeroWizardPageWindow& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Attributes - CAeroWizardFrameWindow GetAeroWizardFrame() const - { - ATLASSERT(::IsWindow(m_hWnd)); - // This is not really top-level frame window, but it processes all frame messages - return CAeroWizardFrameWindow(GetParent()); - } - -// Operations - new, Aero Wizard only - void SetNextText(LPCWSTR lpszText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetAeroWizardFrame().SetNextText(lpszText); - } - - void ShowWizardButtons(DWORD dwButtons, DWORD dwStates) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetAeroWizardFrame().ShowWizardButtons(dwButtons, dwStates); - } - - void EnableWizardButtons(DWORD dwButtons, DWORD dwStates) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetAeroWizardFrame().EnableWizardButtons(dwButtons, dwStates); - } - - void SetButtonText(DWORD dwButton, LPCWSTR lpszText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetParent() != NULL); - GetAeroWizardFrame().SetButtonText(dwButton, lpszText); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAeroWizardPageImpl - implements an Aero Wizard page - -template -class ATL_NO_VTABLE CAeroWizardPageImpl : public CPropertyPageImpl -{ -public: - CAeroWizardPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CPropertyPageImpl(title) - { } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAeroWizardPage - for non-customized pages - -template -class CAeroWizardPage : public CAeroWizardPageImpl > -{ -public: - enum { IDD = t_wDlgTemplateID }; - - CAeroWizardPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAeroWizardPageImpl(title) - { } - - DECLARE_EMPTY_MSG_MAP() -}; - - -#ifndef _ATL_NO_HOSTING - -// Note: You must #include to use these classes - -/////////////////////////////////////////////////////////////////////////////// -// CAeroWizardAxPageImpl - Aero Wizard page that hosts ActiveX controls - -template -class ATL_NO_VTABLE CAeroWizardAxPageImpl : public CAxPropertyPageImpl< T, TBase > -{ -public: - CAeroWizardAxPageImpl(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAxPropertyPageImpl< T, TBase >(title) - { } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAeroWizardAxPage - for non-customized pages - -template -class CAeroWizardAxPage : public CAeroWizardAxPageImpl > -{ -public: - enum { IDD = t_wDlgTemplateID }; - - CAeroWizardAxPage(ATL::_U_STRINGorID title = (LPCTSTR)NULL) : CAeroWizardAxPageImpl(title) - { } - -#if (_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700) - // not empty so we handle accelerators/create controls - BEGIN_MSG_MAP(CAeroWizardAxPage) - CHAIN_MSG_MAP(CAeroWizardAxPageImpl >) - END_MSG_MAP() -#else // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)) - DECLARE_EMPTY_MSG_MAP() -#endif // !((_WIN32_IE >= 0x0500) || (_ATL_VER >= 0x0700)) -}; - -#endif // _ATL_NO_HOSTING - -#endif // (_WIN32_WINNT >= 0x0600) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// TaskDialog support - -#if ((_WIN32_WINNT >= 0x0600) || defined(_WTL_TASKDIALOG)) && !defined(_WIN32_WCE) - -/////////////////////////////////////////////////////////////////////////////// -// AtlTaskDialog - support for TaskDialog() function - -inline int AtlTaskDialog(HWND hWndParent, - ATL::_U_STRINGorID WindowTitle, ATL::_U_STRINGorID MainInstructionText, ATL::_U_STRINGorID ContentText, - TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons = 0U, ATL::_U_STRINGorID Icon = (LPCTSTR)NULL) -{ - int nRet = -1; - -#ifdef _WTL_TASKDIALOG_DIRECT - USES_CONVERSION; - HRESULT hRet = ::TaskDialog(hWndParent, ModuleHelper::GetResourceInstance(), - IS_INTRESOURCE(WindowTitle.m_lpstr) ? (LPCWSTR) WindowTitle.m_lpstr : T2CW(WindowTitle.m_lpstr), - IS_INTRESOURCE(MainInstructionText.m_lpstr) ? (LPCWSTR) MainInstructionText.m_lpstr : T2CW(MainInstructionText.m_lpstr), - IS_INTRESOURCE(ContentText.m_lpstr) ? (LPCWSTR) ContentText.m_lpstr : T2CW(ContentText.m_lpstr), - dwCommonButtons, - IS_INTRESOURCE(Icon.m_lpstr) ? (LPCWSTR) Icon.m_lpstr : T2CW(Icon.m_lpstr), - &nRet); - ATLVERIFY(SUCCEEDED(hRet)); -#else - // This allows apps to run on older versions of Windows - typedef HRESULT (STDAPICALLTYPE *PFN_TaskDialog)(HWND hwndParent, HINSTANCE hInstance, PCWSTR pszWindowTitle, PCWSTR pszMainInstruction, PCWSTR pszContent, TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons, PCWSTR pszIcon, int* pnButton); - - HMODULE m_hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll")); - if(m_hCommCtrlDLL != NULL) - { - PFN_TaskDialog pfnTaskDialog = (PFN_TaskDialog)::GetProcAddress(m_hCommCtrlDLL, "TaskDialog"); - if(pfnTaskDialog != NULL) - { - USES_CONVERSION; - HRESULT hRet = pfnTaskDialog(hWndParent, ModuleHelper::GetResourceInstance(), - IS_INTRESOURCE(WindowTitle.m_lpstr) ? (LPCWSTR) WindowTitle.m_lpstr : T2CW(WindowTitle.m_lpstr), - IS_INTRESOURCE(MainInstructionText.m_lpstr) ? (LPCWSTR) MainInstructionText.m_lpstr : T2CW(MainInstructionText.m_lpstr), - IS_INTRESOURCE(ContentText.m_lpstr) ? (LPCWSTR) ContentText.m_lpstr : T2CW(ContentText.m_lpstr), - dwCommonButtons, - IS_INTRESOURCE(Icon.m_lpstr) ? (LPCWSTR) Icon.m_lpstr : T2CW(Icon.m_lpstr), - &nRet); - ATLVERIFY(SUCCEEDED(hRet)); - } - - ::FreeLibrary(m_hCommCtrlDLL); - } -#endif - - return nRet; -} - - -/////////////////////////////////////////////////////////////////////////////// -// CTaskDialogConfig - TASKDIALOGCONFIG wrapper - -class CTaskDialogConfig : public TASKDIALOGCONFIG -{ -public: -// Constructor - CTaskDialogConfig() - { - Init(); - } - - void Init() - { - memset(this, 0, sizeof(TASKDIALOGCONFIG)); // initialize structure to 0/NULL - this->cbSize = sizeof(TASKDIALOGCONFIG); - this->hInstance = ModuleHelper::GetResourceInstance(); - } - -// Operations - setting values - // common buttons - void SetCommonButtons(TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons) - { - this->dwCommonButtons = dwCommonButtons; - } - - // window title text - void SetWindowTitle(UINT nID) - { - this->pszWindowTitle = MAKEINTRESOURCEW(nID); - } - - void SetWindowTitle(LPCWSTR lpstrWindowTitle) - { - this->pszWindowTitle = lpstrWindowTitle; - } - - // main icon - void SetMainIcon(HICON hIcon) - { - this->dwFlags |= TDF_USE_HICON_MAIN; - this->hMainIcon = hIcon; - } - - void SetMainIcon(UINT nID) - { - this->dwFlags &= ~TDF_USE_HICON_MAIN; - this->pszMainIcon = MAKEINTRESOURCEW(nID); - } - - void SetMainIcon(LPCWSTR lpstrMainIcon) - { - this->dwFlags &= ~TDF_USE_HICON_MAIN; - this->pszMainIcon = lpstrMainIcon; - } - - // main instruction text - void SetMainInstructionText(UINT nID) - { - this->pszMainInstruction = MAKEINTRESOURCEW(nID); - } - - void SetMainInstructionText(LPCWSTR lpstrMainInstruction) - { - this->pszMainInstruction = lpstrMainInstruction; - } - - // content text - void SetContentText(UINT nID) - { - this->pszContent = MAKEINTRESOURCEW(nID); - } - - void SetContentText(LPCWSTR lpstrContent) - { - this->pszContent = lpstrContent; - } - - // buttons - void SetButtons(const TASKDIALOG_BUTTON* pButtons, UINT cButtons, int nDefaultButton = 0) - { - this->pButtons = pButtons; - this->cButtons = cButtons; - if(nDefaultButton != 0) - this->nDefaultButton = nDefaultButton; - } - - void SetDefaultButton(int nDefaultButton) - { - this->nDefaultButton = nDefaultButton; - } - - // radio buttons - void SetRadioButtons(const TASKDIALOG_BUTTON* pRadioButtons, UINT cRadioButtons, int nDefaultRadioButton = 0) - { - this->pRadioButtons = pRadioButtons; - this->cRadioButtons = cRadioButtons; - if(nDefaultRadioButton != 0) - this->nDefaultRadioButton = nDefaultRadioButton; - } - - void SetDefaultRadioButton(int nDefaultRadioButton) - { - this->nDefaultRadioButton = nDefaultRadioButton; - } - - // verification text - void SetVerificationText(UINT nID) - { - this->pszVerificationText = MAKEINTRESOURCEW(nID); - } - - void SetVerificationText(LPCWSTR lpstrVerificationText) - { - this->pszVerificationText = lpstrVerificationText; - } - - // expanded information text - void SetExpandedInformationText(UINT nID) - { - this->pszExpandedInformation = MAKEINTRESOURCEW(nID); - } - - void SetExpandedInformationText(LPCWSTR lpstrExpandedInformation) - { - this->pszExpandedInformation = lpstrExpandedInformation; - } - - // expanded control text - void SetExpandedControlText(UINT nID) - { - this->pszExpandedControlText = MAKEINTRESOURCEW(nID); - } - - void SetExpandedControlText(LPCWSTR lpstrExpandedControlText) - { - this->pszExpandedControlText = lpstrExpandedControlText; - } - - // collapsed control text - void SetCollapsedControlText(UINT nID) - { - this->pszCollapsedControlText = MAKEINTRESOURCEW(nID); - } - - void SetCollapsedControlText(LPCWSTR lpstrCollapsedControlText) - { - this->pszCollapsedControlText = lpstrCollapsedControlText; - } - - // footer icon - void SetFooterIcon(HICON hIcon) - { - this->dwFlags |= TDF_USE_HICON_FOOTER; - this->hFooterIcon = hIcon; - } - - void SetFooterIcon(UINT nID) - { - this->dwFlags &= ~TDF_USE_HICON_FOOTER; - this->pszFooterIcon = MAKEINTRESOURCEW(nID); - } - - void SetFooterIcon(LPCWSTR lpstrFooterIcon) - { - this->dwFlags &= ~TDF_USE_HICON_FOOTER; - this->pszFooterIcon = lpstrFooterIcon; - } - - // footer text - void SetFooterText(UINT nID) - { - this->pszFooter = MAKEINTRESOURCEW(nID); - } - - void SetFooterText(LPCWSTR lpstrFooterText) - { - this->pszFooter = lpstrFooterText; - } - - // width (in DLUs) - void SetWidth(UINT cxWidth) - { - this->cxWidth = cxWidth; - } - - // modify flags - void ModifyFlags(DWORD dwRemove, DWORD dwAdd) - { - this->dwFlags = (this->dwFlags & ~dwRemove) | dwAdd; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CTaskDialogImpl - implements a Task Dialog - -template -class ATL_NO_VTABLE CTaskDialogImpl -{ -public: - CTaskDialogConfig m_tdc; - HWND m_hWnd; // used only in callback functions - -// Constructor - CTaskDialogImpl(HWND hWndParent = NULL) : m_hWnd(NULL) - { - m_tdc.hwndParent = hWndParent; - m_tdc.pfCallback = T::TaskDialogCallback; - m_tdc.lpCallbackData = (LONG_PTR)static_cast(this); - } - -// Operations - HRESULT DoModal(HWND hWndParent = ::GetActiveWindow(), int* pnButton = NULL, int* pnRadioButton = NULL, BOOL* pfVerificationFlagChecked = NULL) - { - if(m_tdc.hwndParent == NULL) - m_tdc.hwndParent = hWndParent; - -#ifdef _WTL_TASKDIALOG_DIRECT - return ::TaskDialogIndirect(&m_tdc, pnButton, pnRadioButton, pfVerificationFlagChecked); -#else - - // This allows apps to run on older versions of Windows - typedef HRESULT (STDAPICALLTYPE *PFN_TaskDialogIndirect)(const TASKDIALOGCONFIG* pTaskConfig, int* pnButton, int* pnRadioButton, BOOL* pfVerificationFlagChecked); - - HRESULT hRet = E_UNEXPECTED; - HMODULE m_hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll")); - if(m_hCommCtrlDLL != NULL) - { - PFN_TaskDialogIndirect pfnTaskDialogIndirect = (PFN_TaskDialogIndirect)::GetProcAddress(m_hCommCtrlDLL, "TaskDialogIndirect"); - if(pfnTaskDialogIndirect != NULL) - hRet = pfnTaskDialogIndirect(&m_tdc, pnButton, pnRadioButton, pfVerificationFlagChecked); - - ::FreeLibrary(m_hCommCtrlDLL); - } - - return hRet; -#endif - } - -// Operations - setting values of TASKDIALOGCONFIG - // common buttons - void SetCommonButtons(TASKDIALOG_COMMON_BUTTON_FLAGS dwCommonButtons) - { m_tdc.SetCommonButtons(dwCommonButtons); } - // window title text - void SetWindowTitle(UINT nID) - { m_tdc.SetWindowTitle(nID); } - void SetWindowTitle(LPCWSTR lpstrWindowTitle) - { m_tdc.SetWindowTitle(lpstrWindowTitle); } - // main icon - void SetMainIcon(HICON hIcon) - { m_tdc.SetMainIcon(hIcon); } - void SetMainIcon(UINT nID) - { m_tdc.SetMainIcon(nID); } - void SetMainIcon(LPCWSTR lpstrMainIcon) - { m_tdc.SetMainIcon(lpstrMainIcon); } - // main instruction text - void SetMainInstructionText(UINT nID) - { m_tdc.SetMainInstructionText(nID); } - void SetMainInstructionText(LPCWSTR lpstrMainInstruction) - { m_tdc.SetMainInstructionText(lpstrMainInstruction); } - // content text - void SetContentText(UINT nID) - { m_tdc.SetContentText(nID); } - void SetContentText(LPCWSTR lpstrContent) - { m_tdc.SetContentText(lpstrContent); } - // buttons - void SetButtons(const TASKDIALOG_BUTTON* pButtons, UINT cButtons, int nDefaultButton = 0) - { m_tdc.SetButtons(pButtons, cButtons, nDefaultButton); } - void SetDefaultButton(int nDefaultButton) - { m_tdc.SetDefaultButton(nDefaultButton); } - // radio buttons - void SetRadioButtons(const TASKDIALOG_BUTTON* pRadioButtons, UINT cRadioButtons, int nDefaultRadioButton = 0) - { m_tdc.SetRadioButtons(pRadioButtons, cRadioButtons, nDefaultRadioButton); } - void SetDefaultRadioButton(int nDefaultRadioButton) - { m_tdc.SetDefaultRadioButton(nDefaultRadioButton); } - // verification text - void SetVerificationText(UINT nID) - { m_tdc.SetVerificationText(nID); } - void SetVerificationText(LPCWSTR lpstrVerificationText) - { m_tdc.SetVerificationText(lpstrVerificationText); } - // expanded information text - void SetExpandedInformationText(UINT nID) - { m_tdc.SetExpandedInformationText(nID); } - void SetExpandedInformationText(LPCWSTR lpstrExpandedInformation) - { m_tdc.SetExpandedInformationText(lpstrExpandedInformation); } - // expanded control text - void SetExpandedControlText(UINT nID) - { m_tdc.SetExpandedControlText(nID); } - void SetExpandedControlText(LPCWSTR lpstrExpandedControlText) - { m_tdc.SetExpandedControlText(lpstrExpandedControlText); } - // collapsed control text - void SetCollapsedControlText(UINT nID) - { m_tdc.SetCollapsedControlText(nID); } - void SetCollapsedControlText(LPCWSTR lpstrCollapsedControlText) - { m_tdc.SetCollapsedControlText(lpstrCollapsedControlText); } - // footer icon - void SetFooterIcon(HICON hIcon) - { m_tdc.SetFooterIcon(hIcon); } - void SetFooterIcon(UINT nID) - { m_tdc.SetFooterIcon(nID); } - void SetFooterIcon(LPCWSTR lpstrFooterIcon) - { m_tdc.SetFooterIcon(lpstrFooterIcon); } - // footer text - void SetFooterText(UINT nID) - { m_tdc.SetFooterText(nID); } - void SetFooterText(LPCWSTR lpstrFooterText) - { m_tdc.SetFooterText(lpstrFooterText); } - // width (in DLUs) - void SetWidth(UINT cxWidth) - { m_tdc.SetWidth(cxWidth); } - // modify flags - void ModifyFlags(DWORD dwRemove, DWORD dwAdd) - { m_tdc.ModifyFlags(dwRemove, dwAdd); } - -// Implementation - static HRESULT CALLBACK TaskDialogCallback(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LONG_PTR lpRefData) - { - T* pT = (T*)lpRefData; - ATLASSERT(pT->m_hWnd == NULL || pT->m_hWnd == hWnd); - - BOOL bRet = FALSE; - switch(uMsg) - { - case TDN_DIALOG_CONSTRUCTED: - pT->m_hWnd = hWnd; - pT->OnDialogConstructed(); - break; - case TDN_CREATED: - pT->OnCreated(); - break; - case TDN_BUTTON_CLICKED: - bRet = pT->OnButtonClicked((int)wParam); - break; - case TDN_RADIO_BUTTON_CLICKED: - pT->OnRadioButtonClicked((int)wParam); - break; - case TDN_HYPERLINK_CLICKED: - pT->OnHyperlinkClicked((LPCWSTR)lParam); - break; - case TDN_EXPANDO_BUTTON_CLICKED: - pT->OnExpandoButtonClicked((wParam != 0)); - break; - case TDN_VERIFICATION_CLICKED: - pT->OnVerificationClicked((wParam != 0)); - break; - case TDN_HELP: - pT->OnHelp(); - break; - case TDN_TIMER: - bRet = pT->OnTimer((DWORD)wParam); - break; - case TDN_NAVIGATED: - pT->OnNavigated(); - break; - case TDN_DESTROYED: - pT->OnDestroyed(); - pT->m_hWnd = NULL; - break; - default: - ATLTRACE2(atlTraceUI, 0, _T("Unknown notification received in CTaskDialogImpl::TaskDialogCallback\n")); - break; - } - - return (HRESULT)bRet; - } - -// Overrideables - notification handlers - void OnDialogConstructed() - { - } - - void OnCreated() - { - } - - BOOL OnButtonClicked(int /*nButton*/) - { - return FALSE; // don't prevent dialog to close - } - - void OnRadioButtonClicked(int /*nRadioButton*/) - { - } - - void OnHyperlinkClicked(LPCWSTR /*pszHREF*/) - { - } - - void OnExpandoButtonClicked(bool /*bExpanded*/) - { - } - - void OnVerificationClicked(bool /*bChecked*/) - { - } - - void OnHelp() - { - } - - BOOL OnTimer(DWORD /*dwTickCount*/) - { - return FALSE; // don't reset counter - } - - void OnNavigated() - { - } - - void OnDestroyed() - { - } - -// Commands - valid to call only from handlers - void NavigatePage(TASKDIALOGCONFIG& tdc) - { - ATLASSERT(m_hWnd != NULL); - - tdc.cbSize = sizeof(TASKDIALOGCONFIG); - if(tdc.hwndParent == NULL) - tdc.hwndParent = m_tdc.hwndParent; - tdc.pfCallback = m_tdc.pfCallback; - tdc.lpCallbackData = m_tdc.lpCallbackData; - (TASKDIALOGCONFIG)m_tdc = tdc; - - ::SendMessage(m_hWnd, TDM_NAVIGATE_PAGE, 0, (LPARAM)&tdc); - } - - // modify TASKDIALOGCONFIG values, then call this to update task dialog - void NavigatePage() - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_NAVIGATE_PAGE, 0, (LPARAM)&m_tdc); - } - - void ClickButton(int nButton) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_CLICK_BUTTON, nButton, 0L); - } - - void SetMarqueeProgressBar(BOOL bMarquee) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_SET_MARQUEE_PROGRESS_BAR, bMarquee, 0L); - } - - BOOL SetProgressBarState(int nNewState) - { - ATLASSERT(m_hWnd != NULL); - return (BOOL)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_STATE, nNewState, 0L); - } - - DWORD SetProgressBarRange(int nMinRange, int nMaxRange) - { - ATLASSERT(m_hWnd != NULL); - return (DWORD)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_RANGE, 0, MAKELPARAM(nMinRange, nMaxRange)); - } - - int SetProgressBarPos(int nNewPos) - { - ATLASSERT(m_hWnd != NULL); - return (int)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_POS, nNewPos, 0L); - } - - BOOL SetProgressBarMarquee(BOOL bMarquee, UINT uSpeed) - { - ATLASSERT(m_hWnd != NULL); - return (BOOL)::SendMessage(m_hWnd, TDM_SET_PROGRESS_BAR_MARQUEE, bMarquee, uSpeed); - } - - void SetElementText(TASKDIALOG_ELEMENTS element, LPCWSTR lpstrText) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_SET_ELEMENT_TEXT, element, (LPARAM)lpstrText); - } - - void ClickRadioButton(int nRadioButton) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_CLICK_RADIO_BUTTON, nRadioButton, 0L); - } - - void EnableButton(int nButton, BOOL bEnable) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_ENABLE_BUTTON, nButton, bEnable); - } - - void EnableRadioButton(int nButton, BOOL bEnable) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_ENABLE_RADIO_BUTTON, nButton, bEnable); - } - - void ClickVerification(BOOL bCheck, BOOL bFocus) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_CLICK_VERIFICATION, bCheck, bFocus); - } - - void UpdateElementText(TASKDIALOG_ELEMENTS element, LPCWSTR lpstrText) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_UPDATE_ELEMENT_TEXT, element, (LPARAM)lpstrText); - } - - void SetButtonElevationRequiredState(int nButton, BOOL bElevation) - { - ATLASSERT(m_hWnd != NULL); - ::SendMessage(m_hWnd, TDM_SET_BUTTON_ELEVATION_REQUIRED_STATE, nButton, bElevation); - } - - void UpdateIcon(TASKDIALOG_ICON_ELEMENTS element, HICON hIcon) - { - ATLASSERT(m_hWnd != NULL); -#ifdef _DEBUG - if(element == TDIE_ICON_MAIN) - ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_MAIN) != 0); - else if(element == TDIE_ICON_FOOTER) - ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_FOOTER) != 0); -#endif // _DEBUG - ::SendMessage(m_hWnd, TDM_UPDATE_ICON, element, (LPARAM)hIcon); - } - - void UpdateIcon(TASKDIALOG_ICON_ELEMENTS element, LPCWSTR lpstrIcon) - { - ATLASSERT(m_hWnd != NULL); -#ifdef _DEBUG - if(element == TDIE_ICON_MAIN) - ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_MAIN) == 0); - else if(element == TDIE_ICON_FOOTER) - ATLASSERT((m_tdc.dwFlags & TDF_USE_HICON_FOOTER) == 0); -#endif // _DEBUG - ::SendMessage(m_hWnd, TDM_UPDATE_ICON, element, (LPARAM)lpstrIcon); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CTaskDialog - for non-customized task dialogs - -class CTaskDialog : public CTaskDialogImpl -{ -public: - CTaskDialog(HWND hWndParent = NULL) : CTaskDialogImpl(hWndParent) - { - m_tdc.pfCallback = NULL; - } -}; - -#endif // ((_WIN32_WINNT >= 0x0600) || defined(_WTL_TASKDIALOG)) && !defined(_WIN32_WCE) - -}; // namespace WTL - -#endif // __ATLDLGS_H__ diff --git a/plugins/SmartAutoReplier/wtl/atldwm.h b/plugins/SmartAutoReplier/wtl/atldwm.h deleted file mode 100644 index fea8254827..0000000000 --- a/plugins/SmartAutoReplier/wtl/atldwm.h +++ /dev/null @@ -1,461 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLDWM_H__ -#define __ATLDWM_H__ - -#pragma once - -#ifdef _WIN32_WCE - #error atldwm.h is not supported on Windows CE -#endif - -#ifndef __ATLAPP_H__ - #error atldwm.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atldwm.h requires atlwin.h to be included first -#endif - -#if (_WIN32_WINNT < 0x0600) - #error atldwm.h requires _WIN32_WINNT >= 0x0600 -#endif // (_WIN32_WINNT < 0x0600) - -#ifndef _DWMAPI_H_ -#include -#endif // _DWMAPI_H_ -#pragma comment(lib, "dwmapi.lib") - -// Note: To create an application that also runs on older versions of Windows, -// use delay load of dwmapi.dll and ensure that no calls to the DWM API are -// Delay load is NOT AUTOMATIC for VC++ 7, you have to link to delayimp.lib, -// and add dwmapi.dll in the Linker.Input.Delay Loaded DLLs section of the -// project properties. -#if (_MSC_VER < 1300) && !defined(_WTL_NO_DWMAPI_DELAYLOAD) - #pragma comment(lib, "delayimp.lib") - #pragma comment(linker, "/delayload:dwmapi.dll") -#endif // (_MSC_VER < 1300) && !defined(_WTL_NO_DWMAPI_DELAYLOAD) - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CDwm -// CDwmImpl -// CDwmWindowT - CDwmWindow -// CDwmThumbnailT -// CDwmThumbnail -// CDwmThumbnailHandle -// CAeroControlImpl - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CDwm - wrapper for DWM handle - -class CDwm -{ -public: -// Data members - static int m_nIsDwmSupported; - -// Constructor - CDwm() - { - IsDwmSupported(); - } - -// Dwm support helper - static bool IsDwmSupported() - { - if(m_nIsDwmSupported == -1) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CDwm::IsDwmSupported.\n")); - ATLASSERT(FALSE); - return false; - } - - if(m_nIsDwmSupported == -1) - { - HMODULE hDwmDLL = ::LoadLibrary(_T("dwmapi.dll")); - m_nIsDwmSupported = (hDwmDLL != NULL) ? 1 : 0; - if(hDwmDLL != NULL) - ::FreeLibrary(hDwmDLL); - } - - lock.Unlock(); - } - - ATLASSERT(m_nIsDwmSupported != -1); - return (m_nIsDwmSupported == 1); - } - -// Operations - BOOL DwmIsCompositionEnabled() const - { - if(!IsDwmSupported()) return FALSE; - BOOL bRes = FALSE; - return SUCCEEDED(::DwmIsCompositionEnabled(&bRes)) && bRes; - } - - BOOL DwmEnableComposition(UINT fEnable) - { - if(!IsDwmSupported()) return FALSE; - return SUCCEEDED(::DwmEnableComposition(fEnable)); - } - - BOOL DwmEnableMMCSS(BOOL fEnableMMCSS) - { - if(!IsDwmSupported()) return FALSE; - return SUCCEEDED(::DwmEnableMMCSS(fEnableMMCSS)); - } - - HRESULT DwmGetColorizationColor(DWORD* pcrColorization, BOOL* pfOpaqueBlend) - { - if(!IsDwmSupported()) return E_NOTIMPL; - return ::DwmGetColorizationColor(pcrColorization, pfOpaqueBlend); - } - - HRESULT DwmFlush() - { - if(!IsDwmSupported()) return E_NOTIMPL; - return ::DwmFlush(); - } -}; - -__declspec(selectany) int CDwm::m_nIsDwmSupported = -1; - - -/////////////////////////////////////////////////////////////////////////////// -// CDwmImpl - DWM window support - -template -class CDwmImpl : public TBase -{ -public: - HRESULT DwmEnableBlurBehindWindow(const DWM_BLURBEHIND* pBB) - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmEnableBlurBehindWindow(pT->m_hWnd, pBB); - } - - HRESULT DwmExtendFrameIntoClientArea(const MARGINS* pMargins) - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmExtendFrameIntoClientArea(pT->m_hWnd, pMargins); - } - - HRESULT DwmExtendFrameIntoEntireClientArea() - { - MARGINS margins = { -1 }; - return DwmExtendFrameIntoClientArea(&margins); - } - - HRESULT DwmGetCompositionTimingInfo(DWM_TIMING_INFO* pTimingInfo) - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmGetCompositionTimingInfo(pT->m_hWnd, pTimingInfo); - } - - HRESULT DwmGetWindowAttribute(DWORD dwAttribute, PVOID pvAttribute, DWORD cbAttribute) - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmGetWindowAttribute(pT->m_hWnd, dwAttribute, pvAttribute, cbAttribute); - } - - HRESULT DwmModifyPreviousDxFrameDuration(INT cRefreshes, BOOL fRelative) - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmModifyPreviousDxFrameDuration(pT->m_hWnd, cRefreshes, fRelative); - } - - HRESULT DwmSetDxFrameDuration(INT cRefreshes) - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmSetDxFrameDuration(pT->m_hWnd, cRefreshes); - } - - HRESULT DwmSetPresentParameters(DWM_PRESENT_PARAMETERS* pPresentParams) - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmSetPresentParameters(pT->m_hWnd, pPresentParams); - } - - HRESULT DwmSetWindowAttribute(DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute) - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmSetWindowAttribute(pT->m_hWnd, dwAttribute, pvAttribute, cbAttribute); - } - - HRESULT DwmAttachMilContent() - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmAttachMilContent(pT->m_hWnd); - } - - HRESULT DwmDetachMilContent() - { - if(!IsDwmSupported()) return E_NOTIMPL; - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DwmDetachMilContent(pT->m_hWnd); - } -}; - -template -class CDwmWindowT : public TBase, public CDwmImpl > -{ -public: - CDwmWindowT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CDwmWindowT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } -}; - -typedef CDwmWindowT CDwmWindow; - - -/////////////////////////////////////////////////////////////////////////////// -// CDwmThumbnail - provides DWM thumbnail support - -template -class CDwmThumbnailT : public TBase -{ -public: -// Data members - HTHUMBNAIL m_hThumbnail; - -// Constructor - CDwmThumbnailT(HTHUMBNAIL hThumbnail = NULL) : m_hThumbnail(hThumbnail) - { - } - - ~CDwmThumbnailT() - { - if(t_bManaged && m_hThumbnail != NULL) - Unregister(); - } - -// Operations - CDwmThumbnailT& operator =(HTHUMBNAIL hThumbnail) - { - Attach(hThumbnail); - return *this; - } - - void Attach(HTHUMBNAIL hThumbnailNew) - { - if(t_bManaged && m_hThumbnail != NULL && m_hThumbnail != hThumbnailNew) - Unregister(); - m_hThumbnail = hThumbnailNew; - } - - HTHUMBNAIL Detach() - { - HTHUMBNAIL hThumbnail = m_hThumbnail; - m_hThumbnail = NULL; - return hThumbnail; - } - - HRESULT Register(HWND hwndDestination, HWND hwndSource) - { - ATLASSERT(::IsWindow(hwndDestination)); - ATLASSERT(::IsWindow(hwndSource)); - ATLASSERT(m_hThumbnail==NULL); - if(!IsDwmSupported()) return E_NOTIMPL; - return ::DwmRegisterThumbnail(hwndDestination, hwndSource, &m_hThumbnail); - } - - HRESULT Unregister() - { - if(!IsDwmSupported()) return E_NOTIMPL; - if(m_hThumbnail == NULL) return S_FALSE; - HRESULT Hr = ::DwmUnregisterThumbnail(m_hThumbnail); - if(SUCCEEDED(Hr)) m_hThumbnail = NULL; - return Hr; - } - - operator HTHUMBNAIL() const { return m_hThumbnail; } - - bool IsNull() const { return (m_hThumbnail == NULL); } - - HRESULT UpdateProperties(const DWM_THUMBNAIL_PROPERTIES* ptnProperties) - { - if(!IsDwmSupported()) return E_NOTIMPL; - ATLASSERT(m_hThumbnail != NULL); - return ::DwmUpdateThumbnailProperties(m_hThumbnail, ptnProperties); - } - -// Attributes - HRESULT QuerySourceSize(PSIZE pSize) - { - if(!IsDwmSupported()) return E_NOTIMPL; - ATLASSERT(m_hThumbnail != NULL); - return ::DwmQueryThumbnailSourceSize(m_hThumbnail, pSize); - } -}; - -typedef CDwmThumbnailT CDwmThumbnail; -typedef CDwmThumbnailT CDwmThumbnailHandle; - - -#ifdef __ATLTHEME_H__ - -/////////////////////////////////////////////////////////////////////////////// -// CAeroControlImpl - Base class for controls on Glass - -template -class CAeroControlImpl : - public CThemeImpl, - public CBufferedPaintImpl, - public ATL::CWindowImpl -{ -public: - typedef CThemeImpl _themeClass; - typedef CBufferedPaintImpl _baseClass; - typedef ATL::CWindowImpl _windowClass; - - CAeroControlImpl() - { - m_PaintParams.dwFlags = BPPF_ERASE; - } - - static LPCWSTR GetThemeName() - { -#ifdef _UNICODE - return TBase::GetWndClassName(); -#else - ATLASSERT(!_T("Return UNICODE string of window classname / theme class")); - return NULL; -#endif // _UNICODE - } - -// Message map and handlers - BEGIN_MSG_MAP(CAeroControlImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) - CHAIN_MSG_MAP(_themeClass) - CHAIN_MSG_MAP(_baseClass) - END_MSG_MAP() - - LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->Init(); - bHandled = FALSE; - return 0; - } - - LRESULT OnActivate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(IsThemingSupported()) Invalidate(FALSE); - bHandled = FALSE; - return 0; - } - -// Operations - BOOL SubclassWindow(HWND hWnd) - { - ATLASSERT(m_hWnd == NULL); - ATLASSERT(::IsWindow(hWnd)); - BOOL bRet = _windowClass::SubclassWindow(hWnd); - if(bRet) { - T* pT = static_cast(this); - pT->Init(); - } - return bRet; - } - -// Implementation - LRESULT DefWindowProc() - { - const _ATL_MSG* pMsg = m_pCurrentMsg; - LRESULT lRes = 0; - if(pMsg != NULL) - lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam); - return lRes; - } - - LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) - { - T* pT = static_cast(this); - LRESULT lRes = 0; - if( ::DwmDefWindowProc(pT->m_hWnd, uMsg, wParam, lParam, &lRes) ) return lRes; - return _windowClass::DefWindowProc(uMsg, wParam, lParam); - } - - void DoBufferedPaint(HDC hDC, RECT& rcPaint) - { - T* pT = static_cast(this); - HDC hDCPaint = NULL; - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - m_BufferedPaint.Begin(hDC, &rcClient, m_dwFormat, &m_PaintParams, &hDCPaint); - ATLASSERT(hDCPaint != NULL); - pT->DoAeroPaint(hDCPaint, rcClient, rcPaint); - m_BufferedPaint.End(); - } - - void DoPaint(HDC /*hdc*/, RECT& /*rcClient*/) - { - DefWindowProc(); - } - -// Overridables - void Init() - { - T* pT = static_cast(this); - SetThemeClassList(pT->GetThemeName()); - if(m_lpstrThemeClassList != NULL) - OpenThemeData(); - } - - void DoAeroPaint(HDC hDC, RECT& /*rcClient*/, RECT& rcPaint) - { - DefWindowProc(WM_PAINT, (WPARAM) hDC, 0L); - m_BufferedPaint.MakeOpaque(&rcPaint); - } -}; - -#endif // __ATLTHEME_H__ - - -}; // namespace WTL - - -#endif // __ATLDWM_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlfind.h b/plugins/SmartAutoReplier/wtl/atlfind.h deleted file mode 100644 index 832aba204e..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlfind.h +++ /dev/null @@ -1,1032 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLFIND_H__ -#define __ATLFIND_H__ - -#pragma once - -#ifdef _WIN32_WCE - #error atlfind.h is not supported on Windows CE -#endif - -#ifndef __ATLCTRLS_H__ - #error atlfind.h requires atlctrls.h to be included first -#endif - -#ifndef __ATLDLGS_H__ - #error atlfind.h requires atldlgs.h to be included first -#endif - -#if !((defined(__ATLMISC_H__) && defined(_WTL_USE_CSTRING)) || defined(__ATLSTR_H__)) - #error atlfind.h requires CString (either from ATL's atlstr.h or WTL's atlmisc.h with _WTL_USE_CSTRING) -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CEditFindReplaceImplBase -// CEditFindReplaceImpl -// CRichEditFindReplaceImpl - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CEditFindReplaceImplBase - Base class for mixin classes that -// help implement Find/Replace for CEdit or CRichEditCtrl based window classes. - -template -class CEditFindReplaceImplBase -{ -protected: -// Typedefs - typedef CEditFindReplaceImplBase thisClass; - -// Data members - TFindReplaceDialog* m_pFindReplaceDialog; - _CSTRING_NS::CString m_sFindNext, m_sReplaceWith; - BOOL m_bFindOnly, m_bFirstSearch, m_bMatchCase, m_bWholeWord, m_bFindDown; - LONG m_nInitialSearchPos; - HCURSOR m_hOldCursor; - -// Enumerations - enum TranslationTextItem - { - eText_OnReplaceAllMessage = 0, - eText_OnReplaceAllTitle = 1, - eText_OnTextNotFoundMessage = 2, - eText_OnTextNotFoundTitle = 3 - }; - -public: -// Constructors - CEditFindReplaceImplBase() : - m_pFindReplaceDialog(NULL), - m_bFindOnly(TRUE), - m_bFirstSearch(TRUE), - m_bMatchCase(FALSE), - m_bWholeWord(FALSE), - m_bFindDown(TRUE), - m_nInitialSearchPos(0), - m_hOldCursor(NULL) - { - } - -// Message Handlers - BEGIN_MSG_MAP(thisClass) - ALT_MSG_MAP(1) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_HANDLER(TFindReplaceDialog::GetFindReplaceMsg(), OnFindReplaceCmd) - COMMAND_ID_HANDLER(ID_EDIT_FIND, OnEditFind) - COMMAND_ID_HANDLER(ID_EDIT_REPEAT, OnEditRepeat) - COMMAND_ID_HANDLER(ID_EDIT_REPLACE, OnEditReplace) - END_MSG_MAP() - - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_pFindReplaceDialog != NULL) - { - m_pFindReplaceDialog->SendMessage(WM_CLOSE); - ATLASSERT(m_pFindReplaceDialog == NULL); - } - - bHandled = FALSE; - return 0; - } - - LRESULT OnFindReplaceCmd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - - TFindReplaceDialog* pDialog = TFindReplaceDialog::GetNotifier(lParam); - if(pDialog == NULL) - { - ATLASSERT(FALSE); - ::MessageBeep(MB_ICONERROR); - return 1; - } - ATLASSERT(pDialog == m_pFindReplaceDialog); - - LPFINDREPLACE findReplace = (LPFINDREPLACE)lParam; - if((m_pFindReplaceDialog != NULL) && (findReplace != NULL)) - { - if(pDialog->FindNext()) - { - pT->OnFindNext(pDialog->GetFindString(), pDialog->SearchDown(), - pDialog->MatchCase(), pDialog->MatchWholeWord()); - } - else if(pDialog->ReplaceCurrent()) - { - pT->OnReplaceSel(pDialog->GetFindString(), - pDialog->SearchDown(), pDialog->MatchCase(), pDialog->MatchWholeWord(), - pDialog->GetReplaceString()); - } - else if(pDialog->ReplaceAll()) - { - pT->OnReplaceAll(pDialog->GetFindString(), pDialog->GetReplaceString(), - pDialog->MatchCase(), pDialog->MatchWholeWord()); - } - else if(pDialog->IsTerminating()) - { - // Dialog is going away (but hasn't gone away yet) - // OnFinalMessage will "delete this" - pT->OnTerminatingFindReplaceDialog(m_pFindReplaceDialog); - m_pFindReplaceDialog = NULL; - } - } - - return 0; - } - - LRESULT OnEditFind(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->FindReplace(TRUE); - - return 0; - } - - LRESULT OnEditRepeat(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - - // If the user is holding down SHIFT when hitting F3, we'll - // search in reverse. Otherwise, we'll search forward. - // (be sure to have an accelerator mapped to ID_EDIT_REPEAT - // for both F3 and Shift+F3) - m_bFindDown = !((::GetKeyState(VK_SHIFT) & 0x8000) == 0x8000); - - if(m_sFindNext.IsEmpty()) - { - pT->FindReplace(TRUE); - } - else - { - if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)) - pT->TextNotFound(m_sFindNext); - } - - return 0; - } - - LRESULT OnEditReplace(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& bHandled) - { - T* pT = static_cast(this); - - DWORD style = pT->GetStyle(); - if((style & ES_READONLY) != ES_READONLY) - { - pT->FindReplace(FALSE); - } - else - { - // Don't allow replace when the edit control is read only - bHandled = FALSE; - } - - return 0; - } - -// Operations (overrideable) - TFindReplaceDialog* CreateFindReplaceDialog(BOOL bFindOnly, // TRUE for Find, FALSE for FindReplace - LPCTSTR lpszFindWhat, - LPCTSTR lpszReplaceWith = NULL, - DWORD dwFlags = FR_DOWN, - HWND hWndParent = NULL) - { - // You can override all of this in a derived class - - TFindReplaceDialog* findReplaceDialog = new TFindReplaceDialog(); - if(findReplaceDialog == NULL) - { - ::MessageBeep(MB_ICONHAND); - } - else - { - HWND hWndFindReplace = findReplaceDialog->Create(bFindOnly, - lpszFindWhat, lpszReplaceWith, dwFlags, hWndParent); - if(hWndFindReplace == NULL) - { - delete findReplaceDialog; - findReplaceDialog = NULL; - } - else - { - findReplaceDialog->SetActiveWindow(); - findReplaceDialog->ShowWindow(SW_SHOW); - } - } - - return findReplaceDialog; - } - - void AdjustDialogPosition(HWND hWndDialog) - { - ATLASSERT((hWndDialog != NULL) && ::IsWindow(hWndDialog)); - - T* pT = static_cast(this); - LONG nStartChar = 0, nEndChar = 0; - // Send EM_GETSEL so we can use both Edit and RichEdit - // (CEdit::GetSel uses int&, and CRichEditCtrlT::GetSel uses LONG&) - ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); - POINT point = pT->PosFromChar(nStartChar); - ::ClientToScreen(pT->GetParent(), &point); - CRect rect; - ::GetWindowRect(hWndDialog, &rect); - if(rect.PtInRect(point)) - { - if(point.y > rect.Height()) - { - rect.OffsetRect(0, point.y - rect.bottom - 20); - } - else - { - int nVertExt = GetSystemMetrics(SM_CYSCREEN); - if(point.y + rect.Height() < nVertExt) - rect.OffsetRect(0, 40 + point.y - rect.top); - } - - ::MoveWindow(hWndDialog, rect.left, rect.top, rect.Width(), rect.Height(), TRUE); - } - } - - DWORD GetFindReplaceDialogFlags(void) const - { - DWORD dwFlags = 0; - - if(m_bFindDown) - dwFlags |= FR_DOWN; - if(m_bMatchCase) - dwFlags |= FR_MATCHCASE; - if(m_bWholeWord) - dwFlags |= FR_WHOLEWORD; - - return dwFlags; - } - - void FindReplace(BOOL bFindOnly) - { - T* pT = static_cast(this); - m_bFirstSearch = TRUE; - if(m_pFindReplaceDialog != NULL) - { - if(m_bFindOnly == bFindOnly) - { - m_pFindReplaceDialog->SetActiveWindow(); - m_pFindReplaceDialog->ShowWindow(SW_SHOW); - return; - } - else - { - m_pFindReplaceDialog->SendMessage(WM_CLOSE); - ATLASSERT(m_pFindReplaceDialog == NULL); - } - } - - ATLASSERT(m_pFindReplaceDialog == NULL); - - _CSTRING_NS::CString findNext; - pT->GetSelText(findNext); - // if selection is empty or spans multiple lines use old find text - if(findNext.IsEmpty() || (findNext.FindOneOf(_T("\n\r")) != -1)) - findNext = m_sFindNext; - _CSTRING_NS::CString replaceWith = m_sReplaceWith; - DWORD dwFlags = pT->GetFindReplaceDialogFlags(); - - m_pFindReplaceDialog = pT->CreateFindReplaceDialog(bFindOnly, - findNext, replaceWith, dwFlags, pT->operator HWND()); - ATLASSERT(m_pFindReplaceDialog != NULL); - if(m_pFindReplaceDialog != NULL) - m_bFindOnly = bFindOnly; - } - - BOOL SameAsSelected(LPCTSTR lpszCompare, BOOL bMatchCase, BOOL /*bWholeWord*/) - { - T* pT = static_cast(this); - - // check length first - size_t nLen = lstrlen(lpszCompare); - LONG nStartChar = 0, nEndChar = 0; - // Send EM_GETSEL so we can use both Edit and RichEdit - // (CEdit::GetSel uses int&, and CRichEditCtrlT::GetSel uses LONG&) - ::SendMessage(pT->m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); - if(nLen != (size_t)(nEndChar - nStartChar)) - return FALSE; - - // length is the same, check contents - _CSTRING_NS::CString selectedText; - pT->GetSelText(selectedText); - - return (bMatchCase && selectedText.Compare(lpszCompare) == 0) || - (!bMatchCase && selectedText.CompareNoCase(lpszCompare) == 0); - } - - void TextNotFound(LPCTSTR lpszFind) - { - T* pT = static_cast(this); - m_bFirstSearch = TRUE; - pT->OnTextNotFound(lpszFind); - } - - _CSTRING_NS::CString GetTranslationText(enum TranslationTextItem eItem) const - { - _CSTRING_NS::CString text; - switch(eItem) - { - case eText_OnReplaceAllMessage: - text = _T("Replaced %d occurances of \"%s\" with \"%s\""); - break; - case eText_OnReplaceAllTitle: - text = _T("Replace All"); - break; - case eText_OnTextNotFoundMessage: - text = _T("Unable to find the text \"%s\""); - break; - case eText_OnTextNotFoundTitle: - text = _T("Text not found"); - break; - } - - return text; - } - -// Overrideable Handlers - void OnFindNext(LPCTSTR lpszFind, BOOL bFindDown, BOOL bMatchCase, BOOL bWholeWord) - { - T* pT = static_cast(this); - - m_sFindNext = lpszFind; - m_bMatchCase = bMatchCase; - m_bWholeWord = bWholeWord; - m_bFindDown = bFindDown; - - if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)) - pT->TextNotFound(m_sFindNext); - else - pT->AdjustDialogPosition(m_pFindReplaceDialog->operator HWND()); - } - - void OnReplaceSel(LPCTSTR lpszFind, BOOL bFindDown, BOOL bMatchCase, BOOL bWholeWord, LPCTSTR lpszReplace) - { - T* pT = static_cast(this); - - m_sFindNext = lpszFind; - m_sReplaceWith = lpszReplace; - m_bMatchCase = bMatchCase; - m_bWholeWord = bWholeWord; - m_bFindDown = bFindDown; - - if(pT->SameAsSelected(m_sFindNext, m_bMatchCase, m_bWholeWord)) - pT->ReplaceSel(m_sReplaceWith); - - if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)) - pT->TextNotFound(m_sFindNext); - else - pT->AdjustDialogPosition(m_pFindReplaceDialog->operator HWND()); - } - - void OnReplaceAll(LPCTSTR lpszFind, LPCTSTR lpszReplace, BOOL bMatchCase, BOOL bWholeWord) - { - T* pT = static_cast(this); - - m_sFindNext = lpszFind; - m_sReplaceWith = lpszReplace; - m_bMatchCase = bMatchCase; - m_bWholeWord = bWholeWord; - m_bFindDown = TRUE; - - // no selection or different than what looking for - if(!pT->SameAsSelected(m_sFindNext, m_bMatchCase, m_bWholeWord)) - { - if(!pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)) - { - pT->TextNotFound(m_sFindNext); - return; - } - } - - pT->OnReplaceAllCoreBegin(); - - int replaceCount=0; - do - { - ++replaceCount; - pT->ReplaceSel(m_sReplaceWith); - } while(pT->FindTextSimple(m_sFindNext, m_bMatchCase, m_bWholeWord, m_bFindDown)); - - pT->OnReplaceAllCoreEnd(replaceCount); - } - - void OnReplaceAllCoreBegin() - { - T* pT = static_cast(this); - - m_hOldCursor = ::SetCursor(::LoadCursor(NULL, IDC_WAIT)); - - pT->HideSelection(TRUE, FALSE); - - } - - void OnReplaceAllCoreEnd(int replaceCount) - { - T* pT = static_cast(this); - pT->HideSelection(FALSE, FALSE); - - ::SetCursor(m_hOldCursor); - - _CSTRING_NS::CString message = pT->GetTranslationText(eText_OnReplaceAllMessage); - if(message.GetLength() > 0) - { - _CSTRING_NS::CString formattedMessage; - formattedMessage.Format(message, - replaceCount, m_sFindNext, m_sReplaceWith); - if(m_pFindReplaceDialog != NULL) - { - m_pFindReplaceDialog->MessageBox(formattedMessage, - pT->GetTranslationText(eText_OnReplaceAllTitle), - MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); - } - else - { - pT->MessageBox(formattedMessage, - pT->GetTranslationText(eText_OnReplaceAllTitle), - MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); - } - } - } - - void OnTextNotFound(LPCTSTR lpszFind) - { - T* pT = static_cast(this); - _CSTRING_NS::CString message = pT->GetTranslationText(eText_OnTextNotFoundMessage); - if(message.GetLength() > 0) - { - _CSTRING_NS::CString formattedMessage; - formattedMessage.Format(message, lpszFind); - if(m_pFindReplaceDialog != NULL) - { - m_pFindReplaceDialog->MessageBox(formattedMessage, - pT->GetTranslationText(eText_OnTextNotFoundTitle), - MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); - } - else - { - pT->MessageBox(formattedMessage, - pT->GetTranslationText(eText_OnTextNotFoundTitle), - MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); - } - } - else - { - ::MessageBeep(MB_ICONHAND); - } - } - - void OnTerminatingFindReplaceDialog(TFindReplaceDialog*& /*findReplaceDialog*/) - { - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CEditFindReplaceImpl - Mixin class for implementing Find/Replace for CEdit -// based window classes. - -// Chain to CEditFindReplaceImpl message map. Your class must also derive from CEdit. -// Example: -// class CMyEdit : public CWindowImpl, -// public CEditFindReplaceImpl -// { -// public: -// BEGIN_MSG_MAP(CMyEdit) -// // your handlers... -// CHAIN_MSG_MAP_ALT(CEditFindReplaceImpl, 1) -// END_MSG_MAP() -// // other stuff... -// }; - -template -class CEditFindReplaceImpl : public CEditFindReplaceImplBase -{ -protected: - typedef CEditFindReplaceImpl thisClass; - typedef CEditFindReplaceImplBase baseClass; - -// Data members - LPTSTR m_pShadowBuffer; // Special shadow buffer only used in some cases. - UINT m_nShadowSize; - int m_bShadowBufferNeeded; // TRUE, FALSE, < 0 => Need to check - -public: -// Constructors - CEditFindReplaceImpl() : - m_pShadowBuffer(NULL), - m_nShadowSize(0), - m_bShadowBufferNeeded(-1) - { - } - - virtual ~CEditFindReplaceImpl() - { - if(m_pShadowBuffer != NULL) - { - delete [] m_pShadowBuffer; - m_pShadowBuffer = NULL; - } - } - -// Message Handlers - BEGIN_MSG_MAP(thisClass) - ALT_MSG_MAP(1) - CHAIN_MSG_MAP_ALT(baseClass, 1) - END_MSG_MAP() - -// Operations - // Supported only for RichEdit, so this does nothing for Edit - void HideSelection(BOOL /*bHide*/ = TRUE, BOOL /*bChangeStyle*/ = FALSE) - { - } - -// Operations (overrideable) - BOOL FindTextSimple(LPCTSTR lpszFind, BOOL bMatchCase, BOOL bWholeWord, BOOL bFindDown = TRUE) - { - T* pT = static_cast(this); - - ATLASSERT(lpszFind != NULL); - ATLASSERT(*lpszFind != _T('\0')); - - UINT nLen = pT->GetBufferLength(); - int nStartChar = 0, nEndChar = 0; - pT->GetSel(nStartChar, nEndChar); - UINT nStart = nStartChar; - int iDir = bFindDown ? +1 : -1; - - // can't find a match before the first character - if(nStart == 0 && iDir < 0) - return FALSE; - - LPCTSTR lpszText = pT->LockBuffer(); - - bool isDBCS = false; -#ifdef _MBCS - CPINFO info = { 0 }; - ::GetCPInfo(::GetOEMCP(), &info); - isDBCS = (info.MaxCharSize > 1); -#endif - - if(iDir < 0) - { - // always go back one for search backwards - nStart -= int((lpszText + nStart) - ::CharPrev(lpszText, lpszText + nStart)); - } - else if(nStartChar != nEndChar && pT->SameAsSelected(lpszFind, bMatchCase, bWholeWord)) - { - // easy to go backward/forward with SBCS -#ifndef _UNICODE - if(::IsDBCSLeadByte(lpszText[nStart])) - nStart++; -#endif - nStart += iDir; - } - - // handle search with nStart past end of buffer - UINT nLenFind = ::lstrlen(lpszFind); - if(nStart + nLenFind - 1 >= nLen) - { - if(iDir < 0 && nLen >= nLenFind) - { - if(isDBCS) - { - // walk back to previous character n times - nStart = nLen; - int n = nLenFind; - while(n--) - { - nStart -= int((lpszText + nStart) - ::CharPrev(lpszText, lpszText + nStart)); - } - } - else - { - // single-byte character set is easy and fast - nStart = nLen - nLenFind; - } - ATLASSERT(nStart + nLenFind - 1 <= nLen); - } - else - { - pT->UnlockBuffer(); - return FALSE; - } - } - - // start the search at nStart - LPCTSTR lpsz = lpszText + nStart; - typedef int (WINAPI* CompareProc)(LPCTSTR str1, LPCTSTR str2); - CompareProc pfnCompare = bMatchCase ? lstrcmp : lstrcmpi; - - if(isDBCS) - { - // double-byte string search - LPCTSTR lpszStop = NULL; - if(iDir > 0) - { - // start at current and find _first_ occurrance - lpszStop = lpszText + nLen - nLenFind + 1; - } - else - { - // start at top and find _last_ occurrance - lpszStop = lpsz; - lpsz = lpszText; - } - - LPCTSTR lpszFound = NULL; - while(lpsz <= lpszStop) - { -#ifndef _UNICODE - if(!bMatchCase || (*lpsz == *lpszFind && (!::IsDBCSLeadByte(*lpsz) || lpsz[1] == lpszFind[1]))) -#else - if(!bMatchCase || (*lpsz == *lpszFind && lpsz[1] == lpszFind[1])) -#endif - { - LPTSTR lpch = (LPTSTR)(lpsz + nLenFind); - TCHAR chSave = *lpch; - *lpch = _T('\0'); - int nResult = (*pfnCompare)(lpsz, lpszFind); - *lpch = chSave; - if(nResult == 0) - { - lpszFound = lpsz; - if(iDir > 0) - break; - } - } - lpsz = ::CharNext(lpsz); - } - pT->UnlockBuffer(); - - if(lpszFound != NULL) - { - int n = (int)(lpszFound - lpszText); - pT->SetSel(n, n + nLenFind); - return TRUE; - } - } - else - { - // single-byte string search - UINT nCompare; - if(iDir < 0) - nCompare = (UINT)(lpsz - lpszText) + 1; - else - nCompare = nLen - (UINT)(lpsz - lpszText) - nLenFind + 1; - - while(nCompare > 0) - { - ATLASSERT(lpsz >= lpszText); - ATLASSERT(lpsz + nLenFind - 1 <= lpszText + nLen - 1); - - LPSTR lpch = (LPSTR)(lpsz + nLenFind); - char chSave = *lpch; - *lpch = '\0'; - int nResult = (*pfnCompare)(lpsz, lpszFind); - *lpch = chSave; - if(nResult == 0) - { - pT->UnlockBuffer(); - int n = (int)(lpsz - lpszText); - pT->SetSel(n, n + nLenFind); - return TRUE; - } - - // restore character at end of search - *lpch = chSave; - - // move on to next substring - nCompare--; - lpsz += iDir; - } - pT->UnlockBuffer(); - } - - return FALSE; - } - - LPCTSTR LockBuffer() const - { - const T* pT = static_cast(this); - - ATLASSERT(pT->m_hWnd != NULL); - - BOOL useShadowBuffer = pT->UseShadowBuffer(); - if(useShadowBuffer) - { - if(m_pShadowBuffer == NULL || pT->GetModify()) - { - ATLASSERT(m_pShadowBuffer != NULL || m_nShadowSize == 0); - UINT nSize = pT->GetWindowTextLength() + 1; - if(nSize > m_nShadowSize) - { - // need more room for shadow buffer - T* pThisNoConst = const_cast(pT); - delete[] m_pShadowBuffer; - pThisNoConst->m_pShadowBuffer = NULL; - pThisNoConst->m_nShadowSize = 0; - pThisNoConst->m_pShadowBuffer = new TCHAR[nSize]; - pThisNoConst->m_nShadowSize = nSize; - } - - // update the shadow buffer with GetWindowText - ATLASSERT(m_nShadowSize >= nSize); - ATLASSERT(m_pShadowBuffer != NULL); - pT->GetWindowText(m_pShadowBuffer, nSize); - } - - return m_pShadowBuffer; - } - - HLOCAL hLocal = pT->GetHandle(); - ATLASSERT(hLocal != NULL); - LPCTSTR lpszText = (LPCTSTR)::LocalLock(hLocal); - ATLASSERT(lpszText != NULL); - - return lpszText; - } - - void UnlockBuffer() const - { - const T* pT = static_cast(this); - - ATLASSERT(pT->m_hWnd != NULL); - - BOOL useShadowBuffer = pT->UseShadowBuffer(); - if(!useShadowBuffer) - { - HLOCAL hLocal = pT->GetHandle(); - ATLASSERT(hLocal != NULL); - ::LocalUnlock(hLocal); - } - } - - UINT GetBufferLength() const - { - const T* pT = static_cast(this); - - ATLASSERT(pT->m_hWnd != NULL); - UINT nLen = 0; - LPCTSTR lpszText = pT->LockBuffer(); - if(lpszText != NULL) - nLen = ::lstrlen(lpszText); - pT->UnlockBuffer(); - - return nLen; - } - - LONG EndOfLine(LPCTSTR lpszText, UINT nLen, UINT nIndex) const - { - LPCTSTR lpsz = lpszText + nIndex; - LPCTSTR lpszStop = lpszText + nLen; - while(lpsz < lpszStop && *lpsz != _T('\r')) - ++lpsz; - return LONG(lpsz - lpszText); - } - - LONG GetSelText(_CSTRING_NS::CString& strText) const - { - const T* pT = static_cast(this); - - int nStartChar = 0, nEndChar = 0; - pT->GetSel(nStartChar, nEndChar); - ATLASSERT((UINT)nEndChar <= pT->GetBufferLength()); - LPCTSTR lpszText = pT->LockBuffer(); - LONG nLen = pT->EndOfLine(lpszText, nEndChar, nStartChar) - nStartChar; - SecureHelper::memcpy_x(strText.GetBuffer(nLen), nLen * sizeof(TCHAR), lpszText + nStartChar, nLen * sizeof(TCHAR)); - strText.ReleaseBuffer(nLen); - pT->UnlockBuffer(); - - return nLen; - } - - BOOL UseShadowBuffer(void) const - { - const T* pT = static_cast(this); - - if(pT->m_bShadowBufferNeeded < 0) - { - T* pThisNoConst = const_cast(pT); - - OSVERSIONINFO ovi = { 0 }; - ovi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); - ::GetVersionEx(&ovi); - - bool bWin9x = (ovi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS); - if(bWin9x) - { - // Windows 95, 98, ME - // Under Win9x, it is necessary to maintain a shadow buffer. - // It is only updated when the control contents have been changed. - pThisNoConst->m_bShadowBufferNeeded = TRUE; - } - else - { - // Windows NT, 2000, XP, etc. - pThisNoConst->m_bShadowBufferNeeded = FALSE; - -#ifndef _UNICODE - // On Windows XP (or later), if common controls version 6 is in use - // (such as via theming), then EM_GETHANDLE will always return a UNICODE string. - // If theming is enabled and Common Controls version 6 is in use, - // you're really not suppose to superclass or subclass common controls - // with an ANSI windows procedure (so its best to only theme if you use UNICODE). - // Using a shadow buffer uses GetWindowText instead, so it solves - // this problem for us (although it makes it a little less efficient). - - if((ovi.dwMajorVersion == 5 && ovi.dwMinorVersion >= 1) || (ovi.dwMajorVersion > 5)) - { - // We use DLLVERSIONINFO_private so we don't have to depend on shlwapi.h - typedef struct _DLLVERSIONINFO_private - { - DWORD cbSize; - DWORD dwMajorVersion; - DWORD dwMinorVersion; - DWORD dwBuildNumber; - DWORD dwPlatformID; - } DLLVERSIONINFO_private; - - HMODULE hModule = ::LoadLibrary("comctl32.dll"); - if(hModule != NULL) - { - typedef HRESULT (CALLBACK *LPFN_DllGetVersion)(DLLVERSIONINFO_private *); - LPFN_DllGetVersion fnDllGetVersion = (LPFN_DllGetVersion)::GetProcAddress(hModule, "DllGetVersion"); - if(fnDllGetVersion != NULL) - { - DLLVERSIONINFO_private version = { 0 }; - version.cbSize = sizeof(DLLVERSIONINFO_private); - if(SUCCEEDED(fnDllGetVersion(&version))) - { - if(version.dwMajorVersion >= 6) - { - pThisNoConst->m_bShadowBufferNeeded = TRUE; - - ATLTRACE2(atlTraceUI, 0, _T("Warning: You have compiled for MBCS/ANSI but are using common controls version 6 or later (likely through a manifest file).\r\n")); - ATLTRACE2(atlTraceUI, 0, _T("If you use common controls version 6 or later, you should only do so for UNICODE builds.\r\n")); - } - } - } - - ::FreeLibrary(hModule); - hModule = NULL; - } - } -#endif // !_UNICODE - } - } - - return (pT->m_bShadowBufferNeeded != FALSE); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CRichEditFindReplaceImpl - Mixin class for implementing Find/Replace for CRichEditCtrl -// based window classes. - -// Chain to CRichEditFindReplaceImpl message map. Your class must also derive from CRichEditCtrl. -// Example: -// class CMyRichEdit : public CWindowImpl, -// public CRichEditFindReplaceImpl -// { -// public: -// BEGIN_MSG_MAP(CMyRichEdit) -// // your handlers... -// CHAIN_MSG_MAP_ALT(CRichEditFindReplaceImpl, 1) -// END_MSG_MAP() -// // other stuff... -// }; - -template -class CRichEditFindReplaceImpl : public CEditFindReplaceImplBase -{ -protected: - typedef CRichEditFindReplaceImpl thisClass; - typedef CEditFindReplaceImplBase baseClass; - -public: - BEGIN_MSG_MAP(thisClass) - ALT_MSG_MAP(1) - CHAIN_MSG_MAP_ALT(baseClass, 1) - END_MSG_MAP() - -// Operations (overrideable) - BOOL FindTextSimple(LPCTSTR lpszFind, BOOL bMatchCase, BOOL bWholeWord, BOOL bFindDown = TRUE) - { - T* pT = static_cast(this); - - ATLASSERT(lpszFind != NULL); - FINDTEXTEX ft = { 0 }; - - pT->GetSel(ft.chrg); - if(m_bFirstSearch) - { - if(bFindDown) - m_nInitialSearchPos = ft.chrg.cpMin; - else - m_nInitialSearchPos = ft.chrg.cpMax; - m_bFirstSearch = FALSE; - } - -#if (_RICHEDIT_VER >= 0x0200) - ft.lpstrText = (LPTSTR)lpszFind; -#else // !(_RICHEDIT_VER >= 0x0200) - USES_CONVERSION; - ft.lpstrText = T2A((LPTSTR)lpszFind); -#endif // !(_RICHEDIT_VER >= 0x0200) - - if(ft.chrg.cpMin != ft.chrg.cpMax) // i.e. there is a selection - { - if(bFindDown) - { - ft.chrg.cpMin++; - } - else - { - // won't wraparound backwards - ft.chrg.cpMin = max(ft.chrg.cpMin, 0); - } - } - - DWORD dwFlags = bMatchCase ? FR_MATCHCASE : 0; - dwFlags |= bWholeWord ? FR_WHOLEWORD : 0; - - ft.chrg.cpMax = pT->GetTextLength() + m_nInitialSearchPos; - - if(bFindDown) - { - if(m_nInitialSearchPos >= 0) - ft.chrg.cpMax = pT->GetTextLength(); - - dwFlags |= FR_DOWN; - ATLASSERT(ft.chrg.cpMax >= ft.chrg.cpMin); - } - else - { - if(m_nInitialSearchPos >= 0) - ft.chrg.cpMax = 0; - - dwFlags &= ~FR_DOWN; - ATLASSERT(ft.chrg.cpMax <= ft.chrg.cpMin); - } - - BOOL bRet = FALSE; - - if(pT->FindAndSelect(dwFlags, ft) != -1) - { - bRet = TRUE; // we found the text - } - else if(m_nInitialSearchPos > 0) - { - // if the original starting point was not the beginning - // of the buffer and we haven't already been here - if(bFindDown) - { - ft.chrg.cpMin = 0; - ft.chrg.cpMax = m_nInitialSearchPos; - } - else - { - ft.chrg.cpMin = pT->GetTextLength(); - ft.chrg.cpMax = m_nInitialSearchPos; - } - m_nInitialSearchPos = m_nInitialSearchPos - pT->GetTextLength(); - - bRet = (pT->FindAndSelect(dwFlags, ft) != -1) ? TRUE : FALSE; - } - - return bRet; - } - - long FindAndSelect(DWORD dwFlags, FINDTEXTEX& ft) - { - T* pT = static_cast(this); - LONG index = pT->FindText(dwFlags, ft); - if(index != -1) // i.e. we found something - pT->SetSel(ft.chrgText); - - return index; - } -}; - -}; // namespace WTL - -#endif // __ATLFIND_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlframe.h b/plugins/SmartAutoReplier/wtl/atlframe.h deleted file mode 100644 index 252e50e902..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlframe.h +++ /dev/null @@ -1,3688 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLFRAME_H__ -#define __ATLFRAME_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlframe.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atlframe.h requires atlwin.h to be included first -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CFrameWindowImpl -// CMDIWindow -// CMDIFrameWindowImpl -// CMDIChildWindowImpl -// COwnerDraw -// CUpdateUIBase -// CUpdateUI -// CDynamicUpdateUI -// CAutoUpdateUI -// CDialogResize -// CDoubleBufferImpl -// CDoubleBufferWindowImpl -// -// Global functions: -// AtlCreateSimpleToolBar() - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CFrameWndClassInfo - Manages frame window Windows class information - -class CFrameWndClassInfo -{ -public: -#ifndef _WIN32_WCE - enum { cchAutoName = 5 + sizeof(void*) * 2 }; // sizeof(void*) * 2 is the number of digits %p outputs - WNDCLASSEX m_wc; -#else // CE specific - enum { cchAutoName = MAX_PATH }; // MAX_PATH because this can be set in the wizard generated CMainFrame::ActivatePreviousInstance to a user defined string. - WNDCLASS m_wc; -#endif // !_WIN32_WCE - LPCTSTR m_lpszOrigName; - WNDPROC pWndProc; - LPCTSTR m_lpszCursorID; - BOOL m_bSystemCursor; - ATOM m_atom; - TCHAR m_szAutoName[cchAutoName]; - UINT m_uCommonResourceID; - -#ifndef _WIN32_WCE - ATOM Register(WNDPROC* pProc) - { - if (m_atom == 0) - { - CWindowCreateCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n")); - ATLASSERT(FALSE); - return 0; - } - - if(m_atom == 0) - { - HINSTANCE hInst = ModuleHelper::GetModuleInstance(); - - if (m_lpszOrigName != NULL) - { - ATLASSERT(pProc != NULL); - LPCTSTR lpsz = m_wc.lpszClassName; - WNDPROC proc = m_wc.lpfnWndProc; - - WNDCLASSEX wc = { 0 }; - wc.cbSize = sizeof(WNDCLASSEX); - // try process local class first - if(!::GetClassInfoEx(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc)) - { - // try global class - if(!::GetClassInfoEx(NULL, m_lpszOrigName, &wc)) - { - lock.Unlock(); - return 0; - } - } - m_wc = wc; - pWndProc = m_wc.lpfnWndProc; - m_wc.lpszClassName = lpsz; - m_wc.lpfnWndProc = proc; - } - else - { - m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID); - } - - m_wc.hInstance = hInst; - m_wc.style &= ~CS_GLOBALCLASS; // we don't register global classes - if (m_wc.lpszClassName == NULL) - { -#if (_WIN32_WINNT >= 0x0500) || defined(_WIN64) - SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T("ATL:%p"), &m_wc); -#else // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64)) - SecureHelper::wsprintf_x(m_szAutoName, cchAutoName, _T("ATL:%8.8X"), (DWORD_PTR)&m_wc); -#endif // !((_WIN32_WINNT >= 0x0500) || defined(_WIN64)) - m_wc.lpszClassName = m_szAutoName; - } - - WNDCLASSEX wcTemp = m_wc; - m_atom = (ATOM)::GetClassInfoEx(m_wc.hInstance, m_wc.lpszClassName, &wcTemp); - if (m_atom == 0) - { - if(m_uCommonResourceID != 0) // use it if not zero - { - m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); - m_wc.hIconSm = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); - } - m_atom = ::RegisterClassEx(&m_wc); - } - } - - lock.Unlock(); - } - - if (m_lpszOrigName != NULL) - { - ATLASSERT(pProc != NULL); - ATLASSERT(pWndProc != NULL); - *pProc = pWndProc; - } - - return m_atom; - } -#else // CE specific - ATOM Register(WNDPROC* pProc) - { - if (m_atom == 0) - { - CWindowCreateCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CFrameWndClassInfo::Register.\n")); - ATLASSERT(FALSE); - return 0; - } - - if(m_atom == 0) - { - HINSTANCE hInst = ModuleHelper::GetModuleInstance(); - - if (m_lpszOrigName != NULL) - { - ATLASSERT(pProc != NULL); - LPCTSTR lpsz = m_wc.lpszClassName; - WNDPROC proc = m_wc.lpfnWndProc; - - WNDCLASS wc = { 0 }; - // try process local class first - if(!::GetClassInfo(ModuleHelper::GetModuleInstance(), m_lpszOrigName, &wc)) - { - // try global class - if(!::GetClassInfo(NULL, m_lpszOrigName, &wc)) - { - lock.Unlock(); - return 0; - } - } - m_wc = wc; - pWndProc = m_wc.lpfnWndProc; - m_wc.lpszClassName = lpsz; - m_wc.lpfnWndProc = proc; - } - else - { -#if defined(GWES_CURSOR) || defined(GWES_MCURSOR) - m_wc.hCursor = ::LoadCursor(m_bSystemCursor ? NULL : hInst, m_lpszCursorID); -#else // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR)) - m_wc.hCursor = NULL; -#endif // !(defined(GWES_CURSOR) || defined(GWES_MCURSOR)) - } - - m_wc.hInstance = hInst; - m_wc.style &= ~CS_GLOBALCLASS; // we don't register global classes - if (m_wc.lpszClassName == NULL) - { - wsprintf(m_szAutoName, _T("ATL:%8.8X"), (DWORD_PTR)&m_wc); - m_wc.lpszClassName = m_szAutoName; - } - - WNDCLASS wcTemp = m_wc; - m_atom = (ATOM)::GetClassInfo(m_wc.hInstance, m_wc.lpszClassName, &wcTemp); - if (m_atom == 0) - { - if(m_uCommonResourceID != 0) // use it if not zero - m_wc.hIcon = (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(m_uCommonResourceID), IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); - m_atom = ::RegisterClass(&m_wc); - } - } - - lock.Unlock(); - } - - if (m_lpszOrigName != NULL) - { - ATLASSERT(pProc != NULL); - ATLASSERT(pWndProc != NULL); - *pProc = pWndProc; - } - - return m_atom; - } -#endif // _WIN32_WCE -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Macros for declaring frame window WNDCLASS - -#ifndef _WIN32_WCE - -#define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ -static WTL::CFrameWndClassInfo& GetWndClassInfo() \ -{ \ - static WTL::CFrameWndClassInfo wc = \ - { \ - { sizeof(WNDCLASSEX), 0, StartWindowProc, \ - 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName, NULL }, \ - NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ - }; \ - return wc; \ -} - -#define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ -static WTL::CFrameWndClassInfo& GetWndClassInfo() \ -{ \ - static WTL::CFrameWndClassInfo wc = \ - { \ - { sizeof(WNDCLASSEX), style, StartWindowProc, \ - 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName, NULL }, \ - NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ - }; \ - return wc; \ -} - -#define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \ -static WTL::CFrameWndClassInfo& GetWndClassInfo() \ -{ \ - static WTL::CFrameWndClassInfo wc = \ - { \ - { sizeof(WNDCLASSEX), 0, StartWindowProc, \ - 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName, NULL }, \ - OrigWndClassName, NULL, NULL, TRUE, 0, _T(""), uCommonResourceID \ - }; \ - return wc; \ -} - -#else // CE specific - -#define DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ -static WTL::CFrameWndClassInfo& GetWndClassInfo() \ -{ \ - static WTL::CFrameWndClassInfo wc = \ - { \ - { 0, StartWindowProc, \ - 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \ - NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ - }; \ - return wc; \ -} - -#define DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ -static WTL::CFrameWndClassInfo& GetWndClassInfo() \ -{ \ - static WTL::CFrameWndClassInfo wc = \ - { \ - { style, StartWindowProc, \ - 0, 0, NULL, NULL, NULL, (HBRUSH)(bkgnd + 1), NULL, WndClassName }, \ - NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ - }; \ - return wc; \ -} - -#define DECLARE_FRAME_WND_SUPERCLASS(WndClassName, OrigWndClassName, uCommonResourceID) \ -static WTL::CFrameWndClassInfo& GetWndClassInfo() \ -{ \ - static WTL::CFrameWndClassInfo wc = \ - { \ - { NULL, StartWindowProc, \ - 0, 0, NULL, NULL, NULL, NULL, NULL, WndClassName }, \ - OrigWndClassName, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ - }; \ - return wc; \ -} - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CFrameWindowImpl - -// Client window command chaining macro (only for frame windows) -#define CHAIN_CLIENT_COMMANDS() \ - if(uMsg == WM_COMMAND && m_hWndClient != NULL) \ - ::SendMessage(m_hWndClient, uMsg, wParam, lParam); - -// standard toolbar styles -#define ATL_SIMPLE_TOOLBAR_STYLE \ - (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | TBSTYLE_TOOLTIPS) -// toolbar in a rebar pane -#define ATL_SIMPLE_TOOLBAR_PANE_STYLE \ - (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | CCS_NODIVIDER | CCS_NORESIZE | CCS_NOPARENTALIGN | TBSTYLE_TOOLTIPS | TBSTYLE_FLAT) -// standard rebar styles -#if (_WIN32_IE >= 0x0400) - #define ATL_SIMPLE_REBAR_STYLE \ - (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE) -#else - #define ATL_SIMPLE_REBAR_STYLE \ - (WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS) -#endif // !(_WIN32_IE >= 0x0400) -// rebar without borders -#if (_WIN32_IE >= 0x0400) - #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \ - (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | RBS_AUTOSIZE | CCS_NODIVIDER) -#else - #define ATL_SIMPLE_REBAR_NOBORDER_STYLE \ - (WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | RBS_VARHEIGHT | RBS_BANDBORDERS | CCS_NODIVIDER) -#endif // !(_WIN32_IE >= 0x0400) - -// command bar support -#if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) - -#define CBRM_GETCMDBAR (WM_USER + 301) // returns command bar HWND -#define CBRM_GETMENU (WM_USER + 302) // returns loaded or attached menu -#define CBRM_TRACKPOPUPMENU (WM_USER + 303) // displays a popup menu - -struct _AtlFrameWnd_CmdBarPopupMenu -{ - int cbSize; - HMENU hMenu; - UINT uFlags; - int x; - int y; - LPTPMPARAMS lptpm; -}; - -#define CBRPOPUPMENU _AtlFrameWnd_CmdBarPopupMenu - -#endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) - - -template -class ATL_NO_VTABLE CFrameWindowImplBase : public ATL::CWindowImplBaseT< TBase, TWinTraits > -{ -public: - DECLARE_FRAME_WND_CLASS(NULL, 0) - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - struct _ChevronMenuInfo - { - HMENU hMenu; - LPNMREBARCHEVRON lpnm; - bool bCmdBar; - }; -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - -// Data members - HWND m_hWndToolBar; - HWND m_hWndStatusBar; - HWND m_hWndClient; - -#ifdef _WIN32_WCE - HWND m_hWndCECommandBar; -#endif // _WIN32_WCE - - HACCEL m_hAccel; - -// Constructor - CFrameWindowImplBase() : - m_hWndToolBar(NULL), - m_hWndStatusBar(NULL), - m_hWndClient(NULL), -#ifdef _WIN32_WCE - m_hWndCECommandBar(NULL), -#endif // _WIN32_WCE - m_hAccel(NULL) - { } - -// Methods - HWND Create(HWND hWndParent, ATL::_U_RECT rect, LPCTSTR szWindowName, DWORD dwStyle, DWORD dwExStyle, ATL::_U_MENUorID MenuOrID, ATOM atom, LPVOID lpCreateParam) - { - ATLASSERT(m_hWnd == NULL); - - if(atom == 0) - return NULL; - - ModuleHelper::AddCreateWndData(&m_thunk.cd, this); - - if(MenuOrID.m_hMenu == NULL && (dwStyle & WS_CHILD)) - MenuOrID.m_hMenu = (HMENU)(UINT_PTR)this; - if(rect.m_lpRect == NULL) - rect.m_lpRect = &TBase::rcDefault; - - HWND hWnd = ::CreateWindowEx(dwExStyle, MAKEINTATOM(atom), szWindowName, - dwStyle, rect.m_lpRect->left, rect.m_lpRect->top, rect.m_lpRect->right - rect.m_lpRect->left, - rect.m_lpRect->bottom - rect.m_lpRect->top, hWndParent, MenuOrID.m_hMenu, - ModuleHelper::GetModuleInstance(), lpCreateParam); - - ATLASSERT(hWnd == NULL || m_hWnd == hWnd); - - return hWnd; - } - - static HWND CreateSimpleToolBarCtrl(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE, - DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) - { - HINSTANCE hInst = ModuleHelper::GetResourceInstance(); - HRSRC hRsrc = ::FindResource(hInst, MAKEINTRESOURCE(nResourceID), RT_TOOLBAR); - if (hRsrc == NULL) - return NULL; - - HGLOBAL hGlobal = ::LoadResource(hInst, hRsrc); - if (hGlobal == NULL) - return NULL; - - _AtlToolBarData* pData = (_AtlToolBarData*)::LockResource(hGlobal); - if (pData == NULL) - return NULL; - ATLASSERT(pData->wVersion == 1); - - WORD* pItems = pData->items(); - int nItems = pData->wItemCount + (bInitialSeparator ? 1 : 0); - CTempBuffer buff; - TBBUTTON* pTBBtn = buff.Allocate(nItems); - ATLASSERT(pTBBtn != NULL); - if(pTBBtn == NULL) - return NULL; - - const int cxSeparator = 8; - - // set initial separator (half width) - if(bInitialSeparator) - { - pTBBtn[0].iBitmap = cxSeparator / 2; - pTBBtn[0].idCommand = 0; - pTBBtn[0].fsState = 0; - pTBBtn[0].fsStyle = TBSTYLE_SEP; - pTBBtn[0].dwData = 0; - pTBBtn[0].iString = 0; - } - - int nBmp = 0; - for(int i = 0, j = bInitialSeparator ? 1 : 0; i < pData->wItemCount; i++, j++) - { - if(pItems[i] != 0) - { - pTBBtn[j].iBitmap = nBmp++; - pTBBtn[j].idCommand = pItems[i]; - pTBBtn[j].fsState = TBSTATE_ENABLED; - pTBBtn[j].fsStyle = TBSTYLE_BUTTON; - pTBBtn[j].dwData = 0; - pTBBtn[j].iString = 0; - } - else - { - pTBBtn[j].iBitmap = cxSeparator; - pTBBtn[j].idCommand = 0; - pTBBtn[j].fsState = 0; - pTBBtn[j].fsStyle = TBSTYLE_SEP; - pTBBtn[j].dwData = 0; - pTBBtn[j].iString = 0; - } - } - -#ifndef _WIN32_WCE - HWND hWnd = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL); - if(hWnd == NULL) - { - ATLASSERT(FALSE); - return NULL; - } -#else // CE specific - dwStyle; - nID; - // The toolbar must go onto the existing CommandBar or MenuBar - HWND hWnd = hWndParent; -#endif // _WIN32_WCE - - ::SendMessage(hWnd, TB_BUTTONSTRUCTSIZE, sizeof(TBBUTTON), 0L); - - // check if font is taller than our bitmaps - CFontHandle font = (HFONT)::SendMessage(hWnd, WM_GETFONT, 0, 0L); - if(font.IsNull()) - font = (HFONT)::GetStockObject(SYSTEM_FONT); - LOGFONT lf = { 0 }; - font.GetLogFont(lf); - WORD cyFontHeight = (WORD)abs(lf.lfHeight); - -#ifndef _WIN32_WCE - WORD bitsPerPixel = AtlGetBitmapResourceBitsPerPixel(nResourceID); - if(bitsPerPixel > 4) - { - COLORREF crMask = CLR_DEFAULT; - if(bitsPerPixel == 32) - { - // 32-bit color bitmap with alpha channel (valid for Windows XP and later) - crMask = CLR_NONE; - } - HIMAGELIST hImageList = ImageList_LoadImage(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nResourceID), pData->wWidth, 1, crMask, IMAGE_BITMAP, LR_CREATEDIBSECTION | LR_DEFAULTSIZE); - ATLASSERT(hImageList != NULL); - ::SendMessage(hWnd, TB_SETIMAGELIST, 0, (LPARAM)hImageList); - } - else -#endif // !_WIN32_WCE - { - TBADDBITMAP tbab = { 0 }; - tbab.hInst = hInst; - tbab.nID = nResourceID; - ::SendMessage(hWnd, TB_ADDBITMAP, nBmp, (LPARAM)&tbab); - } - - ::SendMessage(hWnd, TB_ADDBUTTONS, nItems, (LPARAM)pTBBtn); - ::SendMessage(hWnd, TB_SETBITMAPSIZE, 0, MAKELONG(pData->wWidth, max(pData->wHeight, cyFontHeight))); - const int cxyButtonMargin = 7; - ::SendMessage(hWnd, TB_SETBUTTONSIZE, 0, MAKELONG(pData->wWidth + cxyButtonMargin, max(pData->wHeight, cyFontHeight) + cxyButtonMargin)); - - return hWnd; - } - -#ifndef _WIN32_WCE - static HWND CreateSimpleReBarCtrl(HWND hWndParent, DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) - { - // Ensure style combinations for proper rebar painting - if(dwStyle & CCS_NODIVIDER && dwStyle & WS_BORDER) - dwStyle &= ~WS_BORDER; - else if(!(dwStyle & WS_BORDER) && !(dwStyle & CCS_NODIVIDER)) - dwStyle |= CCS_NODIVIDER; - - // Create rebar window - HWND hWndReBar = ::CreateWindowEx(0, REBARCLASSNAME, NULL, dwStyle, 0, 0, 100, 100, hWndParent, (HMENU)LongToHandle(nID), ModuleHelper::GetModuleInstance(), NULL); - if(hWndReBar == NULL) - { - ATLTRACE2(atlTraceUI, 0, _T("Failed to create rebar.\n")); - return NULL; - } - - // Initialize and send the REBARINFO structure - REBARINFO rbi = { 0 }; - rbi.cbSize = sizeof(REBARINFO); - rbi.fMask = 0; - if(!::SendMessage(hWndReBar, RB_SETBARINFO, 0, (LPARAM)&rbi)) - { - ATLTRACE2(atlTraceUI, 0, _T("Failed to initialize rebar.\n")); - ::DestroyWindow(hWndReBar); - return NULL; - } - - return hWndReBar; - } - - BOOL CreateSimpleReBar(DWORD dwStyle = ATL_SIMPLE_REBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) - { - ATLASSERT(!::IsWindow(m_hWndToolBar)); - m_hWndToolBar = CreateSimpleReBarCtrl(m_hWnd, dwStyle, nID); - return (m_hWndToolBar != NULL); - } - - static BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand, int nID = 0, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE) - { - ATLASSERT(::IsWindow(hWndReBar)); // must be already created -#ifdef _DEBUG - // block - check if this is really a rebar - { - TCHAR lpszClassName[sizeof(REBARCLASSNAME)] = { 0 }; - ::GetClassName(hWndReBar, lpszClassName, sizeof(REBARCLASSNAME)); - ATLASSERT(lstrcmp(lpszClassName, REBARCLASSNAME) == 0); - } -#endif // _DEBUG - ATLASSERT(::IsWindow(hWndBand)); // must be already created - - // Get number of buttons on the toolbar - int nBtnCount = (int)::SendMessage(hWndBand, TB_BUTTONCOUNT, 0, 0L); - - // Set band info structure - REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() }; -#if (_WIN32_IE >= 0x0400) - rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE | RBBIM_IDEALSIZE; -#else - rbBand.fMask = RBBIM_CHILD | RBBIM_CHILDSIZE | RBBIM_STYLE | RBBIM_ID | RBBIM_SIZE; -#endif // !(_WIN32_IE >= 0x0400) - if(lpstrTitle != NULL) - rbBand.fMask |= RBBIM_TEXT; - rbBand.fStyle = RBBS_CHILDEDGE; -#if (_WIN32_IE >= 0x0500) - if(nBtnCount > 0) // add chevron style for toolbar with buttons - rbBand.fStyle |= RBBS_USECHEVRON; -#endif // (_WIN32_IE >= 0x0500) - if(bNewRow) - rbBand.fStyle |= RBBS_BREAK; - - rbBand.lpText = (LPTSTR)lpstrTitle; - rbBand.hwndChild = hWndBand; - if(nID == 0) // calc band ID - nID = ATL_IDW_BAND_FIRST + (int)::SendMessage(hWndReBar, RB_GETBANDCOUNT, 0, 0L); - rbBand.wID = nID; - - // Calculate the size of the band - BOOL bRet = FALSE; - RECT rcTmp = { 0 }; - if(nBtnCount > 0) - { - bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, nBtnCount - 1, (LPARAM)&rcTmp); - ATLASSERT(bRet); - rbBand.cx = (cxWidth != 0) ? cxWidth : rcTmp.right; - rbBand.cyMinChild = rcTmp.bottom - rcTmp.top; - if(bFullWidthAlways) - { - rbBand.cxMinChild = rbBand.cx; - } - else if(lpstrTitle == NULL) - { - bRet = (BOOL)::SendMessage(hWndBand, TB_GETITEMRECT, 0, (LPARAM)&rcTmp); - ATLASSERT(bRet); - rbBand.cxMinChild = rcTmp.right; - } - else - { - rbBand.cxMinChild = 0; - } - } - else // no buttons, either not a toolbar or really has no buttons - { - bRet = ::GetWindowRect(hWndBand, &rcTmp); - ATLASSERT(bRet); - rbBand.cx = (cxWidth != 0) ? cxWidth : (rcTmp.right - rcTmp.left); - rbBand.cxMinChild = bFullWidthAlways ? rbBand.cx : 0; - rbBand.cyMinChild = rcTmp.bottom - rcTmp.top; - } - -#if (_WIN32_IE >= 0x0400) - rbBand.cxIdeal = rbBand.cx; -#endif // (_WIN32_IE >= 0x0400) - - // Add the band - LRESULT lRes = ::SendMessage(hWndReBar, RB_INSERTBAND, (WPARAM)-1, (LPARAM)&rbBand); - if(lRes == 0) - { - ATLTRACE2(atlTraceUI, 0, _T("Failed to add a band to the rebar.\n")); - return FALSE; - } - -#if (_WIN32_IE >= 0x0501) - DWORD dwExStyle = (DWORD)::SendMessage(hWndBand, TB_GETEXTENDEDSTYLE, 0, 0L); - ::SendMessage(hWndBand, TB_SETEXTENDEDSTYLE, 0, dwExStyle | TBSTYLE_EX_HIDECLIPPEDBUTTONS); -#endif // (_WIN32_IE >= 0x0501) - - return TRUE; - } - - BOOL AddSimpleReBarBand(HWND hWndBand, LPCTSTR lpstrTitle = NULL, BOOL bNewRow = FALSE, int cxWidth = 0, BOOL bFullWidthAlways = FALSE) - { - ATLASSERT(::IsWindow(m_hWndToolBar)); // must be an existing rebar - ATLASSERT(::IsWindow(hWndBand)); // must be created - return AddSimpleReBarBandCtrl(m_hWndToolBar, hWndBand, 0, lpstrTitle, bNewRow, cxWidth, bFullWidthAlways); - } - -#if (_WIN32_IE >= 0x0400) - void SizeSimpleReBarBands() - { - ATLASSERT(::IsWindow(m_hWndToolBar)); // must be an existing rebar - - int nCount = (int)::SendMessage(m_hWndToolBar, RB_GETBANDCOUNT, 0, 0L); - - for(int i = 0; i < nCount; i++) - { - REBARBANDINFO rbBand = { RunTimeHelper::SizeOf_REBARBANDINFO() }; - rbBand.fMask = RBBIM_SIZE; - BOOL bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_GETBANDINFO, i, (LPARAM)&rbBand); - ATLASSERT(bRet); - RECT rect = { 0, 0, 0, 0 }; - ::SendMessage(m_hWndToolBar, RB_GETBANDBORDERS, i, (LPARAM)&rect); - rbBand.cx += rect.left + rect.right; - bRet = (BOOL)::SendMessage(m_hWndToolBar, RB_SETBANDINFO, i, (LPARAM)&rbBand); - ATLASSERT(bRet); - } - } -#endif // (_WIN32_IE >= 0x0400) -#endif // _WIN32_WCE - -#ifndef _WIN32_WCE - BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR) -#else // CE specific - BOOL CreateSimpleStatusBar(LPCTSTR lpstrText, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR) -#endif // _WIN32_WCE - { - ATLASSERT(!::IsWindow(m_hWndStatusBar)); - m_hWndStatusBar = ::CreateStatusWindow(dwStyle, lpstrText, m_hWnd, nID); - return (m_hWndStatusBar != NULL); - } - -#ifndef _WIN32_WCE - BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | SBARS_SIZEGRIP, UINT nID = ATL_IDW_STATUS_BAR) -#else // CE specific - BOOL CreateSimpleStatusBar(UINT nTextID = ATL_IDS_IDLEMESSAGE, DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, UINT nID = ATL_IDW_STATUS_BAR) -#endif // _WIN32_WCE - { - const int cchMax = 128; // max text length is 127 for status bars (+1 for null) - TCHAR szText[cchMax]; - szText[0] = 0; - ::LoadString(ModuleHelper::GetResourceInstance(), nTextID, szText, cchMax); - return CreateSimpleStatusBar(szText, dwStyle, nID); - } - -#ifdef _WIN32_WCE - BOOL CreateSimpleCECommandBar(LPTSTR pszMenu = NULL, WORD iButton = 0, DWORD dwFlags = 0, int nCmdBarID = 1) - { - ATLASSERT(m_hWndCECommandBar == NULL); - ATLASSERT(m_hWndToolBar == NULL); - - m_hWndCECommandBar = ::CommandBar_Create(ModuleHelper::GetModuleInstance(), m_hWnd, nCmdBarID); - if(m_hWndCECommandBar == NULL) - return FALSE; - - m_hWndToolBar = m_hWndCECommandBar; - - BOOL bRet = TRUE; - - if(pszMenu != NULL) - bRet &= ::CommandBar_InsertMenubarEx(m_hWndCECommandBar, IS_INTRESOURCE(pszMenu) ? ModuleHelper::GetResourceInstance() : NULL, pszMenu, iButton); - - bRet &= ::CommandBar_AddAdornments(m_hWndCECommandBar, dwFlags, 0); - - return bRet; - } - -#if defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) - BOOL CreateSimpleCEMenuBar(UINT nToolBarId = ATL_IDW_MENU_BAR, DWORD dwFlags = 0, int nBmpId = 0, int cBmpImages = 0) - { - ATLASSERT(m_hWndCECommandBar == NULL); - - SHMENUBARINFO mbi = { 0 }; - mbi.cbSize = sizeof(mbi); - mbi.hwndParent = m_hWnd; - mbi.dwFlags = dwFlags; - mbi.nToolBarId = nToolBarId; - mbi.hInstRes = ModuleHelper::GetResourceInstance(); - mbi.nBmpId = nBmpId; - mbi.cBmpImages = cBmpImages; - mbi.hwndMB = NULL; // This gets set by SHCreateMenuBar - - BOOL bRet = ::SHCreateMenuBar(&mbi); - if(bRet != FALSE) - { - m_hWndCECommandBar = mbi.hwndMB; - SizeToMenuBar(); - } - - return bRet; - } - - void SizeToMenuBar() // for menu bar only - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(::IsWindow(m_hWndCECommandBar)); - - RECT rect = { 0 }; - GetWindowRect(&rect); - RECT rectMB = { 0 }; - ::GetWindowRect(m_hWndCECommandBar, &rectMB); - int cy = ::IsWindowVisible(m_hWndCECommandBar) ? rectMB.top - rect.top : rectMB.bottom - rect.top; - SetWindowPos(NULL, 0, 0, rect.right - rect.left, cy, SWP_NOZORDER | SWP_NOMOVE); - } -#endif // defined(_AYGSHELL_H_) || defined(__AYGSHELL_H__) -#endif // _WIN32_WCE - - void UpdateLayout(BOOL bResizeBars = TRUE) - { - RECT rect = { 0 }; - GetClientRect(&rect); - - // position bars and offset their dimensions - UpdateBarsPosition(rect, bResizeBars); - - // resize client window - if(m_hWndClient != NULL) - ::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top, - rect.right - rect.left, rect.bottom - rect.top, - SWP_NOZORDER | SWP_NOACTIVATE); - } - - void UpdateBarsPosition(RECT& rect, BOOL bResizeBars = TRUE) - { - // resize toolbar - if(m_hWndToolBar != NULL && ((DWORD)::GetWindowLong(m_hWndToolBar, GWL_STYLE) & WS_VISIBLE)) - { - if(bResizeBars != FALSE) - { - ::SendMessage(m_hWndToolBar, WM_SIZE, 0, 0); - ::InvalidateRect(m_hWndToolBar, NULL, TRUE); - } - RECT rectTB = { 0 }; - ::GetWindowRect(m_hWndToolBar, &rectTB); - rect.top += rectTB.bottom - rectTB.top; - } - - // resize status bar - if(m_hWndStatusBar != NULL && ((DWORD)::GetWindowLong(m_hWndStatusBar, GWL_STYLE) & WS_VISIBLE)) - { - if(bResizeBars != FALSE) - ::SendMessage(m_hWndStatusBar, WM_SIZE, 0, 0); - RECT rectSB = { 0 }; - ::GetWindowRect(m_hWndStatusBar, &rectSB); - rect.bottom -= rectSB.bottom - rectSB.top; - } - } - - BOOL PreTranslateMessage(MSG* pMsg) - { - if(m_hAccel != NULL && ::TranslateAccelerator(m_hWnd, m_hAccel, pMsg)) - return TRUE; - return FALSE; - } - - BEGIN_MSG_MAP(CFrameWindowImplBase) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect) -#endif // !_WIN32_WCE - MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) -#ifndef _WIN32_WCE - NOTIFY_CODE_HANDLER(TTN_GETDISPINFOA, OnToolTipTextA) - NOTIFY_CODE_HANDLER(TTN_GETDISPINFOW, OnToolTipTextW) -#endif // !_WIN32_WCE - END_MSG_MAP() - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_hWndClient != NULL) // view will paint itself instead - return 1; - - bHandled = FALSE; - return 0; - } - -#ifndef _WIN32_WCE - LRESULT OnMenuSelect(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - bHandled = FALSE; - - if(m_hWndStatusBar == NULL) - return 1; - - WORD wFlags = HIWORD(wParam); - if(wFlags == 0xFFFF && lParam == NULL) // menu closing - { - ::SendMessage(m_hWndStatusBar, SB_SIMPLE, FALSE, 0L); - } - else - { - const int cchBuff = 256; - TCHAR szBuff[cchBuff]; - szBuff[0] = 0; - if(!(wFlags & MF_POPUP)) - { - WORD wID = LOWORD(wParam); - // check for special cases - if(wID >= 0xF000 && wID < 0xF1F0) // system menu IDs - wID = (WORD)(((wID - 0xF000) >> 4) + ATL_IDS_SCFIRST); - else if(wID >= ID_FILE_MRU_FIRST && wID <= ID_FILE_MRU_LAST) // MRU items - wID = ATL_IDS_MRU_FILE; - else if(wID >= ATL_IDM_FIRST_MDICHILD && wID <= ATL_IDM_LAST_MDICHILD) // MDI child windows - wID = ATL_IDS_MDICHILD; - - int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), wID, szBuff, cchBuff); - for(int i = 0; i < nRet; i++) - { - if(szBuff[i] == _T('\n')) - { - szBuff[i] = 0; - break; - } - } - } - ::SendMessage(m_hWndStatusBar, SB_SIMPLE, TRUE, 0L); - ::SendMessage(m_hWndStatusBar, SB_SETTEXT, (255 | SBT_NOBORDERS), (LPARAM)szBuff); - } - - return 1; - } -#endif // !_WIN32_WCE - - LRESULT OnSetFocus(UINT, WPARAM, LPARAM, BOOL& bHandled) - { - if(m_hWndClient != NULL) - ::SetFocus(m_hWndClient); - - bHandled = FALSE; - return 1; - } - - LRESULT OnDestroy(UINT, WPARAM, LPARAM, BOOL& bHandled) - { - if((GetStyle() & (WS_CHILD | WS_POPUP)) == 0) - ::PostQuitMessage(1); - - bHandled = FALSE; - return 1; - } - -#ifndef _WIN32_WCE - LRESULT OnToolTipTextA(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - LPNMTTDISPINFOA pDispInfo = (LPNMTTDISPINFOA)pnmh; - pDispInfo->szText[0] = 0; - - if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND)) - { - const int cchBuff = 256; - char szBuff[cchBuff]; - szBuff[0] = 0; - int nRet = ::LoadStringA(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff); - for(int i = 0; i < nRet; i++) - { - if(szBuff[i] == '\n') - { - SecureHelper::strncpyA_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE); - break; - } - } -#if (_WIN32_IE >= 0x0300) - if(nRet > 0) // string was loaded, save it - pDispInfo->uFlags |= TTF_DI_SETITEM; -#endif // (_WIN32_IE >= 0x0300) - } - - return 0; - } - - LRESULT OnToolTipTextW(int idCtrl, LPNMHDR pnmh, BOOL& /*bHandled*/) - { - LPNMTTDISPINFOW pDispInfo = (LPNMTTDISPINFOW)pnmh; - pDispInfo->szText[0] = 0; - - if((idCtrl != 0) && !(pDispInfo->uFlags & TTF_IDISHWND)) - { - const int cchBuff = 256; - wchar_t szBuff[cchBuff]; - szBuff[0] = 0; - int nRet = ::LoadStringW(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff); - for(int i = 0; i < nRet; i++) - { - if(szBuff[i] == L'\n') - { - SecureHelper::strncpyW_x(pDispInfo->szText, _countof(pDispInfo->szText), &szBuff[i + 1], _TRUNCATE); - break; - } - } -#if (_WIN32_IE >= 0x0300) - if(nRet > 0) // string was loaded, save it - pDispInfo->uFlags |= TTF_DI_SETITEM; -#endif // (_WIN32_IE >= 0x0300) - } - - return 0; - } -#endif // !_WIN32_WCE - -// Implementation - chevron menu support -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - bool PrepareChevronMenu(_ChevronMenuInfo& cmi) - { - // get rebar and toolbar - REBARBANDINFO rbbi = { RunTimeHelper::SizeOf_REBARBANDINFO() }; - rbbi.fMask = RBBIM_CHILD; - BOOL bRet = (BOOL)::SendMessage(cmi.lpnm->hdr.hwndFrom, RB_GETBANDINFO, cmi.lpnm->uBand, (LPARAM)&rbbi); - ATLASSERT(bRet); - - // assume the band is a toolbar - ATL::CWindow wnd = rbbi.hwndChild; - int nCount = (int)wnd.SendMessage(TB_BUTTONCOUNT); - if(nCount <= 0) // probably not a toolbar - return false; - - // check if it's a command bar - CMenuHandle menuCmdBar = (HMENU)wnd.SendMessage(CBRM_GETMENU); - cmi.bCmdBar = (menuCmdBar.m_hMenu != NULL); - - // build a menu from hidden items - CMenuHandle menu; - bRet = menu.CreatePopupMenu(); - ATLASSERT(bRet); - RECT rcClient = { 0 }; - bRet = wnd.GetClientRect(&rcClient); - ATLASSERT(bRet); - for(int i = 0; i < nCount; i++) - { - TBBUTTON tbb = { 0 }; - bRet = (BOOL)wnd.SendMessage(TB_GETBUTTON, i, (LPARAM)&tbb); - ATLASSERT(bRet); - // skip hidden buttons - if((tbb.fsState & TBSTATE_HIDDEN) != 0) - continue; - RECT rcButton = { 0 }; - bRet = (BOOL)wnd.SendMessage(TB_GETITEMRECT, i, (LPARAM)&rcButton); - ATLASSERT(bRet); - bool bEnabled = ((tbb.fsState & TBSTATE_ENABLED) != 0); - if(rcButton.right > rcClient.right) - { - if(tbb.fsStyle & BTNS_SEP) - { - if(menu.GetMenuItemCount() > 0) - menu.AppendMenu(MF_SEPARATOR); - } - else if(cmi.bCmdBar) - { - const int cchBuff = 200; - TCHAR szBuff[cchBuff] = { 0 }; - CMenuItemInfo mii; - mii.fMask = MIIM_TYPE | MIIM_SUBMENU; - mii.dwTypeData = szBuff; - mii.cch = cchBuff; - bRet = menuCmdBar.GetMenuItemInfo(i, TRUE, &mii); - ATLASSERT(bRet); - // Note: CmdBar currently supports only drop-down items - ATLASSERT(::IsMenu(mii.hSubMenu)); - bRet = menu.AppendMenu(MF_STRING | MF_POPUP | (bEnabled ? MF_ENABLED : MF_GRAYED), (UINT_PTR)mii.hSubMenu, mii.dwTypeData); - ATLASSERT(bRet); - } - else - { - // get button's text - const int cchBuff = 200; - TCHAR szBuff[cchBuff] = { 0 }; - LPTSTR lpstrText = szBuff; - TBBUTTONINFO tbbi = { 0 }; - tbbi.cbSize = sizeof(TBBUTTONINFO); - tbbi.dwMask = TBIF_TEXT; - tbbi.pszText = szBuff; - tbbi.cchText = cchBuff; - if(wnd.SendMessage(TB_GETBUTTONINFO, tbb.idCommand, (LPARAM)&tbbi) == -1 || lstrlen(szBuff) == 0) - { - // no text for this button, try a resource string - lpstrText = _T(""); - int nRet = ::LoadString(ModuleHelper::GetResourceInstance(), tbb.idCommand, szBuff, cchBuff); - for(int n = 0; n < nRet; n++) - { - if(szBuff[n] == _T('\n')) - { - lpstrText = &szBuff[n + 1]; - break; - } - } - } - bRet = menu.AppendMenu(MF_STRING | (bEnabled ? MF_ENABLED : MF_GRAYED), tbb.idCommand, lpstrText); - ATLASSERT(bRet); - } - } - } - - if(menu.GetMenuItemCount() == 0) // no hidden buttons after all - { - menu.DestroyMenu(); - ::MessageBeep((UINT)-1); - return false; - } - - cmi.hMenu = menu; - return true; - } - - void DisplayChevronMenu(_ChevronMenuInfo& cmi) - { -#ifndef TPM_VERPOSANIMATION - const UINT TPM_VERPOSANIMATION = 0x1000L; // Menu animation flag -#endif - // convert chevron rect to screen coordinates - ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom; - POINT pt = { cmi.lpnm->rc.left, cmi.lpnm->rc.bottom }; - wndFrom.MapWindowPoints(NULL, &pt, 1); - RECT rc = cmi.lpnm->rc; - wndFrom.MapWindowPoints(NULL, &rc); - // set up flags and rect - UINT uMenuFlags = TPM_LEFTBUTTON | TPM_VERTICAL | TPM_LEFTALIGN | TPM_TOPALIGN | (!AtlIsOldWindows() ? TPM_VERPOSANIMATION : 0); - TPMPARAMS TPMParams = { 0 }; - TPMParams.cbSize = sizeof(TPMPARAMS); - TPMParams.rcExclude = rc; - // check if this window has a command bar - HWND hWndCmdBar = (HWND)::SendMessage(m_hWnd, CBRM_GETCMDBAR, 0, 0L); - if(::IsWindow(hWndCmdBar)) - { - CBRPOPUPMENU CBRPopupMenu = { sizeof(CBRPOPUPMENU), cmi.hMenu, uMenuFlags, pt.x, pt.y, &TPMParams }; - ::SendMessage(hWndCmdBar, CBRM_TRACKPOPUPMENU, 0, (LPARAM)&CBRPopupMenu); - } - else - { - CMenuHandle menu = cmi.hMenu; - menu.TrackPopupMenuEx(uMenuFlags, pt.x, pt.y, m_hWnd, &TPMParams); - } - } - - void CleanupChevronMenu(_ChevronMenuInfo& cmi) - { - CMenuHandle menu = cmi.hMenu; - // if menu is from a command bar, detach submenus so they are not destroyed - if(cmi.bCmdBar) - { - for(int i = menu.GetMenuItemCount() - 1; i >=0; i--) - menu.RemoveMenu(i, MF_BYPOSITION); - } - // destroy menu - menu.DestroyMenu(); - // convert chevron rect to screen coordinates - ATL::CWindow wndFrom = cmi.lpnm->hdr.hwndFrom; - RECT rc = cmi.lpnm->rc; - wndFrom.MapWindowPoints(NULL, &rc); - // eat next message if click is on the same button - MSG msg = { 0 }; - if(::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_NOREMOVE) && ::PtInRect(&rc, msg.pt)) - ::PeekMessage(&msg, m_hWnd, WM_LBUTTONDOWN, WM_LBUTTONDOWN, PM_REMOVE); - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) -}; - - -template -class ATL_NO_VTABLE CFrameWindowImpl : public CFrameWindowImplBase< TBase, TWinTraits > -{ -public: - HWND Create(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - HMENU hMenu = NULL, LPVOID lpCreateParam = NULL) - { - ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc); - - dwStyle = T::GetWndStyle(dwStyle); - dwExStyle = T::GetWndExStyle(dwExStyle); - - if(rect.m_lpRect == NULL) - rect.m_lpRect = &TBase::rcDefault; - - return CFrameWindowImplBase< TBase, TWinTraits >::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, hMenu, atom, lpCreateParam); - } - - HWND CreateEx(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL) - { - const int cchName = 256; - TCHAR szWindowName[cchName]; - szWindowName[0] = 0; -#ifndef _WIN32_WCE - ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName); - HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); -#else // CE specific - ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName); - - // This always needs to be NULL for Windows CE. - // Frame Window menus have to go onto the CommandBar. - // Use CreateSimpleCECommandBar - HMENU hMenu = NULL; -#endif // _WIN32_WCE - - T* pT = static_cast(this); - HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam); - - if(hWnd != NULL) - m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); - - return hWnd; - } - - BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) - { - if(nResourceID == 0) - nResourceID = T::GetWndClassInfo().m_uCommonResourceID; -#ifndef _WIN32_WCE - ATLASSERT(!::IsWindow(m_hWndToolBar)); - m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID); - return (m_hWndToolBar != NULL); -#else // CE specific - HWND hWnd= T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID); - return (hWnd != NULL); -#endif // _WIN32_WCE - } - -#ifdef _WIN32_WCE - // CE specific variant that returns the handle of the toolbar - HWND CreateSimpleCEToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) - { - if(nResourceID == 0) - nResourceID = T::GetWndClassInfo().m_uCommonResourceID; - - return T::CreateSimpleToolBarCtrl(m_hWndCECommandBar, nResourceID, TRUE, dwStyle, nID); - } -#endif // _WIN32_WCE - -// message map and handlers - typedef CFrameWindowImplBase< TBase, TWinTraits > _baseClass; - - BEGIN_MSG_MAP(CFrameWindowImpl) - MESSAGE_HANDLER(WM_SIZE, OnSize) -#ifndef _ATL_NO_REBAR_SUPPORT -#if (_WIN32_IE >= 0x0400) - NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize) -#endif // (_WIN32_IE >= 0x0400) -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed) -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) -#endif // !_ATL_NO_REBAR_SUPPORT - CHAIN_MSG_MAP(_baseClass) - END_MSG_MAP() - - LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(wParam != SIZE_MINIMIZED) - { - T* pT = static_cast(this); - pT->UpdateLayout(); - } - bHandled = FALSE; - return 1; - } - -#ifndef _ATL_NO_REBAR_SUPPORT -#if (_WIN32_IE >= 0x0400) - LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->UpdateLayout(FALSE); - return 0; - } -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) - LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) - { - T* pT = static_cast(this); - _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false }; - if(!pT->PrepareChevronMenu(cmi)) - { - bHandled = FALSE; - return 1; - } - // display a popup menu with hidden items - pT->DisplayChevronMenu(cmi); - // cleanup - pT->CleanupChevronMenu(cmi); - return 0; - } -#endif // (_WIN32_IE >= 0x0500) && !defined(_WIN32_WCE) -#endif // !_ATL_NO_REBAR_SUPPORT -}; - - -/////////////////////////////////////////////////////////////////////////////// -// AtlCreateSimpleToolBar - helper for creating simple toolbars - -#ifndef _WIN32_WCE - -inline HWND AtlCreateSimpleToolBar(HWND hWndParent, UINT nResourceID, BOOL bInitialSeparator = FALSE, - DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) -{ - return CFrameWindowImplBase<>::CreateSimpleToolBarCtrl(hWndParent, nResourceID, bInitialSeparator, dwStyle, nID); -} - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CMDIWindow - -#ifndef _WIN32_WCE - -#ifndef _WTL_MDIWINDOWMENU_TEXT -#define _WTL_MDIWINDOWMENU_TEXT _T("&Window") -#endif - -class CMDIWindow : public ATL::CWindow -{ -public: -// Data members - HWND m_hWndMDIClient; - HMENU m_hMenu; - -// Constructors - CMDIWindow(HWND hWnd = NULL) : ATL::CWindow(hWnd), m_hWndMDIClient(NULL), m_hMenu(NULL) - { } - - CMDIWindow& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// Operations - HWND MDIGetActive(BOOL* lpbMaximized = NULL) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - return (HWND)::SendMessage(m_hWndMDIClient, WM_MDIGETACTIVE, 0, (LPARAM)lpbMaximized); - } - - void MDIActivate(HWND hWndChildToActivate) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - ATLASSERT(::IsWindow(hWndChildToActivate)); - ::SendMessage(m_hWndMDIClient, WM_MDIACTIVATE, (WPARAM)hWndChildToActivate, 0); - } - - void MDINext(HWND hWndChild, BOOL bPrevious = FALSE) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - ATLASSERT(hWndChild == NULL || ::IsWindow(hWndChild)); - ::SendMessage(m_hWndMDIClient, WM_MDINEXT, (WPARAM)hWndChild, (LPARAM)bPrevious); - } - - void MDIMaximize(HWND hWndChildToMaximize) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - ATLASSERT(::IsWindow(hWndChildToMaximize)); - ::SendMessage(m_hWndMDIClient, WM_MDIMAXIMIZE, (WPARAM)hWndChildToMaximize, 0); - } - - void MDIRestore(HWND hWndChildToRestore) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - ATLASSERT(::IsWindow(hWndChildToRestore)); - ::SendMessage(m_hWndMDIClient, WM_MDIRESTORE, (WPARAM)hWndChildToRestore, 0); - } - - void MDIDestroy(HWND hWndChildToDestroy) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - ATLASSERT(::IsWindow(hWndChildToDestroy)); - ::SendMessage(m_hWndMDIClient, WM_MDIDESTROY, (WPARAM)hWndChildToDestroy, 0); - } - - BOOL MDICascade(UINT uFlags = 0) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDICASCADE, (WPARAM)uFlags, 0); - } - - BOOL MDITile(UINT uFlags = MDITILE_HORIZONTAL) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - return (BOOL)::SendMessage(m_hWndMDIClient, WM_MDITILE, (WPARAM)uFlags, 0); - } - - void MDIIconArrange() - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - ::SendMessage(m_hWndMDIClient, WM_MDIICONARRANGE, 0, 0); - } - - HMENU MDISetMenu(HMENU hMenuFrame, HMENU hMenuWindow) - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDISETMENU, (WPARAM)hMenuFrame, (LPARAM)hMenuWindow); - } - - HMENU MDIRefreshMenu() - { - ATLASSERT(::IsWindow(m_hWndMDIClient)); - return (HMENU)::SendMessage(m_hWndMDIClient, WM_MDIREFRESHMENU, 0, 0); - } - -// Additional operations - static HMENU GetStandardWindowMenu(HMENU hMenu) - { - int nCount = ::GetMenuItemCount(hMenu); - if(nCount == -1) - return NULL; - int nLen = ::GetMenuString(hMenu, nCount - 2, NULL, 0, MF_BYPOSITION); - if(nLen == 0) - return NULL; - CTempBuffer buff; - LPTSTR lpszText = buff.Allocate(nLen + 1); - if(lpszText == NULL) - return NULL; - if(::GetMenuString(hMenu, nCount - 2, lpszText, nLen + 1, MF_BYPOSITION) != nLen) - return NULL; - if(lstrcmp(lpszText, _WTL_MDIWINDOWMENU_TEXT) != 0) - return NULL; - return ::GetSubMenu(hMenu, nCount - 2); - } - - void SetMDIFrameMenu() - { - HMENU hWindowMenu = GetStandardWindowMenu(m_hMenu); - MDISetMenu(m_hMenu, hWindowMenu); - MDIRefreshMenu(); - ::DrawMenuBar(GetMDIFrame()); - } - - HWND GetMDIFrame() const - { - return ::GetParent(m_hWndMDIClient); - } -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CMDIFrameWindowImpl - -#ifndef _WIN32_WCE - -// MDI child command chaining macro (only for MDI frame windows) -#define CHAIN_MDI_CHILD_COMMANDS() \ - if(uMsg == WM_COMMAND) \ - { \ - HWND hWndChild = MDIGetActive(); \ - if(hWndChild != NULL) \ - ::SendMessage(hWndChild, uMsg, wParam, lParam); \ - } - -template -class ATL_NO_VTABLE CMDIFrameWindowImpl : public CFrameWindowImplBase -{ -public: - HWND Create(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - HMENU hMenu = NULL, LPVOID lpCreateParam = NULL) - { - m_hMenu = hMenu; - ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc); - - dwStyle = T::GetWndStyle(dwStyle); - dwExStyle = T::GetWndExStyle(dwExStyle); - - if(rect.m_lpRect == NULL) - rect.m_lpRect = &TBase::rcDefault; - - return CFrameWindowImplBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, hMenu, atom, lpCreateParam); - } - - HWND CreateEx(HWND hWndParent = NULL, ATL::_U_RECT rect = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL) - { - const int cchName = 256; - TCHAR szWindowName[cchName]; - szWindowName[0] = 0; - ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName); - HMENU hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); - - T* pT = static_cast(this); - HWND hWnd = pT->Create(hWndParent, rect, szWindowName, dwStyle, dwExStyle, hMenu, lpCreateParam); - - if(hWnd != NULL) - m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); - - return hWnd; - } - - BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) - { - ATLASSERT(!::IsWindow(m_hWndToolBar)); - if(nResourceID == 0) - nResourceID = T::GetWndClassInfo().m_uCommonResourceID; - m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID); - return (m_hWndToolBar != NULL); - } - - virtual WNDPROC GetWindowProc() - { - return MDIFrameWindowProc; - } - - static LRESULT CALLBACK MDIFrameWindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) - { - CMDIFrameWindowImpl< T, TBase, TWinTraits >* pThis = (CMDIFrameWindowImpl< T, TBase, TWinTraits >*)hWnd; - // set a ptr to this message and save the old value -#if (_ATL_VER >= 0x0700) - ATL::_ATL_MSG msg(pThis->m_hWnd, uMsg, wParam, lParam); - const ATL::_ATL_MSG* pOldMsg = pThis->m_pCurrentMsg; -#else // !(_ATL_VER >= 0x0700) - MSG msg = { pThis->m_hWnd, uMsg, wParam, lParam, 0, { 0, 0 } }; - const MSG* pOldMsg = pThis->m_pCurrentMsg; -#endif // !(_ATL_VER >= 0x0700) - pThis->m_pCurrentMsg = &msg; - // pass to the message map to process - LRESULT lRes = 0; - BOOL bRet = pThis->ProcessWindowMessage(pThis->m_hWnd, uMsg, wParam, lParam, lRes, 0); - // restore saved value for the current message - ATLASSERT(pThis->m_pCurrentMsg == &msg); - pThis->m_pCurrentMsg = pOldMsg; - // do the default processing if message was not handled - if(!bRet) - { - if(uMsg != WM_NCDESTROY) - lRes = pThis->DefWindowProc(uMsg, wParam, lParam); - else - { - // unsubclass, if needed - LONG_PTR pfnWndProc = ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC); - lRes = pThis->DefWindowProc(uMsg, wParam, lParam); - if(pThis->m_pfnSuperWindowProc != ::DefWindowProc && ::GetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC) == pfnWndProc) - ::SetWindowLongPtr(pThis->m_hWnd, GWLP_WNDPROC, (LONG_PTR)pThis->m_pfnSuperWindowProc); -#if (_ATL_VER >= 0x0700) - // mark window as destryed - pThis->m_dwState |= WINSTATE_DESTROYED; -#else // !(_ATL_VER >= 0x0700) - // clear out window handle - HWND hWnd = pThis->m_hWnd; - pThis->m_hWnd = NULL; - // clean up after window is destroyed - pThis->OnFinalMessage(hWnd); -#endif // !(_ATL_VER >= 0x0700) - } - } -#if (_ATL_VER >= 0x0700) - if(pThis->m_dwState & WINSTATE_DESTROYED && pThis->m_pCurrentMsg == NULL) - { - // clear out window handle - HWND hWnd = pThis->m_hWnd; - pThis->m_hWnd = NULL; - pThis->m_dwState &= ~WINSTATE_DESTROYED; - // clean up after window is destroyed - pThis->OnFinalMessage(hWnd); - } -#endif // (_ATL_VER >= 0x0700) - return lRes; - } - - // Overriden to call DefWindowProc which uses DefFrameProc - LRESULT DefWindowProc() - { - const MSG* pMsg = m_pCurrentMsg; - LRESULT lRes = 0; - if (pMsg != NULL) - lRes = DefWindowProc(pMsg->message, pMsg->wParam, pMsg->lParam); - return lRes; - } - - LRESULT DefWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam) - { - return ::DefFrameProc(m_hWnd, m_hWndMDIClient, uMsg, wParam, lParam); - } - - BOOL PreTranslateMessage(MSG* pMsg) - { - if(CFrameWindowImplBase::PreTranslateMessage(pMsg)) - return TRUE; - return ::TranslateMDISysAccel(m_hWndMDIClient, pMsg); - } - - HWND CreateMDIClient(HMENU hWindowMenu = NULL, UINT nID = ATL_IDW_CLIENT, UINT nFirstChildID = ATL_IDM_FIRST_MDICHILD) - { - DWORD dwStyle = WS_VISIBLE | WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | MDIS_ALLCHILDSTYLES; - DWORD dwExStyle = WS_EX_CLIENTEDGE; - - CLIENTCREATESTRUCT ccs = { 0 }; - ccs.hWindowMenu = hWindowMenu; - ccs.idFirstChild = nFirstChildID; - - if((GetStyle() & (WS_HSCROLL | WS_VSCROLL)) != 0) - { - // parent MDI frame's scroll styles move to the MDICLIENT - dwStyle |= (GetStyle() & (WS_HSCROLL | WS_VSCROLL)); - - // fast way to turn off the scrollbar bits (without a resize) - ModifyStyle(WS_HSCROLL | WS_VSCROLL, 0, SWP_NOREDRAW | SWP_FRAMECHANGED); - } - - // Create MDICLIENT window - m_hWndClient = ::CreateWindowEx(dwExStyle, _T("MDIClient"), NULL, - dwStyle, 0, 0, 1, 1, m_hWnd, (HMENU)LongToHandle(nID), - ModuleHelper::GetModuleInstance(), (LPVOID)&ccs); - if (m_hWndClient == NULL) - { - ATLTRACE2(atlTraceUI, 0, _T("MDI Frame failed to create MDICLIENT.\n")); - return NULL; - } - - // Move it to the top of z-order - ::BringWindowToTop(m_hWndClient); - - // set as MDI client window - m_hWndMDIClient = m_hWndClient; - - // update to proper size - T* pT = static_cast(this); - pT->UpdateLayout(); - - return m_hWndClient; - } - - typedef CFrameWindowImplBase _baseClass; - - BEGIN_MSG_MAP(CMDIFrameWindowImpl) - MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) - MESSAGE_HANDLER(WM_MDISETMENU, OnMDISetMenu) -#ifndef _ATL_NO_REBAR_SUPPORT -#if (_WIN32_IE >= 0x0400) - NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize) -#endif // (_WIN32_IE >= 0x0400) -#if (_WIN32_IE >= 0x0500) - NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed) -#endif // (_WIN32_IE >= 0x0500) -#endif // !_ATL_NO_REBAR_SUPPORT - CHAIN_MSG_MAP(_baseClass) - END_MSG_MAP() - - LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(wParam != SIZE_MINIMIZED) - { - T* pT = static_cast(this); - pT->UpdateLayout(); - } - // message must be handled, otherwise DefFrameProc would resize the client again - return 0; - } - - LRESULT OnSetFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - // don't allow CFrameWindowImplBase to handle this one - return DefWindowProc(uMsg, wParam, lParam); - } - - LRESULT OnMDISetMenu(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - SetMDIFrameMenu(); - return 0; - } - -#ifndef _ATL_NO_REBAR_SUPPORT -#if (_WIN32_IE >= 0x0400) - LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->UpdateLayout(FALSE); - return 0; - } -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) - LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) - { - T* pT = static_cast(this); - _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false }; - if(!pT->PrepareChevronMenu(cmi)) - { - bHandled = FALSE; - return 1; - } - // display a popup menu with hidden items - pT->DisplayChevronMenu(cmi); - // cleanup - pT->CleanupChevronMenu(cmi); - return 0; - } -#endif // (_WIN32_IE >= 0x0500) -#endif // !_ATL_NO_REBAR_SUPPORT -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CMDIChildWindowImpl - -#ifndef _WIN32_WCE - -template -class ATL_NO_VTABLE CMDIChildWindowImpl : public CFrameWindowImplBase -{ -public: - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - UINT nMenuID = 0, LPVOID lpCreateParam = NULL) - { - ATOM atom = T::GetWndClassInfo().Register(&m_pfnSuperWindowProc); - - if(nMenuID != 0) - m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(nMenuID)); - - dwStyle = T::GetWndStyle(dwStyle); - dwExStyle = T::GetWndExStyle(dwExStyle); - - dwExStyle |= WS_EX_MDICHILD; // force this one - m_pfnSuperWindowProc = ::DefMDIChildProc; - m_hWndMDIClient = hWndParent; - ATLASSERT(::IsWindow(m_hWndMDIClient)); - - if(rect.m_lpRect == NULL) - rect.m_lpRect = &TBase::rcDefault; - - // If the currently active MDI child is maximized, we want to create this one maximized too - ATL::CWindow wndParent = hWndParent; - BOOL bMaximized = FALSE; - wndParent.SendMessage(WM_MDIGETACTIVE, 0, (LPARAM)&bMaximized); - if(bMaximized) - wndParent.SetRedraw(FALSE); - - HWND hWnd = CFrameWindowImplBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, (UINT)0U, atom, lpCreateParam); - - if(bMaximized) - { - // Maximize and redraw everything - if(hWnd != NULL) - MDIMaximize(hWnd); - wndParent.SetRedraw(TRUE); - wndParent.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN); - ::SetFocus(GetMDIFrame()); // focus will be set back to this window - } - else if(hWnd != NULL && ::IsWindowVisible(m_hWnd) && !::IsChild(hWnd, ::GetFocus())) - { - ::SetFocus(hWnd); - } - - return hWnd; - } - - HWND CreateEx(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR lpcstrWindowName = NULL, DWORD dwStyle = 0, DWORD dwExStyle = 0, LPVOID lpCreateParam = NULL) - { - const int cchName = 256; - TCHAR szWindowName[cchName]; - szWindowName[0] = 0; - if(lpcstrWindowName == NULL) - { - ::LoadString(ModuleHelper::GetResourceInstance(), T::GetWndClassInfo().m_uCommonResourceID, szWindowName, cchName); - lpcstrWindowName = szWindowName; - } - - T* pT = static_cast(this); - HWND hWnd = pT->Create(hWndParent, rect, lpcstrWindowName, dwStyle, dwExStyle, T::GetWndClassInfo().m_uCommonResourceID, lpCreateParam); - - if(hWnd != NULL) - m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE(T::GetWndClassInfo().m_uCommonResourceID)); - - return hWnd; - } - - BOOL CreateSimpleToolBar(UINT nResourceID = 0, DWORD dwStyle = ATL_SIMPLE_TOOLBAR_STYLE, UINT nID = ATL_IDW_TOOLBAR) - { - ATLASSERT(!::IsWindow(m_hWndToolBar)); - if(nResourceID == 0) - nResourceID = T::GetWndClassInfo().m_uCommonResourceID; - m_hWndToolBar = T::CreateSimpleToolBarCtrl(m_hWnd, nResourceID, TRUE, dwStyle, nID); - return (m_hWndToolBar != NULL); - } - - BOOL UpdateClientEdge(LPRECT lpRect = NULL) - { - // only adjust for active MDI child window - HWND hWndChild = MDIGetActive(); - if(hWndChild != NULL && hWndChild != m_hWnd) - return FALSE; - - // need to adjust the client edge style as max/restore happens - DWORD dwStyle = ::GetWindowLong(m_hWndMDIClient, GWL_EXSTYLE); - DWORD dwNewStyle = dwStyle; - if(hWndChild != NULL && ((GetExStyle() & WS_EX_CLIENTEDGE) == 0) && ((GetStyle() & WS_MAXIMIZE) != 0)) - dwNewStyle &= ~(WS_EX_CLIENTEDGE); - else - dwNewStyle |= WS_EX_CLIENTEDGE; - - if(dwStyle != dwNewStyle) - { - // SetWindowPos will not move invalid bits - ::RedrawWindow(m_hWndMDIClient, NULL, NULL, - RDW_INVALIDATE | RDW_ALLCHILDREN); - // remove/add WS_EX_CLIENTEDGE to MDI client area - ::SetWindowLong(m_hWndMDIClient, GWL_EXSTYLE, dwNewStyle); - ::SetWindowPos(m_hWndMDIClient, NULL, 0, 0, 0, 0, - SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | - SWP_NOZORDER | SWP_NOCOPYBITS); - - // return new client area - if (lpRect != NULL) - ::GetClientRect(m_hWndMDIClient, lpRect); - - return TRUE; - } - - return FALSE; - } - - typedef CFrameWindowImplBase _baseClass; - BEGIN_MSG_MAP(CMDIChildWindowImpl) - MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_WINDOWPOSCHANGED, OnWindowPosChanged) - MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate) - MESSAGE_HANDLER(WM_MENUSELECT, OnMenuSelect) - MESSAGE_HANDLER(WM_MDIACTIVATE, OnMDIActivate) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) -#ifndef _ATL_NO_REBAR_SUPPORT -#if (_WIN32_IE >= 0x0400) - NOTIFY_CODE_HANDLER(RBN_AUTOSIZE, OnReBarAutoSize) -#endif // (_WIN32_IE >= 0x0400) -#if (_WIN32_IE >= 0x0500) - NOTIFY_CODE_HANDLER(RBN_CHEVRONPUSHED, OnChevronPushed) -#endif // (_WIN32_IE >= 0x0500) -#endif // !_ATL_NO_REBAR_SUPPORT - CHAIN_MSG_MAP(_baseClass) - END_MSG_MAP() - - LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - DefWindowProc(uMsg, wParam, lParam); // needed for MDI children - if(wParam != SIZE_MINIMIZED) - { - T* pT = static_cast(this); - pT->UpdateLayout(); - } - return 0; - } - - LRESULT OnWindowPosChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - // update MDI client edge and adjust MDI child rect - LPWINDOWPOS lpWndPos = (LPWINDOWPOS)lParam; - - if(!(lpWndPos->flags & SWP_NOSIZE)) - { - RECT rectClient; - if(UpdateClientEdge(&rectClient) && ((GetStyle() & WS_MAXIMIZE) != 0)) - { - ::AdjustWindowRectEx(&rectClient, GetStyle(), FALSE, GetExStyle()); - lpWndPos->x = rectClient.left; - lpWndPos->y = rectClient.top; - lpWndPos->cx = rectClient.right - rectClient.left; - lpWndPos->cy = rectClient.bottom - rectClient.top; - } - } - - bHandled = FALSE; - return 1; - } - - LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - LRESULT lRes = DefWindowProc(uMsg, wParam, lParam); - - // Activate this MDI window if needed - if(lRes == MA_ACTIVATE || lRes == MA_ACTIVATEANDEAT) - { - if(MDIGetActive() != m_hWnd) - MDIActivate(m_hWnd); - } - - return lRes; - } - - LRESULT OnMenuSelect(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - return ::SendMessage(GetMDIFrame(), uMsg, wParam, lParam); - } - - LRESULT OnMDIActivate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if((HWND)lParam == m_hWnd && m_hMenu != NULL) - SetMDIFrameMenu(); - else if((HWND)lParam == NULL) - ::SendMessage(GetMDIFrame(), WM_MDISETMENU, 0, 0); - - bHandled = FALSE; - return 1; - } - - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_hMenu != NULL) - { - ::DestroyMenu(m_hMenu); - m_hMenu = NULL; - } - UpdateClientEdge(); - bHandled = FALSE; - return 1; - } - -#ifndef _ATL_NO_REBAR_SUPPORT -#if (_WIN32_IE >= 0x0400) - LRESULT OnReBarAutoSize(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->UpdateLayout(FALSE); - return 0; - } -#endif // (_WIN32_IE >= 0x0400) - -#if (_WIN32_IE >= 0x0500) - LRESULT OnChevronPushed(int /*idCtrl*/, LPNMHDR pnmh, BOOL& bHandled) - { - T* pT = static_cast(this); - _ChevronMenuInfo cmi = { NULL, (LPNMREBARCHEVRON)pnmh, false }; - if(!pT->PrepareChevronMenu(cmi)) - { - bHandled = FALSE; - return 1; - } - // display a popup menu with hidden items - pT->DisplayChevronMenu(cmi); - // cleanup - pT->CleanupChevronMenu(cmi); - return 0; - } -#endif // (_WIN32_IE >= 0x0500) -#endif // !_ATL_NO_REBAR_SUPPORT -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// COwnerDraw - MI class for owner-draw support - -template -class COwnerDraw -{ -public: -#if (_ATL_VER < 0x0700) - BOOL m_bHandledOD; - - BOOL IsMsgHandled() const - { - return m_bHandledOD; - } - void SetMsgHandled(BOOL bHandled) - { - m_bHandledOD = bHandled; - } -#endif // (_ATL_VER < 0x0700) - -// Message map and handlers - BEGIN_MSG_MAP(COwnerDraw< T >) - MESSAGE_HANDLER(WM_DRAWITEM, OnDrawItem) - MESSAGE_HANDLER(WM_MEASUREITEM, OnMeasureItem) - MESSAGE_HANDLER(WM_COMPAREITEM, OnCompareItem) - MESSAGE_HANDLER(WM_DELETEITEM, OnDeleteItem) - ALT_MSG_MAP(1) - MESSAGE_HANDLER(OCM_DRAWITEM, OnDrawItem) - MESSAGE_HANDLER(OCM_MEASUREITEM, OnMeasureItem) - MESSAGE_HANDLER(OCM_COMPAREITEM, OnCompareItem) - MESSAGE_HANDLER(OCM_DELETEITEM, OnDeleteItem) - END_MSG_MAP() - - LRESULT OnDrawItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->SetMsgHandled(TRUE); - pT->DrawItem((LPDRAWITEMSTRUCT)lParam); - bHandled = pT->IsMsgHandled(); - return (LRESULT)TRUE; - } - - LRESULT OnMeasureItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->SetMsgHandled(TRUE); - pT->MeasureItem((LPMEASUREITEMSTRUCT)lParam); - bHandled = pT->IsMsgHandled(); - return (LRESULT)TRUE; - } - - LRESULT OnCompareItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->SetMsgHandled(TRUE); - bHandled = pT->IsMsgHandled(); - return (LRESULT)pT->CompareItem((LPCOMPAREITEMSTRUCT)lParam); - } - - LRESULT OnDeleteItem(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->SetMsgHandled(TRUE); - pT->DeleteItem((LPDELETEITEMSTRUCT)lParam); - bHandled = pT->IsMsgHandled(); - return (LRESULT)TRUE; - } - -// Overrideables - void DrawItem(LPDRAWITEMSTRUCT /*lpDrawItemStruct*/) - { - // must be implemented - ATLASSERT(FALSE); - } - - void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) - { - if(lpMeasureItemStruct->CtlType != ODT_MENU) - { - // return default height for a system font - T* pT = static_cast(this); - HWND hWnd = pT->GetDlgItem(lpMeasureItemStruct->CtlID); - CClientDC dc(hWnd); - TEXTMETRIC tm = { 0 }; - dc.GetTextMetrics(&tm); - - lpMeasureItemStruct->itemHeight = tm.tmHeight; - } - else - lpMeasureItemStruct->itemHeight = ::GetSystemMetrics(SM_CYMENU); - } - - int CompareItem(LPCOMPAREITEMSTRUCT /*lpCompareItemStruct*/) - { - // all items are equal - return 0; - } - - void DeleteItem(LPDELETEITEMSTRUCT /*lpDeleteItemStruct*/) - { - // default - nothing - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Update UI macros - -// these build the Update UI map inside a class definition -#define BEGIN_UPDATE_UI_MAP(thisClass) \ - static const CUpdateUIBase::_AtlUpdateUIMap* GetUpdateUIMap() \ - { \ - static const _AtlUpdateUIMap theMap[] = \ - { - -#define UPDATE_ELEMENT(nID, wType) \ - { nID, wType }, - -#define END_UPDATE_UI_MAP() \ - { (WORD)-1, 0 } \ - }; \ - return theMap; \ - } - -/////////////////////////////////////////////////////////////////////////////// -// CUpdateUI - manages UI elements updating - -class CUpdateUIBase -{ -public: - // constants - enum - { - // UI element type - UPDUI_MENUPOPUP = 0x0001, - UPDUI_MENUBAR = 0x0002, - UPDUI_CHILDWINDOW = 0x0004, - UPDUI_TOOLBAR = 0x0008, - UPDUI_STATUSBAR = 0x0010, - // state - UPDUI_ENABLED = 0x0000, - UPDUI_DISABLED = 0x0100, - UPDUI_CHECKED = 0x0200, - UPDUI_CHECKED2 = 0x0400, - UPDUI_RADIO = 0x0800, - UPDUI_DEFAULT = 0x1000, - UPDUI_TEXT = 0x2000, - // internal state - UPDUI_CLEARDEFAULT = 0x4000, - }; - - // element data - struct _AtlUpdateUIElement - { - HWND m_hWnd; - WORD m_wType; - - bool operator ==(const _AtlUpdateUIElement& e) const - { return (m_hWnd == e.m_hWnd && m_wType == e.m_wType); } - }; - - // map data - struct _AtlUpdateUIMap - { - WORD m_nID; - WORD m_wType; - - bool operator ==(const _AtlUpdateUIMap& e) const - { return (m_nID == e.m_nID && m_wType == e.m_wType); } - }; - - // instance data - struct _AtlUpdateUIData - { - WORD m_wState; - union - { - void* m_lpData; - LPTSTR m_lpstrText; - struct - { - WORD m_nIDFirst; - WORD m_nIDLast; - }; - }; - - bool operator ==(const _AtlUpdateUIData& e) const - { return (m_wState == e.m_wState && m_lpData == e.m_lpData); } - }; - - ATL::CSimpleArray<_AtlUpdateUIElement> m_UIElements; // elements data - const _AtlUpdateUIMap* m_pUIMap; // static UI data - _AtlUpdateUIData* m_pUIData; // instance UI data - WORD m_wDirtyType; // global dirty flag - - bool m_bBlockAccelerators; - - -// Constructor, destructor - CUpdateUIBase() : m_pUIMap(NULL), m_pUIData(NULL), m_wDirtyType(0), m_bBlockAccelerators(false) - { } - - ~CUpdateUIBase() - { - if(m_pUIMap != NULL && m_pUIData != NULL) - { - const _AtlUpdateUIMap* pUIMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - while(pUIMap->m_nID != (WORD)-1) - { - if(pUIData->m_wState & UPDUI_TEXT) - delete [] pUIData->m_lpstrText; - pUIMap++; - pUIData++; - } - delete [] m_pUIData; - } - } - -// Check for disabled commands - bool UIGetBlockAccelerators() const - { - return m_bBlockAccelerators; - } - - bool UISetBlockAccelerators(bool bBlock) - { - bool bOld = m_bBlockAccelerators; - m_bBlockAccelerators = bBlock; - return bOld; - } - -// Add elements - BOOL UIAddMenuBar(HWND hWnd) // menu bar (main menu) - { - if(hWnd == NULL) - return FALSE; - _AtlUpdateUIElement e; - e.m_hWnd = hWnd; - e.m_wType = UPDUI_MENUBAR; - return m_UIElements.Add(e); - } - - BOOL UIAddToolBar(HWND hWnd) // toolbar - { - if(hWnd == NULL) - return FALSE; - _AtlUpdateUIElement e; - e.m_hWnd = hWnd; - e.m_wType = UPDUI_TOOLBAR; - return m_UIElements.Add(e); - } - - BOOL UIAddStatusBar(HWND hWnd) // status bar - { - if(hWnd == NULL) - return FALSE; - _AtlUpdateUIElement e; - e.m_hWnd = hWnd; - e.m_wType = UPDUI_STATUSBAR; - return m_UIElements.Add(e); - } - - BOOL UIAddChildWindowContainer(HWND hWnd) // child window - { - if(hWnd == NULL) - return FALSE; - _AtlUpdateUIElement e; - e.m_hWnd = hWnd; - e.m_wType = UPDUI_CHILDWINDOW; - return m_UIElements.Add(e); - } - -// Message map for popup menu updates and accelerator blocking - BEGIN_MSG_MAP(CUpdateUIBase) - MESSAGE_HANDLER(WM_INITMENUPOPUP, OnInitMenuPopup) - MESSAGE_HANDLER(WM_COMMAND, OnCommand) - END_MSG_MAP() - - LRESULT OnInitMenuPopup(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - bHandled = FALSE; - HMENU hMenu = (HMENU)wParam; - if(hMenu == NULL) - return 1; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return 1; - const _AtlUpdateUIMap* pMap = m_pUIMap; - while(pMap->m_nID != (WORD)-1) - { - if(pMap->m_wType & UPDUI_MENUPOPUP) - { - UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu); - - if((pUIData->m_wState & UPDUI_RADIO) != 0) - ::CheckMenuRadioItem(hMenu, pUIData->m_nIDFirst, pUIData->m_nIDLast, pMap->m_nID, MF_BYCOMMAND); - } - pMap++; - pUIData++; - } - return 0; - } - - LRESULT OnCommand(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - bHandled = FALSE; - if(m_bBlockAccelerators && HIWORD(wParam) == 1) // accelerators only - { - int nID = LOWORD(wParam); - if((UIGetState(nID) & UPDUI_DISABLED) == UPDUI_DISABLED) - { - ATLTRACE2(atlTraceUI, 0, _T("CUpdateUIBase::OnCommand - blocked disabled command 0x%4.4X\n"), nID); - bHandled = TRUE; // eat the command, UI item is disabled - } - } - return 0; - } - -// methods for setting UI element state - BOOL UIEnable(int nID, BOOL bEnable, BOOL bForceUpdate = FALSE) - { - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) - { - if(nID == (int)pMap->m_nID) - { - if(bEnable) - { - if(pUIData->m_wState & UPDUI_DISABLED) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState &= ~UPDUI_DISABLED; - } - } - else - { - if(!(pUIData->m_wState & UPDUI_DISABLED)) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState |= UPDUI_DISABLED; - } - } - - if(bForceUpdate) - pUIData->m_wState |= pMap->m_wType; - if(pUIData->m_wState & pMap->m_wType) - m_wDirtyType |= pMap->m_wType; - - break; // found - } - } - - return TRUE; - } - - BOOL UISetCheck(int nID, int nCheck, BOOL bForceUpdate = FALSE) - { - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) - { - if(nID == (int)pMap->m_nID) - { - switch(nCheck) - { - case 0: - if((pUIData->m_wState & UPDUI_CHECKED) || (pUIData->m_wState & UPDUI_CHECKED2)) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState &= ~(UPDUI_CHECKED | UPDUI_CHECKED2); - } - break; - case 1: - if(!(pUIData->m_wState & UPDUI_CHECKED)) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState &= ~UPDUI_CHECKED2; - pUIData->m_wState |= UPDUI_CHECKED; - } - break; - case 2: - if(!(pUIData->m_wState & UPDUI_CHECKED2)) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState &= ~UPDUI_CHECKED; - pUIData->m_wState |= UPDUI_CHECKED2; - } - break; - } - - if(bForceUpdate) - pUIData->m_wState |= pMap->m_wType; - if(pUIData->m_wState & pMap->m_wType) - m_wDirtyType |= pMap->m_wType; - - break; // found - } - } - - return TRUE; - } - - // variant that supports bool (checked/not-checked, no intermediate state) - BOOL UISetCheck(int nID, bool bCheck, BOOL bForceUpdate = FALSE) - { - return UISetCheck(nID, bCheck ? 1 : 0, bForceUpdate); - } - - BOOL UISetRadio(int nID, BOOL bRadio, BOOL bForceUpdate = FALSE) - { - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) - { - if(nID == (int)pMap->m_nID) - { - if(bRadio) - { - if(!(pUIData->m_wState & UPDUI_RADIO)) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState |= UPDUI_RADIO; - } - } - else - { - if(pUIData->m_wState & UPDUI_RADIO) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState &= ~UPDUI_RADIO; - } - } - - if(bForceUpdate) - pUIData->m_wState |= pMap->m_wType; - if(pUIData->m_wState & pMap->m_wType) - m_wDirtyType |= pMap->m_wType; - - break; // found - } - } - - return TRUE; - } - - // for menu items - BOOL UISetRadioMenuItem(int nID, int nIDFirst, int nIDLast, BOOL bForceUpdate = FALSE) - { - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) - { - if(nID == (int)pMap->m_nID) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState |= UPDUI_RADIO; - pUIData->m_nIDFirst = (WORD)nIDFirst; - pUIData->m_nIDLast = (WORD)nIDLast; - - if(bForceUpdate) - pUIData->m_wState |= pMap->m_wType; - if(pUIData->m_wState & pMap->m_wType) - m_wDirtyType |= pMap->m_wType; - } - else if(pMap->m_nID >= nIDFirst && pMap->m_nID <= nIDLast) - { - if(pUIData->m_wState & UPDUI_RADIO) - { - pUIData->m_wState &= ~pMap->m_wType; - pUIData->m_wState &= ~UPDUI_RADIO; - pUIData->m_nIDFirst = 0; - pUIData->m_nIDLast = 0; - } - } - - if(pMap->m_nID == nIDLast) - break; - } - - return TRUE; - } - - BOOL UISetText(int nID, LPCTSTR lpstrText, BOOL bForceUpdate = FALSE) - { - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - if(lpstrText == NULL) - lpstrText = _T(""); - - for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) - { - if(nID == (int)pMap->m_nID) - { - if(pUIData->m_lpstrText == NULL || lstrcmp(pUIData->m_lpstrText, lpstrText)) - { - delete [] pUIData->m_lpstrText; - pUIData->m_lpstrText = NULL; - int nStrLen = lstrlen(lpstrText); - ATLTRY(pUIData->m_lpstrText = new TCHAR[nStrLen + 1]); - if(pUIData->m_lpstrText == NULL) - { - ATLTRACE2(atlTraceUI, 0, _T("UISetText - memory allocation failed\n")); - break; - } - SecureHelper::strcpy_x(pUIData->m_lpstrText, nStrLen + 1, lpstrText); - pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType); - } - - if(bForceUpdate) - pUIData->m_wState |= (UPDUI_TEXT | pMap->m_wType); - if(pUIData->m_wState & pMap->m_wType) - m_wDirtyType |= pMap->m_wType; - - break; // found - } - } - - return TRUE; - } - - BOOL UISetDefault(int nID, BOOL bDefault, BOOL bForceUpdate = FALSE) - { - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) - { - if(nID == (int)pMap->m_nID) - { - if(bDefault) - { - if((pUIData->m_wState & UPDUI_DEFAULT) == 0) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState |= UPDUI_DEFAULT; - } - } - else - { - if((pUIData->m_wState & UPDUI_DEFAULT) != 0) - { - pUIData->m_wState |= pMap->m_wType; - pUIData->m_wState &= ~UPDUI_DEFAULT; - pUIData->m_wState |= UPDUI_CLEARDEFAULT; - } - } - - if(bForceUpdate) - pUIData->m_wState |= pMap->m_wType; - if(pUIData->m_wState & pMap->m_wType) - m_wDirtyType |= pMap->m_wType; - - break; // found - } - } - - return TRUE; - } - -// methods for complete state set/get - BOOL UISetState(int nID, DWORD dwState) - { - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) - { - if(nID == (int)pMap->m_nID) - { - pUIData->m_wState = (WORD)(dwState | pMap->m_wType); - m_wDirtyType |= pMap->m_wType; - break; // found - } - } - return TRUE; - } - - DWORD UIGetState(int nID) - { - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return 0; - for( ; pMap->m_nID != (WORD)-1; pMap++, pUIData++) - { - if(nID == (int)pMap->m_nID) - return pUIData->m_wState; - } - return 0; - } - -// methods for updating UI -#ifndef _WIN32_WCE - BOOL UIUpdateMenuBar(BOOL bForceUpdate = FALSE, BOOL bMainMenu = FALSE) - { - if(!(m_wDirtyType & UPDUI_MENUBAR) && !bForceUpdate) - return TRUE; - - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - while(pMap->m_nID != (WORD)-1) - { - for(int i = 0; i < m_UIElements.GetSize(); i++) - { - if(m_UIElements[i].m_wType == UPDUI_MENUBAR) - { - HMENU hMenu = ::GetMenu(m_UIElements[i].m_hWnd); - if(hMenu != NULL && (pUIData->m_wState & UPDUI_MENUBAR) && (pMap->m_wType & UPDUI_MENUBAR)) - UIUpdateMenuBarElement(pMap->m_nID, pUIData, hMenu); - } - if(bMainMenu) - ::DrawMenuBar(m_UIElements[i].m_hWnd); - } - pMap++; - pUIData->m_wState &= ~UPDUI_MENUBAR; - if(pUIData->m_wState & UPDUI_TEXT) - { - delete [] pUIData->m_lpstrText; - pUIData->m_lpstrText = NULL; - pUIData->m_wState &= ~UPDUI_TEXT; - } - pUIData++; - } - - m_wDirtyType &= ~UPDUI_MENUBAR; - return TRUE; - } -#endif // !_WIN32_WCE - - BOOL UIUpdateToolBar(BOOL bForceUpdate = FALSE) - { - if(!(m_wDirtyType & UPDUI_TOOLBAR) && !bForceUpdate) - return TRUE; - - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - while(pMap->m_nID != (WORD)-1) - { - for(int i = 0; i < m_UIElements.GetSize(); i++) - { - if(m_UIElements[i].m_wType == UPDUI_TOOLBAR) - { - if((pUIData->m_wState & UPDUI_TOOLBAR) && (pMap->m_wType & UPDUI_TOOLBAR)) - UIUpdateToolBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd); - } - } - pMap++; - pUIData->m_wState &= ~UPDUI_TOOLBAR; - pUIData++; - } - - m_wDirtyType &= ~UPDUI_TOOLBAR; - return TRUE; - } - - BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE) - { - if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate) - return TRUE; - - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - while(pMap->m_nID != (WORD)-1) - { - for(int i = 0; i < m_UIElements.GetSize(); i++) - { - if(m_UIElements[i].m_wType == UPDUI_STATUSBAR) - { - if((pUIData->m_wState & UPDUI_STATUSBAR) && (pMap->m_wType & UPDUI_STATUSBAR)) - UIUpdateStatusBarElement(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd); - } - } - pMap++; - pUIData->m_wState &= ~UPDUI_STATUSBAR; - if(pUIData->m_wState & UPDUI_TEXT) - { - delete [] pUIData->m_lpstrText; - pUIData->m_lpstrText = NULL; - pUIData->m_wState &= ~UPDUI_TEXT; - } - pUIData++; - } - - m_wDirtyType &= ~UPDUI_STATUSBAR; - return TRUE; - } - - BOOL UIUpdateChildWindows(BOOL bForceUpdate = FALSE) - { - if(!(m_wDirtyType & UPDUI_CHILDWINDOW) && !bForceUpdate) - return TRUE; - - const _AtlUpdateUIMap* pMap = m_pUIMap; - _AtlUpdateUIData* pUIData = m_pUIData; - if(pUIData == NULL) - return FALSE; - - while(pMap->m_nID != (WORD)-1) - { - for(int i = 0; i < m_UIElements.GetSize(); i++) - { - if(m_UIElements[i].m_wType == UPDUI_CHILDWINDOW) - { - if((pUIData->m_wState & UPDUI_CHILDWINDOW) && (pMap->m_wType & UPDUI_CHILDWINDOW)) - UIUpdateChildWindow(pMap->m_nID, pUIData, m_UIElements[i].m_hWnd); - } - } - pMap++; - pUIData->m_wState &= ~UPDUI_CHILDWINDOW; - if(pUIData->m_wState & UPDUI_TEXT) - { - delete [] pUIData->m_lpstrText; - pUIData->m_lpstrText = NULL; - pUIData->m_wState &= ~UPDUI_TEXT; - } - pUIData++; - } - - m_wDirtyType &= ~UPDUI_CHILDWINDOW; - return TRUE; - } - -// internal element specific methods - static void UIUpdateMenuBarElement(int nID, _AtlUpdateUIData* pUIData, HMENU hMenu) - { -#ifndef _WIN32_WCE - if((pUIData->m_wState & UPDUI_CLEARDEFAULT) != 0) - { - ::SetMenuDefaultItem(hMenu, (UINT)-1, 0); - pUIData->m_wState &= ~UPDUI_CLEARDEFAULT; - } -#endif // !_WIN32_WCE - - CMenuItemInfo mii; - mii.fMask = MIIM_STATE; - mii.wID = nID; - -#ifndef _WIN32_WCE - if((pUIData->m_wState & UPDUI_DISABLED) != 0) - mii.fState |= MFS_DISABLED | MFS_GRAYED; - else - mii.fState |= MFS_ENABLED; - - if((pUIData->m_wState & UPDUI_CHECKED) != 0) - mii.fState |= MFS_CHECKED; - else - mii.fState |= MFS_UNCHECKED; - - if((pUIData->m_wState & UPDUI_DEFAULT) != 0) - mii.fState |= MFS_DEFAULT; -#else // CE specific - // ::SetMenuItemInfo() can't disable or check menu items - // on Windows CE, so we have to do that directly - UINT uEnable = MF_BYCOMMAND; - if((pUIData->m_wState & UPDUI_DISABLED) != 0) - uEnable |= MF_GRAYED; - else - uEnable |= MF_ENABLED; - ::EnableMenuItem(hMenu, nID, uEnable); - - UINT uCheck = MF_BYCOMMAND; - if((pUIData->m_wState & UPDUI_CHECKED) != 0) - uCheck |= MF_CHECKED; - else - uCheck |= MF_UNCHECKED; - ::CheckMenuItem(hMenu, nID, uCheck); -#endif // _WIN32_WCE - - if((pUIData->m_wState & UPDUI_TEXT) != 0) - { - CMenuItemInfo miiNow; - miiNow.fMask = MIIM_TYPE; - miiNow.wID = nID; - if(::GetMenuItemInfo(hMenu, nID, FALSE, &miiNow)) - { - mii.fMask |= MIIM_TYPE; - // MFT_BITMAP and MFT_SEPARATOR don't go together with MFT_STRING -#ifndef _WIN32_WCE - mii.fType |= (miiNow.fType & ~(MFT_BITMAP | MFT_SEPARATOR)) | MFT_STRING; -#else // CE specific - mii.fType |= (miiNow.fType & ~(MFT_SEPARATOR)) | MFT_STRING; -#endif // _WIN32_WCE - mii.dwTypeData = pUIData->m_lpstrText; - } - } - - ::SetMenuItemInfo(hMenu, nID, FALSE, &mii); - } - - static void UIUpdateToolBarElement(int nID, _AtlUpdateUIData* pUIData, HWND hWndToolBar) - { - // Note: only handles enabled/disabled, checked state, and radio (press) - ::SendMessage(hWndToolBar, TB_ENABLEBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE); - ::SendMessage(hWndToolBar, TB_CHECKBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED) ? TRUE : FALSE); - ::SendMessage(hWndToolBar, TB_INDETERMINATE, nID, (LPARAM)(pUIData->m_wState & UPDUI_CHECKED2) ? TRUE : FALSE); - ::SendMessage(hWndToolBar, TB_PRESSBUTTON, nID, (LPARAM)(pUIData->m_wState & UPDUI_RADIO) ? TRUE : FALSE); - } - - static void UIUpdateStatusBarElement(int nID, _AtlUpdateUIData* pUIData, HWND hWndStatusBar) - { - // Note: only handles text - if(pUIData->m_wState & UPDUI_TEXT) - ::SendMessage(hWndStatusBar, SB_SETTEXT, nID, (LPARAM)pUIData->m_lpstrText); - } - - static void UIUpdateChildWindow(int nID, _AtlUpdateUIData* pUIData, HWND hWnd) - { - HWND hChild = ::GetDlgItem(hWnd, nID); - - ::EnableWindow(hChild, (pUIData->m_wState & UPDUI_DISABLED) ? FALSE : TRUE); - // for check and radio, assume that window is a button - int nCheck = BST_UNCHECKED; - if(pUIData->m_wState & UPDUI_CHECKED || pUIData->m_wState & UPDUI_RADIO) - nCheck = BST_CHECKED; - else if(pUIData->m_wState & UPDUI_CHECKED2) - nCheck = BST_INDETERMINATE; - ::SendMessage(hChild, BM_SETCHECK, nCheck, 0L); - if(pUIData->m_wState & UPDUI_DEFAULT) - { - DWORD dwRet = (DWORD)::SendMessage(hWnd, DM_GETDEFID, 0, 0L); - if(HIWORD(dwRet) == DC_HASDEFID) - { - HWND hOldDef = ::GetDlgItem(hWnd, (int)(short)LOWORD(dwRet)); - // remove BS_DEFPUSHBUTTON - ::SendMessage(hOldDef, BM_SETSTYLE, BS_PUSHBUTTON, MAKELPARAM(TRUE, 0)); - } - ::SendMessage(hWnd, DM_SETDEFID, nID, 0L); - } - if(pUIData->m_wState & UPDUI_TEXT) - ::SetWindowText(hChild, pUIData->m_lpstrText); - } -}; - -template -class CUpdateUI : public CUpdateUIBase -{ -public: - CUpdateUI() - { - T* pT = static_cast(this); - pT; - const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap(); - m_pUIMap = pMap; - ATLASSERT(m_pUIMap != NULL); - int nCount; - for(nCount = 1; pMap->m_nID != (WORD)-1; nCount++) - pMap++; - - // check for duplicates (debug only) -#ifdef _DEBUG - for(int i = 0; i < nCount; i++) - { - for(int j = 0; j < nCount; j++) - { - // shouldn't have duplicates in the update UI map - if(i != j) - ATLASSERT(m_pUIMap[j].m_nID != m_pUIMap[i].m_nID); - } - } -#endif // _DEBUG - - ATLTRY(m_pUIData = new _AtlUpdateUIData[nCount]); - ATLASSERT(m_pUIData != NULL); - - if(m_pUIData != NULL) - memset(m_pUIData, 0, sizeof(_AtlUpdateUIData) * nCount); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CDynamicUpdateUI - allows update elements to dynamically added and removed -// in addition to a static update UI map - -template -class CDynamicUpdateUI : public CUpdateUIBase -{ -public: -// Data members - ATL::CSimpleArray<_AtlUpdateUIMap> m_arrUIMap; // copy of the static UI data - ATL::CSimpleArray<_AtlUpdateUIData> m_arrUIData; // instance UI data - -// Constructor/destructor - CDynamicUpdateUI() - { - T* pT = static_cast(this); - pT; - const _AtlUpdateUIMap* pMap = pT->GetUpdateUIMap(); - ATLASSERT(pMap != NULL); - - for(;;) - { - BOOL bRet = m_arrUIMap.Add(*(_AtlUpdateUIMap*)pMap); - ATLASSERT(bRet); - - if(bRet != FALSE) - { - _AtlUpdateUIData data = { 0, NULL }; - bRet = m_arrUIData.Add(data); - ATLASSERT(bRet); - } - - if(pMap->m_nID == (WORD)-1) - break; - - pMap++; - } - - ATLASSERT(m_arrUIMap.GetSize() == m_arrUIData.GetSize()); - -#ifdef _DEBUG - // check for duplicates (debug only) - for(int i = 0; i < m_arrUIMap.GetSize(); i++) - { - for(int j = 0; j < m_arrUIMap.GetSize(); j++) - { - // shouldn't have duplicates in the update UI map - if(i != j) - ATLASSERT(m_arrUIMap[j].m_nID != m_arrUIMap[i].m_nID); - } - } -#endif // _DEBUG - - // Set internal data pointers to point to the new data arrays - m_pUIMap = m_arrUIMap.m_aT; - m_pUIData = m_arrUIData.m_aT; - } - - ~CDynamicUpdateUI() - { - for(int i = 0; i < m_arrUIData.GetSize(); i++) - { - if((m_arrUIData[i].m_wState & UPDUI_TEXT) != 0) - delete [] m_arrUIData[i].m_lpstrText; - } - - // Reset internal data pointers (memory will be released by CSimpleArray d-tor) - m_pUIMap = NULL; - m_pUIData = NULL; - } - -// Methods for dynamically adding and removing update elements - bool UIAddUpdateElement(WORD nID, WORD wType) - { - // check for duplicates - for(int i = 0; i < m_arrUIMap.GetSize(); i++) - { - // shouldn't have duplicates in the update UI map - ATLASSERT(m_arrUIMap[i].m_nID != nID); - if(m_arrUIMap[i].m_nID == nID) - return false; - } - - bool bRetVal = false; - - // Add new end element - _AtlUpdateUIMap uumEnd = { (WORD)-1, 0 }; - BOOL bRet = m_arrUIMap.Add(uumEnd); - ATLASSERT(bRet); - - if(bRet != FALSE) - { - _AtlUpdateUIData uud = { 0, NULL }; - bRet = m_arrUIData.Add(uud); - ATLASSERT(bRet); - - // Set new data to the previous end element - if(bRet != FALSE) - { - int nSize = m_arrUIMap.GetSize(); - _AtlUpdateUIMap uum = { nID, wType }; - m_arrUIMap.SetAtIndex(nSize - 2, uum); - m_arrUIData.SetAtIndex(nSize - 2, uud); - - // Set internal data pointers again, just in case that memory moved - m_pUIMap = m_arrUIMap.m_aT; - m_pUIData = m_arrUIData.m_aT; - - bRetVal = true; - } - } - - return bRetVal; - } - - bool UIRemoveUpdateElement(WORD nID) - { - bool bRetVal = false; - - for(int i = 0; i < m_arrUIMap.GetSize(); i++) - { - if(m_arrUIMap[i].m_nID == nID) - { - BOOL bRet = m_arrUIMap.RemoveAt(i); - ATLASSERT(bRet); - bRet = m_arrUIData.RemoveAt(i); - ATLASSERT(bRet); - - bRetVal = true; - break; - } - } - - return bRetVal; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAutoUpdateUI : Automatic mapping of UI elements - -template -class CAutoUpdateUI : public CDynamicUpdateUI -{ -public: - LPCTSTR UIGetText(int nID) - { - for(int i = 0; i < m_arrUIMap.GetSize(); i++) - { - if(m_arrUIMap[i].m_nID == nID) - return m_arrUIData[i].m_lpstrText; - } - - return NULL; - } - -// Element - template - bool UIAddElement(UINT nID) - { - // check for existing UI map element - for(int i = 0; i < m_arrUIMap.GetSize(); i++) - { - if(m_arrUIMap[i].m_nID == nID) - { - // set requested type - m_arrUIMap[i].m_wType |= t_wType; - return true; - } - } - - // Add element to UI map with requested type - return UIAddUpdateElement((WORD)nID, t_wType); - } - - template - bool UIRemoveElement(UINT nID) - { - for(int i = 0; i < m_arrUIMap.GetSize(); i++) - { - if(m_arrUIMap[i].m_nID == nID) // matching UI map element - { - WORD wType = m_arrUIMap[i].m_wType & ~t_wType; - if (wType) // has other types - { - m_arrUIMap[i].m_wType = wType; // keep other types - return true; - } - else - { - return UIRemoveUpdateElement((WORD)nID); - } - } - } - - return false; - } - -// Menu - bool UIAddMenu(HMENU hMenu, bool bSetText = false) - { -#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) - using ATL::GetMenuString; -#endif - ATLASSERT(::IsMenu(hMenu)); - MENUITEMINFO mii = {sizeof(MENUITEMINFO), MIIM_TYPE | MIIM_ID | MIIM_SUBMENU}; - - // Complete the UI map - for (INT uItem = 0; CMenuHandle(hMenu).GetMenuItemInfo(uItem, TRUE, &mii); uItem++) - { - if(mii.hSubMenu) - { - // Add submenu to UI map - UIAddMenu(mii.hSubMenu, bSetText); - } - else if (mii.wID) - { - // Add element to UI map - UIAddElement(mii.wID); -#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) - if (bSetText) - { - TCHAR sText[64] = { 0 }; - if (GetMenuString(hMenu, uItem, sText, 64, MF_BYPOSITION)) - UISetText(mii.wID, sText); - } -#else - bSetText; -#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) - } - } - - return true; - } - - bool UIAddMenu(UINT uID, bool bSetText = false) - { - CMenu menu; - ATLVERIFY(menu.LoadMenu(uID)); - return UIAddMenu(menu, bSetText); - } - -// ToolBar -#ifndef BTNS_SEP - #define BTNS_SEP TBSTYLE_SEP -#endif // BTNS_SEP compatibility - -#if !defined(_WIN32_WCE) || (defined(_AUTOUI_CE_TOOLBAR) && defined(TBIF_BYINDEX)) - bool UIAddToolBar(HWND hWndToolBar) - { - ATLASSERT(::IsWindow(hWndToolBar)); - TBBUTTONINFO tbbi = {sizeof TBBUTTONINFO, TBIF_COMMAND | TBIF_STYLE | TBIF_BYINDEX}; - - // Add toolbar buttons - for (int uItem = 0; ::SendMessage(hWndToolBar, TB_GETBUTTONINFO, uItem, (LPARAM)&tbbi) != -1; uItem++) - { - if (tbbi.fsStyle ^ BTNS_SEP) - UIAddElement(tbbi.idCommand); - } - - // Add embedded controls if any - if (::GetWindow(hWndToolBar, GW_CHILD)) - UIAddChildWindowContainer(hWndToolBar); - - return (CUpdateUIBase::UIAddToolBar(hWndToolBar) != FALSE); - } -#endif // !defined(_WIN32_WCE) || (defined(_AUTOUI_CE_TOOLBAR) && defined(TBIF_BYINDEX)) - -// Container - bool UIAddChildWindowContainer(HWND hWnd) - { - ATLASSERT(::IsWindow(hWnd)); - - // Add children controls if any - for (ATL::CWindow wCtl = ::GetWindow(hWnd, GW_CHILD); wCtl.IsWindow(); wCtl = wCtl.GetWindow(GW_HWNDNEXT)) - { - if (int id = wCtl.GetDlgCtrlID()) - UIAddElement(id); - } - - return (CUpdateUIBase::UIAddChildWindowContainer(hWnd) != FALSE); - } - -// StatusBar - BOOL UIUpdateStatusBar(BOOL bForceUpdate = FALSE) - { - if(!(m_wDirtyType & UPDUI_STATUSBAR) && !bForceUpdate) - return TRUE; - - for(int i = 0; i < m_arrUIMap.GetSize(); i++) - { - for(int e = 0; e < m_UIElements.GetSize(); e++) - { - if((m_UIElements[e].m_wType == UPDUI_STATUSBAR) && - (m_arrUIMap[i].m_wType & UPDUI_STATUSBAR) && - (m_arrUIData[i].m_wState & UPDUI_STATUSBAR)) - { - UIUpdateStatusBarElement(m_arrUIMap[i].m_nID, &m_arrUIData[i], m_UIElements[e].m_hWnd); - m_arrUIData[i].m_wState &= ~UPDUI_STATUSBAR; - if(m_arrUIData[i].m_wState & UPDUI_TEXT) - m_arrUIData[i].m_wState &= ~UPDUI_TEXT; - } - } - } - - m_wDirtyType &= ~UPDUI_STATUSBAR; - return TRUE; - } - - bool UIAddStatusBar(HWND hWndStatusBar, INT nPanes = 1) - { - ATLASSERT(::IsWindow(hWndStatusBar)); - - // Add StatusBar panes - for (int iPane = 0; iPane < nPanes; iPane++) - UIAddElement(ID_DEFAULT_PANE + iPane); - - return (CUpdateUIBase::UIAddStatusBar(hWndStatusBar) != FALSE); - } - -// UI Map used if derived class has none - BEGIN_UPDATE_UI_MAP(CAutoUpdateUI) - END_UPDATE_UI_MAP() -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CDialogResize - provides support for resizing dialog controls -// (works for any window that has child controls) - -// Put CDialogResize in the list of base classes for a dialog (or even plain window), -// then implement DLGRESIZE map by specifying controls and groups of control -// and using DLSZ_* values to specify how are they supposed to be resized. -// -// Notes: -// - Resizeable border (WS_THICKFRAME style) should be set in the dialog template -// for top level dialogs (popup or overlapped), so that users can resize the dialog. -// - Some flags cannot be combined; for instance DLSZ_CENTER_X overrides DLSZ_SIZE_X, -// DLSZ_SIZE_X overrides DLSZ_MOVE_X. X and Y flags can be combined. -// - Order of controls is important - group controls are resized and moved based -// on the position of the previous control in a group. - -// dialog resize map macros -#define BEGIN_DLGRESIZE_MAP(thisClass) \ - static const _AtlDlgResizeMap* GetDlgResizeMap() \ - { \ - static const _AtlDlgResizeMap theMap[] = \ - { - -#define END_DLGRESIZE_MAP() \ - { -1, 0 }, \ - }; \ - return theMap; \ - } - -#define DLGRESIZE_CONTROL(id, flags) \ - { id, flags }, - -#define BEGIN_DLGRESIZE_GROUP() \ - { -1, _DLSZ_BEGIN_GROUP }, - -#define END_DLGRESIZE_GROUP() \ - { -1, _DLSZ_END_GROUP }, - - -template -class CDialogResize -{ -public: -// Data declarations and members - enum - { - DLSZ_SIZE_X = 0x00000001, - DLSZ_SIZE_Y = 0x00000002, - DLSZ_MOVE_X = 0x00000004, - DLSZ_MOVE_Y = 0x00000008, - DLSZ_REPAINT = 0x00000010, - DLSZ_CENTER_X = 0x00000020, - DLSZ_CENTER_Y = 0x00000040, - - // internal use only - _DLSZ_BEGIN_GROUP = 0x00001000, - _DLSZ_END_GROUP = 0x00002000, - _DLSZ_GRIPPER = 0x00004000 - }; - - struct _AtlDlgResizeMap - { - int m_nCtlID; - DWORD m_dwResizeFlags; - }; - - struct _AtlDlgResizeData - { - int m_nCtlID; - DWORD m_dwResizeFlags; - RECT m_rect; - - int GetGroupCount() const - { - return (int)LOBYTE(HIWORD(m_dwResizeFlags)); - } - - void SetGroupCount(int nCount) - { - ATLASSERT(nCount > 0 && nCount < 256); - DWORD dwCount = (DWORD)MAKELONG(0, MAKEWORD(nCount, 0)); - m_dwResizeFlags &= 0xFF00FFFF; - m_dwResizeFlags |= dwCount; - } - - bool operator ==(const _AtlDlgResizeData& r) const - { return (m_nCtlID == r.m_nCtlID && m_dwResizeFlags == r.m_dwResizeFlags); } - }; - - ATL::CSimpleArray<_AtlDlgResizeData> m_arrData; - SIZE m_sizeDialog; - POINT m_ptMinTrackSize; - bool m_bGripper; - - -// Constructor - CDialogResize() : m_bGripper(false) - { - m_sizeDialog.cx = 0; - m_sizeDialog.cy = 0; - m_ptMinTrackSize.x = -1; - m_ptMinTrackSize.y = -1; - } - -// Operations - void DlgResize_Init(bool bAddGripper = true, bool bUseMinTrackSize = true, DWORD dwForceStyle = WS_CLIPCHILDREN) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - DWORD dwStyle = pT->GetStyle(); - -#ifdef _DEBUG - // Debug only: Check if top level dialogs have a resizeable border. - if(((dwStyle & WS_CHILD) == 0) && ((dwStyle & WS_THICKFRAME) == 0)) - ATLTRACE2(atlTraceUI, 0, _T("DlgResize_Init - warning: top level dialog without the WS_THICKFRAME style - user cannot resize it\n")); -#endif // _DEBUG - - // Force specified styles (default WS_CLIPCHILDREN reduces flicker) - if((dwStyle & dwForceStyle) != dwForceStyle) - pT->ModifyStyle(0, dwForceStyle); - - // Adding this style removes an empty icon that dialogs with WS_THICKFRAME have. - // Setting icon to NULL is required when XP themes are active. - // Note: This will not prevent adding an icon for the dialog using SetIcon() - if((dwStyle & WS_CHILD) == 0) - { - pT->ModifyStyleEx(0, WS_EX_DLGMODALFRAME); - if(pT->GetIcon(FALSE) == NULL) - pT->SetIcon(NULL, FALSE); - } - - // Cleanup in case of multiple initialization - // block: first check for the gripper control, destroy it if needed - { - ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR); - if(wndGripper.IsWindow() && m_arrData.GetSize() > 0 && (m_arrData[0].m_dwResizeFlags & _DLSZ_GRIPPER) != 0) - wndGripper.DestroyWindow(); - } - // clear out everything else - m_arrData.RemoveAll(); - m_sizeDialog.cx = 0; - m_sizeDialog.cy = 0; - m_ptMinTrackSize.x = -1; - m_ptMinTrackSize.y = -1; - - // Get initial dialog client size - RECT rectDlg = { 0 }; - pT->GetClientRect(&rectDlg); - m_sizeDialog.cx = rectDlg.right; - m_sizeDialog.cy = rectDlg.bottom; - -#ifndef _WIN32_WCE - // Create gripper if requested - m_bGripper = false; - if(bAddGripper) - { - // shouldn't exist already - ATLASSERT(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR))); - if(!::IsWindow(pT->GetDlgItem(ATL_IDW_STATUS_BAR))) - { - ATL::CWindow wndGripper; - wndGripper.Create(_T("SCROLLBAR"), pT->m_hWnd, rectDlg, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | SBS_SIZEBOX | SBS_SIZEGRIP | SBS_SIZEBOXBOTTOMRIGHTALIGN, 0, ATL_IDW_STATUS_BAR); - ATLASSERT(wndGripper.IsWindow()); - if(wndGripper.IsWindow()) - { - m_bGripper = true; - RECT rectCtl = { 0 }; - wndGripper.GetWindowRect(&rectCtl); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2); - _AtlDlgResizeData data = { ATL_IDW_STATUS_BAR, DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | _DLSZ_GRIPPER, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } }; - m_arrData.Add(data); - } - } - } -#else // CE specific - bAddGripper; // avoid level 4 warning -#endif // _WIN32_WCE - - // Get min track position if requested - if(bUseMinTrackSize) - { - if((dwStyle & WS_CHILD) != 0) - { - RECT rect = { 0 }; - pT->GetClientRect(&rect); - m_ptMinTrackSize.x = rect.right - rect.left; - m_ptMinTrackSize.y = rect.bottom - rect.top; - } - else - { - RECT rect = { 0 }; - pT->GetWindowRect(&rect); - m_ptMinTrackSize.x = rect.right - rect.left; - m_ptMinTrackSize.y = rect.bottom - rect.top; - } - } - - // Walk the map and initialize data - const _AtlDlgResizeMap* pMap = pT->GetDlgResizeMap(); - ATLASSERT(pMap != NULL); - int nGroupStart = -1; - for(int nCount = 1; !(pMap->m_nCtlID == -1 && pMap->m_dwResizeFlags == 0); nCount++, pMap++) - { - if(pMap->m_nCtlID == -1) - { - switch(pMap->m_dwResizeFlags) - { - case _DLSZ_BEGIN_GROUP: - ATLASSERT(nGroupStart == -1); - nGroupStart = m_arrData.GetSize(); - break; - case _DLSZ_END_GROUP: - { - ATLASSERT(nGroupStart != -1); - int nGroupCount = m_arrData.GetSize() - nGroupStart; - m_arrData[nGroupStart].SetGroupCount(nGroupCount); - nGroupStart = -1; - } - break; - default: - ATLASSERT(FALSE && _T("Invalid DLGRESIZE Map Entry")); - break; - } - } - else - { - // this ID conflicts with the default gripper one - ATLASSERT(m_bGripper ? (pMap->m_nCtlID != ATL_IDW_STATUS_BAR) : TRUE); - - ATL::CWindow ctl = pT->GetDlgItem(pMap->m_nCtlID); - ATLASSERT(ctl.IsWindow()); - RECT rectCtl = { 0 }; - ctl.GetWindowRect(&rectCtl); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2); - - DWORD dwGroupFlag = (nGroupStart != -1 && m_arrData.GetSize() == nGroupStart) ? _DLSZ_BEGIN_GROUP : 0; - _AtlDlgResizeData data = { pMap->m_nCtlID, pMap->m_dwResizeFlags | dwGroupFlag, { rectCtl.left, rectCtl.top, rectCtl.right, rectCtl.bottom } }; - m_arrData.Add(data); - } - } - ATLASSERT((nGroupStart == -1) && _T("No End Group Entry in the DLGRESIZE Map")); - } - - void DlgResize_UpdateLayout(int cxWidth, int cyHeight) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - // Restrict minimum size if requested - if(((pT->GetStyle() & WS_CHILD) != 0) && m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1) - { - if(cxWidth < m_ptMinTrackSize.x) - cxWidth = m_ptMinTrackSize.x; - if(cyHeight < m_ptMinTrackSize.y) - cyHeight = m_ptMinTrackSize.y; - } - - BOOL bVisible = pT->IsWindowVisible(); - if(bVisible) - pT->SetRedraw(FALSE); - - for(int i = 0; i < m_arrData.GetSize(); i++) - { - if((m_arrData[i].m_dwResizeFlags & _DLSZ_BEGIN_GROUP) != 0) // start of a group - { - int nGroupCount = m_arrData[i].GetGroupCount(); - ATLASSERT(nGroupCount > 0 && i + nGroupCount - 1 < m_arrData.GetSize()); - RECT rectGroup = m_arrData[i].m_rect; - - int j = 1; - for(j = 1; j < nGroupCount; j++) - { - rectGroup.left = min(rectGroup.left, m_arrData[i + j].m_rect.left); - rectGroup.top = min(rectGroup.top, m_arrData[i + j].m_rect.top); - rectGroup.right = max(rectGroup.right, m_arrData[i + j].m_rect.right); - rectGroup.bottom = max(rectGroup.bottom, m_arrData[i + j].m_rect.bottom); - } - - for(j = 0; j < nGroupCount; j++) - { - _AtlDlgResizeData* pDataPrev = NULL; - if(j > 0) - pDataPrev = &(m_arrData[i + j - 1]); - pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i + j], true, pDataPrev); - } - - i += nGroupCount - 1; // increment to skip all group controls - } - else // one control entry - { - RECT rectGroup = { 0, 0, 0, 0 }; - pT->DlgResize_PositionControl(cxWidth, cyHeight, rectGroup, m_arrData[i], false); - } - } - - if(bVisible) - pT->SetRedraw(TRUE); - - pT->RedrawWindow(NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); - } - -// Message map and handlers - BEGIN_MSG_MAP(CDialogResize) - MESSAGE_HANDLER(WM_SIZE, OnSize) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_GETMINMAXINFO, OnGetMinMaxInfo) -#endif // _WIN32_WCE - END_MSG_MAP() - - LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); -#ifndef _WIN32_WCE - if(m_bGripper) - { - ATL::CWindow wndGripper = pT->GetDlgItem(ATL_IDW_STATUS_BAR); - if(wParam == SIZE_MAXIMIZED) - wndGripper.ShowWindow(SW_HIDE); - else if(wParam == SIZE_RESTORED) - wndGripper.ShowWindow(SW_SHOW); - } -#endif // _WIN32_WCE - if(wParam != SIZE_MINIMIZED) - { - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DlgResize_UpdateLayout(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - } - return 0; - } - -#ifndef _WIN32_WCE - LRESULT OnGetMinMaxInfo(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - if(m_ptMinTrackSize.x != -1 && m_ptMinTrackSize.y != -1) - { - LPMINMAXINFO lpMMI = (LPMINMAXINFO)lParam; - lpMMI->ptMinTrackSize = m_ptMinTrackSize; - } - return 0; - } -#endif // _WIN32_WCE - -// Implementation - bool DlgResize_PositionControl(int cxWidth, int cyHeight, RECT& rectGroup, _AtlDlgResizeData& data, bool bGroup, - _AtlDlgResizeData* pDataPrev = NULL) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - ATL::CWindow ctl; - RECT rectCtl = { 0 }; - - ctl = pT->GetDlgItem(data.m_nCtlID); - if(!ctl.GetWindowRect(&rectCtl)) - return false; - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rectCtl, 2); - - if(bGroup) - { - if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0) - { - int cxRight = rectGroup.right + cxWidth - m_sizeDialog.cx; - int cxCtl = data.m_rect.right - data.m_rect.left; - rectCtl.left = rectGroup.left + (cxRight - rectGroup.left - cxCtl) / 2; - rectCtl.right = rectCtl.left + cxCtl; - } - else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0) - { - rectCtl.left = rectGroup.left + ::MulDiv(data.m_rect.left - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left); - - if((data.m_dwResizeFlags & DLSZ_SIZE_X) != 0) - { - rectCtl.right = rectGroup.left + ::MulDiv(data.m_rect.right - rectGroup.left, rectGroup.right - rectGroup.left + (cxWidth - m_sizeDialog.cx), rectGroup.right - rectGroup.left); - - if(pDataPrev != NULL) - { - ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID); - RECT rcPrev = { 0 }; - ctlPrev.GetWindowRect(&rcPrev); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2); - int dxAdjust = (rectCtl.left - rcPrev.right) - (data.m_rect.left - pDataPrev->m_rect.right); - rcPrev.right += dxAdjust; - ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); - } - } - else - { - rectCtl.right = rectCtl.left + (data.m_rect.right - data.m_rect.left); - } - } - - if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0) - { - int cyBottom = rectGroup.bottom + cyHeight - m_sizeDialog.cy; - int cyCtl = data.m_rect.bottom - data.m_rect.top; - rectCtl.top = rectGroup.top + (cyBottom - rectGroup.top - cyCtl) / 2; - rectCtl.bottom = rectCtl.top + cyCtl; - } - else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0) - { - rectCtl.top = rectGroup.top + ::MulDiv(data.m_rect.top - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top); - - if((data.m_dwResizeFlags & DLSZ_SIZE_Y) != 0) - { - rectCtl.bottom = rectGroup.top + ::MulDiv(data.m_rect.bottom - rectGroup.top, rectGroup.bottom - rectGroup.top + (cyHeight - m_sizeDialog.cy), rectGroup.bottom - rectGroup.top); - - if(pDataPrev != NULL) - { - ATL::CWindow ctlPrev = pT->GetDlgItem(pDataPrev->m_nCtlID); - RECT rcPrev = { 0 }; - ctlPrev.GetWindowRect(&rcPrev); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcPrev, 2); - int dxAdjust = (rectCtl.top - rcPrev.bottom) - (data.m_rect.top - pDataPrev->m_rect.bottom); - rcPrev.bottom += dxAdjust; - ctlPrev.SetWindowPos(NULL, &rcPrev, SWP_NOZORDER | SWP_NOACTIVATE | SWP_NOMOVE); - } - } - else - { - rectCtl.bottom = rectCtl.top + (data.m_rect.bottom - data.m_rect.top); - } - } - } - else // no group - { - if((data.m_dwResizeFlags & DLSZ_CENTER_X) != 0) - { - int cxCtl = data.m_rect.right - data.m_rect.left; - rectCtl.left = (cxWidth - cxCtl) / 2; - rectCtl.right = rectCtl.left + cxCtl; - } - else if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_MOVE_X)) != 0) - { - rectCtl.right = data.m_rect.right + (cxWidth - m_sizeDialog.cx); - - if((data.m_dwResizeFlags & DLSZ_MOVE_X) != 0) - rectCtl.left = rectCtl.right - (data.m_rect.right - data.m_rect.left); - } - - if((data.m_dwResizeFlags & DLSZ_CENTER_Y) != 0) - { - int cyCtl = data.m_rect.bottom - data.m_rect.top; - rectCtl.top = (cyHeight - cyCtl) / 2; - rectCtl.bottom = rectCtl.top + cyCtl; - } - else if((data.m_dwResizeFlags & (DLSZ_SIZE_Y | DLSZ_MOVE_Y)) != 0) - { - rectCtl.bottom = data.m_rect.bottom + (cyHeight - m_sizeDialog.cy); - - if((data.m_dwResizeFlags & DLSZ_MOVE_Y) != 0) - rectCtl.top = rectCtl.bottom - (data.m_rect.bottom - data.m_rect.top); - } - } - - if((data.m_dwResizeFlags & DLSZ_REPAINT) != 0) - ctl.Invalidate(); - - if((data.m_dwResizeFlags & (DLSZ_SIZE_X | DLSZ_SIZE_Y | DLSZ_MOVE_X | DLSZ_MOVE_Y | DLSZ_REPAINT | DLSZ_CENTER_X | DLSZ_CENTER_Y)) != 0) - ctl.SetWindowPos(NULL, &rectCtl, SWP_NOZORDER | SWP_NOACTIVATE); - - return true; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CDoubleBufferImpl - Provides double-buffer painting support to any window - -template -class CDoubleBufferImpl -{ -public: -// Overrideables - void DoPaint(CDCHandle /*dc*/) - { - // must be implemented in a derived class - ATLASSERT(FALSE); - } - -// Message map and handlers - BEGIN_MSG_MAP(CDoubleBufferImpl) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_PAINT, OnPaint) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) -#endif // !_WIN32_WCE - END_MSG_MAP() - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; // no background painting needed - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - if(wParam != NULL) - { - RECT rect = { 0 }; - pT->GetClientRect(&rect); - CMemoryDC dcMem((HDC)wParam, rect); - pT->DoPaint(dcMem.m_hDC); - } - else - { - CPaintDC dc(pT->m_hWnd); - CMemoryDC dcMem(dc.m_hDC, dc.m_ps.rcPaint); - pT->DoPaint(dcMem.m_hDC); - } - - return 0; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CDoubleBufferWindowImpl - Implements a double-buffer painting window - -template -class ATL_NO_VTABLE CDoubleBufferWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CDoubleBufferImpl< T > -{ -public: - BEGIN_MSG_MAP(CDoubleBufferWindowImpl) - CHAIN_MSG_MAP(CDoubleBufferImpl< T >) - END_MSG_MAP() -}; - - -// command bar support -#if !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) - #undef CBRM_GETMENU - #undef CBRM_TRACKPOPUPMENU - #undef CBRM_GETCMDBAR - #undef CBRPOPUPMENU -#endif // !defined(__ATLCTRLW_H__) && !defined(_WIN32_WCE) - -}; // namespace WTL - -#endif // __ATLFRAME_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlgdi.h b/plugins/SmartAutoReplier/wtl/atlgdi.h deleted file mode 100644 index 1e452c4d9b..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlgdi.h +++ /dev/null @@ -1,3891 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLGDI_H__ -#define __ATLGDI_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlgdi.h requires atlapp.h to be included first -#endif - - -// protect template members from windowsx.h macros -#ifdef _INC_WINDOWSX - #undef CopyRgn - #undef CreateBrush - #undef CreatePen - #undef SelectBrush - #undef SelectPen - #undef SelectFont - #undef SelectBitmap -#endif // _INC_WINDOWSX - -// required libraries -#if !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE) - #pragma comment(lib, "msimg32.lib") -#endif // !defined(_ATL_NO_MSIMG) && !defined(_WIN32_WCE) -#if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) - #pragma comment(lib, "opengl32.lib") -#endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CPenT -// CBrushT -// CLogFont -// CFontT -// CBitmapT -// CPaletteT -// CRgnT -// CDCT -// CPaintDC -// CClientDC -// CWindowDC -// CMemoryDC -// CEnhMetaFileInfo -// CEnhMetaFileT -// CEnhMetaFileDC -// -// Global functions: -// AtlGetBitmapResourceInfo() -// AtlGetBitmapResourceBitsPerPixel() -// AtlIsAlphaBitmapResource() -// AtlIsDib16() -// AtlGetDibColorTableSize() -// AtlGetDibNumColors(), -// AtlGetDibBitmap() -// AtlCopyBitmap() -// AtlCreatePackedDib16() -// AtlSetClipboardDib16() -// AtlGetClipboardDib() - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// Bitmap resource helpers to extract bitmap information for a bitmap resource - -inline LPBITMAPINFOHEADER AtlGetBitmapResourceInfo(HMODULE hModule, ATL::_U_STRINGorID image) -{ - HRSRC hResource = ::FindResource(hModule, image.m_lpstr, RT_BITMAP); - ATLASSERT(hResource != NULL); - HGLOBAL hGlobal = ::LoadResource(hModule, hResource); - ATLASSERT(hGlobal != NULL); - LPBITMAPINFOHEADER pBitmapInfoHeader = (LPBITMAPINFOHEADER)::LockResource(hGlobal); - ATLASSERT(pBitmapInfoHeader != NULL); - return pBitmapInfoHeader; -} - -inline WORD AtlGetBitmapResourceBitsPerPixel(HMODULE hModule, ATL::_U_STRINGorID image) -{ - LPBITMAPINFOHEADER pBitmapInfoHeader = AtlGetBitmapResourceInfo(hModule, image); - ATLASSERT(pBitmapInfoHeader != NULL); - return pBitmapInfoHeader->biBitCount; -} - -inline WORD AtlGetBitmapResourceBitsPerPixel(ATL::_U_STRINGorID image) -{ - return AtlGetBitmapResourceBitsPerPixel(ModuleHelper::GetResourceInstance(), image); -} - -/////////////////////////////////////////////////////////////////////////////// -// 32-bit (alpha channel) bitmap resource helper - -// Note: 32-bit (alpha channel) images work only on Windows XP with Common Controls version 6. -// If you want your app to work on older version of Windows, load non-alpha images if Common -// Controls version is less than 6. - -inline bool AtlIsAlphaBitmapResource(ATL::_U_STRINGorID image) -{ - return (AtlGetBitmapResourceBitsPerPixel(image) == 32); -} - - -/////////////////////////////////////////////////////////////////////////////// -// CPen - -template -class CPenT -{ -public: -// Data members - HPEN m_hPen; - -// Constructor/destructor/operators - CPenT(HPEN hPen = NULL) : m_hPen(hPen) - { } - - ~CPenT() - { - if(t_bManaged && m_hPen != NULL) - DeleteObject(); - } - - CPenT& operator =(HPEN hPen) - { - Attach(hPen); - return *this; - } - - void Attach(HPEN hPen) - { - if(t_bManaged && m_hPen != NULL && m_hPen != hPen) - ::DeleteObject(m_hPen); - m_hPen = hPen; - } - - HPEN Detach() - { - HPEN hPen = m_hPen; - m_hPen = NULL; - return hPen; - } - - operator HPEN() const { return m_hPen; } - - bool IsNull() const { return (m_hPen == NULL); } - -// Create methods - HPEN CreatePen(int nPenStyle, int nWidth, COLORREF crColor) - { - ATLASSERT(m_hPen == NULL); - m_hPen = ::CreatePen(nPenStyle, nWidth, crColor); - return m_hPen; - } - -#ifndef _WIN32_WCE - HPEN CreatePen(int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL) - { - ATLASSERT(m_hPen == NULL); - m_hPen = ::ExtCreatePen(nPenStyle, nWidth, pLogBrush, nStyleCount, lpStyle); - return m_hPen; - } -#endif // !_WIN32_WCE - - HPEN CreatePenIndirect(LPLOGPEN lpLogPen) - { - ATLASSERT(m_hPen == NULL); - m_hPen = ::CreatePenIndirect(lpLogPen); - return m_hPen; - } - - BOOL DeleteObject() - { - ATLASSERT(m_hPen != NULL); - BOOL bRet = ::DeleteObject(m_hPen); - if(bRet) - m_hPen = NULL; - return bRet; - } - -// Attributes - int GetLogPen(LOGPEN* pLogPen) const - { - ATLASSERT(m_hPen != NULL); - return ::GetObject(m_hPen, sizeof(LOGPEN), pLogPen); - } - - bool GetLogPen(LOGPEN& LogPen) const - { - ATLASSERT(m_hPen != NULL); - return (::GetObject(m_hPen, sizeof(LOGPEN), &LogPen) == sizeof(LOGPEN)); - } - -#ifndef _WIN32_WCE - int GetExtLogPen(EXTLOGPEN* pLogPen) const - { - ATLASSERT(m_hPen != NULL); - return ::GetObject(m_hPen, sizeof(EXTLOGPEN), pLogPen); - } - - bool GetExtLogPen(EXTLOGPEN& ExtLogPen) const - { - ATLASSERT(m_hPen != NULL); - return (::GetObject(m_hPen, sizeof(EXTLOGPEN), &ExtLogPen) == sizeof(EXTLOGPEN)); - } -#endif // !_WIN32_WCE -}; - -typedef CPenT CPenHandle; -typedef CPenT CPen; - - -/////////////////////////////////////////////////////////////////////////////// -// CBrush - -template -class CBrushT -{ -public: -// Data members - HBRUSH m_hBrush; - -// Constructor/destructor/operators - CBrushT(HBRUSH hBrush = NULL) : m_hBrush(hBrush) - { } - - ~CBrushT() - { - if(t_bManaged && m_hBrush != NULL) - DeleteObject(); - } - - CBrushT& operator =(HBRUSH hBrush) - { - Attach(hBrush); - return *this; - } - - void Attach(HBRUSH hBrush) - { - if(t_bManaged && m_hBrush != NULL && m_hBrush != hBrush) - ::DeleteObject(m_hBrush); - m_hBrush = hBrush; - } - - HBRUSH Detach() - { - HBRUSH hBrush = m_hBrush; - m_hBrush = NULL; - return hBrush; - } - - operator HBRUSH() const { return m_hBrush; } - - bool IsNull() const { return (m_hBrush == NULL); } - -// Create methods - HBRUSH CreateSolidBrush(COLORREF crColor) - { - ATLASSERT(m_hBrush == NULL); - m_hBrush = ::CreateSolidBrush(crColor); - return m_hBrush; - } - -#ifndef _WIN32_WCE - HBRUSH CreateHatchBrush(int nIndex, COLORREF crColor) - { - ATLASSERT(m_hBrush == NULL); - m_hBrush = ::CreateHatchBrush(nIndex, crColor); - return m_hBrush; - } -#endif // !_WIN32_WCE - -#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) - HBRUSH CreateBrushIndirect(const LOGBRUSH* lpLogBrush) - { - ATLASSERT(m_hBrush == NULL); -#ifndef _WIN32_WCE - m_hBrush = ::CreateBrushIndirect(lpLogBrush); -#else // CE specific - m_hBrush = ATL::CreateBrushIndirect(lpLogBrush); -#endif // _WIN32_WCE - return m_hBrush; - } -#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) - - HBRUSH CreatePatternBrush(HBITMAP hBitmap) - { - ATLASSERT(m_hBrush == NULL); - m_hBrush = ::CreatePatternBrush(hBitmap); - return m_hBrush; - } - - HBRUSH CreateDIBPatternBrush(HGLOBAL hPackedDIB, UINT nUsage) - { - ATLASSERT(hPackedDIB != NULL); - const void* lpPackedDIB = GlobalLock(hPackedDIB); - ATLASSERT(lpPackedDIB != NULL); - m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage); - GlobalUnlock(hPackedDIB); - return m_hBrush; - } - - HBRUSH CreateDIBPatternBrush(const void* lpPackedDIB, UINT nUsage) - { - ATLASSERT(m_hBrush == NULL); - m_hBrush = ::CreateDIBPatternBrushPt(lpPackedDIB, nUsage); - return m_hBrush; - } - - HBRUSH CreateSysColorBrush(int nIndex) - { - ATLASSERT(m_hBrush == NULL); - m_hBrush = ::GetSysColorBrush(nIndex); - return m_hBrush; - } - - BOOL DeleteObject() - { - ATLASSERT(m_hBrush != NULL); - BOOL bRet = ::DeleteObject(m_hBrush); - if(bRet) - m_hBrush = NULL; - return bRet; - } - -// Attributes - int GetLogBrush(LOGBRUSH* pLogBrush) const - { - ATLASSERT(m_hBrush != NULL); - return ::GetObject(m_hBrush, sizeof(LOGBRUSH), pLogBrush); - } - - bool GetLogBrush(LOGBRUSH& LogBrush) const - { - ATLASSERT(m_hBrush != NULL); - return (::GetObject(m_hBrush, sizeof(LOGBRUSH), &LogBrush) == sizeof(LOGBRUSH)); - } -}; - -typedef CBrushT CBrushHandle; -typedef CBrushT CBrush; - - -/////////////////////////////////////////////////////////////////////////////// -// CFont - -class CLogFont : public LOGFONT -{ -public: - CLogFont() - { - memset(this, 0, sizeof(LOGFONT)); - } - - CLogFont(const LOGFONT& lf) - { - Copy(&lf); - } - - CLogFont(HFONT hFont) - { - ATLASSERT(::GetObjectType(hFont) == OBJ_FONT); - ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this); - } - - HFONT CreateFontIndirect() - { - return ::CreateFontIndirect(this); - } - - void SetBold() - { - lfWeight = FW_BOLD; - } - - bool IsBold() const - { - return (lfWeight >= FW_BOLD); - } - - void MakeBolder(int iScale = 1) - { - lfWeight += FW_BOLD * iScale; - } - - void MakeLarger(int iScale) - { - if(lfHeight > 0) - lfHeight += iScale; - else - lfHeight -= iScale; - } - - void SetHeight(LONG nPointSize, HDC hDC = NULL) - { - HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL); - // For MM_TEXT mapping mode - lfHeight = -::MulDiv(nPointSize, ::GetDeviceCaps(hDC1, LOGPIXELSY), 72); - if(hDC == NULL) - ::ReleaseDC(NULL, hDC1); - } - - LONG GetHeight(HDC hDC = NULL) const - { - HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL); - // For MM_TEXT mapping mode - LONG nPointSize = ::MulDiv(-lfHeight, 72, ::GetDeviceCaps(hDC1, LOGPIXELSY)); - if(hDC == NULL) - ::ReleaseDC(NULL, hDC1); - - return nPointSize; - } - - LONG GetDeciPointHeight(HDC hDC = NULL) const - { - HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL); -#ifndef _WIN32_WCE - POINT ptOrg = { 0, 0 }; - ::DPtoLP(hDC1, &ptOrg, 1); - POINT pt = { 0, 0 }; - pt.y = abs(lfHeight) + ptOrg.y; - ::LPtoDP(hDC1, &pt,1); - LONG nDeciPoint = ::MulDiv(pt.y, 720, ::GetDeviceCaps(hDC1, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point -#else // CE specific - // DP and LP are always the same on CE - LONG nDeciPoint = ::MulDiv(abs(lfHeight), 720, ::GetDeviceCaps(hDC1, LOGPIXELSY)); // 72 points/inch, 10 decipoints/point -#endif // _WIN32_WCE - if(hDC == NULL) - ::ReleaseDC(NULL, hDC1); - - return nDeciPoint; - } - - void SetHeightFromDeciPoint(LONG nDeciPtHeight, HDC hDC = NULL) - { - HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL); -#ifndef _WIN32_WCE - POINT pt = { 0, 0 }; - pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), nDeciPtHeight, 720); // 72 points/inch, 10 decipoints/point - ::DPtoLP(hDC1, &pt, 1); - POINT ptOrg = { 0, 0 }; - ::DPtoLP(hDC1, &ptOrg, 1); - lfHeight = -abs(pt.y - ptOrg.y); -#else // CE specific - // DP and LP are always the same on CE - lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), nDeciPtHeight, 720)); // 72 points/inch, 10 decipoints/point -#endif // _WIN32_WCE - if(hDC == NULL) - ::ReleaseDC(NULL, hDC1); - } - -#ifndef _WIN32_WCE - void SetCaptionFont() - { - NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; - ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); - Copy(&ncm.lfCaptionFont); - } - - void SetMenuFont() - { - NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; - ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); - Copy(&ncm.lfMenuFont); - } - - void SetStatusFont() - { - NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; - ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); - Copy(&ncm.lfStatusFont); - } - - void SetMessageBoxFont() - { - NONCLIENTMETRICS ncm = { RunTimeHelper::SizeOf_NONCLIENTMETRICS() }; - ATLVERIFY(::SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(ncm), &ncm, 0)); - Copy(&ncm.lfMessageFont); - } -#endif // !_WIN32_WCE - - void Copy(const LOGFONT* pLogFont) - { - ATLASSERT(pLogFont != NULL); - *(LOGFONT*)this = *pLogFont; - } - - CLogFont& operator =(const CLogFont& src) - { - Copy(&src); - return *this; - } - - CLogFont& operator =(const LOGFONT& src) - { - Copy(&src); - return *this; - } - - CLogFont& operator =(HFONT hFont) - { - ATLASSERT(::GetObjectType(hFont) == OBJ_FONT); - ::GetObject(hFont, sizeof(LOGFONT), (LOGFONT*)this); - return *this; - } - - bool operator ==(const LOGFONT& logfont) const - { - return(logfont.lfHeight == lfHeight && - logfont.lfWidth == lfWidth && - logfont.lfEscapement == lfEscapement && - logfont.lfOrientation == lfOrientation && - logfont.lfWeight == lfWeight && - logfont.lfItalic == lfItalic && - logfont.lfUnderline == lfUnderline && - logfont.lfStrikeOut == lfStrikeOut && - logfont.lfCharSet == lfCharSet && - logfont.lfOutPrecision == lfOutPrecision && - logfont.lfClipPrecision == lfClipPrecision && - logfont.lfQuality == lfQuality && - logfont.lfPitchAndFamily == lfPitchAndFamily && - lstrcmp(logfont.lfFaceName, lfFaceName) == 0); - } -}; - - -template -class CFontT -{ -public: -// Data members - HFONT m_hFont; - -// Constructor/destructor/operators - CFontT(HFONT hFont = NULL) : m_hFont(hFont) - { } - - ~CFontT() - { - if(t_bManaged && m_hFont != NULL) - DeleteObject(); - } - - CFontT& operator =(HFONT hFont) - { - Attach(hFont); - return *this; - } - - void Attach(HFONT hFont) - { - if(t_bManaged && m_hFont != NULL && m_hFont != hFont) - ::DeleteObject(m_hFont); - m_hFont = hFont; - } - - HFONT Detach() - { - HFONT hFont = m_hFont; - m_hFont = NULL; - return hFont; - } - - operator HFONT() const { return m_hFont; } - - bool IsNull() const { return (m_hFont == NULL); } - -// Create methods - HFONT CreateFontIndirect(const LOGFONT* lpLogFont) - { - ATLASSERT(m_hFont == NULL); - m_hFont = ::CreateFontIndirect(lpLogFont); - return m_hFont; - } - -#if !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500) - HFONT CreateFontIndirectEx(CONST ENUMLOGFONTEXDV* penumlfex) - { - ATLASSERT(m_hFont == NULL); - m_hFont = ::CreateFontIndirectEx(penumlfex); - return m_hFont; - } -#endif // !defined(_WIN32_WCE) && (_WIN32_WINNT >= 0x0500) - -#if !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) - HFONT CreateFont(int nHeight, int nWidth, int nEscapement, - int nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, - BYTE cStrikeOut, BYTE nCharSet, BYTE nOutPrecision, - BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily, - LPCTSTR lpszFacename) - { - ATLASSERT(m_hFont == NULL); -#ifndef _WIN32_WCE - m_hFont = ::CreateFont(nHeight, nWidth, nEscapement, - nOrientation, nWeight, bItalic, bUnderline, cStrikeOut, - nCharSet, nOutPrecision, nClipPrecision, nQuality, - nPitchAndFamily, lpszFacename); -#else // CE specific - m_hFont = ATL::CreateFont(nHeight, nWidth, nEscapement, - nOrientation, nWeight, bItalic, bUnderline, cStrikeOut, - nCharSet, nOutPrecision, nClipPrecision, nQuality, - nPitchAndFamily, lpszFacename); -#endif // _WIN32_WCE - return m_hFont; - } -#endif // !defined(_WIN32_WCE) || (_ATL_VER >= 0x0800) - - HFONT CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, HDC hDC = NULL, bool bBold = false, bool bItalic = false) - { - LOGFONT logFont = { 0 }; - logFont.lfCharSet = DEFAULT_CHARSET; - logFont.lfHeight = nPointSize; - SecureHelper::strncpy_x(logFont.lfFaceName, _countof(logFont.lfFaceName), lpszFaceName, _TRUNCATE); - - if(bBold) - logFont.lfWeight = FW_BOLD; - if(bItalic) - logFont.lfItalic = (BYTE)TRUE; - - return CreatePointFontIndirect(&logFont, hDC); - } - - HFONT CreatePointFontIndirect(const LOGFONT* lpLogFont, HDC hDC = NULL) - { - HDC hDC1 = (hDC != NULL) ? hDC : ::GetDC(NULL); - - // convert nPointSize to logical units based on hDC - LOGFONT logFont = *lpLogFont; -#ifndef _WIN32_WCE - POINT pt = { 0, 0 }; - pt.y = ::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720); // 72 points/inch, 10 decipoints/point - ::DPtoLP(hDC1, &pt, 1); - POINT ptOrg = { 0, 0 }; - ::DPtoLP(hDC1, &ptOrg, 1); - logFont.lfHeight = -abs(pt.y - ptOrg.y); -#else // CE specific - // DP and LP are always the same on CE - logFont.lfHeight = -abs(::MulDiv(::GetDeviceCaps(hDC1, LOGPIXELSY), logFont.lfHeight, 720)); // 72 points/inch, 10 decipoints/point -#endif // _WIN32_WCE - - if(hDC == NULL) - ::ReleaseDC(NULL, hDC1); - - return CreateFontIndirect(&logFont); - } - - BOOL DeleteObject() - { - ATLASSERT(m_hFont != NULL); - BOOL bRet = ::DeleteObject(m_hFont); - if(bRet) - m_hFont = NULL; - return bRet; - } - -// Attributes - int GetLogFont(LOGFONT* pLogFont) const - { - ATLASSERT(m_hFont != NULL); - return ::GetObject(m_hFont, sizeof(LOGFONT), pLogFont); - } - - bool GetLogFont(LOGFONT& LogFont) const - { - ATLASSERT(m_hFont != NULL); - return (::GetObject(m_hFont, sizeof(LOGFONT), &LogFont) == sizeof(LOGFONT)); - } -}; - -typedef CFontT CFontHandle; -typedef CFontT CFont; - - -/////////////////////////////////////////////////////////////////////////////// -// CBitmap - -template -class CBitmapT -{ -public: -// Data members - HBITMAP m_hBitmap; - -// Constructor/destructor/operators - CBitmapT(HBITMAP hBitmap = NULL) : m_hBitmap(hBitmap) - { } - - ~CBitmapT() - { - if(t_bManaged && m_hBitmap != NULL) - DeleteObject(); - } - - CBitmapT& operator =(HBITMAP hBitmap) - { - Attach(hBitmap); - return *this; - } - - void Attach(HBITMAP hBitmap) - { - if(t_bManaged && m_hBitmap != NULL&& m_hBitmap != hBitmap) - ::DeleteObject(m_hBitmap); - m_hBitmap = hBitmap; - } - - HBITMAP Detach() - { - HBITMAP hBitmap = m_hBitmap; - m_hBitmap = NULL; - return hBitmap; - } - - operator HBITMAP() const { return m_hBitmap; } - - bool IsNull() const { return (m_hBitmap == NULL); } - -// Create and load methods - HBITMAP LoadBitmap(ATL::_U_STRINGorID bitmap) - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr); - return m_hBitmap; - } - - HBITMAP LoadOEMBitmap(UINT nIDBitmap) // for OBM_/OCR_/OIC_ - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::LoadBitmap(NULL, MAKEINTRESOURCE(nIDBitmap)); - return m_hBitmap; - } - -#ifndef _WIN32_WCE - HBITMAP LoadMappedBitmap(UINT nIDBitmap, UINT nFlags = 0, LPCOLORMAP lpColorMap = NULL, int nMapSize = 0) - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::CreateMappedBitmap(ModuleHelper::GetResourceInstance(), nIDBitmap, (WORD)nFlags, lpColorMap, nMapSize); - return m_hBitmap; - } -#endif // !_WIN32_WCE - - HBITMAP CreateBitmap(int nWidth, int nHeight, UINT nPlanes, UINT nBitsPerPixel, const void* lpBits) - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::CreateBitmap(nWidth, nHeight, nPlanes, nBitsPerPixel, lpBits); - return m_hBitmap; - } - -#ifndef _WIN32_WCE - HBITMAP CreateBitmapIndirect(LPBITMAP lpBitmap) - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::CreateBitmapIndirect(lpBitmap); - return m_hBitmap; - } -#endif // !_WIN32_WCE - - HBITMAP CreateCompatibleBitmap(HDC hDC, int nWidth, int nHeight) - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::CreateCompatibleBitmap(hDC, nWidth, nHeight); - return m_hBitmap; - } - -#ifndef _WIN32_WCE - HBITMAP CreateDiscardableBitmap(HDC hDC, int nWidth, int nHeight) - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::CreateDiscardableBitmap(hDC, nWidth, nHeight); - return m_hBitmap; - } -#endif // !_WIN32_WCE - - BOOL DeleteObject() - { - ATLASSERT(m_hBitmap != NULL); - BOOL bRet = ::DeleteObject(m_hBitmap); - if(bRet) - m_hBitmap = NULL; - return bRet; - } - -// Attributes - int GetBitmap(BITMAP* pBitMap) const - { - ATLASSERT(m_hBitmap != NULL); - return ::GetObject(m_hBitmap, sizeof(BITMAP), pBitMap); - } - - bool GetBitmap(BITMAP& bm) const - { - ATLASSERT(m_hBitmap != NULL); - return (::GetObject(m_hBitmap, sizeof(BITMAP), &bm) == sizeof(BITMAP)); - } - - bool GetSize(SIZE& size) const - { - ATLASSERT(m_hBitmap != NULL); - BITMAP bm = { 0 }; - if(!GetBitmap(&bm)) - return false; - size.cx = bm.bmWidth; - size.cy = bm.bmHeight; - return true; - } - -#ifndef _WIN32_WCE - DWORD GetBitmapBits(DWORD dwCount, LPVOID lpBits) const - { - ATLASSERT(m_hBitmap != NULL); - return ::GetBitmapBits(m_hBitmap, dwCount, lpBits); - } -#endif // !_WIN32_WCE - -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) - DWORD SetBitmapBits(DWORD dwCount, const void* lpBits) - { - ATLASSERT(m_hBitmap != NULL); - return ::SetBitmapBits(m_hBitmap, dwCount, lpBits); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) - -#ifndef _WIN32_WCE - BOOL GetBitmapDimension(LPSIZE lpSize) const - { - ATLASSERT(m_hBitmap != NULL); - return ::GetBitmapDimensionEx(m_hBitmap, lpSize); - } - - BOOL SetBitmapDimension(int nWidth, int nHeight, LPSIZE lpSize = NULL) - { - ATLASSERT(m_hBitmap != NULL); - return ::SetBitmapDimensionEx(m_hBitmap, nWidth, nHeight, lpSize); - } - -// DIB support - HBITMAP CreateDIBitmap(HDC hDC, CONST BITMAPINFOHEADER* lpbmih, DWORD dwInit, CONST VOID* lpbInit, CONST BITMAPINFO* lpbmi, UINT uColorUse) - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::CreateDIBitmap(hDC, lpbmih, dwInit, lpbInit, lpbmi, uColorUse); - return m_hBitmap; - } -#endif // !_WIN32_WCE - - HBITMAP CreateDIBSection(HDC hDC, CONST BITMAPINFO* lpbmi, UINT uColorUse, VOID** ppvBits, HANDLE hSection, DWORD dwOffset) - { - ATLASSERT(m_hBitmap == NULL); - m_hBitmap = ::CreateDIBSection(hDC, lpbmi, uColorUse, ppvBits, hSection, dwOffset); - return m_hBitmap; - } - -#ifndef _WIN32_WCE - int GetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, LPVOID lpvBits, LPBITMAPINFO lpbmi, UINT uColorUse) const - { - ATLASSERT(m_hBitmap != NULL); - return ::GetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); - } - - int SetDIBits(HDC hDC, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse) - { - ATLASSERT(m_hBitmap != NULL); - return ::SetDIBits(hDC, m_hBitmap, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); - } -#endif // !_WIN32_WCE -}; - -typedef CBitmapT CBitmapHandle; -typedef CBitmapT CBitmap; - - -/////////////////////////////////////////////////////////////////////////////// -// CPalette - -template -class CPaletteT -{ -public: -// Data members - HPALETTE m_hPalette; - -// Constructor/destructor/operators - CPaletteT(HPALETTE hPalette = NULL) : m_hPalette(hPalette) - { } - - ~CPaletteT() - { - if(t_bManaged && m_hPalette != NULL) - DeleteObject(); - } - - CPaletteT& operator =(HPALETTE hPalette) - { - Attach(hPalette); - return *this; - } - - void Attach(HPALETTE hPalette) - { - if(t_bManaged && m_hPalette != NULL && m_hPalette != hPalette) - ::DeleteObject(m_hPalette); - m_hPalette = hPalette; - } - - HPALETTE Detach() - { - HPALETTE hPalette = m_hPalette; - m_hPalette = NULL; - return hPalette; - } - - operator HPALETTE() const { return m_hPalette; } - - bool IsNull() const { return (m_hPalette == NULL); } - -// Create methods - HPALETTE CreatePalette(LPLOGPALETTE lpLogPalette) - { - ATLASSERT(m_hPalette == NULL); - m_hPalette = ::CreatePalette(lpLogPalette); - return m_hPalette; - } - -#ifndef _WIN32_WCE - HPALETTE CreateHalftonePalette(HDC hDC) - { - ATLASSERT(m_hPalette == NULL); - ATLASSERT(hDC != NULL); - m_hPalette = ::CreateHalftonePalette(hDC); - return m_hPalette; - } -#endif // !_WIN32_WCE - - BOOL DeleteObject() - { - ATLASSERT(m_hPalette != NULL); - BOOL bRet = ::DeleteObject(m_hPalette); - if(bRet) - m_hPalette = NULL; - return bRet; - } - -// Attributes - int GetEntryCount() const - { - ATLASSERT(m_hPalette != NULL); - WORD nEntries = 0; - ::GetObject(m_hPalette, sizeof(WORD), &nEntries); - return (int)nEntries; - } - - UINT GetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) const - { - ATLASSERT(m_hPalette != NULL); - return ::GetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); - } - - UINT SetPaletteEntries(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) - { - ATLASSERT(m_hPalette != NULL); - return ::SetPaletteEntries(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); - } - -// Operations -#ifndef _WIN32_WCE - void AnimatePalette(UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors) - { - ATLASSERT(m_hPalette != NULL); - ::AnimatePalette(m_hPalette, nStartIndex, nNumEntries, lpPaletteColors); - } - - BOOL ResizePalette(UINT nNumEntries) - { - ATLASSERT(m_hPalette != NULL); - return ::ResizePalette(m_hPalette, nNumEntries); - } -#endif // !_WIN32_WCE - - UINT GetNearestPaletteIndex(COLORREF crColor) const - { - ATLASSERT(m_hPalette != NULL); - return ::GetNearestPaletteIndex(m_hPalette, crColor); - } -}; - -typedef CPaletteT CPaletteHandle; -typedef CPaletteT CPalette; - - -/////////////////////////////////////////////////////////////////////////////// -// CRgn - -template -class CRgnT -{ -public: -// Data members - HRGN m_hRgn; - -// Constructor/destructor/operators - CRgnT(HRGN hRgn = NULL) : m_hRgn(hRgn) - { } - - ~CRgnT() - { - if(t_bManaged && m_hRgn != NULL) - DeleteObject(); - } - - CRgnT& operator =(HRGN hRgn) - { - Attach(hRgn); - return *this; - } - - void Attach(HRGN hRgn) - { - if(t_bManaged && m_hRgn != NULL && m_hRgn != hRgn) - ::DeleteObject(m_hRgn); - m_hRgn = hRgn; - } - - HRGN Detach() - { - HRGN hRgn = m_hRgn; - m_hRgn = NULL; - return hRgn; - } - - operator HRGN() const { return m_hRgn; } - - bool IsNull() const { return (m_hRgn == NULL); } - -// Create methods - HRGN CreateRectRgn(int x1, int y1, int x2, int y2) - { - ATLASSERT(m_hRgn == NULL); - m_hRgn = ::CreateRectRgn(x1, y1, x2, y2); - return m_hRgn; - } - - HRGN CreateRectRgnIndirect(LPCRECT lpRect) - { - ATLASSERT(m_hRgn == NULL); - m_hRgn = ::CreateRectRgnIndirect(lpRect); - return m_hRgn; - } - -#ifndef _WIN32_WCE - HRGN CreateEllipticRgn(int x1, int y1, int x2, int y2) - { - ATLASSERT(m_hRgn == NULL); - m_hRgn = ::CreateEllipticRgn(x1, y1, x2, y2); - return m_hRgn; - } - - HRGN CreateEllipticRgnIndirect(LPCRECT lpRect) - { - ATLASSERT(m_hRgn == NULL); - m_hRgn = ::CreateEllipticRgnIndirect(lpRect); - return m_hRgn; - } - - HRGN CreatePolygonRgn(LPPOINT lpPoints, int nCount, int nMode) - { - ATLASSERT(m_hRgn == NULL); - m_hRgn = ::CreatePolygonRgn(lpPoints, nCount, nMode); - return m_hRgn; - } - - HRGN CreatePolyPolygonRgn(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode) - { - ATLASSERT(m_hRgn == NULL); - m_hRgn = ::CreatePolyPolygonRgn(lpPoints, lpPolyCounts, nCount, nPolyFillMode); - return m_hRgn; - } - - HRGN CreateRoundRectRgn(int x1, int y1, int x2, int y2, int x3, int y3) - { - ATLASSERT(m_hRgn == NULL); - m_hRgn = ::CreateRoundRectRgn(x1, y1, x2, y2, x3, y3); - return m_hRgn; - } - - HRGN CreateFromPath(HDC hDC) - { - ATLASSERT(m_hRgn == NULL); - ATLASSERT(hDC != NULL); - m_hRgn = ::PathToRegion(hDC); - return m_hRgn; - } - - HRGN CreateFromData(const XFORM* lpXForm, int nCount, const RGNDATA* pRgnData) - { - ATLASSERT(m_hRgn == NULL); - m_hRgn = ::ExtCreateRegion(lpXForm, nCount, pRgnData); - return m_hRgn; - } -#endif // !_WIN32_WCE - - BOOL DeleteObject() - { - ATLASSERT(m_hRgn != NULL); - BOOL bRet = ::DeleteObject(m_hRgn); - if(bRet) - m_hRgn = NULL; - return bRet; - } - -// Operations - void SetRectRgn(int x1, int y1, int x2, int y2) - { - ATLASSERT(m_hRgn != NULL); - ::SetRectRgn(m_hRgn, x1, y1, x2, y2); - } - - void SetRectRgn(LPCRECT lpRect) - { - ATLASSERT(m_hRgn != NULL); - ::SetRectRgn(m_hRgn, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - - int CombineRgn(HRGN hRgnSrc1, HRGN hRgnSrc2, int nCombineMode) - { - ATLASSERT(m_hRgn != NULL); - return ::CombineRgn(m_hRgn, hRgnSrc1, hRgnSrc2, nCombineMode); - } - - int CombineRgn(HRGN hRgnSrc, int nCombineMode) - { - ATLASSERT(m_hRgn != NULL); - return ::CombineRgn(m_hRgn, m_hRgn, hRgnSrc, nCombineMode); - } - - int CopyRgn(HRGN hRgnSrc) - { - ATLASSERT(m_hRgn != NULL); - return ::CombineRgn(m_hRgn, hRgnSrc, NULL, RGN_COPY); - } - - BOOL EqualRgn(HRGN hRgn) const - { - ATLASSERT(m_hRgn != NULL); - return ::EqualRgn(m_hRgn, hRgn); - } - - int OffsetRgn(int x, int y) - { - ATLASSERT(m_hRgn != NULL); - return ::OffsetRgn(m_hRgn, x, y); - } - - int OffsetRgn(POINT point) - { - ATLASSERT(m_hRgn != NULL); - return ::OffsetRgn(m_hRgn, point.x, point.y); - } - - int GetRgnBox(LPRECT lpRect) const - { - ATLASSERT(m_hRgn != NULL); - return ::GetRgnBox(m_hRgn, lpRect); - } - - BOOL PtInRegion(int x, int y) const - { - ATLASSERT(m_hRgn != NULL); - return ::PtInRegion(m_hRgn, x, y); - } - - BOOL PtInRegion(POINT point) const - { - ATLASSERT(m_hRgn != NULL); - return ::PtInRegion(m_hRgn, point.x, point.y); - } - - BOOL RectInRegion(LPCRECT lpRect) const - { - ATLASSERT(m_hRgn != NULL); - return ::RectInRegion(m_hRgn, lpRect); - } - - int GetRegionData(LPRGNDATA lpRgnData, int nDataSize) const - { - ATLASSERT(m_hRgn != NULL); - return (int)::GetRegionData(m_hRgn, nDataSize, lpRgnData); - } -}; - -typedef CRgnT CRgnHandle; -typedef CRgnT CRgn; - - -/////////////////////////////////////////////////////////////////////////////// -// CDC - The device context class - -template -class CDCT -{ -public: -// Data members - HDC m_hDC; - -// Constructor/destructor/operators - CDCT(HDC hDC = NULL) : m_hDC(hDC) - { - } - - ~CDCT() - { - if(t_bManaged && m_hDC != NULL) - ::DeleteDC(Detach()); - } - - CDCT& operator =(HDC hDC) - { - Attach(hDC); - return *this; - } - - void Attach(HDC hDC) - { - if(t_bManaged && m_hDC != NULL && m_hDC != hDC) - ::DeleteDC(m_hDC); - m_hDC = hDC; - } - - HDC Detach() - { - HDC hDC = m_hDC; - m_hDC = NULL; - return hDC; - } - - operator HDC() const { return m_hDC; } - - bool IsNull() const { return (m_hDC == NULL); } - -// Operations -#ifndef _WIN32_WCE - HWND WindowFromDC() const - { - ATLASSERT(m_hDC != NULL); - return ::WindowFromDC(m_hDC); - } -#endif // !_WIN32_WCE - - CPenHandle GetCurrentPen() const - { - ATLASSERT(m_hDC != NULL); - return CPenHandle((HPEN)::GetCurrentObject(m_hDC, OBJ_PEN)); - } - - CBrushHandle GetCurrentBrush() const - { - ATLASSERT(m_hDC != NULL); - return CBrushHandle((HBRUSH)::GetCurrentObject(m_hDC, OBJ_BRUSH)); - } - - CPaletteHandle GetCurrentPalette() const - { - ATLASSERT(m_hDC != NULL); - return CPaletteHandle((HPALETTE)::GetCurrentObject(m_hDC, OBJ_PAL)); - } - - CFontHandle GetCurrentFont() const - { - ATLASSERT(m_hDC != NULL); - return CFontHandle((HFONT)::GetCurrentObject(m_hDC, OBJ_FONT)); - } - - CBitmapHandle GetCurrentBitmap() const - { - ATLASSERT(m_hDC != NULL); - return CBitmapHandle((HBITMAP)::GetCurrentObject(m_hDC, OBJ_BITMAP)); - } - - HDC CreateDC(LPCTSTR lpszDriverName, LPCTSTR lpszDeviceName, LPCTSTR lpszOutput, const DEVMODE* lpInitData) - { - ATLASSERT(m_hDC == NULL); - m_hDC = ::CreateDC(lpszDriverName, lpszDeviceName, lpszOutput, lpInitData); - return m_hDC; - } - - HDC CreateCompatibleDC(HDC hDC = NULL) - { - ATLASSERT(m_hDC == NULL); - m_hDC = ::CreateCompatibleDC(hDC); - return m_hDC; - } - - BOOL DeleteDC() - { - if(m_hDC == NULL) - return FALSE; - BOOL bRet = ::DeleteDC(m_hDC); - if(bRet) - m_hDC = NULL; - return bRet; - } - -// Device-Context Functions - int SaveDC() - { - ATLASSERT(m_hDC != NULL); - return ::SaveDC(m_hDC); - } - - BOOL RestoreDC(int nSavedDC) - { - ATLASSERT(m_hDC != NULL); - return ::RestoreDC(m_hDC, nSavedDC); - } - - int GetDeviceCaps(int nIndex) const - { - ATLASSERT(m_hDC != NULL); - return ::GetDeviceCaps(m_hDC, nIndex); - } - -#ifndef _WIN32_WCE - UINT SetBoundsRect(LPCRECT lpRectBounds, UINT flags) - { - ATLASSERT(m_hDC != NULL); - return ::SetBoundsRect(m_hDC, lpRectBounds, flags); - } - - UINT GetBoundsRect(LPRECT lpRectBounds, UINT flags) const - { - ATLASSERT(m_hDC != NULL); - return ::GetBoundsRect(m_hDC, lpRectBounds, flags); - } - - BOOL ResetDC(const DEVMODE* lpDevMode) - { - ATLASSERT(m_hDC != NULL); - return ::ResetDC(m_hDC, lpDevMode) != NULL; - } - -// Drawing-Tool Functions - BOOL GetBrushOrg(LPPOINT lpPoint) const - { - ATLASSERT(m_hDC != NULL); - return ::GetBrushOrgEx(m_hDC, lpPoint); - } -#endif // !_WIN32_WCE - - BOOL SetBrushOrg(int x, int y, LPPOINT lpPoint = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::SetBrushOrgEx(m_hDC, x, y, lpPoint); - } - - BOOL SetBrushOrg(POINT point, LPPOINT lpPointRet = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::SetBrushOrgEx(m_hDC, point.x, point.y, lpPointRet); - } - -#ifndef _WIN32_WCE - int EnumObjects(int nObjectType, int (CALLBACK* lpfn)(LPVOID, LPARAM), LPARAM lpData) - { - ATLASSERT(m_hDC != NULL); -#ifdef STRICT - return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, lpData); -#else - return ::EnumObjects(m_hDC, nObjectType, (GOBJENUMPROC)lpfn, (LPVOID)lpData); -#endif - } -#endif // !_WIN32_WCE - -// Type-safe selection helpers - HPEN SelectPen(HPEN hPen) - { - ATLASSERT(m_hDC != NULL); -#ifndef _WIN32_WCE - ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN || ::GetObjectType(hPen) == OBJ_EXTPEN); -#else // CE specific - ATLASSERT(hPen == NULL || ::GetObjectType(hPen) == OBJ_PEN); -#endif // _WIN32_WCE - return (HPEN)::SelectObject(m_hDC, hPen); - } - - HBRUSH SelectBrush(HBRUSH hBrush) - { - ATLASSERT(m_hDC != NULL); - ATLASSERT(hBrush == NULL || ::GetObjectType(hBrush) == OBJ_BRUSH); - return (HBRUSH)::SelectObject(m_hDC, hBrush); - } - - HFONT SelectFont(HFONT hFont) - { - ATLASSERT(m_hDC != NULL); - ATLASSERT(hFont == NULL || ::GetObjectType(hFont) == OBJ_FONT); - return (HFONT)::SelectObject(m_hDC, hFont); - } - - HBITMAP SelectBitmap(HBITMAP hBitmap) - { - ATLASSERT(m_hDC != NULL); - ATLASSERT(hBitmap == NULL || ::GetObjectType(hBitmap) == OBJ_BITMAP); - return (HBITMAP)::SelectObject(m_hDC, hBitmap); - } - - int SelectRgn(HRGN hRgn) // special return for regions - { - ATLASSERT(m_hDC != NULL); - ATLASSERT(hRgn == NULL || ::GetObjectType(hRgn) == OBJ_REGION); - return PtrToInt(::SelectObject(m_hDC, hRgn)); - } - -// Type-safe selection helpers for stock objects - HPEN SelectStockPen(int nPen) - { - ATLASSERT(m_hDC != NULL); -#if (_WIN32_WINNT >= 0x0500) - ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN || nPen == DC_PEN); -#else - ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN); -#endif // !(_WIN32_WINNT >= 0x0500) - return SelectPen((HPEN)::GetStockObject(nPen)); - } - - HBRUSH SelectStockBrush(int nBrush) - { -#if (_WIN32_WINNT >= 0x0500) - ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || nBrush == DC_BRUSH); -#else - ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH); -#endif // !(_WIN32_WINNT >= 0x0500) - return SelectBrush((HBRUSH)::GetStockObject(nBrush)); - } - - HFONT SelectStockFont(int nFont) - { -#ifndef _WIN32_WCE - ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT) || nFont == DEFAULT_GUI_FONT); -#else // CE specific - ATLASSERT(nFont == SYSTEM_FONT); -#endif // _WIN32_WCE - return SelectFont((HFONT)::GetStockObject(nFont)); - } - - HPALETTE SelectStockPalette(int nPalette, BOOL bForceBackground) - { - ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported - return SelectPalette((HPALETTE)::GetStockObject(nPalette), bForceBackground); - } - -// Color and Color Palette Functions - COLORREF GetNearestColor(COLORREF crColor) const - { - ATLASSERT(m_hDC != NULL); - return ::GetNearestColor(m_hDC, crColor); - } - - HPALETTE SelectPalette(HPALETTE hPalette, BOOL bForceBackground) - { - ATLASSERT(m_hDC != NULL); - - return ::SelectPalette(m_hDC, hPalette, bForceBackground); - } - - UINT RealizePalette() - { - ATLASSERT(m_hDC != NULL); - return ::RealizePalette(m_hDC); - } - -#ifndef _WIN32_WCE - void UpdateColors() - { - ATLASSERT(m_hDC != NULL); - ::UpdateColors(m_hDC); - } -#endif // !_WIN32_WCE - -// Drawing-Attribute Functions - COLORREF GetBkColor() const - { - ATLASSERT(m_hDC != NULL); - return ::GetBkColor(m_hDC); - } - - int GetBkMode() const - { - ATLASSERT(m_hDC != NULL); - return ::GetBkMode(m_hDC); - } - -#ifndef _WIN32_WCE - int GetPolyFillMode() const - { - ATLASSERT(m_hDC != NULL); - return ::GetPolyFillMode(m_hDC); - } - - int GetROP2() const - { - ATLASSERT(m_hDC != NULL); - return ::GetROP2(m_hDC); - } - - int GetStretchBltMode() const - { - ATLASSERT(m_hDC != NULL); - return ::GetStretchBltMode(m_hDC); - } -#endif // !_WIN32_WCE - - COLORREF GetTextColor() const - { - ATLASSERT(m_hDC != NULL); - return ::GetTextColor(m_hDC); - } - - COLORREF SetBkColor(COLORREF crColor) - { - ATLASSERT(m_hDC != NULL); - return ::SetBkColor(m_hDC, crColor); - } - - int SetBkMode(int nBkMode) - { - ATLASSERT(m_hDC != NULL); - return ::SetBkMode(m_hDC, nBkMode); - } - -#ifndef _WIN32_WCE - int SetPolyFillMode(int nPolyFillMode) - { - ATLASSERT(m_hDC != NULL); - return ::SetPolyFillMode(m_hDC, nPolyFillMode); - } -#endif // !_WIN32_WCE - - int SetROP2(int nDrawMode) - { - ATLASSERT(m_hDC != NULL); - return ::SetROP2(m_hDC, nDrawMode); - } - -#ifndef _WIN32_WCE - int SetStretchBltMode(int nStretchMode) - { - ATLASSERT(m_hDC != NULL); - return ::SetStretchBltMode(m_hDC, nStretchMode); - } -#endif // !_WIN32_WCE - - COLORREF SetTextColor(COLORREF crColor) - { - ATLASSERT(m_hDC != NULL); - return ::SetTextColor(m_hDC, crColor); - } - -#ifndef _WIN32_WCE - BOOL GetColorAdjustment(LPCOLORADJUSTMENT lpColorAdjust) const - { - ATLASSERT(m_hDC != NULL); - return ::GetColorAdjustment(m_hDC, lpColorAdjust); - } - - BOOL SetColorAdjustment(const COLORADJUSTMENT* lpColorAdjust) - { - ATLASSERT(m_hDC != NULL); - return ::SetColorAdjustment(m_hDC, lpColorAdjust); - } - -// Mapping Functions - int GetMapMode() const - { - ATLASSERT(m_hDC != NULL); - return ::GetMapMode(m_hDC); - } - - BOOL GetViewportOrg(LPPOINT lpPoint) const - { - ATLASSERT(m_hDC != NULL); - return ::GetViewportOrgEx(m_hDC, lpPoint); - } - - int SetMapMode(int nMapMode) - { - ATLASSERT(m_hDC != NULL); - return ::SetMapMode(m_hDC, nMapMode); - } -#endif // !_WIN32_WCE - - // Viewport Origin - BOOL SetViewportOrg(int x, int y, LPPOINT lpPoint = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::SetViewportOrgEx(m_hDC, x, y, lpPoint); - } - - BOOL SetViewportOrg(POINT point, LPPOINT lpPointRet = NULL) - { - ATLASSERT(m_hDC != NULL); - return SetViewportOrg(point.x, point.y, lpPointRet); - } - -#ifndef _WIN32_WCE - BOOL OffsetViewportOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::OffsetViewportOrgEx(m_hDC, nWidth, nHeight, lpPoint); - } - - // Viewport Extent - BOOL GetViewportExt(LPSIZE lpSize) const - { - ATLASSERT(m_hDC != NULL); - return ::GetViewportExtEx(m_hDC, lpSize); - } - - BOOL SetViewportExt(int x, int y, LPSIZE lpSize = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::SetViewportExtEx(m_hDC, x, y, lpSize); - } - - BOOL SetViewportExt(SIZE size, LPSIZE lpSizeRet = NULL) - { - ATLASSERT(m_hDC != NULL); - return SetViewportExt(size.cx, size.cy, lpSizeRet); - } - - BOOL ScaleViewportExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::ScaleViewportExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize); - } -#endif // !_WIN32_WCE - - // Window Origin -#ifndef _WIN32_WCE - BOOL GetWindowOrg(LPPOINT lpPoint) const - { - ATLASSERT(m_hDC != NULL); - return ::GetWindowOrgEx(m_hDC, lpPoint); - } - - BOOL SetWindowOrg(int x, int y, LPPOINT lpPoint = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::SetWindowOrgEx(m_hDC, x, y, lpPoint); - } - - BOOL SetWindowOrg(POINT point, LPPOINT lpPointRet = NULL) - { - ATLASSERT(m_hDC != NULL); - return SetWindowOrg(point.x, point.y, lpPointRet); - } - - BOOL OffsetWindowOrg(int nWidth, int nHeight, LPPOINT lpPoint = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::OffsetWindowOrgEx(m_hDC, nWidth, nHeight, lpPoint); - } - - // Window extent - BOOL GetWindowExt(LPSIZE lpSize) const - { - ATLASSERT(m_hDC != NULL); - return ::GetWindowExtEx(m_hDC, lpSize); - } - - BOOL SetWindowExt(int x, int y, LPSIZE lpSize = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::SetWindowExtEx(m_hDC, x, y, lpSize); - } - - BOOL SetWindowExt(SIZE size, LPSIZE lpSizeRet = NULL) - { - ATLASSERT(m_hDC != NULL); - return SetWindowExt(size.cx, size.cy, lpSizeRet); - } - - BOOL ScaleWindowExt(int xNum, int xDenom, int yNum, int yDenom, LPSIZE lpSize = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::ScaleWindowExtEx(m_hDC, xNum, xDenom, yNum, yDenom, lpSize); - } - -// Coordinate Functions - BOOL DPtoLP(LPPOINT lpPoints, int nCount = 1) const - { - ATLASSERT(m_hDC != NULL); - return ::DPtoLP(m_hDC, lpPoints, nCount); - } - - BOOL DPtoLP(LPRECT lpRect) const - { - ATLASSERT(m_hDC != NULL); - return ::DPtoLP(m_hDC, (LPPOINT)lpRect, 2); - } - - BOOL DPtoLP(LPSIZE lpSize) const - { - SIZE sizeWinExt = { 0, 0 }; - if(!GetWindowExt(&sizeWinExt)) - return FALSE; - SIZE sizeVpExt = { 0, 0 }; - if(!GetViewportExt(&sizeVpExt)) - return FALSE; - lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeWinExt.cx), abs(sizeVpExt.cx)); - lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeWinExt.cy), abs(sizeVpExt.cy)); - return TRUE; - } - - BOOL LPtoDP(LPPOINT lpPoints, int nCount = 1) const - { - ATLASSERT(m_hDC != NULL); - return ::LPtoDP(m_hDC, lpPoints, nCount); - } - - BOOL LPtoDP(LPRECT lpRect) const - { - ATLASSERT(m_hDC != NULL); - return ::LPtoDP(m_hDC, (LPPOINT)lpRect, 2); - } - - BOOL LPtoDP(LPSIZE lpSize) const - { - SIZE sizeWinExt = { 0, 0 }; - if(!GetWindowExt(&sizeWinExt)) - return FALSE; - SIZE sizeVpExt = { 0, 0 }; - if(!GetViewportExt(&sizeVpExt)) - return FALSE; - lpSize->cx = ::MulDiv(lpSize->cx, abs(sizeVpExt.cx), abs(sizeWinExt.cx)); - lpSize->cy = ::MulDiv(lpSize->cy, abs(sizeVpExt.cy), abs(sizeWinExt.cy)); - return TRUE; - } - -// Special Coordinate Functions (useful for dealing with metafiles and OLE) - #define HIMETRIC_INCH 2540 // HIMETRIC units per inch - - void DPtoHIMETRIC(LPSIZE lpSize) const - { - ATLASSERT(m_hDC != NULL); - int nMapMode; - if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT) - { - // when using a constrained map mode, map against physical inch - ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC); - DPtoLP(lpSize); - ((CDCHandle*)this)->SetMapMode(nMapMode); - } - else - { - // map against logical inch for non-constrained mapping modes - int cxPerInch = GetDeviceCaps(LOGPIXELSX); - int cyPerInch = GetDeviceCaps(LOGPIXELSY); - ATLASSERT(cxPerInch != 0 && cyPerInch != 0); - lpSize->cx = ::MulDiv(lpSize->cx, HIMETRIC_INCH, cxPerInch); - lpSize->cy = ::MulDiv(lpSize->cy, HIMETRIC_INCH, cyPerInch); - } - } - - void HIMETRICtoDP(LPSIZE lpSize) const - { - ATLASSERT(m_hDC != NULL); - int nMapMode; - if((nMapMode = GetMapMode()) < MM_ISOTROPIC && nMapMode != MM_TEXT) - { - // when using a constrained map mode, map against physical inch - ((CDCHandle*)this)->SetMapMode(MM_HIMETRIC); - LPtoDP(lpSize); - ((CDCHandle*)this)->SetMapMode(nMapMode); - } - else - { - // map against logical inch for non-constrained mapping modes - int cxPerInch = GetDeviceCaps(LOGPIXELSX); - int cyPerInch = GetDeviceCaps(LOGPIXELSY); - ATLASSERT(cxPerInch != 0 && cyPerInch != 0); - lpSize->cx = ::MulDiv(lpSize->cx, cxPerInch, HIMETRIC_INCH); - lpSize->cy = ::MulDiv(lpSize->cy, cyPerInch, HIMETRIC_INCH); - } - } - - void LPtoHIMETRIC(LPSIZE lpSize) const - { - LPtoDP(lpSize); - DPtoHIMETRIC(lpSize); - } - - void HIMETRICtoLP(LPSIZE lpSize) const - { - HIMETRICtoDP(lpSize); - DPtoLP(lpSize); - } -#endif // !_WIN32_WCE - -// Region Functions - BOOL FillRgn(HRGN hRgn, HBRUSH hBrush) - { - ATLASSERT(m_hDC != NULL); - return ::FillRgn(m_hDC, hRgn, hBrush); - } - -#ifndef _WIN32_WCE - BOOL FrameRgn(HRGN hRgn, HBRUSH hBrush, int nWidth, int nHeight) - { - ATLASSERT(m_hDC != NULL); - return ::FrameRgn(m_hDC, hRgn, hBrush, nWidth, nHeight); - } - - BOOL InvertRgn(HRGN hRgn) - { - ATLASSERT(m_hDC != NULL); - return ::InvertRgn(m_hDC, hRgn); - } - - BOOL PaintRgn(HRGN hRgn) - { - ATLASSERT(m_hDC != NULL); - return ::PaintRgn(m_hDC, hRgn); - } -#endif // !_WIN32_WCE - -// Clipping Functions - int GetClipBox(LPRECT lpRect) const - { - ATLASSERT(m_hDC != NULL); - return ::GetClipBox(m_hDC, lpRect); - } - - int GetClipRgn(CRgn& region) const - { - ATLASSERT(m_hDC != NULL); - if(region.IsNull()) - region.CreateRectRgn(0, 0, 0, 0); - - int nRet = ::GetClipRgn(m_hDC, region); - if(nRet != 1) - region.DeleteObject(); - - return nRet; - } - -#ifndef _WIN32_WCE - BOOL PtVisible(int x, int y) const - { - ATLASSERT(m_hDC != NULL); - return ::PtVisible(m_hDC, x, y); - } - - BOOL PtVisible(POINT point) const - { - ATLASSERT(m_hDC != NULL); - return ::PtVisible(m_hDC, point.x, point.y); - } -#endif // !_WIN32_WCE - - BOOL RectVisible(LPCRECT lpRect) const - { - ATLASSERT(m_hDC != NULL); - return ::RectVisible(m_hDC, lpRect); - } - - int SelectClipRgn(HRGN hRgn) - { - ATLASSERT(m_hDC != NULL); - return ::SelectClipRgn(m_hDC, (HRGN)hRgn); - } - - int ExcludeClipRect(int x1, int y1, int x2, int y2) - { - ATLASSERT(m_hDC != NULL); - return ::ExcludeClipRect(m_hDC, x1, y1, x2, y2); - } - - int ExcludeClipRect(LPCRECT lpRect) - { - ATLASSERT(m_hDC != NULL); - return ::ExcludeClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - -#ifndef _WIN32_WCE - int ExcludeUpdateRgn(HWND hWnd) - { - ATLASSERT(m_hDC != NULL); - return ::ExcludeUpdateRgn(m_hDC, hWnd); - } -#endif // !_WIN32_WCE - - int IntersectClipRect(int x1, int y1, int x2, int y2) - { - ATLASSERT(m_hDC != NULL); - return ::IntersectClipRect(m_hDC, x1, y1, x2, y2); - } - - int IntersectClipRect(LPCRECT lpRect) - { - ATLASSERT(m_hDC != NULL); - return ::IntersectClipRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - -#ifndef _WIN32_WCE - int OffsetClipRgn(int x, int y) - { - ATLASSERT(m_hDC != NULL); - return ::OffsetClipRgn(m_hDC, x, y); - } - - int OffsetClipRgn(SIZE size) - { - ATLASSERT(m_hDC != NULL); - return ::OffsetClipRgn(m_hDC, size.cx, size.cy); - } - - int SelectClipRgn(HRGN hRgn, int nMode) - { - ATLASSERT(m_hDC != NULL); - return ::ExtSelectClipRgn(m_hDC, hRgn, nMode); - } -#endif // !_WIN32_WCE - -// Line-Output Functions -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - BOOL GetCurrentPosition(LPPOINT lpPoint) const - { - ATLASSERT(m_hDC != NULL); - return ::GetCurrentPositionEx(m_hDC, lpPoint); - } - - BOOL MoveTo(int x, int y, LPPOINT lpPoint = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::MoveToEx(m_hDC, x, y, lpPoint); - } - - BOOL MoveTo(POINT point, LPPOINT lpPointRet = NULL) - { - ATLASSERT(m_hDC != NULL); - return MoveTo(point.x, point.y, lpPointRet); - } - - BOOL LineTo(int x, int y) - { - ATLASSERT(m_hDC != NULL); - return ::LineTo(m_hDC, x, y); - } - - BOOL LineTo(POINT point) - { - ATLASSERT(m_hDC != NULL); - return LineTo(point.x, point.y); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - -#ifndef _WIN32_WCE - BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) - { - ATLASSERT(m_hDC != NULL); - return ::Arc(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); - } - - BOOL Arc(LPCRECT lpRect, POINT ptStart, POINT ptEnd) - { - ATLASSERT(m_hDC != NULL); - return ::Arc(m_hDC, lpRect->left, lpRect->top, - lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, - ptEnd.x, ptEnd.y); - } -#endif // !_WIN32_WCE - - BOOL Polyline(LPPOINT lpPoints, int nCount) - { - ATLASSERT(m_hDC != NULL); - return ::Polyline(m_hDC, lpPoints, nCount); - } - -#ifndef _WIN32_WCE - BOOL AngleArc(int x, int y, int nRadius, float fStartAngle, float fSweepAngle) - { - ATLASSERT(m_hDC != NULL); - return ::AngleArc(m_hDC, x, y, nRadius, fStartAngle, fSweepAngle); - } - - BOOL ArcTo(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) - { - ATLASSERT(m_hDC != NULL); - return ::ArcTo(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); - } - - BOOL ArcTo(LPCRECT lpRect, POINT ptStart, POINT ptEnd) - { - ATLASSERT(m_hDC != NULL); - return ArcTo(lpRect->left, lpRect->top, lpRect->right, - lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); - } - - int GetArcDirection() const - { - ATLASSERT(m_hDC != NULL); - return ::GetArcDirection(m_hDC); - } - - int SetArcDirection(int nArcDirection) - { - ATLASSERT(m_hDC != NULL); - return ::SetArcDirection(m_hDC, nArcDirection); - } - - BOOL PolyDraw(const POINT* lpPoints, const BYTE* lpTypes, int nCount) - { - ATLASSERT(m_hDC != NULL); - return ::PolyDraw(m_hDC, lpPoints, lpTypes, nCount); - } - - BOOL PolylineTo(const POINT* lpPoints, int nCount) - { - ATLASSERT(m_hDC != NULL); - return ::PolylineTo(m_hDC, lpPoints, nCount); - } - - BOOL PolyPolyline(const POINT* lpPoints, - const DWORD* lpPolyPoints, int nCount) - { - ATLASSERT(m_hDC != NULL); - return ::PolyPolyline(m_hDC, lpPoints, lpPolyPoints, nCount); - } - - BOOL PolyBezier(const POINT* lpPoints, int nCount) - { - ATLASSERT(m_hDC != NULL); - return ::PolyBezier(m_hDC, lpPoints, nCount); - } - - BOOL PolyBezierTo(const POINT* lpPoints, int nCount) - { - ATLASSERT(m_hDC != NULL); - return ::PolyBezierTo(m_hDC, lpPoints, nCount); - } -#endif // !_WIN32_WCE - -// Simple Drawing Functions - BOOL FillRect(LPCRECT lpRect, HBRUSH hBrush) - { - ATLASSERT(m_hDC != NULL); - return ::FillRect(m_hDC, lpRect, hBrush); - } - - BOOL FillRect(LPCRECT lpRect, int nColorIndex) - { - ATLASSERT(m_hDC != NULL); -#ifndef _WIN32_WCE - return ::FillRect(m_hDC, lpRect, (HBRUSH)LongToPtr(nColorIndex + 1)); -#else // CE specific - return ::FillRect(m_hDC, lpRect, ::GetSysColorBrush(nColorIndex)); -#endif // _WIN32_WCE - } - -#ifndef _WIN32_WCE - BOOL FrameRect(LPCRECT lpRect, HBRUSH hBrush) - { - ATLASSERT(m_hDC != NULL); - return ::FrameRect(m_hDC, lpRect, hBrush); - } -#endif // !_WIN32_WCE - -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) - BOOL InvertRect(LPCRECT lpRect) - { - ATLASSERT(m_hDC != NULL); - return ::InvertRect(m_hDC, lpRect); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) - - BOOL DrawIcon(int x, int y, HICON hIcon) - { - ATLASSERT(m_hDC != NULL); -#ifndef _WIN32_WCE - return ::DrawIcon(m_hDC, x, y, hIcon); -#else // CE specific - return ::DrawIconEx(m_hDC, x, y, hIcon, 0, 0, 0, NULL, DI_NORMAL); -#endif // _WIN32_WCE - } - - BOOL DrawIcon(POINT point, HICON hIcon) - { - ATLASSERT(m_hDC != NULL); -#ifndef _WIN32_WCE - return ::DrawIcon(m_hDC, point.x, point.y, hIcon); -#else // CE specific - return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, 0, 0, 0, NULL, DI_NORMAL); -#endif // _WIN32_WCE - } - - BOOL DrawIconEx(int x, int y, HICON hIcon, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) - { - ATLASSERT(m_hDC != NULL); - return ::DrawIconEx(m_hDC, x, y, hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); - } - - BOOL DrawIconEx(POINT point, HICON hIcon, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) - { - ATLASSERT(m_hDC != NULL); - return ::DrawIconEx(m_hDC, point.x, point.y, hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); - } - -#ifndef _WIN32_WCE - BOOL DrawState(POINT pt, SIZE size, HBITMAP hBitmap, UINT nFlags, HBRUSH hBrush = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hBitmap, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_BITMAP); - } - - BOOL DrawState(POINT pt, SIZE size, HICON hIcon, UINT nFlags, HBRUSH hBrush = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)hIcon, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_ICON); - } - - BOOL DrawState(POINT pt, SIZE size, LPCTSTR lpszText, UINT nFlags, BOOL bPrefixText = TRUE, int nTextLen = 0, HBRUSH hBrush = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::DrawState(m_hDC, hBrush, NULL, (LPARAM)lpszText, (WPARAM)nTextLen, pt.x, pt.y, size.cx, size.cy, nFlags | (bPrefixText ? DST_PREFIXTEXT : DST_TEXT)); - } - - BOOL DrawState(POINT pt, SIZE size, DRAWSTATEPROC lpDrawProc, LPARAM lData, UINT nFlags, HBRUSH hBrush = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::DrawState(m_hDC, hBrush, lpDrawProc, lData, 0, pt.x, pt.y, size.cx, size.cy, nFlags | DST_COMPLEX); - } -#endif // !_WIN32_WCE - -// Ellipse and Polygon Functions -#ifndef _WIN32_WCE - BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) - { - ATLASSERT(m_hDC != NULL); - return ::Chord(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); - } - - BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd) - { - ATLASSERT(m_hDC != NULL); - return ::Chord(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); - } -#endif // !_WIN32_WCE - - void DrawFocusRect(LPCRECT lpRect) - { - ATLASSERT(m_hDC != NULL); - ::DrawFocusRect(m_hDC, lpRect); - } - - BOOL Ellipse(int x1, int y1, int x2, int y2) - { - ATLASSERT(m_hDC != NULL); - return ::Ellipse(m_hDC, x1, y1, x2, y2); - } - - BOOL Ellipse(LPCRECT lpRect) - { - ATLASSERT(m_hDC != NULL); - return ::Ellipse(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - -#ifndef _WIN32_WCE - BOOL Pie(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4) - { - ATLASSERT(m_hDC != NULL); - return ::Pie(m_hDC, x1, y1, x2, y2, x3, y3, x4, y4); - } - - BOOL Pie(LPCRECT lpRect, POINT ptStart, POINT ptEnd) - { - ATLASSERT(m_hDC != NULL); - return ::Pie(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, ptStart.x, ptStart.y, ptEnd.x, ptEnd.y); - } -#endif // !_WIN32_WCE - - BOOL Polygon(LPPOINT lpPoints, int nCount) - { - ATLASSERT(m_hDC != NULL); - return ::Polygon(m_hDC, lpPoints, nCount); - } - -#ifndef _WIN32_WCE - BOOL PolyPolygon(LPPOINT lpPoints, LPINT lpPolyCounts, int nCount) - { - ATLASSERT(m_hDC != NULL); - return ::PolyPolygon(m_hDC, lpPoints, lpPolyCounts, nCount); - } -#endif // !_WIN32_WCE - - BOOL Rectangle(int x1, int y1, int x2, int y2) - { - ATLASSERT(m_hDC != NULL); - return ::Rectangle(m_hDC, x1, y1, x2, y2); - } - - BOOL Rectangle(LPCRECT lpRect) - { - ATLASSERT(m_hDC != NULL); - return ::Rectangle(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom); - } - - BOOL RoundRect(int x1, int y1, int x2, int y2, int x3, int y3) - { - ATLASSERT(m_hDC != NULL); - return ::RoundRect(m_hDC, x1, y1, x2, y2, x3, y3); - } - - BOOL RoundRect(LPCRECT lpRect, POINT point) - { - ATLASSERT(m_hDC != NULL); - return ::RoundRect(m_hDC, lpRect->left, lpRect->top, lpRect->right, lpRect->bottom, point.x, point.y); - } - -// Bitmap Functions - BOOL PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop) - { - ATLASSERT(m_hDC != NULL); - return ::PatBlt(m_hDC, x, y, nWidth, nHeight, dwRop); - } - - BOOL BitBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, - int xSrc, int ySrc, DWORD dwRop) - { - ATLASSERT(m_hDC != NULL); - return ::BitBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, dwRop); - } - - BOOL StretchBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop) - { - ATLASSERT(m_hDC != NULL); - return ::StretchBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, dwRop); - } - - COLORREF GetPixel(int x, int y) const - { - ATLASSERT(m_hDC != NULL); - return ::GetPixel(m_hDC, x, y); - } - - COLORREF GetPixel(POINT point) const - { - ATLASSERT(m_hDC != NULL); - return ::GetPixel(m_hDC, point.x, point.y); - } - - COLORREF SetPixel(int x, int y, COLORREF crColor) - { - ATLASSERT(m_hDC != NULL); - return ::SetPixel(m_hDC, x, y, crColor); - } - - COLORREF SetPixel(POINT point, COLORREF crColor) - { - ATLASSERT(m_hDC != NULL); - return ::SetPixel(m_hDC, point.x, point.y, crColor); - } - -#ifndef _WIN32_WCE - BOOL FloodFill(int x, int y, COLORREF crColor) - { - ATLASSERT(m_hDC != NULL); - return ::FloodFill(m_hDC, x, y, crColor); - } - - BOOL ExtFloodFill(int x, int y, COLORREF crColor, UINT nFillType) - { - ATLASSERT(m_hDC != NULL); - return ::ExtFloodFill(m_hDC, x, y, crColor, nFillType); - } -#endif // !_WIN32_WCE - - BOOL MaskBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, HBITMAP hMaskBitmap, int xMask, int yMask, DWORD dwRop) - { - ATLASSERT(m_hDC != NULL); - return ::MaskBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, hMaskBitmap, xMask, yMask, dwRop); - } - -#ifndef _WIN32_WCE - BOOL PlgBlt(LPPOINT lpPoint, HDC hSrcDC, int xSrc, int ySrc, int nWidth, int nHeight, HBITMAP hMaskBitmap, int xMask, int yMask) - { - ATLASSERT(m_hDC != NULL); - return ::PlgBlt(m_hDC, lpPoint, hSrcDC, xSrc, ySrc, nWidth, nHeight, hMaskBitmap, xMask, yMask); - } - - BOOL SetPixelV(int x, int y, COLORREF crColor) - { - ATLASSERT(m_hDC != NULL); - return ::SetPixelV(m_hDC, x, y, crColor); - } - - BOOL SetPixelV(POINT point, COLORREF crColor) - { - ATLASSERT(m_hDC != NULL); - return ::SetPixelV(m_hDC, point.x, point.y, crColor); - } -#endif // !_WIN32_WCE - -#if !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE) -#ifndef _WIN32_WCE - BOOL TransparentBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent) - { - ATLASSERT(m_hDC != NULL); - return ::TransparentBlt(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent); - } -#else // CE specific - BOOL TransparentImage(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, UINT crTransparent) - { - ATLASSERT(m_hDC != NULL); - return ::TransparentImage(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, crTransparent); - } -#endif // _WIN32_WCE - -#if (!defined(_WIN32_WCE) || (_WIN32_WCE >= 420)) - BOOL GradientFill(const PTRIVERTEX pVertices, DWORD nVertices, void* pMeshElements, DWORD nMeshElements, DWORD dwMode) - { - ATLASSERT(m_hDC != NULL); - return ::GradientFill(m_hDC, pVertices, nVertices, pMeshElements, nMeshElements, dwMode); - } - - BOOL GradientFillRect(RECT& rect, COLORREF clr1, COLORREF clr2, bool bHorizontal) - { - ATLASSERT(m_hDC != NULL); - - TRIVERTEX arrTvx[2] = { { 0 }, { 0 } }; - - arrTvx[0].x = rect.left; - arrTvx[0].y = rect.top; - arrTvx[0].Red = MAKEWORD(0, GetRValue(clr1)); - arrTvx[0].Green = MAKEWORD(0, GetGValue(clr1)); - arrTvx[0].Blue = MAKEWORD(0, GetBValue(clr1)); - arrTvx[0].Alpha = 0; - - arrTvx[1].x = rect.right; - arrTvx[1].y = rect.bottom; - arrTvx[1].Red = MAKEWORD(0, GetRValue(clr2)); - arrTvx[1].Green = MAKEWORD(0, GetGValue(clr2)); - arrTvx[1].Blue = MAKEWORD(0, GetBValue(clr2)); - arrTvx[1].Alpha = 0; - - GRADIENT_RECT gr = { 0, 1 }; - - return ::GradientFill(m_hDC, arrTvx, 2, &gr, 1, bHorizontal ? GRADIENT_FILL_RECT_H : GRADIENT_FILL_RECT_V); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) - -#if !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500) - BOOL AlphaBlend(int x, int y, int nWidth, int nHeight, HDC hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, BLENDFUNCTION bf) - { - ATLASSERT(m_hDC != NULL); - return ::AlphaBlend(m_hDC, x, y, nWidth, nHeight, hSrcDC, xSrc, ySrc, nSrcWidth, nSrcHeight, bf); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE > 0x500) -#endif // !defined(_ATL_NO_MSIMG) || defined(_WIN32_WCE) - -// Extra bitmap functions - // Helper function for painting a disabled toolbar or menu bitmap - // This function can take either an HBITMAP (for SS) or a DC with - // the bitmap already painted (for cmdbar) - BOOL DitherBlt(int x, int y, int nWidth, int nHeight, HDC hSrcDC, HBITMAP hBitmap, int xSrc, int ySrc, - HBRUSH hBrushBackground = ::GetSysColorBrush(COLOR_3DFACE), - HBRUSH hBrush3DEffect = ::GetSysColorBrush(COLOR_3DHILIGHT), - HBRUSH hBrushDisabledImage = ::GetSysColorBrush(COLOR_3DSHADOW)) - { - ATLASSERT(m_hDC != NULL || hBitmap != NULL); - ATLASSERT(nWidth > 0 && nHeight > 0); - - // Create a generic DC for all BitBlts - CDCHandle dc = (hSrcDC != NULL) ? hSrcDC : ::CreateCompatibleDC(m_hDC); - ATLASSERT(dc.m_hDC != NULL); - if(dc.m_hDC == NULL) - return FALSE; - - // Create a DC for the monochrome DIB section - CDC dcBW = ::CreateCompatibleDC(m_hDC); - ATLASSERT(dcBW.m_hDC != NULL); - if(dcBW.m_hDC == NULL) - { - if(hSrcDC == NULL) - dc.DeleteDC(); - return FALSE; - } - - // Create the monochrome DIB section with a black and white palette - struct RGBBWBITMAPINFO - { - BITMAPINFOHEADER bmiHeader; - RGBQUAD bmiColors[2]; - }; - - RGBBWBITMAPINFO rgbBWBitmapInfo = - { - { sizeof(BITMAPINFOHEADER), nWidth, nHeight, 1, 1, BI_RGB, 0, 0, 0, 0, 0 }, - { { 0x00, 0x00, 0x00, 0x00 }, { 0xFF, 0xFF, 0xFF, 0x00 } } - }; - - VOID* pbitsBW; - CBitmap bmpBW = ::CreateDIBSection(dcBW, (LPBITMAPINFO)&rgbBWBitmapInfo, DIB_RGB_COLORS, &pbitsBW, NULL, 0); - ATLASSERT(bmpBW.m_hBitmap != NULL); - if(bmpBW.m_hBitmap == NULL) - { - if(hSrcDC == NULL) - dc.DeleteDC(); - return FALSE; - } - - // Attach the monochrome DIB section and the bitmap to the DCs - HBITMAP hbmOldBW = dcBW.SelectBitmap(bmpBW); - HBITMAP hbmOldDC = NULL; - if(hBitmap != NULL) - hbmOldDC = dc.SelectBitmap(hBitmap); - - // Block: Dark gray removal: we want (128, 128, 128) pixels to become black and not white - { - CDC dcTemp1 = ::CreateCompatibleDC(m_hDC); - CDC dcTemp2 = ::CreateCompatibleDC(m_hDC); - CBitmap bmpTemp1; - bmpTemp1.CreateCompatibleBitmap(dc, nWidth, nHeight); - CBitmap bmpTemp2; - bmpTemp2.CreateBitmap(nWidth, nHeight, 1, 1, NULL); - HBITMAP hOldBmp1 = dcTemp1.SelectBitmap(bmpTemp1); - HBITMAP hOldBmp2 = dcTemp2.SelectBitmap(bmpTemp2); - // Let's copy our image, it will be altered - dcTemp1.BitBlt(0, 0, nWidth, nHeight, dc, xSrc, ySrc, SRCCOPY); - - // All dark gray pixels will become white, the others black - dcTemp1.SetBkColor(RGB(128, 128, 128)); - dcTemp2.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY); - // Do an XOR to set to black these white pixels - dcTemp1.BitBlt(0, 0, nWidth, nHeight, dcTemp2, 0, 0, SRCINVERT); - - // BitBlt the bitmap into the monochrome DIB section - // The DIB section will do a true monochrome conversion - // The magenta background being closer to white will become white - dcBW.BitBlt(0, 0, nWidth, nHeight, dcTemp1, 0, 0, SRCCOPY); - - // Cleanup - dcTemp1.SelectBitmap(hOldBmp1); - dcTemp2.SelectBitmap(hOldBmp2); - } - - // Paint the destination rectangle using hBrushBackground - if(hBrushBackground != NULL) - { - RECT rc = { x, y, x + nWidth, y + nHeight }; - FillRect(&rc, hBrushBackground); - } - - // BitBlt the black bits in the monochrome bitmap into hBrush3DEffect color in the destination DC - // The magic ROP comes from the Charles Petzold's book - HBRUSH hOldBrush = SelectBrush(hBrush3DEffect); - BitBlt(x + 1, y + 1, nWidth, nHeight, dcBW, 0, 0, 0xB8074A); - - // BitBlt the black bits in the monochrome bitmap into hBrushDisabledImage color in the destination DC - SelectBrush(hBrushDisabledImage); - BitBlt(x, y, nWidth, nHeight, dcBW, 0, 0, 0xB8074A); - - SelectBrush(hOldBrush); - dcBW.SelectBitmap(hbmOldBW); - dc.SelectBitmap(hbmOldDC); - - if(hSrcDC == NULL) - dc.DeleteDC(); - - return TRUE; - } - -// Text Functions -#ifndef _WIN32_WCE - BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount = -1) - { - ATLASSERT(m_hDC != NULL); - if(nCount == -1) - nCount = lstrlen(lpszString); - return ::TextOut(m_hDC, x, y, lpszString, nCount); - } -#endif // !_WIN32_WCE - - BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount = -1, LPINT lpDxWidths = NULL) - { - ATLASSERT(m_hDC != NULL); - if(nCount == -1) - nCount = lstrlen(lpszString); - return ::ExtTextOut(m_hDC, x, y, nOptions, lpRect, lpszString, nCount, lpDxWidths); - } - -#ifndef _WIN32_WCE - SIZE TabbedTextOut(int x, int y, LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL, int nTabOrigin = 0) - { - ATLASSERT(m_hDC != NULL); - if(nCount == -1) - nCount = lstrlen(lpszString); - LONG lRes = ::TabbedTextOut(m_hDC, x, y, lpszString, nCount, nTabPositions, lpnTabStopPositions, nTabOrigin); - SIZE size = { GET_X_LPARAM(lRes), GET_Y_LPARAM(lRes) }; - return size; - } -#endif // !_WIN32_WCE - - int DrawText(LPCTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat) - { - ATLASSERT(m_hDC != NULL); -#ifndef _WIN32_WCE - ATLASSERT((uFormat & DT_MODIFYSTRING) == 0); -#endif // !_WIN32_WCE - return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat); - } - - int DrawText(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat) - { - ATLASSERT(m_hDC != NULL); - return ::DrawText(m_hDC, lpstrText, cchText, lpRect, uFormat); - } - -#ifndef _WIN32_WCE - int DrawTextEx(LPTSTR lpstrText, int cchText, LPRECT lpRect, UINT uFormat, LPDRAWTEXTPARAMS lpDTParams = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::DrawTextEx(m_hDC, lpstrText, cchText, lpRect, uFormat, lpDTParams); - } -#endif // !_WIN32_WCE - -#if (_WIN32_WINNT >= 0x0501) - int DrawShadowText(LPCWSTR lpstrText, int cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset) - { - ATLASSERT(m_hDC != NULL); - // This function is present only if comctl32.dll version 6 is loaded; - // we use LoadLibrary/GetProcAddress to allow apps compiled with - // _WIN32_WINNT >= 0x0501 to run on older Windows/CommCtrl - int nRet = 0; - HMODULE hCommCtrlDLL = ::LoadLibrary(_T("comctl32.dll")); - ATLASSERT(hCommCtrlDLL != NULL); - if(hCommCtrlDLL != NULL) - { - typedef int (WINAPI *PFN_DrawShadowText)(HDC hDC, LPCWSTR lpstrText, UINT cchText, LPRECT lpRect, DWORD dwFlags, COLORREF clrText, COLORREF clrShadow, int xOffset, int yOffset); - PFN_DrawShadowText pfnDrawShadowText = (PFN_DrawShadowText)::GetProcAddress(hCommCtrlDLL, "DrawShadowText"); - ATLASSERT(pfnDrawShadowText != NULL); // this function requires CommCtrl6 - if(pfnDrawShadowText != NULL) - nRet = pfnDrawShadowText(m_hDC, lpstrText, cchText, lpRect, dwFlags, clrText, clrShadow, xOffset, yOffset); - ::FreeLibrary(hCommCtrlDLL); - } - return nRet; - } -#endif // (_WIN32_WINNT >= 0x0501) - - BOOL GetTextExtent(LPCTSTR lpszString, int nCount, LPSIZE lpSize) const - { - ATLASSERT(m_hDC != NULL); - if(nCount == -1) - nCount = lstrlen(lpszString); - return ::GetTextExtentPoint32(m_hDC, lpszString, nCount, lpSize); - } - - BOOL GetTextExtentExPoint(LPCTSTR lpszString, int cchString, LPSIZE lpSize, int nMaxExtent, LPINT lpnFit = NULL, LPINT alpDx = NULL) - { - ATLASSERT(m_hDC != NULL); - return ::GetTextExtentExPoint(m_hDC, lpszString, cchString, nMaxExtent, lpnFit, alpDx, lpSize); - } - -#ifndef _WIN32_WCE - DWORD GetTabbedTextExtent(LPCTSTR lpszString, int nCount = -1, int nTabPositions = 0, LPINT lpnTabStopPositions = NULL) const - { - ATLASSERT(m_hDC != NULL); - if(nCount == -1) - nCount = lstrlen(lpszString); - return ::GetTabbedTextExtent(m_hDC, lpszString, nCount, nTabPositions, lpnTabStopPositions); - } - - BOOL GrayString(HBRUSH hBrush, BOOL (CALLBACK* lpfnOutput)(HDC, LPARAM, int), LPARAM lpData, int nCount, int x, int y, int nWidth, int nHeight) - { - ATLASSERT(m_hDC != NULL); - return ::GrayString(m_hDC, hBrush, (GRAYSTRINGPROC)lpfnOutput, lpData, nCount, x, y, nWidth, nHeight); - } -#endif // !_WIN32_WCE - -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - UINT GetTextAlign() const - { - ATLASSERT(m_hDC != NULL); - return ::GetTextAlign(m_hDC); - } - - UINT SetTextAlign(UINT nFlags) - { - ATLASSERT(m_hDC != NULL); - return ::SetTextAlign(m_hDC, nFlags); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - - int GetTextFace(LPTSTR lpszFacename, int nCount) const - { - ATLASSERT(m_hDC != NULL); - return ::GetTextFace(m_hDC, nCount, lpszFacename); - } - - int GetTextFaceLen() const - { - ATLASSERT(m_hDC != NULL); - return ::GetTextFace(m_hDC, 0, NULL); - } - -#ifndef _ATL_NO_COM -#ifdef _OLEAUTO_H_ - BOOL GetTextFace(BSTR& bstrFace) const - { - USES_CONVERSION; - ATLASSERT(m_hDC != NULL); - ATLASSERT(bstrFace == NULL); - - int nLen = GetTextFaceLen(); - if(nLen == 0) - return FALSE; - - CTempBuffer buff; - LPTSTR lpszText = buff.Allocate(nLen); - if(lpszText == NULL) - return FALSE; - - if(!GetTextFace(lpszText, nLen)) - return FALSE; - - bstrFace = ::SysAllocString(T2OLE(lpszText)); - return (bstrFace != NULL) ? TRUE : FALSE; - } -#endif -#endif // !_ATL_NO_COM - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - int GetTextFace(_CSTRING_NS::CString& strFace) const - { - ATLASSERT(m_hDC != NULL); - - int nLen = GetTextFaceLen(); - if(nLen == 0) - return 0; - - LPTSTR lpstr = strFace.GetBufferSetLength(nLen); - if(lpstr == NULL) - return 0; - int nRet = GetTextFace(lpstr, nLen); - strFace.ReleaseBuffer(); - return nRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - BOOL GetTextMetrics(LPTEXTMETRIC lpMetrics) const - { - ATLASSERT(m_hDC != NULL); - return ::GetTextMetrics(m_hDC, lpMetrics); - } - -#ifndef _WIN32_WCE - int SetTextJustification(int nBreakExtra, int nBreakCount) - { - ATLASSERT(m_hDC != NULL); - return ::SetTextJustification(m_hDC, nBreakExtra, nBreakCount); - } - - int GetTextCharacterExtra() const - { - ATLASSERT(m_hDC != NULL); - return ::GetTextCharacterExtra(m_hDC); - } - - int SetTextCharacterExtra(int nCharExtra) - { - ATLASSERT(m_hDC != NULL); - return ::SetTextCharacterExtra(m_hDC, nCharExtra); - } -#endif // !_WIN32_WCE - -// Advanced Drawing - BOOL DrawEdge(LPRECT lpRect, UINT nEdge, UINT nFlags) - { - ATLASSERT(m_hDC != NULL); - return ::DrawEdge(m_hDC, lpRect, nEdge, nFlags); - } - - BOOL DrawFrameControl(LPRECT lpRect, UINT nType, UINT nState) - { - ATLASSERT(m_hDC != NULL); - return ::DrawFrameControl(m_hDC, lpRect, nType, nState); - } - -// Scrolling Functions - BOOL ScrollDC(int dx, int dy, LPCRECT lpRectScroll, LPCRECT lpRectClip, HRGN hRgnUpdate, LPRECT lpRectUpdate) - { - ATLASSERT(m_hDC != NULL); - return ::ScrollDC(m_hDC, dx, dy, lpRectScroll, lpRectClip, hRgnUpdate, lpRectUpdate); - } - -// Font Functions -#ifndef _WIN32_WCE - BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const - { - ATLASSERT(m_hDC != NULL); - return ::GetCharWidth(m_hDC, nFirstChar, nLastChar, lpBuffer); - } - - // GetCharWidth32 is not supported under Win9x - BOOL GetCharWidth32(UINT nFirstChar, UINT nLastChar, LPINT lpBuffer) const - { - ATLASSERT(m_hDC != NULL); - return ::GetCharWidth32(m_hDC, nFirstChar, nLastChar, lpBuffer); - } - - DWORD SetMapperFlags(DWORD dwFlag) - { - ATLASSERT(m_hDC != NULL); - return ::SetMapperFlags(m_hDC, dwFlag); - } - - BOOL GetAspectRatioFilter(LPSIZE lpSize) const - { - ATLASSERT(m_hDC != NULL); - return ::GetAspectRatioFilterEx(m_hDC, lpSize); - } - - BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABC lpabc) const - { - ATLASSERT(m_hDC != NULL); - return ::GetCharABCWidths(m_hDC, nFirstChar, nLastChar, lpabc); - } - - DWORD GetFontData(DWORD dwTable, DWORD dwOffset, LPVOID lpData, DWORD cbData) const - { - ATLASSERT(m_hDC != NULL); - return ::GetFontData(m_hDC, dwTable, dwOffset, lpData, cbData); - } - - int GetKerningPairs(int nPairs, LPKERNINGPAIR lpkrnpair) const - { - ATLASSERT(m_hDC != NULL); - return ::GetKerningPairs(m_hDC, nPairs, lpkrnpair); - } - - UINT GetOutlineTextMetrics(UINT cbData, LPOUTLINETEXTMETRIC lpotm) const - { - ATLASSERT(m_hDC != NULL); - return ::GetOutlineTextMetrics(m_hDC, cbData, lpotm); - } - - DWORD GetGlyphOutline(UINT nChar, UINT nFormat, LPGLYPHMETRICS lpgm, DWORD cbBuffer, LPVOID lpBuffer, const MAT2* lpmat2) const - { - ATLASSERT(m_hDC != NULL); - return ::GetGlyphOutline(m_hDC, nChar, nFormat, lpgm, cbBuffer, lpBuffer, lpmat2); - } - - BOOL GetCharABCWidths(UINT nFirstChar, UINT nLastChar, LPABCFLOAT lpABCF) const - { - ATLASSERT(m_hDC != NULL); - return ::GetCharABCWidthsFloat(m_hDC, nFirstChar, nLastChar, lpABCF); - } - - BOOL GetCharWidth(UINT nFirstChar, UINT nLastChar, float* lpFloatBuffer) const - { - ATLASSERT(m_hDC != NULL); - return ::GetCharWidthFloat(m_hDC, nFirstChar, nLastChar, lpFloatBuffer); - } -#endif // !_WIN32_WCE - -// Printer/Device Escape Functions -#ifndef _WIN32_WCE - int Escape(int nEscape, int nCount, LPCSTR lpszInData, LPVOID lpOutData) - { - ATLASSERT(m_hDC != NULL); - return ::Escape(m_hDC, nEscape, nCount, lpszInData, lpOutData); - } -#endif // !_WIN32_WCE - - int Escape(int nEscape, int nInputSize, LPCSTR lpszInputData, - int nOutputSize, LPSTR lpszOutputData) - { - ATLASSERT(m_hDC != NULL); - return ::ExtEscape(m_hDC, nEscape, nInputSize, lpszInputData, nOutputSize, lpszOutputData); - } - -#ifndef _WIN32_WCE - int DrawEscape(int nEscape, int nInputSize, LPCSTR lpszInputData) - { - ATLASSERT(m_hDC != NULL); - return ::DrawEscape(m_hDC, nEscape, nInputSize, lpszInputData); - } -#endif // !_WIN32_WCE - - // Escape helpers -#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc)) - int StartDoc(LPCTSTR lpszDocName) // old Win3.0 version - { - DOCINFO di = { 0 }; - di.cbSize = sizeof(DOCINFO); - di.lpszDocName = lpszDocName; - return StartDoc(&di); - } - - int StartDoc(LPDOCINFO lpDocInfo) - { - ATLASSERT(m_hDC != NULL); - return ::StartDoc(m_hDC, lpDocInfo); - } - - int StartPage() - { - ATLASSERT(m_hDC != NULL); - return ::StartPage(m_hDC); - } - - int EndPage() - { - ATLASSERT(m_hDC != NULL); - return ::EndPage(m_hDC); - } - - int SetAbortProc(BOOL (CALLBACK* lpfn)(HDC, int)) - { - ATLASSERT(m_hDC != NULL); - return ::SetAbortProc(m_hDC, (ABORTPROC)lpfn); - } - - int AbortDoc() - { - ATLASSERT(m_hDC != NULL); - return ::AbortDoc(m_hDC); - } - - int EndDoc() - { - ATLASSERT(m_hDC != NULL); - return ::EndDoc(m_hDC); - } -#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 200) && defined(StartDoc)) - -// MetaFile Functions -#ifndef _WIN32_WCE - BOOL PlayMetaFile(HMETAFILE hMF) - { - ATLASSERT(m_hDC != NULL); - if(::GetDeviceCaps(m_hDC, TECHNOLOGY) == DT_METAFILE) - { - // playing metafile in metafile, just use core windows API - return ::PlayMetaFile(m_hDC, hMF); - } - - // for special playback, lParam == pDC - return ::EnumMetaFile(m_hDC, hMF, EnumMetaFileProc, (LPARAM)this); - } - - BOOL PlayMetaFile(HENHMETAFILE hEnhMetaFile, LPCRECT lpBounds) - { - ATLASSERT(m_hDC != NULL); - return ::PlayEnhMetaFile(m_hDC, hEnhMetaFile, lpBounds); - } - - BOOL AddMetaFileComment(UINT nDataSize, const BYTE* pCommentData) // can be used for enhanced metafiles only - { - ATLASSERT(m_hDC != NULL); - return ::GdiComment(m_hDC, nDataSize, pCommentData); - } - - // Special handling for metafile playback - static int CALLBACK EnumMetaFileProc(HDC hDC, HANDLETABLE* pHandleTable, METARECORD* pMetaRec, int nHandles, LPARAM lParam) - { - CDCHandle* pDC = (CDCHandle*)lParam; - - switch (pMetaRec->rdFunction) - { - case META_SETMAPMODE: - pDC->SetMapMode((int)(short)pMetaRec->rdParm[0]); - break; - case META_SETWINDOWEXT: - pDC->SetWindowExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); - break; - case META_SETWINDOWORG: - pDC->SetWindowOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); - break; - case META_SETVIEWPORTEXT: - pDC->SetViewportExt((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); - break; - case META_SETVIEWPORTORG: - pDC->SetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); - break; - case META_SCALEWINDOWEXT: - pDC->ScaleWindowExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2], - (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); - break; - case META_SCALEVIEWPORTEXT: - pDC->ScaleViewportExt((int)(short)pMetaRec->rdParm[3], (int)(short)pMetaRec->rdParm[2], - (int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); - break; - case META_OFFSETVIEWPORTORG: - pDC->OffsetViewportOrg((int)(short)pMetaRec->rdParm[1], (int)(short)pMetaRec->rdParm[0]); - break; - case META_SAVEDC: - pDC->SaveDC(); - break; - case META_RESTOREDC: - pDC->RestoreDC((int)(short)pMetaRec->rdParm[0]); - break; - case META_SETBKCOLOR: - pDC->SetBkColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]); - break; - case META_SETTEXTCOLOR: - pDC->SetTextColor(*(UNALIGNED COLORREF*)&pMetaRec->rdParm[0]); - break; - - // need to watch out for SelectObject(HFONT), for custom font mapping - case META_SELECTOBJECT: - { - HGDIOBJ hObject = pHandleTable->objectHandle[pMetaRec->rdParm[0]]; - UINT nObjType = ::GetObjectType(hObject); - if(nObjType == 0) - { - // object type is unknown, determine if it is a font - HFONT hStockFont = (HFONT)::GetStockObject(SYSTEM_FONT); - HFONT hFontOld = (HFONT)::SelectObject(pDC->m_hDC, hStockFont); - HGDIOBJ hObjOld = ::SelectObject(pDC->m_hDC, hObject); - if(hObjOld == hStockFont) - { - // got the stock object back, so must be selecting a font - pDC->SelectFont((HFONT)hObject); - break; // don't play the default record - } - else - { - // didn't get the stock object back, so restore everything - ::SelectObject(pDC->m_hDC, hFontOld); - ::SelectObject(pDC->m_hDC, hObjOld); - } - // and fall through to PlayMetaFileRecord... - } - else if(nObjType == OBJ_FONT) - { - // play back as CDCHandle::SelectFont(HFONT) - pDC->SelectFont((HFONT)hObject); - break; // don't play the default record - } - } - // fall through... - - default: - ::PlayMetaFileRecord(hDC, pHandleTable, pMetaRec, nHandles); - break; - } - - return 1; - } -#endif // !_WIN32_WCE - -// Path Functions -#ifndef _WIN32_WCE - BOOL AbortPath() - { - ATLASSERT(m_hDC != NULL); - return ::AbortPath(m_hDC); - } - - BOOL BeginPath() - { - ATLASSERT(m_hDC != NULL); - return ::BeginPath(m_hDC); - } - - BOOL CloseFigure() - { - ATLASSERT(m_hDC != NULL); - return ::CloseFigure(m_hDC); - } - - BOOL EndPath() - { - ATLASSERT(m_hDC != NULL); - return ::EndPath(m_hDC); - } - - BOOL FillPath() - { - ATLASSERT(m_hDC != NULL); - return ::FillPath(m_hDC); - } - - BOOL FlattenPath() - { - ATLASSERT(m_hDC != NULL); - return ::FlattenPath(m_hDC); - } - - BOOL StrokeAndFillPath() - { - ATLASSERT(m_hDC != NULL); - return ::StrokeAndFillPath(m_hDC); - } - - BOOL StrokePath() - { - ATLASSERT(m_hDC != NULL); - return ::StrokePath(m_hDC); - } - - BOOL WidenPath() - { - ATLASSERT(m_hDC != NULL); - return ::WidenPath(m_hDC); - } - - BOOL GetMiterLimit(PFLOAT pfMiterLimit) const - { - ATLASSERT(m_hDC != NULL); - return ::GetMiterLimit(m_hDC, pfMiterLimit); - } - - BOOL SetMiterLimit(float fMiterLimit) - { - ATLASSERT(m_hDC != NULL); - return ::SetMiterLimit(m_hDC, fMiterLimit, NULL); - } - - int GetPath(LPPOINT lpPoints, LPBYTE lpTypes, int nCount) const - { - ATLASSERT(m_hDC != NULL); - return ::GetPath(m_hDC, lpPoints, lpTypes, nCount); - } - - BOOL SelectClipPath(int nMode) - { - ATLASSERT(m_hDC != NULL); - return ::SelectClipPath(m_hDC, nMode); - } -#endif // !_WIN32_WCE - -// Misc Helper Functions - static CBrushHandle PASCAL GetHalftoneBrush() - { - HBRUSH halftoneBrush = NULL; - WORD grayPattern[8]; - for(int i = 0; i < 8; i++) - grayPattern[i] = (WORD)(0x5555 << (i & 1)); - HBITMAP grayBitmap = CreateBitmap(8, 8, 1, 1, &grayPattern); - if(grayBitmap != NULL) - { - halftoneBrush = ::CreatePatternBrush(grayBitmap); - DeleteObject(grayBitmap); - } - return CBrushHandle(halftoneBrush); - } - - void DrawDragRect(LPCRECT lpRect, SIZE size, LPCRECT lpRectLast, SIZE sizeLast, HBRUSH hBrush = NULL, HBRUSH hBrushLast = NULL) - { - // first, determine the update region and select it - CRgn rgnOutside; - rgnOutside.CreateRectRgnIndirect(lpRect); - RECT rect = *lpRect; - ::InflateRect(&rect, -size.cx, -size.cy); - ::IntersectRect(&rect, &rect, lpRect); - CRgn rgnInside; - rgnInside.CreateRectRgnIndirect(&rect); - CRgn rgnNew; - rgnNew.CreateRectRgn(0, 0, 0, 0); - rgnNew.CombineRgn(rgnOutside, rgnInside, RGN_XOR); - - HBRUSH hBrushOld = NULL; - CBrush brushHalftone; - if(hBrush == NULL) - brushHalftone = hBrush = CDCHandle::GetHalftoneBrush(); - if(hBrushLast == NULL) - hBrushLast = hBrush; - - CRgn rgnLast; - CRgn rgnUpdate; - if(lpRectLast != NULL) - { - // find difference between new region and old region - rgnLast.CreateRectRgn(0, 0, 0, 0); - rgnOutside.SetRectRgn(lpRectLast->left, lpRectLast->top, lpRectLast->right, lpRectLast->bottom); - rect = *lpRectLast; - ::InflateRect(&rect, -sizeLast.cx, -sizeLast.cy); - ::IntersectRect(&rect, &rect, lpRectLast); - rgnInside.SetRectRgn(rect.left, rect.top, rect.right, rect.bottom); - rgnLast.CombineRgn(rgnOutside, rgnInside, RGN_XOR); - - // only diff them if brushes are the same - if(hBrush == hBrushLast) - { - rgnUpdate.CreateRectRgn(0, 0, 0, 0); - rgnUpdate.CombineRgn(rgnLast, rgnNew, RGN_XOR); - } - } - if(hBrush != hBrushLast && lpRectLast != NULL) - { - // brushes are different -- erase old region first - SelectClipRgn(rgnLast); - GetClipBox(&rect); - hBrushOld = SelectBrush(hBrushLast); - PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT); - SelectBrush(hBrushOld); - hBrushOld = NULL; - } - - // draw into the update/new region - SelectClipRgn(rgnUpdate.IsNull() ? rgnNew : rgnUpdate); - GetClipBox(&rect); - hBrushOld = SelectBrush(hBrush); - PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT); - - // cleanup DC - if(hBrushOld != NULL) - SelectBrush(hBrushOld); - SelectClipRgn(NULL); - } - - void FillSolidRect(LPCRECT lpRect, COLORREF clr) - { - ATLASSERT(m_hDC != NULL); - - COLORREF clrOld = ::SetBkColor(m_hDC, clr); - ATLASSERT(clrOld != CLR_INVALID); - if(clrOld != CLR_INVALID) - { - ::ExtTextOut(m_hDC, 0, 0, ETO_OPAQUE, lpRect, NULL, 0, NULL); - ::SetBkColor(m_hDC, clrOld); - } - } - - void FillSolidRect(int x, int y, int cx, int cy, COLORREF clr) - { - ATLASSERT(m_hDC != NULL); - - RECT rect = { x, y, x + cx, y + cy }; - FillSolidRect(&rect, clr); - } - - void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight) - { - Draw3dRect(lpRect->left, lpRect->top, lpRect->right - lpRect->left, - lpRect->bottom - lpRect->top, clrTopLeft, clrBottomRight); - } - - void Draw3dRect(int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight) - { - FillSolidRect(x, y, cx - 1, 1, clrTopLeft); - FillSolidRect(x, y, 1, cy - 1, clrTopLeft); - FillSolidRect(x + cx, y, -1, cy, clrBottomRight); - FillSolidRect(x, y + cy, cx, -1, clrBottomRight); - } - -// DIB support -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) - int SetDIBitsToDevice(int x, int y, DWORD dwWidth, DWORD dwHeight, int xSrc, int ySrc, UINT uStartScan, UINT cScanLines, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse) - { - ATLASSERT(m_hDC != NULL); - return ::SetDIBitsToDevice(m_hDC, x, y, dwWidth, dwHeight, xSrc, ySrc, uStartScan, cScanLines, lpvBits, lpbmi, uColorUse); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 410) - -#if !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - int StretchDIBits(int x, int y, int nWidth, int nHeight, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, CONST VOID* lpvBits, CONST BITMAPINFO* lpbmi, UINT uColorUse, DWORD dwRop) - { - ATLASSERT(m_hDC != NULL); - return ::StretchDIBits(m_hDC, x, y, nWidth, nHeight, xSrc, ySrc, nSrcWidth, nSrcHeight, lpvBits, lpbmi, uColorUse, dwRop); - } - - UINT GetDIBColorTable(UINT uStartIndex, UINT cEntries, RGBQUAD* pColors) const - { - ATLASSERT(m_hDC != NULL); - return ::GetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors); - } - - UINT SetDIBColorTable(UINT uStartIndex, UINT cEntries, CONST RGBQUAD* pColors) - { - ATLASSERT(m_hDC != NULL); - return ::SetDIBColorTable(m_hDC, uStartIndex, cEntries, pColors); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 400) - -// OpenGL support -#if !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) - int ChoosePixelFormat(CONST PIXELFORMATDESCRIPTOR* ppfd) - { - ATLASSERT(m_hDC != NULL); - return ::ChoosePixelFormat(m_hDC, ppfd); - } - - int DescribePixelFormat(int iPixelFormat, UINT nBytes, LPPIXELFORMATDESCRIPTOR ppfd) - { - ATLASSERT(m_hDC != NULL); - return ::DescribePixelFormat(m_hDC, iPixelFormat, nBytes, ppfd); - } - - int GetPixelFormat() const - { - ATLASSERT(m_hDC != NULL); - return ::GetPixelFormat(m_hDC); - } - - BOOL SetPixelFormat(int iPixelFormat, CONST PIXELFORMATDESCRIPTOR* ppfd) - { - ATLASSERT(m_hDC != NULL); - return ::SetPixelFormat(m_hDC, iPixelFormat, ppfd); - } - - BOOL SwapBuffers() - { - ATLASSERT(m_hDC != NULL); - return ::SwapBuffers(m_hDC); - } - - HGLRC wglCreateContext() - { - ATLASSERT(m_hDC != NULL); - return ::wglCreateContext(m_hDC); - } - - HGLRC wglCreateLayerContext(int iLayerPlane) - { - ATLASSERT(m_hDC != NULL); - return ::wglCreateLayerContext(m_hDC, iLayerPlane); - } - - BOOL wglMakeCurrent(HGLRC hglrc) - { - ATLASSERT(m_hDC != NULL); - return ::wglMakeCurrent(m_hDC, hglrc); - } - - BOOL wglUseFontBitmaps(DWORD dwFirst, DWORD dwCount, DWORD listBase) - { - ATLASSERT(m_hDC != NULL); - return ::wglUseFontBitmaps(m_hDC, dwFirst, dwCount, listBase); - } - - BOOL wglUseFontOutlines(DWORD dwFirst, DWORD dwCount, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf) - { - ATLASSERT(m_hDC != NULL); - return ::wglUseFontOutlines(m_hDC, dwFirst, dwCount, listBase, deviation, extrusion, format, lpgmf); - } - - BOOL wglDescribeLayerPlane(int iPixelFormat, int iLayerPlane, UINT nBytes, LPLAYERPLANEDESCRIPTOR plpd) - { - ATLASSERT(m_hDC != NULL); - return ::wglDescribeLayerPlane(m_hDC, iPixelFormat, iLayerPlane, nBytes, plpd); - } - - int wglSetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, CONST COLORREF* pclr) - { - ATLASSERT(m_hDC != NULL); - return ::wglSetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr); - } - - int wglGetLayerPaletteEntries(int iLayerPlane, int iStart, int cEntries, COLORREF* pclr) - { - ATLASSERT(m_hDC != NULL); - return ::wglGetLayerPaletteEntries(m_hDC, iLayerPlane, iStart, cEntries, pclr); - } - - BOOL wglRealizeLayerPalette(int iLayerPlane, BOOL bRealize) - { - ATLASSERT(m_hDC != NULL); - return ::wglRealizeLayerPalette(m_hDC, iLayerPlane, bRealize); - } - - BOOL wglSwapLayerBuffers(UINT uPlanes) - { - ATLASSERT(m_hDC != NULL); - return ::wglSwapLayerBuffers(m_hDC, uPlanes); - } -#endif // !defined(_ATL_NO_OPENGL) && !defined(_WIN32_WCE) - -// New for Windows 2000 only -#if (_WIN32_WINNT >= 0x0500) - COLORREF GetDCPenColor() const - { - ATLASSERT(m_hDC != NULL); - return ::GetDCPenColor(m_hDC); - } - - COLORREF SetDCPenColor(COLORREF clr) - { - ATLASSERT(m_hDC != NULL); - return ::SetDCPenColor(m_hDC, clr); - } - - COLORREF GetDCBrushColor() const - { - ATLASSERT(m_hDC != NULL); - return ::GetDCBrushColor(m_hDC); - } - - COLORREF SetDCBrushColor(COLORREF clr) - { - ATLASSERT(m_hDC != NULL); - return ::SetDCBrushColor(m_hDC, clr); - } - -#ifndef _WIN32_WCE - DWORD GetFontUnicodeRanges(LPGLYPHSET lpgs) const - { - ATLASSERT(m_hDC != NULL); - return ::GetFontUnicodeRanges(m_hDC, lpgs); - } -#endif // !_WIN32_WCE - - DWORD GetGlyphIndices(LPCTSTR lpstr, int cch, LPWORD pgi, DWORD dwFlags) const - { - ATLASSERT(m_hDC != NULL); - return ::GetGlyphIndices(m_hDC, lpstr, cch, pgi, dwFlags); - } - - BOOL GetTextExtentPointI(LPWORD pgiIn, int cgi, LPSIZE lpSize) const - { - ATLASSERT(m_hDC != NULL); - return ::GetTextExtentPointI(m_hDC, pgiIn, cgi, lpSize); - } - - BOOL GetTextExtentExPointI(LPWORD pgiIn, int cgi, int nMaxExtent, LPINT lpnFit, LPINT alpDx, LPSIZE lpSize) const - { - ATLASSERT(m_hDC != NULL); - return ::GetTextExtentExPointI(m_hDC, pgiIn, cgi, nMaxExtent, lpnFit, alpDx, lpSize); - } - - BOOL GetCharWidthI(UINT giFirst, UINT cgi, LPWORD pgi, LPINT lpBuffer) const - { - ATLASSERT(m_hDC != NULL); - return ::GetCharWidthI(m_hDC, giFirst, cgi, pgi, lpBuffer); - } - - BOOL GetCharABCWidthsI(UINT giFirst, UINT cgi, LPWORD pgi, LPABC lpabc) const - { - ATLASSERT(m_hDC != NULL); - return ::GetCharABCWidthsI(m_hDC, giFirst, cgi, pgi, lpabc); - } -#endif // (_WIN32_WINNT >= 0x0500) - -// New for Windows 2000 and Windows 98 -#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) - BOOL ColorCorrectPalette(HPALETTE hPalette, DWORD dwFirstEntry, DWORD dwNumOfEntries) - { - ATLASSERT(m_hDC != NULL); - return ::ColorCorrectPalette(m_hDC, hPalette, dwFirstEntry, dwNumOfEntries); - } -#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) -}; - -typedef CDCT CDCHandle; -typedef CDCT CDC; - - -/////////////////////////////////////////////////////////////////////////////// -// CDC Helpers - -class CPaintDC : public CDC -{ -public: -// Data members - HWND m_hWnd; - PAINTSTRUCT m_ps; - -// Constructor/destructor - CPaintDC(HWND hWnd) - { - ATLASSERT(::IsWindow(hWnd)); - m_hWnd = hWnd; - m_hDC = ::BeginPaint(hWnd, &m_ps); - } - - ~CPaintDC() - { - ATLASSERT(m_hDC != NULL); - ATLASSERT(::IsWindow(m_hWnd)); - ::EndPaint(m_hWnd, &m_ps); - Detach(); - } -}; - -class CClientDC : public CDC -{ -public: -// Data members - HWND m_hWnd; - -// Constructor/destructor - CClientDC(HWND hWnd) - { - ATLASSERT(hWnd == NULL || ::IsWindow(hWnd)); - m_hWnd = hWnd; - m_hDC = ::GetDC(hWnd); - } - - ~CClientDC() - { - ATLASSERT(m_hDC != NULL); - ::ReleaseDC(m_hWnd, Detach()); - } -}; - -class CWindowDC : public CDC -{ -public: -// Data members - HWND m_hWnd; - -// Constructor/destructor - CWindowDC(HWND hWnd) - { - ATLASSERT(hWnd == NULL || ::IsWindow(hWnd)); - m_hWnd = hWnd; - m_hDC = ::GetWindowDC(hWnd); - } - - ~CWindowDC() - { - ATLASSERT(m_hDC != NULL); - ::ReleaseDC(m_hWnd, Detach()); - } -}; - -class CMemoryDC : public CDC -{ -public: -// Data members - HDC m_hDCOriginal; - RECT m_rcPaint; - CBitmap m_bmp; - HBITMAP m_hBmpOld; - -// Constructor/destructor - CMemoryDC(HDC hDC, RECT& rcPaint) : m_hDCOriginal(hDC), m_hBmpOld(NULL) - { - m_rcPaint = rcPaint; - CreateCompatibleDC(m_hDCOriginal); - ATLASSERT(m_hDC != NULL); - m_bmp.CreateCompatibleBitmap(m_hDCOriginal, m_rcPaint.right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top); - ATLASSERT(m_bmp.m_hBitmap != NULL); - m_hBmpOld = SelectBitmap(m_bmp); - SetViewportOrg(-m_rcPaint.left, -m_rcPaint.top); - } - - ~CMemoryDC() - { - ::BitBlt(m_hDCOriginal, m_rcPaint.left, m_rcPaint.top, m_rcPaint.right - m_rcPaint.left, m_rcPaint.bottom - m_rcPaint.top, m_hDC, m_rcPaint.left, m_rcPaint.top, SRCCOPY); - SelectBitmap(m_hBmpOld); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Enhanced metafile support - -#ifndef _WIN32_WCE - -class CEnhMetaFileInfo -{ -public: -// Data members - HENHMETAFILE m_hEMF; - BYTE* m_pBits; - TCHAR* m_pDesc; - ENHMETAHEADER m_header; - PIXELFORMATDESCRIPTOR m_pfd; - -// Constructor/destructor - CEnhMetaFileInfo(HENHMETAFILE hEMF) : m_pBits(NULL), m_pDesc(NULL), m_hEMF(hEMF) - { } - - ~CEnhMetaFileInfo() - { - delete [] m_pBits; - delete [] m_pDesc; - } - -// Operations - BYTE* GetEnhMetaFileBits() - { - ATLASSERT(m_hEMF != NULL); - UINT nBytes = ::GetEnhMetaFileBits(m_hEMF, 0, NULL); - delete [] m_pBits; - m_pBits = NULL; - ATLTRY(m_pBits = new BYTE[nBytes]); - if (m_pBits != NULL) - ::GetEnhMetaFileBits(m_hEMF, nBytes, m_pBits); - return m_pBits; - } - - LPTSTR GetEnhMetaFileDescription() - { - ATLASSERT(m_hEMF != NULL); - UINT nLen = ::GetEnhMetaFileDescription(m_hEMF, 0, NULL); - delete [] m_pDesc; - m_pDesc = NULL; - ATLTRY(m_pDesc = new TCHAR[nLen]); - if (m_pDesc != NULL) - nLen = ::GetEnhMetaFileDescription(m_hEMF, nLen, m_pDesc); - return m_pDesc; - } - - ENHMETAHEADER* GetEnhMetaFileHeader() - { - ATLASSERT(m_hEMF != NULL); - memset(&m_header, 0, sizeof(m_header)); - m_header.iType = EMR_HEADER; - m_header.nSize = sizeof(ENHMETAHEADER); - UINT n = ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), &m_header); - return (n != 0) ? &m_header : NULL; - } - - PIXELFORMATDESCRIPTOR* GetEnhMetaFilePixelFormat() - { - ATLASSERT(m_hEMF != NULL); - memset(&m_pfd, 0, sizeof(m_pfd)); - UINT n = ::GetEnhMetaFilePixelFormat(m_hEMF, sizeof(m_pfd), &m_pfd); - return (n != 0) ? &m_pfd : NULL; - } -}; - - -template -class CEnhMetaFileT -{ -public: -// Data members - HENHMETAFILE m_hEMF; - -// Constructor/destructor - CEnhMetaFileT(HENHMETAFILE hEMF = NULL) : m_hEMF(hEMF) - { - } - - ~CEnhMetaFileT() - { - if(t_bManaged && m_hEMF != NULL) - DeleteObject(); - } - -// Operations - CEnhMetaFileT& operator =(HENHMETAFILE hEMF) - { - Attach(hEMF); - return *this; - } - - void Attach(HENHMETAFILE hEMF) - { - if(t_bManaged && m_hEMF != NULL && m_hEMF != hEMF) - DeleteObject(); - m_hEMF = hEMF; - } - - HENHMETAFILE Detach() - { - HENHMETAFILE hEMF = m_hEMF; - m_hEMF = NULL; - return hEMF; - } - - operator HENHMETAFILE() const { return m_hEMF; } - - bool IsNull() const { return (m_hEMF == NULL); } - - BOOL DeleteObject() - { - ATLASSERT(m_hEMF != NULL); - BOOL bRet = ::DeleteEnhMetaFile(m_hEMF); - m_hEMF = NULL; - return bRet; - } - - UINT GetEnhMetaFileBits(UINT cbBuffer, LPBYTE lpbBuffer) const - { - ATLASSERT(m_hEMF != NULL); - return ::GetEnhMetaFileBits(m_hEMF, cbBuffer, lpbBuffer); - } - - UINT GetEnhMetaFileDescription(UINT cchBuffer, LPTSTR lpszDescription) const - { - ATLASSERT(m_hEMF != NULL); - return ::GetEnhMetaFileDescription(m_hEMF, cchBuffer, lpszDescription); - } - - UINT GetEnhMetaFileHeader(LPENHMETAHEADER lpemh) const - { - ATLASSERT(m_hEMF != NULL); - lpemh->iType = EMR_HEADER; - lpemh->nSize = sizeof(ENHMETAHEADER); - return ::GetEnhMetaFileHeader(m_hEMF, sizeof(ENHMETAHEADER), lpemh); - } - - UINT GetEnhMetaFilePaletteEntries(UINT cEntries, LPPALETTEENTRY lppe) const - { - ATLASSERT(m_hEMF != NULL); - return ::GetEnhMetaFilePaletteEntries(m_hEMF, cEntries, lppe); - } - - UINT GetEnhMetaFilePixelFormat(DWORD cbBuffer, PIXELFORMATDESCRIPTOR* ppfd) const - { - ATLASSERT(m_hEMF != NULL); - return ::GetEnhMetaFilePixelFormat(m_hEMF, cbBuffer, ppfd); - } -}; - -typedef CEnhMetaFileT CEnhMetaFileHandle; -typedef CEnhMetaFileT CEnhMetaFile; - - -class CEnhMetaFileDC : public CDC -{ -public: -// Constructor/destructor - CEnhMetaFileDC() - { - } - - CEnhMetaFileDC(HDC hdc, LPCRECT lpRect) - { - Create(hdc, NULL, lpRect, NULL); - ATLASSERT(m_hDC != NULL); - } - - CEnhMetaFileDC(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription) - { - Create(hdcRef, lpFilename, lpRect, lpDescription); - ATLASSERT(m_hDC != NULL); - } - - ~CEnhMetaFileDC() - { - HENHMETAFILE hEMF = Close(); - if (hEMF != NULL) - ::DeleteEnhMetaFile(hEMF); - } - -// Operations - void Create(HDC hdcRef, LPCTSTR lpFilename, LPCRECT lpRect, LPCTSTR lpDescription) - { - ATLASSERT(m_hDC == NULL); - m_hDC = ::CreateEnhMetaFile(hdcRef, lpFilename, lpRect, lpDescription); - } - - HENHMETAFILE Close() - { - HENHMETAFILE hEMF = NULL; - if (m_hDC != NULL) - { - hEMF = ::CloseEnhMetaFile(m_hDC); - m_hDC = NULL; - } - return hEMF; - } -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// WinCE compatible clipboard CF_DIB format support functions - -#ifndef _WTL_NO_DIB16 - -#define DIBINFO16_BITFIELDS { 31744, 992, 31 } - -// DIBINFO16 - To avoid color table problems in WinCE we only create this type of Dib -struct DIBINFO16 // a BITMAPINFO with 2 additional color bitfields -{ - BITMAPINFOHEADER bmiHeader; - RGBQUAD bmiColors[3]; - - DIBINFO16(SIZE size) - { - BITMAPINFOHEADER bmih = { sizeof(BITMAPINFOHEADER), size.cx, size.cy, - 1, 16, BI_BITFIELDS, 2 * size.cx * size.cy , 0, 0, 3 }; - DWORD dw[3] = DIBINFO16_BITFIELDS ; - - bmiHeader = bmih; - SecureHelper::memcpy_x(bmiColors, sizeof(bmiColors), dw, 3 * sizeof(DWORD)); - } -}; - - -// AtlxxxDibxxx minimal packed DIB implementation and helpers to copy and paste CF_DIB - -inline bool AtlIsDib16(LPBITMAPINFOHEADER pbmih) -{ - return (pbmih->biBitCount == 16) && (pbmih->biCompression == BI_BITFIELDS); -} - -inline int AtlGetDibColorTableSize(LPBITMAPINFOHEADER pbmih) -{ - switch (pbmih->biBitCount) - { - case 2: - case 4: - case 8: - return pbmih->biClrUsed ? pbmih->biClrUsed : 1 << pbmih->biBitCount; - case 24: - break; - case 16: - case 32: - return pbmih->biCompression == BI_BITFIELDS ? 3 : 0; - default: - ATLASSERT(FALSE); // should never come here - } - - return 0; -} - -inline int AtlGetDibNumColors(LPBITMAPINFOHEADER pbmih) -{ - switch (pbmih->biBitCount) - { - case 2: - case 4: - case 8: - if (pbmih->biClrUsed) - return pbmih->biClrUsed; - else - break; - case 16: - if (pbmih->biCompression == BI_BITFIELDS ) - return 1 << 15; - else - break; - case 24: - break; - case 32: - if (pbmih->biCompression == BI_BITFIELDS ) - return 1 << 24; - else - break; - default: - ATLASSERT(FALSE); - } - - return 1 << pbmih->biBitCount; -} - -inline HBITMAP AtlGetDibBitmap(LPBITMAPINFO pbmi) -{ - CDC dc(NULL); - void* pBits = NULL; - - LPBYTE pDibBits = (LPBYTE)pbmi + sizeof(BITMAPINFOHEADER) + AtlGetDibColorTableSize(&pbmi->bmiHeader) * sizeof(RGBQUAD); - HBITMAP hbm = CreateDIBSection(dc, pbmi, DIB_RGB_COLORS, &pBits, NULL, NULL); - if (hbm != NULL) - { - int cbBits = pbmi->bmiHeader.biWidth * pbmi->bmiHeader.biHeight * pbmi->bmiHeader.biBitCount / 8; - SecureHelper::memcpy_x(pBits, cbBits, pDibBits, pbmi->bmiHeader.biSizeImage); - } - - return hbm; -} - -inline HBITMAP AtlCopyBitmap(HBITMAP hbm, SIZE sizeDst, bool bAsBitmap = false) -{ - CDC hdcSrc = CreateCompatibleDC(NULL); - CDC hdcDst = CreateCompatibleDC(NULL); - - CBitmapHandle hbmOld = NULL, hbmOld2 = NULL, bmSrc = hbm; - - CBitmap bmNew = NULL; - - SIZE sizeSrc = { 0 }; - bmSrc.GetSize(sizeSrc); - - hbmOld = hdcSrc.SelectBitmap(bmSrc); - - if (bAsBitmap) - { - bmNew.CreateCompatibleBitmap(hdcSrc, sizeDst.cx, sizeDst.cy); - } - else - { - DIBINFO16 dib16(sizeDst); - LPVOID pBits = NULL; - bmNew = CreateDIBSection(hdcDst, (const BITMAPINFO*)&dib16, DIB_RGB_COLORS, &pBits, NULL, NULL); - } - - ATLASSERT(!bmNew.IsNull()); - - hbmOld2 = hdcDst.SelectBitmap(bmNew); - BOOL bOK = FALSE; - - if ((sizeDst.cx == sizeSrc.cx) && (sizeDst.cy == sizeSrc.cy)) - bOK = hdcDst.BitBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, SRCCOPY); - else - bOK = hdcDst.StretchBlt(0, 0, sizeDst.cx, sizeDst.cy, hdcSrc, 0, 0, sizeSrc.cx, sizeSrc.cy, SRCCOPY); - - hdcSrc.SelectBitmap(hbmOld); - hdcDst.SelectBitmap(hbmOld2); - - if (bOK == FALSE) - bmNew.DeleteObject(); - - return bmNew.Detach(); -} - -inline HLOCAL AtlCreatePackedDib16(HBITMAP hbm, SIZE size) -{ - DIBSECTION ds = { 0 }; - LPBYTE pDib = NULL; - bool bCopied = false; - - bool bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds); - if ((bOK == FALSE) || (ds.dsBm.bmBits == NULL) || (AtlIsDib16(&ds.dsBmih) == FALSE) || - (ds.dsBmih.biWidth != size.cx ) || (ds.dsBmih.biHeight != size.cy )) - { - if ((hbm = AtlCopyBitmap(hbm, size)) != NULL) - { - bCopied = true; - bOK = GetObject(hbm, sizeof(ds), &ds) == sizeof(ds); - } - else - { - bOK = FALSE; - } - } - - if((bOK != FALSE) && (AtlIsDib16(&ds.dsBmih) != FALSE) && (ds.dsBm.bmBits != NULL)) - { - pDib = (LPBYTE)LocalAlloc(LMEM_ZEROINIT, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage); - if (pDib != NULL) - { - SecureHelper::memcpy_x(pDib, sizeof(DIBINFO16) + ds.dsBmih.biSizeImage, &ds.dsBmih, sizeof(DIBINFO16)); - SecureHelper::memcpy_x(pDib + sizeof(DIBINFO16), ds.dsBmih.biSizeImage, ds.dsBm.bmBits, ds.dsBmih.biSizeImage); - } - } - - if (bCopied == true) - DeleteObject(hbm); - - return (HLOCAL)pDib; -} - -inline bool AtlSetClipboardDib16(HBITMAP hbm, SIZE size, HWND hWnd) -{ - ATLASSERT(::IsWindow(hWnd)); - BOOL bOK = OpenClipboard(hWnd); - if (bOK != FALSE) - { - bOK = EmptyClipboard(); - if (bOK != FALSE) - { - HLOCAL hDib = AtlCreatePackedDib16(hbm, size); - if (hDib != NULL) - { - bOK = SetClipboardData(CF_DIB, hDib) != NULL; - if (bOK == FALSE) - LocalFree(hDib); - } - else - { - bOK = FALSE; - } - } - CloseClipboard(); - } - - return (bOK != FALSE); -} - -inline HBITMAP AtlGetClipboardDib(HWND hWnd) -{ - ATLASSERT(::IsWindow(hWnd) != FALSE); - HBITMAP hbm = NULL; - if (OpenClipboard(hWnd) != FALSE) - { - LPBITMAPINFO pbmi = (LPBITMAPINFO)GetClipboardData(CF_DIB); - if (pbmi != NULL) - hbm = AtlGetDibBitmap(pbmi); - CloseClipboard(); - } - - return hbm; -} - -#endif // _WTL_NO_DIB16 - -}; // namespace WTL - -#endif // __ATLGDI_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlmisc.h b/plugins/SmartAutoReplier/wtl/atlmisc.h deleted file mode 100644 index 3519b348fd..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlmisc.h +++ /dev/null @@ -1,3817 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLMISC_H__ -#define __ATLMISC_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlmisc.h requires atlapp.h to be included first -#endif - - -#ifdef _ATL_TMP_NO_CSTRING - #define _WTL_NO_CSTRING -#endif - -#if defined(_WTL_USE_CSTRING) && defined(_WTL_NO_CSTRING) - #error Conflicting options - both _WTL_USE_CSTRING and _WTL_NO_CSTRING are defined -#endif // defined(_WTL_USE_CSTRING) && defined(_WTL_NO_CSTRING) - -#if !defined(_WTL_USE_CSTRING) && !defined(_WTL_NO_CSTRING) - #define _WTL_USE_CSTRING -#endif // !defined(_WTL_USE_CSTRING) && !defined(_WTL_NO_CSTRING) - -#ifndef _WTL_NO_CSTRING - #if defined(_ATL_USE_CSTRING_FLOAT) && defined(_ATL_MIN_CRT) - #error Cannot use CString floating point formatting with _ATL_MIN_CRT defined - #endif // defined(_ATL_USE_CSTRING_FLOAT) && defined(_ATL_MIN_CRT) -#endif // !_WTL_NO_CSTRING - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CSize -// CPoint -// CRect -// CString -// -// CRecentDocumentListBase -// CRecentDocumentList -// CFindFile -// -// Global functions: -// AtlGetStockPen() -// AtlGetStockBrush() -// AtlGetStockFont() -// AtlGetStockPalette() -// -// AtlCompactPath() - - -namespace WTL -{ - -#ifndef _WTL_NO_WTYPES - -// forward declarations -class CSize; -class CPoint; -class CRect; - -/////////////////////////////////////////////////////////////////////////////// -// CSize - Wrapper for Windows SIZE structure. - -class CSize : public SIZE -{ -public: -// Constructors - CSize() - { - cx = 0; - cy = 0; - } - - CSize(int initCX, int initCY) - { - cx = initCX; - cy = initCY; - } - - CSize(SIZE initSize) - { - *(SIZE*)this = initSize; - } - - CSize(POINT initPt) - { - *(POINT*)this = initPt; - } - - CSize(DWORD dwSize) - { - cx = (short)LOWORD(dwSize); - cy = (short)HIWORD(dwSize); - } - -// Operations - BOOL operator ==(SIZE size) const - { - return (cx == size.cx && cy == size.cy); - } - - BOOL operator !=(SIZE size) const - { - return (cx != size.cx || cy != size.cy); - } - - void operator +=(SIZE size) - { - cx += size.cx; - cy += size.cy; - } - - void operator -=(SIZE size) - { - cx -= size.cx; - cy -= size.cy; - } - - void SetSize(int CX, int CY) - { - cx = CX; - cy = CY; - } - -// Operators returning CSize values - CSize operator +(SIZE size) const - { - return CSize(cx + size.cx, cy + size.cy); - } - - CSize operator -(SIZE size) const - { - return CSize(cx - size.cx, cy - size.cy); - } - - CSize operator -() const - { - return CSize(-cx, -cy); - } - -// Operators returning CPoint values - CPoint operator +(POINT point) const; - CPoint operator -(POINT point) const; - -// Operators returning CRect values - CRect operator +(const RECT* lpRect) const; - CRect operator -(const RECT* lpRect) const; -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CPoint - Wrapper for Windows POINT structure. - -class CPoint : public POINT -{ -public: -// Constructors - CPoint() - { - x = 0; - y = 0; - } - - CPoint(int initX, int initY) - { - x = initX; - y = initY; - } - - CPoint(POINT initPt) - { - *(POINT*)this = initPt; - } - - CPoint(SIZE initSize) - { - *(SIZE*)this = initSize; - } - - CPoint(DWORD dwPoint) - { - x = (short)LOWORD(dwPoint); - y = (short)HIWORD(dwPoint); - } - -// Operations - void Offset(int xOffset, int yOffset) - { - x += xOffset; - y += yOffset; - } - - void Offset(POINT point) - { - x += point.x; - y += point.y; - } - - void Offset(SIZE size) - { - x += size.cx; - y += size.cy; - } - - BOOL operator ==(POINT point) const - { - return (x == point.x && y == point.y); - } - - BOOL operator !=(POINT point) const - { - return (x != point.x || y != point.y); - } - - void operator +=(SIZE size) - { - x += size.cx; - y += size.cy; - } - - void operator -=(SIZE size) - { - x -= size.cx; - y -= size.cy; - } - - void operator +=(POINT point) - { - x += point.x; - y += point.y; - } - - void operator -=(POINT point) - { - x -= point.x; - y -= point.y; - } - - void SetPoint(int X, int Y) - { - x = X; - y = Y; - } - -// Operators returning CPoint values - CPoint operator +(SIZE size) const - { - return CPoint(x + size.cx, y + size.cy); - } - - CPoint operator -(SIZE size) const - { - return CPoint(x - size.cx, y - size.cy); - } - - CPoint operator -() const - { - return CPoint(-x, -y); - } - - CPoint operator +(POINT point) const - { - return CPoint(x + point.x, y + point.y); - } - -// Operators returning CSize values - CSize operator -(POINT point) const - { - return CSize(x - point.x, y - point.y); - } - -// Operators returning CRect values - CRect operator +(const RECT* lpRect) const; - CRect operator -(const RECT* lpRect) const; -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CRect - Wrapper for Windows RECT structure. - -class CRect : public RECT -{ -public: -// Constructors - CRect() - { - left = 0; - top = 0; - right = 0; - bottom = 0; - } - - CRect(int l, int t, int r, int b) - { - left = l; - top = t; - right = r; - bottom = b; - } - - CRect(const RECT& srcRect) - { - ::CopyRect(this, &srcRect); - } - - CRect(LPCRECT lpSrcRect) - { - ::CopyRect(this, lpSrcRect); - } - - CRect(POINT point, SIZE size) - { - right = (left = point.x) + size.cx; - bottom = (top = point.y) + size.cy; - } - - CRect(POINT topLeft, POINT bottomRight) - { - left = topLeft.x; - top = topLeft.y; - right = bottomRight.x; - bottom = bottomRight.y; - } - -// Attributes (in addition to RECT members) - int Width() const - { - return right - left; - } - - int Height() const - { - return bottom - top; - } - - CSize Size() const - { - return CSize(right - left, bottom - top); - } - - CPoint& TopLeft() - { - return *((CPoint*)this); - } - - CPoint& BottomRight() - { - return *((CPoint*)this + 1); - } - - const CPoint& TopLeft() const - { - return *((CPoint*)this); - } - - const CPoint& BottomRight() const - { - return *((CPoint*)this + 1); - } - - CPoint CenterPoint() const - { - return CPoint((left + right) / 2, (top + bottom) / 2); - } - - // convert between CRect and LPRECT/LPCRECT (no need for &) - operator LPRECT() - { - return this; - } - - operator LPCRECT() const - { - return this; - } - - BOOL IsRectEmpty() const - { - return ::IsRectEmpty(this); - } - - BOOL IsRectNull() const - { - return (left == 0 && right == 0 && top == 0 && bottom == 0); - } - - BOOL PtInRect(POINT point) const - { - return ::PtInRect(this, point); - } - -// Operations - void SetRect(int x1, int y1, int x2, int y2) - { - ::SetRect(this, x1, y1, x2, y2); - } - - void SetRect(POINT topLeft, POINT bottomRight) - { - ::SetRect(this, topLeft.x, topLeft.y, bottomRight.x, bottomRight.y); - } - - void SetRectEmpty() - { - ::SetRectEmpty(this); - } - - void CopyRect(LPCRECT lpSrcRect) - { - ::CopyRect(this, lpSrcRect); - } - - BOOL EqualRect(LPCRECT lpRect) const - { - return ::EqualRect(this, lpRect); - } - - void InflateRect(int x, int y) - { - ::InflateRect(this, x, y); - } - - void InflateRect(SIZE size) - { - ::InflateRect(this, size.cx, size.cy); - } - - void InflateRect(LPCRECT lpRect) - { - left -= lpRect->left; - top -= lpRect->top; - right += lpRect->right; - bottom += lpRect->bottom; - } - - void InflateRect(int l, int t, int r, int b) - { - left -= l; - top -= t; - right += r; - bottom += b; - } - - void DeflateRect(int x, int y) - { - ::InflateRect(this, -x, -y); - } - - void DeflateRect(SIZE size) - { - ::InflateRect(this, -size.cx, -size.cy); - } - - void DeflateRect(LPCRECT lpRect) - { - left += lpRect->left; - top += lpRect->top; - right -= lpRect->right; - bottom -= lpRect->bottom; - } - - void DeflateRect(int l, int t, int r, int b) - { - left += l; - top += t; - right -= r; - bottom -= b; - } - - void OffsetRect(int x, int y) - { - ::OffsetRect(this, x, y); - } - void OffsetRect(SIZE size) - { - ::OffsetRect(this, size.cx, size.cy); - } - - void OffsetRect(POINT point) - { - ::OffsetRect(this, point.x, point.y); - } - - void NormalizeRect() - { - int nTemp; - if (left > right) - { - nTemp = left; - left = right; - right = nTemp; - } - if (top > bottom) - { - nTemp = top; - top = bottom; - bottom = nTemp; - } - } - - // absolute position of rectangle - void MoveToY(int y) - { - bottom = Height() + y; - top = y; - } - - void MoveToX(int x) - { - right = Width() + x; - left = x; - } - - void MoveToXY(int x, int y) - { - MoveToX(x); - MoveToY(y); - } - - void MoveToXY(POINT pt) - { - MoveToX(pt.x); - MoveToY(pt.y); - } - - // operations that fill '*this' with result - BOOL IntersectRect(LPCRECT lpRect1, LPCRECT lpRect2) - { - return ::IntersectRect(this, lpRect1, lpRect2); - } - - BOOL UnionRect(LPCRECT lpRect1, LPCRECT lpRect2) - { - return ::UnionRect(this, lpRect1, lpRect2); - } - - BOOL SubtractRect(LPCRECT lpRectSrc1, LPCRECT lpRectSrc2) - { - return ::SubtractRect(this, lpRectSrc1, lpRectSrc2); - } - -// Additional Operations - void operator =(const RECT& srcRect) - { - ::CopyRect(this, &srcRect); - } - - BOOL operator ==(const RECT& rect) const - { - return ::EqualRect(this, &rect); - } - - BOOL operator !=(const RECT& rect) const - { - return !::EqualRect(this, &rect); - } - - void operator +=(POINT point) - { - ::OffsetRect(this, point.x, point.y); - } - - void operator +=(SIZE size) - { - ::OffsetRect(this, size.cx, size.cy); - } - - void operator +=(LPCRECT lpRect) - { - InflateRect(lpRect); - } - - void operator -=(POINT point) - { - ::OffsetRect(this, -point.x, -point.y); - } - - void operator -=(SIZE size) - { - ::OffsetRect(this, -size.cx, -size.cy); - } - - void operator -=(LPCRECT lpRect) - { - DeflateRect(lpRect); - } - - void operator &=(const RECT& rect) - { - ::IntersectRect(this, this, &rect); - } - - void operator |=(const RECT& rect) - { - ::UnionRect(this, this, &rect); - } - -// Operators returning CRect values - CRect operator +(POINT pt) const - { - CRect rect(*this); - ::OffsetRect(&rect, pt.x, pt.y); - return rect; - } - - CRect operator -(POINT pt) const - { - CRect rect(*this); - ::OffsetRect(&rect, -pt.x, -pt.y); - return rect; - } - - CRect operator +(LPCRECT lpRect) const - { - CRect rect(this); - rect.InflateRect(lpRect); - return rect; - } - - CRect operator +(SIZE size) const - { - CRect rect(*this); - ::OffsetRect(&rect, size.cx, size.cy); - return rect; - } - - CRect operator -(SIZE size) const - { - CRect rect(*this); - ::OffsetRect(&rect, -size.cx, -size.cy); - return rect; - } - - CRect operator -(LPCRECT lpRect) const - { - CRect rect(this); - rect.DeflateRect(lpRect); - return rect; - } - - CRect operator &(const RECT& rect2) const - { - CRect rect; - ::IntersectRect(&rect, this, &rect2); - return rect; - } - - CRect operator |(const RECT& rect2) const - { - CRect rect; - ::UnionRect(&rect, this, &rect2); - return rect; - } - - CRect MulDiv(int nMultiplier, int nDivisor) const - { - return CRect( - ::MulDiv(left, nMultiplier, nDivisor), - ::MulDiv(top, nMultiplier, nDivisor), - ::MulDiv(right, nMultiplier, nDivisor), - ::MulDiv(bottom, nMultiplier, nDivisor)); - } -}; - - -// CSize implementation - -inline CPoint CSize::operator +(POINT point) const -{ return CPoint(cx + point.x, cy + point.y); } - -inline CPoint CSize::operator -(POINT point) const -{ return CPoint(cx - point.x, cy - point.y); } - -inline CRect CSize::operator +(const RECT* lpRect) const -{ return CRect(lpRect) + *this; } - -inline CRect CSize::operator -(const RECT* lpRect) const -{ return CRect(lpRect) - *this; } - - -// CPoint implementation - -inline CRect CPoint::operator +(const RECT* lpRect) const -{ return CRect(lpRect) + *this; } - -inline CRect CPoint::operator -(const RECT* lpRect) const -{ return CRect(lpRect) - *this; } - -#endif // !_WTL_NO_WTYPES - - -// WTL::CSize or ATL::CSize scalar operators - -#if !defined(_WTL_NO_SIZE_SCALAR) && (!defined(_WTL_NO_WTYPES) || defined(__ATLTYPES_H__)) - -template -inline CSize operator *(SIZE s, Num n) -{ - return CSize((int)(s.cx * n), (int)(s.cy * n)); -}; - -template -inline void operator *=(SIZE & s, Num n) -{ - s = s * n; -}; - -template -inline CSize operator /(SIZE s, Num n) -{ - return CSize((int)(s.cx / n), (int)(s.cy / n)); -}; - -template -inline void operator /=(SIZE & s, Num n) -{ - s = s / n; -}; - -#endif // !defined(_WTL_NO_SIZE_SCALAR) && (!defined(_WTL_NO_WTYPES) || defined(__ATLTYPES_H__)) - - -/////////////////////////////////////////////////////////////////////////////// -// CString - String class - -#ifndef _WTL_NO_CSTRING - -struct CStringData -{ - long nRefs; // reference count - int nDataLength; - int nAllocLength; - // TCHAR data[nAllocLength] - - TCHAR* data() - { return (TCHAR*)(this + 1); } -}; - -// Globals - -// For an empty string, m_pchData will point here -// (note: avoids special case of checking for NULL m_pchData) -// empty string data (and locked) -_declspec(selectany) int rgInitData[] = { -1, 0, 0, 0 }; -_declspec(selectany) CStringData* _atltmpDataNil = (CStringData*)&rgInitData; -_declspec(selectany) LPCTSTR _atltmpPchNil = (LPCTSTR)(((BYTE*)&rgInitData) + sizeof(CStringData)); - - -class CString -{ -public: -// Constructors - CString() - { - Init(); - } - - CString(const CString& stringSrc) - { - ATLASSERT(stringSrc.GetData()->nRefs != 0); - if (stringSrc.GetData()->nRefs >= 0) - { - ATLASSERT(stringSrc.GetData() != _atltmpDataNil); - m_pchData = stringSrc.m_pchData; - InterlockedIncrement(&GetData()->nRefs); - } - else - { - Init(); - *this = stringSrc.m_pchData; - } - } - - CString(TCHAR ch, int nRepeat = 1) - { - ATLASSERT(!_istlead(ch)); // can't create a lead byte string - Init(); - if (nRepeat >= 1) - { - if(AllocBuffer(nRepeat)) - { -#ifdef _UNICODE - for (int i = 0; i < nRepeat; i++) - m_pchData[i] = ch; -#else - memset(m_pchData, ch, nRepeat); -#endif - } - } - } - - CString(LPCTSTR lpsz) - { - Init(); - if (lpsz != NULL && HIWORD(lpsz) == NULL) - { - UINT nID = LOWORD((DWORD_PTR)lpsz); - if (!LoadString(nID)) - ATLTRACE2(atlTraceUI, 0, _T("Warning: implicit LoadString(%u) in CString failed\n"), nID); - } - else - { - int nLen = SafeStrlen(lpsz); - if (nLen != 0) - { - if(AllocBuffer(nLen)) - SecureHelper::memcpy_x(m_pchData, (nLen + 1) * sizeof(TCHAR), lpsz, nLen * sizeof(TCHAR)); - } - } - } - -#ifdef _UNICODE - CString(LPCSTR lpsz) - { - Init(); -#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) - int nSrcLen = (lpsz != NULL) ? ATL::lstrlenA(lpsz) : 0; -#else - int nSrcLen = (lpsz != NULL) ? lstrlenA(lpsz) : 0; -#endif - if (nSrcLen != 0) - { - if(AllocBuffer(nSrcLen)) - { - _mbstowcsz(m_pchData, lpsz, nSrcLen + 1); - ReleaseBuffer(); - } - } - } -#else // !_UNICODE - CString(LPCWSTR lpsz) - { - Init(); - int nSrcLen = (lpsz != NULL) ? (int)wcslen(lpsz) : 0; - if (nSrcLen != 0) - { - if(AllocBuffer(nSrcLen * 2)) - { - _wcstombsz(m_pchData, lpsz, (nSrcLen * 2) + 1); - ReleaseBuffer(); - } - } - } -#endif // !_UNICODE - - CString(LPCTSTR lpch, int nLength) - { - Init(); - if (nLength != 0) - { - if(AllocBuffer(nLength)) - SecureHelper::memcpy_x(m_pchData, (nLength + 1) * sizeof(TCHAR), lpch, nLength * sizeof(TCHAR)); - } - } - -#ifdef _UNICODE - CString(LPCSTR lpsz, int nLength) - { - Init(); - if (nLength != 0) - { - if(AllocBuffer(nLength)) - { - int n = ::MultiByteToWideChar(CP_ACP, 0, lpsz, nLength, m_pchData, nLength + 1); - ReleaseBuffer((n >= 0) ? n : -1); - } - } - } -#else // !_UNICODE - CString(LPCWSTR lpsz, int nLength) - { - Init(); - if (nLength != 0) - { - if(((nLength * 2) > nLength) && AllocBuffer(nLength * 2)) - { - int n = ::WideCharToMultiByte(CP_ACP, 0, lpsz, nLength, m_pchData, (nLength * 2) + 1, NULL, NULL); - ReleaseBuffer((n >= 0) ? n : -1); - } - } - } -#endif // !_UNICODE - - CString(const unsigned char* lpsz) - { - Init(); - *this = (LPCSTR)lpsz; - } - -// Attributes & Operations - int GetLength() const // as an array of characters - { - return GetData()->nDataLength; - } - - BOOL IsEmpty() const - { - return GetData()->nDataLength == 0; - } - - void Empty() // free up the data - { - if (GetData()->nDataLength == 0) - return; - - if (GetData()->nRefs >= 0) - Release(); - else - *this = _T(""); - - ATLASSERT(GetData()->nDataLength == 0); - ATLASSERT(GetData()->nRefs < 0 || GetData()->nAllocLength == 0); - } - - TCHAR GetAt(int nIndex) const // 0 based - { - ATLASSERT(nIndex >= 0); - ATLASSERT(nIndex < GetData()->nDataLength); - return m_pchData[nIndex]; - } - - TCHAR operator [](int nIndex) const // same as GetAt - { - // same as GetAt - ATLASSERT(nIndex >= 0); - ATLASSERT(nIndex < GetData()->nDataLength); - return m_pchData[nIndex]; - } - - void SetAt(int nIndex, TCHAR ch) - { - ATLASSERT(nIndex >= 0); - ATLASSERT(nIndex < GetData()->nDataLength); - - CopyBeforeWrite(); - m_pchData[nIndex] = ch; - } - - operator LPCTSTR() const // as a C string - { - return m_pchData; - } - - // overloaded assignment - CString& operator =(const CString& stringSrc) - { - if (m_pchData != stringSrc.m_pchData) - { - if ((GetData()->nRefs < 0 && GetData() != _atltmpDataNil) || stringSrc.GetData()->nRefs < 0) - { - // actual copy necessary since one of the strings is locked - AssignCopy(stringSrc.GetData()->nDataLength, stringSrc.m_pchData); - } - else - { - // can just copy references around - Release(); - ATLASSERT(stringSrc.GetData() != _atltmpDataNil); - m_pchData = stringSrc.m_pchData; - InterlockedIncrement(&GetData()->nRefs); - } - } - return *this; - } - - CString& operator =(TCHAR ch) - { - ATLASSERT(!_istlead(ch)); // can't set single lead byte - AssignCopy(1, &ch); - return *this; - } - -#ifdef _UNICODE - CString& operator =(char ch) - { - *this = (TCHAR)ch; - return *this; - } -#endif - - CString& operator =(LPCTSTR lpsz) - { - ATLASSERT(lpsz == NULL || _IsValidString(lpsz)); - AssignCopy(SafeStrlen(lpsz), lpsz); - return *this; - } - -#ifdef _UNICODE - CString& operator =(LPCSTR lpsz) - { -#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) - int nSrcLen = (lpsz != NULL) ? ATL::lstrlenA(lpsz) : 0; -#else - int nSrcLen = (lpsz != NULL) ? lstrlenA(lpsz) : 0; -#endif - if(AllocBeforeWrite(nSrcLen)) - { - _mbstowcsz(m_pchData, lpsz, nSrcLen + 1); - ReleaseBuffer(); - } - return *this; - } -#else // !_UNICODE - CString& operator =(LPCWSTR lpsz) - { - int nSrcLen = (lpsz != NULL) ? (int)wcslen(lpsz) : 0; - if(AllocBeforeWrite(nSrcLen * 2)) - { - _wcstombsz(m_pchData, lpsz, (nSrcLen * 2) + 1); - ReleaseBuffer(); - } - return *this; - } -#endif // !_UNICODE - - CString& operator =(const unsigned char* lpsz) - { - *this = (LPCSTR)lpsz; - return *this; - } - - // string concatenation - CString& operator +=(const CString& string) - { - ConcatInPlace(string.GetData()->nDataLength, string.m_pchData); - return *this; - } - - CString& operator +=(TCHAR ch) - { - ConcatInPlace(1, &ch); - return *this; - } - -#ifdef _UNICODE - CString& operator +=(char ch) - { - *this += (TCHAR)ch; - return *this; - } -#endif - - CString& operator +=(LPCTSTR lpsz) - { - ATLASSERT(lpsz == NULL || _IsValidString(lpsz)); - ConcatInPlace(SafeStrlen(lpsz), lpsz); - return *this; - } - - friend CString __stdcall operator +(const CString& string1, const CString& string2); - friend CString __stdcall operator +(const CString& string, TCHAR ch); - friend CString __stdcall operator +(TCHAR ch, const CString& string); -#ifdef _UNICODE - friend CString __stdcall operator +(const CString& string, char ch); - friend CString __stdcall operator +(char ch, const CString& string); -#endif - friend CString __stdcall operator +(const CString& string, LPCTSTR lpsz); - friend CString __stdcall operator +(LPCTSTR lpsz, const CString& string); - - // string comparison - int Compare(LPCTSTR lpsz) const // straight character (MBCS/Unicode aware) - { - return _cstrcmp(m_pchData, lpsz); - } - - int CompareNoCase(LPCTSTR lpsz) const // ignore case (MBCS/Unicode aware) - { - return _cstrcmpi(m_pchData, lpsz); - } - -#ifndef _WIN32_WCE - // CString::Collate is often slower than Compare but is MBSC/Unicode - // aware as well as locale-sensitive with respect to sort order. - int Collate(LPCTSTR lpsz) const // NLS aware - { - return _cstrcoll(m_pchData, lpsz); - } - - int CollateNoCase(LPCTSTR lpsz) const // ignore case - { - return _cstrcolli(m_pchData, lpsz); - } -#endif // !_WIN32_WCE - - // simple sub-string extraction - CString Mid(int nFirst, int nCount) const - { - // out-of-bounds requests return sensible things - if (nFirst < 0) - nFirst = 0; - if (nCount < 0) - nCount = 0; - - if (nFirst + nCount > GetData()->nDataLength) - nCount = GetData()->nDataLength - nFirst; - if (nFirst > GetData()->nDataLength) - nCount = 0; - - CString dest; - AllocCopy(dest, nCount, nFirst, 0); - return dest; - } - - CString Mid(int nFirst) const - { - return Mid(nFirst, GetData()->nDataLength - nFirst); - } - - CString Left(int nCount) const - { - if (nCount < 0) - nCount = 0; - else if (nCount > GetData()->nDataLength) - nCount = GetData()->nDataLength; - - CString dest; - AllocCopy(dest, nCount, 0, 0); - return dest; - } - - CString Right(int nCount) const - { - if (nCount < 0) - nCount = 0; - else if (nCount > GetData()->nDataLength) - nCount = GetData()->nDataLength; - - CString dest; - AllocCopy(dest, nCount, GetData()->nDataLength-nCount, 0); - return dest; - } - - CString SpanIncluding(LPCTSTR lpszCharSet) const // strspn equivalent - { - ATLASSERT(_IsValidString(lpszCharSet)); - return Left(_cstrspn(m_pchData, lpszCharSet)); - } - - CString SpanExcluding(LPCTSTR lpszCharSet) const // strcspn equivalent - { - ATLASSERT(_IsValidString(lpszCharSet)); - return Left(_cstrcspn(m_pchData, lpszCharSet)); - } - - // upper/lower/reverse conversion - void MakeUpper() - { - CopyBeforeWrite(); - CharUpper(m_pchData); - } - - void MakeLower() - { - CopyBeforeWrite(); - CharLower(m_pchData); - } - - void MakeReverse() - { - CopyBeforeWrite(); - _cstrrev(m_pchData); - } - - // trimming whitespace (either side) - void TrimRight() - { - CopyBeforeWrite(); - - // find beginning of trailing spaces by starting at beginning (DBCS aware) - LPTSTR lpsz = m_pchData; - LPTSTR lpszLast = NULL; - while (*lpsz != _T('\0')) - { - if (_cstrisspace(*lpsz)) - { - if (lpszLast == NULL) - lpszLast = lpsz; - } - else - { - lpszLast = NULL; - } - lpsz = ::CharNext(lpsz); - } - - if (lpszLast != NULL) - { - // truncate at trailing space start - *lpszLast = _T('\0'); - GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData); - } - } - - void TrimLeft() - { - CopyBeforeWrite(); - - // find first non-space character - LPCTSTR lpsz = m_pchData; - while (_cstrisspace(*lpsz)) - lpsz = ::CharNext(lpsz); - - // fix up data and length - int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData); - SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR)); - GetData()->nDataLength = nDataLength; - } - - // remove continuous occurrences of chTarget starting from right - void TrimRight(TCHAR chTarget) - { - // find beginning of trailing matches - // by starting at beginning (DBCS aware) - - CopyBeforeWrite(); - LPTSTR lpsz = m_pchData; - LPTSTR lpszLast = NULL; - - while (*lpsz != _T('\0')) - { - if (*lpsz == chTarget) - { - if (lpszLast == NULL) - lpszLast = lpsz; - } - else - lpszLast = NULL; - lpsz = ::CharNext(lpsz); - } - - if (lpszLast != NULL) - { - // truncate at left-most matching character - *lpszLast = _T('\0'); - GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData); - } - } - - // remove continuous occcurrences of characters in passed string, starting from right - void TrimRight(LPCTSTR lpszTargetList) - { - // find beginning of trailing matches by starting at beginning (DBCS aware) - - CopyBeforeWrite(); - LPTSTR lpsz = m_pchData; - LPTSTR lpszLast = NULL; - - while (*lpsz != _T('\0')) - { - TCHAR* pNext = ::CharNext(lpsz); - if(pNext > lpsz + 1) - { - if (_cstrchr_db(lpszTargetList, *lpsz, *(lpsz + 1)) != NULL) - { - if (lpszLast == NULL) - lpszLast = lpsz; - } - else - { - lpszLast = NULL; - } - } - else - { - if (_cstrchr(lpszTargetList, *lpsz) != NULL) - { - if (lpszLast == NULL) - lpszLast = lpsz; - } - else - { - lpszLast = NULL; - } - } - - lpsz = pNext; - } - - if (lpszLast != NULL) - { - // truncate at left-most matching character - *lpszLast = _T('\0'); - GetData()->nDataLength = (int)(DWORD_PTR)(lpszLast - m_pchData); - } - } - - // remove continuous occurrences of chTarget starting from left - void TrimLeft(TCHAR chTarget) - { - // find first non-matching character - - CopyBeforeWrite(); - LPCTSTR lpsz = m_pchData; - - while (chTarget == *lpsz) - lpsz = ::CharNext(lpsz); - - if (lpsz != m_pchData) - { - // fix up data and length - int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData); - SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR)); - GetData()->nDataLength = nDataLength; - } - } - - // remove continuous occcurrences of characters in passed string, starting from left - void TrimLeft(LPCTSTR lpszTargets) - { - // if we're not trimming anything, we're not doing any work - if (SafeStrlen(lpszTargets) == 0) - return; - - CopyBeforeWrite(); - LPCTSTR lpsz = m_pchData; - - while (*lpsz != _T('\0')) - { - TCHAR* pNext = ::CharNext(lpsz); - if(pNext > lpsz + 1) - { - if (_cstrchr_db(lpszTargets, *lpsz, *(lpsz + 1)) == NULL) - break; - } - else - { - if (_cstrchr(lpszTargets, *lpsz) == NULL) - break; - } - lpsz = pNext; - } - - if (lpsz != m_pchData) - { - // fix up data and length - int nDataLength = GetData()->nDataLength - (int)(DWORD_PTR)(lpsz - m_pchData); - SecureHelper::memmove_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpsz, (nDataLength + 1) * sizeof(TCHAR)); - GetData()->nDataLength = nDataLength; - } - } - - // advanced manipulation - // replace occurrences of chOld with chNew - int Replace(TCHAR chOld, TCHAR chNew) - { - int nCount = 0; - - // short-circuit the nop case - if (chOld != chNew) - { - // otherwise modify each character that matches in the string - CopyBeforeWrite(); - LPTSTR psz = m_pchData; - LPTSTR pszEnd = psz + GetData()->nDataLength; - while (psz < pszEnd) - { - // replace instances of the specified character only - if (*psz == chOld) - { - *psz = chNew; - nCount++; - } - psz = ::CharNext(psz); - } - } - return nCount; - } - - // replace occurrences of substring lpszOld with lpszNew; - // empty lpszNew removes instances of lpszOld - int Replace(LPCTSTR lpszOld, LPCTSTR lpszNew) - { - // can't have empty or NULL lpszOld - - int nSourceLen = SafeStrlen(lpszOld); - if (nSourceLen == 0) - return 0; - int nReplacementLen = SafeStrlen(lpszNew); - - // loop once to figure out the size of the result string - int nCount = 0; - LPTSTR lpszStart = m_pchData; - LPTSTR lpszEnd = m_pchData + GetData()->nDataLength; - LPTSTR lpszTarget = NULL; - while (lpszStart < lpszEnd) - { - while ((lpszTarget = (TCHAR*)_cstrstr(lpszStart, lpszOld)) != NULL) - { - nCount++; - lpszStart = lpszTarget + nSourceLen; - } - lpszStart += lstrlen(lpszStart) + 1; - } - - // if any changes were made, make them - if (nCount > 0) - { - CopyBeforeWrite(); - - // if the buffer is too small, just allocate a new buffer (slow but sure) - int nOldLength = GetData()->nDataLength; - int nNewLength = nOldLength + (nReplacementLen - nSourceLen) * nCount; - if (GetData()->nAllocLength < nNewLength || GetData()->nRefs > 1) - { - CStringData* pOldData = GetData(); - LPTSTR pstr = m_pchData; - if(!AllocBuffer(nNewLength)) - return -1; - SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, pOldData->nDataLength * sizeof(TCHAR)); - CString::Release(pOldData); - } - // else, we just do it in-place - lpszStart = m_pchData; - lpszEnd = m_pchData + GetData()->nDataLength; - - // loop again to actually do the work - while (lpszStart < lpszEnd) - { - while ((lpszTarget = (TCHAR*)_cstrstr(lpszStart, lpszOld)) != NULL) - { - int nBalance = nOldLength - ((int)(DWORD_PTR)(lpszTarget - m_pchData) + nSourceLen); - int cchBuffLen = GetData()->nAllocLength - (int)(DWORD_PTR)(lpszTarget - m_pchData); - SecureHelper::memmove_x(lpszTarget + nReplacementLen, (cchBuffLen - nReplacementLen + 1) * sizeof(TCHAR), lpszTarget + nSourceLen, nBalance * sizeof(TCHAR)); - SecureHelper::memcpy_x(lpszTarget, (cchBuffLen + 1) * sizeof(TCHAR), lpszNew, nReplacementLen * sizeof(TCHAR)); - lpszStart = lpszTarget + nReplacementLen; - lpszStart[nBalance] = _T('\0'); - nOldLength += (nReplacementLen - nSourceLen); - } - lpszStart += lstrlen(lpszStart) + 1; - } - ATLASSERT(m_pchData[nNewLength] == _T('\0')); - GetData()->nDataLength = nNewLength; - } - - return nCount; - } - - // remove occurrences of chRemove - int Remove(TCHAR chRemove) - { - CopyBeforeWrite(); - - LPTSTR pstrSource = m_pchData; - LPTSTR pstrDest = m_pchData; - LPTSTR pstrEnd = m_pchData + GetData()->nDataLength; - - while (pstrSource < pstrEnd) - { - if (*pstrSource != chRemove) - { - *pstrDest = *pstrSource; - pstrDest = ::CharNext(pstrDest); - } - pstrSource = ::CharNext(pstrSource); - } - *pstrDest = _T('\0'); - int nCount = (int)(DWORD_PTR)(pstrSource - pstrDest); - GetData()->nDataLength -= nCount; - - return nCount; - } - - // insert character at zero-based index; concatenates if index is past end of string - int Insert(int nIndex, TCHAR ch) - { - CopyBeforeWrite(); - - if (nIndex < 0) - nIndex = 0; - - int nNewLength = GetData()->nDataLength; - if (nIndex > nNewLength) - nIndex = nNewLength; - nNewLength++; - - if (GetData()->nAllocLength < nNewLength) - { - CStringData* pOldData = GetData(); - LPTSTR pstr = m_pchData; - if(!AllocBuffer(nNewLength)) - return -1; - SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, (pOldData->nDataLength + 1) * sizeof(TCHAR)); - CString::Release(pOldData); - } - - // move existing bytes down - SecureHelper::memmove_x(m_pchData + nIndex + 1, (GetData()->nAllocLength - nIndex) * sizeof(TCHAR), m_pchData + nIndex, (nNewLength - nIndex) * sizeof(TCHAR)); - m_pchData[nIndex] = ch; - GetData()->nDataLength = nNewLength; - - return nNewLength; - } - - // insert substring at zero-based index; concatenates if index is past end of string - int Insert(int nIndex, LPCTSTR pstr) - { - if (nIndex < 0) - nIndex = 0; - - int nInsertLength = SafeStrlen(pstr); - int nNewLength = GetData()->nDataLength; - if (nInsertLength > 0) - { - CopyBeforeWrite(); - if (nIndex > nNewLength) - nIndex = nNewLength; - nNewLength += nInsertLength; - - if (GetData()->nAllocLength < nNewLength) - { - CStringData* pOldData = GetData(); - LPTSTR pstr = m_pchData; - if(!AllocBuffer(nNewLength)) - return -1; - SecureHelper::memcpy_x(m_pchData, (nNewLength + 1) * sizeof(TCHAR), pstr, (pOldData->nDataLength + 1) * sizeof(TCHAR)); - CString::Release(pOldData); - } - - // move existing bytes down - SecureHelper::memmove_x(m_pchData + nIndex + nInsertLength, (GetData()->nAllocLength + 1 - nIndex - nInsertLength) * sizeof(TCHAR), m_pchData + nIndex, (nNewLength - nIndex - nInsertLength + 1) * sizeof(TCHAR)); - SecureHelper::memcpy_x(m_pchData + nIndex, (GetData()->nAllocLength + 1 - nIndex) * sizeof(TCHAR), pstr, nInsertLength * sizeof(TCHAR)); - GetData()->nDataLength = nNewLength; - } - - return nNewLength; - } - - // delete nCount characters starting at zero-based index - int Delete(int nIndex, int nCount = 1) - { - if (nIndex < 0) - nIndex = 0; - int nLength = GetData()->nDataLength; - if (nCount > 0 && nIndex < nLength) - { - if((nIndex + nCount) > nLength) - nCount = nLength - nIndex; - CopyBeforeWrite(); - int nBytesToCopy = nLength - (nIndex + nCount) + 1; - - SecureHelper::memmove_x(m_pchData + nIndex, (GetData()->nAllocLength + 1 - nIndex) * sizeof(TCHAR), m_pchData + nIndex + nCount, nBytesToCopy * sizeof(TCHAR)); - nLength -= nCount; - GetData()->nDataLength = nLength; - } - - return nLength; - } - - // searching (return starting index, or -1 if not found) - // look for a single character match - int Find(TCHAR ch) const // like "C" strchr - { - return Find(ch, 0); - } - - int ReverseFind(TCHAR ch) const - { - // find last single character - LPCTSTR lpsz = _cstrrchr(m_pchData, (_TUCHAR)ch); - - // return -1 if not found, distance from beginning otherwise - return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData); - } - - int Find(TCHAR ch, int nStart) const // starting at index - { - int nLength = GetData()->nDataLength; - if (nStart < 0 || nStart >= nLength) - return -1; - - // find first single character - LPCTSTR lpsz = _cstrchr(m_pchData + nStart, (_TUCHAR)ch); - - // return -1 if not found and index otherwise - return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData); - } - - int FindOneOf(LPCTSTR lpszCharSet) const - { - ATLASSERT(_IsValidString(lpszCharSet)); - LPCTSTR lpsz = _cstrpbrk(m_pchData, lpszCharSet); - return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData); - } - - // look for a specific sub-string - // find a sub-string (like strstr) - int Find(LPCTSTR lpszSub) const // like "C" strstr - { - return Find(lpszSub, 0); - } - - int Find(LPCTSTR lpszSub, int nStart) const // starting at index - { - ATLASSERT(_IsValidString(lpszSub)); - - int nLength = GetData()->nDataLength; - if (nStart < 0 || nStart > nLength) - return -1; - - // find first matching substring - LPCTSTR lpsz = _cstrstr(m_pchData + nStart, lpszSub); - - // return -1 for not found, distance from beginning otherwise - return (lpsz == NULL) ? -1 : (int)(lpsz - m_pchData); - } - - // Concatentation for non strings - CString& Append(int n) - { - const int cchBuff = 12; - TCHAR szBuffer[cchBuff] = { 0 }; - SecureHelper::wsprintf_x(szBuffer, cchBuff, _T("%d"), n); - ConcatInPlace(SafeStrlen(szBuffer), szBuffer); - return *this; - } - - // simple formatting - // formatting (using wsprintf style formatting) - BOOL __cdecl Format(LPCTSTR lpszFormat, ...) - { - ATLASSERT(_IsValidString(lpszFormat)); - - va_list argList; - va_start(argList, lpszFormat); - BOOL bRet = FormatV(lpszFormat, argList); - va_end(argList); - return bRet; - } - - BOOL __cdecl Format(UINT nFormatID, ...) - { - CString strFormat; - BOOL bRet = strFormat.LoadString(nFormatID); - ATLASSERT(bRet != 0); - - va_list argList; - va_start(argList, nFormatID); - bRet = FormatV(strFormat, argList); - va_end(argList); - return bRet; - } - - BOOL FormatV(LPCTSTR lpszFormat, va_list argList) - { - ATLASSERT(_IsValidString(lpszFormat)); - - enum _FormatModifiers - { - FORCE_ANSI = 0x10000, - FORCE_UNICODE = 0x20000, - FORCE_INT64 = 0x40000 - }; - - va_list argListSave = argList; - - // make a guess at the maximum length of the resulting string - int nMaxLen = 0; - for (LPCTSTR lpsz = lpszFormat; *lpsz != _T('\0'); lpsz = ::CharNext(lpsz)) - { - // handle '%' character, but watch out for '%%' - if (*lpsz != _T('%') || *(lpsz = ::CharNext(lpsz)) == _T('%')) - { - nMaxLen += (int)(::CharNext(lpsz) - lpsz); - continue; - } - - int nItemLen = 0; - - // handle '%' character with format - int nWidth = 0; - for (; *lpsz != _T('\0'); lpsz = ::CharNext(lpsz)) - { - // check for valid flags - if (*lpsz == _T('#')) - nMaxLen += 2; // for '0x' - else if (*lpsz == _T('*')) - nWidth = va_arg(argList, int); - else if (*lpsz == _T('-') || *lpsz == _T('+') || *lpsz == _T('0') || *lpsz == _T(' ')) - ; - else // hit non-flag character - break; - } - // get width and skip it - if (nWidth == 0) - { - // width indicated by - nWidth = _cstrtoi(lpsz); - for (; *lpsz != _T('\0') && _cstrisdigit(*lpsz); lpsz = ::CharNext(lpsz)) - ; - } - ATLASSERT(nWidth >= 0); - - int nPrecision = 0; - if (*lpsz == _T('.')) - { - // skip past '.' separator (width.precision) - lpsz = ::CharNext(lpsz); - - // get precision and skip it - if (*lpsz == _T('*')) - { - nPrecision = va_arg(argList, int); - lpsz = ::CharNext(lpsz); - } - else - { - nPrecision = _cstrtoi(lpsz); - for (; *lpsz != _T('\0') && _cstrisdigit(*lpsz); lpsz = ::CharNext(lpsz)) - ; - } - ATLASSERT(nPrecision >= 0); - } - - // should be on type modifier or specifier - int nModifier = 0; - if(lpsz[0] == _T('I') && lpsz[1] == _T('6') && lpsz[2] == _T('4')) - { - lpsz += 3; - nModifier = FORCE_INT64; - } - else - { - switch (*lpsz) - { - // modifiers that affect size - case _T('h'): - nModifier = FORCE_ANSI; - lpsz = ::CharNext(lpsz); - break; - case _T('l'): - nModifier = FORCE_UNICODE; - lpsz = ::CharNext(lpsz); - break; - - // modifiers that do not affect size - case _T('F'): - case _T('N'): - case _T('L'): - lpsz = ::CharNext(lpsz); - break; - } - } - - // now should be on specifier - switch (*lpsz | nModifier) - { - // single characters - case _T('c'): - case _T('C'): - nItemLen = 2; - va_arg(argList, TCHAR); - break; - case _T('c') | FORCE_ANSI: - case _T('C') | FORCE_ANSI: - nItemLen = 2; - va_arg(argList, char); - break; - case _T('c') | FORCE_UNICODE: - case _T('C') | FORCE_UNICODE: - nItemLen = 2; - va_arg(argList, WCHAR); - break; - - // strings - case _T('s'): - { - LPCTSTR pstrNextArg = va_arg(argList, LPCTSTR); - if (pstrNextArg == NULL) - { - nItemLen = 6; // "(null)" - } - else - { - nItemLen = lstrlen(pstrNextArg); - nItemLen = max(1, nItemLen); - } - break; - } - - case _T('S'): - { -#ifndef _UNICODE - LPWSTR pstrNextArg = va_arg(argList, LPWSTR); - if (pstrNextArg == NULL) - { - nItemLen = 6; // "(null)" - } - else - { - nItemLen = (int)wcslen(pstrNextArg); - nItemLen = max(1, nItemLen); - } -#else // _UNICODE - LPCSTR pstrNextArg = va_arg(argList, LPCSTR); - if (pstrNextArg == NULL) - { - nItemLen = 6; // "(null)" - } - else - { -#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) - nItemLen = ATL::lstrlenA(pstrNextArg); -#else - nItemLen = lstrlenA(pstrNextArg); -#endif - nItemLen = max(1, nItemLen); - } -#endif // _UNICODE - break; - } - - case _T('s') | FORCE_ANSI: - case _T('S') | FORCE_ANSI: - { - LPCSTR pstrNextArg = va_arg(argList, LPCSTR); - if (pstrNextArg == NULL) - { - nItemLen = 6; // "(null)" - } - else - { -#if defined(_WIN32_WCE) && (_ATL_VER >= 0x0800) - nItemLen = ATL::lstrlenA(pstrNextArg); -#else - nItemLen = lstrlenA(pstrNextArg); -#endif - nItemLen = max(1, nItemLen); - } - break; - } - - case _T('s') | FORCE_UNICODE: - case _T('S') | FORCE_UNICODE: - { - LPWSTR pstrNextArg = va_arg(argList, LPWSTR); - if (pstrNextArg == NULL) - { - nItemLen = 6; // "(null)" - } - else - { - nItemLen = (int)wcslen(pstrNextArg); - nItemLen = max(1, nItemLen); - } - break; - } - } - - // adjust nItemLen for strings - if (nItemLen != 0) - { - nItemLen = max(nItemLen, nWidth); - if (nPrecision != 0) - nItemLen = min(nItemLen, nPrecision); - } - else - { - switch (*lpsz) - { - // integers - case _T('d'): - case _T('i'): - case _T('u'): - case _T('x'): - case _T('X'): - case _T('o'): - if (nModifier & FORCE_INT64) - va_arg(argList, __int64); - else - va_arg(argList, int); - nItemLen = 32; - nItemLen = max(nItemLen, nWidth + nPrecision); - break; - -#ifndef _ATL_USE_CSTRING_FLOAT - case _T('e'): - case _T('E'): - case _T('f'): - case _T('g'): - case _T('G'): - ATLASSERT(!"Floating point (%%e, %%E, %%f, %%g, and %%G) is not supported by the WTL::CString class."); -#ifndef _DEBUG - ::OutputDebugString(_T("Floating point (%%e, %%f, %%g, and %%G) is not supported by the WTL::CString class.")); -#ifndef _WIN32_WCE - ::DebugBreak(); -#else // CE specific - DebugBreak(); -#endif // _WIN32_WCE -#endif // !_DEBUG - break; -#else // _ATL_USE_CSTRING_FLOAT - case _T('e'): - case _T('E'): - case _T('g'): - case _T('G'): - va_arg(argList, double); - nItemLen = 128; - nItemLen = max(nItemLen, nWidth + nPrecision); - break; - case _T('f'): - { - double f = va_arg(argList, double); - // 312 == strlen("-1+(309 zeroes).") - // 309 zeroes == max precision of a double - // 6 == adjustment in case precision is not specified, - // which means that the precision defaults to 6 - int cchLen = max(nWidth, 312 + nPrecision + 6); - CTempBuffer buff; - LPTSTR pszTemp = buff.Allocate(cchLen); - if(pszTemp != NULL) - { - SecureHelper::sprintf_x(pszTemp, cchLen, _T("%*.*f"), nWidth, nPrecision + 6, f); - nItemLen = (int)_tcslen(pszTemp); - } - else - { - nItemLen = cchLen; - } - } - break; -#endif // _ATL_USE_CSTRING_FLOAT - - case _T('p'): - va_arg(argList, void*); - nItemLen = 32; - nItemLen = max(nItemLen, nWidth + nPrecision); - break; - - // no output - case _T('n'): - va_arg(argList, int*); - break; - - default: - ATLASSERT(FALSE); // unknown formatting option - } - } - - // adjust nMaxLen for output nItemLen - nMaxLen += nItemLen; - } - - if(GetBuffer(nMaxLen) == NULL) - return FALSE; -#ifndef _ATL_USE_CSTRING_FLOAT - int nRet = SecureHelper::wvsprintf_x(m_pchData, GetAllocLength() + 1, lpszFormat, argListSave); -#else // _ATL_USE_CSTRING_FLOAT - int nRet = SecureHelper::vsprintf_x(m_pchData, GetAllocLength() + 1, lpszFormat, argListSave); -#endif // _ATL_USE_CSTRING_FLOAT - nRet; // ref - ATLASSERT(nRet <= GetAllocLength()); - ReleaseBuffer(); - - va_end(argListSave); - return TRUE; - } - - // formatting for localization (uses FormatMessage API) - // formatting (using FormatMessage style formatting) - BOOL __cdecl FormatMessage(LPCTSTR lpszFormat, ...) - { - // format message into temporary buffer lpszTemp - va_list argList; - va_start(argList, lpszFormat); - LPTSTR lpszTemp; - BOOL bRet = TRUE; - - if (::FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, - lpszFormat, 0, 0, (LPTSTR)&lpszTemp, 0, &argList) == 0 || lpszTemp == NULL) - bRet = FALSE; - - // assign lpszTemp into the resulting string and free the temporary - *this = lpszTemp; - LocalFree(lpszTemp); - va_end(argList); - return bRet; - } - - BOOL __cdecl FormatMessage(UINT nFormatID, ...) - { - // get format string from string table - CString strFormat; - BOOL bRetTmp = strFormat.LoadString(nFormatID); - bRetTmp; // ref - ATLASSERT(bRetTmp != 0); - - // format message into temporary buffer lpszTemp - va_list argList; - va_start(argList, nFormatID); - LPTSTR lpszTemp; - BOOL bRet = TRUE; - - if (::FormatMessage(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ALLOCATE_BUFFER, - strFormat, 0, 0, (LPTSTR)&lpszTemp, 0, &argList) == 0 || lpszTemp == NULL) - bRet = FALSE; - - // assign lpszTemp into the resulting string and free lpszTemp - *this = lpszTemp; - LocalFree(lpszTemp); - va_end(argList); - return bRet; - } - - // Windows support - BOOL LoadString(UINT nID) // load from string resource (255 chars max.) - { -#ifdef _UNICODE - const int CHAR_FUDGE = 1; // one TCHAR unused is good enough -#else - const int CHAR_FUDGE = 2; // two BYTES unused for case of DBC last char -#endif - - // try fixed buffer first (to avoid wasting space in the heap) - TCHAR szTemp[256]; - int nCount = sizeof(szTemp) / sizeof(szTemp[0]); - int nLen = _LoadString(nID, szTemp, nCount); - if (nCount - nLen > CHAR_FUDGE) - { - *this = szTemp; - return (nLen > 0); - } - - // try buffer size of 512, then larger size until entire string is retrieved - int nSize = 256; - do - { - nSize += 256; - LPTSTR lpstr = GetBuffer(nSize - 1); - if(lpstr == NULL) - { - nLen = 0; - break; - } - nLen = _LoadString(nID, lpstr, nSize); - } while (nSize - nLen <= CHAR_FUDGE); - ReleaseBuffer(); - - return (nLen > 0); - } - -#ifndef _UNICODE - // ANSI <-> OEM support (convert string in place) - void AnsiToOem() - { - CopyBeforeWrite(); - ::AnsiToOem(m_pchData, m_pchData); - } - - void OemToAnsi() - { - CopyBeforeWrite(); - ::OemToAnsi(m_pchData, m_pchData); - } -#endif - -#ifndef _ATL_NO_COM - // OLE BSTR support (use for OLE automation) - BSTR AllocSysString() const - { -#if defined(_UNICODE) || defined(OLE2ANSI) - BSTR bstr = ::SysAllocStringLen(m_pchData, GetData()->nDataLength); -#else - int nLen = MultiByteToWideChar(CP_ACP, 0, m_pchData, - GetData()->nDataLength, NULL, NULL); - BSTR bstr = ::SysAllocStringLen(NULL, nLen); - if(bstr != NULL) - MultiByteToWideChar(CP_ACP, 0, m_pchData, GetData()->nDataLength, bstr, nLen); -#endif - return bstr; - } - - BSTR SetSysString(BSTR* pbstr) const - { -#if defined(_UNICODE) || defined(OLE2ANSI) - ::SysReAllocStringLen(pbstr, m_pchData, GetData()->nDataLength); -#else - int nLen = MultiByteToWideChar(CP_ACP, 0, m_pchData, - GetData()->nDataLength, NULL, NULL); - if(::SysReAllocStringLen(pbstr, NULL, nLen)) - MultiByteToWideChar(CP_ACP, 0, m_pchData, GetData()->nDataLength, *pbstr, nLen); -#endif - ATLASSERT(*pbstr != NULL); - return *pbstr; - } -#endif // !_ATL_NO_COM - - // Access to string implementation buffer as "C" character array - LPTSTR GetBuffer(int nMinBufLength) - { - ATLASSERT(nMinBufLength >= 0); - - if (GetData()->nRefs > 1 || nMinBufLength > GetData()->nAllocLength) - { - // we have to grow the buffer - CStringData* pOldData = GetData(); - int nOldLen = GetData()->nDataLength; // AllocBuffer will tromp it - if (nMinBufLength < nOldLen) - nMinBufLength = nOldLen; - - if(!AllocBuffer(nMinBufLength)) - return NULL; - - SecureHelper::memcpy_x(m_pchData, (nMinBufLength + 1) * sizeof(TCHAR), pOldData->data(), (nOldLen + 1) * sizeof(TCHAR)); - GetData()->nDataLength = nOldLen; - CString::Release(pOldData); - } - ATLASSERT(GetData()->nRefs <= 1); - - // return a pointer to the character storage for this string - ATLASSERT(m_pchData != NULL); - return m_pchData; - } - - void ReleaseBuffer(int nNewLength = -1) - { - CopyBeforeWrite(); // just in case GetBuffer was not called - - if (nNewLength == -1) - nNewLength = lstrlen(m_pchData); // zero terminated - - ATLASSERT(nNewLength <= GetData()->nAllocLength); - GetData()->nDataLength = nNewLength; - m_pchData[nNewLength] = _T('\0'); - } - - LPTSTR GetBufferSetLength(int nNewLength) - { - ATLASSERT(nNewLength >= 0); - - if(GetBuffer(nNewLength) == NULL) - return NULL; - - GetData()->nDataLength = nNewLength; - m_pchData[nNewLength] = _T('\0'); - return m_pchData; - } - - void FreeExtra() - { - ATLASSERT(GetData()->nDataLength <= GetData()->nAllocLength); - if (GetData()->nDataLength != GetData()->nAllocLength) - { - CStringData* pOldData = GetData(); - if(AllocBuffer(GetData()->nDataLength)) - { - SecureHelper::memcpy_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), pOldData->data(), pOldData->nDataLength * sizeof(TCHAR)); - ATLASSERT(m_pchData[GetData()->nDataLength] == _T('\0')); - CString::Release(pOldData); - } - } - ATLASSERT(GetData() != NULL); - } - - // Use LockBuffer/UnlockBuffer to turn refcounting off - LPTSTR LockBuffer() - { - LPTSTR lpsz = GetBuffer(0); - if(lpsz != NULL) - GetData()->nRefs = -1; - return lpsz; - } - - void UnlockBuffer() - { - ATLASSERT(GetData()->nRefs == -1); - if (GetData() != _atltmpDataNil) - GetData()->nRefs = 1; - } - -// Implementation -public: - ~CString() // free any attached data - { - if (GetData() != _atltmpDataNil) - { - if (InterlockedDecrement(&GetData()->nRefs) <= 0) - delete[] (BYTE*)GetData(); - } - } - - int GetAllocLength() const - { - return GetData()->nAllocLength; - } - - static BOOL __stdcall _IsValidString(LPCTSTR lpsz, int /*nLength*/ = -1) - { - return (lpsz != NULL) ? TRUE : FALSE; - } - -protected: - LPTSTR m_pchData; // pointer to ref counted string data - - // implementation helpers - CStringData* GetData() const - { - ATLASSERT(m_pchData != NULL); - return ((CStringData*)m_pchData) - 1; - } - - void Init() - { - m_pchData = _GetEmptyString().m_pchData; - } - - BOOL AllocCopy(CString& dest, int nCopyLen, int nCopyIndex, int nExtraLen) const - { - // will clone the data attached to this string - // allocating 'nExtraLen' characters - // Places results in uninitialized string 'dest' - // Will copy the part or all of original data to start of new string - - BOOL bRet = FALSE; - int nNewLen = nCopyLen + nExtraLen; - if (nNewLen == 0) - { - dest.Init(); - bRet = TRUE; - } - else if(nNewLen >= nCopyLen) - { - if(dest.AllocBuffer(nNewLen)) - { - SecureHelper::memcpy_x(dest.m_pchData, (nNewLen + 1) * sizeof(TCHAR), m_pchData + nCopyIndex, nCopyLen * sizeof(TCHAR)); - bRet = TRUE; - } - } - - return bRet; - } - - // always allocate one extra character for '\0' termination - // assumes [optimistically] that data length will equal allocation length - BOOL AllocBuffer(int nLen) - { - ATLASSERT(nLen >= 0); - ATLASSERT(nLen <= INT_MAX - 1); // max size (enough room for 1 extra) - - if (nLen == 0) - { - Init(); - } - else - { - CStringData* pData = NULL; - ATLTRY(pData = (CStringData*)new BYTE[sizeof(CStringData) + (nLen + 1) * sizeof(TCHAR)]); - if(pData == NULL) - return FALSE; - - pData->nRefs = 1; - pData->data()[nLen] = _T('\0'); - pData->nDataLength = nLen; - pData->nAllocLength = nLen; - m_pchData = pData->data(); - } - - return TRUE; - } - - // Assignment operators - // All assign a new value to the string - // (a) first see if the buffer is big enough - // (b) if enough room, copy on top of old buffer, set size and type - // (c) otherwise free old string data, and create a new one - // - // All routines return the new string (but as a 'const CString&' so that - // assigning it again will cause a copy, eg: s1 = s2 = "hi there". - // - void AssignCopy(int nSrcLen, LPCTSTR lpszSrcData) - { - if(AllocBeforeWrite(nSrcLen)) - { - SecureHelper::memcpy_x(m_pchData, (nSrcLen + 1) * sizeof(TCHAR), lpszSrcData, nSrcLen * sizeof(TCHAR)); - GetData()->nDataLength = nSrcLen; - m_pchData[nSrcLen] = _T('\0'); - } - } - - // Concatenation - // NOTE: "operator +" is done as friend functions for simplicity - // There are three variants: - // CString + CString - // and for ? = TCHAR, LPCTSTR - // CString + ? - // ? + CString - BOOL ConcatCopy(int nSrc1Len, LPCTSTR lpszSrc1Data, int nSrc2Len, LPCTSTR lpszSrc2Data) - { - // -- master concatenation routine - // Concatenate two sources - // -- assume that 'this' is a new CString object - - BOOL bRet = TRUE; - int nNewLen = nSrc1Len + nSrc2Len; - if(nNewLen < nSrc1Len || nNewLen < nSrc2Len) - { - bRet = FALSE; - } - else if(nNewLen != 0) - { - bRet = AllocBuffer(nNewLen); - if (bRet) - { - SecureHelper::memcpy_x(m_pchData, (nNewLen + 1) * sizeof(TCHAR), lpszSrc1Data, nSrc1Len * sizeof(TCHAR)); - SecureHelper::memcpy_x(m_pchData + nSrc1Len, (nNewLen + 1 - nSrc1Len) * sizeof(TCHAR), lpszSrc2Data, nSrc2Len * sizeof(TCHAR)); - } - } - return bRet; - } - - void ConcatInPlace(int nSrcLen, LPCTSTR lpszSrcData) - { - // -- the main routine for += operators - - // concatenating an empty string is a no-op! - if (nSrcLen == 0) - return; - - // if the buffer is too small, or we have a width mis-match, just - // allocate a new buffer (slow but sure) - if (GetData()->nRefs > 1 || GetData()->nDataLength + nSrcLen > GetData()->nAllocLength) - { - // we have to grow the buffer, use the ConcatCopy routine - CStringData* pOldData = GetData(); - if (ConcatCopy(GetData()->nDataLength, m_pchData, nSrcLen, lpszSrcData)) - { - ATLASSERT(pOldData != NULL); - CString::Release(pOldData); - } - } - else - { - // fast concatenation when buffer big enough - SecureHelper::memcpy_x(m_pchData + GetData()->nDataLength, (GetData()->nAllocLength + 1) * sizeof(TCHAR), lpszSrcData, nSrcLen * sizeof(TCHAR)); - GetData()->nDataLength += nSrcLen; - ATLASSERT(GetData()->nDataLength <= GetData()->nAllocLength); - m_pchData[GetData()->nDataLength] = _T('\0'); - } - } - - void CopyBeforeWrite() - { - if (GetData()->nRefs > 1) - { - CStringData* pData = GetData(); - Release(); - if(AllocBuffer(pData->nDataLength)) - SecureHelper::memcpy_x(m_pchData, (GetData()->nAllocLength + 1) * sizeof(TCHAR), pData->data(), (pData->nDataLength + 1) * sizeof(TCHAR)); - } - ATLASSERT(GetData()->nRefs <= 1); - } - - BOOL AllocBeforeWrite(int nLen) - { - BOOL bRet = TRUE; - if (GetData()->nRefs > 1 || nLen > GetData()->nAllocLength) - { - Release(); - bRet = AllocBuffer(nLen); - } - ATLASSERT(GetData()->nRefs <= 1); - return bRet; - } - - void Release() - { - if (GetData() != _atltmpDataNil) - { - ATLASSERT(GetData()->nRefs != 0); - if (InterlockedDecrement(&GetData()->nRefs) <= 0) - delete[] (BYTE*)GetData(); - Init(); - } - } - - static void PASCAL Release(CStringData* pData) - { - if (pData != _atltmpDataNil) - { - ATLASSERT(pData->nRefs != 0); - if (InterlockedDecrement(&pData->nRefs) <= 0) - delete[] (BYTE*)pData; - } - } - - static int PASCAL SafeStrlen(LPCTSTR lpsz) - { - return (lpsz == NULL) ? 0 : lstrlen(lpsz); - } - - static int __stdcall _LoadString(UINT nID, LPTSTR lpszBuf, UINT nMaxBuf) - { -#ifdef _DEBUG - // LoadString without annoying warning from the Debug kernel if the - // segment containing the string is not present - if (::FindResource(ModuleHelper::GetResourceInstance(), MAKEINTRESOURCE((nID >> 4) + 1), RT_STRING) == NULL) - { - lpszBuf[0] = _T('\0'); - return 0; // not found - } -#endif // _DEBUG - - int nLen = ::LoadString(ModuleHelper::GetResourceInstance(), nID, lpszBuf, nMaxBuf); - if (nLen == 0) - lpszBuf[0] = _T('\0'); - - return nLen; - } - - static const CString& __stdcall _GetEmptyString() - { - return *(CString*)&_atltmpPchNil; - } - -// CString conversion helpers - static int __cdecl _wcstombsz(char* mbstr, const wchar_t* wcstr, size_t count) - { - if (count == 0 && mbstr != NULL) - return 0; - - int result = ::WideCharToMultiByte(CP_ACP, 0, wcstr, -1, mbstr, (int)count, NULL, NULL); - ATLASSERT(mbstr == NULL || result <= (int)count); - if (result > 0) - mbstr[result - 1] = 0; - return result; - } - - static int __cdecl _mbstowcsz(wchar_t* wcstr, const char* mbstr, size_t count) - { - if (count == 0 && wcstr != NULL) - return 0; - - int result = ::MultiByteToWideChar(CP_ACP, 0, mbstr, -1, wcstr, (int)count); - ATLASSERT(wcstr == NULL || result <= (int)count); - if (result > 0) - wcstr[result - 1] = 0; - return result; - } - -// Helpers to avoid CRT startup code -#ifdef _ATL_MIN_CRT - static const TCHAR* _cstrchr(const TCHAR* p, TCHAR ch) - { - // strchr for '\0' should succeed - while (*p != 0) - { - if (*p == ch) - break; - p = ::CharNext(p); - } - return (*p == ch) ? p : NULL; - } - - static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch) - { - const TCHAR* lpsz = NULL; - while (*p != 0) - { - if (*p == ch) - lpsz = p; - p = ::CharNext(p); - } - return lpsz; - } - - static TCHAR* _cstrrev(TCHAR* pStr) - { - // optimize NULL, zero-length, and single-char case - if ((pStr == NULL) || (pStr[0] == _T('\0')) || (pStr[1] == _T('\0'))) - return pStr; - - TCHAR* p = pStr; - - while (*p != 0) - { - TCHAR* pNext = ::CharNext(p); - if(pNext > p + 1) - { - char p1 = *(char*)p; - *(char*)p = *(char*)(p + 1); - *(char*)(p + 1) = p1; - } - p = pNext; - } - - p--; - TCHAR* q = pStr; - - while (q < p) - { - TCHAR t = *q; - *q = *p; - *p = t; - q++; - p--; - } - return pStr; - } - - static const TCHAR* _cstrstr(const TCHAR* pStr, const TCHAR* pCharSet) - { - int nLen = lstrlen(pCharSet); - if (nLen == 0) - return (TCHAR*)pStr; - - const TCHAR* pRet = NULL; - const TCHAR* pCur = pStr; - while((pCur = _cstrchr(pCur, *pCharSet)) != NULL) - { - if(memcmp(pCur, pCharSet, nLen * sizeof(TCHAR)) == 0) - { - pRet = pCur; - break; - } - pCur = ::CharNext(pCur); - } - return pRet; - } - - static int _cstrspn(const TCHAR* pStr, const TCHAR* pCharSet) - { - int nRet = 0; - const TCHAR* p = pStr; - while (*p != 0) - { - const TCHAR* pNext = ::CharNext(p); - if(pNext > p + 1) - { - if(_cstrchr_db(pCharSet, *p, *(p + 1)) == NULL) - break; - nRet += 2; - } - else - { - if(_cstrchr(pCharSet, *p) == NULL) - break; - nRet++; - } - p = pNext; - } - return nRet; - } - - static int _cstrcspn(const TCHAR* pStr, const TCHAR* pCharSet) - { - int nRet = 0; - TCHAR* p = (TCHAR*)pStr; - while (*p != 0) - { - TCHAR* pNext = ::CharNext(p); - if(pNext > p + 1) - { - if(_cstrchr_db(pCharSet, *p, *(p + 1)) != NULL) - break; - nRet += 2; - } - else - { - if(_cstrchr(pCharSet, *p) != NULL) - break; - nRet++; - } - p = pNext; - } - return nRet; - } - - static const TCHAR* _cstrpbrk(const TCHAR* p, const TCHAR* lpszCharSet) - { - int n = _cstrcspn(p, lpszCharSet); - return (p[n] != 0) ? &p[n] : NULL; - } - - static int _cstrisdigit(TCHAR ch) - { - WORD type; - GetStringTypeEx(GetThreadLocale(), CT_CTYPE1, &ch, 1, &type); - return (type & C1_DIGIT) == C1_DIGIT; - } - - static int _cstrisspace(TCHAR ch) - { - WORD type; - GetStringTypeEx(GetThreadLocale(), CT_CTYPE1, &ch, 1, &type); - return (type & C1_SPACE) == C1_SPACE; - } - - static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther) - { - return lstrcmp(pstrOne, pstrOther); - } - - static int _cstrcmpi(const TCHAR* pstrOne, const TCHAR* pstrOther) - { - return lstrcmpi(pstrOne, pstrOther); - } - - static int _cstrcoll(const TCHAR* pstrOne, const TCHAR* pstrOther) - { - int nRet = CompareString(GetThreadLocale(), 0, pstrOne, -1, pstrOther, -1); - ATLASSERT(nRet != 0); - return nRet - 2; // convert to strcmp convention - } - - static int _cstrcolli(const TCHAR* pstrOne, const TCHAR* pstrOther) - { - int nRet = CompareString(GetThreadLocale(), NORM_IGNORECASE, pstrOne, -1, pstrOther, -1); - ATLASSERT(nRet != 0); - return nRet - 2; // convert to strcmp convention - } - - static int _cstrtoi(const TCHAR* nptr) - { - int c; // current char - int total; // current total - int sign; // if '-', then negative, otherwise positive - - while (_cstrisspace(*nptr)) - ++nptr; - - c = (int)(_TUCHAR)*nptr++; - sign = c; // save sign indication - if (c == _T('-') || c == _T('+')) - c = (int)(_TUCHAR)*nptr++; // skip sign - - total = 0; - - while (_cstrisdigit((TCHAR)c)) - { - total = 10 * total + (c - '0'); // accumulate digit - c = (int)(_TUCHAR)*nptr++; // get next char - } - - if (sign == '-') - return -total; - else - return total; // return result, negated if necessary - } -#else // !_ATL_MIN_CRT - static const TCHAR* _cstrchr(const TCHAR* p, TCHAR ch) - { - return _tcschr(p, ch); - } - - static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch) - { - return _tcsrchr(p, ch); - } - - static TCHAR* _cstrrev(TCHAR* pStr) - { - return _tcsrev(pStr); - } - - static const TCHAR* _cstrstr(const TCHAR* pStr, const TCHAR* pCharSet) - { - return _tcsstr(pStr, pCharSet); - } - - static int _cstrspn(const TCHAR* pStr, const TCHAR* pCharSet) - { - return (int)_tcsspn(pStr, pCharSet); - } - - static int _cstrcspn(const TCHAR* pStr, const TCHAR* pCharSet) - { - return (int)_tcscspn(pStr, pCharSet); - } - - static const TCHAR* _cstrpbrk(const TCHAR* p, const TCHAR* lpszCharSet) - { - return _tcspbrk(p, lpszCharSet); - } - - static int _cstrisdigit(TCHAR ch) - { - return _istdigit(ch); - } - - static int _cstrisspace(TCHAR ch) - { - return _istspace((_TUCHAR)ch); - } - - static int _cstrcmp(const TCHAR* pstrOne, const TCHAR* pstrOther) - { - return _tcscmp(pstrOne, pstrOther); - } - - static int _cstrcmpi(const TCHAR* pstrOne, const TCHAR* pstrOther) - { - return _tcsicmp(pstrOne, pstrOther); - } - -#ifndef _WIN32_WCE - static int _cstrcoll(const TCHAR* pstrOne, const TCHAR* pstrOther) - { - return _tcscoll(pstrOne, pstrOther); - } - - static int _cstrcolli(const TCHAR* pstrOne, const TCHAR* pstrOther) - { - return _tcsicoll(pstrOne, pstrOther); - } -#endif // !_WIN32_WCE - - static int _cstrtoi(const TCHAR* nptr) - { - return _ttoi(nptr); - } -#endif // !_ATL_MIN_CRT - - static const TCHAR* _cstrchr_db(const TCHAR* p, TCHAR ch1, TCHAR ch2) - { - const TCHAR* lpsz = NULL; - while (*p != 0) - { - if (*p == ch1 && *(p + 1) == ch2) - { - lpsz = p; - break; - } - p = ::CharNext(p); - } - return lpsz; - } -}; - - -// Compare helpers - -inline bool __stdcall operator ==(const CString& s1, const CString& s2) -{ return s1.Compare(s2) == 0; } - -inline bool __stdcall operator ==(const CString& s1, LPCTSTR s2) -{ return s1.Compare(s2) == 0; } - -inline bool __stdcall operator ==(LPCTSTR s1, const CString& s2) -{ return s2.Compare(s1) == 0; } - -inline bool __stdcall operator !=(const CString& s1, const CString& s2) -{ return s1.Compare(s2) != 0; } - -inline bool __stdcall operator !=(const CString& s1, LPCTSTR s2) -{ return s1.Compare(s2) != 0; } - -inline bool __stdcall operator !=(LPCTSTR s1, const CString& s2) -{ return s2.Compare(s1) != 0; } - -inline bool __stdcall operator <(const CString& s1, const CString& s2) -{ return s1.Compare(s2) < 0; } - -inline bool __stdcall operator <(const CString& s1, LPCTSTR s2) -{ return s1.Compare(s2) < 0; } - -inline bool __stdcall operator <(LPCTSTR s1, const CString& s2) -{ return s2.Compare(s1) > 0; } - -inline bool __stdcall operator >(const CString& s1, const CString& s2) -{ return s1.Compare(s2) > 0; } - -inline bool __stdcall operator >(const CString& s1, LPCTSTR s2) -{ return s1.Compare(s2) > 0; } - -inline bool __stdcall operator >(LPCTSTR s1, const CString& s2) -{ return s2.Compare(s1) < 0; } - -inline bool __stdcall operator <=(const CString& s1, const CString& s2) -{ return s1.Compare(s2) <= 0; } - -inline bool __stdcall operator <=(const CString& s1, LPCTSTR s2) -{ return s1.Compare(s2) <= 0; } - -inline bool __stdcall operator <=(LPCTSTR s1, const CString& s2) -{ return s2.Compare(s1) >= 0; } - -inline bool __stdcall operator >=(const CString& s1, const CString& s2) -{ return s1.Compare(s2) >= 0; } - -inline bool __stdcall operator >=(const CString& s1, LPCTSTR s2) -{ return s1.Compare(s2) >= 0; } - -inline bool __stdcall operator >=(LPCTSTR s1, const CString& s2) -{ return s2.Compare(s1) <= 0; } - - -// CString "operator +" functions - -inline CString __stdcall operator +(const CString& string1, const CString& string2) -{ - CString s; - s.ConcatCopy(string1.GetData()->nDataLength, string1.m_pchData, string2.GetData()->nDataLength, string2.m_pchData); - return s; -} - -inline CString __stdcall operator +(const CString& string, TCHAR ch) -{ - CString s; - s.ConcatCopy(string.GetData()->nDataLength, string.m_pchData, 1, &ch); - return s; -} - -inline CString __stdcall operator +(TCHAR ch, const CString& string) -{ - CString s; - s.ConcatCopy(1, &ch, string.GetData()->nDataLength, string.m_pchData); - return s; -} - -#ifdef _UNICODE -inline CString __stdcall operator +(const CString& string, char ch) -{ - return string + (TCHAR)ch; -} - -inline CString __stdcall operator +(char ch, const CString& string) -{ - return (TCHAR)ch + string; -} -#endif // _UNICODE - -inline CString __stdcall operator +(const CString& string, LPCTSTR lpsz) -{ - ATLASSERT(lpsz == NULL || CString::_IsValidString(lpsz)); - CString s; - s.ConcatCopy(string.GetData()->nDataLength, string.m_pchData, CString::SafeStrlen(lpsz), lpsz); - return s; -} - -inline CString __stdcall operator +(LPCTSTR lpsz, const CString& string) -{ - ATLASSERT(lpsz == NULL || CString::_IsValidString(lpsz)); - CString s; - s.ConcatCopy(CString::SafeStrlen(lpsz), lpsz, string.GetData()->nDataLength, string.m_pchData); - return s; -} - -#endif // !_WTL_NO_CSTRING - - -/////////////////////////////////////////////////////////////////////////////// -// CRecentDocumentList - MRU List Support - -#ifndef _WIN32_WCE - -#ifndef _WTL_MRUEMPTY_TEXT - #define _WTL_MRUEMPTY_TEXT _T("(empty)") -#endif - -// forward declaration -inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen); - -template -class CRecentDocumentListBase -{ -public: -// Declarations - struct _DocEntry - { - TCHAR szDocName[t_cchItemLen]; - bool operator ==(const _DocEntry& de) const - { return (lstrcmpi(szDocName, de.szDocName) == 0); } - }; - - enum - { - m_nMaxEntries_Min = 2, - m_nMaxEntries_Max = t_nLastID - t_nFirstID + 1, - m_cchMaxItemLen_Min = 6, - m_cchMaxItemLen_Max = t_cchItemLen, - m_cchItemNameLen = 11 - }; - -// Data members - ATL::CSimpleArray<_DocEntry> m_arrDocs; - int m_nMaxEntries; // default is 4 - HMENU m_hMenu; - - TCHAR m_szNoEntries[t_cchItemLen]; - - int m_cchMaxItemLen; - -// Constructor - CRecentDocumentListBase() : m_hMenu(NULL), m_nMaxEntries(4), m_cchMaxItemLen(-1) - { - // These ASSERTs verify values of the template arguments - ATLASSERT(t_cchItemLen > m_cchMaxItemLen_Min); - ATLASSERT(m_nMaxEntries_Max > m_nMaxEntries_Min); - } - -// Attributes - HMENU GetMenuHandle() const - { - return m_hMenu; - } - - void SetMenuHandle(HMENU hMenu) - { - ATLASSERT(hMenu == NULL || ::IsMenu(hMenu)); - m_hMenu = hMenu; - if(m_hMenu == NULL || (::GetMenuString(m_hMenu, t_nFirstID, m_szNoEntries, t_cchItemLen, MF_BYCOMMAND) == 0)) - { - T* pT = static_cast(this); - pT; // avoid level 4 warning - SecureHelper::strncpy_x(m_szNoEntries, _countof(m_szNoEntries), pT->GetMRUEmptyText(), _TRUNCATE); - } - } - - int GetMaxEntries() const - { - return m_nMaxEntries; - } - - void SetMaxEntries(int nMaxEntries) - { - ATLASSERT(nMaxEntries >= m_nMaxEntries_Min && nMaxEntries <= m_nMaxEntries_Max); - if(nMaxEntries < m_nMaxEntries_Min) - nMaxEntries = m_nMaxEntries_Min; - else if(nMaxEntries > m_nMaxEntries_Max) - nMaxEntries = m_nMaxEntries_Max; - m_nMaxEntries = nMaxEntries; - } - - int GetMaxItemLength() const - { - return m_cchMaxItemLen; - } - - void SetMaxItemLength(int cchMaxLen) - { - ATLASSERT((cchMaxLen >= m_cchMaxItemLen_Min && cchMaxLen <= m_cchMaxItemLen_Max) || cchMaxLen == -1); - if(cchMaxLen != -1) - { - if(cchMaxLen < m_cchMaxItemLen_Min) - cchMaxLen = m_cchMaxItemLen_Min; - else if(cchMaxLen > m_cchMaxItemLen_Max) - cchMaxLen = m_cchMaxItemLen_Max; - } - m_cchMaxItemLen = cchMaxLen; - T* pT = static_cast(this); - pT->UpdateMenu(); - } - -// Operations - BOOL AddToList(LPCTSTR lpstrDocName) - { - _DocEntry de; - errno_t nRet = SecureHelper::strncpy_x(de.szDocName, _countof(de.szDocName), lpstrDocName, _TRUNCATE); - if(nRet != 0 && nRet != STRUNCATE) - return FALSE; - - for(int i = 0; i < m_arrDocs.GetSize(); i++) - { - if(lstrcmpi(m_arrDocs[i].szDocName, lpstrDocName) == 0) - { - m_arrDocs.RemoveAt(i); - break; - } - } - - if(m_arrDocs.GetSize() == m_nMaxEntries) - m_arrDocs.RemoveAt(0); - - BOOL bRet = m_arrDocs.Add(de); - if(bRet) - { - T* pT = static_cast(this); - bRet = pT->UpdateMenu(); - } - return bRet; - } - - // This function is deprecated because it is not safe. - // Use the version below that accepts the buffer length. -#if (_MSC_VER >= 1300) - __declspec(deprecated) -#endif - BOOL GetFromList(int /*nItemID*/, LPTSTR /*lpstrDocName*/) - { - ATLASSERT(FALSE); - return FALSE; - } - - BOOL GetFromList(int nItemID, LPTSTR lpstrDocName, int cchLength) - { - int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1; - if(nIndex < 0 || nIndex >= m_arrDocs.GetSize()) - return FALSE; - if(lstrlen(m_arrDocs[nIndex].szDocName) >= cchLength) - return FALSE; - SecureHelper::strcpy_x(lpstrDocName, cchLength, m_arrDocs[nIndex].szDocName); - - return TRUE; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - BOOL GetFromList(int nItemID, _CSTRING_NS::CString& strDocName) - { - int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1; - if(nIndex < 0 || nIndex >= m_arrDocs.GetSize()) - return FALSE; - strDocName = m_arrDocs[nIndex].szDocName; - return TRUE; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - BOOL RemoveFromList(int nItemID) - { - int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1; - BOOL bRet = m_arrDocs.RemoveAt(nIndex); - if(bRet) - { - T* pT = static_cast(this); - bRet = pT->UpdateMenu(); - } - return bRet; - } - - BOOL MoveToTop(int nItemID) - { - int nIndex = m_arrDocs.GetSize() - (nItemID - t_nFirstID) - 1; - if(nIndex < 0 || nIndex >= m_arrDocs.GetSize()) - return FALSE; - _DocEntry de; - de = m_arrDocs[nIndex]; - m_arrDocs.RemoveAt(nIndex); - BOOL bRet = m_arrDocs.Add(de); - if(bRet) - { - T* pT = static_cast(this); - bRet = pT->UpdateMenu(); - } - return bRet; - } - - BOOL ReadFromRegistry(LPCTSTR lpstrRegKey) - { - T* pT = static_cast(this); - CRegKeyEx rkParent; - CRegKeyEx rk; - - LONG lRet = rkParent.Open(HKEY_CURRENT_USER, lpstrRegKey); - if(lRet != ERROR_SUCCESS) - return FALSE; - lRet = rk.Open(rkParent, pT->GetRegKeyName()); - if(lRet != ERROR_SUCCESS) - return FALSE; - - DWORD dwRet = 0; - lRet = rk.QueryDWORDValue(pT->GetRegCountName(), dwRet); - if(lRet != ERROR_SUCCESS) - return FALSE; - SetMaxEntries(dwRet); - - m_arrDocs.RemoveAll(); - - TCHAR szRetString[t_cchItemLen] = { 0 }; - _DocEntry de; - - for(int nItem = m_nMaxEntries; nItem > 0; nItem--) - { - TCHAR szBuff[m_cchItemNameLen] = { 0 }; - SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem); - ULONG ulCount = t_cchItemLen; - lRet = rk.QueryStringValue(szBuff, szRetString, &ulCount); - if(lRet == ERROR_SUCCESS) - { - SecureHelper::strcpy_x(de.szDocName, _countof(de.szDocName), szRetString); - m_arrDocs.Add(de); - } - } - - rk.Close(); - rkParent.Close(); - - return pT->UpdateMenu(); - } - - BOOL WriteToRegistry(LPCTSTR lpstrRegKey) - { - T* pT = static_cast(this); - pT; // avoid level 4 warning - CRegKeyEx rkParent; - CRegKeyEx rk; - - LONG lRet = rkParent.Create(HKEY_CURRENT_USER, lpstrRegKey); - if(lRet != ERROR_SUCCESS) - return FALSE; - lRet = rk.Create(rkParent, pT->GetRegKeyName()); - if(lRet != ERROR_SUCCESS) - return FALSE; - - lRet = rk.SetDWORDValue(pT->GetRegCountName(), m_nMaxEntries); - ATLASSERT(lRet == ERROR_SUCCESS); - - // set new values - int nItem; - for(nItem = m_arrDocs.GetSize(); nItem > 0; nItem--) - { - TCHAR szBuff[m_cchItemNameLen] = { 0 }; - SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem); - TCHAR szDocName[t_cchItemLen] = { 0 }; - GetFromList(t_nFirstID + nItem - 1, szDocName, t_cchItemLen); - lRet = rk.SetStringValue(szBuff, szDocName); - ATLASSERT(lRet == ERROR_SUCCESS); - } - - // delete unused keys - for(nItem = m_arrDocs.GetSize() + 1; nItem < m_nMaxEntries_Max; nItem++) - { - TCHAR szBuff[m_cchItemNameLen] = { 0 }; - SecureHelper::wsprintf_x(szBuff, m_cchItemNameLen, pT->GetRegItemName(), nItem); - rk.DeleteValue(szBuff); - } - - rk.Close(); - rkParent.Close(); - - return TRUE; - } - -// Implementation - BOOL UpdateMenu() - { - if(m_hMenu == NULL) - return FALSE; - ATLASSERT(::IsMenu(m_hMenu)); - - int nItems = ::GetMenuItemCount(m_hMenu); - int nInsertPoint; - for(nInsertPoint = 0; nInsertPoint < nItems; nInsertPoint++) - { - CMenuItemInfo mi; - mi.fMask = MIIM_ID; - ::GetMenuItemInfo(m_hMenu, nInsertPoint, TRUE, &mi); - if (mi.wID == t_nFirstID) - break; - } - ATLASSERT(nInsertPoint < nItems && "You need a menu item with an ID = t_nFirstID"); - - int nItem; - for(nItem = t_nFirstID; nItem < t_nFirstID + m_nMaxEntries; nItem++) - { - // keep the first one as an insertion point - if (nItem != t_nFirstID) - ::DeleteMenu(m_hMenu, nItem, MF_BYCOMMAND); - } - - TCHAR szItemText[t_cchItemLen + 6] = { 0 }; // add space for &, 2 digits, and a space - int nSize = m_arrDocs.GetSize(); - nItem = 0; - if(nSize > 0) - { - for(nItem = 0; nItem < nSize; nItem++) - { - if(m_cchMaxItemLen == -1) - { - SecureHelper::wsprintf_x(szItemText, t_cchItemLen + 6, _T("&%i %s"), nItem + 1, m_arrDocs[nSize - 1 - nItem].szDocName); - } - else - { - TCHAR szBuff[t_cchItemLen] = { 0 }; - T* pT = static_cast(this); - pT; // avoid level 4 warning - bool bRet = pT->CompactDocumentName(szBuff, m_arrDocs[nSize - 1 - nItem].szDocName, m_cchMaxItemLen); - bRet; // avoid level 4 warning - ATLASSERT(bRet); - SecureHelper::wsprintf_x(szItemText, t_cchItemLen + 6, _T("&%i %s"), nItem + 1, szBuff); - } - ::InsertMenu(m_hMenu, nInsertPoint + nItem, MF_BYPOSITION | MF_STRING, t_nFirstID + nItem, szItemText); - } - } - else // empty - { - ::InsertMenu(m_hMenu, nInsertPoint, MF_BYPOSITION | MF_STRING, t_nFirstID, m_szNoEntries); - ::EnableMenuItem(m_hMenu, t_nFirstID, MF_GRAYED); - nItem++; - } - ::DeleteMenu(m_hMenu, nInsertPoint + nItem, MF_BYPOSITION); - - return TRUE; - } - -// Overrideables - // override to provide a different method of compacting document names - static bool CompactDocumentName(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen) - { - return AtlCompactPath(lpstrOut, lpstrIn, cchLen); - } - - static LPCTSTR GetRegKeyName() - { - return _T("Recent Document List"); - } - - static LPCTSTR GetRegCountName() - { - return _T("DocumentCount"); - } - - static LPCTSTR GetRegItemName() - { - // Note: This string is a format string used with wsprintf(). - // Resulting formatted string must be m_cchItemNameLen or less - // characters long, including the terminating null character. - return _T("Document%i"); - } - - static LPCTSTR GetMRUEmptyText() - { - return _WTL_MRUEMPTY_TEXT; - } -}; - -class CRecentDocumentList : public CRecentDocumentListBase -{ -public: -// nothing here -}; - -#endif // _WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CFindFile - file search helper class - -class CFindFile -{ -public: -// Data members - WIN32_FIND_DATA m_fd; - TCHAR m_lpszRoot[MAX_PATH]; - TCHAR m_chDirSeparator; - HANDLE m_hFind; - BOOL m_bFound; - -// Constructor/destructor - CFindFile() : m_hFind(NULL), m_chDirSeparator(_T('\\')), m_bFound(FALSE) - { } - - ~CFindFile() - { - Close(); - } - -// Attributes - ULONGLONG GetFileSize() const - { - ATLASSERT(m_hFind != NULL); - - ULARGE_INTEGER nFileSize = { 0 }; - - if(m_bFound) - { - nFileSize.LowPart = m_fd.nFileSizeLow; - nFileSize.HighPart = m_fd.nFileSizeHigh; - } - else - { - nFileSize.QuadPart = 0; - } - - return nFileSize.QuadPart; - } - - BOOL GetFileName(LPTSTR lpstrFileName, int cchLength) const - { - ATLASSERT(m_hFind != NULL); - if(lstrlen(m_fd.cFileName) >= cchLength) - return FALSE; - - if(m_bFound) - SecureHelper::strcpy_x(lpstrFileName, cchLength, m_fd.cFileName); - - return m_bFound; - } - - BOOL GetFilePath(LPTSTR lpstrFilePath, int cchLength) const - { - ATLASSERT(m_hFind != NULL); - - int nLen = lstrlen(m_lpszRoot); -#ifndef _WIN32_WCE - ATLASSERT(nLen > 0); - if(nLen == 0) - return FALSE; - - bool bAddSep = (m_lpszRoot[nLen - 1] != _T('\\') && m_lpszRoot[nLen - 1] !=_T('/')); -#else // CE specific - // allow diskless devices (nLen == 0) - bool bAddSep = ((nLen == 0) || (m_lpszRoot[nLen - 1] != _T('\\') && m_lpszRoot[nLen - 1] !=_T('/'))); -#endif // _WIN32_WCE - - if((lstrlen(m_lpszRoot) + (bAddSep ? 1 : 0)) >= cchLength) - return FALSE; - - SecureHelper::strcpy_x(lpstrFilePath, cchLength, m_lpszRoot); - - if(bAddSep) - { - TCHAR szSeparator[2] = { m_chDirSeparator, 0 }; - SecureHelper::strcat_x(lpstrFilePath, cchLength, szSeparator); - } - - SecureHelper::strcat_x(lpstrFilePath, cchLength, m_fd.cFileName); - - return TRUE; - } - -#ifndef _WIN32_WCE - BOOL GetFileTitle(LPTSTR lpstrFileTitle, int cchLength) const - { - ATLASSERT(m_hFind != NULL); - - TCHAR szBuff[MAX_PATH] = { 0 }; - if(!GetFileName(szBuff, MAX_PATH)) - return FALSE; - - if(lstrlen(szBuff) >= cchLength || cchLength < 1) - return FALSE; - - // find the last dot - LPTSTR pstrDot = (LPTSTR)_cstrrchr(szBuff, _T('.')); - if(pstrDot != NULL) - *pstrDot = 0; - - SecureHelper::strcpy_x(lpstrFileTitle, cchLength, szBuff); - - return TRUE; - } -#endif // !_WIN32_WCE - - BOOL GetFileURL(LPTSTR lpstrFileURL, int cchLength) const - { - ATLASSERT(m_hFind != NULL); - - TCHAR szBuff[MAX_PATH] = { 0 }; - if(!GetFilePath(szBuff, MAX_PATH)) - return FALSE; - LPCTSTR lpstrFileURLPrefix = _T("file://"); - if(lstrlen(szBuff) + lstrlen(lpstrFileURLPrefix) >= cchLength) - return FALSE; - SecureHelper::strcpy_x(lpstrFileURL, cchLength, lpstrFileURLPrefix); - SecureHelper::strcat_x(lpstrFileURL, cchLength, szBuff); - - return TRUE; - } - - BOOL GetRoot(LPTSTR lpstrRoot, int cchLength) const - { - ATLASSERT(m_hFind != NULL); - if(lstrlen(m_lpszRoot) >= cchLength) - return FALSE; - - SecureHelper::strcpy_x(lpstrRoot, cchLength, m_lpszRoot); - - return TRUE; - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - _CSTRING_NS::CString GetFileName() const - { - ATLASSERT(m_hFind != NULL); - - _CSTRING_NS::CString ret; - - if(m_bFound) - ret = m_fd.cFileName; - return ret; - } - - _CSTRING_NS::CString GetFilePath() const - { - ATLASSERT(m_hFind != NULL); - - _CSTRING_NS::CString strResult = m_lpszRoot; - int nLen = strResult.GetLength(); -#ifndef _WIN32_WCE - ATLASSERT(nLen > 0); - if(nLen == 0) - return strResult; - - if((strResult[nLen - 1] != _T('\\')) && (strResult[nLen - 1] != _T('/'))) -#else // CE specific - // allow diskless devices (nLen == 0) - if((nLen == 0) || ((strResult[nLen - 1] != _T('\\')) && (strResult[nLen - 1] != _T('/')))) -#endif // _WIN32_WCE - strResult += m_chDirSeparator; - strResult += GetFileName(); - return strResult; - } - -#ifndef _WIN32_WCE - _CSTRING_NS::CString GetFileTitle() const - { - ATLASSERT(m_hFind != NULL); - - _CSTRING_NS::CString strResult; - GetFileTitle(strResult.GetBuffer(MAX_PATH), MAX_PATH); - strResult.ReleaseBuffer(); - - return strResult; - } -#endif // !_WIN32_WCE - - _CSTRING_NS::CString GetFileURL() const - { - ATLASSERT(m_hFind != NULL); - - _CSTRING_NS::CString strResult("file://"); - strResult += GetFilePath(); - return strResult; - } - - _CSTRING_NS::CString GetRoot() const - { - ATLASSERT(m_hFind != NULL); - - _CSTRING_NS::CString str = m_lpszRoot; - return str; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - BOOL GetLastWriteTime(FILETIME* pTimeStamp) const - { - ATLASSERT(m_hFind != NULL); - ATLASSERT(pTimeStamp != NULL); - - if(m_bFound && pTimeStamp != NULL) - { - *pTimeStamp = m_fd.ftLastWriteTime; - return TRUE; - } - - return FALSE; - } - - BOOL GetLastAccessTime(FILETIME* pTimeStamp) const - { - ATLASSERT(m_hFind != NULL); - ATLASSERT(pTimeStamp != NULL); - - if(m_bFound && pTimeStamp != NULL) - { - *pTimeStamp = m_fd.ftLastAccessTime; - return TRUE; - } - - return FALSE; - } - - BOOL GetCreationTime(FILETIME* pTimeStamp) const - { - ATLASSERT(m_hFind != NULL); - - if(m_bFound && pTimeStamp != NULL) - { - *pTimeStamp = m_fd.ftCreationTime; - return TRUE; - } - - return FALSE; - } - - BOOL MatchesMask(DWORD dwMask) const - { - ATLASSERT(m_hFind != NULL); - - if(m_bFound) - return ((m_fd.dwFileAttributes & dwMask) != 0); - - return FALSE; - } - - BOOL IsDots() const - { - ATLASSERT(m_hFind != NULL); - - // return TRUE if the file name is "." or ".." and - // the file is a directory - - BOOL bResult = FALSE; - if(m_bFound && IsDirectory()) - { - if(m_fd.cFileName[0] == _T('.') && (m_fd.cFileName[1] == _T('\0') || (m_fd.cFileName[1] == _T('.') && m_fd.cFileName[2] == _T('\0')))) - bResult = TRUE; - } - - return bResult; - } - - BOOL IsReadOnly() const - { - return MatchesMask(FILE_ATTRIBUTE_READONLY); - } - - BOOL IsDirectory() const - { - return MatchesMask(FILE_ATTRIBUTE_DIRECTORY); - } - - BOOL IsCompressed() const - { - return MatchesMask(FILE_ATTRIBUTE_COMPRESSED); - } - - BOOL IsSystem() const - { - return MatchesMask(FILE_ATTRIBUTE_SYSTEM); - } - - BOOL IsHidden() const - { - return MatchesMask(FILE_ATTRIBUTE_HIDDEN); - } - - BOOL IsTemporary() const - { - return MatchesMask(FILE_ATTRIBUTE_TEMPORARY); - } - - BOOL IsNormal() const - { - return MatchesMask(FILE_ATTRIBUTE_NORMAL); - } - - BOOL IsArchived() const - { - return MatchesMask(FILE_ATTRIBUTE_ARCHIVE); - } - -// Operations - BOOL FindFile(LPCTSTR pstrName = NULL) - { - Close(); - - if(pstrName == NULL) - { - pstrName = _T("*.*"); - } - else if(lstrlen(pstrName) >= MAX_PATH) - { - ATLASSERT(FALSE); - return FALSE; - } - - SecureHelper::strcpy_x(m_fd.cFileName, _countof(m_fd.cFileName), pstrName); - - m_hFind = ::FindFirstFile(pstrName, &m_fd); - - if(m_hFind == INVALID_HANDLE_VALUE) - return FALSE; - -#ifndef _WIN32_WCE - bool bFullPath = (::GetFullPathName(pstrName, MAX_PATH, m_lpszRoot, NULL) != 0); -#else // CE specific - errno_t nRet = SecureHelper::strncpy_x(m_lpszRoot, _countof(m_lpszRoot), pstrName, _TRUNCATE); - bool bFullPath = (nRet == 0 || nRet == STRUNCATE); -#endif // _WIN32_WCE - - // passed name isn't a valid path but was found by the API - ATLASSERT(bFullPath); - if(!bFullPath) - { - Close(); - ::SetLastError(ERROR_INVALID_NAME); - return FALSE; - } - else - { - // find the last forward or backward whack - LPTSTR pstrBack = (LPTSTR)_cstrrchr(m_lpszRoot, _T('\\')); - LPTSTR pstrFront = (LPTSTR)_cstrrchr(m_lpszRoot, _T('/')); - - if(pstrFront != NULL || pstrBack != NULL) - { - if(pstrFront == NULL) - pstrFront = m_lpszRoot; - if(pstrBack == NULL) - pstrBack = m_lpszRoot; - - // from the start to the last whack is the root - - if(pstrFront >= pstrBack) - *pstrFront = _T('\0'); - else - *pstrBack = _T('\0'); - } - } - - m_bFound = TRUE; - - return TRUE; - } - - BOOL FindNextFile() - { - ATLASSERT(m_hFind != NULL); - - if(m_hFind == NULL) - return FALSE; - - if(!m_bFound) - return FALSE; - - m_bFound = ::FindNextFile(m_hFind, &m_fd); - - return m_bFound; - } - - void Close() - { - m_bFound = FALSE; - - if(m_hFind != NULL && m_hFind != INVALID_HANDLE_VALUE) - { - ::FindClose(m_hFind); - m_hFind = NULL; - } - } - -// Helper - static const TCHAR* _cstrrchr(const TCHAR* p, TCHAR ch) - { -#ifdef _ATL_MIN_CRT - const TCHAR* lpsz = NULL; - while (*p != 0) - { - if (*p == ch) - lpsz = p; - p = ::CharNext(p); - } - return lpsz; -#else // !_ATL_MIN_CRT - return _tcsrchr(p, ch); -#endif // !_ATL_MIN_CRT - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Global functions for stock GDI objects - -inline HPEN AtlGetStockPen(int nPen) -{ -#if (_WIN32_WINNT >= 0x0500) && !defined(_WIN32_WCE) - ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN || nPen == DC_PEN); -#else - ATLASSERT(nPen == WHITE_PEN || nPen == BLACK_PEN || nPen == NULL_PEN); -#endif - return (HPEN)::GetStockObject(nPen); -} - -inline HBRUSH AtlGetStockBrush(int nBrush) -{ -#if (_WIN32_WINNT >= 0x0500) && !defined(_WIN32_WCE) - ATLASSERT((nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH) || nBrush == DC_BRUSH); -#else - ATLASSERT(nBrush >= WHITE_BRUSH && nBrush <= HOLLOW_BRUSH); -#endif - return (HBRUSH)::GetStockObject(nBrush); -} - -inline HFONT AtlGetStockFont(int nFont) -{ -#ifndef _WIN32_WCE - ATLASSERT((nFont >= OEM_FIXED_FONT && nFont <= SYSTEM_FIXED_FONT) || nFont == DEFAULT_GUI_FONT); -#else // CE specific - ATLASSERT(nFont == SYSTEM_FONT); -#endif // _WIN32_WCE - return (HFONT)::GetStockObject(nFont); -} - -inline HPALETTE AtlGetStockPalette(int nPalette) -{ - ATLASSERT(nPalette == DEFAULT_PALETTE); // the only one supported - return (HPALETTE)::GetStockObject(nPalette); -} - - -/////////////////////////////////////////////////////////////////////////////// -// Global function for compacting a path by replacing parts with ellipsis - -// helper for multi-byte character sets -inline bool _IsDBCSTrailByte(LPCTSTR lpstr, int nChar) -{ -#ifndef _UNICODE - int i = nChar; - for( ; i > 0; i--) - { - if(!::IsDBCSLeadByte(lpstr[i - 1])) - break; - } - return ((nChar > 0) && (((nChar - i) & 1) != 0)); -#else // _UNICODE - lpstr; nChar; - return false; -#endif // _UNICODE -} - -inline bool AtlCompactPath(LPTSTR lpstrOut, LPCTSTR lpstrIn, int cchLen) -{ - ATLASSERT(lpstrOut != NULL); - ATLASSERT(lpstrIn != NULL); - ATLASSERT(cchLen > 0); - - LPCTSTR szEllipsis = _T("..."); - const int cchEndEllipsis = 3; - const int cchMidEllipsis = 4; - - if(lstrlen(lpstrIn) < cchLen) - { - SecureHelper::strcpy_x(lpstrOut, cchLen, lpstrIn); - return true; - } - - lpstrOut[0] = 0; - - // check if the separator is a slash or a backslash - TCHAR chSlash = _T('\\'); - for(LPTSTR lpstr = (LPTSTR)lpstrIn; *lpstr != 0; lpstr = ::CharNext(lpstr)) - { - if((*lpstr == _T('/')) || (*lpstr == _T('\\'))) - chSlash = *lpstr; - } - - // find the filename portion of the path - LPCTSTR lpstrFileName = lpstrIn; - for(LPCTSTR pPath = lpstrIn; *pPath; pPath = ::CharNext(pPath)) - { - if((pPath[0] == _T('\\') || pPath[0] == _T(':') || pPath[0] == _T('/')) - && pPath[1] && pPath[1] != _T('\\') && pPath[1] != _T('/')) - lpstrFileName = pPath + 1; - } - int cchFileName = lstrlen(lpstrFileName); - - // handle just the filename without a path - if(lpstrFileName == lpstrIn && cchLen > cchEndEllipsis) - { - bool bRet = (SecureHelper::strncpy_x(lpstrOut, cchLen, lpstrIn, cchLen - cchEndEllipsis - 1) == 0); - if(bRet) - { -#ifndef _UNICODE - if(_IsDBCSTrailByte(lpstrIn, cchLen - cchEndEllipsis)) - lpstrOut[cchLen - cchEndEllipsis - 1] = 0; -#endif // _UNICODE - SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis); - } - return bRet; - } - - // handle just ellipsis - if((cchLen < (cchMidEllipsis + cchEndEllipsis))) - { - for(int i = 0; i < cchLen - 1; i++) - lpstrOut[i] = ((i + 1) == cchMidEllipsis) ? chSlash : _T('.'); - lpstrOut[cchLen - 1] = 0; - return true; - } - - // calc how much we have to copy - int cchToCopy = cchLen - (cchMidEllipsis + cchFileName) - 1; - - if(cchToCopy < 0) - cchToCopy = 0; - -#ifndef _UNICODE - if(cchToCopy > 0 && _IsDBCSTrailByte(lpstrIn, cchToCopy)) - cchToCopy--; -#endif // _UNICODE - - bool bRet = (SecureHelper::strncpy_x(lpstrOut, cchLen, lpstrIn, cchToCopy) == 0); - if(!bRet) - return false; - - // add ellipsis - SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis); - if(!bRet) - return false; - TCHAR szSlash[2] = { chSlash, 0 }; - SecureHelper::strcat_x(lpstrOut, cchLen, szSlash); - if(!bRet) - return false; - - // add filename (and ellipsis, if needed) - if(cchLen > (cchMidEllipsis + cchFileName)) - { - SecureHelper::strcat_x(lpstrOut, cchLen, lpstrFileName); - } - else - { - cchToCopy = cchLen - cchMidEllipsis - cchEndEllipsis - 1; -#ifndef _UNICODE - if(cchToCopy > 0 && _IsDBCSTrailByte(lpstrFileName, cchToCopy)) - cchToCopy--; -#endif // _UNICODE - bRet = (SecureHelper::strncpy_x(&lpstrOut[cchMidEllipsis], cchLen - cchMidEllipsis, lpstrFileName, cchToCopy) == 0); - if(bRet) - SecureHelper::strcat_x(lpstrOut, cchLen, szEllipsis); - } - - return bRet; -} - -}; // namespace WTL - -#endif // __ATLMISC_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlprint.h b/plugins/SmartAutoReplier/wtl/atlprint.h deleted file mode 100644 index 50a7fb17dc..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlprint.h +++ /dev/null @@ -1,1109 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLPRINT_H__ -#define __ATLPRINT_H__ - -#pragma once - -#ifdef _WIN32_WCE - #error atlprint.h is not supported on Windows CE -#endif - -#ifndef __ATLAPP_H__ - #error atlprint.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atlprint.h requires atlwin.h to be included first -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CPrinterInfo -// CPrinterT -// CDevModeT -// CPrinterDC -// CPrintJobInfo -// CPrintJob -// CPrintPreview -// CPrintPreviewWindowImpl -// CPrintPreviewWindow -// CZoomPrintPreviewWindowImpl -// CZoomPrintPreviewWindow - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CPrinterInfo - This class wraps all of the PRINTER_INFO_* structures -// and provided by ::GetPrinter. - -template -class _printer_info -{ -public: - typedef void infotype; -}; - -template <> class _printer_info<1> { public: typedef PRINTER_INFO_1 infotype; }; -template <> class _printer_info<2> { public: typedef PRINTER_INFO_2 infotype; }; -template <> class _printer_info<3> { public: typedef PRINTER_INFO_3 infotype; }; -template <> class _printer_info<4> { public: typedef PRINTER_INFO_4 infotype; }; -template <> class _printer_info<5> { public: typedef PRINTER_INFO_5 infotype; }; -template <> class _printer_info<6> { public: typedef PRINTER_INFO_6 infotype; }; -template <> class _printer_info<7> { public: typedef PRINTER_INFO_7 infotype; }; -// these are not in the old (vc6.0) headers -#ifdef _ATL_USE_NEW_PRINTER_INFO -template <> class _printer_info<8> { public: typedef PRINTER_INFO_8 infotype; }; -template <> class _printer_info<9> { public: typedef PRINTER_INFO_9 infotype; }; -#endif // _ATL_USE_NEW_PRINTER_INFO - - -template -class CPrinterInfo -{ -public: -// Data members - typename _printer_info::infotype* m_pi; - -// Constructor/destructor - CPrinterInfo() : m_pi(NULL) - { } - - CPrinterInfo(HANDLE hPrinter) : m_pi(NULL) - { - GetPrinterInfo(hPrinter); - } - - ~CPrinterInfo() - { - Cleanup(); - } - -// Operations - bool GetPrinterInfo(HANDLE hPrinter) - { - Cleanup(); - return GetPrinterInfoHelper(hPrinter, (BYTE**)&m_pi, t_nInfo); - } - -// Implementation - void Cleanup() - { - delete [] (BYTE*)m_pi; - m_pi = NULL; - } - - static bool GetPrinterInfoHelper(HANDLE hPrinter, BYTE** pi, int nIndex) - { - ATLASSERT(pi != NULL); - DWORD dw = 0; - BYTE* pb = NULL; - ::GetPrinter(hPrinter, nIndex, NULL, 0, &dw); - if (dw > 0) - { - ATLTRY(pb = new BYTE[dw]); - if (pb != NULL) - { - memset(pb, 0, dw); - DWORD dwNew; - if (!::GetPrinter(hPrinter, nIndex, pb, dw, &dwNew)) - { - delete [] pb; - pb = NULL; - } - } - } - *pi = pb; - return (pb != NULL); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CPrinter - Wrapper class for a HANDLE to a printer - -template -class CPrinterT -{ -public: -// Data members - HANDLE m_hPrinter; - -// Constructor/destructor - CPrinterT(HANDLE hPrinter = NULL) : m_hPrinter(hPrinter) - { } - - ~CPrinterT() - { - ClosePrinter(); - } - -// Operations - CPrinterT& operator =(HANDLE hPrinter) - { - if (hPrinter != m_hPrinter) - { - ClosePrinter(); - m_hPrinter = hPrinter; - } - return *this; - } - - bool IsNull() const { return (m_hPrinter == NULL); } - - bool OpenPrinter(HANDLE hDevNames, const DEVMODE* pDevMode = NULL) - { - bool b = false; - DEVNAMES* pdn = (DEVNAMES*)::GlobalLock(hDevNames); - if (pdn != NULL) - { - LPTSTR lpszPrinterName = (LPTSTR)pdn + pdn->wDeviceOffset; - b = OpenPrinter(lpszPrinterName, pDevMode); - ::GlobalUnlock(hDevNames); - } - return b; - } - - bool OpenPrinter(LPCTSTR lpszPrinterName, const DEVMODE* pDevMode = NULL) - { - ClosePrinter(); - PRINTER_DEFAULTS pdefs = { NULL, (DEVMODE*)pDevMode, PRINTER_ACCESS_USE }; - ::OpenPrinter((LPTSTR) lpszPrinterName, &m_hPrinter, (pDevMode == NULL) ? NULL : &pdefs); - - return (m_hPrinter != NULL); - } - - bool OpenPrinter(LPCTSTR lpszPrinterName, PRINTER_DEFAULTS* pprintdefs) - { - ClosePrinter(); - ::OpenPrinter((LPTSTR) lpszPrinterName, &m_hPrinter, pprintdefs); - return (m_hPrinter != NULL); - } - - bool OpenDefaultPrinter(const DEVMODE* pDevMode = NULL) - { - ClosePrinter(); - const int cchBuff = 512; - TCHAR buffer[cchBuff]; - buffer[0] = 0; - ::GetProfileString(_T("windows"), _T("device"), _T(",,,"), buffer, cchBuff); - int nLen = lstrlen(buffer); - if (nLen != 0) - { - LPTSTR lpsz = buffer; - while (*lpsz) - { - if (*lpsz == _T(',')) - { - *lpsz = 0; - break; - } - lpsz = CharNext(lpsz); - } - PRINTER_DEFAULTS pdefs = { NULL, (DEVMODE*)pDevMode, PRINTER_ACCESS_USE }; - ::OpenPrinter(buffer, &m_hPrinter, (pDevMode == NULL) ? NULL : &pdefs); - } - return m_hPrinter != NULL; - } - - void ClosePrinter() - { - if (m_hPrinter != NULL) - { - if (t_bManaged) - ::ClosePrinter(m_hPrinter); - m_hPrinter = NULL; - } - } - - bool PrinterProperties(HWND hWnd = NULL) - { - if (hWnd == NULL) - hWnd = ::GetActiveWindow(); - return !!::PrinterProperties(hWnd, m_hPrinter); - } - - HANDLE CopyToHDEVNAMES() const - { - HANDLE h = NULL; - CPrinterInfo<5> pinfon5; - CPrinterInfo<2> pinfon2; - LPTSTR lpszPrinterName = NULL; - // Some printers fail for PRINTER_INFO_5 in some situations - if (pinfon5.GetPrinterInfo(m_hPrinter)) - lpszPrinterName = pinfon5.m_pi->pPrinterName; - else if (pinfon2.GetPrinterInfo(m_hPrinter)) - lpszPrinterName = pinfon2.m_pi->pPrinterName; - if (lpszPrinterName != NULL) - { - int nLen = sizeof(DEVNAMES) + (lstrlen(lpszPrinterName) + 1) * sizeof(TCHAR); - h = ::GlobalAlloc(GMEM_MOVEABLE, nLen); - BYTE* pv = (BYTE*)::GlobalLock(h); - DEVNAMES* pdev = (DEVNAMES*)pv; - if (pv != NULL) - { - memset(pv, 0, nLen); - pdev->wDeviceOffset = sizeof(DEVNAMES) / sizeof(TCHAR); - pv = pv + sizeof(DEVNAMES); // now points to end - SecureHelper::strcpy_x((LPTSTR)pv, lstrlen(lpszPrinterName) + 1, lpszPrinterName); - ::GlobalUnlock(h); - } - } - return h; - } - - HDC CreatePrinterDC(const DEVMODE* pdm = NULL) const - { - CPrinterInfo<5> pinfo5; - CPrinterInfo<2> pinfo2; - HDC hDC = NULL; - LPTSTR lpszPrinterName = NULL; - // Some printers fail for PRINTER_INFO_5 in some situations - if (pinfo5.GetPrinterInfo(m_hPrinter)) - lpszPrinterName = pinfo5.m_pi->pPrinterName; - else if (pinfo2.GetPrinterInfo(m_hPrinter)) - lpszPrinterName = pinfo2.m_pi->pPrinterName; - if (lpszPrinterName != NULL) - hDC = ::CreateDC(NULL, lpszPrinterName, NULL, pdm); - return hDC; - } - - HDC CreatePrinterIC(const DEVMODE* pdm = NULL) const - { - CPrinterInfo<5> pinfo5; - CPrinterInfo<2> pinfo2; - HDC hDC = NULL; - LPTSTR lpszPrinterName = NULL; - // Some printers fail for PRINTER_INFO_5 in some situations - if (pinfo5.GetPrinterInfo(m_hPrinter)) - lpszPrinterName = pinfo5.m_pi->pPrinterName; - else if (pinfo2.GetPrinterInfo(m_hPrinter)) - lpszPrinterName = pinfo2.m_pi->pPrinterName; - if (lpszPrinterName != NULL) - hDC = ::CreateIC(NULL, lpszPrinterName, NULL, pdm); - return hDC; - } - - void Attach(HANDLE hPrinter) - { - ClosePrinter(); - m_hPrinter = hPrinter; - } - - HANDLE Detach() - { - HANDLE hPrinter = m_hPrinter; - m_hPrinter = NULL; - return hPrinter; - } - - operator HANDLE() const { return m_hPrinter; } -}; - -typedef CPrinterT CPrinterHandle; -typedef CPrinterT CPrinter; - - -/////////////////////////////////////////////////////////////////////////////// -// CDevMode - Wrapper class for DEVMODE - -template -class CDevModeT -{ -public: -// Data members - HANDLE m_hDevMode; - DEVMODE* m_pDevMode; - -// Constructor/destructor - CDevModeT(HANDLE hDevMode = NULL) : m_hDevMode(hDevMode) - { - m_pDevMode = (m_hDevMode != NULL) ? (DEVMODE*)::GlobalLock(m_hDevMode) : NULL; - } - - ~CDevModeT() - { - Cleanup(); - } - -// Operations - CDevModeT& operator =(HANDLE hDevMode) - { - Attach(hDevMode); - return *this; - } - - void Attach(HANDLE hDevModeNew) - { - Cleanup(); - m_hDevMode = hDevModeNew; - m_pDevMode = (m_hDevMode != NULL) ? (DEVMODE*)::GlobalLock(m_hDevMode) : NULL; - } - - HANDLE Detach() - { - if (m_hDevMode != NULL) - ::GlobalUnlock(m_hDevMode); - HANDLE hDevMode = m_hDevMode; - m_hDevMode = NULL; - return hDevMode; - } - - bool IsNull() const { return (m_hDevMode == NULL); } - - bool CopyFromPrinter(HANDLE hPrinter) - { - CPrinterInfo<2> pinfo; - bool b = pinfo.GetPrinterInfo(hPrinter); - if (b) - b = CopyFromDEVMODE(pinfo.m_pi->pDevMode); - return b; - } - - bool CopyFromDEVMODE(const DEVMODE* pdm) - { - if (pdm == NULL) - return false; - int nSize = pdm->dmSize + pdm->dmDriverExtra; - HANDLE h = ::GlobalAlloc(GMEM_MOVEABLE, nSize); - if (h != NULL) - { - void* p = ::GlobalLock(h); - SecureHelper::memcpy_x(p, nSize, pdm, nSize); - ::GlobalUnlock(h); - } - Attach(h); - return (h != NULL); - } - - bool CopyFromHDEVMODE(HANDLE hdm) - { - bool b = false; - if (hdm != NULL) - { - DEVMODE* pdm = (DEVMODE*)::GlobalLock(hdm); - b = CopyFromDEVMODE(pdm); - ::GlobalUnlock(hdm); - } - return b; - } - - HANDLE CopyToHDEVMODE() - { - if ((m_hDevMode == NULL) || (m_pDevMode == NULL)) - return NULL; - int nSize = m_pDevMode->dmSize + m_pDevMode->dmDriverExtra; - HANDLE h = ::GlobalAlloc(GMEM_MOVEABLE, nSize); - if (h != NULL) - { - void* p = ::GlobalLock(h); - SecureHelper::memcpy_x(p, nSize, m_pDevMode, nSize); - ::GlobalUnlock(h); - } - return h; - } - - // If this devmode was for another printer, this will create a new devmode - // based on the existing devmode, but retargeted at the new printer - bool UpdateForNewPrinter(HANDLE hPrinter) - { - bool bRet = false; - LONG nLen = ::DocumentProperties(NULL, hPrinter, NULL, NULL, NULL, 0); - CTempBuffer buff; - DEVMODE* pdm = buff.AllocateBytes(nLen); - if(pdm != NULL) - { - memset(pdm, 0, nLen); - LONG l = ::DocumentProperties(NULL, hPrinter, NULL, pdm, m_pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER); - if (l == IDOK) - bRet = CopyFromDEVMODE(pdm); - } - - return bRet; - } - - bool DocumentProperties(HANDLE hPrinter, HWND hWnd = NULL) - { - CPrinterInfo<1> pi; - pi.GetPrinterInfo(hPrinter); - if (hWnd == NULL) - hWnd = ::GetActiveWindow(); - - bool bRet = false; - LONG nLen = ::DocumentProperties(hWnd, hPrinter, pi.m_pi->pName, NULL, NULL, 0); - CTempBuffer buff; - DEVMODE* pdm = buff.AllocateBytes(nLen); - if(pdm != NULL) - { - memset(pdm, 0, nLen); - LONG l = ::DocumentProperties(hWnd, hPrinter, pi.m_pi->pName, pdm, m_pDevMode, DM_IN_BUFFER | DM_OUT_BUFFER | DM_PROMPT); - if (l == IDOK) - bRet = CopyFromDEVMODE(pdm); - } - - return bRet; - } - - operator HANDLE() const { return m_hDevMode; } - - operator DEVMODE*() const { return m_pDevMode; } - -// Implementation - void Cleanup() - { - if (m_hDevMode != NULL) - { - ::GlobalUnlock(m_hDevMode); - if(t_bManaged) - ::GlobalFree(m_hDevMode); - m_hDevMode = NULL; - } - } -}; - -typedef CDevModeT CDevModeHandle; -typedef CDevModeT CDevMode; - - -/////////////////////////////////////////////////////////////////////////////// -// CPrinterDC - -class CPrinterDC : public CDC -{ -public: -// Constructors/destructor - CPrinterDC() - { - CPrinter printer; - printer.OpenDefaultPrinter(); - Attach(printer.CreatePrinterDC()); - ATLASSERT(m_hDC != NULL); - } - - CPrinterDC(HANDLE hPrinter, const DEVMODE* pdm = NULL) - { - CPrinterHandle p; - p.Attach(hPrinter); - Attach(p.CreatePrinterDC(pdm)); - ATLASSERT(m_hDC != NULL); - } - - ~CPrinterDC() - { - DeleteDC(); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CPrintJob - Wraps a set of tasks for a specific printer (StartDoc/EndDoc) -// Handles aborting, background printing - -// Defines callbacks used by CPrintJob (not a COM interface) -class ATL_NO_VTABLE IPrintJobInfo -{ -public: - virtual void BeginPrintJob(HDC hDC) = 0; // allocate handles needed, etc. - virtual void EndPrintJob(HDC hDC, bool bAborted) = 0; // free handles, etc. - virtual void PrePrintPage(UINT nPage, HDC hDC) = 0; - virtual bool PrintPage(UINT nPage, HDC hDC) = 0; - virtual void PostPrintPage(UINT nPage, HDC hDC) = 0; - // If you want per page devmodes, return the DEVMODE* to use for nPage. - // You can optimize by only returning a new DEVMODE* when it is different - // from the one for nLastPage, otherwise return NULL. - // When nLastPage==0, the current DEVMODE* will be the default passed to - // StartPrintJob. - // Note: During print preview, nLastPage will always be "0". - virtual DEVMODE* GetNewDevModeForPage(UINT nLastPage, UINT nPage) = 0; - virtual bool IsValidPage(UINT nPage) = 0; -}; - -// Provides a default implementatin for IPrintJobInfo -// Typically, MI'd into a document or view class -class ATL_NO_VTABLE CPrintJobInfo : public IPrintJobInfo -{ -public: - virtual void BeginPrintJob(HDC /*hDC*/) // allocate handles needed, etc - { - } - - virtual void EndPrintJob(HDC /*hDC*/, bool /*bAborted*/) // free handles, etc - { - } - - virtual void PrePrintPage(UINT /*nPage*/, HDC hDC) - { - m_nPJState = ::SaveDC(hDC); - } - - virtual bool PrintPage(UINT /*nPage*/, HDC /*hDC*/) = 0; - - virtual void PostPrintPage(UINT /*nPage*/, HDC hDC) - { - RestoreDC(hDC, m_nPJState); - } - - virtual DEVMODE* GetNewDevModeForPage(UINT /*nLastPage*/, UINT /*nPage*/) - { - return NULL; - } - - virtual bool IsValidPage(UINT /*nPage*/) - { - return true; - } - -// Implementation - data - int m_nPJState; -}; - - -class CPrintJob -{ -public: -// Data members - CPrinterHandle m_printer; - IPrintJobInfo* m_pInfo; - DEVMODE* m_pDefDevMode; - DOCINFO m_docinfo; - int m_nJobID; - bool m_bCancel; - bool m_bComplete; - unsigned long m_nStartPage; - unsigned long m_nEndPage; - -// Constructor/destructor - CPrintJob() : m_nJobID(0), m_bCancel(false), m_bComplete(true) - { } - - ~CPrintJob() - { - ATLASSERT(IsJobComplete()); // premature destruction? - } - -// Operations - bool IsJobComplete() const - { - return m_bComplete; - } - - bool StartPrintJob(bool bBackground, HANDLE hPrinter, DEVMODE* pDefaultDevMode, - IPrintJobInfo* pInfo, LPCTSTR lpszDocName, - unsigned long nStartPage, unsigned long nEndPage, - bool bPrintToFile = false, LPCTSTR lpstrOutputFile = NULL) - { - ATLASSERT(m_bComplete); // previous job not done yet? - if (pInfo == NULL) - return false; - - memset(&m_docinfo, 0, sizeof(m_docinfo)); - m_docinfo.cbSize = sizeof(m_docinfo); - m_docinfo.lpszDocName = lpszDocName; - m_pInfo = pInfo; - m_nStartPage = nStartPage; - m_nEndPage = nEndPage; - m_printer.Attach(hPrinter); - m_pDefDevMode = pDefaultDevMode; - m_bComplete = false; - - if(bPrintToFile) - m_docinfo.lpszOutput = (lpstrOutputFile != NULL) ? lpstrOutputFile : _T("FILE:"); - - if (!bBackground) - { - m_bComplete = true; - return StartHelper(); - } - - // Create a thread and return - DWORD dwThreadID = 0; -#if !defined(_ATL_MIN_CRT) && defined(_MT) - HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, (UINT (WINAPI*)(void*))StartProc, this, 0, (UINT*)&dwThreadID); -#else - HANDLE hThread = ::CreateThread(NULL, 0, StartProc, (void*)this, 0, &dwThreadID); -#endif - if (hThread == NULL) - return false; - - ::CloseHandle(hThread); - - return true; - } - -// Implementation - static DWORD WINAPI StartProc(void* p) - { - CPrintJob* pThis = (CPrintJob*)p; - pThis->StartHelper(); - pThis->m_bComplete = true; - return 0; - } - - bool StartHelper() - { - CDC dcPrinter; - dcPrinter.Attach(m_printer.CreatePrinterDC(m_pDefDevMode)); - if (dcPrinter.IsNull()) - return false; - - m_nJobID = ::StartDoc(dcPrinter, &m_docinfo); - if (m_nJobID <= 0) - return false; - - m_pInfo->BeginPrintJob(dcPrinter); - - // print all the pages now - unsigned long nLastPage = 0; - for (unsigned long nPage = m_nStartPage; nPage <= m_nEndPage; nPage++) - { - if (!m_pInfo->IsValidPage(nPage)) - break; - DEVMODE* pdm = m_pInfo->GetNewDevModeForPage(nLastPage, nPage); - if (pdm != NULL) - dcPrinter.ResetDC(pdm); - dcPrinter.StartPage(); - m_pInfo->PrePrintPage(nPage, dcPrinter); - if (!m_pInfo->PrintPage(nPage, dcPrinter)) - m_bCancel = true; - m_pInfo->PostPrintPage(nPage, dcPrinter); - dcPrinter.EndPage(); - if (m_bCancel) - break; - nLastPage = nPage; - } - - m_pInfo->EndPrintJob(dcPrinter, m_bCancel); - if (m_bCancel) - ::AbortDoc(dcPrinter); - else - ::EndDoc(dcPrinter); - m_nJobID = 0; - return true; - } - - // Cancels a print job. Can be called asynchronously. - void CancelPrintJob() - { - m_bCancel = true; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CPrintPreview - Adds print preview support to an existing window - -class CPrintPreview -{ -public: -// Data members - IPrintJobInfo* m_pInfo; - CPrinterHandle m_printer; - CEnhMetaFile m_meta; - DEVMODE* m_pDefDevMode; - DEVMODE* m_pCurDevMode; - SIZE m_sizeCurPhysOffset; - -// Constructor - CPrintPreview() : m_pInfo(NULL), m_pDefDevMode(NULL), m_pCurDevMode(NULL) - { - m_sizeCurPhysOffset.cx = 0; - m_sizeCurPhysOffset.cy = 0; - } - -// Operations - void SetPrintPreviewInfo(HANDLE hPrinter, DEVMODE* pDefaultDevMode, IPrintJobInfo* pji) - { - m_printer.Attach(hPrinter); - m_pDefDevMode = pDefaultDevMode; - m_pInfo = pji; - m_nCurPage = 0; - m_pCurDevMode = NULL; - } - - void SetEnhMetaFile(HENHMETAFILE hEMF) - { - m_meta = hEMF; - } - - void SetPage(int nPage) - { - if (!m_pInfo->IsValidPage(nPage)) - return; - m_nCurPage = nPage; - m_pCurDevMode = m_pInfo->GetNewDevModeForPage(0, nPage); - if (m_pCurDevMode == NULL) - m_pCurDevMode = m_pDefDevMode; - CDC dcPrinter = m_printer.CreatePrinterDC(m_pCurDevMode); - - int iWidth = dcPrinter.GetDeviceCaps(PHYSICALWIDTH); - int iHeight = dcPrinter.GetDeviceCaps(PHYSICALHEIGHT); - int nLogx = dcPrinter.GetDeviceCaps(LOGPIXELSX); - int nLogy = dcPrinter.GetDeviceCaps(LOGPIXELSY); - - RECT rcMM = { 0, 0, ::MulDiv(iWidth, 2540, nLogx), ::MulDiv(iHeight, 2540, nLogy) }; - - m_sizeCurPhysOffset.cx = dcPrinter.GetDeviceCaps(PHYSICALOFFSETX); - m_sizeCurPhysOffset.cy = dcPrinter.GetDeviceCaps(PHYSICALOFFSETY); - - CEnhMetaFileDC dcMeta(dcPrinter, &rcMM); - m_pInfo->PrePrintPage(nPage, dcMeta); - m_pInfo->PrintPage(nPage, dcMeta); - m_pInfo->PostPrintPage(nPage, dcMeta); - m_meta.Attach(dcMeta.Close()); - } - - void GetPageRect(RECT& rc, LPRECT prc) - { - int x1 = rc.right-rc.left; - int y1 = rc.bottom - rc.top; - if ((x1 < 0) || (y1 < 0)) - return; - - CEnhMetaFileInfo emfinfo(m_meta); - ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader(); - - // Compute whether we are OK vertically or horizontally - int x2 = pmh->szlDevice.cx; - int y2 = pmh->szlDevice.cy; - int y1p = MulDiv(x1, y2, x2); - int x1p = MulDiv(y1, x2, y2); - ATLASSERT((x1p <= x1) || (y1p <= y1)); - if (x1p <= x1) - { - prc->left = rc.left + (x1 - x1p) / 2; - prc->right = prc->left + x1p; - prc->top = rc.top; - prc->bottom = rc.bottom; - } - else - { - prc->left = rc.left; - prc->right = rc.right; - prc->top = rc.top + (y1 - y1p) / 2; - prc->bottom = prc->top + y1p; - } - } - -// Painting helpers - void DoPaint(CDCHandle dc) - { - // this one is not used - } - - void DoPaint(CDCHandle dc, RECT& rc) - { - CEnhMetaFileInfo emfinfo(m_meta); - ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader(); - int nOffsetX = MulDiv(m_sizeCurPhysOffset.cx, rc.right-rc.left, pmh->szlDevice.cx); - int nOffsetY = MulDiv(m_sizeCurPhysOffset.cy, rc.bottom-rc.top, pmh->szlDevice.cy); - - dc.OffsetWindowOrg(-nOffsetX, -nOffsetY); - dc.PlayMetaFile(m_meta, &rc); - } - -// Implementation - data - int m_nCurPage; -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CPrintPreviewWindow - Implements a print preview window - -template -class ATL_NO_VTABLE CPrintPreviewWindowImpl : public ATL::CWindowImpl, public CPrintPreview -{ -public: - DECLARE_WND_CLASS_EX(NULL, CS_VREDRAW | CS_HREDRAW, -1) - - enum { m_cxOffset = 10, m_cyOffset = 10 }; - -// Constructor - CPrintPreviewWindowImpl() : m_nMaxPage(0), m_nMinPage(0) - { } - -// Operations - void SetPrintPreviewInfo(HANDLE hPrinter, DEVMODE* pDefaultDevMode, - IPrintJobInfo* pji, int nMinPage, int nMaxPage) - { - CPrintPreview::SetPrintPreviewInfo(hPrinter, pDefaultDevMode, pji); - m_nMinPage = nMinPage; - m_nMaxPage = nMaxPage; - } - - bool NextPage() - { - if (m_nCurPage == m_nMaxPage) - return false; - SetPage(m_nCurPage + 1); - Invalidate(); - return true; - } - - bool PrevPage() - { - if (m_nCurPage == m_nMinPage) - return false; - if (m_nCurPage == 0) - return false; - SetPage(m_nCurPage - 1); - Invalidate(); - return true; - } - -// Message map and handlers - BEGIN_MSG_MAP(CPrintPreviewWindowImpl) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) - MESSAGE_HANDLER(WM_PAINT, OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) - END_MSG_MAP() - - LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; // no need for the background - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - RECT rc = { 0 }; - - if(wParam != NULL) - { - pT->DoPrePaint((HDC)wParam, rc); - pT->DoPaint((HDC)wParam, rc); - } - else - { - CPaintDC dc(m_hWnd); - pT->DoPrePaint(dc.m_hDC, rc); - pT->DoPaint(dc.m_hDC, rc); - } - - return 0; - } - -// Painting helper - void DoPrePaint(CDCHandle dc, RECT& rc) - { - RECT rcClient = { 0 }; - GetClientRect(&rcClient); - RECT rcArea = rcClient; - T* pT = static_cast(this); - pT; // avoid level 4 warning - ::InflateRect(&rcArea, -pT->m_cxOffset, -pT->m_cyOffset); - if (rcArea.left > rcArea.right) - rcArea.right = rcArea.left; - if (rcArea.top > rcArea.bottom) - rcArea.bottom = rcArea.top; - GetPageRect(rcArea, &rc); - CRgn rgn1, rgn2; - rgn1.CreateRectRgnIndirect(&rc); - rgn2.CreateRectRgnIndirect(&rcClient); - rgn2.CombineRgn(rgn1, RGN_DIFF); - dc.SelectClipRgn(rgn2); - dc.FillRect(&rcClient, COLOR_BTNSHADOW); - dc.SelectClipRgn(NULL); - dc.FillRect(&rc, (HBRUSH)::GetStockObject(WHITE_BRUSH)); - } - -// Implementation - data - int m_nMinPage; - int m_nMaxPage; -}; - - -class CPrintPreviewWindow : public CPrintPreviewWindowImpl -{ -public: - DECLARE_WND_CLASS_EX(_T("WTL_PrintPreview"), CS_VREDRAW | CS_HREDRAW, -1) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CZoomPrintPreviewWindowImpl - Implements print preview window with zooming - -#ifdef __ATLSCRL_H__ - -template -class ATL_NO_VTABLE CZoomPrintPreviewWindowImpl : public CPrintPreviewWindowImpl< T, TBase, TWinTraits >, public CZoomScrollImpl< T > -{ -public: - bool m_bSized; - - CZoomPrintPreviewWindowImpl() - { - SetScrollExtendedStyle(SCRL_DISABLENOSCROLL); - InitZoom(); - } - - // should be called to reset data members before recreating window - void InitZoom() - { - m_bSized = false; - m_nZoomMode = ZOOMMODE_OFF; - m_fZoomScaleMin = 1.0; - m_fZoomScale = 1.0; - } - - BEGIN_MSG_MAP(CZoomPrintPreviewWindowImpl) - MESSAGE_HANDLER(WM_SETCURSOR, CZoomScrollImpl< T >::OnSetCursor) - MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) - MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) - MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) - MESSAGE_HANDLER(WM_LBUTTONDOWN, CZoomScrollImpl< T >::OnLButtonDown) - MESSAGE_HANDLER(WM_MOUSEMOVE, CZoomScrollImpl< T >::OnMouseMove) - MESSAGE_HANDLER(WM_LBUTTONUP, CZoomScrollImpl< T >::OnLButtonUp) - MESSAGE_HANDLER(WM_CAPTURECHANGED, CZoomScrollImpl< T >::OnCaptureChanged) - MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) - MESSAGE_HANDLER(WM_PAINT, OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) - COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) - COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) - COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) - COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) - COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) - END_MSG_MAP() - - LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - SIZE sizeClient = {GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)}; - POINT ptOffset = m_ptOffset; - SIZE sizeAll = m_sizeAll; - SetScrollSize(sizeClient); - if(sizeAll.cx > 0) - ptOffset.x = ::MulDiv(ptOffset.x, m_sizeAll.cx, sizeAll.cx); - if(sizeAll.cy > 0) - ptOffset.y = ::MulDiv(ptOffset.y, m_sizeAll.cy, sizeAll.cy); - SetScrollOffset(ptOffset); - CScrollImpl< T >::OnSize(uMsg, wParam, lParam, bHandled); - if(!m_bSized) - { - m_bSized = true; - T* pT = static_cast(this); - pT->ShowScrollBar(SB_HORZ, TRUE); - pT->ShowScrollBar(SB_VERT, TRUE); - } - return 0; - } - - LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - RECT rc = { 0 }; - - if(wParam != NULL) - { - CDCHandle dc = (HDC)wParam; - int nMapModeSav = dc.GetMapMode(); - dc.SetMapMode(MM_ANISOTROPIC); - SIZE szWindowExt = { 0, 0 }; - dc.SetWindowExt(m_sizeLogAll, &szWindowExt); - SIZE szViewportExt = { 0, 0 }; - dc.SetViewportExt(m_sizeAll, &szViewportExt); - POINT ptViewportOrg = { 0, 0 }; - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg); - - pT->DoPrePaint(dc, rc); - pT->DoPaint(dc, rc); - - dc.SetMapMode(nMapModeSav); - dc.SetWindowExt(szWindowExt); - dc.SetViewportExt(szViewportExt); - dc.SetViewportOrg(ptViewportOrg); - } - else - { - CPaintDC dc(pT->m_hWnd); - pT->PrepareDC(dc.m_hDC); - pT->DoPrePaint(dc.m_hDC, rc); - pT->DoPaint(dc.m_hDC, rc); - } - - return 0; - } - - // Painting helpers - void DoPaint(CDCHandle dc) - { - // this one is not used - } - - void DoPrePaint(CDCHandle dc, RECT& rc) - { - RECT rcClient; - GetClientRect(&rcClient); - RECT rcArea = rcClient; - T* pT = static_cast(this); - pT; // avoid level 4 warning - ::InflateRect(&rcArea, -pT->m_cxOffset, -pT->m_cyOffset); - if (rcArea.left > rcArea.right) - rcArea.right = rcArea.left; - if (rcArea.top > rcArea.bottom) - rcArea.bottom = rcArea.top; - GetPageRect(rcArea, &rc); - HBRUSH hbrOld = dc.SelectBrush(::GetSysColorBrush(COLOR_BTNSHADOW)); - dc.PatBlt(rcClient.left, rcClient.top, rc.left - rcClient.left, rcClient.bottom - rcClient.top, PATCOPY); - dc.PatBlt(rc.left, rcClient.top, rc.right - rc.left, rc.top - rcClient.top, PATCOPY); - dc.PatBlt(rc.right, rcClient.top, rcClient.right - rc.right, rcClient.bottom - rcClient.top, PATCOPY); - dc.PatBlt(rc.left, rc.bottom, rc.right - rc.left, rcClient.bottom - rc.bottom, PATCOPY); - dc.SelectBrush((HBRUSH)::GetStockObject(WHITE_BRUSH)); - dc.PatBlt(rc.left, rc.top, rc.right - rc.left, rc.bottom - rc.top, PATCOPY); - dc.SelectBrush(::GetSysColorBrush(COLOR_3DDKSHADOW)); - dc.PatBlt(rc.right, rc.top + 4, 4, rc.bottom - rc.top, PATCOPY); - dc.PatBlt(rc.left + 4, rc.bottom, rc.right - rc.left, 4, PATCOPY); - dc.SelectBrush(hbrOld); - } - - void DoPaint(CDCHandle dc, RECT& rc) - { - CEnhMetaFileInfo emfinfo(m_meta); - ENHMETAHEADER* pmh = emfinfo.GetEnhMetaFileHeader(); - int nOffsetX = MulDiv(m_sizeCurPhysOffset.cx, rc.right-rc.left, pmh->szlDevice.cx); - int nOffsetY = MulDiv(m_sizeCurPhysOffset.cy, rc.bottom-rc.top, pmh->szlDevice.cy); - - dc.OffsetWindowOrg(-nOffsetX, -nOffsetY); - dc.PlayMetaFile(m_meta, &rc); - } -}; - -class CZoomPrintPreviewWindow : public CZoomPrintPreviewWindowImpl -{ -public: - DECLARE_WND_CLASS_EX(_T("WTL_ZoomPrintPreview"), CS_VREDRAW | CS_HREDRAW, -1) -}; - -#endif // __ATLSCRL_H__ - -}; // namespace WTL - -#endif // __ATLPRINT_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlres.h b/plugins/SmartAutoReplier/wtl/atlres.h deleted file mode 100644 index 22fb3e6fdd..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlres.h +++ /dev/null @@ -1,263 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLRES_H__ -#define __ATLRES_H__ - -#pragma once - -#if defined(_WIN32_WCE) && !defined(__ATLRESCE_H__) - #error Use atlresCE.h instead of atlres.h for Windows CE -#endif - - -#ifdef RC_INVOKED -#ifndef _INC_WINDOWS - - #define _INC_WINDOWS - - #ifndef _WIN32_WCE - #define VS_VERSION_INFO 1 - - #ifdef APSTUDIO_INVOKED - #define APSTUDIO_HIDDEN_SYMBOLS // Ignore following symbols - #endif // APSTUDIO_INVOKED - - #ifndef WINVER - #define WINVER 0x0400 // default to Windows Version 4.0 - #endif // !WINVER - - #include - - // operation messages sent to DLGINIT - #define LB_ADDSTRING (WM_USER+1) - #define CB_ADDSTRING (WM_USER+3) - #endif // !_WIN32_WCE - - #ifdef APSTUDIO_INVOKED - #undef APSTUDIO_HIDDEN_SYMBOLS - #endif // APSTUDIO_INVOKED - - #ifdef IDC_STATIC - #undef IDC_STATIC - #endif // IDC_STATIC - #define IDC_STATIC (-1) - -#endif // !_INC_WINDOWS -#endif // RC_INVOKED - -#ifdef APSTUDIO_INVOKED - #define APSTUDIO_HIDDEN_SYMBOLS -#endif // APSTUDIO_INVOKED - -/////////////////////////////////////////////////////////////////////////////// -// ATL resource types - -#ifndef RC_INVOKED - #define RT_DLGINIT MAKEINTRESOURCE(240) - #define RT_TOOLBAR MAKEINTRESOURCE(241) -#endif // RC_INVOKED - -/////////////////////////////////////////////////////////////////////////////// - -#ifdef APSTUDIO_INVOKED - #undef APSTUDIO_HIDDEN_SYMBOLS -#endif // APSTUDIO_INVOKED - -/////////////////////////////////////////////////////////////////////////////// -// Standard window components - -#define ID_SEPARATOR 0 // special separator value -#define ID_DEFAULT_PANE 0 // default status bar pane - -#ifndef RC_INVOKED // code only -// standard control bars (IDW = window ID) - #define ATL_IDW_TOOLBAR 0xE800 // main Toolbar for window - #define ATL_IDW_STATUS_BAR 0xE801 // Status bar window - #define ATL_IDW_COMMAND_BAR 0xE802 // Command bar window - -// parts of a frame window - #define ATL_IDW_CLIENT 0xE900 - #define ATL_IDW_PANE_FIRST 0xE900 // first pane (256 max) - #define ATL_IDW_PANE_LAST 0xE9FF - #define ATL_IDW_HSCROLL_FIRST 0xEA00 // first Horz scrollbar (16 max) - #define ATL_IDW_VSCROLL_FIRST 0xEA10 // first Vert scrollbar (16 max) - - #define ATL_IDW_SIZE_BOX 0xEA20 // size box for splitters - #define ATL_IDW_PANE_SAVE 0xEA21 // to shift ATL_IDW_PANE_FIRST - -// bands for a rebar - #define ATL_IDW_BAND_FIRST 0xEB00 - #define ATL_IDW_BAND_LAST 0xEBFF -#endif // !RC_INVOKED - -/////////////////////////////////////////////////////////////////////////////// -// Standard Commands - -// File commands -#define ID_FILE_NEW 0xE100 -#define ID_FILE_OPEN 0xE101 -#define ID_FILE_CLOSE 0xE102 -#define ID_FILE_SAVE 0xE103 -#define ID_FILE_SAVE_AS 0xE104 -#define ID_FILE_PAGE_SETUP 0xE105 -#define ID_FILE_PRINT_SETUP 0xE106 -#define ID_FILE_PRINT 0xE107 -#define ID_FILE_PRINT_DIRECT 0xE108 -#define ID_FILE_PRINT_PREVIEW 0xE109 -#define ID_FILE_UPDATE 0xE10A -#define ID_FILE_SAVE_COPY_AS 0xE10B -#define ID_FILE_SEND_MAIL 0xE10C - -#define ID_FILE_MRU_FIRST 0xE110 -#define ID_FILE_MRU_FILE1 0xE110 // range - 16 max -#define ID_FILE_MRU_FILE2 0xE111 -#define ID_FILE_MRU_FILE3 0xE112 -#define ID_FILE_MRU_FILE4 0xE113 -#define ID_FILE_MRU_FILE5 0xE114 -#define ID_FILE_MRU_FILE6 0xE115 -#define ID_FILE_MRU_FILE7 0xE116 -#define ID_FILE_MRU_FILE8 0xE117 -#define ID_FILE_MRU_FILE9 0xE118 -#define ID_FILE_MRU_FILE10 0xE119 -#define ID_FILE_MRU_FILE11 0xE11A -#define ID_FILE_MRU_FILE12 0xE11B -#define ID_FILE_MRU_FILE13 0xE11C -#define ID_FILE_MRU_FILE14 0xE11D -#define ID_FILE_MRU_FILE15 0xE11E -#define ID_FILE_MRU_FILE16 0xE11F -#define ID_FILE_MRU_LAST 0xE11F - -// Edit commands -#define ID_EDIT_CLEAR 0xE120 -#define ID_EDIT_CLEAR_ALL 0xE121 -#define ID_EDIT_COPY 0xE122 -#define ID_EDIT_CUT 0xE123 -#define ID_EDIT_FIND 0xE124 -#define ID_EDIT_PASTE 0xE125 -#define ID_EDIT_PASTE_LINK 0xE126 -#define ID_EDIT_PASTE_SPECIAL 0xE127 -#define ID_EDIT_REPEAT 0xE128 -#define ID_EDIT_REPLACE 0xE129 -#define ID_EDIT_SELECT_ALL 0xE12A -#define ID_EDIT_UNDO 0xE12B -#define ID_EDIT_REDO 0xE12C - -// Window commands -#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 -#ifndef RC_INVOKED // code only - #define ATL_IDM_WINDOW_FIRST 0xE130 - #define ATL_IDM_WINDOW_LAST 0xE13F - #define ATL_IDM_FIRST_MDICHILD 0xFF00 // window list starts here - #define ATL_IDM_LAST_MDICHILD 0xFFFD -#endif // !RC_INVOKED -// TabView -#define ID_WINDOW_TABFIRST 0xFF00 // = ATL_IDM_FIRST_MDICHILD -#define ID_WINDOW_TABLAST 0xFFFD -#define ID_WINDOW_SHOWTABLIST 0xFFFE - -// Help and App commands -#define ID_APP_ABOUT 0xE140 -#define ID_APP_EXIT 0xE141 -#define ID_HELP_INDEX 0xE142 -#define ID_HELP_FINDER 0xE143 -#define ID_HELP_USING 0xE144 -#define ID_CONTEXT_HELP 0xE145 // shift-F1 -// special commands for processing help -#define ID_HELP 0xE146 // first attempt for F1 -#define ID_DEFAULT_HELP 0xE147 // last attempt - -// Misc -#define ID_NEXT_PANE 0xE150 -#define ID_PREV_PANE 0xE151 -#define ID_PANE_CLOSE 0xE152 - -// Format -#define ID_FORMAT_FONT 0xE160 - -// Scroll -#define ID_SCROLL_UP 0xE170 -#define ID_SCROLL_DOWN 0xE171 -#define ID_SCROLL_PAGE_UP 0xE172 -#define ID_SCROLL_PAGE_DOWN 0xE173 -#define ID_SCROLL_TOP 0xE174 -#define ID_SCROLL_BOTTOM 0xE175 -#define ID_SCROLL_LEFT 0xE176 -#define ID_SCROLL_RIGHT 0xE177 -#define ID_SCROLL_PAGE_LEFT 0xE178 -#define ID_SCROLL_PAGE_RIGHT 0xE179 -#define ID_SCROLL_ALL_LEFT 0xE17A -#define ID_SCROLL_ALL_RIGHT 0xE17B - -// OLE commands -#define ID_OLE_INSERT_NEW 0xE200 -#define ID_OLE_EDIT_LINKS 0xE201 -#define ID_OLE_EDIT_CONVERT 0xE202 -#define ID_OLE_EDIT_CHANGE_ICON 0xE203 -#define ID_OLE_EDIT_PROPERTIES 0xE204 -#define ID_OLE_VERB_FIRST 0xE210 // range - 16 max -#ifndef RC_INVOKED // code only - #define ID_OLE_VERB_LAST 0xE21F -#endif // !RC_INVOKED - -// View commands (same number used as IDW used for toolbar and status bar) -#define ID_VIEW_TOOLBAR 0xE800 -#define ID_VIEW_STATUS_BAR 0xE801 -#define ID_VIEW_REFRESH 0xE803 -#define ID_VIEW_RIBBON 0xE804 // Ribbon - -/////////////////////////////////////////////////////////////////////////////// -// Standard control IDs - -#ifdef IDC_STATIC - #undef IDC_STATIC -#endif // IDC_STATIC -#define IDC_STATIC (-1) // all static controls - -/////////////////////////////////////////////////////////////////////////////// -// Standard string error/warnings - -// idle status bar message -#define ATL_IDS_IDLEMESSAGE 0xE001 - -#ifndef RC_INVOKED // code only - #define ATL_IDS_SCFIRST 0xEF00 -#endif // !RC_INVOKED - -#define ATL_IDS_SCSIZE 0xEF00 -#define ATL_IDS_SCMOVE 0xEF01 -#define ATL_IDS_SCMINIMIZE 0xEF02 -#define ATL_IDS_SCMAXIMIZE 0xEF03 -#define ATL_IDS_SCNEXTWINDOW 0xEF04 -#define ATL_IDS_SCPREVWINDOW 0xEF05 -#define ATL_IDS_SCCLOSE 0xEF06 -#define ATL_IDS_SCRESTORE 0xEF12 -#define ATL_IDS_SCTASKLIST 0xEF13 - -#define ATL_IDS_MDICHILD 0xEF1F -#define ATL_IDS_MRU_FILE 0xEFDA - -/////////////////////////////////////////////////////////////////////////////// -// Misc. control IDs - -// Property Sheet control id's (determined with Spy++) -#define ID_APPLY_NOW 0x3021 -#define ID_WIZBACK 0x3023 -#define ID_WIZNEXT 0x3024 -#define ID_WIZFINISH 0x3025 -#define ATL_IDC_TAB_CONTROL 0x3020 - -#endif // __ATLRES_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlresce.h b/plugins/SmartAutoReplier/wtl/atlresce.h deleted file mode 100644 index 3b2b93388f..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlresce.h +++ /dev/null @@ -1,93 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLRESCE_H__ -#define __ATLRESCE_H__ - -#pragma once - -#ifndef _WIN32_WCE - #error atlresCE.h is only for Windows CE -#endif - - -#ifdef RC_INVOKED -#ifndef _INC_WINDOWS - - #define VS_VERSION_INFO 1 - - #ifdef APSTUDIO_INVOKED - #define APSTUDIO_HIDDEN_SYMBOLS // Ignore following symbols - #endif // APSTUDIO_INVOKED - - #ifndef WINVER - #define WINVER 0x0400 // default to Windows Version 4.0 - #endif // !WINVER - - #if !defined(WCEOLE_ENABLE_DIALOGEX) - #define DIALOGEX DIALOG DISCARDABLE - #endif - - #include - #define SHMENUBAR RCDATA - - #if defined(SHELLSDK_MODULES_AYGSHELL) - #include - #else - #define NOMENU 0xFFFF - #define IDS_SHNEW 1 - #define IDM_SHAREDNEW 10 - #define IDM_SHAREDNEWDEFAULT 11 - #endif - #ifndef I_IMAGENONE - #define I_IMAGENONE (-2) - #endif - - #include - -#endif // !_INC_WINDOWS -#endif // RC_INVOKED - -#include "atlres.h" - -#ifdef APSTUDIO_INVOKED - #undef APSTUDIO_HIDDEN_SYMBOLS -#endif // APSTUDIO_INVOKED - -// Visual Studio dialog editor bug fix -#ifndef DS_FIXEDSYS - #define DS_FIXEDSYS 0 -#endif - -#define IDC_INFOSTATIC 0xFFFE // == IDC_STATIC -1 - -/////////////////////////////////////////////////////////////////////////////// -// Smartphone and PPC 2005 Resource IDs - -// Command and associated string resource IDs -#define ID_MENU_OK 0xE790 -#define ID_MENU_CANCEL 0xE791 -#define ID_MENU 0xE792 -#define ID_ACTION 0xE793 -#define ID_VIEW_FULLSCREEN 0xE802 - -// MenuBar resource IDs -#define ATL_IDM_MENU_DONE 0xE701 -#define ATL_IDM_MENU_CANCEL 0xE702 -#define ATL_IDM_MENU_DONECANCEL 0xE703 - -// Default device MenuBar control ID and MenuBar resource ID -#define ATL_IDW_MENU_BAR 0xE802 - -// SmartPhone spinned controls ID offset for CSpinCtrl -#define ATL_IDW_SPIN_ID 9999 - -#endif // __ATLRESCE_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlribbon.h b/plugins/SmartAutoReplier/wtl/atlribbon.h deleted file mode 100644 index 2b21026441..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlribbon.h +++ /dev/null @@ -1,3446 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLRIBBON_H__ -#define __ATLRIBBON_H__ - -#pragma once - -#if (_MSC_VER < 1500) - #error atlribbon.h requires Visual C++ 2008 compiler or higher -#endif - -#ifndef _UNICODE - #error atlribbon.h requires the Unicode character set -#endif - -#if !defined(NTDDI_WIN7) || (NTDDI_VERSION < NTDDI_WIN7) - #error atlribbon.h requires the Windows 7 SDK or higher -#endif - -#ifdef _WIN32_WCE - #error atlribbon.h is not supported on Windows CE -#endif - -#ifndef __ATLAPP_H__ - #error atlribbon.h requires atlapp.h to be included first -#endif - -#if (_ATL_VER < 0x0700) - #include - #pragma comment(lib, "shlwapi.lib") -#endif - -#include // for RecentDocumentList classes -#include // for Frame and UpdateUI classes -#include // required for atlctrlw.h -#include // for CCommandBarCtrl - -#if !defined(_WTL_USE_CSTRING) && !defined(__ATLSTR_H__) - #pragma warning(disable : 4530) // unwind semantics not enabled - #include - #pragma warning(default : 4530) -#endif - -#include -#pragma comment(lib, "dwmapi.lib") - -#include -#include -#pragma comment(lib, "propsys.lib") - -#include // for CHARFORMAT2 - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CRibbonUpdateUI : Automatic mapping of ribbon UI elements -// -// RibbonUI::Text -// RibbonUI::CharFormat -// RibbonUI::ICtrl -// RibbonUI::CtrlImpl -// RibbonUI::CommandCtrlImpl -// RibbonUI::ItemProperty -// RibbonUI::CollectionImplBase -// RibbonUI::CollectionImpl -// RibbonUI::TextCollectionImpl -// RibbonUI::ItemCollectionImpl -// RibbonUI::ComboCollectionImpl -// RibbonUI::CommandCollectionImpl -// RibbonUI::ToolbarCollectionImpl -// RibbonUI::SimpleCollectionImpl -// RibbonUI::CollectionCtrlImpl -// RibbonUI::ToolbarGalleryCtrlImpl -// RibbonUI::SimpleCollectionCtrlImpl -// RibbonUI::RecentItemsCtrlImpl -// RibbonUI::FontCtrlImpl -// RibbonUI::ColorCtrlImpl -// RibbonUI::SpinnerCtrlImpl -// -// RibbonUI::CRibbonImpl -// CRibbonImpl::CRibbonComboCtrl -// CRibbonImpl::CRibbonItemGalleryCtrl -// CRibbonImpl::CRibbonCommandGalleryCtrl -// CRibbonImpl::CRibbonToolbarGalleryCtrl -// CRibbonImpl::CRibbonSimpleComboCtrl -// CRibbonImpl::CRibbonSimpleGalleryCtrl -// CRibbonImpl::CRibbonRecentItemsCtrl -// CRibbonImpl::CRibbonColorCtrl -// CRibbonImpl::CRibbonFontCtrl -// CRibbonImpl::CRibbonSpinnerCtrl -// CRibbonImpl::CRibbonFloatSpinnerCtrl -// CRibbonImpl::CRibbonCommandCtrl -// -// CRibbonFrameWindowImplBase -// CRibbonFrameWindowImpl -// CRibbonMDIFrameWindowImpl -// CRibbonPersist -// -// Global functions: -// RibbonUI::SetPropertyVal() -// RibbonUI::GetImage() - - -// Constants - -#ifndef RIBBONUI_MAX_TEXT - #define RIBBONUI_MAX_TEXT 128 -#endif - -#define TWIPS_PER_POINT 20 // For font size - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CRibbonUpdateUI : Automatic mapping of ribbon UI elements - -template -class CRibbonUpdateUI : public CAutoUpdateUI -{ -public: - enum - { - UPDUI_RIBBON = 0x0080, - UPDUI_PERSIST = 0x0020 - }; - - bool IsRibbonElement(const _AtlUpdateUIMap& UIMap) - { - return (UIMap.m_wType & UPDUI_RIBBON) != 0; - } - - bool IsRibbonID(UINT nID) - { - for(int i = 0; i < m_arrUIMap.GetSize(); i++) - { - if(m_arrUIMap[i].m_nID == nID) - return IsRibbonElement(m_arrUIMap[i]); - } - - return false; - } - -// Element - bool UIAddRibbonElement(UINT nID) - { - return UIAddElement(nID); - } - - bool UIRemoveRibbonElement(UINT nID) - { - return UIRemoveElement(nID); - } - - bool UIPersistElement(UINT nID, bool bPersist = true) - { - return bPersist ? - UIAddElement(nID) : - UIRemoveElement(nID); - } - -// methods for Ribbon elements - BOOL UISetText(int nID, LPCWSTR sText, BOOL bForceUpdate = FALSE) - { - T* pT = static_cast(this); - BOOL bRes = CUpdateUIBase::UISetText(nID, sText, bForceUpdate); - if (pT->IsRibbonUI() && IsRibbonID(nID)) - bRes = SUCCEEDED(pT->InvalidateProperty(nID, UI_PKEY_Label)); - return bRes; - } - - BOOL UISetText(int nID, UINT uIdResource, BOOL bForceUpdate = FALSE) - { - CTempBuffer sText(RIBBONUI_MAX_TEXT); - return AtlLoadString(uIdResource, sText, RIBBONUI_MAX_TEXT) ? - UISetText(nID, sText, bForceUpdate) : - E_FAIL; - } - - LPCTSTR UIGetText(int nID) - { - T* pT = static_cast(this); - LPCTSTR sUI = CAutoUpdateUI::UIGetText(nID); - - // replace 'tab' by 'space' for RibbonUI elements - if (sUI && pT->IsRibbonUI() && IsRibbonID(nID) && wcschr(sUI, L'\t')) - { - static WCHAR sText[RIBBONUI_MAX_TEXT] = { 0 }; - wcscpy_s(sText, sUI); - *wcschr(sText, L'\t') = L' '; - return sText; - } - else - { - return sUI; - } - } - - BOOL UIEnable(int nID, BOOL bEnable, BOOL bForceUpdate = FALSE) - { - T* pT = static_cast(this); - BOOL bRes = CUpdateUIBase::UIEnable(nID, bEnable, bForceUpdate); - if (pT->IsRibbonUI() && IsRibbonID(nID)) - bRes = SUCCEEDED(pT->SetProperty((WORD)nID, UI_PKEY_Enabled, bEnable)); - return bRes; - } - - BOOL UISetCheck(int nID, INT nCheck, BOOL bForceUpdate = FALSE) - { - if ((nCheck == 0) || (nCheck == 1)) - return UISetCheck(nID, nCheck != 0, bForceUpdate); - else - return CUpdateUIBase::UISetCheck(nID, nCheck, bForceUpdate); - } - - BOOL UISetCheck(int nID, bool bCheck, BOOL bForceUpdate = FALSE) - { - T* pT = static_cast(this); - BOOL bRes = CUpdateUIBase::UISetCheck(nID, bCheck, bForceUpdate); - if (bRes && pT->IsRibbonUI() && IsRibbonID(nID)) - bRes = SUCCEEDED(pT->SetProperty((WORD)nID, UI_PKEY_BooleanValue, bCheck)); - return bRes; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// RibbonUI namespace -// - -namespace RibbonUI -{ - -// Minimal string allocation support for various PROPERTYKEY values -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - typedef _CSTRING_NS::CString Text; -#else - class Text : public std::wstring - { - public: - Text(std::wstring& s) : std::wstring(s) - { } - Text(LPCWSTR s) : std::wstring(s) - { } - Text() - { } - bool IsEmpty() - { - return empty(); - } - operator LPCWSTR() - { - return c_str(); - } - Text& operator =(LPCWSTR s) - { - return static_cast(std::wstring::operator =(s)); - } - }; -#endif - -// PROPERTYKEY enum and helpers -enum k_KEY -{ - // state - k_Enabled = 1, k_BooleanValue = 200, - // text properties - k_LabelDescription = 2, k_Keytip = 3, k_Label = 4, k_TooltipDescription = 5, k_TooltipTitle = 6, - // image properties - k_LargeImage = 7, k_LargeHighContrastImage = 8, k_SmallImage = 9, k_SmallHighContrastImage = 10, - // collection properties - k_ItemsSource = 101, k_Categories = 102, k_SelectedItem = 104, - // collection item properties - k_CommandId = 100, k_CategoryId = 103, k_CommandType = 105, k_ItemImage = 106, - // combo control property - k_StringValue = 202, - // spinner control properties - k_DecimalValue = 201, k_MaxValue = 203, k_MinValue, k_Increment, k_DecimalPlaces, k_FormatString, k_RepresentativeString = 208, - // font control properties - k_FontProperties = 300, k_FontProperties_Family, k_FontProperties_Size, k_FontProperties_Bold, k_FontProperties_Italic = 304, - k_FontProperties_Underline = 305, k_FontProperties_Strikethrough, k_FontProperties_VerticalPositioning, k_FontProperties_ForegroundColor = 308, - k_FontProperties_BackgroundColor = 309, k_FontProperties_ForegroundColorType, k_FontProperties_BackgroundColorType, k_FontProperties_ChangedProperties = 312, - k_FontProperties_DeltaSize = 313, - // recent items properties - k_RecentItems = 350, k_Pinned = 351, - // color control properties - k_Color = 400, k_ColorType = 401, k_ColorMode, - k_ThemeColorsCategoryLabel = 403, k_StandardColorsCategoryLabel, k_RecentColorsCategoryLabel = 405, k_AutomaticColorLabel = 406, - k_NoColorLabel = 407, k_MoreColorsLabel = 408, - k_ThemeColors = 409, k_StandardColors = 410, k_ThemeColorsTooltips = 411, k_StandardColorsTooltips = 412, - // Ribbon state - k_Viewable = 1000, k_Minimized = 1001, k_QuickAccessToolbarDock = 1002, k_ContextAvailable = 1100, - // Ribbon UI colors - k_GlobalBackgroundColor = 2000, k_GlobalHighlightColor, k_GlobalTextColor = 2002 -}; - -inline k_KEY k_(REFPROPERTYKEY key) -{ - return (k_KEY)key.fmtid.Data1; -} - -// PROPERTYKEY value assignment and specializations -// -template -HRESULT SetPropertyVal(REFPROPERTYKEY key, V val, PROPVARIANT* ppv) -{ - switch (k_(key)) - { - case k_Enabled: - case k_BooleanValue: - return InitPropVariantFromBoolean(val, ppv); - default: - return UIInitPropertyFromUInt32(key, val, ppv); - } -} - -inline HRESULT SetPropertyVal(REFPROPERTYKEY key, DOUBLE val, PROPVARIANT* ppv) -{ - return SetPropertyVal(key, (LONG)val, ppv); -} - -inline HRESULT SetPropertyVal(REFPROPERTYKEY key, IUIImage* val, PROPVARIANT* ppv) -{ - HRESULT hr = UIInitPropertyFromImage(key, val, ppv); - ATLVERIFY(val->Release() == 1); - return hr; -} - -inline HRESULT SetPropertyVal(REFPROPERTYKEY key, IUnknown* val, PROPVARIANT* ppv) -{ - return UIInitPropertyFromInterface(key, val, ppv); -} - -inline HRESULT SetPropertyVal(REFPROPERTYKEY key, IPropertyStore* val, PROPVARIANT* ppv) -{ - return UIInitPropertyFromInterface(key, val, ppv); -} - -inline HRESULT SetPropertyVal(REFPROPERTYKEY key, SAFEARRAY* val, PROPVARIANT* ppv) -{ - return UIInitPropertyFromIUnknownArray(key, val, ppv); -} - -inline HRESULT SetPropertyVal(REFPROPERTYKEY key, DECIMAL* val, PROPVARIANT* ppv) -{ - return UIInitPropertyFromDecimal(key, *val, ppv); -} - -inline HRESULT SetPropertyVal(REFPROPERTYKEY key, bool val, PROPVARIANT* ppv) -{ - return UIInitPropertyFromBoolean(key, val, ppv); -} - -inline HRESULT SetPropertyVal(REFPROPERTYKEY key, LPCWSTR val, PROPVARIANT* ppv) -{ - return UIInitPropertyFromString(key, val, ppv); -} - -// CharFormat helper struct for RibbonUI font control -// -struct CharFormat : CHARFORMAT2 -{ - // Default constructor - CharFormat() - { - cbSize = sizeof CHARFORMAT2; - Reset(); - } - - // Copy constructor - CharFormat(const CharFormat& cf) - { - CopyMemory(this, &cf, sizeof CHARFORMAT2); - } - - // Assign operator - CharFormat& operator =(const CharFormat& cf) - { - CopyMemory(this, &cf, sizeof CHARFORMAT2); - return (*this); - } - - void Reset() - { - uValue = dwMask = dwEffects = 0; - PropVariantInit(&propvar); - } - - void operator <<(IPropertyStore* pStore) - { - if (pStore == NULL) - { - ATLASSERT(FALSE); - return; - } - - static void (CharFormat::*Getk_[])(IPropertyStore*) = - { - &CharFormat::Getk_Family, - &CharFormat::Getk_FontProperties_Size, - &CharFormat::Getk_MaskEffect, - &CharFormat::Getk_MaskEffect, - &CharFormat::Getk_MaskEffect, - &CharFormat::Getk_MaskEffect, - &CharFormat::Getk_VerticalPositioning, - &CharFormat::Getk_Color, - &CharFormat::Getk_Color, - &CharFormat::Getk_ColorType, - &CharFormat::Getk_ColorType, - }; - - DWORD nProps = 0; - Reset(); - - ATLVERIFY(SUCCEEDED(pStore->GetCount(&nProps))); - for (DWORD iProp = 0; iProp < nProps; iProp++) - { - PROPERTYKEY key; - ATLVERIFY(SUCCEEDED(pStore->GetAt(iProp, &key))); - ATLASSERT(k_(key) >= k_FontProperties_Family); - - if (k_(key) <= k_FontProperties_BackgroundColorType) - (this->*Getk_[k_(key) - k_FontProperties_Family])(pStore); - } - } - - void operator >>(IPropertyStore* pStore) - { - if (pStore == NULL) - { - ATLASSERT(FALSE); - return; - } - - PutFace(pStore); - PutSize(pStore); - PutMaskEffect(CFM_BOLD, CFE_BOLD, UI_PKEY_FontProperties_Bold, pStore); - PutMaskEffect(CFM_ITALIC, CFE_ITALIC, UI_PKEY_FontProperties_Italic, pStore); - PutMaskEffect(CFM_UNDERLINE, CFE_UNDERLINE, UI_PKEY_FontProperties_Underline, pStore); - PutMaskEffect(CFM_STRIKEOUT, CFE_STRIKEOUT, UI_PKEY_FontProperties_Strikethrough, pStore); - PutVerticalPos(pStore); - PutColor(pStore); - PutBackColor(pStore); - } - -private: - PROPVARIANT propvar; - UINT uValue; - - // Getk_ functions - void Getk_Family(IPropertyStore* pStore) - { - if (SUCCEEDED(pStore->GetValue(UI_PKEY_FontProperties_Family, &propvar))) - { - PropVariantToString(propvar, szFaceName, LF_FACESIZE); - if (*szFaceName) - dwMask |= CFM_FACE; - } - } - - void Getk_FontProperties_Size(IPropertyStore* pStore) - { - if (SUCCEEDED(pStore->GetValue(UI_PKEY_FontProperties_Size, &propvar))) - { - DECIMAL decSize; - UIPropertyToDecimal(UI_PKEY_FontProperties_Size, propvar, &decSize); - DOUBLE dSize; - VarR8FromDec(&decSize, &dSize); - if (dSize > 0) - { - dwMask |= CFM_SIZE; - yHeight = (LONG)(dSize * TWIPS_PER_POINT); - } - } - } - - template - void Getk_MaskEffect(IPropertyStore* pStore) - { - if (SUCCEEDED(pStore->GetValue(key, &propvar))) - { - UIPropertyToUInt32(key, propvar, &uValue); - if ((UI_FONTPROPERTIES)uValue != UI_FONTPROPERTIES_NOTAVAILABLE) - { - dwMask |= t_dwMask; - dwEffects |= ((UI_FONTPROPERTIES) uValue == UI_FONTPROPERTIES_SET) ? t_dwEffects : 0; - } - } - } - - void Getk_VerticalPositioning(IPropertyStore* pStore) - { - if (SUCCEEDED(pStore->GetValue(UI_PKEY_FontProperties_VerticalPositioning, &propvar))) - { - UIPropertyToUInt32(UI_PKEY_FontProperties_VerticalPositioning, propvar, &uValue); - UI_FONTVERTICALPOSITION uVerticalPosition = (UI_FONTVERTICALPOSITION) uValue; - if ((uVerticalPosition != UI_FONTVERTICALPOSITION_NOTAVAILABLE)) - { - dwMask |= (CFM_SUPERSCRIPT | CFM_SUBSCRIPT); - if (uVerticalPosition != UI_FONTVERTICALPOSITION_NOTSET) - { - dwEffects |= (uVerticalPosition == UI_FONTVERTICALPOSITION_SUPERSCRIPT) ? CFE_SUPERSCRIPT : CFE_SUBSCRIPT; - } - } - } - } - - template - void Getk_Color(IPropertyStore* pStore) - { - UINT32 color; - if (SUCCEEDED(pStore->GetValue(key, &propvar))) - { - UIPropertyToUInt32(key, propvar, &color); - dwMask |= t_dwMask; - - if (t_dwMask == CFM_COLOR) - crTextColor = color; - else - crBackColor = color; - } - } - - template - void Getk_ColorType(IPropertyStore* pStore) - { - if (SUCCEEDED(pStore->GetValue(key, &propvar))) - { - UIPropertyToUInt32(key, propvar, &uValue); - if (t_type == (UI_SWATCHCOLORTYPE)uValue) - { - dwMask |= t_dwMask; - dwEffects |= t_dwEffects; - } - } - } - - // Put functions - void PutMaskEffect(WORD dwMaskVal, WORD dwEffectVal, REFPROPERTYKEY key, IPropertyStore* pStore) - { - PROPVARIANT propvar; - UI_FONTPROPERTIES uProp = UI_FONTPROPERTIES_NOTAVAILABLE; - if ((dwMask & dwMaskVal) != 0) - uProp = dwEffects & dwEffectVal ? UI_FONTPROPERTIES_SET : UI_FONTPROPERTIES_NOTSET; - SetPropertyVal(key, uProp, &propvar); - pStore->SetValue(key, propvar); - } - - void PutVerticalPos(IPropertyStore* pStore) - { - PROPVARIANT propvar; - UI_FONTVERTICALPOSITION uProp = UI_FONTVERTICALPOSITION_NOTAVAILABLE; - - if ((dwMask & CFE_SUBSCRIPT) != 0) - { - if ((dwMask & CFM_SUBSCRIPT) && (dwEffects & CFE_SUBSCRIPT)) - uProp = UI_FONTVERTICALPOSITION_SUBSCRIPT; - else - uProp = UI_FONTVERTICALPOSITION_SUPERSCRIPT; - } - else if ((dwMask & CFM_OFFSET) != 0) - { - if (yOffset > 0) - uProp = UI_FONTVERTICALPOSITION_SUPERSCRIPT; - else if (yOffset < 0) - uProp = UI_FONTVERTICALPOSITION_SUBSCRIPT; - } - - SetPropertyVal(UI_PKEY_FontProperties_VerticalPositioning, uProp, &propvar); - pStore->SetValue(UI_PKEY_FontProperties_VerticalPositioning, propvar); - } - - void PutFace(IPropertyStore* pStore) - { - PROPVARIANT propvar; - SetPropertyVal(UI_PKEY_FontProperties_Family, - dwMask & CFM_FACE ? szFaceName : L"", &propvar); - pStore->SetValue(UI_PKEY_FontProperties_Family, propvar); - } - - void PutSize(IPropertyStore* pStore) - { - PROPVARIANT propvar; - DECIMAL decVal; - - if ((dwMask & CFM_SIZE) != 0) - VarDecFromR8((DOUBLE)yHeight / TWIPS_PER_POINT, &decVal); - else - VarDecFromI4(0, &decVal); - - SetPropertyVal(UI_PKEY_FontProperties_Size, &decVal, &propvar); - pStore->SetValue(UI_PKEY_FontProperties_Size, propvar); - } - - void PutColor(IPropertyStore* pStore) - { - if ((dwMask & CFM_COLOR) != 0) - if ((dwEffects & CFE_AUTOCOLOR) == 0) - { - SetPropertyVal(UI_PKEY_FontProperties_ForegroundColorType, UI_SWATCHCOLORTYPE_RGB, &propvar); - pStore->SetValue(UI_PKEY_FontProperties_ForegroundColorType, propvar); - - SetPropertyVal(UI_PKEY_FontProperties_ForegroundColor, crTextColor, &propvar); - pStore->SetValue(UI_PKEY_FontProperties_ForegroundColor, propvar); - } - else - { - SetPropertyVal(UI_PKEY_FontProperties_ForegroundColorType, UI_SWATCHCOLORTYPE_AUTOMATIC, &propvar); - pStore->SetValue(UI_PKEY_FontProperties_ForegroundColorType, propvar); - } - } - - void PutBackColor(IPropertyStore* pStore) - { - if (((dwMask & CFM_BACKCOLOR) != 0) && ((dwEffects & CFE_AUTOBACKCOLOR) == 0)) - { - SetPropertyVal(UI_PKEY_FontProperties_BackgroundColorType, UI_SWATCHCOLORTYPE_RGB, &propvar); - pStore->SetValue(UI_PKEY_FontProperties_BackgroundColorType, propvar); - - SetPropertyVal(UI_PKEY_FontProperties_BackgroundColor, crBackColor, &propvar); - pStore->SetValue(UI_PKEY_FontProperties_BackgroundColor, propvar); - } - else - { - SetPropertyVal(UI_PKEY_FontProperties_BackgroundColorType, UI_SWATCHCOLORTYPE_NOCOLOR, &propvar); - pStore->SetValue(UI_PKEY_FontProperties_BackgroundColorType, propvar); - } - } -}; - -// IUIImage helper -// -inline IUIImage* GetImage(HBITMAP hbm, UI_OWNERSHIP owner) -{ - ATLASSERT(hbm); - IUIImage* pIUII = NULL; - ATL::CComPtr pIFB; - - if SUCCEEDED(pIFB.CoCreateInstance(CLSID_UIRibbonImageFromBitmapFactory)) - ATLVERIFY(SUCCEEDED(pIFB->CreateImage(hbm, owner, &pIUII))); - - return pIUII; -} - - -/////////////////////////////////////////////////////////////////////////////// -// Ribbon control classes - -// RibbonUI::ICtrl abstract interface of RibbonUI::CRibbonImpl and all RibbonUI control classes -// -struct ICtrl -{ - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* pCommandExecutionProperties) = 0; - - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) = 0; -}; - -// RibbonUI::CtrlImpl base class for all ribbon controls -// -template -class ATL_NO_VTABLE CtrlImpl : public ICtrl -{ -protected: - T* m_pWndRibbon; - -public: - typedef T WndRibbon; - - CtrlImpl() : m_pWndRibbon(T::pWndRibbon) - { } - - WndRibbon& GetWndRibbon() - { - return *m_pWndRibbon; - } - - static WORD GetID() - { - return t_ID; - } - - Text m_sTxt[5]; - - // Operations - HRESULT Invalidate() - { - return GetWndRibbon().InvalidateCtrl(GetID()); - } - - HRESULT Invalidate(REFPROPERTYKEY key, UI_INVALIDATIONS flags = UI_INVALIDATIONS_PROPERTY) - { - return GetWndRibbon().InvalidateProperty(GetID(), key, flags); - } - - HRESULT SetText(REFPROPERTYKEY key, LPCWSTR sTxt, bool bUpdate = false) - { - ATLASSERT((k_(key) <= k_TooltipTitle) && (k_(key) >= k_LabelDescription)); - - m_sTxt[k_(key) - k_LabelDescription] = sTxt; - - return bUpdate ? - GetWndRibbon().InvalidateProperty(GetID(), key) : - S_OK; - } - - // Implementation - template - HRESULT SetProperty(REFPROPERTYKEY key, V val) - { - return GetWndRibbon().SetProperty(GetID(), key, val); - } - - HRESULT OnGetText(REFPROPERTYKEY key, PROPVARIANT* ppv) - { - ATLASSERT((k_(key) <= k_TooltipTitle) && (k_(key) >= k_LabelDescription)); - - const INT iText = k_(key) - k_LabelDescription; - if (m_sTxt[iText].IsEmpty()) - if (LPCWSTR sText = GetWndRibbon().OnRibbonQueryText(GetID(), key)) - m_sTxt[iText] = sText; - - return !m_sTxt[iText].IsEmpty() ? - SetPropertyVal(key, (LPCWSTR)m_sTxt[iText], ppv) : - S_OK; - } - - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* pCommandExecutionProperties) - { - ATLASSERT(nCmdID == t_ID); - return GetWndRibbon().DoExecute(nCmdID, verb, key, ppropvarValue, pCommandExecutionProperties); - } - - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - ATLASSERT(nCmdID == t_ID); - - const INT iMax = k_TooltipTitle - k_LabelDescription; - const INT iVal = k_(key) - k_LabelDescription; - - return (iVal <= iMax) && (iVal >= 0) ? - OnGetText(key, ppropvarNewValue) : - GetWndRibbon().DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - } -}; - -// CommandCtrlImpl base class for most ribbon controls -// -template -class CommandCtrlImpl : public CtrlImpl -{ -public: - CBitmap m_hbm[4]; - - HRESULT SetImage(REFPROPERTYKEY key, HBITMAP hbm, bool bUpdate = false) - { - ATLASSERT((k_(key) <= k_SmallHighContrastImage) && (k_(key) >= k_LargeImage)); - - m_hbm[k_(key) - k_LargeImage].Attach(hbm); - - return bUpdate ? - GetWndRibbon().InvalidateProperty(GetID(), key) : - S_OK; - } - - HRESULT OnGetImage(REFPROPERTYKEY key, PROPVARIANT* ppv) - { - ATLASSERT((k_(key) <= k_SmallHighContrastImage) && (k_(key) >= k_LargeImage)); - - const INT iImage = k_(key) - k_LargeImage; - - if (m_hbm[iImage].IsNull()) - m_hbm[iImage] = GetWndRibbon().OnRibbonQueryImage(GetID(), key); - - return m_hbm[iImage].IsNull() ? - E_NOTIMPL : - SetPropertyVal(key, GetImage(m_hbm[iImage], UI_OWNERSHIP_COPY), ppv); - } - - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - ATLASSERT (nCmdID == GetID()); - - return (k_(key) <= k_SmallHighContrastImage) && (k_(key) >= k_LargeImage) ? - OnGetImage(key, ppropvarNewValue) : - CtrlImpl::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Ribbon collection base classes - -// ItemProperty class: ribbon callback for each item in a collection -// -template -class ItemProperty : public IUISimplePropertySet -{ -public: - ItemProperty(UINT i, TCollection* pCollection) : m_Index(i), m_pCollection(pCollection) - { } - - const UINT m_Index; - TCollection* m_pCollection; - - // IUISimplePropertySet method. - STDMETHODIMP GetValue(REFPROPERTYKEY key, PROPVARIANT *value) - { - return m_pCollection->OnGetItem(m_Index, key, value); - } - - // IUnknown methods. - STDMETHODIMP_(ULONG) AddRef() - { - return 1; - } - - STDMETHODIMP_(ULONG) Release() - { - return 1; - } - - STDMETHODIMP QueryInterface(REFIID iid, void** ppv) - { - if ((iid == __uuidof(IUnknown)) || (iid == __uuidof(IUISimplePropertySet))) - { - *ppv = this; - return S_OK; - } - else - { - return E_NOINTERFACE; - } - } -}; - - -// CollectionImplBase: base class for all RibbonUI collections -// -template -class CollectionImplBase -{ - typedef CollectionImplBase thisClass; - -public: - CollectionImplBase() - { - for (int i = 0; i < t_size; i++) - m_apItems[i] = new ItemProperty(i, static_cast(this)); - } - - ~CollectionImplBase() - { - for (int i = 0; i < t_size; i++) - delete m_apItems[i]; - } - -// Data members - ItemProperty* m_apItems[t_size]; -}; - -// CollectionImpl: handles categories and collecton resizing -// -template -class CollectionImpl : public CollectionImplBase, t_items + t_categories> -{ - typedef CollectionImpl thisClass; -public: - typedef thisClass Collection; - - CollectionImpl() : m_size(t_items) - { - FillMemory(m_auItemCat, sizeof m_auItemCat, 0xff); // UI_COLLECTION_INVALIDINDEX - } - - UINT32 m_auItemCat[t_items]; - Text m_asCatName[max(t_categories, 1)]; - size_t m_size; - -// Operations - HRESULT SetItemCategory(UINT uItem, UINT uCat, bool bUpdate = false) - { - ATLASSERT((uItem < t_items) && (uCat < t_categories)); - - m_auItemCat[uItem] = uCat; - - return bUpdate ? InvalidateItems() : S_OK; - } - - HRESULT SetCategoryText(UINT uCat, LPCWSTR sText, bool bUpdate = false) - { - ATLASSERT(uCat < t_categories); - - m_asCatName[uCat] = sText; - - return bUpdate ? InvalidateCategories() : S_OK; - } - - HRESULT Resize(size_t size, bool bUpdate = false) - { - ATLASSERT(size <= t_items); - - m_size = size; - - return bUpdate ? InvalidateItems() : S_OK; - } - -// Implementation - HRESULT OnGetItem(UINT uIndex, REFPROPERTYKEY key, PROPVARIANT *value) - { - ATLASSERT(uIndex < t_items + t_categories); - TCtrl* pCtrl = static_cast(this); - - return uIndex < t_items ? - pCtrl->DoGetItem(uIndex, key, value) : - pCtrl->DoGetCategory(uIndex - t_items, key, value); - } - - HRESULT DoGetItem(UINT uItem, REFPROPERTYKEY key, PROPVARIANT *value) - { - ATLASSERT(k_(key) == k_CategoryId); - UINT32 uCat = UI_COLLECTION_INVALIDINDEX; - - if (t_categories != 0) - { - if (m_auItemCat[uItem] == UI_COLLECTION_INVALIDINDEX) - { - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - m_auItemCat[uItem] = ribbon.OnRibbonQueryItemCategory(TCtrl::GetID(), uItem); - } - uCat = m_auItemCat[uItem]; - } - - return SetPropertyVal(key, uCat, value); - } - - HRESULT DoGetCategory(UINT uCat, REFPROPERTYKEY key, PROPVARIANT *value) - { - HRESULT hr = S_OK; - - switch (k_(key)) - { - case k_Label: - if (m_asCatName[uCat].IsEmpty()) - { - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - m_asCatName[uCat] = ribbon.OnRibbonQueryCategoryText(TCtrl::GetID(), uCat); - } - hr = SetPropertyVal(key, (LPCWSTR)m_asCatName[uCat], value); - break; - case k_CategoryId: - hr = SetPropertyVal(key, uCat, value); - break; - default: - ATLASSERT(FALSE); - break; - } - - return hr; - } - - HRESULT InvalidateItems() - { - return static_cast(this)->Invalidate(UI_PKEY_ItemsSource); - } - - HRESULT InvalidateCategories() - { - return static_cast(this)->Invalidate(UI_PKEY_Categories); - } - - HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* /*ppropvarNewValue*/) - { - ATLASSERT(nCmdID == TCtrl::GetID()); - nCmdID; // avoid level 4 warning - - HRESULT hr = E_NOTIMPL; - switch (k_(key)) - { - case k_ItemsSource: - { - ATL::CComQIPtr pIUICollection(ppropvarCurrentValue->punkVal); - ATLASSERT(pIUICollection); - hr = pIUICollection->Clear(); - for (UINT i = 0; i < m_size; i++) - { - if FAILED(hr = pIUICollection->Add(m_apItems[i])) - break; - } - ATLASSERT(SUCCEEDED(hr)); - } - break; - case k_Categories: - if (t_categories != 0) - { - ATL::CComQIPtr pIUICategory(ppropvarCurrentValue->punkVal); - ATLASSERT(pIUICategory.p); - hr = pIUICategory->Clear(); - for (UINT i = t_items; i < t_items + t_categories; i++) - { - if FAILED(hr = pIUICategory->Add(m_apItems[i])) - break; - } - ATLASSERT(SUCCEEDED(hr)); - } - break; - } - - return hr; - } -}; - -// TextCollectionImpl: handles item labels and selection -// -template -class TextCollectionImpl : public CollectionImpl -{ - typedef TextCollectionImpl thisClass; -public: - typedef thisClass TextCollection; - - TextCollectionImpl() : m_uSelected(UI_COLLECTION_INVALIDINDEX) - { } - - Text m_asText[t_items]; - UINT m_uSelected; - - // Operations - HRESULT SetItemText(UINT uItem, LPCWSTR sText, bool bUpdate = false) - { - ATLASSERT(uItem < t_items); - - m_asText[uItem] = sText; - - return bUpdate ? InvalidateItems() : S_OK; - } - - UINT GetSelected() - { - return m_uSelected; - } - - HRESULT Select(UINT uItem, bool bUpdate = false) - { - ATLASSERT((uItem < t_items) || (uItem == UI_COLLECTION_INVALIDINDEX)); - - m_uSelected = uItem; - - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - return bUpdate ? - ribbon.SetProperty(TCtrl::GetID(), UI_PKEY_SelectedItem, uItem) : - S_OK; - } - -// Implementation - HRESULT DoGetItem(UINT uItem, REFPROPERTYKEY key, PROPVARIANT *value) - { - ATLASSERT(uItem < t_items); - - if (k_(key) == k_Label) - { - if (m_asText[uItem].IsEmpty()) - { - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - m_asText[uItem] = ribbon.OnRibbonQueryItemText(TCtrl::GetID(), uItem); - } - return SetPropertyVal(key, (LPCWSTR)m_asText[uItem], value); - } - else - { - return Collection::DoGetItem(uItem, key, value); - } - } - - HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - ATLASSERT(nCmdID == TCtrl::GetID()); - - if (k_(key) == k_SelectedItem) - { - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - UINT uSel = UI_COLLECTION_INVALIDINDEX; - if ((m_uSelected == UI_COLLECTION_INVALIDINDEX) && - ribbon.OnRibbonQuerySelectedItem(TCtrl::GetID(), uSel)) - m_uSelected = uSel; - - return SetPropertyVal(key, m_uSelected, ppropvarNewValue); - } - else - { - return Collection::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - } - } -}; - -// ItemCollectionImpl: handles item image -// -template -class ItemCollectionImpl : public TextCollectionImpl -{ - typedef ItemCollectionImpl thisClass; -public: - typedef thisClass ItemCollection; - - ItemCollectionImpl() - { - ZeroMemory(m_aBitmap, sizeof m_aBitmap); - } - - CBitmap m_aBitmap[t_items]; - - // Operations - HRESULT SetItemImage(UINT uIndex, HBITMAP hbm, bool bUpdate = false) - { - ATLASSERT(uIndex < t_items); - - m_aBitmap[uIndex] = hbm; - - return bUpdate ? InvalidateItems() : S_OK; - } - -// Implementation - HRESULT DoGetItem(UINT uItem, REFPROPERTYKEY key, PROPVARIANT *value) - { - ATLASSERT(uItem < t_items); - - if (k_(key) == k_ItemImage) - { - if (m_aBitmap[uItem].IsNull()) - { - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - m_aBitmap[uItem] = ribbon.OnRibbonQueryItemImage(TCtrl::GetID(), uItem); - } - return m_aBitmap[uItem].IsNull() ? - E_NOTIMPL : - SetPropertyVal(key, GetImage(m_aBitmap[uItem], UI_OWNERSHIP_COPY), value); - } - else - { - return TextCollection::DoGetItem(uItem, key, value); - } - } -}; - -// ComboCollectionImpl: handles combo text -// -template -class ComboCollectionImpl : public ItemCollectionImpl -{ - typedef ComboCollectionImpl thisClass; -public: - typedef thisClass ComboCollection; - - // Operations - HRESULT SetComboText(LPCWSTR sText) - { - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - return ribbon.IsRibbonUI() ? - ribbon.SetProperty(TCtrl::GetID(), UI_PKEY_StringValue, sText) : - S_OK; - } - - LPCWSTR GetComboText() - { - static WCHAR sCombo[RIBBONUI_MAX_TEXT] = { 0 }; - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - PROPVARIANT var; - if (ribbon.IsRibbonUI()) - { - HRESULT hr = ribbon.GetIUIFrameworkPtr()->GetUICommandProperty(TCtrl::GetID(), UI_PKEY_StringValue, &var); - hr = PropVariantToString(var, sCombo, RIBBONUI_MAX_TEXT); - return sCombo; - } - return NULL; - } -}; - -// CommandCollectionImpl: handles RibbonUI command collection controls -// -template -class CommandCollectionImpl : public CollectionImpl -{ - typedef CommandCollectionImpl thisClass; -public: - typedef thisClass CommandCollection; - - CommandCollectionImpl() - { - ZeroMemory(m_auCmd, sizeof m_auCmd); - ZeroMemory(m_aCmdType, sizeof m_aCmdType); - } - - UINT32 m_auCmd[t_items]; - BYTE m_aCmdType[t_items]; - - // Operations - HRESULT SetItemCommand(UINT uItem, UINT32 uCommandID, bool bUpdate = false) - { - ATLASSERT(uItem < t_items); - - if (uCommandID == m_auCmd[uItem]) - return S_OK; - - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - - m_auCmd[uItem] = uCommandID; - if (uCommandID != 0) - ribbon.UIAddRibbonElement(uCommandID); - - return bUpdate ? InvalidateItems() : S_OK; - } - - HRESULT SetItemCommandType(UINT uItem, UI_COMMANDTYPE type, bool bUpdate = false) - { - ATLASSERT(uItem < t_items); - - m_aCmdType[uItem] = (BYTE)type; - - return bUpdate ? InvalidateItems() : S_OK; - } - -// Implementation - HRESULT DoGetItem(UINT uItem, REFPROPERTYKEY key, PROPVARIANT *value) - { - ATLASSERT(uItem < t_items); - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - - HRESULT hr = E_FAIL; - switch (k_(key)) - { - case k_CommandId: - if (m_auCmd[uItem] == 0) - SetItemCommand(uItem, ribbon.OnRibbonQueryItemCommand(TCtrl::GetID(), uItem)); - hr = SetPropertyVal(key, m_auCmd[uItem], value); - break; - case k_CommandType: - if (m_aCmdType[uItem] == UI_COMMANDTYPE_UNKNOWN) - SetItemCommandType(uItem, ribbon.OnRibbonQueryItemCommandType(TCtrl::GetID(), uItem)); - hr = SetPropertyVal(key, UINT32(m_aCmdType[uItem]), value); - break; - case k_CategoryId: - default: - hr = Collection::DoGetItem(uItem, key, value); - break; - } - - return hr; - } - - HRESULT Select(UINT /*uItem*/, bool /*bUpdate*/ = false) - { - ATLASSERT(FALSE); - return S_OK; - } -}; - -// SimpleCollectionImpl: collection class for ribbon simple collection controls -// -template -class SimpleCollectionImpl : public CollectionImplBase, t_size> -{ - typedef SimpleCollectionImpl thisClass; -public: - typedef CollectionImplBase CollectionBase; - typedef thisClass SimpleCollection; - -// Implementation - HRESULT OnGetItem(UINT uItem, REFPROPERTYKEY key, PROPVARIANT *value) - { - ATLASSERT(uItem < t_size); - TCtrl::WndRibbon& ribbon = static_cast(this)->GetWndRibbon(); - - HRESULT hr = E_NOTIMPL; - switch (k_(key)) - { - case k_ItemImage: - if (HBITMAP hbm = ribbon.DefRibbonQueryItemImage(TCtrl::GetID(), uItem)) - hr = SetPropertyVal(key, GetImage(hbm, UI_OWNERSHIP_TRANSFER), value); - break; - case k_Label: - if (LPCWSTR sText = ribbon.DefRibbonQueryItemText(TCtrl::GetID(), uItem)) - hr = SetPropertyVal(key, (LPCWSTR)sText, value); - break; - case k_CommandType: - hr = SetPropertyVal(key, t_CommandType, value); - break; - case k_CommandId: - hr = SetPropertyVal(key, ribbon.DefRibbonQueryItemCommand(TCtrl::GetID(), uItem), value); - break; - case k_CategoryId: - hr = SetPropertyVal(key, UI_COLLECTION_INVALIDINDEX, value); - break; - default: - ATLASSERT(FALSE); - break; - } - - return hr; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Ribbon collection control classes - -// CollectionCtrlImpl: specializable class for ribbon collection controls -// -template -class CollectionCtrlImpl : public CommandCtrlImpl, public TCollection -{ - typedef CollectionCtrlImpl thisClass; -public: - typedef CommandCtrlImpl CommandCtrl; - typedef TCollection Collection; - - // Implementation - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - ATLASSERT(nCmdID == GetID()); - ATLASSERT(ppropvarNewValue); - - HRESULT hr = Collection::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - if FAILED(hr) - hr = CommandCtrl::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - - return hr; - } - - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* /*pCommandExecutionProperties*/) - { - ATLASSERT (nCmdID == GetID()); - nCmdID; // avoid level4 warning - - if (key == NULL) // gallery button pressed - { - GetWndRibbon().OnRibbonItemSelected(GetID(), UI_EXECUTIONVERB_EXECUTE, UI_COLLECTION_INVALIDINDEX); - return S_OK; - } - - ATLASSERT(k_(*key) == k_SelectedItem); - ATLASSERT(ppropvarValue); - - HRESULT hr = S_OK; - UINT32 uSel = 0xffff; - hr = UIPropertyToUInt32(*key, *ppropvarValue, &uSel); - - if (SUCCEEDED(hr)) - { - if (GetWndRibbon().OnRibbonItemSelected(GetID(), verb, uSel)) - TCollection::Select(uSel); - } - - return hr; - } -}; - -// ToolbarGalleryCtrlImpl: base class for ribbon toolbar gallery controls -// -template -class ToolbarGalleryCtrlImpl : public CollectionCtrlImpl, t_size>> -{ -public: - ToolbarGalleryCtrlImpl() - { - CResource tbres; - ATLVERIFY(tbres.Load(RT_TOOLBAR, t_idTB)); - _AtlToolBarData* pData = (_AtlToolBarData*)tbres.Lock(); - ATLASSERT(pData); - ATLASSERT(pData->wVersion == 1); - - WORD* pItems = pData->items(); - INT j = 0; - for (int i = 0; (i < pData->wItemCount) && (j < t_size); i++) - { - if (pItems[i] != 0) - { - m_aCmdType[j] = UI_COMMANDTYPE_ACTION; - m_auCmd[j++] = pItems[i]; - } - } - - if (j < t_size) - Resize(j); - } - - HRESULT DoGetItem(UINT uItem, REFPROPERTYKEY key, PROPVARIANT *value) - { - ATLASSERT(uItem < m_size); - ATLASSERT(m_auCmd[uItem]); - - HRESULT hr = E_FAIL; - switch (k_(key)) - { - case k_CommandId: - hr = SetPropertyVal(key, m_auCmd[uItem], value); - break; - case k_CommandType: - hr = SetPropertyVal(key, UINT32(m_aCmdType[uItem]), value); - break; - case k_CategoryId: - hr = SetPropertyVal(key, UI_COLLECTION_INVALIDINDEX, value); - break; - default: - ATLASSERT(FALSE); - break; - } - - return hr; - } -}; - - -// SimpleCollectionCtrlImpl: base class for simple gallery and listbox controls -// -template -class SimpleCollectionCtrlImpl : - public CommandCtrlImpl, - public SimpleCollectionImpl, t_size, t_CommandType> -{ - typedef SimpleCollectionCtrlImpl thisClass; -public: - typedef thisClass SimpleCollection; - - SimpleCollectionCtrlImpl() : m_uSelected(0) - { } - - UINT m_uSelected; - - HRESULT Select(UINT uItem, bool bUpdate = false) - { - ATLASSERT((uItem < t_size) || (uItem == UI_COLLECTION_INVALIDINDEX)); - - m_uSelected = uItem; - - return bUpdate ? - GetWndRibbon().SetProperty(GetID(), UI_PKEY_SelectedItem, uItem) : - S_OK; - } - - // Implementation - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - ATLASSERT(nCmdID == GetID()); - ATLASSERT(ppropvarNewValue != NULL); - - HRESULT hr = S_OK; - switch (k_(key)) - { - case k_ItemsSource: - { - ATL::CComQIPtr pIUICollection(ppropvarCurrentValue->punkVal); - ATLASSERT(pIUICollection.p); - hr = pIUICollection->Clear(); - for (UINT i = 0; i < t_size; i++) - { - if FAILED(hr = pIUICollection->Add(m_apItems[i])) - break; - } - ATLASSERT(SUCCEEDED(hr)); - } - break; - case k_SelectedItem: - hr = SetPropertyVal(UI_PKEY_SelectedItem, m_uSelected, ppropvarNewValue); - break; - default: - hr = CommandCtrlImpl::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - break; - } - - return hr; - } - - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* /*pCommandExecutionProperties*/) - { - ATLASSERT (nCmdID == GetID()); - nCmdID; // avoid level 4 warning - - HRESULT hr = S_OK; - if (key == NULL) // gallery button pressed - { - GetWndRibbon().OnRibbonItemSelected(GetID(), UI_EXECUTIONVERB_EXECUTE, UI_COLLECTION_INVALIDINDEX); - return hr; - } - ATLASSERT(k_(*key) == k_SelectedItem); - ATLASSERT(ppropvarValue); - - if SUCCEEDED(hr = UIPropertyToUInt32(*key, *ppropvarValue, &m_uSelected)) - GetWndRibbon().OnRibbonItemSelected(GetID(), verb, m_uSelected); - - return hr; - } -}; - -// RecentItemsCtrlImpl -// -template -class RecentItemsCtrlImpl : - public CtrlImpl, - public CollectionImplBase, TDocList::m_nMaxEntries_Max>, - public TDocList -{ - typedef RecentItemsCtrlImpl thisClass; -public: - typedef thisClass RecentItems; - - // Implementation - HRESULT OnGetItem(UINT uItem, REFPROPERTYKEY key, PROPVARIANT *value) - { - ATLASSERT((INT)uItem < GetMaxEntries()); - - LPCWSTR sPath = m_arrDocs[uItem].szDocName; - HRESULT hr = E_NOTIMPL; - switch (k_(key)) - { - case k_Label: - hr = SetPropertyVal(key, GetWndRibbon().OnRibbonQueryRecentItemName(sPath), value); - break; - case k_LabelDescription: - hr = SetPropertyVal(key, sPath, value); - break; - default: - ATLASSERT(FALSE); - break; - } - - return hr; - } - - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - ATLASSERT(nCmdID == GetID()); - ATLASSERT(ppropvarNewValue); - - HRESULT hr = S_OK; - switch (k_(key)) - { - case k_RecentItems: - if (SAFEARRAY* psa = SafeArrayCreateVector(VT_UNKNOWN, 0, m_arrDocs.GetSize())) - { - const int iLastIndex = m_arrDocs.GetSize() - 1; - for (LONG i = 0; i <= iLastIndex; i++) - SafeArrayPutElement(psa, &i, m_apItems[iLastIndex - i]); // reverse order - - hr = SetPropertyVal(key, psa, ppropvarNewValue); - SafeArrayDestroy(psa); - } - break; - default: - hr = CtrlImpl::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - break; - } - - return hr; - } - - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* /*pCommandExecutionProperties*/) - { - ATLASSERT(nCmdID == GetID()); - nCmdID; // avoid level 4 warning - ATLASSERT(verb == UI_EXECUTIONVERB_EXECUTE); - verb; // avoid level 4 warning - ATLASSERT((key) && (k_(*key) == k_SelectedItem)); - ATLASSERT(ppropvarValue); - - UINT32 uSel = 0xffff; - HRESULT hr = UIPropertyToUInt32(*key, *ppropvarValue, &uSel); - if SUCCEEDED(hr) - { - ATLASSERT(uSel < (UINT)GetMaxEntries()); - GetWndRibbon().DefCommandExecute(ID_FILE_MRU_FIRST + uSel); - } - - return hr; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Ribbon stand-alone control classes - -// FontCtrlImpl -// -template -class FontCtrlImpl : public CtrlImpl -{ -public: - - CharFormat m_cf; - -// Implementation - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* pCommandExecutionProperties) - { - ATLASSERT (nCmdID == GetID()); - nCmdID; // avoid level 4 warning - ATLASSERT ((key) && (k_(*key) == k_FontProperties)); - key; // avoid level 4 warning - - HRESULT hr = E_INVALIDARG; - switch (verb) - { - case UI_EXECUTIONVERB_PREVIEW: - case UI_EXECUTIONVERB_EXECUTE: - ATLASSERT(pCommandExecutionProperties); - PROPVARIANT propvar; - - if (SUCCEEDED(hr = pCommandExecutionProperties->GetValue(UI_PKEY_FontProperties_ChangedProperties, &propvar))) - m_cf << ATL::CComQIPtr(propvar.punkVal); - break; - - case UI_EXECUTIONVERB_CANCELPREVIEW: - ATLASSERT(ppropvarValue); - ATL::CComPtr pStore; - - if (SUCCEEDED(hr = UIPropertyToInterface(UI_PKEY_FontProperties, *ppropvarValue, &pStore))) - m_cf << pStore; - break; - } - - if (SUCCEEDED(hr)) - GetWndRibbon().OnRibbonFontCtrlExecute(GetID(), verb, &m_cf); - else - ATLASSERT(FALSE); - - return hr; - } - - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - if ((k_(key) == k_FontProperties) && (GetWndRibbon().OnRibbonQueryFont(t_ID, m_cf))) - { - ATL::CComQIPtr pStore(ppropvarCurrentValue->punkVal); - m_cf >> pStore; - return SetPropertyVal(key, pStore.p, ppropvarNewValue); - } - else - { - return CtrlImpl::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - } - } -}; - -// ColorCtrlImpl -// -template -class ColorCtrlImpl : public CommandCtrlImpl -{ -public: - ColorCtrlImpl() : m_colorType(UI_SWATCHCOLORTYPE_NOCOLOR), m_color(0x800080) /*MAGENTA*/ - { } - - COLORREF m_color; - UINT32 m_colorType; // value in UI_SWATCHCOLORTYPE - Text m_sLabels[6]; // k_MoreColorsLabel to k_ThemeColorsCategoryLabel - ATL::CSimpleArray m_aColors[2]; - ATL::CSimpleArray m_aTooltips[2]; - - // Operations - HRESULT SetColor(COLORREF color, bool bUpdate = false) - { - if (m_colorType != UI_SWATCHCOLORTYPE_RGB) - SetColorType(UI_SWATCHCOLORTYPE_RGB, bUpdate); - m_color = color; - return bUpdate ? SetProperty(UI_PKEY_Color, color) : S_OK; - } - - HRESULT SetColorType(UI_SWATCHCOLORTYPE type, bool bUpdate = false) - { - m_colorType = type; - return bUpdate ? SetProperty(UI_PKEY_ColorType, type) : S_OK; - } - - HRESULT SetColorLabel(REFPROPERTYKEY key, LPCWSTR sLabel, bool bUpdate = false) - { - ATLASSERT((k_(key) >= k_ThemeColorsCategoryLabel) && (k_(key) <= k_MoreColorsLabel)); - m_sLabels[k_(key) - k_ThemeColorsCategoryLabel] = sLabel; - return bUpdate ? SetProperty(key, sLabel) : S_OK; - } - - HRESULT SetColorArray(REFPROPERTYKEY key, COLORREF* pColor, bool bUpdate = false) - { - ATLASSERT((k_(key) == k_ThemeColors) || (k_(key) == k_StandardColors)); - - const INT ic = k_(key) - k_ThemeColors; - m_aColors[ic].RemoveAll(); - while (*pColor != 0x800080) /*MAGENTA*/ - m_aColors[ic].Add(*pColor++); - - if (bUpdate) - { - PROPVARIANT var; - if SUCCEEDED(InitPropVariantFromUInt32Vector(m_aColors[ic].GetData(), m_aColors[ic].GetSize(), &var)) - return SetProperty(key, var); - else - return E_INVALIDARG; - } - else - { - return S_OK; - } - } - - HRESULT SetColorTooltips(REFPROPERTYKEY key, LPCWSTR* ppsTT, bool bUpdate = false) - { - ATLASSERT((k_(key) == k_ThemeColorsTooltips) || (k_(key) == k_StandardColorsTooltips)); - - const INT ic = k_(key) - k_ThemeColorsTooltips; - m_aTooltips[ic].RemoveAll(); - while (*ppsTT) - m_aTooltips[ic].Add(*ppsTT++); - - if (bUpdate) - { - PROPVARIANT var; - if SUCCEEDED(InitPropVariantFromStringVector(m_aTooltips[ic].GetData(), m_aTooltips[ic].GetSize(), &var)) - return SetProperty(key, var); - else - return E_INVALIDARG; - } - else - { - return S_OK; - } - } - - // Implementation - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* pCommandExecutionProperties) - { - ATLASSERT (nCmdID == GetID()); - nCmdID; // avoid level 4 warning - ATLASSERT (key && (k_(*key) == k_ColorType)); - key; // avoid level 4 warning - ATLASSERT (ppropvarValue); - - HRESULT hr = PropVariantToUInt32(*ppropvarValue, &m_colorType); - ATLASSERT(SUCCEEDED(hr)); - - if (SUCCEEDED(hr) && (m_colorType == UI_SWATCHCOLORTYPE_RGB)) - { - ATLASSERT(pCommandExecutionProperties); - PROPVARIANT var; - if SUCCEEDED(hr = pCommandExecutionProperties->GetValue(UI_PKEY_Color, &var)) - hr = PropVariantToUInt32(var, &m_color); - } - - if SUCCEEDED(hr) - GetWndRibbon().OnRibbonColorCtrlExecute(GetID(), verb, (UI_SWATCHCOLORTYPE)m_colorType/*uType*/, m_color); - else - ATLASSERT(FALSE); // something was wrong - - return hr; - } - - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - ATLASSERT (nCmdID == GetID()); - - HRESULT hr = E_NOTIMPL; - - switch (k_(key)) - { - case k_ColorType: - hr = SetPropertyVal(key, m_colorType, ppropvarNewValue); - break; - case k_Color: - if (m_color == 0x800080) /*MAGENTA*/ - m_color = GetWndRibbon().OnRibbonQueryColor(GetID()); - hr = SetPropertyVal(key, m_color, ppropvarNewValue); - break; - case k_ColorMode: - break; - case k_ThemeColorsCategoryLabel: - case k_StandardColorsCategoryLabel: - case k_RecentColorsCategoryLabel: - case k_AutomaticColorLabel: - case k_NoColorLabel: - case k_MoreColorsLabel: - { - const UINT iLabel = k_(key) - k_ThemeColorsCategoryLabel; - if (m_sLabels[iLabel].IsEmpty()) - if (LPCWSTR psLabel = GetWndRibbon().OnRibbonQueryColorLabel(GetID(), key)) - m_sLabels[iLabel] = psLabel; - if (!m_sLabels[iLabel].IsEmpty()) - hr = SetPropertyVal(key, (LPCWSTR)m_sLabels[iLabel], ppropvarNewValue); - } - break; - case k_ThemeColors: - case k_StandardColors: - { - const INT ic = k_(key) - k_ThemeColors; - if (!m_aColors[ic].GetSize()) - if (COLORREF* pColor = GetWndRibbon().OnRibbonQueryColorArray(GetID(), key)) - SetColorArray(key, pColor); - if (INT iMax = m_aColors[ic].GetSize()) - hr = InitPropVariantFromUInt32Vector(m_aColors[ic].GetData(), iMax, ppropvarNewValue); - } - break; - case k_ThemeColorsTooltips: - case k_StandardColorsTooltips: - { - const INT ic = k_(key) - k_ThemeColorsTooltips; - if (m_aTooltips[ic].GetSize() == 0) - if (LPCWSTR* ppsTT = GetWndRibbon().OnRibbonQueryColorTooltips(GetID(), key)) - SetColorTooltips(key, ppsTT); - if (INT iMax = m_aTooltips[ic].GetSize()) - hr = InitPropVariantFromStringVector(m_aTooltips[ic].GetData(), iMax, ppropvarNewValue); - } - break; - default: - hr = CommandCtrlImpl::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - break; - } - - return hr; - } -}; - -// SpinnerCtrlImpl -// -template -class SpinnerCtrlImpl : public CtrlImpl -{ -public: - SpinnerCtrlImpl() - { - m_Values[0] = m_Values[2] = m_Values[4] = 0; - m_Values[1] = 100; - m_Values[3] = 1; - } - - V m_Values[5]; - // k_DecimalValue = 201, k_MaxValue = 203, k_MinValue, k_Increment, k_DecimalPlaces - - Text m_FormatString; - Text m_RepresentativeString; - - // Operations - HRESULT SetDecimalPlaces(V vPlaces, bool bUpdate = false) - { - return SetValue(UI_PKEY_DecimalPlaces, vPlaces, bUpdate); - } - - HRESULT SetMin(V vMin, bool bUpdate = false) - { - return SetValue(UI_PKEY_MinValue, vMin, bUpdate); - } - - HRESULT SetMax(V vMax, bool bUpdate = false) - { - return SetValue(UI_PKEY_MaxValue, vMax, bUpdate); - } - - HRESULT SetVal(V vVal, bool bUpdate = false) - { - return SetValue(UI_PKEY_DecimalValue, vVal, bUpdate); - } - - HRESULT SetIncrement(V vIncrement, bool bUpdate = false) - { - return SetValue(UI_PKEY_Increment, vIncrement, bUpdate); - } - - HRESULT SetFormatString(LPCWSTR sFormat, bool bUpdate = false) - { - return SetText(UI_PKEY_FormatString, sFormat, bUpdate); - } - - HRESULT SetRepresentativeString(LPCWSTR sRepresentative, bool bUpdate = false) - { - return SetText(UI_PKEY_RepresentativeString, sRepresentative, bUpdate); - } - - // Implementation - HRESULT SetText(REFPROPERTYKEY key, LPCWSTR sText, bool bUpdate = false) - { - switch (k_(key)) - { - case k_FormatString: - m_FormatString = sText; - break; - case k_RepresentativeString: - m_RepresentativeString = sText; - break; - default: - return CtrlImpl::SetText(key, sText, bUpdate); - } - - return bUpdate ? - GetWndRibbon().InvalidateProperty(GetID(), key) : - S_OK; - } - - HRESULT SetValue(REFPROPERTYKEY key, V val, bool bUpdate = false) - { - ATLASSERT((k_(key) <= k_DecimalPlaces) && (k_(key) >= k_DecimalValue)); - - const INT iVal = k_(key) == k_DecimalValue ? 0 : k_(key) - k_StringValue; - m_Values[iVal] = val; - - if (bUpdate) - { - if(k_(key) == k_DecimalValue) - { - DECIMAL decVal; - InitDecimal(val, &decVal); - return SetProperty(key, &decVal); - } - else - { - return GetWndRibbon().InvalidateProperty(GetID(), key); - } - } - else - { - return S_OK; - } - } - - HRESULT QueryValue(REFPROPERTYKEY key, LONG* plVal) - { - return GetWndRibbon().OnRibbonQuerySpinnerValue(GetID(), key, plVal); - } - - HRESULT QueryValue(REFPROPERTYKEY key, DOUBLE* pdVal) - { - return GetWndRibbon().OnRibbonQueryFloatSpinnerValue(GetID(), key, pdVal); - } - - HRESULT OnGetValue(REFPROPERTYKEY key, PROPVARIANT* ppv) - { - ATLASSERT((k_(key) <= k_DecimalPlaces) && (k_(key) >= k_DecimalValue)); - - const INT iVal = k_(key) == k_DecimalValue ? 0 : k_(key) - k_StringValue; - - QueryValue(key, m_Values + iVal); - - if (k_(key) == k_DecimalPlaces) - { - return SetPropertyVal(key, m_Values[iVal], ppv); - } - else - { - DECIMAL decVal; - InitDecimal(m_Values[iVal], &decVal); - return SetPropertyVal(key, &decVal, ppv); - } - } - - HRESULT OnGetText(REFPROPERTYKEY key, Text& sVal, PROPVARIANT* ppv) - { - if (LPCWSTR sNew = GetWndRibbon().OnRibbonQueryText(GetID(), key)) - sVal = sNew; - return SetPropertyVal(key, (LPCWSTR)sVal, ppv); - } - - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* /*pCommandExecutionProperties*/) - { - ATLASSERT (nCmdID == GetID()); - nCmdID; // avoid level 4 warning - ATLASSERT (key && (k_(*key) == k_DecimalValue)); - key; // avoid level 4 warning - ATLASSERT (verb == UI_EXECUTIONVERB_EXECUTE); - verb; // avoid level 4 warning - - DECIMAL decVal; - - HRESULT hr = UIPropertyToDecimal(UI_PKEY_DecimalValue, *ppropvarValue, &decVal); - hr = InitVal(m_Values[0], &decVal); - - GetWndRibbon().OnRibbonSpinnerCtrlExecute(GetID(), &m_Values[0]); - - return hr; - } - - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - ATLASSERT (nCmdID == GetID()); - - HRESULT hr = E_NOTIMPL; - switch (k_(key)) - { - case k_DecimalPlaces: - case k_DecimalValue: - case k_Increment: - case k_MaxValue: - case k_MinValue: - hr = OnGetValue(key, ppropvarNewValue); - break; - case k_FormatString: - if (m_FormatString.IsEmpty()) - return OnGetText(key, m_FormatString, ppropvarNewValue); - break; - case k_RepresentativeString: - if (m_RepresentativeString.IsEmpty()) - return OnGetText(key, m_RepresentativeString, ppropvarNewValue); - break; - default: - hr = CtrlImpl::DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - break; - } - - return hr; - } - - // decimal conversion helpers - static HRESULT InitDecimal(LONG& val, DECIMAL* pDecimal) - { - return ::VarDecFromI4(val, pDecimal); - } - - static HRESULT InitDecimal(DOUBLE& val, DECIMAL* pDecimal) - { - return ::VarDecFromR8(val, pDecimal); - } - - static HRESULT InitVal(LONG& val, const DECIMAL* pDecimal) - { - return ::VarI4FromDec(pDecimal, &val); - } - - static HRESULT InitVal(DOUBLE& val, const DECIMAL* pDecimal) - { - return ::VarR8FromDec(pDecimal, &val); - } -}; - -// CRibbonImpl Ribbon implementation class -// -template -class CRibbonImpl : - public CRibbonUpdateUI, - public ICtrl, - public IUIApplication, - public IUICommandHandler -{ - typedef CRibbonImpl thisClass; -public: - typedef thisClass Ribbon; - typedef T WndRibbon; - - CRibbonImpl() : m_bRibbonUI(false), m_hgRibbonSettings(NULL) - { -#ifdef _DEBUG - m_cRef = 1; -#endif - pWndRibbon = static_cast(this); - HRESULT hr = ::CoInitialize(NULL); - if(SUCCEEDED(hr)) - if (RunTimeHelper::IsRibbonUIAvailable()) - hr = m_pIUIFramework.CoCreateInstance(CLSID_UIRibbonFramework); - else - ATLTRACE(L"Ribbon UI not available\n"); - - if FAILED(hr) - ATLTRACE(L"Ribbon construction failed\n"); - - ATLASSERT(SUCCEEDED(hr)); - } - - ~CRibbonImpl() - { - ::GlobalFree(m_hgRibbonSettings); - m_pIUIFramework.Release(); - ::CoUninitialize(); - } - - ICtrl& GetRibbonCtrl(UINT) - { - return static_cast(*this); - } - - ATL::CComPtr m_pIUIFramework; - HGLOBAL m_hgRibbonSettings; - bool m_bRibbonUI; - - bool IsRibbonUI() - { - return m_bRibbonUI; - } - - IUIFramework* GetIUIFrameworkPtr() - { - return m_pIUIFramework; - } - - template - I* GetRibbonViewPtr(UINT32 uID) - { - ATLASSERT(m_pIUIFramework); - ATL::CComPtr pI; - return m_pIUIFramework->GetView(uID, __uuidof(I), (void**) &pI) == S_OK ? - pI : - NULL; - } - - IUIRibbon* GetRibbonPtr() - { - return GetRibbonViewPtr(0); - } - - IUIContextualUI* GetMenuPtr(UINT32 uID) - { - ATLASSERT(uID); - return GetRibbonViewPtr(uID); - } - - UINT GetRibbonHeight() - { - ATLASSERT(IsRibbonUI()); - - UINT32 cy = 0; - if (ATL::CComPtr pIUIRibbon = GetRibbonPtr()) - pIUIRibbon->GetHeight(&cy); - return cy; - } - - HRESULT CreateRibbon(LPCWSTR sResName = L"APPLICATION_RIBBON") - { - T* pT = static_cast(this); - ATLASSERT(GetIUIFrameworkPtr() && !IsRibbonUI()); - ATLASSERT(pT->IsWindow()); - - HRESULT hr = m_pIUIFramework->Initialize(pT->m_hWnd, this); - - if (hr == S_OK) - hr = m_pIUIFramework->LoadUI(ModuleHelper::GetResourceInstance(), sResName); - - return hr; - } - - HRESULT DestroyRibbon() - { - T* pT = static_cast(this); - ATLASSERT(GetIUIFrameworkPtr() && IsRibbonUI()); - ATLASSERT(pT->IsWindow()); - - HRESULT hRes = m_pIUIFramework->Destroy(); - if (!RunTimeHelper::IsWin7()) - pT->SetWindowRgn(NULL, TRUE); // Vista Basic bug workaround - return hRes; - } - -// Ribbon persistency - HRESULT operator >>(IStream* pIStream) - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(pIStream); - - HRESULT hr = E_FAIL; - if (ATL::CComPtr pIUIRibbon = GetRibbonPtr()) - { - const LARGE_INTEGER li0 = { 0 }; - pIStream->Seek(li0, STREAM_SEEK_SET, NULL); - hr = pIUIRibbon->SaveSettingsToStream(pIStream); - pIStream->Commit(STGC_DEFAULT); - } - - return hr; - } - - HRESULT operator <<(IStream* pIStream) - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(pIStream); - - HRESULT hr = E_FAIL; - if (ATL::CComPtr pIUIRibbon = GetRibbonPtr()) - { - const LARGE_INTEGER li0 = { 0 }; - pIStream->Seek(li0, STREAM_SEEK_SET, NULL); - hr = pIUIRibbon->LoadSettingsFromStream(pIStream); - } - - return hr; - } - - void ResetRibbonSettings() - { - if (m_hgRibbonSettings != NULL) - { - ::GlobalFree(m_hgRibbonSettings); - m_hgRibbonSettings = NULL; - } - } - - HRESULT SaveRibbonSettings() - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(static_cast(this)->IsWindow()); - - HRESULT hr = E_FAIL; - ATL::CComPtr pIStream; - - if SUCCEEDED(hr = ::CreateStreamOnHGlobal(m_hgRibbonSettings, FALSE, &pIStream)) - hr = *this >> pIStream; - - if (SUCCEEDED(hr) && (m_hgRibbonSettings == NULL)) - hr = ::GetHGlobalFromStream(pIStream, &m_hgRibbonSettings); - - if FAILED(hr) - ResetRibbonSettings(); - - return hr; - } - - HRESULT RestoreRibbonSettings() - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(m_hgRibbonSettings); - ATLASSERT(static_cast(this)->IsWindow()); - - HRESULT hr = E_FAIL; - ATL::CComPtr pIStream; - - if SUCCEEDED(hr = ::CreateStreamOnHGlobal(m_hgRibbonSettings, FALSE, &pIStream)) - hr = *this << pIStream; - - if FAILED(hr) - ResetRibbonSettings(); - - return hr; - } - -// QAT dock states - UI_CONTROLDOCK GetQATDock() - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(IsRibbonUI()); - - UINT32 uDock = 0; - PROPVARIANT propvar; - ATL::CComQIPtrpIPS(GetRibbonPtr()); - - if ((pIPS != NULL) && SUCCEEDED(pIPS->GetValue(UI_PKEY_QuickAccessToolbarDock, &propvar)) && - SUCCEEDED(UIPropertyToUInt32(UI_PKEY_QuickAccessToolbarDock, propvar, &uDock))) - return (UI_CONTROLDOCK)uDock; - - ATLASSERT(FALSE); // something was wrong - return (UI_CONTROLDOCK)0; - } - - bool SetQATDock(UI_CONTROLDOCK dockState) - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(IsRibbonUI()); - - PROPVARIANT propvar; - ATLVERIFY(SUCCEEDED(SetPropertyVal(UI_PKEY_QuickAccessToolbarDock, dockState, &propvar))); - - ATL::CComQIPtrpIPS(GetRibbonPtr()); - if ((pIPS != NULL) && SUCCEEDED(pIPS->SetValue(UI_PKEY_QuickAccessToolbarDock, propvar))) - { - pIPS->Commit(); - return true; - } - - ATLASSERT(FALSE); // something was wrong - return false; - } - -// Ribbon display states - bool GetRibbonDisplayState(REFPROPERTYKEY key) - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(IsRibbonUI()); - ATLASSERT((k_(key) == k_Viewable) || (k_(key) == k_Minimized)); - - PROPVARIANT propvar; - ATL::CComQIPtrpIPS(GetRibbonPtr()); - - if ((pIPS != NULL) && SUCCEEDED(pIPS->GetValue(key, &propvar))) - { - BOOL bState = FALSE; - if SUCCEEDED(UIPropertyToBoolean(key, propvar, &bState)) - return (bState != FALSE); - } - - ATLASSERT(FALSE); // something was wrong - return false; - } - - bool SetRibbonDisplayState(REFPROPERTYKEY key, bool bState = true) - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(IsRibbonUI()); - ATLASSERT((k_(key) == k_Viewable) || (k_(key) == k_Minimized)); - - PROPVARIANT propvar; - ATLVERIFY(SUCCEEDED(SetPropertyVal(key, bState, &propvar))); - - ATL::CComQIPtrpIPS(GetRibbonPtr()); - - if ((pIPS != NULL) && SUCCEEDED(pIPS->SetValue(key, propvar))) - { - pIPS->Commit(); - return true; - } - - ATLASSERT(FALSE); // something was wrong - return false; - } - - bool IsRibbonMinimized() - { - return GetRibbonDisplayState(UI_PKEY_Minimized); - } - - bool MinimizeRibbon(bool bMinimize = true) - { - return SetRibbonDisplayState(UI_PKEY_Minimized, bMinimize); - } - - bool IsRibbonHidden() - { - return !GetRibbonDisplayState(UI_PKEY_Viewable); - } - - bool HideRibbon(bool bHide = true) - { - return SetRibbonDisplayState(UI_PKEY_Viewable, !bHide); - } - -// Ribbon colors - UI_HSBCOLOR GetRibbonColor(REFPROPERTYKEY key) - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(IsRibbonUI()); - ATLASSERT((k_(key) >= k_GlobalBackgroundColor) && (k_(key) <= k_GlobalTextColor)); - - PROPVARIANT propvar; - ATL::CComQIPtrpIPS(GetIUIFrameworkPtr()); - - if ((pIPS != NULL) && SUCCEEDED(pIPS->GetValue(key, &propvar))) - { - UINT32 color = 0; - if SUCCEEDED(UIPropertyToUInt32(key, propvar, &color)) - return color; - } - - ATLASSERT(FALSE); // something was wrong - return 0; - } - - bool SetRibbonColor(REFPROPERTYKEY key, UI_HSBCOLOR color) - { - ATLASSERT(GetIUIFrameworkPtr()); - ATLASSERT(IsRibbonUI()); - ATLASSERT((k_(key) >= k_GlobalBackgroundColor) && (k_(key) <= k_GlobalTextColor)); - - PROPVARIANT propvar; - ATLVERIFY(SUCCEEDED(SetPropertyVal(key, color, &propvar))); - - ATL::CComQIPtrpIPS(GetIUIFrameworkPtr()); - - if ((pIPS != NULL) && SUCCEEDED(pIPS->SetValue(key, propvar))) - { - pIPS->Commit(); - return true; - } - - ATLASSERT(FALSE); // something was wrong - return false; - } - -// Ribbon modes - HRESULT SetRibbonModes(INT32 iModes) - { - ATLASSERT(IsRibbonUI()); - return GetIUIFrameworkPtr()->SetModes(iModes); - } - -// Ribbon contextual tab - UI_CONTEXTAVAILABILITY GetRibbonContextAvail(UINT32 uID) - { - ATLASSERT(GetIUIFrameworkPtr()); - - PROPVARIANT propvar; - if (IsRibbonUI() && - SUCCEEDED(GetIUIFrameworkPtr()->GetUICommandProperty(uID, UI_PKEY_ContextAvailable, &propvar))) - { - UINT uav; - if (SUCCEEDED(PropVariantToUInt32(propvar, &uav))) - { - CUpdateUIBase::UIEnable(uID, uav != UI_CONTEXTAVAILABILITY_NOTAVAILABLE); - CUpdateUIBase::UISetCheck(uID, uav == UI_CONTEXTAVAILABILITY_ACTIVE); - return (UI_CONTEXTAVAILABILITY)uav; - } - } - - return UI_CONTEXTAVAILABILITY_NOTAVAILABLE; - } - - HRESULT SetRibbonContextAvail(UINT32 uID, UI_CONTEXTAVAILABILITY cav) - { - CUpdateUIBase::UIEnable(uID, cav != UI_CONTEXTAVAILABILITY_NOTAVAILABLE); - CUpdateUIBase::UISetCheck(uID, cav == UI_CONTEXTAVAILABILITY_ACTIVE); - - return SetProperty((WORD)uID, UI_PKEY_ContextAvailable, UINT32(cav)); - } - -// Ribbon context menu - bool HasRibbonMenu(UINT32 uID) - { - ATL::CComPtr pI = GetMenuPtr(uID); - return pI != NULL; - } - - HRESULT TrackRibbonMenu(UINT32 uID, INT32 x, INT32 y) - { - ATLASSERT(HasRibbonMenu(uID)); - - return IsRibbonUI() ? - ATL::CComPtr(GetMenuPtr(uID))->ShowAtLocation(x, y) : - E_FAIL; - } - - HRESULT TrackRibbonMenu(UINT32 uID, LPARAM lParam) - { - return TrackRibbonMenu(uID, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); - } - -// Overrideables - HBITMAP OnRibbonQueryImage(UINT nCmdID, REFPROPERTYKEY /*key*/) - { - return DefRibbonQueryImage(nCmdID); - } - - LPCWSTR OnRibbonQueryText(UINT nCmdID, REFPROPERTYKEY key) - { - return DefRibbonQueryText(nCmdID, key); - } - - bool OnRibbonQueryState(UINT nCmdID, REFPROPERTYKEY key) - { - return DefRibbonQueryState(nCmdID, key); - } - - UI_CONTEXTAVAILABILITY OnRibbonQueryTabAvail(UINT nCmdID) - { - DWORD dwState = UIGetState(nCmdID); - return ((dwState & UPDUI_DISABLED) == UPDUI_DISABLED) ? - UI_CONTEXTAVAILABILITY_NOTAVAILABLE : - (((dwState & UPDUI_CHECKED) == UPDUI_CHECKED) ? - UI_CONTEXTAVAILABILITY_ACTIVE : - UI_CONTEXTAVAILABILITY_AVAILABLE); - } - - LPCWSTR OnRibbonQueryComboText(UINT32 /*uCtrlID*/) - { - return NULL; - } - - LPCWSTR OnRibbonQueryCategoryText(UINT32 /*uCtrlID*/, UINT32 /*uCat*/) - { - return L"Category"; - } - - UINT32 OnRibbonQueryItemCategory(UINT32 /*uCtrlID*/, UINT32 /*uItem*/) - { - return 0; - } - - LPCWSTR OnRibbonQueryItemText(UINT32 uCtrlID, UINT32 uItem) - { - return DefRibbonQueryItemText(uCtrlID, uItem); - } - - bool OnRibbonQuerySelectedItem(UINT32 /*uCtrlID*/, UINT32& /*uSel*/) - { - return false; - } - - HBITMAP OnRibbonQueryItemImage(UINT32 uCtrlID, UINT32 uItem) - { - return DefRibbonQueryItemImage(uCtrlID, uItem); - } - - UINT32 OnRibbonQueryItemCommand(UINT32 uCtrlID, UINT32 uItem) - { - return DefRibbonQueryItemCommand(uCtrlID, uItem); - } - - UI_COMMANDTYPE OnRibbonQueryItemCommandType(UINT32 /*uCtrlID*/, UINT32 /*uItem*/) - { - return UI_COMMANDTYPE_ACTION; - } - - LPCWSTR OnRibbonQueryRecentItemName(LPCWSTR sPath) - { - return ::PathFindFileName(sPath); - } - - bool OnRibbonQueryFont(UINT /*nId*/, CHARFORMAT2& /*cf*/) - { - return false; - } - - bool OnRibbonQuerySpinnerValue(UINT /*nCmdID*/, REFPROPERTYKEY /*key*/, LONG* /*pVal*/) - { - return false; - } - - bool OnRibbonQueryFloatSpinnerValue(UINT /*nCmdID*/, REFPROPERTYKEY /*key*/, DOUBLE* /*pVal*/) - { - return false; - } - - COLORREF OnRibbonQueryColor(UINT /*nCmdID*/) - { - return 0x800080; /*MAGENTA*/ - } - - LPCWSTR OnRibbonQueryColorLabel(UINT /*nCmdID*/, REFPROPERTYKEY /*key*/) - { - return NULL; - } - - COLORREF* OnRibbonQueryColorArray(UINT /*nCmdID*/, REFPROPERTYKEY /*key*/) - { - return NULL; - } - - LPCWSTR* OnRibbonQueryColorTooltips(UINT /*nCmdID*/, REFPROPERTYKEY /*key*/) - { - return NULL; - } - - bool OnRibbonItemSelected(UINT32 uCtrlID, UI_EXECUTIONVERB verb, UINT32 uItem) - { - DefCommandExecute(MAKELONG(uCtrlID, verb), uItem); - return true; - } - - void OnRibbonColorCtrlExecute(UINT32 uCtrlID, UI_EXECUTIONVERB verb, UI_SWATCHCOLORTYPE uType, COLORREF color) - { - DefRibbonColorCtrlExecute(uCtrlID, verb, uType, color); - } - - void OnRibbonFontCtrlExecute(UINT32 uCtrlID, UI_EXECUTIONVERB verb, CHARFORMAT2* pcf) - { - DefCommandExecute(MAKELONG(uCtrlID, verb), (LPARAM)pcf); - } - - void OnRibbonSpinnerCtrlExecute(UINT32 uCtrlID, LONG* pVal) - { - DefCommandExecute(uCtrlID, *pVal); - } - - void OnRibbonSpinnerCtrlExecute(UINT32 uCtrlID, DOUBLE* pVal) - { - DefCommandExecute(uCtrlID, (LPARAM)pVal); - } - - void OnRibbonCommandExecute(UINT32 uCmdID) - { - DefCommandExecute(uCmdID); - } - -// Default implementations - HBITMAP DefRibbonQueryImage(UINT nCmdID) - { - return AtlLoadBitmapImage(nCmdID, LR_CREATEDIBSECTION); - } - - bool DefRibbonQueryState(UINT nCmdID, REFPROPERTYKEY key) - { - DWORD dwState = UIGetState(nCmdID); - bool bRet = false; - switch (k_(key)) - { - case k_BooleanValue: - bRet = (dwState & UPDUI_CHECKED) == UPDUI_CHECKED; - break; - case k_Enabled: - bRet = (dwState & UPDUI_DISABLED) != UPDUI_DISABLED; - break; - default: - ATLASSERT(FALSE); - break; - } - - return bRet; - } - - LPCTSTR DefRibbonQueryText(UINT nCmdID, REFPROPERTYKEY key) - { - static WCHAR sText[RIBBONUI_MAX_TEXT] = { 0 }; - - if (k_(key) == k_Label) - return UIGetText(nCmdID); - - if (AtlLoadString(nCmdID, sText, RIBBONUI_MAX_TEXT)) - { - PWCHAR pTitle = wcschr(sText, L'\n'); - switch (k_(key)) - { - case k_Keytip: - if (PWCHAR pAmp = wcschr(sText, L'&')) - pTitle = pAmp; - if (pTitle != NULL) - *(pTitle + 2) = NULL; // fall through - case k_TooltipTitle: - return pTitle ? ++pTitle : NULL; - case k_TooltipDescription: - case k_LabelDescription: - if (pTitle != NULL) - *pTitle = NULL; - return sText; - } - } - - return NULL; - } - - LPCWSTR DefRibbonQueryItemText(UINT32 uCtrlID, UINT32 uItem) - { - return DefRibbonQueryText(uCtrlID + 1 + uItem, UI_PKEY_LabelDescription); - } - - HBITMAP DefRibbonQueryItemImage(UINT32 uCtrlID, UINT32 uItem) - { - return DefRibbonQueryImage(uCtrlID + 1 + uItem); - } - - UINT32 DefRibbonQueryItemCommand(UINT32 uCtrlID, UINT32 uItem) - { - return uCtrlID + 1 + uItem; - } - - void DefRibbonColorCtrlExecute(UINT32 uCtrlID, UI_EXECUTIONVERB verb, UI_SWATCHCOLORTYPE uType, COLORREF color) - { - switch(uType) - { - case UI_SWATCHCOLORTYPE_RGB: - break; - case UI_SWATCHCOLORTYPE_AUTOMATIC: - color = ::GetSysColor(COLOR_WINDOWTEXT); - break; - case UI_SWATCHCOLORTYPE_NOCOLOR: - color = ::GetSysColor(COLOR_WINDOW); - break; - default: - ATLASSERT(FALSE); - break; - } - - DefCommandExecute(MAKELONG(uCtrlID, verb), color); - } - - void DefCommandExecute(UINT32 uCmd, LPARAM lParam = 0) - { - static_cast(this)->PostMessage(WM_COMMAND, uCmd, lParam); - } - -// Elements setting helpers - HRESULT InvalidateCtrl(UINT32 nID) - { - return IsRibbonUI() ? - GetIUIFrameworkPtr()->InvalidateUICommand(nID, UI_INVALIDATIONS_ALLPROPERTIES, NULL) : - E_FAIL; - } - - HRESULT InvalidateProperty(UINT32 nID, REFPROPERTYKEY key, UI_INVALIDATIONS flags = UI_INVALIDATIONS_PROPERTY) - { - return IsRibbonUI() ? - GetIUIFrameworkPtr()->InvalidateUICommand(nID, flags, &key) : - E_FAIL; - } - - template - HRESULT SetProperty(WORD wID, REFPROPERTYKEY key, V val) - { - if (IsRibbonUI()) - { - PROPVARIANT var; - if (SUCCEEDED(RibbonUI::SetPropertyVal(key, val, &var))) - { - return SetProperty(wID, key, var); - } - return E_INVALIDARG; - } - else - { - return E_FAIL; - } - } - - template <> - HRESULT SetProperty(WORD nID, REFPROPERTYKEY key, PROPVARIANT var) - { - return IsRibbonUI() ? - GetIUIFrameworkPtr()->SetUICommandProperty(nID, key, var) : - E_FAIL; - } - -// Interfaces - // IUIApplication - STDMETHODIMP OnViewChanged(UINT32, UI_VIEWTYPE, IUnknown*, UI_VIEWVERB verb, INT32) - { - switch (verb) - { - case UI_VIEWVERB_CREATE: - m_bRibbonUI = true; - if (m_hgRibbonSettings != NULL) - RestoreRibbonSettings(); - break; - case UI_VIEWVERB_SIZE: - static_cast(this)->UpdateLayout(FALSE); - break; - case UI_VIEWVERB_DESTROY: - SaveRibbonSettings(); - m_bRibbonUI = false; - break; - } - - return S_OK; - } - - STDMETHODIMP OnCreateUICommand(UINT32 nCmdID, UI_COMMANDTYPE typeID, IUICommandHandler** ppCommandHandler) - { - UIAddRibbonElement(nCmdID); - if (typeID == UI_COMMANDTYPE_CONTEXT) - CUpdateUIBase::UIEnable(nCmdID, false); - *ppCommandHandler = this; - return S_OK; - } - - STDMETHODIMP OnDestroyUICommand(UINT32 nCmdID, UI_COMMANDTYPE, IUICommandHandler*) - { - UIRemoveRibbonElement(nCmdID); - return S_OK; - } - - // IUICommandHandler - STDMETHODIMP Execute(UINT nCmdID, - UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, - const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* pCommandExecutionProperties) - { - T* pT =static_cast(this); - return pT->GetRibbonCtrl(nCmdID).DoExecute(nCmdID, verb, key, ppropvarValue, pCommandExecutionProperties); - } - - STDMETHODIMP UpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* ppropvarCurrentValue, PROPVARIANT* ppropvarNewValue) - { - T* pT =static_cast(this); - return pT->GetRibbonCtrl(nCmdID).DoUpdateProperty(nCmdID, key, ppropvarCurrentValue, ppropvarNewValue); - } - -#ifdef _DEBUG - // IUnknown methods (heavyweight) - STDMETHODIMP_(ULONG) AddRef() - { - return InterlockedIncrement(&m_cRef); - } - - STDMETHODIMP_(ULONG) Release() - { - LONG cRef = InterlockedDecrement(&m_cRef); - if (cRef == 0) // NoOp for breakpoint - { - cRef = 0; - } - - return cRef; - } - - STDMETHODIMP QueryInterface(REFIID iid, void** ppv) - { - if (ppv == NULL) - { - return E_POINTER; - } - else if ((iid == __uuidof(IUnknown)) || - (iid == __uuidof(IUICommandHandler)) || - (iid == __uuidof(IUIApplication))) - { - *ppv = this; - AddRef(); - return S_OK; - } - else - { - return E_NOINTERFACE; - } - } - - LONG m_cRef; -#else - // IUnknown methods (lightweight) - STDMETHODIMP QueryInterface(REFIID iid, void** ppv) - { - if ((iid == __uuidof(IUnknown)) || - (iid == __uuidof(IUICommandHandler)) || - (iid == __uuidof(IUIApplication))) - { - *ppv = this; - return S_OK; - } - return E_NOINTERFACE; - } - ULONG STDMETHODCALLTYPE AddRef() - { - return 1; - } - ULONG STDMETHODCALLTYPE Release() - { - return 1; - } -#endif - -// CRibbonImpl ICtrl implementation - virtual HRESULT DoExecute(UINT nCmdID, UI_EXECUTIONVERB verb, - const PROPERTYKEY* key, const PROPVARIANT* ppropvarValue, - IUISimplePropertySet* /*pCommandExecutionProperties*/) - { - if (key != NULL) - { - if(k_(*key) != k_BooleanValue) - { - ATLTRACE(L"Control ID %d is not handled\n", nCmdID); - return E_NOTIMPL; - } - BOOL bChecked = FALSE; - ATLVERIFY(SUCCEEDED(PropVariantToBoolean(*ppropvarValue, &bChecked))); - CUpdateUIBase::UISetCheck(nCmdID, bChecked); - } - - ATLASSERT(verb == UI_EXECUTIONVERB_EXECUTE); - verb; // avoid level 4 warning - - static_cast(this)->OnRibbonCommandExecute(nCmdID); - - return S_OK; - } - - virtual HRESULT DoUpdateProperty(UINT nCmdID, REFPROPERTYKEY key, - const PROPVARIANT* /*ppropvarCurrentValue*/, PROPVARIANT* ppropvarNewValue) - { - T* pT = static_cast(this); - HRESULT hr = E_NOTIMPL; - switch (k_(key)) - { - case k_LargeImage: - case k_LargeHighContrastImage: - case k_SmallImage: - case k_SmallHighContrastImage: - if (HBITMAP hbm = pT->OnRibbonQueryImage(nCmdID, key)) - hr = SetPropertyVal(key, GetImage(hbm, UI_OWNERSHIP_TRANSFER), ppropvarNewValue); - break; - case k_Label: - case k_Keytip: - case k_TooltipTitle: - case k_TooltipDescription: - case k_LabelDescription: - if (LPCWSTR sText = pT->OnRibbonQueryText(nCmdID, key)) - hr = SetPropertyVal(key, sText, ppropvarNewValue); - break; - case k_BooleanValue: - case k_Enabled: - hr = SetPropertyVal(key, pT->OnRibbonQueryState(nCmdID, key), ppropvarNewValue); - break; - case k_ContextAvailable: - hr = SetPropertyVal(key, pT->OnRibbonQueryTabAvail(nCmdID), ppropvarNewValue); - break; - } - - return hr; - } - -// CRibbonImpl::CRibbonXXXCtrl specialized classes - //CRibbonComboCtrl - template - class CRibbonComboCtrl : public CollectionCtrlImpl, t_items, t_categories>> - { - public: - CRibbonComboCtrl() - { } - }; - - // CRibbonItemGalleryCtrl - template - class CRibbonItemGalleryCtrl : public CollectionCtrlImpl, t_items, t_categories>> - { - public: - CRibbonItemGalleryCtrl() - { } - }; - - // CRibbonCommandGalleryCtrl - template - class CRibbonCommandGalleryCtrl : public CollectionCtrlImpl, t_items, t_categories>> - { - public: - CRibbonCommandGalleryCtrl() - { } - }; - - // CRibbonToolbarGalleryCtrl - template - class CRibbonToolbarGalleryCtrl : public ToolbarGalleryCtrlImpl - { }; - - // CRibbonSimpleComboCtrl - template - class CRibbonSimpleComboCtrl : public SimpleCollectionCtrlImpl - { }; - - // CRibbonSimpleGalleryCtrl - template - class CRibbonSimpleGalleryCtrl : public SimpleCollectionCtrlImpl - { }; - - //CRibbonRecentItemsCtrl - template - class CRibbonRecentItemsCtrl : public RecentItemsCtrlImpl - { - public: - CRibbonRecentItemsCtrl() - { } - }; - - // CRibbonColorCtrl - template - class CRibbonColorCtrl : public ColorCtrlImpl - { - public: - CRibbonColorCtrl() - { } - }; - - //CRibbonFontCtrl - template - class CRibbonFontCtrl : public FontCtrlImpl - { - public: - CRibbonFontCtrl() - { } - }; - - // CRibbonSpinnerCtrl - template - class CRibbonSpinnerCtrl : public SpinnerCtrlImpl - { - public: - CRibbonSpinnerCtrl() - { } - }; - - // CRibbonFloatSpinnerCtrl - template - class CRibbonFloatSpinnerCtrl : public SpinnerCtrlImpl - { - public: - CRibbonFloatSpinnerCtrl() - { - m_Values[4] = 1; // 1 decimal - } - }; - - // CRibbonCommandCtrl - template - class CRibbonCommandCtrl : public CommandCtrlImpl - { - public: - CRibbonCommandCtrl() - { } - }; - -// Control classes access to T instance (re-initialized in constructor) - static T* pWndRibbon; -}; - -template -__declspec(selectany) T* CRibbonImpl::pWndRibbon; - -// Control map element -#pragma warning (disable : 4510 610) // missing default constructor -typedef struct -{ - UINT uID; - ICtrl& ctrl; -} _ribbonCtrl; -#pragma warning (default : 4510 610) // missing default constructor - -}; // namespace RibbonUI - - -/////////////////////////////////////////////////////////////////////////////// -// RibbonUI Control map - -// Control map macros -#define BEGIN_RIBBON_CONTROL_MAP(theClass) \ - RibbonUI::ICtrl& GetRibbonCtrl(UINT id) \ - { \ - RibbonUI::_ribbonCtrl _ctrls[] = \ - { - -#define RIBBON_CONTROL(member) {member.GetID(), static_cast(member)}, - -#define END_RIBBON_CONTROL_MAP() \ - {0, *this} \ - }; \ - int i = 0; \ - for(; i < _countof(_ctrls) - 1; i++) \ - if (_ctrls[i].uID == id) \ - break; \ - return _ctrls[i].ctrl; \ -} - -// Control message map macros -#define RIBBON_GALLERY_CONTROL_HANDLER(id, func) \ - if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = func((UI_EXECUTIONVERB)HIWORD(wParam), LOWORD(wParam), (UINT)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define RIBBON_COMBO_CONTROL_HANDLER(id, func) \ - RIBBON_GALLERY_CONTROL_HANDLER(id, func) - -#define RIBBON_FONT_CONTROL_HANDLER(id, func) \ - if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = func((UI_EXECUTIONVERB)HIWORD(wParam), LOWORD(wParam), (CHARFORMAT2*)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define RIBBON_COLOR_CONTROL_HANDLER(id, func) \ - if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = func((UI_EXECUTIONVERB)HIWORD(wParam), LOWORD(wParam), (COLORREF)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define RIBBON_SPINNER_CONTROL_HANDLER(id, func) \ - if(uMsg == WM_COMMAND && id == wParam) \ - { \ - bHandled = TRUE; \ - lResult = func((WORD)wParam, (LONG)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define RIBBON_FLOATSPINNER_CONTROL_HANDLER(id, func) \ - if(uMsg == WM_COMMAND && id == wParam) \ - { \ - bHandled = TRUE; \ - lResult = func((WORD)wParam, (DOUBLE*)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -// Handler prototypes -/* - LRESULT OnRibbonGalleryCtrl(UI_EXECUTIONVERB verb, WORD wID, UINT uSel, BOOL& bHandled); - LRESULT OnRibbonComboCtrl(UI_EXECUTIONVERB verb, WORD wID, UINT uSel, BOOL& bHandled); - LRESULT OnRibbonFontCtrl(UI_EXECUTIONVERB verb, WORD wID, CHARFORMAT2* pcf, BOOL& bHandled); - LRESULT OnRibbonColorCtrl(UI_EXECUTIONVERB verb, WORD wID, COLORREF color, BOOL& bHandled); - LRESULT OnRibbonSpinnerCtrl(WORD wID, LONG lVal, BOOL& bHandled); - LRESULT OnRibbonFloatSpinnerCtrl(WORD wID, DOUBLE* pdVal, BOOL& bHandled); -*/ - - -/////////////////////////////////////////////////////////////////////////////// -// Ribbon frame classes - -// CRibbonFrameWindowImplBase -// -template -class ATL_NO_VTABLE CRibbonFrameWindowImplBase : public TFrameImpl, public RibbonUI::CRibbonImpl -{ - typedef TFrameImpl baseFrame; - bool m_bUseCommandBarBitmaps; - bool m_bWin7Fix; - -public: -// Construction - CRibbonFrameWindowImplBase(bool bUseCommandBarBitmaps = true) : - m_bUseCommandBarBitmaps(bUseCommandBarBitmaps), m_bWin7Fix(false) - { - __if_not_exists(T::m_CmdBar) - { - m_bUseCommandBarBitmaps = false; - } - } - -// Win7 Aero fix helpers - void ResetFrame() - { - const MARGINS margins = { 0 }; - ::DwmExtendFrameIntoClientArea(m_hWnd, &margins); - } - - INT CalcWin7Fix() - { - ResetFrame(); - RECT rc = { 0 }; - ::AdjustWindowRectEx(&rc, T::GetWndStyle(0), GetMenu() != NULL, T::GetWndExStyle(0)); - return -rc.top; - } - - bool NeedWin7Fix() - { - BOOL bComp = FALSE; - return m_bWin7Fix && RunTimeHelper::IsWin7() && SUCCEEDED(DwmIsCompositionEnabled(&bComp)) && bComp; - } - -// Operations - bool UseCommandBarBitmaps(bool bUse) - { - __if_exists(T::m_CmdBar) - { - return m_bUseCommandBarBitmaps = bUse; - } - __if_not_exists(T::m_CmdBar) - { - bUse; // avoid level 4 warning - return false; - } - } - - bool ShowRibbonUI(bool bShow, INT32 imodes = UI_MAKEAPPMODE(0), LPCWSTR sResName = L"APPLICATION_RIBBON") - { - if (!RunTimeHelper::IsRibbonUIAvailable()) - return false; - - ATLASSERT(GetIUIFrameworkPtr()); - - if (IsRibbonUI() == bShow) - return bShow; - - bool bVisible = (IsWindowVisible() != FALSE); - if(bVisible && !bShow) - SetRedraw(FALSE); - - if (bShow && ::IsWindow(m_hWndToolBar)) - { - ::ShowWindow(m_hWndToolBar, SW_HIDE); - UpdateLayout(); - } - - m_bWin7Fix = !bShow; - - HRESULT hr = bShow ? CreateRibbon(sResName) : DestroyRibbon(); - - m_bWin7Fix = SUCCEEDED(hr) && !bShow; - - if (SUCCEEDED(hr)) - { - if(::IsWindow(m_hWndToolBar) && !bShow) - { - ::ShowWindow(m_hWndToolBar, SW_SHOWNA); - UpdateLayout(); - } - else if (bShow) - { - PostMessage(WM_SIZE); - SetRibbonModes(imodes); - } - } - - if(bVisible && !bShow) - { - SetRedraw(TRUE); - RedrawWindow(NULL, NULL, RDW_FRAME | RDW_ERASE | RDW_INVALIDATE | RDW_UPDATENOW | RDW_ALLCHILDREN); - } - - return SUCCEEDED(hr) ? bShow : !bShow; - } - -// Overrideables - HBITMAP OnRibbonQueryImage(UINT nCmdID, REFPROPERTYKEY key) - { - if ((key == UI_PKEY_SmallImage) && m_bUseCommandBarBitmaps) - { - if (HBITMAP hbm = GetCommandBarBitmap(nCmdID)) - return (HBITMAP)::CopyImage(hbm, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION); - } - - return DefRibbonQueryImage(nCmdID); - } - - BEGIN_MSG_MAP(CRibbonFrameWindowImplBase) - if (!IsRibbonUI() && NeedWin7Fix()) - { - MESSAGE_HANDLER(WM_SIZING, OnSizing) - MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) - MESSAGE_HANDLER(WM_NCCALCSIZE, OnNCCalcSize) - } - CHAIN_MSG_MAP(CRibbonUpdateUI) - CHAIN_MSG_MAP(baseFrame) - END_MSG_MAP() - -// Message handlers for Win7 Aero - LRESULT OnSizing(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - switch (wParam) - { - case WMSZ_TOP: - case WMSZ_TOPLEFT: - case WMSZ_TOPRIGHT: - SetWindowPos(NULL, (LPRECT)lParam, SWP_NOMOVE | SWP_NOZORDER | SWP_FRAMECHANGED); - break; - default: - DefWindowProc(); - break; - } - - return 1; // handled - } - - LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if (wParam != SIZE_MINIMIZED) - SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - - bHandled = FALSE; - return 1; - } - - LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(wParam != WA_INACTIVE) - SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); - - bHandled = FALSE; - return 1; - } - - LRESULT OnNCCalcSize(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - ATLASSERT(!IsRibbonUI() && NeedWin7Fix()); - - LRESULT lRet = DefWindowProc(); - - if(wParam) - { - LPNCCALCSIZE_PARAMS pParams = (LPNCCALCSIZE_PARAMS)lParam; - pParams->rgrc[0].top = pParams->rgrc[1].top + CalcWin7Fix(); - } - - return lRet; - } - -// Overrides - void UpdateLayout(BOOL bResizeBars = TRUE) - { - RECT rect = { 0 }; - GetClientRect(&rect); - - if (IsRibbonUI() && !IsRibbonHidden()) - { - rect.top += GetRibbonHeight(); - } - else if (!IsRibbonUI() && NeedWin7Fix()) - { - ResetFrame(); - } - - // position bars and offset their dimensions - UpdateBarsPosition(rect, bResizeBars); - - // resize client window - if(m_hWndClient != NULL) - ::SetWindowPos(m_hWndClient, NULL, rect.left, rect.top, - rect.right - rect.left, rect.bottom - rect.top, - SWP_NOZORDER | SWP_NOACTIVATE); - } - - // Implementation - HBITMAP GetCommandBarBitmap(UINT nCmdID) - { - __if_exists (T::m_CmdBar) - { - ATLASSERT(RunTimeHelper::IsVista()); - T* pT =static_cast(this); - int nIndex = pT->m_CmdBar.m_arrCommand.Find((WORD&)nCmdID); - return (nIndex == -1) ? NULL : pT->m_CmdBar.m_arrVistaBitmap[nIndex]; - } - __if_not_exists (T::m_CmdBar) - { - nCmdID; // avoid level 4 warning - return NULL; - } - } -}; - -// CRibbonFrameWindowImpl -// -template -class ATL_NO_VTABLE CRibbonFrameWindowImpl : public CRibbonFrameWindowImplBase> -{ }; - -// CRibbonMDIFrameWindowImpl -// -template -class ATL_NO_VTABLE CRibbonMDIFrameWindowImpl : public CRibbonFrameWindowImplBase> -{ }; - - -/////////////////////////////////////////////////////////////////////////////// -// CRibbonPersist helper for RibbonUI persistency - -class CRibbonPersist -{ -public: - CRibbonPersist(LPCWSTR sAppKey) - { - ATLASSERT(sAppKey && *sAppKey); - m_Key.Create(HKEY_CURRENT_USER, sAppKey); - ATLASSERT(m_Key.m_hKey); - } - - CRegKeyEx m_Key; - - LONG Save(bool bRibbonUI, HGLOBAL hgSettings = NULL) - { - CRegKeyEx key; - const DWORD dwUI = bRibbonUI; - - LONG lRet = key.Create(m_Key, L"Ribbon"); - if(lRet != ERROR_SUCCESS) - return lRet; - - lRet = key.SetDWORDValue(L"UI", dwUI); - if(lRet != ERROR_SUCCESS) - return lRet; - - if (hgSettings != NULL) - { - LPBYTE pVal = (LPBYTE)::GlobalLock(hgSettings); - if (pVal != NULL) - { - lRet = key.SetBinaryValue(L"Settings", pVal, ::GlobalSize(hgSettings)); - ::GlobalUnlock(hgSettings); - } - else - { - lRet = GetLastError(); - } - } - - return lRet; - } - - LONG Restore(bool& bRibbonUI, HGLOBAL& hgSettings) - { - ATLASSERT(hgSettings == NULL); - - CRegKeyEx key; - - LONG lRet = key.Open(m_Key, L"Ribbon"); - if(lRet != ERROR_SUCCESS) - return lRet; - - DWORD dwUI = 0xffff; - lRet = key.QueryDWORDValue(L"UI", dwUI); - if(lRet == ERROR_SUCCESS) - bRibbonUI = dwUI == 1; - else - return lRet; - - ULONG ulSize = 0; - lRet = key.QueryBinaryValue(L"Settings", NULL, &ulSize); - if (lRet == ERROR_SUCCESS) - { - ATLASSERT(ulSize != 0); - - hgSettings = ::GlobalAlloc(GHND, ulSize); - if (hgSettings != NULL) - { - LPBYTE pData = (LPBYTE)::GlobalLock(hgSettings); - if (pData != NULL) - { - lRet = key.QueryBinaryValue(L"Settings", pData, &ulSize); - } - else - { - lRet = GetLastError(); - ::GlobalFree(hgSettings); - hgSettings = NULL; - } - } - else - { - lRet = GetLastError(); - } - } - return lRet; - } - - LONG Delete() - { - return m_Key.DeleteSubKey(L"Ribbon"); - } -}; - -} // namespace WTL - -#endif // __ATLRIBBON_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlscrl.h b/plugins/SmartAutoReplier/wtl/atlscrl.h deleted file mode 100644 index 0f59c9dd58..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlscrl.h +++ /dev/null @@ -1,2011 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLSCRL_H__ -#define __ATLSCRL_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlscrl.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atlscrl.h requires atlwin.h to be included first -#endif - -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - #include -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - -#ifndef GET_WHEEL_DELTA_WPARAM - #define GET_WHEEL_DELTA_WPARAM(wParam) ((short)HIWORD(wParam)) -#endif - -#ifndef WM_MOUSEHWHEEL - #define WM_MOUSEHWHEEL 0x020E -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CScrollImpl -// CScrollWindowImpl -// CMapScrollImpl -// CMapScrollWindowImpl -// CFSBWindowT -// CZoomScrollImpl -// CZoomScrollWindowImpl -// CScrollContainerImpl -// CScrollContainer - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CScrollImpl - Provides scrolling support to any window - -// Scroll extended styles -#define SCRL_SCROLLCHILDREN 0x00000001 -#define SCRL_ERASEBACKGROUND 0x00000002 -#define SCRL_NOTHUMBTRACKING 0x00000004 -#if (WINVER >= 0x0500) -#define SCRL_SMOOTHSCROLL 0x00000008 -#endif // (WINVER >= 0x0500) -#define SCRL_DISABLENOSCROLLV 0x00000010 -#define SCRL_DISABLENOSCROLLH 0x00000020 -#define SCRL_DISABLENOSCROLL (SCRL_DISABLENOSCROLLV | SCRL_DISABLENOSCROLLH) - - -template -class CScrollImpl -{ -public: - enum { uSCROLL_FLAGS = SW_INVALIDATE }; - - POINT m_ptOffset; - SIZE m_sizeAll; - SIZE m_sizeLine; - SIZE m_sizePage; - SIZE m_sizeClient; - int m_zDelta; // current wheel value - int m_nWheelLines; // number of lines to scroll on wheel -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - // Note that this message must be forwarded from a top level window - UINT m_uMsgMouseWheel; // MSH_MOUSEWHEEL -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - int m_zHDelta; // current horizontal wheel value - int m_nHWheelChars; // number of chars to scroll on horizontal wheel - UINT m_uScrollFlags; - DWORD m_dwExtendedStyle; // scroll specific extended styles - -// Constructor - CScrollImpl() : m_zDelta(0), m_nWheelLines(3), -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - m_uMsgMouseWheel(0U), -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - m_zHDelta(0), m_nHWheelChars(3), - m_uScrollFlags(0U), m_dwExtendedStyle(0) - { - m_ptOffset.x = 0; - m_ptOffset.y = 0; - m_sizeAll.cx = 0; - m_sizeAll.cy = 0; - m_sizePage.cx = 0; - m_sizePage.cy = 0; - m_sizeLine.cx = 0; - m_sizeLine.cy = 0; - m_sizeClient.cx = 0; - m_sizeClient.cy = 0; - - SetScrollExtendedStyle(SCRL_SCROLLCHILDREN | SCRL_ERASEBACKGROUND); - } - -// Attributes & Operations - DWORD GetScrollExtendedStyle() const - { - return m_dwExtendedStyle; - } - - DWORD SetScrollExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwExtendedStyle; - if(dwMask == 0) - m_dwExtendedStyle = dwExtendedStyle; - else - m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); - // cache scroll flags - T* pT = static_cast(this); - pT; // avoid level 4 warning - m_uScrollFlags = pT->uSCROLL_FLAGS | (IsScrollingChildren() ? SW_SCROLLCHILDREN : 0) | (IsErasingBackground() ? SW_ERASE : 0); -#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) - m_uScrollFlags |= (IsSmoothScroll() ? SW_SMOOTHSCROLL : 0); -#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) - return dwPrevStyle; - } - - // offset operations - void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - pT->AdjustScrollOffset(x, y); - - int dx = m_ptOffset.x - x; - int dy = m_ptOffset.y - y; - m_ptOffset.x = x; - m_ptOffset.y = y; - - // block: set horizontal scroll bar - { - SCROLLINFO si = { sizeof(SCROLLINFO) }; - si.fMask = SIF_POS; - if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0) - si.fMask |= SIF_DISABLENOSCROLL; - si.nPos = m_ptOffset.x; - pT->SetScrollInfo(SB_HORZ, &si, bRedraw); - } - - // block: set vertical scroll bar - { - SCROLLINFO si = { sizeof(SCROLLINFO) }; - si.fMask = SIF_POS; - if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0) - si.fMask |= SIF_DISABLENOSCROLL; - si.nPos = m_ptOffset.y; - pT->SetScrollInfo(SB_VERT, &si, bRedraw); - } - - // Move all children if needed - if(IsScrollingChildren() && (dx != 0 || dy != 0)) - { - for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT)) - { - RECT rect = { 0 }; - ::GetWindowRect(hWndChild, &rect); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1); - ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); - } - } - - if(bRedraw) - pT->Invalidate(); - } - - void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE) - { - SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw); - } - - void GetScrollOffset(POINT& ptOffset) const - { - ptOffset = m_ptOffset; - } - - // size operations - void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - m_sizeAll.cx = cx; - m_sizeAll.cy = cy; - - int x = 0; - int y = 0; - if(!bResetOffset) - { - x = m_ptOffset.x; - y = m_ptOffset.y; - pT->AdjustScrollOffset(x, y); - } - - int dx = m_ptOffset.x - x; - int dy = m_ptOffset.y - y; - m_ptOffset.x = x; - m_ptOffset.y = y; - - // block: set horizontal scroll bar - { - SCROLLINFO si = { sizeof(SCROLLINFO) }; - si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; - if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0) - si.fMask |= SIF_DISABLENOSCROLL; - si.nMin = 0; - si.nMax = m_sizeAll.cx - 1; - si.nPage = m_sizeClient.cx; - si.nPos = m_ptOffset.x; - pT->SetScrollInfo(SB_HORZ, &si, bRedraw); - } - - // block: set vertical scroll bar - { - SCROLLINFO si = { sizeof(SCROLLINFO) }; - si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; - if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0) - si.fMask |= SIF_DISABLENOSCROLL; - si.nMin = 0; - si.nMax = m_sizeAll.cy - 1; - si.nPage = m_sizeClient.cy; - si.nPos = m_ptOffset.y; - pT->SetScrollInfo(SB_VERT, &si, bRedraw); - } - - // Move all children if needed - if(IsScrollingChildren() && (dx != 0 || dy != 0)) - { - for(HWND hWndChild = ::GetWindow(pT->m_hWnd, GW_CHILD); hWndChild != NULL; hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT)) - { - RECT rect = { 0 }; - ::GetWindowRect(hWndChild, &rect); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 1); - ::SetWindowPos(hWndChild, NULL, rect.left + dx, rect.top + dy, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); - } - } - - SetScrollLine(0, 0); - SetScrollPage(0, 0); - - if(bRedraw) - pT->Invalidate(); - } - - void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true) - { - SetScrollSize(size.cx, size.cy, bRedraw, bResetOffset); - } - - void GetScrollSize(SIZE& sizeWnd) const - { - sizeWnd = m_sizeAll; - } - - // line operations - void SetScrollLine(int cxLine, int cyLine) - { - ATLASSERT(cxLine >= 0 && cyLine >= 0); - ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0); - - m_sizeLine.cx = T::CalcLineOrPage(cxLine, m_sizeAll.cx, 100); - m_sizeLine.cy = T::CalcLineOrPage(cyLine, m_sizeAll.cy, 100); - } - - void SetScrollLine(SIZE sizeLine) - { - SetScrollLine(sizeLine.cx, sizeLine.cy); - } - - void GetScrollLine(SIZE& sizeLine) const - { - sizeLine = m_sizeLine; - } - - // page operations - void SetScrollPage(int cxPage, int cyPage) - { - ATLASSERT(cxPage >= 0 && cyPage >= 0); - ATLASSERT(m_sizeAll.cx != 0 && m_sizeAll.cy != 0); - - m_sizePage.cx = T::CalcLineOrPage(cxPage, m_sizeAll.cx, 10); - m_sizePage.cy = T::CalcLineOrPage(cyPage, m_sizeAll.cy, 10); - } - - void SetScrollPage(SIZE sizePage) - { - SetScrollPage(sizePage.cx, sizePage.cy); - } - - void GetScrollPage(SIZE& sizePage) const - { - sizePage = m_sizePage; - } - - // commands - void ScrollLineDown() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_VERT, SB_LINEDOWN, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); - } - - void ScrollLineUp() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_VERT, SB_LINEUP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); - } - - void ScrollPageDown() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_VERT, SB_PAGEDOWN, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); - } - - void ScrollPageUp() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_VERT, SB_PAGEUP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); - } - - void ScrollTop() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_VERT, SB_TOP, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); - } - - void ScrollBottom() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_VERT, SB_BOTTOM, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); - } - - void ScrollLineRight() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_HORZ, SB_LINEDOWN, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - } - - void ScrollLineLeft() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_HORZ, SB_LINEUP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - } - - void ScrollPageRight() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_HORZ, SB_PAGEDOWN, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - } - - void ScrollPageLeft() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_HORZ, SB_PAGEUP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - } - - void ScrollAllLeft() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_HORZ, SB_TOP, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - } - - void ScrollAllRight() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_HORZ, SB_BOTTOM, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - } - - // scroll to make point/view/window visible - void ScrollToView(POINT pt) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - RECT rect = { pt.x, pt.y, pt.x, pt.y }; - pT->ScrollToView(rect); - } - - void ScrollToView(RECT& rect) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - RECT rcClient = { 0 }; - pT->GetClientRect(&rcClient); - - int x = m_ptOffset.x; - if(rect.left < m_ptOffset.x) - x = rect.left; - else if(rect.right > (m_ptOffset.x + rcClient.right)) - x = rect.right - rcClient.right; - - int y = m_ptOffset.y; - if(rect.top < m_ptOffset.y) - y = rect.top; - else if(rect.bottom > (m_ptOffset.y + rcClient.bottom)) - y = rect.bottom - rcClient.bottom; - - SetScrollOffset(x, y); - } - - void ScrollToView(HWND hWnd) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - RECT rect = { 0 }; - ::GetWindowRect(hWnd, &rect); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rect, 2); - ScrollToView(rect); - } - - BEGIN_MSG_MAP(CScrollImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_VSCROLL, OnVScroll) - MESSAGE_HANDLER(WM_HSCROLL, OnHScroll) - MESSAGE_HANDLER(WM_MOUSEWHEEL, OnMouseWheel) -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - MESSAGE_HANDLER(m_uMsgMouseWheel, OnMouseWheel) -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - MESSAGE_HANDLER(WM_MOUSEHWHEEL, OnMouseHWheel) - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) - MESSAGE_HANDLER(WM_SIZE, OnSize) - MESSAGE_HANDLER(WM_PAINT, OnPaint) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) -#endif // !_WIN32_WCE - // standard scroll commands - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_SCROLL_UP, OnScrollUp) - COMMAND_ID_HANDLER(ID_SCROLL_DOWN, OnScrollDown) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, OnScrollPageUp) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, OnScrollPageDown) - COMMAND_ID_HANDLER(ID_SCROLL_TOP, OnScrollTop) - COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, OnScrollBottom) - COMMAND_ID_HANDLER(ID_SCROLL_LEFT, OnScrollLeft) - COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, OnScrollRight) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, OnScrollPageLeft) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, OnScrollPageRight) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, OnScrollAllLeft) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, OnScrollAllRight) - END_MSG_MAP() - - LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - GetSystemSettings(); - bHandled = FALSE; - return 1; - } - - LRESULT OnVScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_VERT, (int)(short)LOWORD(wParam), (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); - return 0; - } - - LRESULT OnHScroll(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - pT->DoScroll(SB_HORZ, (int)(short)LOWORD(wParam), (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - return 0; - } - - LRESULT OnMouseWheel(UINT uMsg, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - -#if (_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) || defined(_WIN32_WCE) - uMsg; - int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam); -#else - int zDelta = (uMsg == WM_MOUSEWHEEL) ? (int)GET_WHEEL_DELTA_WPARAM(wParam) : (int)wParam; -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400) || defined(_WIN32_WCE)) - int nScrollCode = (m_nWheelLines == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGEUP : SB_PAGEDOWN) : ((zDelta > 0) ? SB_LINEUP : SB_LINEDOWN); - m_zDelta += zDelta; // cumulative - int zTotal = (m_nWheelLines == WHEEL_PAGESCROLL) ? abs(m_zDelta) : abs(m_zDelta) * m_nWheelLines; - if(m_sizeAll.cy > m_sizeClient.cy) - { - for(int i = 0; i < zTotal; i += WHEEL_DELTA) - { - pT->DoScroll(SB_VERT, nScrollCode, (int&)m_ptOffset.y, m_sizeAll.cy, m_sizePage.cy, m_sizeLine.cy); - pT->UpdateWindow(); - } - } - else // can't scroll vertically, scroll horizontally - { - for(int i = 0; i < zTotal; i += WHEEL_DELTA) - { - pT->DoScroll(SB_HORZ, nScrollCode, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - pT->UpdateWindow(); - } - } - m_zDelta %= WHEEL_DELTA; - - return 0; - } - - LRESULT OnMouseHWheel(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - int zDelta = (int)GET_WHEEL_DELTA_WPARAM(wParam); - int nScrollCode = (m_nHWheelChars == WHEEL_PAGESCROLL) ? ((zDelta > 0) ? SB_PAGERIGHT : SB_PAGELEFT) : ((zDelta > 0) ? SB_LINERIGHT : SB_LINELEFT); - m_zHDelta += zDelta; // cumulative - int zTotal = (m_nHWheelChars == WHEEL_PAGESCROLL) ? abs(m_zHDelta) : abs(m_zHDelta) * m_nHWheelChars; - if(m_sizeAll.cx > m_sizeClient.cx) - { - for(int i = 0; i < zTotal; i += WHEEL_DELTA) - { - pT->DoScroll(SB_HORZ, nScrollCode, (int&)m_ptOffset.x, m_sizeAll.cx, m_sizePage.cx, m_sizeLine.cx); - pT->UpdateWindow(); - } - } - m_zHDelta %= WHEEL_DELTA; - - return 0; - } - - LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - GetSystemSettings(); - return 0; - } - - LRESULT OnSize(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - m_sizeClient.cx = GET_X_LPARAM(lParam); - m_sizeClient.cy = GET_Y_LPARAM(lParam); - - // block: set horizontal scroll bar - { - SCROLLINFO si = { sizeof(SCROLLINFO) }; - si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; - si.nMin = 0; - si.nMax = m_sizeAll.cx - 1; - if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLH) != 0) - si.fMask |= SIF_DISABLENOSCROLL; - si.nPage = m_sizeClient.cx; - si.nPos = m_ptOffset.x; - pT->SetScrollInfo(SB_HORZ, &si, TRUE); - } - - // block: set vertical scroll bar - { - SCROLLINFO si = { sizeof(SCROLLINFO) }; - si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS; - si.nMin = 0; - si.nMax = m_sizeAll.cy - 1; - if((m_dwExtendedStyle & SCRL_DISABLENOSCROLLV) != 0) - si.fMask |= SIF_DISABLENOSCROLL; - si.nPage = m_sizeClient.cy; - si.nPos = m_ptOffset.y; - pT->SetScrollInfo(SB_VERT, &si, TRUE); - } - - int x = m_ptOffset.x; - int y = m_ptOffset.y; - if(pT->AdjustScrollOffset(x, y)) - { - // Children will be moved in SetScrollOffset, if needed - pT->ScrollWindowEx(m_ptOffset.x - x, m_ptOffset.y - y, (m_uScrollFlags & ~SCRL_SCROLLCHILDREN)); - SetScrollOffset(x, y, FALSE); - } - - bHandled = FALSE; - return 1; - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - if(wParam != NULL) - { - CDCHandle dc = (HDC)wParam; - POINT ptViewportOrg = { 0, 0 }; - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg); - pT->DoPaint(dc); - dc.SetViewportOrg(ptViewportOrg); - } - else - { - CPaintDC dc(pT->m_hWnd); - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y); - pT->DoPaint(dc.m_hDC); - } - return 0; - } - - // scrolling handlers - LRESULT OnScrollUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollLineUp(); - return 0; - } - - LRESULT OnScrollDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollLineDown(); - return 0; - } - - LRESULT OnScrollPageUp(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollPageUp(); - return 0; - } - - LRESULT OnScrollPageDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollPageDown(); - return 0; - } - - LRESULT OnScrollTop(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollTop(); - return 0; - } - - LRESULT OnScrollBottom(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollBottom(); - return 0; - } - - LRESULT OnScrollLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollLineLeft(); - return 0; - } - - LRESULT OnScrollRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollLineRight(); - return 0; - } - - LRESULT OnScrollPageLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollPageLeft(); - return 0; - } - - LRESULT OnScrollPageRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollPageRight(); - return 0; - } - - LRESULT OnScrollAllLeft(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollAllLeft(); - return 0; - } - - LRESULT OnScrollAllRight(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - ScrollAllRight(); - return 0; - } - -// Overrideables - void DoPaint(CDCHandle /*dc*/) - { - // must be implemented in a derived class - ATLASSERT(FALSE); - } - -// Implementation - void DoScroll(int nType, int nScrollCode, int& cxyOffset, int cxySizeAll, int cxySizePage, int cxySizeLine) - { - T* pT = static_cast(this); - RECT rect = { 0 }; - pT->GetClientRect(&rect); - int cxyClient = (nType == SB_VERT) ? rect.bottom : rect.right; - int cxyMax = cxySizeAll - cxyClient; - - if(cxyMax < 0) // can't scroll, client area is bigger - return; - - bool bUpdate = true; - int cxyScroll = 0; - - switch(nScrollCode) - { - case SB_TOP: // top or all left - cxyScroll = cxyOffset; - cxyOffset = 0; - break; - case SB_BOTTOM: // bottom or all right - cxyScroll = cxyOffset - cxyMax; - cxyOffset = cxyMax; - break; - case SB_LINEUP: // line up or line left - if(cxyOffset >= cxySizeLine) - { - cxyScroll = cxySizeLine; - cxyOffset -= cxySizeLine; - } - else - { - cxyScroll = cxyOffset; - cxyOffset = 0; - } - break; - case SB_LINEDOWN: // line down or line right - if(cxyOffset < cxyMax - cxySizeLine) - { - cxyScroll = -cxySizeLine; - cxyOffset += cxySizeLine; - } - else - { - cxyScroll = cxyOffset - cxyMax; - cxyOffset = cxyMax; - } - break; - case SB_PAGEUP: // page up or page left - if(cxyOffset >= cxySizePage) - { - cxyScroll = cxySizePage; - cxyOffset -= cxySizePage; - } - else - { - cxyScroll = cxyOffset; - cxyOffset = 0; - } - break; - case SB_PAGEDOWN: // page down or page right - if(cxyOffset < cxyMax - cxySizePage) - { - cxyScroll = -cxySizePage; - cxyOffset += cxySizePage; - } - else - { - cxyScroll = cxyOffset - cxyMax; - cxyOffset = cxyMax; - } - break; - case SB_THUMBTRACK: - if(IsNoThumbTracking()) - break; - // else fall through - case SB_THUMBPOSITION: - { - SCROLLINFO si = { sizeof(SCROLLINFO), SIF_TRACKPOS }; - if(pT->GetScrollInfo(nType, &si)) - { - cxyScroll = cxyOffset - si.nTrackPos; - cxyOffset = si.nTrackPos; - } - } - break; - case SB_ENDSCROLL: - default: - bUpdate = false; - break; - } - - if(bUpdate && cxyScroll != 0) - { - pT->SetScrollPos(nType, cxyOffset, TRUE); - if(nType == SB_VERT) - pT->ScrollWindowEx(0, cxyScroll, m_uScrollFlags); - else - pT->ScrollWindowEx(cxyScroll, 0, m_uScrollFlags); - } - } - - static int CalcLineOrPage(int nVal, int nMax, int nDiv) - { - if(nVal == 0) - { - nVal = nMax / nDiv; - if(nVal < 1) - nVal = 1; - } - else if(nVal > nMax) - { - nVal = nMax; - } - - return nVal; - } - - bool AdjustScrollOffset(int& x, int& y) - { - int xOld = x; - int yOld = y; - - int cxMax = m_sizeAll.cx - m_sizeClient.cx; - if(x > cxMax) - x = (cxMax >= 0) ? cxMax : 0; - else if(x < 0) - x = 0; - - int cyMax = m_sizeAll.cy - m_sizeClient.cy; - if(y > cyMax) - y = (cyMax >= 0) ? cyMax : 0; - else if(y < 0) - y = 0; - - return (x != xOld || y != yOld); - } - - void GetSystemSettings() - { -#ifndef _WIN32_WCE -#ifndef SPI_GETWHEELSCROLLLINES - const UINT SPI_GETWHEELSCROLLLINES = 104; -#endif // !SPI_GETWHEELSCROLLLINES - ::SystemParametersInfo(SPI_GETWHEELSCROLLLINES, 0, &m_nWheelLines, 0); - -#ifndef SPI_GETWHEELSCROLLCHARS - const UINT SPI_GETWHEELSCROLLCHARS = 0x006C; -#endif // !SPI_GETWHEELSCROLLCHARS - ::SystemParametersInfo(SPI_GETWHEELSCROLLCHARS, 0, &m_nHWheelChars, 0); - -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - if(m_uMsgMouseWheel != 0) - m_uMsgMouseWheel = ::RegisterWindowMessage(MSH_MOUSEWHEEL); - - HWND hWndWheel = FindWindow(MSH_WHEELMODULE_CLASS, MSH_WHEELMODULE_TITLE); - if(::IsWindow(hWndWheel)) - { - UINT uMsgScrollLines = ::RegisterWindowMessage(MSH_SCROLL_LINES); - if(uMsgScrollLines != 0) - m_nWheelLines = (int)::SendMessage(hWndWheel, uMsgScrollLines, 0, 0L); - } -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) -#endif // !_WIN32_WCE - } - - bool IsScrollingChildren() const - { - return (m_dwExtendedStyle & SCRL_SCROLLCHILDREN) != 0; - } - - bool IsErasingBackground() const - { - return (m_dwExtendedStyle & SCRL_ERASEBACKGROUND) != 0; - } - - bool IsNoThumbTracking() const - { - return (m_dwExtendedStyle & SCRL_NOTHUMBTRACKING) != 0; - } - -#if (WINVER >= 0x0500) - bool IsSmoothScroll() const - { - return (m_dwExtendedStyle & SCRL_SMOOTHSCROLL) != 0; - } -#endif // (WINVER >= 0x0500) -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CScrollWindowImpl - Implements a scrollable window - -template -class ATL_NO_VTABLE CScrollWindowImpl : public ATL::CWindowImpl, public CScrollImpl< T > -{ -public: - BEGIN_MSG_MAP(CScrollWindowImpl) - MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) - MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) - MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) && !defined(_WIN32_WCE) - MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) - MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) - MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) - MESSAGE_HANDLER(WM_PAINT, CScrollImpl< T >::OnPaint) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_PRINTCLIENT, CScrollImpl< T >::OnPaint) -#endif // !_WIN32_WCE - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) - COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) - COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) - COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) - COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) - COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) - END_MSG_MAP() -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CMapScrollImpl - Provides mapping and scrolling support to any window - -#ifndef _WIN32_WCE - -template -class CMapScrollImpl : public CScrollImpl< T > -{ -public: - int m_nMapMode; - RECT m_rectLogAll; - SIZE m_sizeLogLine; - SIZE m_sizeLogPage; - -// Constructor - CMapScrollImpl() : m_nMapMode(MM_TEXT) - { - ::SetRectEmpty(&m_rectLogAll); - m_sizeLogPage.cx = 0; - m_sizeLogPage.cy = 0; - m_sizeLogLine.cx = 0; - m_sizeLogLine.cy = 0; - } - -// Attributes & Operations - // mapping mode operations - void SetScrollMapMode(int nMapMode) - { - ATLASSERT(nMapMode >= MM_MIN && nMapMode <= MM_MAX_FIXEDSCALE); - m_nMapMode = nMapMode; - } - - int GetScrollMapMode() const - { - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - return m_nMapMode; - } - - // offset operations - void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE) - { - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - POINT ptOff = { x, y }; - // block: convert logical to device units - { - CWindowDC dc(NULL); - dc.SetMapMode(m_nMapMode); - dc.LPtoDP(&ptOff); - } - CScrollImpl< T >::SetScrollOffset(ptOff, bRedraw); - } - - void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE) - { - SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw); - } - - void GetScrollOffset(POINT& ptOffset) const - { - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - ptOffset = m_ptOffset; - // block: convert device to logical units - { - CWindowDC dc(NULL); - dc.SetMapMode(m_nMapMode); - dc.DPtoLP(&ptOffset); - } - } - - // size operations - void SetScrollSize(int xMin, int yMin, int xMax, int yMax, BOOL bRedraw = TRUE, bool bResetOffset = true) - { - ATLASSERT(xMax > xMin && yMax > yMin); - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - - ::SetRect(&m_rectLogAll, xMin, yMin, xMax, yMax); - - SIZE sizeAll = { 0 }; - sizeAll.cx = xMax - xMin + 1; - sizeAll.cy = yMax - yMin + 1; - // block: convert logical to device units - { - CWindowDC dc(NULL); - dc.SetMapMode(m_nMapMode); - dc.LPtoDP(&sizeAll); - } - CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset); - SetScrollLine(0, 0); - SetScrollPage(0, 0); - } - - void SetScrollSize(RECT& rcScroll, BOOL bRedraw = TRUE, bool bResetOffset = true) - { - SetScrollSize(rcScroll.left, rcScroll.top, rcScroll.right, rcScroll.bottom, bRedraw, bResetOffset); - } - - void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE, bool bResetOffset = true) - { - SetScrollSize(0, 0, cx, cy, bRedraw, bResetOffset); - } - - void SetScrollSize(SIZE size, BOOL bRedraw = TRUE, bool bResetOffset = true) - { - SetScrollSize(0, 0, size.cx, size.cy, bRedraw, bResetOffset); - } - - void GetScrollSize(RECT& rcScroll) const - { - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - rcScroll = m_rectLogAll; - } - - // line operations - void SetScrollLine(int cxLine, int cyLine) - { - ATLASSERT(cxLine >= 0 && cyLine >= 0); - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - - m_sizeLogLine.cx = cxLine; - m_sizeLogLine.cy = cyLine; - SIZE sizeLine = m_sizeLogLine; - // block: convert logical to device units - { - CWindowDC dc(NULL); - dc.SetMapMode(m_nMapMode); - dc.LPtoDP(&sizeLine); - } - CScrollImpl< T >::SetScrollLine(sizeLine); - } - - void SetScrollLine(SIZE sizeLine) - { - SetScrollLine(sizeLine.cx, sizeLine.cy); - } - - void GetScrollLine(SIZE& sizeLine) const - { - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - sizeLine = m_sizeLogLine; - } - - // page operations - void SetScrollPage(int cxPage, int cyPage) - { - ATLASSERT(cxPage >= 0 && cyPage >= 0); - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - - m_sizeLogPage.cx = cxPage; - m_sizeLogPage.cy = cyPage; - SIZE sizePage = m_sizeLogPage; - // block: convert logical to device units - { - CWindowDC dc(NULL); - dc.SetMapMode(m_nMapMode); - dc.LPtoDP(&sizePage); - } - CScrollImpl< T >::SetScrollPage(sizePage); - } - - void SetScrollPage(SIZE sizePage) - { - SetScrollPage(sizePage.cx, sizePage.cy); - } - - void GetScrollPage(SIZE& sizePage) const - { - ATLASSERT(m_nMapMode >= MM_MIN && m_nMapMode <= MM_MAX_FIXEDSCALE); - sizePage = m_sizeLogPage; - } - - BEGIN_MSG_MAP(CMapScrollImpl) - MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) - MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) - MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) - MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) - MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) - MESSAGE_HANDLER(WM_PAINT, OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) - COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) - COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) - COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) - COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) - COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) - END_MSG_MAP() - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - if(wParam != NULL) - { - CDCHandle dc = (HDC)wParam; - int nMapModeSav = dc.GetMapMode(); - dc.SetMapMode(m_nMapMode); - POINT ptViewportOrg = { 0, 0 }; - if(m_nMapMode == MM_TEXT) - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg); - else - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy, &ptViewportOrg); - POINT ptWindowOrg = { 0, 0 }; - dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top, &ptWindowOrg); - - pT->DoPaint(dc); - - dc.SetMapMode(nMapModeSav); - dc.SetViewportOrg(ptViewportOrg); - dc.SetWindowOrg(ptWindowOrg); - } - else - { - CPaintDC dc(pT->m_hWnd); - dc.SetMapMode(m_nMapMode); - if(m_nMapMode == MM_TEXT) - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y); - else - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y + m_sizeAll.cy); - dc.SetWindowOrg(m_rectLogAll.left, m_rectLogAll.top); - pT->DoPaint(dc.m_hDC); - } - return 0; - } -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CMapScrollWindowImpl - Implements scrolling window with mapping - -#ifndef _WIN32_WCE - -template -class ATL_NO_VTABLE CMapScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CMapScrollImpl< T > -{ -public: - BEGIN_MSG_MAP(CMapScrollWindowImpl) - MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) - MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) - MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) - MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) - MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) - MESSAGE_HANDLER(WM_PAINT, CMapScrollImpl< T >::OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, CMapScrollImpl< T >::OnPaint) - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) - COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) - COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) - COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) - COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) - COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) - END_MSG_MAP() -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CFSBWindow - Use as a base instead of CWindow to get flat scroll bar support - -#if defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - -template -class CFSBWindowT : public TBase, public CFlatScrollBarImpl > -{ -public: -// Constructors - CFSBWindowT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CFSBWindowT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - -// CWindow overrides that use flat scroll bar API -// (only those methods that are used by scroll window classes) - int SetScrollPos(int nBar, int nPos, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return FlatSB_SetScrollPos(nBar, nPos, bRedraw); - } - - BOOL GetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - return FlatSB_GetScrollInfo(nBar, lpScrollInfo); - } - - BOOL SetScrollInfo(int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - return FlatSB_SetScrollInfo(nBar, lpScrollInfo, bRedraw); - } -}; - -typedef CFSBWindowT CFSBWindow; - -#endif // defined(__ATLCTRLS_H__) && (_WIN32_IE >= 0x0400) && !defined(_WIN32_WCE) - - -/////////////////////////////////////////////////////////////////////////////// -// CZoomScrollImpl - Provides zooming and scrolling support to any window - -#ifndef _WIN32_WCE - -// The zoom modes that can be set with the SetZoomMode method -enum -{ - ZOOMMODE_OFF, - ZOOMMODE_IN, // If left mouse button is clicked or dragged, zoom in on point clicked or rectangle dragged. - ZOOMMODE_OUT // If left mouse button clicked, zoom out on point clicked. -}; - -// Notification to parent that zoom scale changed as a result of user mouse action. -#define ZSN_ZOOMCHANGED (NM_FIRST - 50) - -template -class CZoomScrollImpl : public CScrollImpl< T > -{ -public: - enum { m_cxyMinZoomRect = 12 }; // min rect size to zoom in on rect. - -// Data members - SIZE m_sizeLogAll; - SIZE m_sizeLogLine; - SIZE m_sizeLogPage; - float m_fZoomScale; - float m_fZoomScaleMin; - float m_fZoomDelta; // Used in ZOOMMODE_IN and ZOOMMODE_OUT on left-button click. - int m_nZoomMode; - RECT m_rcTrack; - bool m_bTracking; - -// Constructor - CZoomScrollImpl(): - m_fZoomScale(1.0), - m_fZoomScaleMin(0.5), - m_fZoomDelta(0.5), - m_nZoomMode(ZOOMMODE_OFF), - m_bTracking(false) - { - m_sizeLogAll.cx = 0; - m_sizeLogAll.cy = 0; - m_sizeLogPage.cx = 0; - m_sizeLogPage.cy = 0; - m_sizeLogLine.cx = 0; - m_sizeLogLine.cy = 0; - ::SetRectEmpty(&m_rcTrack); - } - -// Attributes & Operations - - // size operations - void SetScrollSize(int cxLog, int cyLog, BOOL bRedraw = TRUE, bool bResetOffset = true) - { - ATLASSERT(cxLog >= 0 && cyLog >= 0); - - // Set up the defaults - if (cxLog == 0 && cyLog == 0) - { - cxLog = 1; - cyLog = 1; - } - - m_sizeLogAll.cx = cxLog; - m_sizeLogAll.cy = cyLog; - SIZE sizeAll = { 0 }; - sizeAll.cx = (int)((float)m_sizeLogAll.cx * m_fZoomScale); - sizeAll.cy = (int)((float)m_sizeLogAll.cy * m_fZoomScale); - - CScrollImpl< T >::SetScrollSize(sizeAll, bRedraw, bResetOffset); - } - - void SetScrollSize(SIZE sizeLog, BOOL bRedraw = TRUE, bool bResetOffset = true) - { - SetScrollSize(sizeLog.cx, sizeLog.cy, bRedraw, bResetOffset); - } - - void GetScrollSize(SIZE& sizeLog) const - { - sizeLog = m_sizeLogAll; - } - - // line operations - void SetScrollLine(int cxLogLine, int cyLogLine) - { - ATLASSERT(cxLogLine >= 0 && cyLogLine >= 0); - - m_sizeLogLine.cx = cxLogLine; - m_sizeLogLine.cy = cyLogLine; - - SIZE sizeLine = { 0 }; - sizeLine.cx = (int)((float)m_sizeLogLine.cx * m_fZoomScale); - sizeLine.cy = (int)((float)m_sizeLogLine.cy * m_fZoomScale); - CScrollImpl< T >::SetScrollLine(sizeLine); - } - - void SetScrollLine(SIZE sizeLogLine) - { - SetScrollLine(sizeLogLine.cx, sizeLogLine.cy); - } - - void GetScrollLine(SIZE& sizeLogLine) const - { - sizeLogLine = m_sizeLogLine; - } - - // page operations - void SetScrollPage(int cxLogPage, int cyLogPage) - { - ATLASSERT(cxLogPage >= 0 && cyLogPage >= 0); - - m_sizeLogPage.cx = cxLogPage; - m_sizeLogPage.cy = cyLogPage; - - SIZE sizePage = { 0 }; - sizePage.cx = (int)((float)m_sizeLogPage.cx * m_fZoomScale); - sizePage.cy = (int)((float)m_sizeLogPage.cy * m_fZoomScale); - - CScrollImpl< T >::SetScrollPage(sizePage); - } - - void SetScrollPage(SIZE sizeLogPage) - { - SetScrollPage(sizeLogPage.cx, sizeLogPage.cy); - } - - void GetScrollPage(SIZE& sizeLogPage) const - { - sizeLogPage = m_sizeLogPage; - } - - void SetZoomScale(float fZoomScale) - { - ATLASSERT(fZoomScale > 0); - - if(fZoomScale > 0 && fZoomScale >= m_fZoomScaleMin) - m_fZoomScale = fZoomScale; - } - - float GetZoomScale() const - { - return m_fZoomScale; - } - - void SetZoomScaleMin(float fZoomScaleMin) - { - m_fZoomScaleMin = fZoomScaleMin; - } - - float GetZoomScaleMin() const - { - return m_fZoomScaleMin; - } - - void SetZoomDelta(float fZoomDelta) - { - ATLASSERT(fZoomDelta >= 0); - - if(fZoomDelta >= 0) - m_fZoomDelta = fZoomDelta; - } - - float GetZoomDelta() const - { - return m_fZoomDelta; - } - - void SetZoomMode(int nZoomMode) - { - m_nZoomMode = nZoomMode; - } - - int GetZoomMode() const - { - return m_nZoomMode; - } - - void Zoom(int x, int y, float fZoomScale) - { - if(fZoomScale <= 0) - return; - - fZoomScale = max(fZoomScale, m_fZoomScaleMin); - - T* pT = static_cast(this); - POINT pt = { x, y }; - if(!pT->PtInDevRect(pt)) - return; - - pT->ViewDPtoLP(&pt); - pT->Zoom(fZoomScale, false); - pT->CenterOnLogicalPoint(pt); - } - - void Zoom(POINT pt, float fZoomScale) - { - T* pT = static_cast(this); - pT->Zoom(pt.x, pt.y, fZoomScale); - } - - void Zoom(RECT& rc) - { - T* pT = static_cast(this); - RECT rcZoom = rc; - pT->NormalizeRect(rcZoom); - SIZE size = { rcZoom.right - rcZoom.left, rcZoom.bottom - rcZoom.top }; - POINT pt = { rcZoom.left + size.cx / 2, rcZoom.top + size.cy / 2 }; - if(size.cx < m_cxyMinZoomRect || size.cy < m_cxyMinZoomRect) - { - pT->Zoom(pt, m_fZoomScale + m_fZoomDelta); - return; - } - - ATLASSERT(size.cx > 0 && size.cy > 0); - - float fScaleH = (float)(m_sizeClient.cx + 1) / (float)size.cx; - float fScaleV = (float)(m_sizeClient.cy + 1) / (float)size.cy; - float fZoomScale = min(fScaleH, fScaleV) * m_fZoomScale; - pT->Zoom(pt, fZoomScale); - } - - void Zoom(float fZoomScale, bool bCenter = true) - { - if(fZoomScale <= 0) - return; - - fZoomScale = max(fZoomScale, m_fZoomScaleMin); - - - T* pT = static_cast(this); - POINT pt = { 0 }; - if(bCenter) - { - RECT rc; - ::GetClientRect(pT->m_hWnd, &rc); - pt.x = rc.right / 2; - pt.y = rc.bottom / 2; - pT->ViewDPtoLP(&pt); - } - - // Modify the Viewport extent - m_fZoomScale = fZoomScale; - SIZE sizeAll = { 0 }; - sizeAll.cx = (int)((float)m_sizeLogAll.cx * fZoomScale); - sizeAll.cy = (int)((float)m_sizeLogAll.cy * fZoomScale); - - // Update scroll bars and window - CScrollImpl< T >::SetScrollSize(sizeAll); - - if(bCenter) - pT->CenterOnLogicalPoint(pt); - } - - // Helper functions - void PrepareDC(CDCHandle dc) - { - ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0); - dc.SetMapMode(MM_ANISOTROPIC); - dc.SetWindowExt(m_sizeLogAll); - dc.SetViewportExt(m_sizeAll); - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y); - } - - void ViewDPtoLP(LPPOINT lpPoints, int nCount = 1) - { - ATLASSERT(lpPoints); - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - CWindowDC dc(pT->m_hWnd); - pT->PrepareDC(dc.m_hDC); - dc.DPtoLP(lpPoints, nCount); - } - - void ViewLPtoDP(LPPOINT lpPoints, int nCount = 1) - { - ATLASSERT(lpPoints); - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - - CWindowDC dc(pT->m_hWnd); - pT->PrepareDC(dc.m_hDC); - dc.LPtoDP(lpPoints, nCount); - } - - void ClientToDevice(POINT &pt) - { - pt.x += m_ptOffset.x; - pt.y += m_ptOffset.y; - } - - void DeviceToClient(POINT &pt) - { - pt.x -= m_ptOffset.x; - pt.y -= m_ptOffset.y; - } - - void CenterOnPoint(POINT pt) - { - T* pT = static_cast(this); - RECT rect; - pT->GetClientRect(&rect); - - int xOfs = pt.x - (rect.right / 2) + m_ptOffset.x; - if(xOfs < 0) - { - xOfs = 0; - } - else - { - int xMax = max((int)(m_sizeAll.cx - rect.right), 0); - if(xOfs > xMax) - xOfs = xMax; - } - - int yOfs = pt.y - (rect.bottom / 2) + m_ptOffset.y; - if(yOfs < 0) - { - yOfs = 0; - } - else - { - int yMax = max((int)(m_sizeAll.cy - rect.bottom), 0); - if(yOfs > yMax) - yOfs = yMax; - } - - CScrollImpl< T >::SetScrollOffset(xOfs, yOfs); - } - - void CenterOnLogicalPoint(POINT ptLog) - { - T* pT = static_cast(this); - pT->ViewLPtoDP(&ptLog); - pT->DeviceToClient(ptLog); - pT->CenterOnPoint(ptLog); - } - - BOOL PtInDevRect(POINT pt) - { - RECT rc = { 0, 0, m_sizeAll.cx, m_sizeAll.cy }; - ::OffsetRect(&rc, -m_ptOffset.x, -m_ptOffset.y); - return ::PtInRect(&rc, pt); - } - - void NormalizeRect(RECT& rc) - { - if(rc.left > rc.right) - { - int r = rc.right; - rc.right = rc.left; - rc.left = r; - } - if(rc.top > rc.bottom) - { - int b = rc.bottom; - rc.bottom = rc.top; - rc.top = b; - } - } - - void DrawTrackRect() - { - T* pT = static_cast(this); - const SIZE sizeLines = { 2, 2 }; - RECT rc = m_rcTrack; - pT->NormalizeRect(rc); - if(!::IsRectEmpty(&rc)) - { - ::MapWindowPoints(pT->m_hWnd, NULL, (LPPOINT)&rc, 2); - CWindowDC dc(NULL); - dc.DrawDragRect(&rc, sizeLines, NULL, sizeLines); - } - } - - void NotifyParentZoomChanged() - { - T* pT = static_cast(this); - int nId = pT->GetDlgCtrlID(); - NMHDR nmhdr = { pT->m_hWnd, nId, ZSN_ZOOMCHANGED }; - ::SendMessage(pT->GetParent(), WM_NOTIFY, (WPARAM)nId, (LPARAM)&nmhdr); - } - - BEGIN_MSG_MAP(CZoomScrollImpl) - MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) - MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) - MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) - MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) - MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) - MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) - MESSAGE_HANDLER(WM_PAINT, OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) - MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) - MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) - MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) - MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) - COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) - COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) - COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) - COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) - COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) - END_MSG_MAP() - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - ATLASSERT(m_sizeLogAll.cx >= 0 && m_sizeLogAll.cy >= 0); - ATLASSERT(m_sizeAll.cx >= 0 && m_sizeAll.cy >= 0); - - if(wParam != NULL) - { - CDCHandle dc = (HDC)wParam; - int nMapModeSav = dc.GetMapMode(); - dc.SetMapMode(MM_ANISOTROPIC); - SIZE szWindowExt = { 0, 0 }; - dc.SetWindowExt(m_sizeLogAll, &szWindowExt); - SIZE szViewportExt = { 0, 0 }; - dc.SetViewportExt(m_sizeAll, &szViewportExt); - POINT ptViewportOrg = { 0, 0 }; - dc.SetViewportOrg(-m_ptOffset.x, -m_ptOffset.y, &ptViewportOrg); - - pT->DoPaint(dc); - - dc.SetMapMode(nMapModeSav); - dc.SetWindowExt(szWindowExt); - dc.SetViewportExt(szViewportExt); - dc.SetViewportOrg(ptViewportOrg); - } - else - { - CPaintDC dc(pT->m_hWnd); - pT->PrepareDC(dc.m_hDC); - pT->DoPaint(dc.m_hDC); - } - return 0; - } - - LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(m_nZoomMode == ZOOMMODE_IN && !m_bTracking) - { - T* pT = static_cast(this); - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - if(pT->PtInDevRect(pt)) - { - pT->SetCapture(); - m_bTracking = true; - ::SetRect(&m_rcTrack, pt.x, pt.y, pt.x, pt.y); - } - } - bHandled = FALSE; - return 0; - } - - LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - if(m_bTracking) - { - T* pT = static_cast(this); - POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - if(pT->PtInDevRect(pt)) - { - pT->DrawTrackRect(); - m_rcTrack.right = pt.x; - m_rcTrack.bottom = pt.y; - pT->DrawTrackRect(); - } - } - bHandled = FALSE; - return 0; - } - - LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - ::ReleaseCapture(); - if(m_nZoomMode == ZOOMMODE_OUT) - { - T* pT = static_cast(this); - pT->Zoom(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), m_fZoomScale - m_fZoomDelta); - pT->NotifyParentZoomChanged(); - } - bHandled = FALSE; - return 0; - } - - LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_bTracking) - { - m_bTracking = false; - T* pT = static_cast(this); - pT->DrawTrackRect(); - pT->Zoom(m_rcTrack); - pT->NotifyParentZoomChanged(); - ::SetRectEmpty(&m_rcTrack); - } - bHandled = FALSE; - return 0; - } - - LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - if(LOWORD(lParam) == HTCLIENT && m_nZoomMode != ZOOMMODE_OFF) - { - T* pT = static_cast(this); - if((HWND)wParam == pT->m_hWnd) - { - DWORD dwPos = ::GetMessagePos(); - POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) }; - pT->ScreenToClient(&pt); - if(pT->PtInDevRect(pt)) - { - ::SetCursor(::LoadCursor(NULL, IDC_CROSS)); - return 1; - } - } - } - bHandled = FALSE; - return 0; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CZoomScrollWindowImpl - Implements scrolling window with zooming - -template -class ATL_NO_VTABLE CZoomScrollWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CZoomScrollImpl< T > -{ -public: - BEGIN_MSG_MAP(CZoomScrollWindowImpl) - MESSAGE_HANDLER(WM_SETCURSOR, CZoomScrollImpl< T >::OnSetCursor) - MESSAGE_HANDLER(WM_VSCROLL, CScrollImpl< T >::OnVScroll) - MESSAGE_HANDLER(WM_HSCROLL, CScrollImpl< T >::OnHScroll) - MESSAGE_HANDLER(WM_MOUSEWHEEL, CScrollImpl< T >::OnMouseWheel) -#if !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(m_uMsgMouseWheel, CScrollImpl< T >::OnMouseWheel) -#endif // !((_WIN32_WINNT >= 0x0400) || (_WIN32_WINDOWS > 0x0400)) - MESSAGE_HANDLER(WM_MOUSEHWHEEL, CScrollImpl< T >::OnMouseHWheel) - MESSAGE_HANDLER(WM_SETTINGCHANGE, CScrollImpl< T >::OnSettingChange) - MESSAGE_HANDLER(WM_SIZE, CScrollImpl< T >::OnSize) - MESSAGE_HANDLER(WM_PAINT, CZoomScrollImpl< T >::OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, CZoomScrollImpl< T >::OnPaint) - MESSAGE_HANDLER(WM_LBUTTONDOWN, CZoomScrollImpl< T >::OnLButtonDown) - MESSAGE_HANDLER(WM_MOUSEMOVE, CZoomScrollImpl< T >::OnMouseMove) - MESSAGE_HANDLER(WM_LBUTTONUP, CZoomScrollImpl< T >::OnLButtonUp) - MESSAGE_HANDLER(WM_CAPTURECHANGED, CZoomScrollImpl< T >::OnCaptureChanged) - ALT_MSG_MAP(1) - COMMAND_ID_HANDLER(ID_SCROLL_UP, CScrollImpl< T >::OnScrollUp) - COMMAND_ID_HANDLER(ID_SCROLL_DOWN, CScrollImpl< T >::OnScrollDown) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_UP, CScrollImpl< T >::OnScrollPageUp) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_DOWN, CScrollImpl< T >::OnScrollPageDown) - COMMAND_ID_HANDLER(ID_SCROLL_TOP, CScrollImpl< T >::OnScrollTop) - COMMAND_ID_HANDLER(ID_SCROLL_BOTTOM, CScrollImpl< T >::OnScrollBottom) - COMMAND_ID_HANDLER(ID_SCROLL_LEFT, CScrollImpl< T >::OnScrollLeft) - COMMAND_ID_HANDLER(ID_SCROLL_RIGHT, CScrollImpl< T >::OnScrollRight) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_LEFT, CScrollImpl< T >::OnScrollPageLeft) - COMMAND_ID_HANDLER(ID_SCROLL_PAGE_RIGHT, CScrollImpl< T >::OnScrollPageRight) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_LEFT, CScrollImpl< T >::OnScrollAllLeft) - COMMAND_ID_HANDLER(ID_SCROLL_ALL_RIGHT, CScrollImpl< T >::OnScrollAllRight) - END_MSG_MAP() -}; - -#endif // !_WIN32_WCE - - -/////////////////////////////////////////////////////////////////////////////// -// CScrollContainer - -template -class ATL_NO_VTABLE CScrollContainerImpl : public CScrollWindowImpl< T, TBase, TWinTraits > -{ -public: - DECLARE_WND_CLASS_EX(NULL, 0, -1) - - typedef CScrollWindowImpl< T, TBase, TWinTraits > _baseClass; - -// Data members - ATL::CWindow m_wndClient; - bool m_bAutoSizeClient; - bool m_bDrawEdgeIfEmpty; - -// Constructor - CScrollContainerImpl() : m_bAutoSizeClient(true), m_bDrawEdgeIfEmpty(false) - { - // Set CScrollWindowImpl extended style - SetScrollExtendedStyle(SCRL_SCROLLCHILDREN); - } - -// Attributes - HWND GetClient() const - { - return m_wndClient; - } - - HWND SetClient(HWND hWndClient, bool bClientSizeAsMin = true) - { - ATLASSERT(::IsWindow(m_hWnd)); - - HWND hWndOldClient = m_wndClient; - m_wndClient = hWndClient; - - SetRedraw(FALSE); - SetScrollSize(1, 1, FALSE); - - if(m_wndClient.m_hWnd != NULL) - { - m_wndClient.SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOZORDER | SWP_NOSIZE); - - if(bClientSizeAsMin) - { - RECT rect = { 0 }; - m_wndClient.GetWindowRect(&rect); - if((rect.right - rect.left) > 0 && (rect.bottom - rect.top) > 0) - SetScrollSize(rect.right - rect.left, rect.bottom - rect.top, FALSE); - } - - T* pT = static_cast(this); - pT->UpdateLayout(); - } - - SetRedraw(TRUE); - RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_FRAME | RDW_UPDATENOW | RDW_ALLCHILDREN); - - return hWndOldClient; - } - -// Message map and handlers - BEGIN_MSG_MAP(CScrollContainerImpl) - MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_SIZE, OnSize) - CHAIN_MSG_MAP(_baseClass) - FORWARD_NOTIFICATIONS() - ALT_MSG_MAP(1) - CHAIN_MSG_MAP_ALT(_baseClass, 1) - END_MSG_MAP() - - LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(m_wndClient.m_hWnd != NULL) - m_wndClient.SetFocus(); - - return 0; - } - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; // no background needed - } - - LRESULT OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - BOOL bTmp = TRUE; - LRESULT lRet = _baseClass::OnSize(uMsg, wParam, lParam, bTmp); - - T* pT = static_cast(this); - pT->UpdateLayout(); - - return lRet; - } - -// Overrides for CScrollWindowImpl - void DoPaint(CDCHandle dc) - { - if(!m_bAutoSizeClient || m_wndClient.m_hWnd == NULL) - { - T* pT = static_cast(this); - RECT rect = { 0 }; - pT->GetContainerRect(rect); - - if(m_bDrawEdgeIfEmpty && m_wndClient.m_hWnd == NULL) - dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); - - dc.FillRect(&rect, COLOR_APPWORKSPACE); - } - } - - void ScrollToView(POINT pt) - { - CScrollWindowImpl< T, TBase, TWinTraits >::ScrollToView(pt); - } - - void ScrollToView(RECT& rect) - { - CScrollWindowImpl< T, TBase, TWinTraits >::ScrollToView(rect); - } - - void ScrollToView(HWND hWnd) // client window coordinates - { - T* pT = static_cast(this); - pT; // avoid level 4 warning - ATLASSERT(::IsWindow(pT->m_hWnd)); - ATLASSERT(m_wndClient.IsWindow()); - - RECT rect = { 0 }; - ::GetWindowRect(hWnd, &rect); - ::MapWindowPoints(NULL, m_wndClient.m_hWnd, (LPPOINT)&rect, 2); - ScrollToView(rect); - } - -// Implementation - overrideable methods - void UpdateLayout() - { - ATLASSERT(::IsWindow(m_hWnd)); - - if(m_bAutoSizeClient && m_wndClient.m_hWnd != NULL) - { - T* pT = static_cast(this); - RECT rect = { 0 }; - pT->GetContainerRect(rect); - - m_wndClient.SetWindowPos(NULL, &rect, SWP_NOZORDER | SWP_NOMOVE); - } - else - { - Invalidate(); - } - } - - void GetContainerRect(RECT& rect) - { - GetClientRect(&rect); - - if(rect.right < m_sizeAll.cx) - rect.right = m_sizeAll.cx; - - if(rect.bottom < m_sizeAll.cy) - rect.bottom = m_sizeAll.cy; - } -}; - -class CScrollContainer : public CScrollContainerImpl -{ -public: - DECLARE_WND_CLASS_EX(_T("WTL_ScrollContainer"), 0, -1) -}; - -}; // namespace WTL - -#endif // __ATLSCRL_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlsplit.h b/plugins/SmartAutoReplier/wtl/atlsplit.h deleted file mode 100644 index f94fa099e9..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlsplit.h +++ /dev/null @@ -1,917 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLSPLIT_H__ -#define __ATLSPLIT_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlsplit.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atlsplit.h requires atlwin.h to be included first -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CSplitterImpl -// CSplitterWindowImpl -// CSplitterWindowT - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CSplitterImpl - Provides splitter support to any window - -// Splitter panes constants -#define SPLIT_PANE_LEFT 0 -#define SPLIT_PANE_RIGHT 1 -#define SPLIT_PANE_TOP SPLIT_PANE_LEFT -#define SPLIT_PANE_BOTTOM SPLIT_PANE_RIGHT -#define SPLIT_PANE_NONE -1 - -// Splitter extended styles -#define SPLIT_PROPORTIONAL 0x00000001 -#define SPLIT_NONINTERACTIVE 0x00000002 -#define SPLIT_RIGHTALIGNED 0x00000004 -#define SPLIT_BOTTOMALIGNED SPLIT_RIGHTALIGNED -#define SPLIT_GRADIENTBAR 0x00000008 -#define SPLIT_FIXEDBARSIZE 0x00000010 - -// Note: SPLIT_PROPORTIONAL and SPLIT_RIGHTALIGNED/SPLIT_BOTTOMALIGNED are -// mutually exclusive. If both are set, splitter defaults to SPLIT_PROPORTIONAL - - -template -class CSplitterImpl -{ -public: - enum { m_nPanesCount = 2, m_nPropMax = 10000 }; - - HWND m_hWndPane[m_nPanesCount]; - RECT m_rcSplitter; - int m_xySplitterPos; - int m_nDefActivePane; - int m_cxySplitBar; // splitter bar width/height - static HCURSOR m_hCursor; - int m_cxyMin; // minimum pane size - int m_cxyBarEdge; // splitter bar edge - bool m_bFullDrag; - int m_cxyDragOffset; - int m_nProportionalPos; - bool m_bUpdateProportionalPos; - DWORD m_dwExtendedStyle; // splitter specific extended styles - int m_nSinglePane; // single pane mode - -// Constructor - CSplitterImpl() : - m_xySplitterPos(-1), m_nDefActivePane(SPLIT_PANE_NONE), - m_cxySplitBar(4), m_cxyMin(0), m_cxyBarEdge(0), m_bFullDrag(true), - m_cxyDragOffset(0), m_nProportionalPos(0), m_bUpdateProportionalPos(true), - m_dwExtendedStyle(SPLIT_PROPORTIONAL), - m_nSinglePane(SPLIT_PANE_NONE) - { - m_hWndPane[SPLIT_PANE_LEFT] = NULL; - m_hWndPane[SPLIT_PANE_RIGHT] = NULL; - - ::SetRectEmpty(&m_rcSplitter); - - if(m_hCursor == NULL) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CSplitterImpl::CSplitterImpl.\n")); - ATLASSERT(FALSE); - return; - } - - if(m_hCursor == NULL) - m_hCursor = ::LoadCursor(NULL, t_bVertical ? IDC_SIZEWE : IDC_SIZENS); - - lock.Unlock(); - } - } - -// Attributes - void SetSplitterRect(LPRECT lpRect = NULL, bool bUpdate = true) - { - if(lpRect == NULL) - { - T* pT = static_cast(this); - pT->GetClientRect(&m_rcSplitter); - } - else - { - m_rcSplitter = *lpRect; - } - - if(IsProportional()) - UpdateProportionalPos(); - else if(IsRightAligned()) - UpdateRightAlignPos(); - - if(bUpdate) - UpdateSplitterLayout(); - } - - void GetSplitterRect(LPRECT lpRect) const - { - ATLASSERT(lpRect != NULL); - *lpRect = m_rcSplitter; - } - - bool SetSplitterPos(int xyPos = -1, bool bUpdate = true) - { - if(xyPos == -1) // -1 == middle - { - if(t_bVertical) - xyPos = (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) / 2; - else - xyPos = (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge) / 2; - } - - // Adjust if out of valid range - int cxyMax = 0; - if(t_bVertical) - cxyMax = m_rcSplitter.right - m_rcSplitter.left; - else - cxyMax = m_rcSplitter.bottom - m_rcSplitter.top; - - if(xyPos < m_cxyMin + m_cxyBarEdge) - xyPos = m_cxyMin; - else if(xyPos > (cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin)) - xyPos = cxyMax - m_cxySplitBar - m_cxyBarEdge - m_cxyMin; - - // Set new position and update if requested - bool bRet = (m_xySplitterPos != xyPos); - m_xySplitterPos = xyPos; - - if(m_bUpdateProportionalPos) - { - if(IsProportional()) - StoreProportionalPos(); - else if(IsRightAligned()) - StoreRightAlignPos(); - } - else - { - m_bUpdateProportionalPos = true; - } - - if(bUpdate && bRet) - UpdateSplitterLayout(); - - return bRet; - } - - void SetSplitterPosPct(int nPct, bool bUpdate = true) - { - ATLASSERT(nPct >= 0 && nPct <= 100); - - m_nProportionalPos = ::MulDiv(nPct, m_nPropMax, 100); - UpdateProportionalPos(); - - if(bUpdate) - UpdateSplitterLayout(); - } - - int GetSplitterPos() const - { - return m_xySplitterPos; - } - - bool SetSinglePaneMode(int nPane = SPLIT_PANE_NONE) - { - ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT || nPane == SPLIT_PANE_NONE); - if(!(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT || nPane == SPLIT_PANE_NONE)) - return false; - - if(nPane != SPLIT_PANE_NONE) - { - if(!::IsWindowVisible(m_hWndPane[nPane])) - ::ShowWindow(m_hWndPane[nPane], SW_SHOW); - int nOtherPane = (nPane == SPLIT_PANE_LEFT) ? SPLIT_PANE_RIGHT : SPLIT_PANE_LEFT; - ::ShowWindow(m_hWndPane[nOtherPane], SW_HIDE); - if(m_nDefActivePane != nPane) - m_nDefActivePane = nPane; - } - else if(m_nSinglePane != SPLIT_PANE_NONE) - { - int nOtherPane = (m_nSinglePane == SPLIT_PANE_LEFT) ? SPLIT_PANE_RIGHT : SPLIT_PANE_LEFT; - ::ShowWindow(m_hWndPane[nOtherPane], SW_SHOW); - } - - m_nSinglePane = nPane; - UpdateSplitterLayout(); - return true; - } - - int GetSinglePaneMode() const - { - return m_nSinglePane; - } - - DWORD GetSplitterExtendedStyle() const - { - return m_dwExtendedStyle; - } - - DWORD SetSplitterExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwExtendedStyle; - if(dwMask == 0) - m_dwExtendedStyle = dwExtendedStyle; - else - m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); -#ifdef _DEBUG - if(IsProportional() && IsRightAligned()) - ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::SetSplitterExtendedStyle - SPLIT_PROPORTIONAL and SPLIT_RIGHTALIGNED are mutually exclusive, defaulting to SPLIT_PROPORTIONAL.\n")); -#endif // _DEBUG - return dwPrevStyle; - } - -// Splitter operations - void SetSplitterPanes(HWND hWndLeftTop, HWND hWndRightBottom, bool bUpdate = true) - { - m_hWndPane[SPLIT_PANE_LEFT] = hWndLeftTop; - m_hWndPane[SPLIT_PANE_RIGHT] = hWndRightBottom; - ATLASSERT(m_hWndPane[SPLIT_PANE_LEFT] == NULL || m_hWndPane[SPLIT_PANE_RIGHT] == NULL || m_hWndPane[SPLIT_PANE_LEFT] != m_hWndPane[SPLIT_PANE_RIGHT]); - if(bUpdate) - UpdateSplitterLayout(); - } - - bool SetSplitterPane(int nPane, HWND hWnd, bool bUpdate = true) - { - ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); - - if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT) - return false; - m_hWndPane[nPane] = hWnd; - ATLASSERT(m_hWndPane[SPLIT_PANE_LEFT] == NULL || m_hWndPane[SPLIT_PANE_RIGHT] == NULL || m_hWndPane[SPLIT_PANE_LEFT] != m_hWndPane[SPLIT_PANE_RIGHT]); - if(bUpdate) - UpdateSplitterLayout(); - return true; - } - - HWND GetSplitterPane(int nPane) const - { - ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); - - if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT) - return false; - return m_hWndPane[nPane]; - } - - bool SetActivePane(int nPane) - { - ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); - - if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT) - return false; - if(m_nSinglePane != SPLIT_PANE_NONE && nPane != m_nSinglePane) - return false; - ::SetFocus(m_hWndPane[nPane]); - m_nDefActivePane = nPane; - return true; - } - - int GetActivePane() const - { - int nRet = SPLIT_PANE_NONE; - HWND hWndFocus = ::GetFocus(); - if(hWndFocus != NULL) - { - for(int nPane = 0; nPane < m_nPanesCount; nPane++) - { - if(hWndFocus == m_hWndPane[nPane] || ::IsChild(m_hWndPane[nPane], hWndFocus)) - { - nRet = nPane; - break; - } - } - } - return nRet; - } - - bool ActivateNextPane(bool bNext = true) - { - int nPane = m_nSinglePane; - if(nPane == SPLIT_PANE_NONE) - { - switch(GetActivePane()) - { - case SPLIT_PANE_LEFT: - nPane = SPLIT_PANE_RIGHT; - break; - case SPLIT_PANE_RIGHT: - nPane = SPLIT_PANE_LEFT; - break; - default: - nPane = bNext ? SPLIT_PANE_LEFT : SPLIT_PANE_RIGHT; - break; - } - } - return SetActivePane(nPane); - } - - bool SetDefaultActivePane(int nPane) - { - ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); - - if(nPane != SPLIT_PANE_LEFT && nPane != SPLIT_PANE_RIGHT) - return false; - m_nDefActivePane = nPane; - return true; - } - - bool SetDefaultActivePane(HWND hWnd) - { - for(int nPane = 0; nPane < m_nPanesCount; nPane++) - { - if(hWnd == m_hWndPane[nPane]) - { - m_nDefActivePane = nPane; - return true; - } - } - return false; // not found - } - - int GetDefaultActivePane() const - { - return m_nDefActivePane; - } - - void DrawSplitter(CDCHandle dc) - { - ATLASSERT(dc.m_hDC != NULL); - if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1) - return; - - T* pT = static_cast(this); - if(m_nSinglePane == SPLIT_PANE_NONE) - { - pT->DrawSplitterBar(dc); - - for(int nPane = 0; nPane < m_nPanesCount; nPane++) - { - if(m_hWndPane[nPane] == NULL) - pT->DrawSplitterPane(dc, nPane); - } - } - else - { - if(m_hWndPane[m_nSinglePane] == NULL) - pT->DrawSplitterPane(dc, m_nSinglePane); - } - } - -// Overrideables - void DrawSplitterBar(CDCHandle dc) - { - RECT rect = { 0 }; - if(GetSplitterBarRect(&rect)) - { - dc.FillRect(&rect, COLOR_3DFACE); - -#if (!defined(_WIN32_WCE) || (_WIN32_WCE >= 420)) - if((m_dwExtendedStyle & SPLIT_GRADIENTBAR) != 0) - { - RECT rect2 = rect; - if(t_bVertical) - rect2.left = (rect.left + rect.right) / 2 - 1; - else - rect2.top = (rect.top + rect.bottom) / 2 - 1; - - dc.GradientFillRect(rect2, ::GetSysColor(COLOR_3DFACE), ::GetSysColor(COLOR_3DSHADOW), t_bVertical); - } -#endif // !defined(_WIN32_WCE) || (_WIN32_WCE >= 420) - - // draw 3D edge if needed - T* pT = static_cast(this); - if((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0) - dc.DrawEdge(&rect, EDGE_RAISED, t_bVertical ? (BF_LEFT | BF_RIGHT) : (BF_TOP | BF_BOTTOM)); - } - } - - // called only if pane is empty - void DrawSplitterPane(CDCHandle dc, int nPane) - { - RECT rect = { 0 }; - if(GetSplitterPaneRect(nPane, &rect)) - { - T* pT = static_cast(this); - if((pT->GetExStyle() & WS_EX_CLIENTEDGE) == 0) - dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST); - dc.FillRect(&rect, COLOR_APPWORKSPACE); - } - } - -// Message map and handlers - BEGIN_MSG_MAP(CSplitterImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_PAINT, OnPaint) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) -#endif // !_WIN32_WCE - if(IsInteractive()) - { - MESSAGE_HANDLER(WM_SETCURSOR, OnSetCursor) - MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove) - MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLButtonDown) - MESSAGE_HANDLER(WM_LBUTTONUP, OnLButtonUp) - MESSAGE_HANDLER(WM_LBUTTONDBLCLK, OnLButtonDoubleClick) - MESSAGE_HANDLER(WM_CAPTURECHANGED, OnCaptureChanged) - } - MESSAGE_HANDLER(WM_SETFOCUS, OnSetFocus) -#ifndef _WIN32_WCE - MESSAGE_HANDLER(WM_MOUSEACTIVATE, OnMouseActivate) -#endif // !_WIN32_WCE - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) - END_MSG_MAP() - - LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->GetSystemSettings(false); - - bHandled = FALSE; - return 1; - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - // try setting position if not set - if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1) - pT->SetSplitterPos(); - // do painting - CPaintDC dc(pT->m_hWnd); - pT->DrawSplitter(dc.m_hDC); - return 0; - } - - LRESULT OnSetCursor(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - if((HWND)wParam == pT->m_hWnd && LOWORD(lParam) == HTCLIENT) - { - DWORD dwPos = ::GetMessagePos(); - POINT ptPos = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) }; - pT->ScreenToClient(&ptPos); - if(IsOverSplitterBar(ptPos.x, ptPos.y)) - return 1; - } - - bHandled = FALSE; - return 0; - } - - LRESULT OnMouseMove(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - int xPos = GET_X_LPARAM(lParam); - int yPos = GET_Y_LPARAM(lParam); - if((wParam & MK_LBUTTON) && ::GetCapture() == pT->m_hWnd) - { - int xyNewSplitPos = 0; - if(t_bVertical) - xyNewSplitPos = xPos - m_rcSplitter.left - m_cxyDragOffset; - else - xyNewSplitPos = yPos - m_rcSplitter.top - m_cxyDragOffset; - - if(xyNewSplitPos == -1) // avoid -1, that means middle - xyNewSplitPos = -2; - - if(m_xySplitterPos != xyNewSplitPos) - { - if(m_bFullDrag) - { - if(pT->SetSplitterPos(xyNewSplitPos, true)) - pT->UpdateWindow(); - } - else - { - DrawGhostBar(); - pT->SetSplitterPos(xyNewSplitPos, false); - DrawGhostBar(); - } - } - } - else // not dragging, just set cursor - { - if(IsOverSplitterBar(xPos, yPos)) - ::SetCursor(m_hCursor); - bHandled = FALSE; - } - - return 0; - } - - LRESULT OnLButtonDown(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& bHandled) - { - int xPos = GET_X_LPARAM(lParam); - int yPos = GET_Y_LPARAM(lParam); - if(IsOverSplitterBar(xPos, yPos)) - { - T* pT = static_cast(this); - pT->SetCapture(); - ::SetCursor(m_hCursor); - if(!m_bFullDrag) - DrawGhostBar(); - if(t_bVertical) - m_cxyDragOffset = xPos - m_rcSplitter.left - m_xySplitterPos; - else - m_cxyDragOffset = yPos - m_rcSplitter.top - m_xySplitterPos; - } - bHandled = FALSE; - return 1; - } - - LRESULT OnLButtonUp(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - ::ReleaseCapture(); - bHandled = FALSE; - return 1; - } - - LRESULT OnLButtonDoubleClick(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->SetSplitterPos(); // middle - return 0; - } - - LRESULT OnCaptureChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - if(!m_bFullDrag) - { - DrawGhostBar(); - UpdateSplitterLayout(); - T* pT = static_cast(this); - pT->UpdateWindow(); - } - return 0; - } - - LRESULT OnSetFocus(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM, BOOL& bHandled) - { - if(m_nSinglePane == SPLIT_PANE_NONE) - { - if(m_nDefActivePane == SPLIT_PANE_LEFT || m_nDefActivePane == SPLIT_PANE_RIGHT) - ::SetFocus(m_hWndPane[m_nDefActivePane]); - } - else - { - ::SetFocus(m_hWndPane[m_nSinglePane]); - } - bHandled = FALSE; - return 1; - } - -#ifndef _WIN32_WCE - LRESULT OnMouseActivate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - LRESULT lRet = pT->DefWindowProc(uMsg, wParam, lParam); - if(lRet == MA_ACTIVATE || lRet == MA_ACTIVATEANDEAT) - { - DWORD dwPos = ::GetMessagePos(); - POINT pt = { GET_X_LPARAM(dwPos), GET_Y_LPARAM(dwPos) }; - pT->ScreenToClient(&pt); - RECT rcPane = { 0 }; - for(int nPane = 0; nPane < m_nPanesCount; nPane++) - { - if(GetSplitterPaneRect(nPane, &rcPane) && ::PtInRect(&rcPane, pt)) - { - m_nDefActivePane = nPane; - break; - } - } - } - return lRet; - } -#endif // !_WIN32_WCE - - LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->GetSystemSettings(true); - - return 0; - } - -// Implementation - internal helpers - void UpdateSplitterLayout() - { - if(m_nSinglePane == SPLIT_PANE_NONE && m_xySplitterPos == -1) - return; - - T* pT = static_cast(this); - RECT rect = { 0 }; - if(m_nSinglePane == SPLIT_PANE_NONE) - { - if(GetSplitterBarRect(&rect)) - pT->InvalidateRect(&rect); - - for(int nPane = 0; nPane < m_nPanesCount; nPane++) - { - if(GetSplitterPaneRect(nPane, &rect)) - { - if(m_hWndPane[nPane] != NULL) - ::SetWindowPos(m_hWndPane[nPane], NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER); - else - pT->InvalidateRect(&rect); - } - } - } - else - { - if(GetSplitterPaneRect(m_nSinglePane, &rect)) - { - if(m_hWndPane[m_nSinglePane] != NULL) - ::SetWindowPos(m_hWndPane[m_nSinglePane], NULL, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, SWP_NOZORDER); - else - pT->InvalidateRect(&rect); - } - } - } - - bool GetSplitterBarRect(LPRECT lpRect) const - { - ATLASSERT(lpRect != NULL); - if(m_nSinglePane != SPLIT_PANE_NONE || m_xySplitterPos == -1) - return false; - - if(t_bVertical) - { - lpRect->left = m_rcSplitter.left + m_xySplitterPos; - lpRect->top = m_rcSplitter.top; - lpRect->right = m_rcSplitter.left + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge; - lpRect->bottom = m_rcSplitter.bottom; - } - else - { - lpRect->left = m_rcSplitter.left; - lpRect->top = m_rcSplitter.top + m_xySplitterPos; - lpRect->right = m_rcSplitter.right; - lpRect->bottom = m_rcSplitter.top + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge; - } - - return true; - } - - bool GetSplitterPaneRect(int nPane, LPRECT lpRect) const - { - ATLASSERT(nPane == SPLIT_PANE_LEFT || nPane == SPLIT_PANE_RIGHT); - ATLASSERT(lpRect != NULL); - bool bRet = true; - if(m_nSinglePane != SPLIT_PANE_NONE) - { - if(nPane == m_nSinglePane) - *lpRect = m_rcSplitter; - else - bRet = false; - } - else if(nPane == SPLIT_PANE_LEFT) - { - if(t_bVertical) - { - lpRect->left = m_rcSplitter.left; - lpRect->top = m_rcSplitter.top; - lpRect->right = m_rcSplitter.left + m_xySplitterPos; - lpRect->bottom = m_rcSplitter.bottom; - } - else - { - lpRect->left = m_rcSplitter.left; - lpRect->top = m_rcSplitter.top; - lpRect->right = m_rcSplitter.right; - lpRect->bottom = m_rcSplitter.top + m_xySplitterPos; - } - } - else if(nPane == SPLIT_PANE_RIGHT) - { - if(t_bVertical) - { - lpRect->left = m_rcSplitter.left + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge; - lpRect->top = m_rcSplitter.top; - lpRect->right = m_rcSplitter.right; - lpRect->bottom = m_rcSplitter.bottom; - } - else - { - lpRect->left = m_rcSplitter.left; - lpRect->top = m_rcSplitter.top + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge; - lpRect->right = m_rcSplitter.right; - lpRect->bottom = m_rcSplitter.bottom; - } - } - else - { - bRet = false; - } - return bRet; - } - - bool IsOverSplitterRect(int x, int y) const - { - // -1 == don't check - return ((x == -1 || (x >= m_rcSplitter.left && x <= m_rcSplitter.right)) && - (y == -1 || (y >= m_rcSplitter.top && y <= m_rcSplitter.bottom))); - } - - bool IsOverSplitterBar(int x, int y) const - { - if(m_nSinglePane != SPLIT_PANE_NONE) - return false; - if(m_xySplitterPos == -1 || !IsOverSplitterRect(x, y)) - return false; - int xy = t_bVertical ? x : y; - int xyOff = t_bVertical ? m_rcSplitter.left : m_rcSplitter.top; - return ((xy >= (xyOff + m_xySplitterPos)) && (xy < xyOff + m_xySplitterPos + m_cxySplitBar + m_cxyBarEdge)); - } - - void DrawGhostBar() - { - RECT rect = { 0 }; - if(GetSplitterBarRect(&rect)) - { - // convert client to window coordinates - T* pT = static_cast(this); - RECT rcWnd = { 0 }; - pT->GetWindowRect(&rcWnd); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rcWnd, 2); - ::OffsetRect(&rect, -rcWnd.left, -rcWnd.top); - - // invert the brush pattern (looks just like frame window sizing) - CWindowDC dc(pT->m_hWnd); - CBrush brush = CDCHandle::GetHalftoneBrush(); - if(brush.m_hBrush != NULL) - { - CBrushHandle brushOld = dc.SelectBrush(brush); - dc.PatBlt(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, PATINVERT); - dc.SelectBrush(brushOld); - } - } - } - - void GetSystemSettings(bool bUpdate) - { - if((m_dwExtendedStyle & SPLIT_FIXEDBARSIZE) == 0) - { -#ifndef _WIN32_WCE - m_cxySplitBar = ::GetSystemMetrics(t_bVertical ? SM_CXSIZEFRAME : SM_CYSIZEFRAME); -#else // CE specific - m_cxySplitBar = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE); -#endif // _WIN32_WCE - } - - T* pT = static_cast(this); - if((pT->GetExStyle() & WS_EX_CLIENTEDGE)) - { - m_cxyBarEdge = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE); - m_cxyMin = 0; - } - else - { - m_cxyBarEdge = 0; - m_cxyMin = 2 * ::GetSystemMetrics(t_bVertical ? SM_CXEDGE : SM_CYEDGE); - } - -#ifndef _WIN32_WCE - ::SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, &m_bFullDrag, 0); -#endif // !_WIN32_WCE - - if(bUpdate) - UpdateSplitterLayout(); - } - - bool IsProportional() const - { - return ((m_dwExtendedStyle & SPLIT_PROPORTIONAL) != 0); - } - - void StoreProportionalPos() - { - int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge); - if(cxyTotal > 0) - m_nProportionalPos = ::MulDiv(m_xySplitterPos, m_nPropMax, cxyTotal); - else - m_nProportionalPos = 0; - ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::StoreProportionalPos - %i\n"), m_nProportionalPos); - } - - void UpdateProportionalPos() - { - int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge); - if(cxyTotal > 0) - { - int xyNewPos = ::MulDiv(m_nProportionalPos, cxyTotal, m_nPropMax); - m_bUpdateProportionalPos = false; - T* pT = static_cast(this); - pT->SetSplitterPos(xyNewPos, false); - } - } - - bool IsRightAligned() const - { - return ((m_dwExtendedStyle & SPLIT_RIGHTALIGNED) != 0); - } - - void StoreRightAlignPos() - { - int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge); - if(cxyTotal > 0) - m_nProportionalPos = cxyTotal - m_xySplitterPos; - else - m_nProportionalPos = 0; - ATLTRACE2(atlTraceUI, 0, _T("CSplitterImpl::StoreRightAlignPos - %i\n"), m_nProportionalPos); - } - - void UpdateRightAlignPos() - { - int cxyTotal = t_bVertical ? (m_rcSplitter.right - m_rcSplitter.left - m_cxySplitBar - m_cxyBarEdge) : (m_rcSplitter.bottom - m_rcSplitter.top - m_cxySplitBar - m_cxyBarEdge); - if(cxyTotal > 0) - { - m_bUpdateProportionalPos = false; - T* pT = static_cast(this); - pT->SetSplitterPos(cxyTotal - m_nProportionalPos, false); - } - } - - bool IsInteractive() const - { - return ((m_dwExtendedStyle & SPLIT_NONINTERACTIVE) == 0); - } -}; - -template HCURSOR CSplitterImpl< T, t_bVertical>::m_hCursor = NULL; - - -/////////////////////////////////////////////////////////////////////////////// -// CSplitterWindowImpl - Implements a splitter window - -template -class ATL_NO_VTABLE CSplitterWindowImpl : public ATL::CWindowImpl< T, TBase, TWinTraits >, public CSplitterImpl< T , t_bVertical > -{ -public: - DECLARE_WND_CLASS_EX(NULL, CS_DBLCLKS, COLOR_WINDOW) - - typedef CSplitterImpl< T , t_bVertical > _baseClass; - - BEGIN_MSG_MAP(CSplitterWindowImpl) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_SIZE, OnSize) - CHAIN_MSG_MAP(_baseClass) - FORWARD_NOTIFICATIONS() - END_MSG_MAP() - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - // handled, no background painting needed - return 1; - } - - LRESULT OnSize(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if(wParam != SIZE_MINIMIZED) - SetSplitterRect(); - - bHandled = FALSE; - return 1; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CSplitterWindow - Implements a splitter window to be used as is - -template -class CSplitterWindowT : public CSplitterWindowImpl, t_bVertical> -{ -public: - DECLARE_WND_CLASS_EX(_T("WTL_SplitterWindow"), CS_DBLCLKS, COLOR_WINDOW) -}; - -typedef CSplitterWindowT CSplitterWindow; -typedef CSplitterWindowT CHorSplitterWindow; - -}; // namespace WTL - -#endif // __ATLSPLIT_H__ diff --git a/plugins/SmartAutoReplier/wtl/atltheme.h b/plugins/SmartAutoReplier/wtl/atltheme.h deleted file mode 100644 index ff7ee59817..0000000000 --- a/plugins/SmartAutoReplier/wtl/atltheme.h +++ /dev/null @@ -1,1218 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLTHEME_H__ -#define __ATLTHEME_H__ - -#pragma once - -#ifdef _WIN32_WCE - #error atltheme.h is not supported on Windows CE -#endif - -#ifndef __ATLAPP_H__ - #error atltheme.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atltheme.h requires atlwin.h to be included first -#endif - -#if (_WIN32_WINNT < 0x0501) - #error atltheme.h requires _WIN32_WINNT >= 0x0501 -#endif // (_WIN32_WINNT < 0x0501) - -#if defined(_WTL_USE_VSSYM32) || (defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN)) - #include -#else - #ifndef TMSCHEMA_H - #include - #endif -#endif - -#ifndef _UXTHEME_H_ -#include -#endif -#pragma comment(lib, "uxtheme.lib") - -// Note: To create an application that also runs on older versions of Windows, -// use delay load of uxtheme.dll and ensure that no calls to the Theme API are -// made if theming is not supported. It is enough to check if m_hTheme is NULL. -// Example: -// if(m_hTheme != NULL) -// { -// DrawThemeBackground(dc, BP_PUSHBUTTON, PBS_NORMAL, &rect, NULL); -// DrawThemeText(dc, BP_PUSHBUTTON, PBS_NORMAL, L"Button", -1, DT_SINGLELINE | DT_CENTER | DT_VCENTER, 0, &rect); -// } -// else -// { -// dc.DrawFrameControl(&rect, DFC_BUTTON, DFCS_BUTTONPUSH); -// dc.DrawText(_T("Button"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); -// } -// -// Delay load is NOT AUTOMATIC for VC++ 7, you have to link to delayimp.lib, -// and add uxtheme.dll in the Linker.Input.Delay Loaded DLLs section of the -// project properties. -#if (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) - #pragma comment(lib, "delayimp.lib") - #pragma comment(linker, "/delayload:uxtheme.dll") -#endif // (_MSC_VER < 1300) && !defined(_WTL_NO_THEME_DELAYLOAD) - -// Hack: Signatures in uxtheme.h changed - the only way to check which variant of uxtheme.h -// is included is to check for presence of new defines MAX_THEMECOLOR and MAX_THEMESIZE -#ifndef _WTL_NEW_UXTHEME - #if defined(MAX_THEMECOLOR) && defined(MAX_THEMESIZE) - #define _WTL_NEW_UXTHEME - #endif // defined(MAX_THEMECOLOR) && defined(MAX_THEMESIZE) -#endif // _WTL_NEW_UXTHEME - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CTheme -// CThemeImpl -// -// CBufferedPaint -// CBufferedPaintImpl -// CBufferedPaintWindowImpl -// CBufferedAnimation -// CBufferedAnimationImpl -// CBufferedAnimationWindowImpl -// -// Global functions: -// AtlDrawThemeClientEdge() - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// CTheme - wrapper for theme handle - -class CTheme -{ -public: -// Data members - HTHEME m_hTheme; - static int m_nIsThemingSupported; - -// Constructor - CTheme(HTHEME hTheme = NULL) : m_hTheme(hTheme) - { - IsThemingSupported(); - } - -// Operators and helpers - bool IsThemeNull() const - { - return (m_hTheme == NULL); - } - - CTheme& operator =(HTHEME hTheme) - { - m_hTheme = hTheme; - return *this; - } - - operator HTHEME() const - { - return m_hTheme; - } - - void Attach(HTHEME hTheme) - { - m_hTheme = hTheme; - } - - HTHEME Detach() - { - HTHEME hTheme = m_hTheme; - m_hTheme = NULL; - return hTheme; - } - -// Theme support helper - static bool IsThemingSupported() - { - if(m_nIsThemingSupported == -1) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CTheme::IsThemingSupported.\n")); - ATLASSERT(FALSE); - return false; - } - - if(m_nIsThemingSupported == -1) - { - HMODULE hThemeDLL = ::LoadLibrary(_T("uxtheme.dll")); - m_nIsThemingSupported = (hThemeDLL != NULL) ? 1 : 0; - if(hThemeDLL != NULL) - ::FreeLibrary(hThemeDLL); - } - - lock.Unlock(); - } - - ATLASSERT(m_nIsThemingSupported != -1); - return (m_nIsThemingSupported == 1); - } - -// Operations and theme properties - HTHEME OpenThemeData(HWND hWnd, LPCWSTR pszClassList) - { - if(!IsThemingSupported()) - return NULL; - - ATLASSERT(m_hTheme == NULL); - m_hTheme = ::OpenThemeData(hWnd, pszClassList); - return m_hTheme; - } - - HRESULT CloseThemeData() - { - HRESULT hRet = S_FALSE; - if(m_hTheme != NULL) - { - hRet = ::CloseThemeData(m_hTheme); - if(SUCCEEDED(hRet)) - m_hTheme = NULL; - } - return hRet; - } - - HRESULT DrawThemeBackground(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, LPCRECT pClipRect = NULL) - { - ATLASSERT(m_hTheme != NULL); - return ::DrawThemeBackground(m_hTheme, hDC, nPartID, nStateID, pRect, pClipRect); - } - - HRESULT DrawThemeBackgroundEx(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, const DTBGOPTS* pOptions = NULL) - { - ATLASSERT(m_hTheme != NULL); - return ::DrawThemeBackgroundEx(m_hTheme, hDC, nPartID, nStateID, pRect, pOptions); - } - - HRESULT DrawThemeText(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, DWORD dwTextFlags2, LPCRECT pRect) - { - ATLASSERT(m_hTheme != NULL); - return ::DrawThemeText(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, dwTextFlags2, pRect); - } - - HRESULT GetThemeBackgroundContentRect(HDC hDC, int nPartID, int nStateID, LPCRECT pBoundingRect, LPRECT pContentRect) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeBackgroundContentRect(m_hTheme, hDC, nPartID, nStateID, pBoundingRect, pContentRect); - } - - HRESULT GetThemeBackgroundExtent(HDC hDC, int nPartID, int nStateID, LPCRECT pContentRect, LPRECT pExtentRect) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeBackgroundExtent(m_hTheme, hDC, nPartID, nStateID, pContentRect, pExtentRect); - } - - HRESULT GetThemePartSize(HDC hDC, int nPartID, int nStateID, LPRECT pRect, enum THEMESIZE eSize, LPSIZE pSize) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemePartSize(m_hTheme, hDC, nPartID, nStateID, pRect, eSize, pSize); - } - - HRESULT GetThemeTextExtent(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int nCharCount, DWORD dwTextFlags, LPCRECT pBoundingRect, LPRECT pExtentRect) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeTextExtent(m_hTheme, hDC, nPartID, nStateID, pszText, nCharCount, dwTextFlags, pBoundingRect, pExtentRect); - } - - HRESULT GetThemeTextMetrics(HDC hDC, int nPartID, int nStateID, PTEXTMETRICW pTextMetric) const - { - ATLASSERT(m_hTheme != NULL); -#ifdef _WTL_NEW_UXTHEME - return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, pTextMetric); -#else // !_WTL_NEW_UXTHEME - // Note: The cast to PTEXTMETRIC is because uxtheme.h incorrectly uses it instead of PTEXTMETRICW - return ::GetThemeTextMetrics(m_hTheme, hDC, nPartID, nStateID, (PTEXTMETRIC)pTextMetric); -#endif // !_WTL_NEW_UXTHEME - } - - HRESULT GetThemeBackgroundRegion(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HRGN* pRegion) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeBackgroundRegion(m_hTheme, hDC, nPartID, nStateID, pRect, pRegion); - } - - HRESULT HitTestThemeBackground(HDC hDC, int nPartID, int nStateID, DWORD dwOptions, LPCRECT pRect, HRGN hrgn, POINT ptTest, WORD* pwHitTestCode) const - { - ATLASSERT(m_hTheme != NULL); - return ::HitTestThemeBackground(m_hTheme, hDC, nPartID, nStateID, dwOptions, pRect, hrgn, ptTest, pwHitTestCode); - } - - HRESULT DrawThemeEdge(HDC hDC, int nPartID, int nStateID, LPCRECT pDestRect, UINT uEdge, UINT uFlags, LPRECT pContentRect = NULL) - { - ATLASSERT(m_hTheme != NULL); - return ::DrawThemeEdge(m_hTheme, hDC, nPartID, nStateID, pDestRect, uEdge, uFlags, pContentRect); - } - - HRESULT DrawThemeIcon(HDC hDC, int nPartID, int nStateID, LPCRECT pRect, HIMAGELIST himl, int nImageIndex) - { - ATLASSERT(m_hTheme != NULL); - return ::DrawThemeIcon(m_hTheme, hDC, nPartID, nStateID, pRect, himl, nImageIndex); - } - - BOOL IsThemePartDefined(int nPartID, int nStateID) const - { - ATLASSERT(m_hTheme != NULL); - return ::IsThemePartDefined(m_hTheme, nPartID, nStateID); - } - - BOOL IsThemeBackgroundPartiallyTransparent(int nPartID, int nStateID) const - { - ATLASSERT(m_hTheme != NULL); - return ::IsThemeBackgroundPartiallyTransparent(m_hTheme, nPartID, nStateID); - } - - HRESULT GetThemeColor(int nPartID, int nStateID, int nPropID, COLORREF* pColor) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeColor(m_hTheme, nPartID, nStateID, nPropID, pColor); - } - - HRESULT GetThemeMetric(HDC hDC, int nPartID, int nStateID, int nPropID, int* pnVal) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeMetric(m_hTheme, hDC, nPartID, nStateID, nPropID, pnVal); - } - - HRESULT GetThemeString(int nPartID, int nStateID, int nPropID, LPWSTR pszBuff, int cchMaxBuffChars) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeString(m_hTheme, nPartID, nStateID, nPropID, pszBuff, cchMaxBuffChars); - } - - HRESULT GetThemeBool(int nPartID, int nStateID, int nPropID, BOOL* pfVal) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeBool(m_hTheme, nPartID, nStateID, nPropID, pfVal); - } - - HRESULT GetThemeInt(int nPartID, int nStateID, int nPropID, int* pnVal) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeInt(m_hTheme, nPartID, nStateID, nPropID, pnVal); - } - - HRESULT GetThemeEnumValue(int nPartID, int nStateID, int nPropID, int* pnVal) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeEnumValue(m_hTheme, nPartID, nStateID, nPropID, pnVal); - } - - HRESULT GetThemePosition(int nPartID, int nStateID, int nPropID, LPPOINT pPoint) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemePosition(m_hTheme, nPartID, nStateID, nPropID, pPoint); - } - - // deprecated - HRESULT GetThemeFont(int nPartID, HDC hDC, int nStateID, int nPropID, LOGFONTW* pFont) const - { - ATLASSERT(m_hTheme != NULL); -#ifdef _WTL_NEW_UXTHEME - return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont); -#else // !_WTL_NEW_UXTHEME - // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW* - return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, (LOGFONT*)pFont); -#endif // !_WTL_NEW_UXTHEME - } - - HRESULT GetThemeFont(HDC hDC, int nPartID, int nStateID, int nPropID, LOGFONTW* pFont) const - { - ATLASSERT(m_hTheme != NULL); -#ifdef _WTL_NEW_UXTHEME - return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, pFont); -#else // !_WTL_NEW_UXTHEME - // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW* - return ::GetThemeFont(m_hTheme, hDC, nPartID, nStateID, nPropID, (LOGFONT*)pFont); -#endif // !_WTL_NEW_UXTHEME - } - - HRESULT GetThemeRect(int nPartID, int nStateID, int nPropID, LPRECT pRect) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeRect(m_hTheme, nPartID, nStateID, nPropID, pRect); - } - - HRESULT GetThemeMargins(HDC hDC, int nPartID, int nStateID, int nPropID, LPRECT pRect, PMARGINS pMargins) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeMargins(m_hTheme, hDC, nPartID, nStateID, nPropID, pRect, pMargins); - } - - HRESULT GetThemeIntList(int nPartID, int nStateID, int nPropID, INTLIST* pIntList) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeIntList(m_hTheme, nPartID, nStateID, nPropID, pIntList); - } - - HRESULT GetThemePropertyOrigin(int nPartID, int nStateID, int nPropID, enum PROPERTYORIGIN* pOrigin) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemePropertyOrigin(m_hTheme, nPartID, nStateID, nPropID, pOrigin); - } - - HRESULT GetThemeFilename(int nPartID, int nStateID, int nPropID, LPWSTR pszThemeFileName, int cchMaxBuffChars) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeFilename(m_hTheme, nPartID, nStateID, nPropID, pszThemeFileName, cchMaxBuffChars); - } - - COLORREF GetThemeSysColor(int nColorID) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysColor(m_hTheme, nColorID); - } - - HBRUSH GetThemeSysColorBrush(int nColorID) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysColorBrush(m_hTheme, nColorID); - } - - int GetThemeSysSize(int nSizeID) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysSize(m_hTheme, nSizeID); - } - - BOOL GetThemeSysBool(int nBoolID) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysBool(m_hTheme, nBoolID); - } - - HRESULT GetThemeSysFont(int nFontID, LOGFONTW* plf) const - { - ATLASSERT(m_hTheme != NULL); -#ifdef _WTL_NEW_UXTHEME - return ::GetThemeSysFont(m_hTheme, nFontID, plf); -#else // !_WTL_NEW_UXTHEME - // Note: The cast to LOGFONT* is because uxtheme.h incorrectly uses it instead of LOGFONTW* - return ::GetThemeSysFont(m_hTheme, nFontID, (LOGFONT*)plf); -#endif // !_WTL_NEW_UXTHEME - } - - HRESULT GetThemeSysString(int nStringID, LPWSTR pszStringBuff, int cchMaxStringChars) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysString(m_hTheme, nStringID, pszStringBuff, cchMaxStringChars); - } - - HRESULT GetThemeSysInt(int nIntID, int* pnValue) const - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeSysInt(m_hTheme, nIntID, pnValue); - } - -#ifdef _WTL_NEW_UXTHEME - HTHEME OpenThemeDataEx(HWND hWnd, LPCWSTR pszClassList, DWORD dwFlags) - { - if(!IsThemingSupported()) - return NULL; - - ATLASSERT(m_hTheme == NULL); - m_hTheme = ::OpenThemeDataEx(hWnd, pszClassList, dwFlags); - return m_hTheme; - } - - HRESULT DrawThemeTextEx(HDC hDC, int nPartID, int nStateID, LPCWSTR pszText, int cchText, DWORD dwTextFlags, LPRECT lpRect, const DTTOPTS* pOptions) - { - ATLASSERT(m_hTheme != NULL); - return ::DrawThemeTextEx(m_hTheme, hDC, nPartID, nStateID, pszText, cchText, dwTextFlags, lpRect, pOptions); - } - - HRESULT GetThemeTransitionDuration(int nPartID, int nFromStateID, int nToStateID, int nPropID, DWORD& dwDuration) - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeTransitionDuration(m_hTheme, nPartID, nFromStateID, nToStateID, nPropID, &dwDuration); - } -#endif // _WTL_NEW_UXTHEME - -#if (_WIN32_WINNT >= 0x0600) - HRESULT GetThemeBitmap(int nPartID, int nStateID, int nPropID, ULONG uFlags, HBITMAP& hBitmap) - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeBitmap(m_hTheme, nPartID, nStateID, nPropID, uFlags, &hBitmap); - } - - HRESULT GetThemeStream(int nPartID, int nStateID, int nPropID, VOID** ppvStream, DWORD* pcbStream, HINSTANCE hInstance) - { - ATLASSERT(m_hTheme != NULL); - return ::GetThemeStream(m_hTheme, nPartID, nStateID, nPropID, ppvStream, pcbStream, hInstance); - } -#endif // (_WIN32_WINNT >= 0x0600) -}; - -__declspec(selectany) int CTheme::m_nIsThemingSupported = -1; - - -/////////////////////////////////////////////////////////////////////////////// -// CThemeImpl - theme support implementation - -// Derive from this class to implement window with theme support. -// Example: -// class CMyThemeWindow : public CWindowImpl, public CThemeImpl -// { -// ... -// BEGIN_MSG_MAP(CMyThemeWindow) -// CHAIN_MSG_MAP(CThemeImpl) -// ... -// END_MSG_MAP() -// ... -// }; -// -// If you set theme class list, the class will automaticaly open/close/reopen theme data. - - -// Helper for drawing theme client edge -inline bool AtlDrawThemeClientEdge(HTHEME hTheme, HWND hWnd, HRGN hRgnUpdate = NULL, HBRUSH hBrush = NULL, int nPartID = 0, int nStateID = 0) -{ - ATLASSERT(hTheme != NULL); - ATLASSERT(::IsWindow(hWnd)); - - CWindowDC dc(hWnd); - if(dc.IsNull()) - return false; - - // Get border size - int cxBorder = GetSystemMetrics(SM_CXBORDER); - int cyBorder = GetSystemMetrics(SM_CYBORDER); - if(SUCCEEDED(::GetThemeInt(hTheme, nPartID, nStateID, TMT_SIZINGBORDERWIDTH, &cxBorder))) - cyBorder = cxBorder; - - RECT rect; - ::GetWindowRect(hWnd, &rect); - - // Remove the client edge from the update region - int cxEdge = GetSystemMetrics(SM_CXEDGE); - int cyEdge = GetSystemMetrics(SM_CYEDGE); - ::InflateRect(&rect, -cxEdge, -cyEdge); - CRgn rgn; - rgn.CreateRectRgnIndirect(&rect); - if(rgn.IsNull()) - return false; - - if(hRgnUpdate != NULL) - rgn.CombineRgn(hRgnUpdate, rgn, RGN_AND); - - ::OffsetRect(&rect, -rect.left, -rect.top); - - ::OffsetRect(&rect, cxEdge, cyEdge); - dc.ExcludeClipRect(&rect); - ::InflateRect(&rect, cxEdge, cyEdge); - - ::DrawThemeBackground(hTheme, dc, nPartID, nStateID, &rect, NULL); - - // Use background brush too, since theme border might not cover everything - if(cxBorder < cxEdge && cyBorder < cyEdge) - { - if(hBrush == NULL) -// need conditional code because types don't match in winuser.h -#ifdef _WIN64 - hBrush = (HBRUSH)::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND); -#else - hBrush = (HBRUSH)UlongToPtr(::GetClassLongPtr(hWnd, GCLP_HBRBACKGROUND)); -#endif - - ::InflateRect(&rect, cxBorder - cxEdge, cyBorder - cyEdge); - dc.FillRect(&rect, hBrush); - } - - ::DefWindowProc(hWnd, WM_NCPAINT, (WPARAM)rgn.m_hRgn, 0L); - - return true; -} - - -// Theme extended styles -#define THEME_EX_3DCLIENTEDGE 0x00000001 -#define THEME_EX_THEMECLIENTEDGE 0x00000002 - -template -class CThemeImpl : public TBase -{ -public: -// Data members - LPWSTR m_lpstrThemeClassList; - DWORD m_dwExtendedStyle; // theme specific extended styles - -// Constructor & destructor - CThemeImpl() : m_lpstrThemeClassList(NULL), m_dwExtendedStyle(0) - { } - - ~CThemeImpl() - { - delete [] m_lpstrThemeClassList; - } - -// Attributes - bool SetThemeClassList(LPCWSTR lpstrThemeClassList) - { - if(m_lpstrThemeClassList != NULL) - { - delete [] m_lpstrThemeClassList; - m_lpstrThemeClassList = NULL; - } - - if(lpstrThemeClassList == NULL) - return true; - - int cchLen = lstrlenW(lpstrThemeClassList) + 1; - ATLTRY(m_lpstrThemeClassList = new WCHAR[cchLen]); - if(m_lpstrThemeClassList == NULL) - return false; - - SecureHelper::strcpyW_x(m_lpstrThemeClassList, cchLen, lpstrThemeClassList); - - return true; - } - - bool GetThemeClassList(LPWSTR lpstrThemeClassList, int cchListBuffer) const - { - int cchLen = lstrlenW(m_lpstrThemeClassList) + 1; - if(cchListBuffer < cchLen) - return false; - - SecureHelper::strcpyW_x(lpstrThemeClassList, cchListBuffer, m_lpstrThemeClassList); - - return true; - } - - LPCWSTR GetThemeClassList() const - { - return m_lpstrThemeClassList; - } - - DWORD SetThemeExtendedStyle(DWORD dwExtendedStyle, DWORD dwMask = 0) - { - DWORD dwPrevStyle = m_dwExtendedStyle; - if(dwMask == 0) - m_dwExtendedStyle = dwExtendedStyle; - else - m_dwExtendedStyle = (m_dwExtendedStyle & ~dwMask) | (dwExtendedStyle & dwMask); - return dwPrevStyle; - } - - DWORD GetThemeExtendedStyle() const - { - return m_dwExtendedStyle; - } - -// Operations - HTHEME OpenThemeData() - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - ATLASSERT(m_lpstrThemeClassList != NULL); - if(m_lpstrThemeClassList == NULL) - return NULL; - CloseThemeData(); - return TBase::OpenThemeData(pT->m_hWnd, m_lpstrThemeClassList); - } - - HTHEME OpenThemeData(LPCWSTR pszClassList) - { - if(!SetThemeClassList(pszClassList)) - return NULL; - return OpenThemeData(); - } - - HRESULT SetWindowTheme(LPCWSTR pszSubAppName, LPCWSTR pszSubIDList) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::SetWindowTheme(pT->m_hWnd, pszSubAppName, pszSubIDList); - } - - HTHEME GetWindowTheme() const - { - if(!IsThemingSupported()) - return NULL; - - const T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::GetWindowTheme(pT->m_hWnd); - } - - HRESULT EnableThemeDialogTexture(DWORD dwFlags) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::EnableThemeDialogTexture(pT->m_hWnd, dwFlags); - } - - BOOL IsThemeDialogTextureEnabled() const - { - if(!IsThemingSupported()) - return FALSE; - - const T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::IsThemeDialogTextureEnabled(pT->m_hWnd); - } - - HRESULT DrawThemeParentBackground(HDC hDC, const RECT* pRect = NULL) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); -#ifdef _WTL_NEW_UXTHEME - return ::DrawThemeParentBackground(pT->m_hWnd, hDC, pRect); -#else - return ::DrawThemeParentBackground(pT->m_hWnd, hDC, (RECT*)pRect); -#endif - } - -#ifdef _WTL_NEW_UXTHEME - HRESULT SetWindowThemeAttribute(WINDOWTHEMEATTRIBUTETYPE type, PVOID pvAttribute, DWORD cbAttribute) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::SetWindowThemeAttribute(pT->m_hWnd, type, pvAttribute, cbAttribute); - } - - HRESULT SetWindowThemeNonClientAttributes(DWORD dwAttributes, DWORD dwMask) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - WTA_OPTIONS opt = { dwAttributes, dwMask }; - return ::SetWindowThemeAttribute(pT->m_hWnd, WTA_NONCLIENT, (PVOID)&opt, sizeof(opt)); - } - - HRESULT DrawThemeParentBackgroundEx(HDC hDC, DWORD dwFlags, const RECT* lpRect = NULL) - { - if(!IsThemingSupported()) - return S_FALSE; - - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - return ::DrawThemeParentBackgroundEx(pT->m_hWnd, hDC, dwFlags, lpRect); - } -#endif // _WTL_NEW_UXTHEME - -// Message map and handlers - // Note: If you handle any of these messages in your derived class, - // it is better to put CHAIN_MSG_MAP at the start of your message map. - BEGIN_MSG_MAP(CThemeImpl) - MESSAGE_HANDLER(WM_CREATE, OnCreate) - MESSAGE_HANDLER(WM_DESTROY, OnDestroy) - MESSAGE_HANDLER(WM_THEMECHANGED, OnThemeChanged) - MESSAGE_HANDLER(WM_NCPAINT, OnNcPaint) - END_MSG_MAP() - - LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if(m_lpstrThemeClassList != NULL) - OpenThemeData(); - bHandled = FALSE; - return 1; - } - - LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - CloseThemeData(); - bHandled = FALSE; - return 1; - } - - LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - CloseThemeData(); - if(m_lpstrThemeClassList != NULL) - OpenThemeData(); - bHandled = FALSE; - return 1; - } - - LRESULT OnNcPaint(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - LRESULT lRet = 0; - bHandled = FALSE; - if(IsThemingSupported() && ((pT->GetExStyle() & WS_EX_CLIENTEDGE) != 0)) - { - if((m_dwExtendedStyle & THEME_EX_3DCLIENTEDGE) != 0) - { - lRet = ::DefWindowProc(pT->m_hWnd, uMsg, wParam, lParam); - bHandled = TRUE; - } - else if((m_hTheme != NULL) && ((m_dwExtendedStyle & THEME_EX_THEMECLIENTEDGE) != 0)) - { - HRGN hRgn = (wParam != 1) ? (HRGN)wParam : NULL; - if(pT->DrawThemeClientEdge(hRgn)) - bHandled = TRUE; - } - } - return lRet; - } - -// Drawing helper - bool DrawThemeClientEdge(HRGN hRgnUpdate) - { - T* pT = static_cast(this); - return AtlDrawThemeClientEdge(m_hTheme, pT->m_hWnd, hRgnUpdate, NULL, 0, 0); - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// Buffered Paint and Animation - -#ifdef _WTL_NEW_UXTHEME - -/////////////////////////////////////////////////////////////////////////////// -// CBufferedPaintBase - Buffered Paint support for othe classes - -class CBufferedPaintBase -{ -public: - static int m_nIsBufferedPaintSupported; - - CBufferedPaintBase() - { - if(IsBufferedPaintSupported()) - ATLVERIFY(SUCCEEDED(::BufferedPaintInit())); - } - - ~CBufferedPaintBase() - { - if(IsBufferedPaintSupported()) - ATLVERIFY(SUCCEEDED(::BufferedPaintUnInit())); - } - - static bool IsBufferedPaintSupported() - { - if(m_nIsBufferedPaintSupported == -1) - { - CStaticDataInitCriticalSectionLock lock; - if(FAILED(lock.Lock())) - { - ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CBufferedPaintBase::IsBufferedPaintSupported.\n")); - ATLASSERT(FALSE); - return false; - } - - if(m_nIsBufferedPaintSupported == -1) - m_nIsBufferedPaintSupported = RunTimeHelper::IsVista() ? 1 : 0; - - lock.Unlock(); - } - - ATLASSERT(m_nIsBufferedPaintSupported != -1); - return (m_nIsBufferedPaintSupported == 1); - } -}; - -__declspec(selectany) int CBufferedPaintBase::m_nIsBufferedPaintSupported = -1; - - -/////////////////////////////////////////////////////////////////////////////// -// CBufferedPaint - support for buffered paint functions - -class CBufferedPaint -{ -public: - HPAINTBUFFER m_hPaintBuffer; - - CBufferedPaint() : m_hPaintBuffer(NULL) - { } - - ~CBufferedPaint() - { - ATLVERIFY(SUCCEEDED(End())); - } - - bool IsNull() const - { - return (m_hPaintBuffer == NULL); - } - - HPAINTBUFFER Begin(HDC hdcTarget, const RECT* prcTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS* pPaintParams, HDC* phdcPaint) - { - ATLASSERT(m_hPaintBuffer == NULL); - m_hPaintBuffer = ::BeginBufferedPaint(hdcTarget, prcTarget, dwFormat, pPaintParams, phdcPaint); - return m_hPaintBuffer; - } - - HRESULT End(BOOL bUpdate = TRUE) - { - HRESULT hRet = S_FALSE; - if(m_hPaintBuffer != NULL) - { - hRet = ::EndBufferedPaint(m_hPaintBuffer, bUpdate); - m_hPaintBuffer = NULL; - } - return hRet; - } - - HRESULT GetTargetRect(LPRECT pRect) const - { - ATLASSERT(m_hPaintBuffer != NULL); - return ::GetBufferedPaintTargetRect(m_hPaintBuffer, pRect); - } - - HDC GetTargetDC() const - { - ATLASSERT(m_hPaintBuffer != NULL); - return ::GetBufferedPaintTargetDC(m_hPaintBuffer); - } - - HDC GetPaintDC() const - { - ATLASSERT(m_hPaintBuffer != NULL); - return ::GetBufferedPaintDC(m_hPaintBuffer); - } - - HRESULT GetBits(RGBQUAD** ppbBuffer, int* pcxRow) const - { - ATLASSERT(m_hPaintBuffer != NULL); - return ::GetBufferedPaintBits(m_hPaintBuffer, ppbBuffer, pcxRow); - } - - HRESULT Clear(const RECT* pRect = NULL) - { - ATLASSERT(m_hPaintBuffer != NULL); - return ::BufferedPaintClear(m_hPaintBuffer, pRect); - } - - HRESULT SetAlpha(BYTE alpha, const RECT* pRect = NULL) - { - ATLASSERT(m_hPaintBuffer != NULL); - return ::BufferedPaintSetAlpha(m_hPaintBuffer, pRect, alpha); - } - - HRESULT MakeOpaque(const RECT* pRect = NULL) - { - ATLASSERT(m_hPaintBuffer != NULL); - return ::BufferedPaintSetAlpha(m_hPaintBuffer, pRect, 255); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CBufferedPaintImpl - provides buffered paint for any window - -template -class ATL_NO_VTABLE CBufferedPaintImpl : public CBufferedPaintBase -{ -public: - CBufferedPaint m_BufferedPaint; - BP_BUFFERFORMAT m_dwFormat; - BP_PAINTPARAMS m_PaintParams; - - CBufferedPaintImpl() : m_dwFormat(BPBF_TOPDOWNDIB) - { - memset(&m_PaintParams, 0, sizeof(BP_PAINTPARAMS)); - m_PaintParams.cbSize = sizeof(BP_PAINTPARAMS); - } - -// Message map and handlers - BEGIN_MSG_MAP(CBufferedPaintImpl) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_PAINT, OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) - END_MSG_MAP() - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; // no background needed - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - if(wParam != NULL) - { - RECT rect = { 0 }; - pT->GetClientRect(&rect); - pT->DoPaint((HDC)wParam, rect); - } - else - { - CPaintDC dc(pT->m_hWnd); - pT->DoBufferedPaint(dc.m_hDC, dc.m_ps.rcPaint); - } - - return 0; - } - -// Overrideables - void DoBufferedPaint(CDCHandle dc, RECT& rect) - { - HDC hDCPaint = NULL; - if(IsBufferedPaintSupported()) - m_BufferedPaint.Begin(dc, &rect, m_dwFormat, &m_PaintParams, &hDCPaint); - - T* pT = static_cast(this); - if(hDCPaint != NULL) - pT->DoPaint(hDCPaint, rect); - else - pT->DoPaint(dc.m_hDC, rect); - - if(IsBufferedPaintSupported()) - m_BufferedPaint.End(); - } - - void DoPaint(CDCHandle /*dc*/, RECT& /*rect*/) - { - // must be implemented in a derived class - ATLASSERT(FALSE); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CBufferedPaintWindowImpl - implements a window that uses buffered paint - -template -class ATL_NO_VTABLE CBufferedPaintWindowImpl : - public ATL::CWindowImpl, - public CBufferedPaintImpl< T > -{ -public: - BEGIN_MSG_MAP(CBufferedPaintWindowImpl) - CHAIN_MSG_MAP(CBufferedPaintImpl< T >) - END_MSG_MAP() -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CBufferedAnimation - support for buffered animation - -class CBufferedAnimation -{ -public: - HANIMATIONBUFFER m_hAnimationBuffer; - - CBufferedAnimation() : m_hAnimationBuffer(NULL) - { } - - ~CBufferedAnimation() - { - ATLVERIFY(SUCCEEDED(End())); - } - - bool IsNull() const - { - return (m_hAnimationBuffer == NULL); - } - - HANIMATIONBUFFER Begin(HWND hWnd, HDC hDCTarget, const RECT* pRectTarget, BP_BUFFERFORMAT dwFormat, BP_PAINTPARAMS* pPaintParams, BP_ANIMATIONPARAMS* pAnimationParams, HDC* phdcFrom, HDC* phdcTo) - { - ATLASSERT(m_hAnimationBuffer == NULL); - m_hAnimationBuffer = ::BeginBufferedAnimation(hWnd, hDCTarget, pRectTarget, dwFormat, pPaintParams, pAnimationParams, phdcFrom, phdcTo); - return m_hAnimationBuffer; - } - - HRESULT End(BOOL bUpdate = TRUE) - { - HRESULT hRet = S_FALSE; - if(m_hAnimationBuffer != NULL) - { - hRet = ::EndBufferedAnimation(m_hAnimationBuffer, bUpdate); - m_hAnimationBuffer = NULL; - } - return hRet; - } - - static bool IsRendering(HWND hWnd, HDC hDC) - { - return (::BufferedPaintRenderAnimation(hWnd, hDC) != FALSE); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CBufferedAnimationImpl - provides buffered animation support for any window - -// Note: You can either use m_State and m_NewState to store the state information -// for the animation change, or map your state to those data members. DoPaint() -// should only rely on the state information that is passed to it. - -template -class ATL_NO_VTABLE CBufferedAnimationImpl : public CBufferedPaintBase -{ -public: - BP_BUFFERFORMAT m_dwFormat; - BP_PAINTPARAMS m_PaintParams; - BP_ANIMATIONPARAMS m_AnimationParams; - - TState m_State; - TState m_NewState; - - CBufferedAnimationImpl(TState InitialState) : m_dwFormat(BPBF_TOPDOWNDIB) - { - memset(&m_PaintParams, 0, sizeof(BP_PAINTPARAMS)); - m_PaintParams.cbSize = sizeof(BP_PAINTPARAMS); - - memset(&m_AnimationParams, 0, sizeof(BP_ANIMATIONPARAMS)); - m_AnimationParams.cbSize = sizeof(BP_ANIMATIONPARAMS); - m_AnimationParams.style = BPAS_LINEAR; - m_AnimationParams.dwDuration = 500; - - T* pT = static_cast(this); - pT->SetState(InitialState); - pT->SetNewState(InitialState); - } - - DWORD GetDuration() const - { - return m_AnimationParams.dwDuration; - } - - void SetDuration(DWORD dwDuration) - { - m_AnimationParams.dwDuration = dwDuration; - } - - void DoAnimation(TState NewState, const RECT* pRect = NULL) - { - T* pT = static_cast(this); - pT->SetNewState(NewState); - - pT->InvalidateRect(pRect, FALSE); - pT->UpdateWindow(); - - pT->SetState(NewState); - } - -// Message map and handlers - BEGIN_MSG_MAP(CBufferedAnimationImpl) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBackground) - MESSAGE_HANDLER(WM_PAINT, OnPaint) - MESSAGE_HANDLER(WM_PRINTCLIENT, OnPaint) - END_MSG_MAP() - - LRESULT OnEraseBackground(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - return 1; // no background needed - } - - LRESULT OnPaint(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - if(wParam != NULL) - { - RECT rect = { 0 }; - pT->GetClientRect(&rect); - pT->DoPaint((HDC)wParam, rect, m_NewState); - } - else - { - CPaintDC dc(pT->m_hWnd); - pT->DoAnimationPaint(dc.m_hDC, dc.m_ps.rcPaint); - } - - return 0; - } - -// Overrideables - void SetState(TState State) - { - m_State = State; - } - - void SetNewState(TState State) - { - m_NewState = State; - } - - bool AreStatesEqual() const - { - return (m_State == m_NewState); - } - - void DoAnimationPaint(CDCHandle dc, RECT& rect) - { - T* pT = static_cast(this); - if(IsBufferedPaintSupported() && CBufferedAnimation::IsRendering(pT->m_hWnd, dc)) - return; - - DWORD dwDurationSave = m_AnimationParams.dwDuration; - if(pT->AreStatesEqual()) - m_AnimationParams.dwDuration = 0; - - HDC hdcFrom = NULL, hdcTo = NULL; - CBufferedAnimation ba; - if(IsBufferedPaintSupported()) - ba.Begin(pT->m_hWnd, dc, &rect, m_dwFormat, &m_PaintParams, &m_AnimationParams, &hdcFrom, &hdcTo); - - if(!ba.IsNull()) - { - if(hdcFrom != NULL) - pT->DoPaint(hdcFrom, rect, m_State); - - if (hdcTo != NULL) - pT->DoPaint(hdcTo, rect, m_NewState); - } - else - { - pT->DoPaint(dc.m_hDC, rect, m_NewState); - } - - m_AnimationParams.dwDuration = dwDurationSave; - } - - void DoPaint(CDCHandle /*dc*/, RECT& /*rect*/, TState /*State*/) - { - // must be implemented in a derived class - ATLASSERT(FALSE); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CBufferedAnimationWindowImpl - implements a window that uses buffered animation - -template -class ATL_NO_VTABLE CBufferedAnimationWindowImpl : - public ATL::CWindowImpl, - public CBufferedAnimationImpl< T, TState > -{ -public: - CBufferedAnimationWindowImpl(TState InitialState) : CBufferedAnimationImpl< T, TState >(InitialState) - { } - - typedef CBufferedAnimationImpl< T, TState > _baseBufferedAnimation; - BEGIN_MSG_MAP(CBufferedAnimationWindowImpl) - CHAIN_MSG_MAP(_baseBufferedAnimation) - END_MSG_MAP() -}; - -#endif // _WTL_NEW_UXTHEME - -}; // namespace WTL - -#endif // __ATLTHEME_H__ diff --git a/plugins/SmartAutoReplier/wtl/atluser.h b/plugins/SmartAutoReplier/wtl/atluser.h deleted file mode 100644 index 6cd8205a73..0000000000 --- a/plugins/SmartAutoReplier/wtl/atluser.h +++ /dev/null @@ -1,1391 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLUSER_H__ -#define __ATLUSER_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atluser.h requires atlapp.h to be included first -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CMenuItemInfo -// CMenuT -// CAcceleratorT -// CIconT -// CCursorT -// CResource -// -// Global functions: -// AtlMessageBox() -// -// AtlLoadAccelerators() -// AtlLoadMenu() -// AtlLoadBitmap() -// AtlLoadSysBitmap() -// AtlLoadCursor() -// AtlLoadSysCursor() -// AtlLoadIcon() -// AtlLoadSysIcon() -// AtlLoadBitmapImage() -// AtlLoadCursorImage() -// AtlLoadIconImage() -// AtlLoadSysBitmapImage() -// AtlLoadSysCursorImage() -// AtlLoadSysIconImage() -// AtlLoadString() - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// AtlMessageBox - accepts both memory and resource based strings - -inline int AtlMessageBox(HWND hWndOwner, ATL::_U_STRINGorID message, ATL::_U_STRINGorID title = (LPCTSTR)NULL, UINT uType = MB_OK | MB_ICONINFORMATION) -{ - ATLASSERT(hWndOwner == NULL || ::IsWindow(hWndOwner)); - - LPTSTR lpstrMessage = NULL; - if(IS_INTRESOURCE(message.m_lpstr)) - { - for(int nLen = 256; ; nLen *= 2) - { - ATLTRY(lpstrMessage = new TCHAR[nLen]); - if(lpstrMessage == NULL) - { - ATLASSERT(FALSE); - return 0; - } - int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(message.m_lpstr), lpstrMessage, nLen); - if(nRes < nLen - 1) - break; - delete [] lpstrMessage; - lpstrMessage = NULL; - } - - message.m_lpstr = lpstrMessage; - } - - LPTSTR lpstrTitle = NULL; - if(IS_INTRESOURCE(title.m_lpstr) && LOWORD(title.m_lpstr) != 0) - { - for(int nLen = 256; ; nLen *= 2) - { - ATLTRY(lpstrTitle = new TCHAR[nLen]); - if(lpstrTitle == NULL) - { - ATLASSERT(FALSE); - return 0; - } - int nRes = ::LoadString(ModuleHelper::GetResourceInstance(), LOWORD(title.m_lpstr), lpstrTitle, nLen); - if(nRes < nLen - 1) - break; - delete [] lpstrTitle; - lpstrTitle = NULL; - } - - title.m_lpstr = lpstrTitle; - } - - int nRet = ::MessageBox(hWndOwner, message.m_lpstr, title.m_lpstr, uType); - - delete [] lpstrMessage; - delete [] lpstrTitle; - - return nRet; -} - - -/////////////////////////////////////////////////////////////////////////////// -// CMenu - -#if (WINVER >= 0x0500) - #ifndef MII_SIZEOF_STRUCT - #define MII_SIZEOF_STRUCT(structname, member) (((int)((LPBYTE)(&((structname*)0)->member) - ((LPBYTE)((structname*)0)))) + sizeof(((structname*)0)->member)) - #endif - #define MENUITEMINFO_SIZE_VERSION_400A MII_SIZEOF_STRUCT(MENUITEMINFOA, cch) - #define MENUITEMINFO_SIZE_VERSION_400W MII_SIZEOF_STRUCT(MENUITEMINFOW, cch) - #ifdef UNICODE - #define MENUITEMINFO_SIZE_VERSION_400 MENUITEMINFO_SIZE_VERSION_400W - #else - #define MENUITEMINFO_SIZE_VERSION_400 MENUITEMINFO_SIZE_VERSION_400A - #endif // !UNICODE -#endif // (WINVER >= 0x0500) - -class CMenuItemInfo : public MENUITEMINFO -{ -public: - CMenuItemInfo() - { - memset(this, 0, sizeof(MENUITEMINFO)); - cbSize = sizeof(MENUITEMINFO); -#if (WINVER >= 0x0500) - // adjust struct size if running on older version of Windows - if(AtlIsOldWindows()) - { - ATLASSERT(cbSize > MENUITEMINFO_SIZE_VERSION_400); // must be - cbSize = MENUITEMINFO_SIZE_VERSION_400; - } -#endif // (WINVER >= 0x0500) - } -}; - - -// forward declarations -template class CMenuT; -typedef CMenuT CMenuHandle; -typedef CMenuT CMenu; - - -template -class CMenuT -{ -public: -// Data members - HMENU m_hMenu; - -// Constructor/destructor/operators - CMenuT(HMENU hMenu = NULL) : m_hMenu(hMenu) - { } - - ~CMenuT() - { - if(t_bManaged && m_hMenu != NULL) - DestroyMenu(); - } - - CMenuT& operator =(HMENU hMenu) - { - Attach(hMenu); - return *this; - } - - void Attach(HMENU hMenuNew) - { - ATLASSERT(::IsMenu(hMenuNew)); - if(t_bManaged && m_hMenu != NULL && m_hMenu != hMenuNew) - ::DestroyMenu(m_hMenu); - m_hMenu = hMenuNew; - } - - HMENU Detach() - { - HMENU hMenu = m_hMenu; - m_hMenu = NULL; - return hMenu; - } - - operator HMENU() const { return m_hMenu; } - - bool IsNull() const { return (m_hMenu == NULL); } - - BOOL IsMenu() const - { - return ::IsMenu(m_hMenu); - } - -// Create/destroy methods - BOOL CreateMenu() - { - ATLASSERT(m_hMenu == NULL); - m_hMenu = ::CreateMenu(); - return (m_hMenu != NULL) ? TRUE : FALSE; - } - - BOOL CreatePopupMenu() - { - ATLASSERT(m_hMenu == NULL); - m_hMenu = ::CreatePopupMenu(); - return (m_hMenu != NULL) ? TRUE : FALSE; - } - - BOOL LoadMenu(ATL::_U_STRINGorID menu) - { - ATLASSERT(m_hMenu == NULL); - m_hMenu = ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr); - return (m_hMenu != NULL) ? TRUE : FALSE; - } - -#ifndef _WIN32_WCE - BOOL LoadMenuIndirect(const void* lpMenuTemplate) - { - ATLASSERT(m_hMenu == NULL); - m_hMenu = ::LoadMenuIndirect(lpMenuTemplate); - return (m_hMenu != NULL) ? TRUE : FALSE; - } -#endif // !_WIN32_WCE - - BOOL DestroyMenu() - { - if (m_hMenu == NULL) - return FALSE; - BOOL bRet = ::DestroyMenu(m_hMenu); - if(bRet) - m_hMenu = NULL; - return bRet; - } - -// Menu Operations - BOOL DeleteMenu(UINT nPosition, UINT nFlags) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::DeleteMenu(m_hMenu, nPosition, nFlags); - } - - BOOL TrackPopupMenu(UINT nFlags, int x, int y, HWND hWnd, LPCRECT lpRect = NULL) - { - ATLASSERT(::IsMenu(m_hMenu)); -#ifndef _WIN32_WCE -#if (WINVER >= 0x0500) - x = _FixTrackMenuPopupX(x, y); -#endif // !(WINVER >= 0x0500) - return ::TrackPopupMenu(m_hMenu, nFlags, x, y, 0, hWnd, lpRect); -#else // CE specific - lpRect; - return ::TrackPopupMenuEx(m_hMenu, nFlags, x, y, hWnd, NULL); -#endif // _WIN32_WCE - } - - BOOL TrackPopupMenuEx(UINT uFlags, int x, int y, HWND hWnd, LPTPMPARAMS lptpm = NULL) - { - ATLASSERT(::IsMenu(m_hMenu)); -#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) - x = _FixTrackMenuPopupX(x, y); -#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) - return ::TrackPopupMenuEx(m_hMenu, uFlags, x, y, hWnd, lptpm); - } - -#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) - // helper that fixes popup menu X position when it's off-screen - static int _FixTrackMenuPopupX(int x, int y) - { - POINT pt = { x, y }; - HMONITOR hMonitor = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONULL); - if(hMonitor == NULL) - { - HMONITOR hMonitorNear = ::MonitorFromPoint(pt, MONITOR_DEFAULTTONEAREST); - if(hMonitorNear != NULL) - { - MONITORINFO mi = { 0 }; - mi.cbSize = sizeof(MONITORINFO); - if(::GetMonitorInfo(hMonitorNear, &mi) != FALSE) - { - if(x < mi.rcWork.left) - x = mi.rcWork.left; - else if(x > mi.rcWork.right) - x = mi.rcWork.right; - } - } - } - - return x; - } - - BOOL GetMenuInfo(LPMENUINFO lpMenuInfo) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuInfo(m_hMenu, lpMenuInfo); - } - - BOOL SetMenuInfo(LPCMENUINFO lpMenuInfo) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::SetMenuInfo(m_hMenu, lpMenuInfo); - } -#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) - -// Menu Item Operations - BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::AppendMenu(m_hMenu, nFlags, nIDNewItem, lpszNewItem); - } - - BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) - { - ATLASSERT(::IsMenu(m_hMenu)); - ATLASSERT(::IsMenu(hSubMenu)); - return ::AppendMenu(m_hMenu, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); - } - -#ifndef _WIN32_WCE - BOOL AppendMenu(UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::AppendMenu(m_hMenu, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); - } - - BOOL AppendMenu(UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) - { - ATLASSERT(::IsMenu(m_hMenu)); - ATLASSERT(::IsMenu(hSubMenu)); - return ::AppendMenu(m_hMenu, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); - } -#endif // !_WIN32_WCE - - UINT CheckMenuItem(UINT nIDCheckItem, UINT nCheck) - { - ATLASSERT(::IsMenu(m_hMenu)); - return (UINT)::CheckMenuItem(m_hMenu, nIDCheckItem, nCheck); - } - - UINT EnableMenuItem(UINT nIDEnableItem, UINT nEnable) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::EnableMenuItem(m_hMenu, nIDEnableItem, nEnable); - } - -#ifndef _WIN32_WCE - BOOL HiliteMenuItem(HWND hWnd, UINT uIDHiliteItem, UINT uHilite) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::HiliteMenuItem(hWnd, m_hMenu, uIDHiliteItem, uHilite); - } - - int GetMenuItemCount() const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuItemCount(m_hMenu); - } - - UINT GetMenuItemID(int nPos) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuItemID(m_hMenu, nPos); - } - - UINT GetMenuState(UINT nID, UINT nFlags) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuState(m_hMenu, nID, nFlags); - } - - int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuString(m_hMenu, nIDItem, lpString, nMaxCount, nFlags); - } - - int GetMenuStringLen(UINT nIDItem, UINT nFlags) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuString(m_hMenu, nIDItem, NULL, 0, nFlags); - } - -#ifndef _ATL_NO_COM - BOOL GetMenuString(UINT nIDItem, BSTR& bstrText, UINT nFlags) const - { - USES_CONVERSION; - ATLASSERT(::IsMenu(m_hMenu)); - ATLASSERT(bstrText == NULL); - - int nLen = GetMenuStringLen(nIDItem, nFlags); - if(nLen == 0) - { - bstrText = ::SysAllocString(OLESTR("")); - return (bstrText != NULL) ? TRUE : FALSE; - } - - nLen++; // increment to include terminating NULL char - CTempBuffer buff; - LPTSTR lpszText = buff.Allocate(nLen); - if(lpszText == NULL) - return FALSE; - - if(!GetMenuString(nIDItem, lpszText, nLen, nFlags)) - return FALSE; - - bstrText = ::SysAllocString(T2OLE(lpszText)); - return (bstrText != NULL) ? TRUE : FALSE; - } -#endif // !_ATL_NO_COM - -#elif (_ATL_VER >= 0x0800) - int GetMenuItemCount() const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ATL::GetMenuItemCount(m_hMenu); - } - - UINT GetMenuItemID(int nPos) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ATL::GetMenuItemID(m_hMenu, nPos); - } - - UINT GetMenuState(UINT nID, UINT nFlags) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ATL::GetMenuState(m_hMenu, nID, nFlags); - } - - int GetMenuString(UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ATL::GetMenuString(m_hMenu, nIDItem, lpString, nMaxCount, nFlags); - } - - int GetMenuStringLen(UINT nIDItem, UINT nFlags) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ATL::GetMenuString(m_hMenu, nIDItem, NULL, 0, nFlags); - } -#endif // (_ATL_VER >= 0x0800) - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - int GetMenuString(UINT nIDItem, _CSTRING_NS::CString& strText, UINT nFlags) const - { - ATLASSERT(::IsMenu(m_hMenu)); - - int nLen = GetMenuStringLen(nIDItem, nFlags); - if(nLen == 0) - return 0; - - nLen++; // increment to include terminating NULL char - LPTSTR lpstr = strText.GetBufferSetLength(nLen); - if(lpstr == NULL) - return 0; - int nRet = GetMenuString(nIDItem, lpstr, nLen, nFlags); - strText.ReleaseBuffer(); - return nRet; - } -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - CMenuHandle GetSubMenu(int nPos) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return CMenuHandle(::GetSubMenu(m_hMenu, nPos)); - } - - BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::InsertMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem); - } - - BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) - { - ATLASSERT(::IsMenu(m_hMenu)); - ATLASSERT(::IsMenu(hSubMenu)); - return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); - } - -#ifndef _WIN32_WCE - BOOL InsertMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::InsertMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); - } - - BOOL InsertMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) - { - ATLASSERT(::IsMenu(m_hMenu)); - ATLASSERT(::IsMenu(hSubMenu)); - return ::InsertMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); - } - - BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem = 0, LPCTSTR lpszNewItem = NULL) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::ModifyMenu(m_hMenu, nPosition, nFlags, nIDNewItem, lpszNewItem); - } - - BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, LPCTSTR lpszNewItem) - { - ATLASSERT(::IsMenu(m_hMenu)); - ATLASSERT(::IsMenu(hSubMenu)); - return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_POPUP, (UINT_PTR)hSubMenu, lpszNewItem); - } - - BOOL ModifyMenu(UINT nPosition, UINT nFlags, UINT_PTR nIDNewItem, HBITMAP hBmp) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::ModifyMenu(m_hMenu, nPosition, nFlags | MF_BITMAP, nIDNewItem, (LPCTSTR)hBmp); - } - - BOOL ModifyMenu(UINT nPosition, UINT nFlags, HMENU hSubMenu, HBITMAP hBmp) - { - ATLASSERT(::IsMenu(m_hMenu)); - ATLASSERT(::IsMenu(hSubMenu)); - return ::ModifyMenu(m_hMenu, nPosition, nFlags | (MF_BITMAP | MF_POPUP), (UINT_PTR)hSubMenu, (LPCTSTR)hBmp); - } -#endif // !_WIN32_WCE - - BOOL RemoveMenu(UINT nPosition, UINT nFlags) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::RemoveMenu(m_hMenu, nPosition, nFlags); - } - -#ifndef _WIN32_WCE - BOOL SetMenuItemBitmaps(UINT nPosition, UINT nFlags, HBITMAP hBmpUnchecked, HBITMAP hBmpChecked) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::SetMenuItemBitmaps(m_hMenu, nPosition, nFlags, hBmpUnchecked, hBmpChecked); - } -#endif // !_WIN32_WCE - - BOOL CheckMenuRadioItem(UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::CheckMenuRadioItem(m_hMenu, nIDFirst, nIDLast, nIDItem, nFlags); - } - - BOOL GetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return (BOOL)::GetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii); - } - - BOOL SetMenuItemInfo(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) - { - ATLASSERT(::IsMenu(m_hMenu)); - return (BOOL)::SetMenuItemInfo(m_hMenu, uItem, bByPosition, lpmii); - } - -#ifndef _WIN32_WCE - BOOL InsertMenuItem(UINT uItem, BOOL bByPosition, LPMENUITEMINFO lpmii) - { - ATLASSERT(::IsMenu(m_hMenu)); - return (BOOL)::InsertMenuItem(m_hMenu, uItem, bByPosition, lpmii); - } - - UINT GetMenuDefaultItem(BOOL bByPosition = FALSE, UINT uFlags = 0U) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuDefaultItem(m_hMenu, (UINT)bByPosition, uFlags); - } - - BOOL SetMenuDefaultItem(UINT uItem = (UINT)-1, BOOL bByPosition = FALSE) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::SetMenuDefaultItem(m_hMenu, uItem, (UINT)bByPosition); - } - - BOOL GetMenuItemRect(HWND hWnd, UINT uItem, LPRECT lprcItem) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuItemRect(hWnd, m_hMenu, uItem, lprcItem); - } - - int MenuItemFromPoint(HWND hWnd, POINT point) const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::MenuItemFromPoint(hWnd, m_hMenu, point); - } - -// Context Help Functions - BOOL SetMenuContextHelpId(DWORD dwContextHelpId) - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::SetMenuContextHelpId(m_hMenu, dwContextHelpId); - } - - DWORD GetMenuContextHelpId() const - { - ATLASSERT(::IsMenu(m_hMenu)); - return ::GetMenuContextHelpId(m_hMenu); - } -#endif // !_WIN32_WCE -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAccelerator - -template -class CAcceleratorT -{ -public: - HACCEL m_hAccel; - -// Constructor/destructor/operators - CAcceleratorT(HACCEL hAccel = NULL) : m_hAccel(hAccel) - { } - - ~CAcceleratorT() - { - if(t_bManaged && m_hAccel != NULL) - ::DestroyAcceleratorTable(m_hAccel); - } - - CAcceleratorT& operator =(HACCEL hAccel) - { - Attach(hAccel); - return *this; - } - - void Attach(HACCEL hAccel) - { - if(t_bManaged && m_hAccel != NULL) - ::DestroyAcceleratorTable(m_hAccel); - m_hAccel = hAccel; - } - - HACCEL Detach() - { - HACCEL hAccel = m_hAccel; - m_hAccel = NULL; - return hAccel; - } - - operator HACCEL() const { return m_hAccel; } - - bool IsNull() const { return m_hAccel == NULL; } - -// Create/destroy methods - HACCEL LoadAccelerators(ATL::_U_STRINGorID accel) - { - ATLASSERT(m_hAccel == NULL); - m_hAccel = ::LoadAccelerators(ModuleHelper::GetResourceInstance(), accel.m_lpstr); - return m_hAccel; - } - - HACCEL CreateAcceleratorTable(LPACCEL pAccel, int cEntries) - { - ATLASSERT(m_hAccel == NULL); - ATLASSERT(pAccel != NULL); - m_hAccel = ::CreateAcceleratorTable(pAccel, cEntries); - return m_hAccel; - } - - void DestroyObject() - { - if(m_hAccel != NULL) - { - ::DestroyAcceleratorTable(m_hAccel); - m_hAccel = NULL; - } - } - -// Operations -#ifndef _WIN32_WCE - int CopyAcceleratorTable(LPACCEL lpAccelDst, int cEntries) - { - ATLASSERT(m_hAccel != NULL); - ATLASSERT(lpAccelDst != NULL); - return ::CopyAcceleratorTable(m_hAccel, lpAccelDst, cEntries); - } - - int GetEntriesCount() const - { - ATLASSERT(m_hAccel != NULL); - return ::CopyAcceleratorTable(m_hAccel, NULL, 0); - } -#endif // !_WIN32_WCE - - BOOL TranslateAccelerator(HWND hWnd, LPMSG pMsg) - { - ATLASSERT(m_hAccel != NULL); - ATLASSERT(::IsWindow(hWnd)); - ATLASSERT(pMsg != NULL); - return ::TranslateAccelerator(hWnd, m_hAccel, pMsg); - } -}; - -typedef CAcceleratorT CAcceleratorHandle; -typedef CAcceleratorT CAccelerator; - - -/////////////////////////////////////////////////////////////////////////////// -// CIcon - -template -class CIconT -{ -public: - HICON m_hIcon; - -// Constructor/destructor/operators - CIconT(HICON hIcon = NULL) : m_hIcon(hIcon) - { } - - ~CIconT() - { - if(t_bManaged && m_hIcon != NULL) - ::DestroyIcon(m_hIcon); - } - - CIconT& operator =(HICON hIcon) - { - Attach(hIcon); - return *this; - } - - void Attach(HICON hIcon) - { - if(t_bManaged && m_hIcon != NULL) - ::DestroyIcon(m_hIcon); - m_hIcon = hIcon; - } - - HICON Detach() - { - HICON hIcon = m_hIcon; - m_hIcon = NULL; - return hIcon; - } - - operator HICON() const { return m_hIcon; } - - bool IsNull() const { return m_hIcon == NULL; } - -// Create/destroy methods - HICON LoadIcon(ATL::_U_STRINGorID icon) - { - ATLASSERT(m_hIcon == NULL); - m_hIcon = ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); - return m_hIcon; - } - - HICON LoadIcon(ATL::_U_STRINGorID icon, int cxDesired, int cyDesired, UINT fuLoad = 0) - { - ATLASSERT(m_hIcon == NULL); - m_hIcon = (HICON) ::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad); - return m_hIcon; - } - -#ifndef _WIN32_WCE - HICON LoadOEMIcon(LPCTSTR lpstrIconName) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(IsOEMIcon(lpstrIconName)); - m_hIcon = ::LoadIcon(NULL, lpstrIconName); - return m_hIcon; - } - - HICON CreateIcon(int nWidth, int nHeight, BYTE cPlanes, BYTE cBitsPixel, CONST BYTE* lpbANDbits, CONST BYTE *lpbXORbits) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(lpbANDbits != NULL); - ATLASSERT(lpbXORbits != NULL); - m_hIcon = ::CreateIcon(ModuleHelper::GetResourceInstance(), nWidth, nHeight, cPlanes, cBitsPixel, lpbANDbits, lpbXORbits); - return m_hIcon; - } - - HICON CreateIconFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(pBits != NULL); - m_hIcon = ::CreateIconFromResource(pBits, dwResSize, TRUE, dwVersion); - return m_hIcon; - } - - HICON CreateIconFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(pbBits != NULL); - ATLASSERT(cbBits > 0); - m_hIcon = ::CreateIconFromResourceEx(pbBits, cbBits, TRUE, dwVersion, cxDesired, cyDesired, uFlags); - return m_hIcon; - } -#endif // !_WIN32_WCE - - HICON CreateIconIndirect(PICONINFO pIconInfo) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(pIconInfo != NULL); - m_hIcon = ::CreateIconIndirect(pIconInfo); - return m_hIcon; - } - -#ifndef _WIN32_WCE - HICON ExtractIcon(LPCTSTR lpszExeFileName, UINT nIconIndex) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(lpszExeFileName != NULL); - m_hIcon = ::ExtractIcon(ModuleHelper::GetModuleInstance(), lpszExeFileName, nIconIndex); - return m_hIcon; - } - - HICON ExtractAssociatedIcon(HINSTANCE hInst, LPTSTR lpIconPath, LPWORD lpiIcon) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(lpIconPath != NULL); - ATLASSERT(lpiIcon != NULL); - m_hIcon = ::ExtractAssociatedIcon(hInst, lpIconPath, lpiIcon); - return m_hIcon; - } -#endif // !_WIN32_WCE - - BOOL DestroyIcon() - { - ATLASSERT(m_hIcon != NULL); - BOOL bRet = ::DestroyIcon(m_hIcon); - if(bRet != FALSE) - m_hIcon = NULL; - return bRet; - } - -// Operations -#ifndef _WIN32_WCE - HICON CopyIcon() - { - ATLASSERT(m_hIcon != NULL); - return ::CopyIcon(m_hIcon); - } - - HICON DuplicateIcon() - { - ATLASSERT(m_hIcon != NULL); - return ::DuplicateIcon(NULL, m_hIcon); - } -#endif // !_WIN32_WCE - - BOOL DrawIcon(HDC hDC, int x, int y) - { - ATLASSERT(m_hIcon != NULL); -#ifndef _WIN32_WCE - return ::DrawIcon(hDC, x, y, m_hIcon); -#else // CE specific - return ::DrawIconEx(hDC, x, y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL); -#endif // _WIN32_WCE - } - - BOOL DrawIcon(HDC hDC, POINT pt) - { - ATLASSERT(m_hIcon != NULL); -#ifndef _WIN32_WCE - return ::DrawIcon(hDC, pt.x, pt.y, m_hIcon); -#else // CE specific - return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, 0, 0, 0, NULL, DI_NORMAL); -#endif // _WIN32_WCE - } - - BOOL DrawIconEx(HDC hDC, int x, int y, int cxWidth, int cyWidth, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) - { - ATLASSERT(m_hIcon != NULL); - return ::DrawIconEx(hDC, x, y, m_hIcon, cxWidth, cyWidth, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); - } - - BOOL DrawIconEx(HDC hDC, POINT pt, SIZE size, UINT uStepIfAniCur = 0, HBRUSH hbrFlickerFreeDraw = NULL, UINT uFlags = DI_NORMAL) - { - ATLASSERT(m_hIcon != NULL); - return ::DrawIconEx(hDC, pt.x, pt.y, m_hIcon, size.cx, size.cy, uStepIfAniCur, hbrFlickerFreeDraw, uFlags); - } - -#ifndef _WIN32_WCE - BOOL GetIconInfo(PICONINFO pIconInfo) const - { - ATLASSERT(m_hIcon != NULL); - ATLASSERT(pIconInfo != NULL); - return ::GetIconInfo(m_hIcon, pIconInfo); - } - -#if (_WIN32_WINNT >= 0x0600) - BOOL GetIconInfoEx(PICONINFOEX pIconInfo) const - { - ATLASSERT(m_hIcon != NULL); - ATLASSERT(pIconInfo != NULL); - return ::GetIconInfoEx(m_hIcon, pIconInfo); - } -#endif // (_WIN32_WINNT >= 0x0600) - -#if defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) - HRESULT LoadIconMetric(ATL::_U_STRINGorID icon, int lims) - { - ATLASSERT(m_hIcon == NULL); - USES_CONVERSION; - return ::LoadIconMetric(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), lims, &m_hIcon); - } - - HRESULT LoadIconWithScaleDown(ATL::_U_STRINGorID icon, int cx, int cy) - { - ATLASSERT(m_hIcon == NULL); - USES_CONVERSION; - return ::LoadIconWithScaleDown(ModuleHelper::GetResourceInstance(), T2CW(icon.m_lpstr), cx, cy, &m_hIcon); - } - - HRESULT LoadOEMIconMetric(LPCTSTR lpstrIconName, int lims) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(IsOEMIcon(lpstrIconName)); - return ::LoadIconMetric(NULL, (LPCWSTR)lpstrIconName, lims, &m_hIcon); - } - - HRESULT LoadOEMIconWithScaleDown(LPCTSTR lpstrIconName, int cx, int cy) - { - ATLASSERT(m_hIcon == NULL); - ATLASSERT(IsOEMIcon(lpstrIconName)); - USES_CONVERSION; - return ::LoadIconWithScaleDown(NULL, (LPCWSTR)lpstrIconName, cx, cy, &m_hIcon); - } -#endif // defined(NTDDI_VERSION) && (NTDDI_VERSION >= NTDDI_LONGHORN) -#endif // !_WIN32_WCE - - // Helper -#ifndef _WIN32_WCE - static bool IsOEMIcon(LPCTSTR lpstrIconName) - { -#if (WINVER >= 0x0600) - return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION || - lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO || - lpstrIconName == IDI_SHIELD); -#else // !(WINVER >= 0x0600) - return (lpstrIconName == IDI_APPLICATION || lpstrIconName == IDI_ASTERISK || lpstrIconName == IDI_EXCLAMATION || - lpstrIconName == IDI_HAND || lpstrIconName == IDI_QUESTION || lpstrIconName == IDI_WINLOGO); -#endif // !(WINVER >= 0x0600) - } -#endif // !_WIN32_WCE -}; - -typedef CIconT CIconHandle; -typedef CIconT CIcon; - - -/////////////////////////////////////////////////////////////////////////////// -// CCursor - -// protect template member from a winuser.h macro -#ifdef CopyCursor - #undef CopyCursor -#endif - -template -class CCursorT -{ -public: - HCURSOR m_hCursor; - -// Constructor/destructor/operators - CCursorT(HCURSOR hCursor = NULL) : m_hCursor(hCursor) - { } - - ~CCursorT() - { - if(t_bManaged && m_hCursor != NULL) - DestroyCursor(); - } - - CCursorT& operator =(HCURSOR hCursor) - { - Attach(hCursor); - return *this; - } - - void Attach(HCURSOR hCursor) - { - if(t_bManaged && m_hCursor != NULL) - DestroyCursor(); - m_hCursor = hCursor; - } - - HCURSOR Detach() - { - HCURSOR hCursor = m_hCursor; - m_hCursor = NULL; - return hCursor; - } - - operator HCURSOR() const { return m_hCursor; } - - bool IsNull() const { return m_hCursor == NULL; } - -// Create/destroy methods - HCURSOR LoadCursor(ATL::_U_STRINGorID cursor) - { - ATLASSERT(m_hCursor == NULL); - m_hCursor = ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr); - return m_hCursor; - } - - HCURSOR LoadSysCursor(LPCTSTR lpstrCursorName) - { - ATLASSERT(m_hCursor == NULL); -#if (WINVER >= 0x0500) - ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT || - lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE || - lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW || - lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL || - lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP || - lpstrCursorName == IDC_HAND); -#else // !(WINVER >= 0x0500) - ATLASSERT(lpstrCursorName == IDC_ARROW || lpstrCursorName == IDC_IBEAM || lpstrCursorName == IDC_WAIT || - lpstrCursorName == IDC_CROSS || lpstrCursorName == IDC_UPARROW || lpstrCursorName == IDC_SIZE || - lpstrCursorName == IDC_ICON || lpstrCursorName == IDC_SIZENWSE || lpstrCursorName == IDC_SIZENESW || - lpstrCursorName == IDC_SIZEWE || lpstrCursorName == IDC_SIZENS || lpstrCursorName == IDC_SIZEALL || - lpstrCursorName == IDC_NO || lpstrCursorName == IDC_APPSTARTING || lpstrCursorName == IDC_HELP); -#endif // !(WINVER >= 0x0500) - m_hCursor = ::LoadCursor(NULL, lpstrCursorName); - return m_hCursor; - } - - // deprecated - HCURSOR LoadOEMCursor(LPCTSTR lpstrCursorName) - { - return LoadSysCursor(lpstrCursorName); - } - - HCURSOR LoadCursor(ATL::_U_STRINGorID cursor, int cxDesired, int cyDesired, UINT fuLoad = 0) - { - ATLASSERT(m_hCursor == NULL); - m_hCursor = (HCURSOR) ::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad); - return m_hCursor; - } - -#ifndef _WIN32_WCE - HCURSOR LoadCursorFromFile(LPCTSTR pstrFilename) - { - ATLASSERT(m_hCursor == NULL); - ATLASSERT(pstrFilename != NULL); - m_hCursor = ::LoadCursorFromFile(pstrFilename); - return m_hCursor; - } -#endif // !_WIN32_WCE - -#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) - HCURSOR CreateCursor(int xHotSpot, int yHotSpot, int nWidth, int nHeight, CONST VOID *pvANDPlane, CONST VOID *pvXORPlane) - { - ATLASSERT(m_hCursor == NULL); - m_hCursor = ::CreateCursor(ModuleHelper::GetResourceInstance(), xHotSpot, yHotSpot, nWidth, nHeight, pvANDPlane, pvXORPlane); - return m_hCursor; - } -#endif // !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) - -#ifndef _WIN32_WCE - HCURSOR CreateCursorFromResource(PBYTE pBits, DWORD dwResSize, DWORD dwVersion = 0x00030000) - { - ATLASSERT(m_hCursor == NULL); - ATLASSERT(pBits != NULL); - m_hCursor = (HCURSOR)::CreateIconFromResource(pBits, dwResSize, FALSE, dwVersion); - return m_hCursor; - } - - HCURSOR CreateCursorFromResourceEx(PBYTE pbBits, DWORD cbBits, DWORD dwVersion = 0x00030000, int cxDesired = 0, int cyDesired = 0, UINT uFlags = LR_DEFAULTCOLOR) - { - ATLASSERT(m_hCursor == NULL); - ATLASSERT(pbBits != NULL); - ATLASSERT(cbBits > 0); - m_hCursor = (HCURSOR)::CreateIconFromResourceEx(pbBits, cbBits, FALSE, dwVersion, cxDesired, cyDesired, uFlags); - return m_hCursor; - } -#endif // !_WIN32_WCE - - BOOL DestroyCursor() - { - ATLASSERT(m_hCursor != NULL); -#if !defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP))) - BOOL bRet = ::DestroyCursor(m_hCursor); - if(bRet != FALSE) - m_hCursor = NULL; - return bRet; -#else // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))) - ATLTRACE2(atlTraceUI, 0, _T("Warning: This version of Windows CE does not have ::DestroyCursor()\n")); - return FALSE; -#endif // !(!defined(_WIN32_WCE) || ((_WIN32_WCE >= 0x400) && !(defined(WIN32_PLATFORM_PSPC) || defined(WIN32_PLATFORM_WFSP)))) - } - -// Operations -#ifndef _WIN32_WCE - HCURSOR CopyCursor() - { - ATLASSERT(m_hCursor != NULL); - return (HCURSOR)::CopyIcon((HICON)m_hCursor); - } -#endif // !_WIN32_WCE - -#if (WINVER >= 0x0500) && !defined(_WIN32_WCE) - BOOL GetCursorInfo(LPCURSORINFO pCursorInfo) - { - ATLASSERT(m_hCursor != NULL); - ATLASSERT(pCursorInfo != NULL); - return ::GetCursorInfo(pCursorInfo); - } -#endif // (WINVER >= 0x0500) && !defined(_WIN32_WCE) -}; - -typedef CCursorT CCursorHandle; -typedef CCursorT CCursor; - - -/////////////////////////////////////////////////////////////////////////////// -// CResource - Wraps a generic Windows resource. -// Use it with custom resource types other than the -// standard RT_CURSOR, RT_BITMAP, etc. - -class CResource -{ -public: - HGLOBAL m_hGlobal; - HRSRC m_hResource; - -// Constructor/destructor - CResource() : m_hGlobal(NULL), m_hResource(NULL) - { } - - ~CResource() - { - Release(); - } - -// Load methods - bool Load(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID) - { - ATLASSERT(m_hResource == NULL); - ATLASSERT(m_hGlobal == NULL); - - m_hResource = ::FindResource(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr); - if(m_hResource == NULL) - return false; - - m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource); - if(m_hGlobal == NULL) - { - m_hResource = NULL; - return false; - } - - return true; - } - -#ifndef _WIN32_WCE - bool LoadEx(ATL::_U_STRINGorID Type, ATL::_U_STRINGorID ID, WORD wLanguage) - { - ATLASSERT(m_hResource == NULL); - ATLASSERT(m_hGlobal == NULL); - - m_hResource = ::FindResourceEx(ModuleHelper::GetResourceInstance(), ID.m_lpstr, Type.m_lpstr, wLanguage); - if(m_hResource == NULL) - return false; - - m_hGlobal = ::LoadResource(ModuleHelper::GetResourceInstance(), m_hResource); - if(m_hGlobal == NULL) - { - m_hResource = NULL; - return false; - } - - return true; - } -#endif // !_WIN32_WCE - -// Misc. operations - DWORD GetSize() const - { - ATLASSERT(m_hResource != NULL); - return ::SizeofResource(ModuleHelper::GetResourceInstance(), m_hResource); - } - - LPVOID Lock() - { - ATLASSERT(m_hResource != NULL); - ATLASSERT(m_hGlobal != NULL); - LPVOID pVoid = ::LockResource(m_hGlobal); - ATLASSERT(pVoid != NULL); - return pVoid; - } - - void Release() - { - if(m_hGlobal != NULL) - { - FreeResource(m_hGlobal); - m_hGlobal = NULL; - m_hResource = NULL; - } - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Toolbar resource descriptor - -struct _AtlToolBarData -{ - WORD wVersion; - WORD wWidth; - WORD wHeight; - WORD wItemCount; - - WORD* items() - { return (WORD*)(this+1); } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// Global functions for loading resources - -inline HACCEL AtlLoadAccelerators(ATL::_U_STRINGorID table) -{ - return ::LoadAccelerators(ModuleHelper::GetResourceInstance(), table.m_lpstr); -} - -inline HMENU AtlLoadMenu(ATL::_U_STRINGorID menu) -{ - return ::LoadMenu(ModuleHelper::GetResourceInstance(), menu.m_lpstr); -} - -inline HBITMAP AtlLoadBitmap(ATL::_U_STRINGorID bitmap) -{ - return ::LoadBitmap(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr); -} - -#ifdef OEMRESOURCE -inline HBITMAP AtlLoadSysBitmap(ATL::_U_STRINGorID bitmap) -{ -#ifdef _DEBUG - WORD wID = (WORD)bitmap.m_lpstr; - ATLASSERT(wID >= 32734 && wID <= 32767); -#endif // _DEBUG - return ::LoadBitmap(NULL, bitmap.m_lpstr); -} -#endif // OEMRESOURCE - -inline HCURSOR AtlLoadCursor(ATL::_U_STRINGorID cursor) -{ - return ::LoadCursor(ModuleHelper::GetResourceInstance(), cursor.m_lpstr); -} - -inline HCURSOR AtlLoadSysCursor(LPCTSTR lpCursorName) -{ -#if (WINVER >= 0x0500) - ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT || - lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE || - lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW || - lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL || - lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP || - lpCursorName == IDC_HAND); -#else // !(WINVER >= 0x0500) - ATLASSERT(lpCursorName == IDC_ARROW || lpCursorName == IDC_IBEAM || lpCursorName == IDC_WAIT || - lpCursorName == IDC_CROSS || lpCursorName == IDC_UPARROW || lpCursorName == IDC_SIZE || - lpCursorName == IDC_ICON || lpCursorName == IDC_SIZENWSE || lpCursorName == IDC_SIZENESW || - lpCursorName == IDC_SIZEWE || lpCursorName == IDC_SIZENS || lpCursorName == IDC_SIZEALL || - lpCursorName == IDC_NO || lpCursorName == IDC_APPSTARTING || lpCursorName == IDC_HELP); -#endif // !(WINVER >= 0x0500) - return ::LoadCursor(NULL, lpCursorName); -} - -inline HICON AtlLoadIcon(ATL::_U_STRINGorID icon) -{ - return ::LoadIcon(ModuleHelper::GetResourceInstance(), icon.m_lpstr); -} - -#ifndef _WIN32_WCE -inline HICON AtlLoadSysIcon(LPCTSTR lpIconName) -{ -#if (WINVER >= 0x0600) - ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION || - lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO || - lpIconName == IDI_SHIELD); -#else // !(WINVER >= 0x0600) - ATLASSERT(lpIconName == IDI_APPLICATION || lpIconName == IDI_ASTERISK || lpIconName == IDI_EXCLAMATION || - lpIconName == IDI_HAND || lpIconName == IDI_QUESTION || lpIconName == IDI_WINLOGO); -#endif // !(WINVER >= 0x0600) - return ::LoadIcon(NULL, lpIconName); -} -#endif // !_WIN32_WCE - -inline HBITMAP AtlLoadBitmapImage(ATL::_U_STRINGorID bitmap, UINT fuLoad = LR_DEFAULTCOLOR) -{ - return (HBITMAP)::LoadImage(ModuleHelper::GetResourceInstance(), bitmap.m_lpstr, IMAGE_BITMAP, 0, 0, fuLoad); -} - -inline HCURSOR AtlLoadCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0) -{ - return (HCURSOR)::LoadImage(ModuleHelper::GetResourceInstance(), cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad); -} - -inline HICON AtlLoadIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0) -{ - return (HICON)::LoadImage(ModuleHelper::GetResourceInstance(), icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad); -} - -#ifdef OEMRESOURCE -inline HBITMAP AtlLoadSysBitmapImage(WORD wBitmapID, UINT fuLoad = LR_DEFAULTCOLOR) -{ - ATLASSERT(wBitmapID >= 32734 && wBitmapID <= 32767); - ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file - return (HBITMAP)::LoadImage(NULL, MAKEINTRESOURCE(wBitmapID), IMAGE_BITMAP, 0, 0, fuLoad); -} -#endif // OEMRESOURCE - -inline HCURSOR AtlLoadSysCursorImage(ATL::_U_STRINGorID cursor, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0) -{ -#ifdef _DEBUG - WORD wID = (WORD)cursor.m_lpstr; - ATLASSERT((wID >= 32512 && wID <= 32516) || (wID >= 32640 && wID <= 32648) || (wID == 32650) || (wID == 32651)); - ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file -#endif // _DEBUG - return (HCURSOR)::LoadImage(NULL, cursor.m_lpstr, IMAGE_CURSOR, cxDesired, cyDesired, fuLoad); -} - -inline HICON AtlLoadSysIconImage(ATL::_U_STRINGorID icon, UINT fuLoad = LR_DEFAULTCOLOR | LR_DEFAULTSIZE, int cxDesired = 0, int cyDesired = 0) -{ -#ifdef _DEBUG - WORD wID = (WORD)icon.m_lpstr; - ATLASSERT(wID >= 32512 && wID <= 32517); - ATLASSERT((fuLoad & LR_LOADFROMFILE) == 0); // this one doesn't load from a file -#endif // _DEBUG - return (HICON)::LoadImage(NULL, icon.m_lpstr, IMAGE_ICON, cxDesired, cyDesired, fuLoad); -} - -#if (_ATL_VER < 0x0700) -inline int AtlLoadString(UINT uID, LPTSTR lpBuffer, int nBufferMax) -{ - return ::LoadString(ModuleHelper::GetResourceInstance(), uID, lpBuffer, nBufferMax); -} -#else - -using ATL::AtlLoadString; - -#endif // (_ATL_VER < 0x0700) - -#ifdef _WIN32_WCE // CE only direct access to the resource -inline LPCTSTR AtlLoadString(UINT uID) -{ - LPCTSTR s = (LPCTSTR)::LoadString(ModuleHelper::GetResourceInstance(), uID, NULL, 0); -#ifdef DEBUG // Check for null-termination - if(s != NULL) - // Note: RC -n compiles null-terminated resource strings - ATLASSERT(s[*((WORD*)s -1) - 1] == L'\0'); -#endif - return s; -} -#endif // _WIN32_WCE - -inline bool AtlLoadString(UINT uID, BSTR& bstrText) -{ - USES_CONVERSION; - ATLASSERT(bstrText == NULL); - - LPTSTR lpstrText = NULL; - int nRes = 0; - for(int nLen = 256; ; nLen *= 2) - { - ATLTRY(lpstrText = new TCHAR[nLen]); - if(lpstrText == NULL) - break; - nRes = ::LoadString(ModuleHelper::GetResourceInstance(), uID, lpstrText, nLen); - if(nRes < nLen - 1) - break; - delete [] lpstrText; - lpstrText = NULL; - } - - if(lpstrText != NULL) - { - if(nRes != 0) - bstrText = ::SysAllocString(T2OLE(lpstrText)); - delete [] lpstrText; - } - - return (bstrText != NULL) ? true : false; -} - -}; // namespace WTL - -#endif // __ATLUSER_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlwince.h b/plugins/SmartAutoReplier/wtl/atlwince.h deleted file mode 100644 index a845949217..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlwince.h +++ /dev/null @@ -1,2987 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLWINCE_H__ -#define __ATLWINCE_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlwince.h requires atlapp.h to be included first -#endif - -#ifndef __ATLWIN_H__ - #error atlwince.h requires atlwin.h to be included first -#endif - -#ifndef _WIN32_WCE - #error atlwince.h compiles under Windows CE only -#endif - -#if (_WIN32_WCE < 300) - #error atlwince.h requires Windows CE 3.0 or higher. -#endif - -#if defined(WIN32_PLATFORM_WFSP) && _MSC_VER < 1400 // EVC compiling SmartPhone code - #if (WIN32_PLATFORM_WFSP < 200) - #error atlwince.h requires Smartphone 2003 or higher - #endif -#endif // WIN32_PLATFORM_WFSP - -#if defined(WIN32_PLATFORM_PSPC) && _MSC_VER < 1400 // EVC compiling Pocket PC code - #if (WIN32_PLATFORM_PSPC < 310) - #error atlwince.h requires Pocket PC 2002 or higher - #endif -#endif // WIN32_PLATFORM_PSPC - -#if !defined(_AYGSHELL_H_) && !defined(__AYGSHELL_H__) - #error atlwince.h requires aygshell.h to be included first -#else - #if defined(WIN32_PLATFORM_WFSP) && !defined(_TPCSHELL_H_) - #error SmartPhone dialog classes require tpcshell.h to be included first - #endif -#endif - -#if (_MSC_VER >= 1400) // VS2005 - #include - #define _WTL_CE_DRA -#endif // (_MSC_VER >= 1400) - -#if !defined(_WTL_CE_NO_DIALOGS) && !defined(__ATLFRAME_H__) - #error Orientation aware dialog classes require atlframe.h to be included first -#endif - -#if !defined(_WTL_CE_NO_APPWINDOW) && !defined(__ATLFRAME_H__) - #error Application window class require atlframe.h to be included first -#endif - -#if !defined(_WTL_CE_NO_ZOOMSCROLL) && !defined(__ATLSCRL_H__) - #error ZoomScroll implementation requires atlscrl.h to be included first -#endif - -#if !defined(_WTL_CE_NO_ZOOMSCROLL) - #if !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES))) - #error ZoomScroll requires _WTL_NO_WTYPES not to be defined and either atlmisc.h or atltypes.h to be included first - #endif // !(defined(__ATLTYPES_H__) || (defined(__ATLMISC_H__) && !defined(_WTL_NO_WTYPES))) -#endif // !defined(_WTL_CE_NO_ZOOMSCROLL) - -#if !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) - #define _WTL_CE_NO_CONTROLS -#endif // !defined(WIN32_PLATFORM_WFSP) && !defined(WIN32_PLATFORM_PSPC) - -#ifndef _WTL_CE_NO_CONTROLS - #ifndef __ATLCTRLS_H__ - #error The PPC/SmartPhone controls classes require atlctrls.h to be included first - #endif - - #include - #pragma comment(lib, "htmlview.lib") - - #include - #pragma comment(lib, "voicectl.lib") - - #ifdef WIN32_PLATFORM_PSPC - #include - #pragma comment(lib, "richink.lib") - - #include - #pragma comment(lib, "inkx.lib") - - #include - #pragma comment(lib, "doclist.lib") - #endif -#endif - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// CStdDialogBase : Standard PPC/SmartPhone dialog base class -// CStdDialogImplBase - Base implementation of standard dialog -// CStdDialogImpl : Standard dialog implementation -// CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog -// CStdAxDialogImpl : Standard AxDialog implementation -// CStdSimpleDialog : Standard simple dialog -// CStdDialogResizeImplBase - Base implementation of orientation resizing standard dialog -// CStdDialogResizeImpl : Orientation resizing standard dialog implementation -// CStdAxDialogResizeImpl - implementation of orientation resizing standard AxDialog -// CStdSimpleDialogResizeImpl : Standard resizing simple dialog implementation -// CStdOrientedDialogBase - Oriented PPC standard dialog base class -// CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation -// CStdOrientedDialogImpl : Oriented PPC standard dialog implementation -// CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation -// CStdSimpleOrientedDialog : Standard simple orientable dialog -// -// CAppInfoBase : Helper for application state save/restore to registry -// CAppInfoT : CAppInfoBase constructed from a CAppWindow -// CAppWindowBase : Base class for PPC/SmartPhone well-behaved application window or dialog -// CAppWindow : PPC/SmartPhone well-behaved application window class -// CAppDialog : PPC/SmartPhone well-behaved application dialog class -// CAppStdDialogImplBase - Base implementation of standard application dialogs -// CAppStdDialogImpl : Implementation of standard application dialog -// CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog -// CAppStdAxDialogImpl - Implementation of standard application AxDialog -// CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog -// CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog -// CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog -// -// CFullScreenFrame : Full screen frame class -// -// CZoomScrollImpl : WinCE zooming implementation -// -// CBottomTabViewImpl - CBottomTabView -// CHtmlCtrlT - CHtmlCtrl -// CRichInkCtrlT - CRichInkCtrl -// CInkXCtrlT - CInkXCtrl -// CVoiceRecorderCtrlT - CVoiceRecorderCtrl -// CDocListCtrlT - CDocListCtrl -// CCapEditT - CCapEdit -// CTTStaticT - CTTStatic -// CTTButtonT - CTTButton -// -// CSpinCtrlT - CSpinCtrl : SmartPhone specific UpDown control -// CSpinned : SmartPhone association of control and Spin -// CSpinListBox : SmartPhone spinned ListBox control -// CExpandListBox : SmartPhone expandable ListBox control -// CExpandEdit : SmartPhone expandable Edit control -// CExpandCapEdit : SmartPhone expandable CapEdit control -// -// Global functions: -// AtlCreateMenuBar() -// AtlCreateEmptyMenuBar() -// AtlIsEditFocus() -// AtlActivateBackKey() - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// MenuBar creation functions for property sheets and dialogs -// Frame windows use CreateSimpleCEMenuBar - -inline HWND AtlCreateMenuBar(SHMENUBARINFO& mbi) -{ - ATLASSERT(::IsWindow(mbi.hwndParent)); - ATLVERIFY(::SHCreateMenuBar(&mbi) != FALSE); - return mbi.hwndMB; -}; - -inline HWND AtlCreateMenuBar(HWND hWnd, UINT nToolBarId = ATL_IDW_TOOLBAR, DWORD dwFlags = 0, int nBmpId = 0, int cBmpImages = 0, COLORREF clrBk = 0) -{ - SHMENUBARINFO mbi = { sizeof(mbi), hWnd, dwFlags, nToolBarId, ModuleHelper::GetResourceInstance(), nBmpId, cBmpImages, 0, clrBk }; - return AtlCreateMenuBar(mbi); -} - -inline HWND AtlCreateEmptyMenuBar(HWND hWnd, bool bSip = true) -{ - SHMENUBARINFO embi = { sizeof(SHMENUBARINFO), hWnd, SHCMBF_EMPTYBAR }; - if (!bSip) - embi.dwFlags |= SHCMBF_HIDESIPBUTTON; - - return AtlCreateMenuBar(embi); -} - -/////////////////////////////////////////////////////////////////////////////// -// Helper functions for SmartPhone back key handling - -inline bool AtlIsEditFocus() -{ - ATL::CWindow wCtrl = GetFocus(); - if (wCtrl.IsWindow()) - { - TCHAR szClassName[8] = {0}; - ATLVERIFY(::GetClassName(wCtrl.m_hWnd, szClassName, 8)); - return !_tcscmp(szClassName, _T("Edit")) || !_tcscmp(szClassName, WC_CAPEDIT); - } - return false; -} - -#if defined WIN32_PLATFORM_WFSP -inline void AtlActivateBackKey(HWND hMenuBar) -{ - ATLASSERT(::IsWindow(hMenuBar)); - ::SendMessage(hMenuBar, SHCMBM_OVERRIDEKEY, VK_TBACK, - MAKELPARAM(SHMBOF_NODEFAULT | SHMBOF_NOTIFY, SHMBOF_NODEFAULT | SHMBOF_NOTIFY)); -} -#endif // WIN32_PLATFORM_WFSP - -// --- Standard PPC/SmartPhone dialogs --- - -#ifndef _WTL_CE_NO_DIALOGS - -/////////////////////////////////////////////////////////////////////////////// -// CStdDialogBase - base class for standard PPC/SmartPhone dialogs - -#define WTL_STD_SHIDIF SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN -#define WTL_SP_SHIDIF SHIDIF_SIZEDLGFULLSCREEN - -// Title setting macros -#define WTL_DLG_TITLEHEIGHT(iHeight) static const int GetTitleHeight(){return iHeight;} -#define WTL_DLG_NOTITLE WTL_DLG_TITLEHEIGHT(0) - -/////////////////////////////////////////////////////////////////////////////// -// CStdDialogBase - Base class for standard PPC/SmartPhone dialog - -template -class CStdDialogBase -{ -public: -#ifdef WIN32_PLATFORM_PSPC -// Pocket PC only Dialog title handling - const int nTitleHeight; - - CStdDialogBase() : nTitleHeight(T::GetTitleHeight()) - { } - -// Overloads - BOOL GetClientRect(LPRECT lpRect) - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - BOOL bRes = ::GetClientRect(pT->m_hWnd, lpRect); - if (nTitleHeight) - lpRect->top += nTitleHeight + 1; - return bRes; - } - - BOOL SetWindowText(LPCTSTR lpszString) - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - BOOL bRes = ::SetWindowText(pT->m_hWnd, lpszString); - if (nTitleHeight != 0) - pT->DoPaintTitle(); - return bRes; - } - -// Overrideables - static const int GetTitleHeight() - { - #ifdef _WTL_CE_DRA - return DRA::SCALEY(24); - #else // !_WTL_CE_DRA - CWindowDC dc(NULL); - return dc.GetDeviceCaps(LOGPIXELSY) >> 2; // LOGPIXELSY * 24 / 96, - #endif // !_WTL_CE_DRA - } - - // Title painting - bool DoPaintTitle() - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - TCHAR sTitle[48]; - - // Preparation - CPaintDC dc(pT->m_hWnd); - CFont fontTitle = AtlCreateBoldFont(); - CFontHandle fontOld = dc.SelectFont(fontTitle); - dc.SetTextColor(GetSysColor(COLOR_HIGHLIGHT)); - int nLen = pT->GetWindowText(sTitle, 48); - int nWidth = dc.GetDeviceCaps(HORZRES); - - // Display title text - RECT rTitle = { 0, 0, nWidth, nTitleHeight }; - dc.FillRect(&rTitle, COLOR_3DHIGHLIGHT); - #ifdef _WTL_CE_DRA - rTitle.left = DRA::SCALEX(8); - #else // !_WTL_CE_DRA - rTitle.left = nTitleHeight / 3; // 8 == 24 / 3 - #endif // !_WTL_CE_DRA - dc.DrawText(sTitle, nLen, &rTitle, DT_VCENTER | DT_SINGLELINE); - dc.SelectFont(fontOld); - - // Draw bottom line, 2 pixels thick if HI_RES_AWARE - CPenHandle penOld = dc.SelectStockPen(BLACK_PEN); - POINT line[4] = {{0, nTitleHeight}, {nWidth, nTitleHeight}, {0, nTitleHeight - 1}, {nWidth, nTitleHeight - 1}}; - - #ifdef _WTL_CE_DRA - int nSeg = DRA::SCALEY(1); - #else // !_WTL_CE_DRA - int nSeg = nTitleHeight / 24; - #endif // !_WTL_CE_DRA - - dc.Polyline(line, nSeg <= 2 ? nSeg * 2 : 4); - dc.SelectPen(penOld); - - return false; - } - - // Title preparation: move the dialog controls down to make room for title - void DialogTitleInit() - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - - ATL::CWindow wCtl = pT->GetWindow(GW_CHILD); - while (wCtl.IsWindow()) - { - RECT rCtl = { 0 }; - wCtl.GetWindowRect(&rCtl); - ::MapWindowPoints(NULL, pT->m_hWnd, (LPPOINT)&rCtl, 2); - ::OffsetRect(&rCtl, 0, nTitleHeight); - wCtl.MoveWindow(&rCtl, FALSE); - wCtl = wCtl.GetWindow(GW_HWNDNEXT); - } - } - - // SIP management - void DoSipInfo() - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - - SIPINFO si = {sizeof(SIPINFO)}; - SipGetInfo(&si); - if ((si.fdwFlags & SIPF_ON) ^ SIPF_ON) - si.rcVisibleDesktop.bottom = si.rcSipRect.bottom; - pT->MoveWindow(&si.rcVisibleDesktop, FALSE); - } - -// Title painting handler - LRESULT OnPaintTitle(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - T* pT = static_cast(this); - return bHandled = nTitleHeight ? pT->DoPaintTitle() : FALSE; - } - -// SIP handler - LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - T* pT = static_cast(this); - if (wParam == SPI_SETSIPINFO) - { - pT->DoSipInfo(); - return TRUE; - } - return bHandled = FALSE; - } - -#elif defined WIN32_PLATFORM_WFSP -// SmartPhone VK_TBACK key standard management - LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - const UINT uModif = (UINT)LOWORD(lParam); - const UINT uVirtKey = (UINT)HIWORD(lParam); - - if(uVirtKey == VK_TBACK) - if (AtlIsEditFocus()) - ::SHSendBackToFocusWindow(uMsg, wParam, lParam); - else if (uModif & MOD_KEYUP) - pT->StdCloseDialog(IDCANCEL); - return 1; - } - - // SmartPhone MenuBar and VK_TBACK key initialization - void StdSPInit() - { - T* pT = static_cast(this); - HWND hMenuBar = ::SHFindMenuBar(pT->m_hWnd); - - if (!hMenuBar && (t_shidiFlags & SHIDIF_DONEBUTTON)) - hMenuBar = CreateMenuBar(ATL_IDM_MENU_DONE); - - if(hMenuBar != NULL) - AtlActivateBackKey(hMenuBar); - } - - void SetStaticBold() - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - - CFontHandle fontBold = AtlCreateBoldFont(pT->GetFont()); - - ATL::CWindow wCtl = pT->GetWindow(GW_CHILD); - - while (wCtl.IsWindow()) - { - if ((short int)wCtl.GetDlgCtrlID() == IDC_STATIC) - wCtl.SetFont(fontBold); - wCtl = wCtl.GetWindow(GW_HWNDNEXT); - } - } -#endif // WIN32_PLATFORM_WFSP - -// Platform dependant initialization - void StdPlatformInit() - { - T* pT = static_cast(this); -#ifdef WIN32_PLATFORM_PSPC // Pocket PC title initialization - if (nTitleHeight != 0) - pT->DialogTitleInit(); -#elif defined(WIN32_PLATFORM_WFSP) - pT->StdSPInit(); - SetStaticBold(); -#endif // WIN32_PLATFORM_WFSP - } - - // Menu bar creation - HWND CreateMenuBar(UINT uiMB = T::IDD, int nBmpImages = 0) - { - T* pT = static_cast(this); - return AtlCreateMenuBar(pT->m_hWnd, uiMB, 0, nBmpImages ? uiMB : 0, nBmpImages); - } - - // Dialog closing - void StdCloseDialog(WORD wID) - { - T* pT = static_cast(this); - if (t_bModal) - ::EndDialog(pT->m_hWnd, wID); - else - pT->DestroyWindow(); - } - - // Shell dialog layout initialization - void StdShidInit() - { - T* pT = static_cast(this); - SHINITDLGINFO shidi = { SHIDIM_FLAGS, pT->m_hWnd, t_shidiFlags }; - ::SHInitDialog(&shidi); - } - -// IDC_INFOSTATIC background setting - LRESULT OnColorStatic(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - if (::GetDlgCtrlID((HWND)lParam) == IDC_INFOSTATIC) - { - ::SetBkMode((HDC)wParam, TRANSPARENT); - return (LRESULT)::GetSysColorBrush(COLOR_INFOBK); - } - return bHandled = FALSE; - } - -// Menu dialog ending - LRESULT OnMenuClose(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->StdCloseDialog((WORD)(wID - ID_MENU_OK + IDOK)); - return 0; - } - -// Standard dialog ending: may be used with any command - LRESULT OnCloseCmd(WORD /*wNotifyCode*/, WORD wID, HWND /*hWndCtl*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->StdCloseDialog(wID); - return 0; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CStdDialogImplBase - Base implementation of standard PPC/SmartPhone dialog - -template > -class ATL_NO_VTABLE CStdDialogImplBase : - public TBase, - public CStdDialogBase -{ -public: -#ifdef WIN32_PLATFORM_PSPC - BOOL GetClientRect(LPRECT lpRect) - { - return CStdDialogBase::GetClientRect(lpRect); - } - - BOOL SetWindowText(LPCTSTR lpszString) - { - return CStdDialogBase::SetWindowText(lpszString); - } -#endif - - BEGIN_MSG_MAP(CStdDialogImplBase) -#ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP - MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) -#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key - MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) -#endif - MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) - COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) - END_MSG_MAP() - - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _DEBUG - T* pT = static_cast(this); - ATLASSERT(t_bModal == pT->m_bModal); -#endif - StdPlatformInit(); - StdShidInit(); - return bHandled = FALSE; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CStdDialogImpl - implementation of standard PPC/SmartPhone dialog - -template -class ATL_NO_VTABLE CStdDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal> -{}; - -/////////////////////////////////////////////////////////////////////////////// -// CStdIndirectDialogImpl - implementation of standard indirect PPC/SmartPhone dialog - -#if defined __ATLDLGS_H__ - -template -class ATL_NO_VTABLE CStdIndirectDialogImpl : - public CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl > -{ -public: - typedef CIndirectDialogImpl< T, CMemDlgTemplate, CStdDialogImpl > _baseClass; - typedef CStdDialogImpl _baseStd; - - void CheckStyle() - { - // Mobile devices don't support DLGTEMPLATEEX - ATLASSERT(!m_Template.IsTemplateEx()); - - // Standard dialogs need only DS_CENTER - DWORD &dwStyle = m_Template.GetTemplatePtr()->style; - if (dwStyle & DS_CENTER) - if(t_bModal) - { - ATLASSERT((dwStyle & WS_CHILD) != WS_CHILD); - dwStyle |= WS_POPUP; - } - else - { - if((dwStyle & WS_CHILD) != WS_CHILD) - dwStyle |= WS_POPUP; - } - } - - INT_PTR DoModal(HWND hWndParent = ::GetActiveWindow(), LPARAM dwInitParam = NULL) - { - ATLASSERT(t_bModal); - - if (!m_Template.IsValid()) - CreateTemplate(); - - CheckStyle(); - - return _baseClass::DoModal(hWndParent, dwInitParam); - } - - HWND Create(HWND hWndParent, LPARAM dwInitParam = NULL) - { - ATLASSERT(!t_bModal); - - if (!m_Template.IsValid()) - CreateTemplate(); - - CheckStyle(); - - return _baseClass::Create(hWndParent, dwInitParam); - } - - BEGIN_MSG_MAP(CStdIndirectDialogImpl) - CHAIN_MSG_MAP(_baseStd) - END_MSG_MAP() - -}; - -#endif // defined __ATLDLGS_H__ - -#ifndef _ATL_NO_HOSTING - -/////////////////////////////////////////////////////////////////////////////// -// CStdAxDialogImpl - implementation of standard PPC/SmartPhone AxDialog - -template -class ATL_NO_VTABLE CStdAxDialogImpl : public CStdDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl< T > > -{}; -#endif // _ATL_NO_HOSTING - -/////////////////////////////////////////////////////////////////////////////// -// CStdSimpleDialog - standard PPC/SmartPhone simple dialog with SHIDIF_xxx flags - -template -class CStdSimpleDialog : - public ATL::CSimpleDialog, - public CStdDialogBase, t_shidiFlags> -{ -public: - typedef CStdDialogBase, t_shidiFlags> baseClass; - -#ifdef WIN32_PLATFORM_PSPC - BOOL GetClientRect(LPRECT lpRect) - { - return baseClass::GetClientRect(lpRect); - } - - BOOL SetWindowText(LPCTSTR lpszString) - { - return baseClass::SetWindowText(lpszString); - } -#endif - - BEGIN_MSG_MAP(CStdSimpleDialog) -#ifdef WIN32_PLATFORM_PSPC // Pocket PC title and SIP - MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) -#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key - MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) -#endif - MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) - COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) - END_MSG_MAP() - - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - StdPlatformInit(); - StdShidInit(); - return bHandled = FALSE; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CStdDialogResizeImplBase - Base implementation of orientation resizing standard PPC/SmartPhone dialog - -template > -class ATL_NO_VTABLE CStdDialogResizeImplBase : - public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>, - public CDialogResize -{ -public: - // Note: BEGIN_DLGRESIZE_MAP is required in the derived class. - - BEGIN_MSG_MAP(CStdResizeDialogImplBase) -#ifdef WIN32_PLATFORM_PSPC // Pocket PC title - MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) -#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key - MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) -#endif - MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) - COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) - CHAIN_MSG_MAP(CDialogResize< T >) - END_MSG_MAP() - - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifdef _DEBUG - T* pT = static_cast(this); - ATLASSERT(t_bModal == pT->m_bModal); -#endif - StdPlatformInit(); - DlgResize_Init(FALSE); - StdShidInit(); - return bHandled = FALSE; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CStdDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone dialog - -template -class ATL_NO_VTABLE CStdDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal> -{}; - -#ifndef _ATL_NO_HOSTING - -/////////////////////////////////////////////////////////////////////////////// -// CStdAxDialogResizeImpl - implementation of orientation resizing standard PPC/SmartPhone AxDialog - -template -class ATL_NO_VTABLE CStdAxDialogResizeImpl : public CStdDialogResizeImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl > -{}; -#endif // _ATL_NO_HOSTING - -/////////////////////////////////////////////////////////////////////////////// -// CStdSimpleDialogResizeImpl - implementation of standard resizing simple dialog with SHIDIF_xxx flags - -// Usage: -// class CMyDlg : public CStdSimpleDialogResize -// { -// public: -// BEGIN_DLGRESIZE_MAP(CMyDlg) -// ... -// END_DLGRESIZE_MAP() -// }; - -template -class ATL_NO_VTABLE CStdSimpleDialogResizeImpl : - public CStdSimpleDialog, - public CDialogResize< T > -{ -public: - typedef CStdSimpleDialog::baseClass baseClass; - - BEGIN_MSG_MAP(CStdSimpleDialogResizeImpl) -#ifdef WIN32_PLATFORM_PSPC // Pocket PC title - MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) -#elif defined(WIN32_PLATFORM_WFSP) // SmartPhone VK_TBACK key - MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) -#endif - MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) - COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) - CHAIN_MSG_MAP(CDialogResize< T >) - END_MSG_MAP() - - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - StdPlatformInit(); - DlgResize_Init(FALSE); - StdShidInit(); - return bHandled = FALSE; - } -}; - -#if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) - -/////////////////////////////////////////////////////////////////////////////// -// CStdOrientedDialogBase - Oriented PPC standard dialog base class - -template -class CStdOrientedDialogBase -{ -public: -// Operation - BOOL SetOrientation(DRA::DisplayMode mode) - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - ATLASSERT(mode == DRA::GetDisplayMode()); - - // Derived dialog must enumerate TWO dialog templates with the same control ids and types ie: - // enum { IDD = IDD_MYDLG, IDD_LANDSCAPE = IDD_MYDLG_L }; - UINT iResource = (mode == DRA::Landscape)? T::IDD_LANDSCAPE : T::IDD; - - BOOL bRes = DRA::RelayoutDialog(ModuleHelper::GetResourceInstance(), pT->m_hWnd, MAKEINTRESOURCE(iResource)); - pT->OnOrientation(mode); - return bRes; - } - -// Override - void OnOrientation(DRA::DisplayMode /*mode*/) - {} - -// Message handlers - LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - if (wParam == SETTINGCHANGE_RESET) - { - SetOrientation(DRA::GetDisplayMode()); - pT->StdPlatformInit(); - pT->StdShidInit(); - } - else if (wParam == SPI_SETSIPINFO) - { - pT->DoSipInfo(); - return TRUE; - } - return bHandled = FALSE; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CStdOrientedDialogImplBase - Oriented PPC standard dialog base implementation - -template > -class ATL_NO_VTABLE CStdOrientedDialogImplBase : - public CStdDialogImplBase< T, t_shidiFlags, t_bModal, TBase>, - public CStdOrientedDialogBase -{ -public: - BEGIN_MSG_MAP(CStdOrientedDialogImpl) - MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) - MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) - MESSAGE_HANDLER(WM_SETTINGCHANGE, CStdOrientedDialogBase::OnSettingChange) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, OnCloseCmd) - COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) - END_MSG_MAP() - - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - T* pT = static_cast(this); -#ifdef _DEBUG - ATLASSERT(t_bModal == pT->m_bModal); -#endif - if (DRA::GetDisplayMode() == DRA::Landscape) - SetOrientation(DRA::Landscape); - pT->StdPlatformInit(); - pT->StdShidInit(); - return bHandled = FALSE; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CStdOrientedDialogImpl - Oriented PPC standard dialog implementation - -template -class ATL_NO_VTABLE CStdOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal> -{}; - -#ifndef _ATL_NO_HOSTING -/////////////////////////////////////////////////////////////////////////////// -// CStdAxOrientedDialogImpl - Oriented PPC standard AxDialog implementation - -template -class ATL_NO_VTABLE CStdAxOrientedDialogImpl : public CStdOrientedDialogImplBase< T, t_shidiFlags, t_bModal, ATL::CAxDialogImpl > -{}; -#endif // _ATL_NO_HOSTING - -/////////////////////////////////////////////////////////////////////////////// -// CStdSimpleOrientedDialog - Standard simple orientable dialog - -template -class CStdSimpleOrientedDialog : - public CStdSimpleDialog, - public CStdOrientedDialogBase > -{ -public: - typedef CStdSimpleDialog::baseClass baseClass; - typedef CStdOrientedDialogBase > baseOriented; - - enum {IDD = t_wDlgTemplateID, IDD_LANDSCAPE = t_wDlgLandscapeID}; - - BEGIN_MSG_MAP(CStdSimpleDialog) - MESSAGE_HANDLER(WM_PAINT, OnPaintTitle) - MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnColorStatic) - MESSAGE_HANDLER(WM_SETTINGCHANGE, baseOriented::OnSettingChange) - MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) - COMMAND_RANGE_HANDLER(IDOK, IDCANCEL, baseClass::OnCloseCmd) - COMMAND_RANGE_HANDLER(ID_MENU_OK, ID_MENU_CANCEL, OnMenuClose) - END_MSG_MAP() - - LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - if (DRA::GetDisplayMode() == DRA::Landscape) - SetOrientation(DRA::Landscape); - StdPlatformInit(); - StdShidInit(); - return bHandled = FALSE; - } -}; - -#endif // _WTL_CE_DRA - - -#endif // _WTL_CE_NO_DIALOGS - - -// --- PPC/SmartPhone application window and helpers --- - -#ifndef _WTL_CE_NO_APPWINDOW - -/////////////////////////////////////////////////////////////////////////////// -// CAppInfoBase - Helper for application state save/restore to registry - -class CAppInfoBase -{ -public: - CRegKeyEx m_Key; - - CAppInfoBase(ATL::_U_STRINGorID sAppKey) - { - m_Key.Create(HKEY_CURRENT_USER, sAppKey.m_lpstr); - ATLASSERT(m_Key.m_hKey); - } - - template - LONG Save(V& val, ATL::_U_STRINGorID sName) - { - return m_Key.SetBinaryValue(sName.m_lpstr, &val, sizeof(V)); - } - - template - LONG Save(int nb, V& val0, ATL::_U_STRINGorID sName) - { - return m_Key.SetBinaryValue(sName.m_lpstr, &val0, nb * sizeof(V)); - } - - template - LONG Restore(V& val, ATL::_U_STRINGorID sName) - { - ULONG bufSize = sizeof(V); - return m_Key.QueryBinaryValue(sName.m_lpstr, &val, &bufSize); - } - - template - LONG Restore(int nb, V& val0, ATL::_U_STRINGorID sName) - { - ULONG bufSize = nb * sizeof(V); - return m_Key.QueryBinaryValue(sName.m_lpstr, &val0, &bufSize); - } - -#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - LONG Save(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) - { - return m_Key.SetStringValue(sName.m_lpstr, sval); - } - - LONG Restore(_CSTRING_NS::CString& sval, ATL::_U_STRINGorID sName) - { - DWORD size = MAX_PATH; - LONG res = m_Key.QueryStringValue(sName.m_lpstr, sval.GetBuffer(size), &size); - sval.ReleaseBuffer(); - return res; - } -#else - #pragma message("Warning: CAppInfoBase compiles without CString support. Do not use CString in Save or Restore.") -#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__) - - LONG Save(LPCTSTR sval, ATL::_U_STRINGorID sName) - { - return m_Key.SetStringValue(sName.m_lpstr, sval); - } - - LONG Restore(LPTSTR sval, ATL::_U_STRINGorID sName, DWORD *plength) - { - return m_Key.QueryStringValue(sName.m_lpstr, sval, plength); - } - - LONG Delete(ATL::_U_STRINGorID sName) - { - return m_Key.DeleteValue(sName.m_lpstr); - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAppInfoT - CAppInfoBase constructed from a class with T::GetAppKey() - -// Macro for declaring AppKey -#define DECLARE_APPKEY(uAppKey) \ - static LPCTSTR GetAppKey() \ - { \ - static LPCTSTR sAppKey = ATL::_U_STRINGorID(uAppKey).m_lpstr; \ - return sAppKey; \ - } - -template -class CAppInfoT : public CAppInfoBase -{ -public: - CAppInfoT() : CAppInfoBase(T::GetAppKey()){} -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAppWindowBase - Base class for PPC/SmartPhone "well-behaved" application window or dialog - -// Macros for declaring frame WNDCLASS and AppKey -#define DECLARE_APP_FRAME_CLASS(WndClassName, uCommonResourceID, uAppKey) \ - DECLARE_FRAME_WND_CLASS(WndClassName, uCommonResourceID) \ - DECLARE_APPKEY(uAppKey) - -#define DECLARE_APP_FRAME_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd, uAppKey) \ - DECLARE_FRAME_WND_CLASS_EX(WndClassName, uCommonResourceID, style, bkgnd) \ - DECLARE_APPKEY(uAppKey) - -template -class CAppWindowBase -{ -public: - typedef class CAppInfoT< T > CAppInfo; - -#ifndef WIN32_PLATFORM_WFSP - SHACTIVATEINFO m_sai; // NoOp on SmartPhones -#endif // WIN32_PLATFORM_WFSP - - bool m_bHibernate; - - CAppWindowBase< T >() : m_bHibernate(false) - { -#ifndef WIN32_PLATFORM_WFSP - SHACTIVATEINFO sai = { sizeof(SHACTIVATEINFO) }; - m_sai = sai; -#endif // WIN32_PLATFORM_WFSP - }; - - // Same as WTL 7.1 AppWizard generated ActivatePreviousInstance + SendMessage WM_COPYDATA - static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine, bool bDialog) - { - // requires T does DECLARE_APP_FRAME_CLASS, DECLARE_APP_FRAME_CLASS_EX or DECLARE_APP_DLG_CLASS - CFrameWndClassInfo& classInfo = T::GetWndClassInfo(); - - ATLVERIFY(::LoadString(hInstance, classInfo.m_uCommonResourceID, classInfo.m_szAutoName, sizeof(classInfo.m_szAutoName)/sizeof(classInfo.m_szAutoName[0])) != 0); - - classInfo.m_wc.lpszClassName = classInfo.m_szAutoName; - - const TCHAR* pszClass = classInfo.m_wc.lpszClassName; - - if(NULL == pszClass || '\0' == *pszClass) - { - return E_FAIL; - } - - const DWORD dRetryInterval = 100; - const int iMaxRetries = 25; - - for(int i = 0; i < iMaxRetries; ++i) - { - HANDLE hMutex = CreateMutex(NULL, FALSE, pszClass); - - DWORD dw = GetLastError(); - - if(NULL == hMutex) - { - HRESULT hr; - - switch(dw) - { - case ERROR_INVALID_HANDLE: - // A non-mutext object with this name already exists. - hr = E_INVALIDARG; - break; - default: - // This should never happen... - hr = E_FAIL; - } - - return hr; - } - - // If the mutex already exists, then there should be another instance running - if(dw == ERROR_ALREADY_EXISTS) - { - CloseHandle(hMutex); - - HWND hwnd = NULL; - if (bDialog) - hwnd = FindWindow(NULL, pszClass); - else - hwnd = FindWindow(pszClass, NULL); - - if(hwnd == NULL) - { - Sleep(dRetryInterval); - continue; - } - else - { - // Transmit our params to previous instance - if (lpstrCmdLine && *lpstrCmdLine) - { - COPYDATASTRUCT cd = { NULL, sizeof(TCHAR) * (wcslen(lpstrCmdLine) + 1), (PVOID)lpstrCmdLine }; - ::SendMessage(hwnd, WM_COPYDATA, NULL, (LPARAM)&cd); - } - // Set the previous instance as the foreground window - if(0 != SetForegroundWindow(reinterpret_cast(reinterpret_cast(hwnd) | 0x1))) - return S_FALSE; - } - } - else - { - return S_OK; - } - } - return S_OK; - } - -// Operations overriden in derived class - bool AppHibernate(bool /*bHibernate*/) - { - return false; - } - - bool AppNewInstance(LPCTSTR /*lpstrCmdLine*/) - { - return false; - } - - void AppSave() - { - } - -#ifdef WIN32_PLATFORM_WFSP - void AppBackKey() - { - ::SHNavigateBack(); - } -#endif - -// Message map and handlers - BEGIN_MSG_MAP(CAppWindowBase) - MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) -#ifdef WIN32_PLATFORM_WFSP - MESSAGE_HANDLER(WM_HOTKEY, OnHotKey) -#else - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) -#endif // WIN32_PLATFORM_WFSP - MESSAGE_HANDLER(WM_HIBERNATE, OnHibernate) - MESSAGE_HANDLER(WM_COPYDATA, OnNewInstance) - MESSAGE_HANDLER(WM_CLOSE, OnClose) - END_MSG_MAP() - - LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - if (m_bHibernate) - m_bHibernate = pT->AppHibernate(false); -#ifndef WIN32_PLATFORM_WFSP - ::SHHandleWMActivate(pT->m_hWnd, wParam, lParam, &m_sai, 0); -#else - wParam; - lParam; -#endif // WIN32_PLATFORM_WFSP - return bHandled = FALSE; - } - -#ifdef WIN32_PLATFORM_WFSP -// SmartPhone VK_TBACK key standard management - LRESULT OnHotKey(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - const UINT uModif = (UINT)LOWORD(lParam); - const UINT uVirtKey = (UINT)HIWORD(lParam); - if(uVirtKey == VK_TBACK) - if (AtlIsEditFocus()) - ::SHSendBackToFocusWindow(uMsg, wParam, lParam); - else if (uModif & MOD_KEYUP) - pT->AppBackKey(); - return 1; - } - -#else // !WIN32_PLATFORM_WFSP -// PPC SIP handling - LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) - { - T* pT = static_cast(this); - bHandled = FALSE; - return ::SHHandleWMSettingChange(pT->m_hWnd, wParam, lParam, &m_sai); - } -#endif // !WIN32_PLATFORM_WFSP - - LRESULT OnHibernate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - return m_bHibernate = pT->AppHibernate(true); - } - - LRESULT OnNewInstance(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM lParam, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - PCOPYDATASTRUCT pcds = (PCOPYDATASTRUCT)lParam; - return pT->AppNewInstance((LPCTSTR)pcds->lpData); - } - - LRESULT OnClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled) - { - T* pT = static_cast(this); - pT->AppSave(); - bHandled = FALSE; - return 1; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CAppWindow - PPC/SmartPhone "well-behaved" application window class - -template -class CAppWindow : public CAppWindowBase< T > -{ -public: - // Same as WTL 7.1 AppWizard generated Run + lpstrCmdLine in CreateEx - static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL) - { - CMessageLoop theLoop; - _Module.AddMessageLoop(&theLoop); - - T wndMain; - - if(wndMain.CreateEx(NULL, NULL, 0, 0, lpstrCmdLine) == NULL) - { - ATLTRACE2(atlTraceUI, 0, _T("Main window creation failed!\n")); - return 0; - } - - wndMain.ShowWindow(nCmdShow); - - int nRet = theLoop.Run(); - - _Module.RemoveMessageLoop(); - return nRet; - } - - static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine) - { - return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, false); - } -}; - - -#ifndef _WTL_CE_NO_DIALOGS - -/////////////////////////////////////////////////////////////////////////////// -// CAppDialog - PPC/SmartPhone "well-behaved" dialog application class - -// Macro for declaring dialog WNDCLASS and AppKey -#define DECLARE_APP_DLG_CLASS(WndClassName, uCommonResourceID, uAppKey) \ - static WTL::CFrameWndClassInfo& GetWndClassInfo() \ - { \ - static WTL::CFrameWndClassInfo wc = \ - { \ - { 0, (WNDPROC)StartDialogProc, \ - 0, 0, NULL, NULL, NULL, (HBRUSH)(COLOR_WINDOW + 1), NULL, WndClassName }, \ - NULL, NULL, IDC_ARROW, TRUE, 0, _T(""), uCommonResourceID \ - }; \ - return wc; \ - }; \ - DECLARE_APPKEY(uAppKey) - -template -class CAppDialog : public CAppWindowBase< T > -{ -public: - static int AppRun(LPTSTR lpstrCmdLine = NULL, int nCmdShow = SW_SHOWNORMAL) - { - CMessageLoop theLoop; - _Module.AddMessageLoop(&theLoop); - - T dlgMain; - - if(dlgMain.Create(NULL, (LPARAM)lpstrCmdLine) == NULL) - { - ATLTRACE2(atlTraceUI, 0, _T("Main dialog creation failed!\n")); - return 0; - } - - dlgMain.ShowWindow(nCmdShow); - - int nRet = theLoop.Run(); - - _Module.RemoveMessageLoop(); - return nRet; - } - - static HRESULT ActivatePreviousInstance(HINSTANCE hInstance, LPCTSTR lpstrCmdLine) - { - return CAppWindowBase< T >::ActivatePreviousInstance(hInstance, lpstrCmdLine, true); - }; -}; - -// PPC/SmartPhone standard application dialogs - -#ifdef WIN32_PLATFORM_WFSP -#define WTL_APP_SHIDIF WTL_SP_SHIDIF -#else -#define WTL_APP_SHIDIF WTL_STD_SHIDIF -#endif - -/////////////////////////////////////////////////////////////////////////////// -// CAppStdDialogImplBase - Base implementation of standard application dialogs - -template -class ATL_NO_VTABLE CAppStdDialogImplBase : - public TImplBase, - public CAppDialog< T > -{ -public: - WTL_DLG_NOTITLE; - - void StdCloseDialog(int nVal) - { - T* pT = static_cast(this); - if (nVal != IDCANCEL) - pT->AppSave(); - if (t_bModal == false) - { - pT->DestroyWindow(); - ::PostQuitMessage(nVal); - } - else - ::EndDialog(pT->m_hWnd, nVal); - } - - BEGIN_MSG_MAP(CAppStdDialogImplBase) - MESSAGE_HANDLER(WM_CLOSE, OnSystemClose) - CHAIN_MSG_MAP(TImplBase) - CHAIN_MSG_MAP(CAppDialog< T >) - END_MSG_MAP() - - LRESULT OnSystemClose(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/) - { - T* pT = static_cast(this); - pT->StdCloseDialog(IDCANCEL); - return 0; - } -}; - -/////////////////////////////////////////////////////////////////////////////// -// CAppStdDialogImpl - Implementation of standard application dialog - -template -class ATL_NO_VTABLE CAppStdDialogImpl : - public CAppStdDialogImplBase, t_shidiFlags, t_bModal> -{}; - -/////////////////////////////////////////////////////////////////////////////// -// CAppStdDialogResizeImpl - implementation of orientation resizing standard application dialog - -template -class ATL_NO_VTABLE CAppStdDialogResizeImpl : - public CAppStdDialogImplBase, t_shidiFlags, t_bModal> -{}; - -#ifndef _ATL_NO_HOSTING -/////////////////////////////////////////////////////////////////////////////// -// CAppStdAxDialogImpl - Implementation of standard application AxDialog - -template -class ATL_NO_VTABLE CAppStdAxDialogImpl : - public CAppStdDialogImplBase, t_shidiFlags, t_bModal> -{}; - -/////////////////////////////////////////////////////////////////////////////// -// CAppStdAxDialogResizeImpl - implementation of orientation resizing standard application AxDialog - -template -class ATL_NO_VTABLE CAppStdAxDialogResizeImpl : - public CAppStdDialogImplBase, t_shidiFlags, t_bModal> -{}; -#endif // _ATL_NO_HOSTING - -#if defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) -/////////////////////////////////////////////////////////////////////////////// -// CAppStdOrientedDialogImpl - implementation of oriented PPC standard application dialog - -template -class ATL_NO_VTABLE CAppStdOrientedDialogImpl : - public CAppStdDialogImplBase, t_shidiFlags, t_bModal> -{}; - -#ifndef _ATL_NO_HOSTING -/////////////////////////////////////////////////////////////////////////////// -// CAppStdAxOrientedDialogImpl - implementation of oriented PPC standard application AxDialog - -template -class ATL_NO_VTABLE CAppStdAxOrientedDialogImpl : - public CAppStdDialogImplBase, t_shidiFlags, t_bModal> -{}; -#endif // _ATL_NO_HOSTING - -#endif // defined(_WTL_CE_DRA) && defined(WIN32_PLATFORM_PSPC) - -#endif // _WTL_CE_NO_DIALOGS - -#endif // _WTL_CE_NO_APPWINDOW - - -// --- Full screen support --- - -#ifndef _WTL_CE_NO_FULLSCREEN - -/////////////////////////////////////////////////////////////////////////////// -// CFullScreenFrame - full screen frame implementation - -template -class CFullScreenFrame -{ -public: - bool m_bFullScreen; - - CFullScreenFrame() : m_bFullScreen(false) - { } - -// Operation - void SetFullScreen(bool bFull) - { - m_bFullScreen = bFull; - ShowTaskBar(!bFull, false); - ShowMenuBar(!bFull); - } - -// Manage TaskBar for modal dialogs and property sheets - template - int FSDoModal(D& dlg) - { - T* pT = static_cast(this); - pT; // avoid level 4 warning - ATLASSERT(pT->IsWindow()); - if (m_bFullScreen) // Show taskbar if hidden - ShowTaskBar(true, false); - int iRet = dlg.DoModal(); - if (m_bFullScreen) // Hide taskbar if restored - ShowTaskBar(false); - return iRet; - } - -// Implementation - void ShowMenuBar(bool bShow) - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - ATL::CWindow MenuBar = pT->m_hWndCECommandBar; - ATLASSERT(MenuBar.IsWindow()); - MenuBar.ShowWindow(bShow ? SW_SHOWNORMAL : SW_HIDE); - pT->SizeToMenuBar(); - } - - void ShowTaskBar(bool bShow, bool bRepaint = true) - { - T* pT = static_cast(this); - ATLASSERT(pT->IsWindow()); - RECT rect = { 0 }; - SystemParametersInfo(SPI_GETWORKAREA, NULL, &rect, FALSE); - if (!bShow) - rect.top = 0; - -#ifdef WIN32_PLATFORM_PSPC // Pocket PC code - UINT uShow = t_bHasSip ? SHFS_SHOWTASKBAR | SHFS_SHOWSIPBUTTON : SHFS_SHOWTASKBAR | SHFS_HIDESIPBUTTON; - SHFullScreen(pT->m_hWnd, bShow ? uShow : SHFS_HIDETASKBAR | SHFS_HIDESIPBUTTON); -#elif _WIN32_WCE > 0x500 // Smartphone 2005 code - SHFullScreen(pT->m_hWnd, bShow ? SHFS_SHOWTASKBAR : SHFS_HIDETASKBAR); -#else // Smartphone 2003 - HWND hTaskBar = FindWindow(_T("tray"), NULL); - ATLASSERT(::IsWindow(hTaskBar)); - ::ShowWindow(hTaskBar, bShow ? SW_SHOW : SW_HIDE); -#endif // WIN32_PLATFORM_PSPC - - pT->MoveWindow(&rect, bRepaint); - } - -// Message map and handler - BEGIN_MSG_MAP(CFullScreenFrame) - MESSAGE_HANDLER(WM_SETTINGCHANGE, OnSettingChange) - MESSAGE_HANDLER(WM_ACTIVATE, OnActivate) - END_MSG_MAP() - - LRESULT OnSettingChange(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { -#ifndef SETTINGCHANGE_RESET // not defined for PPC 2002 - #define SETTINGCHANGE_RESET SPI_SETWORKAREA -#endif - if (m_bFullScreen && (wParam == SETTINGCHANGE_RESET)) - SetFullScreen(m_bFullScreen); - return bHandled = FALSE; - } - - LRESULT OnActivate(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - if (m_bFullScreen) - { - ShowTaskBar(!wParam); - ShowMenuBar(!wParam); - } - return bHandled = FALSE; - } -}; - -#endif // _WTL_CE_NO_FULLSCREEN - - -// --- WinCE zoom support --- - -#ifndef _WTL_CE_NO_ZOOMSCROLL - -/////////////////////////////////////////////////////////////////////////////// -// CZoomScrollImpl - WinCE zooming implementation on top of CScrollImpl - -template -class CZoomScrollImpl: public CScrollImpl< T > -{ -public: -// Data members - _WTYPES_NS::CSize m_sizeTrue; - double m_fzoom; - -// Creation - CZoomScrollImpl() : m_sizeTrue(0), m_fzoom(1.) - { } - -// Zoom operations and access - void SetZoomScrollSize(_WTYPES_NS::CSize sizeTrue, double fzoom = 1., BOOL bRedraw = TRUE) - { - ATLASSERT(fzoom > 0.); - m_sizeTrue = sizeTrue; - m_fzoom = fzoom; - - CScrollImpl< T >::SetScrollSize(sizeTrue / fzoom, bRedraw); - } - - void SetZoomScrollSize(int cx, int cy, double fzoom=1., BOOL bRedraw = TRUE) - { - SetZoomScrollSize(_WTYPES_NS::CSize(cx, cy), fzoom, bRedraw); - } - - void SetZoom(double fzoom, BOOL bRedraw = TRUE) - { - _WTYPES_NS::CPoint ptCenter = WndtoTrue(m_sizeClient / 2); - _WTYPES_NS::CSize sizePage = GetScrollPage(); - _WTYPES_NS::CSize sizeLine = GetScrollLine(); - - SetZoomScrollSize(GetScrollSize(), fzoom, bRedraw); - - SetScrollLine(sizeLine); - SetScrollPage(sizePage); - _WTYPES_NS::CPoint ptOffset = ptCenter - (m_sizeClient / 2) * fzoom; - SetScrollOffset(ptOffset, bRedraw); - } - - double GetZoom() - { - return m_fzoom; - } - -// CScrollImpl overrides - void SetScrollOffset(int x, int y, BOOL bRedraw = TRUE) - { - CScrollImpl< T >::SetScrollOffset((int)(x / m_fzoom), (int)(y / m_fzoom), bRedraw); - } - - void SetScrollOffset(POINT ptOffset, BOOL bRedraw = TRUE) - { - SetScrollOffset(ptOffset.x, ptOffset.y, bRedraw); - } - - void GetScrollOffset(POINT& ptOffset) - { - ptOffset.x = (LONG)(m_ptOffset.x * m_fzoom); - ptOffset.y = (LONG)(m_ptOffset.y * m_fzoom); - } - - void SetScrollSize(int cx, int cy, BOOL bRedraw = TRUE) - { - SetZoomScrollSize(cx, cy, GetZoom(), bRedraw); - } - - void SetScrollSize(SIZE sizeTrue, BOOL bRedraw = TRUE) - { - SetZoomScrollSize(sizeTrue, GetZoom(), bRedraw); - } - - void GetScrollSize(SIZE& sizeTrue) const - { - sizeTrue = m_sizeTrue; - } - - void SetScrollPage(int cxPage, int cyPage) - { - SetScrollPage(_WTYPES_NS::CSize(cxPage, cyPage)); - } - - void SetScrollPage(SIZE sizePage) - { - CScrollImpl< T >::SetScrollPage(sizePage / m_fzoom); - } - - void GetScrollPage(SIZE& sizePage) const - { - sizePage = m_sizePage * m_fzoom; - } - - void SetScrollLine(int cxLine, int cyLine) - { - SetScrollLine(_WTYPES_NS::CSize(cxLine, cyLine)); - } - - void SetScrollLine(SIZE sizeLine) - { - CScrollImpl< T >::SetScrollLine(sizeLine / m_fzoom); - } - - void GetScrollLine(SIZE& sizeLine) const - { - sizeLine = m_sizeLine * m_fzoom; - } - -// Data access complements - _WTYPES_NS::CSize GetScrollSize() - { - return m_sizeTrue; - } - - _WTYPES_NS::CSize GetScrollPage() - { - return m_sizePage * m_fzoom; - } - - _WTYPES_NS::CSize GetScrollLine() - { - return m_sizeLine * m_fzoom; - } - - _WTYPES_NS::CPoint GetScrollOffset() - { - return (_WTYPES_NS::CSize)m_ptOffset * m_fzoom; - } - -// Helper coordinate functions - _WTYPES_NS::CPoint WndtoTrue(CPoint ptW) - { - return (_WTYPES_NS::CSize)ptW * GetZoom() + GetScrollOffset(); - } - - void WndtoTrue(LPPOINT aptW, int nPts) // in place coord transformation - { - for (int i = 0 ; i < nPts ; i++) - aptW[i] = WndtoTrue(aptW[i]); - } - - void WndtoTrue(LPRECT prectW) // in place coord transformation - { - WndtoTrue((LPPOINT)prectW, 2); - } - - _WTYPES_NS::CPoint TruetoWnd(CPoint ptT) - { - return (ptT - GetScrollOffset()) / GetZoom(); - } - - void TruetoWnd(LPPOINT aptT, int nPts) // in place coord transformation - { - for (int i = 0 ; i < nPts ; i++) - aptT[i] = TruetoWnd(aptT[i]); - } - - void TruetoWnd(LPRECT prectT) // in place coord transformation - { - TruetoWnd((LPPOINT)prectT, 2); - } - -// Drawing operations : assume adequate setting of data members - BOOL Draw(HBITMAP hbm, HDC hdestDC, DWORD dwROP = SRCCOPY) - { - CDC memDC = CreateCompatibleDC(hdestDC); - CBitmapHandle bmpOld = memDC.SelectBitmap(hbm); - BOOL bRes = Draw(memDC, hdestDC, dwROP); - memDC.SelectBitmap(bmpOld); - return bRes; - } - - BOOL Draw(HDC hsourceDC, HDC hdestDC, DWORD dwROP = SRCCOPY) - { - CDCHandle destDC = hdestDC; - destDC.SetViewportOrg(0,0); - _WTYPES_NS::CPoint ptOffset = GetScrollOffset(); - _WTYPES_NS::CSize sizeZClient = m_sizeClient * GetZoom(); - return destDC.StretchBlt(0, 0, m_sizeClient.cx, m_sizeClient.cy, hsourceDC, ptOffset.x, ptOffset.y, sizeZClient.cx, sizeZClient.cy, dwROP); - } - -#ifdef _IMAGING_H - BOOL Draw(IImage* pIImage, HDC hdestDC) - { - CDCHandle destDC = hdestDC; - destDC.SetViewportOrg(0,0); - return SUCCEEDED(pIImage->Draw(destDC, _WTYPES_NS::CRect(-_WTYPES_NS::CPoint(m_ptOffset), m_sizeAll), NULL)); - } -#endif - -// Message map and handlers - BEGIN_MSG_MAP(CZoomScrollImpl< T >) - MESSAGE_HANDLER(WM_ERASEBKGND, OnEraseBkgnd) - CHAIN_MSG_MAP(CScrollImpl< T >) - END_MSG_MAP() - - LRESULT OnEraseBkgnd(UINT /*uMsg*/, WPARAM wParam, LPARAM /*lParam*/, BOOL& bHandled) - { - T* pT = static_cast(this); - ATLASSERT(::IsWindow(pT->m_hWnd)); - if ((GetScrollExtendedStyle() & SCRL_ERASEBACKGROUND)) - { - _WTYPES_NS::CRect rect; - pT->GetClientRect(rect); - _WTYPES_NS::CSize sizeClient=rect.Size(); - - if (m_sizeAll.cx < sizeClient.cx || m_sizeAll.cy < sizeClient.cy) - { - CDCHandle hdc = (HDC)wParam; - HBRUSH hbr = GetSysColorBrush((int)T::GetWndClassInfo().m_wc.hbrBackground - 1); - - if (m_sizeAll.cx < sizeClient.cx) - { - _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(m_sizeAll.cx, 0), sizeClient); - hdc.FillRect(rectBG, hbr); - } - - if (m_sizeAll.cy < sizeClient.cy) - { - _WTYPES_NS::CRect rectBG(_WTYPES_NS::CPoint(0, m_sizeAll.cy), sizeClient); - hdc.FillRect(rectBG, hbr); - } - } - } - else - { - bHandled = FALSE; - } - - return 1; - } -}; - -#endif // _WTL_CE_NO_ZOOMSCROLL - -#ifndef _WTL_CE_NO_CONTROLS - -// --- PPC bottom TabView control --- - -#if defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC) - -/////////////////////////////////////////////////////////////////////////////// -// CBottomTabViewImpl - -template -class ATL_NO_VTABLE CBottomTabViewImpl : public CTabViewImpl -{ -public: - DECLARE_WND_CLASS_EX(NULL, 0, COLOR_APPWORKSPACE) - -// Implementation overrideables - bool CreateTabControl() - { - m_tab.Create(m_hWnd, rcDefault, NULL, WS_CHILD | TCS_BOTTOM, 0, m_nTabID); - - ATLASSERT(m_tab.m_hWnd != NULL); - if(m_tab.m_hWnd == NULL) - return false; - - m_tab.SendMessage(CCM_SETVERSION, COMCTL32_VERSION); - m_tab.SetItemExtra(sizeof(TABVIEWPAGE)); - - T* pT = static_cast(this); - m_cyTabHeight = pT->CalcTabHeight(); - - return true; - } - - int CalcTabHeight() - { - int nCount = m_tab.GetItemCount(); - TCITEMEXTRA tcix = { 0 }; - tcix.tciheader.mask = TCIF_TEXT; - tcix.tciheader.pszText = _T("NS"); - int nIndex = m_tab.InsertItem(nCount, tcix); - - RECT rect = { 0 }; - SystemParametersInfo(SPI_GETWORKAREA, 0, &rect, 0); - RECT rcWnd = rect; - - m_tab.AdjustRect(FALSE, &rect); - rcWnd.top = rect.bottom; - ::AdjustWindowRectEx(&rcWnd, m_tab.GetStyle(), FALSE, m_tab.GetExStyle()); - m_tab.DeleteItem(nIndex); - - return rcWnd.bottom - rcWnd.top; - } - - void UpdateLayout() - { - RECT rect; - GetClientRect(&rect); - - if(m_tab.IsWindow() && ((m_tab.GetStyle() & WS_VISIBLE) != 0)) - m_tab.SetWindowPos(NULL, 0, rect.bottom - m_cyTabHeight, rect.right - rect.left, m_cyTabHeight, SWP_NOZORDER /*| SWP_SHOWWINDOW*/); - - if(m_nActivePage != -1) - ::SetWindowPos(GetPageHWND(m_nActivePage), NULL, 0, 0, rect.right - rect.left, rect.bottom - m_cyTabHeight, SWP_NOZORDER); - } - -}; - -class CBottomTabView : public CBottomTabViewImpl -{ -public: - DECLARE_WND_CLASS_EX(_T("WTL_BottomTabView"), 0, COLOR_APPWORKSPACE) -}; - -#endif // defined(__ATLCTRLX_H__) && defined(WIN32_PLATFORM_PSPC) - - -// --- PPC/SmartPhone controls --- - -//////////////////////////////////////////////////////////////////////////////// -// These are wrapper classes for the Pocket PC 2002/2003 and SmartPhone 2003 controls -// To implement a window based on a control, use following: -// Example: Implementing a window based on a Html control -// -// class CMyHtml : CWindowImpl -// { -// public: -// BEGIN_MSG_MAP(CMyHtml) -// // put your message handler entries here -// END_MSG_MAP() -// }; -/////////////////////////////////////////////////////////////////////////////// - -/////////////////////////////////////////////////////////////////////////////// -// CHtmlCtrl - -template -class CHtmlCtrlT : public TBase -{ -public: -// Constructors - CHtmlCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CHtmlCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - ATLASSERT(hWnd != NULL); // Did you remember to call InitHTMLControl(hInstance) ?? - return hWnd; - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_HTML; - } - -#if (_WIN32_WCE >= 400) - void AddStyle(LPCWSTR pszStyle) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ADDSTYLE, 0, (LPARAM)pszStyle); - } -#endif // (_WIN32_WCE >= 400) - - void AddText(BOOL bPlainText, LPCSTR pszText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)bPlainText, (LPARAM)pszText); - } - - void AddHTML(LPCSTR pszHTML) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ADDTEXT, (WPARAM)FALSE, (LPARAM)pszHTML); - } - - void AddText(BOOL bPlainText, LPCWSTR pszText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)bPlainText, (LPARAM)pszText); - } - - void AddHTML(LPCWSTR pszHTML) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ADDTEXTW, (WPARAM)FALSE, (LPARAM)pszHTML); - } - - void Anchor(LPCSTR pszAnchor) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ANCHOR, 0, (LPARAM)pszAnchor); - } - - void Anchor(LPCWSTR pszAnchor) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ANCHORW, 0, (LPARAM)pszAnchor); - } - -#if (_WIN32_WCE >= 420) - void GetBrowserDispatch(IDispatch** ppDispatch) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(ppDispatch); - ATLASSERT(*ppDispatch==NULL); - ::SendMessage(m_hWnd, DTM_BROWSERDISPATCH, 0, (LPARAM)ppDispatch); - } - void GetDocumentDispatch(IDispatch** ppDispatch) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(ppDispatch); - ATLASSERT(*ppDispatch==NULL); - ::SendMessage(m_hWnd, DTM_DOCUMENTDISPATCH , 0, (LPARAM)ppDispatch); - } -#endif // (_WIN32_WCE >= 420) - - void Clear() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_CLEAR, 0, 0L); - } - - void EnableClearType(BOOL bEnable = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ENABLECLEARTYPE, 0, (LPARAM)bEnable); - } - - void EnableContextMenu(BOOL bEnable = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ENABLECONTEXTMENU, 0, (LPARAM)bEnable); - } - - void EnableScripting(BOOL bEnable = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ENABLESCRIPTING, 0, (LPARAM)bEnable); - } - - void EnableShrink(BOOL bEnable = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ENABLESHRINK, 0, (LPARAM)bEnable); - } - - void EndOfSource() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ENDOFSOURCE, 0, 0L); - } - - void ImageFail(DWORD dwCookie) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_IMAGEFAIL, 0, (LPARAM)dwCookie); - } - - int GetLayoutHeight() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, DTM_LAYOUTHEIGHT, 0, 0L); - } - - int GetLayoutWidth() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, DTM_LAYOUTWIDTH, 0, 0L); - } - - void Navigate(LPCTSTR pstrURL, UINT uFlags = 0) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pstrURL); - ::SendMessage(m_hWnd, DTM_NAVIGATE, (WPARAM)uFlags, (LPARAM)pstrURL); - } - - void SelectAll() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_SELECTALL, 0, 0L); - } - - void SetImage(INLINEIMAGEINFO* pImageInfo) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pImageInfo); - ::SendMessage(m_hWnd, DTM_SETIMAGE, 0, (LPARAM)pImageInfo); - } - - void ZoomLevel(int iLevel) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_ZOOMLEVEL, 0, (LPARAM)iLevel); - } - -#if (_WIN32_WCE >= 400) - void Stop() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DTM_STOP, 0, 0L); - } -#endif // (_WIN32_WCE >= 400) - - void GetScriptDispatch(IDispatch** ppDispatch) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(ppDispatch); - ATLASSERT(*ppDispatch==NULL); - ::SendMessage(m_hWnd, DTM_SCRIPTDISPATCH, 0, (LPARAM)ppDispatch); - } -}; - -typedef CHtmlCtrlT CHtmlCtrl; - - -#ifdef WIN32_PLATFORM_PSPC - -/////////////////////////////////////////////////////////////////////////////// -// CRichInkCtrl - -template -class CRichInkCtrlT : public TBase -{ -public: -// Constructors - CRichInkCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CRichInkCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - ATLASSERT(hWnd != NULL); // Did you remember to call InitRichInkDLL() ?? - return hWnd; - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_RICHINK; - } - - BOOL CanPaste(UINT uFormat = 0) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_CANPASTE, (WPARAM)uFormat, 0L); - } - - BOOL CanRedo() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_CANREDO, 0, 0L); - } - - BOOL CanUndo() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_CANUNDO, 0, 0L); - } - - void ClearAll(BOOL bRepaint = TRUE) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_CLEARALL, (WPARAM)bRepaint, 0L); - } - - BOOL GetModify() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, EM_GETMODIFY, 0, 0L); - } - - UINT GetPageStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_GETPAGESTYLE, 0, 0L); - } - - UINT GetPenMode() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_GETPENMODE, 0, 0L); - } - - UINT GetViewStyle() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_GETVIEW, 0, 0L); - } - - UINT GetWrapMode() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_GETWRAPMODE, 0, 0L); - } - - UINT GetZoomPercent() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_GETZOOMPERCENT, 0, 0L); - } - - void InsertLinks(LPWSTR lpString, int cchLength = -1) - { - ATLASSERT(::IsWindow(m_hWnd)); - if(cchLength == -1) - cchLength = lstrlen(lpString); - ::SendMessage(m_hWnd, EM_INSERTLINKS, (WPARAM)cchLength, (LPARAM)lpString); - } - - void RedoEvent() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_REDOEVENT, 0, 0L); - } - - UINT SetInkLayer(UINT uLayer) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (UINT)::SendMessage(m_hWnd, EM_SETINKLAYER, (WPARAM)uLayer, 0L); - } - - void SetPageStyle(UINT uStyle) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETPAGESTYLE, (WPARAM)uStyle, 0L); - } - - void SetPenMode(UINT uMode) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETPENMODE, (WPARAM)uMode, 0L); - } - - void SetViewStyle(UINT uStyle) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETVIEW, (WPARAM)uStyle, 0L); - } - - void SetViewAttributes(VIEWATTRIBUTES* pAttribs) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pAttribs); - ::SendMessage(m_hWnd, EM_SETVIEWATTRIBUTES, 0, (LPARAM)pAttribs); - } - - void SetWrapMode(UINT uMode) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETWRAPMODE, (WPARAM)uMode, 0L); - } - - void SetZoomPercent(UINT uPercent) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETZOOMPERCENT, (WPARAM)uPercent, 0L); - } - - LONG StreamIn(UINT uFormat, EDITSTREAM& es) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_STREAMIN, (WPARAM)uFormat, (LPARAM)&es); - } - - LONG StreamOut(UINT uFormat, EDITSTREAM& es) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (LONG)::SendMessage(m_hWnd, EM_STREAMOUT, (WPARAM)uFormat, (LPARAM)&es); - } - - void UndoEvent() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_UNDOEVENT, 0, 0L); - } - - void Undo() - { - UndoEvent(); - } - -// Standard EM_xxx messages - DWORD GetSel() const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetViewStyle() != VT_DRAWINGVIEW); - return (DWORD)::SendMessage(m_hWnd, EM_GETSEL, 0, 0L); - } - - void GetSel(int& nStartChar, int& nEndChar) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetViewStyle() != VT_DRAWINGVIEW); - ::SendMessage(m_hWnd, EM_GETSEL, (WPARAM)&nStartChar, (LPARAM)&nEndChar); - } - - void SetSel(int nStartChar, int nEndChar) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetViewStyle() != VT_DRAWINGVIEW); - ::SendMessage(m_hWnd, EM_SETSEL, nStartChar, nEndChar); - } - - void ReplaceSel(LPCTSTR lpszNewText, BOOL bCanUndo = FALSE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(GetViewStyle() != VT_DRAWINGVIEW); - ::SendMessage(m_hWnd, EM_REPLACESEL, (WPARAM)bCanUndo, (LPARAM)lpszNewText); - } - - void SetModify(BOOL bModified = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, EM_SETMODIFY, (WPARAM)bModified, 0L); - } - - int GetTextLength() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, WM_GETTEXTLENGTH, 0, 0L); - } - -// Clipboard operations - void Clear() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_CLEAR, 0, 0L); - } - - void Copy() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_COPY, 0, 0L); - } - - void Cut() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_CUT, 0, 0L); - } - - void Paste() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, WM_PASTE, 0, 0L); - } -}; - -typedef CRichInkCtrlT CRichInkCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CInkXCtrl - -template -class CInkXCtrlT : public TBase -{ -public: -// Constructors - CInkXCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CInkXCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - HWND hWnd = TBase::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - ATLASSERT(hWnd != NULL); // Did you remember to call InitInkX() ?? - return hWnd; - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_INKX; - } - - static UINT GetHotRecordingMessage() - { - return ::RegisterWindowMessage(szHotRecording); - } - - void ClearAll() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IM_CLEARALL, 0, 0L); - } - - int GetData(BYTE* lpBuffer, INT cbBuffer) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpBuffer); - return (int)::SendMessage(m_hWnd, IM_GETDATA, (WPARAM)cbBuffer, (LPARAM)lpBuffer); - } - - int GetDataLen() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, IM_GETDATALEN, 0, 0L); - } - - CRichInkCtrl GetRichInk() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HWND)::SendMessage(m_hWnd, IM_GETRICHINK, 0, 0L); - } - - BOOL IsRecording() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, IM_RECORDING, 0, 0L); - } - - void ReInit() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IM_REINIT, 0, 0L); - } - - void SetData(const BYTE* lpInkData, INT cbInkData) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(lpInkData); - ::SendMessage(m_hWnd, IM_SETDATA, (WPARAM)cbInkData, (LPARAM)lpInkData); - } - - void VoicePlay() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IM_VOICE_PLAY, 0, 0L); - } - - BOOL IsVoicePlaying() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, IM_VOICE_PLAYING, 0, 0L); - } - - BOOL VoiceRecord() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, IM_VOICE_RECORD, 0, 0L); - } - - void VoiceStop() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IM_VOICE_STOP, 0, 0L); - } - - void ShowVoiceBar(BOOL bShow = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, IM_VOICEBAR, (WPARAM)bShow, 0L); - } -}; - -typedef CInkXCtrlT CInkXCtrl; - -#endif // WIN32_PLATFORM_PSPC - - -/////////////////////////////////////////////////////////////////////////////// -// CVoiceRecorderCtrl - -template -class CVoiceRecorderCtrlT : public TBase -{ -public: -// Constructors - CVoiceRecorderCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CVoiceRecorderCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, const POINT pt, LPTSTR pstrFileName, UINT nID, DWORD dwStyle = 0) - { - ATLASSERT(pstrFileName != NULL); - CM_VOICE_RECORDER cmvr = { 0 }; - cmvr.cb = sizeof(CM_VOICE_RECORDER); - cmvr.dwStyle = dwStyle; - cmvr.xPos = pt.x; - cmvr.yPos = pt.y; - cmvr.hwndParent = hWndParent; - cmvr.id = nID; - cmvr.lpszRecordFileName = pstrFileName; - m_hWnd = VoiceRecorder_Create(&cmvr); - return m_hWnd; - } - - HWND Create(LPCM_VOICE_RECORDER pAttribs) - { - ATLASSERT(pAttribs); - m_hWnd = VoiceRecorder_Create(pAttribs); - return m_hWnd; - } - -// Attributes - void Record() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, VRM_RECORD, 0, 0L); - } - - void Play() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, VRM_PLAY, 0, 0L); - } - - void Stop() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, VRM_STOP, 0, 0L); - } - - void Cancel() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, VRM_CANCEL, 0, 0L); - } - - void Done() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, VRM_OK, 0, 0L); - } -}; - -typedef CVoiceRecorderCtrlT CVoiceRecorderCtrl; - - -#ifdef WIN32_PLATFORM_PSPC - -/////////////////////////////////////////////////////////////////////////////// -// CDocListCtrl - -template -class CDocListCtrlT : public TBase -{ -public: -// Attributes - DOCLISTCREATE m_dlc; - TCHAR m_szPath[MAX_PATH]; - -// Constructors - CDocListCtrlT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CDocListCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, WORD wId, LPCTSTR pszFolder = NULL, LPCTSTR pstrFilter = NULL, - WORD wFilterIndex = 0, DWORD dwFlags = DLF_SHOWEXTENSION) - { - ATLASSERT(pstrFilter != NULL); // It seems to need a filter badly!! - ::ZeroMemory(&m_dlc, sizeof(DOCLISTCREATE)); - ::ZeroMemory(m_szPath, sizeof(m_szPath)); - if(pszFolder != NULL) - SecureHelper::strncpy_x(m_szPath, MAX_PATH, pszFolder, MAX_PATH - 1); - m_dlc.dwStructSize = sizeof(DOCLISTCREATE); - m_dlc.hwndParent = hWndParent; - m_dlc.pszFolder = m_szPath; - m_dlc.pstrFilter = pstrFilter; - m_dlc.wFilterIndex = wFilterIndex; - m_dlc.wId = wId; - m_dlc.dwFlags = dwFlags; - m_hWnd = DocList_Create(&m_dlc); - return m_hWnd; - } - - HWND Create(DOCLISTCREATE* pDlc) - { - m_dlc = *pDlc; - m_hWnd = DocList_Create(&m_dlc); - return m_hWnd; - } - -// Attributes - void DeleteSel() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DLM_DELETESEL, 0, 0L); - } - - void DisableUpdates() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DLM_DISABLEUPDATES, 0, 0L); - } - - void EnableUpdates() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DLM_ENABLEUPDATES, 0, 0L); - } - - int GetFilterIndex() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, DLM_GETFILTERINDEX, 0, 0L); - } - - int GetItemCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, DLM_GETITEMCOUNT, 0, 0L); - } - - int GetNextItem(int iIndex, DWORD dwRelation = LVNI_ALL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)iIndex, (LPARAM)dwRelation); - } - - int GetFirstItem(DWORD dwRelation = LVNI_ALL) const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, DLM_GETNEXTITEM, (WPARAM)-1, (LPARAM)dwRelation); - } - - BOOL GetNextWave(int* pIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pIndex); - return (BOOL)::SendMessage(m_hWnd, DLM_GETNEXTWAVE, 0, (LPARAM)pIndex); - } - - BOOL GetPrevWave(int* pIndex) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pIndex); - return (BOOL)::SendMessage(m_hWnd, DLM_GETPREVWAVE, 0, (LPARAM)pIndex); - } - - int GetSelCount() const - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, DLM_GETSELCOUNT, 0, 0L); - } - - BOOL GetSelPathName(LPTSTR pstrPath, int cchMax) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pstrPath); - return (BOOL)::SendMessage(m_hWnd, DLM_GETSELPATHNAME, (WPARAM)cchMax, (LPARAM)pstrPath); - } - - void ReceiveIR(LPCTSTR pstrPath) const - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pstrPath); - ::SendMessage(m_hWnd, DLM_RECEIVEIR, 0, (LPARAM)pstrPath); - } - - void Refresh() - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DLM_REFRESH, 0, 0L); - } - - BOOL RenameMoveSelectedItems() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, DLM_RENAMEMOVE, 0, 0L); - } - - int SelectAll() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (int)::SendMessage(m_hWnd, DLM_SELECTALL, 0, 0L); - } - - HRESULT SelectItem(LPCTSTR pstrPath, BOOL bVisible = TRUE) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pstrPath); - return (HRESULT)::SendMessage(m_hWnd, DLM_SELECTITEM, (WPARAM)bVisible, (LPARAM)pstrPath); - } - - void SendEMail(LPCTSTR pstrAttachment) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DLM_SENDEMAIL, 0, (LPARAM)pstrAttachment); - } - - void SendIR(LPCTSTR pstrPath) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DLM_SENDIR, 0, (LPARAM)pstrPath); - } - - HRESULT SetFilterIndex(int iIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HRESULT)::SendMessage(m_hWnd, DLM_SETFILTERINDEX, (WPARAM)iIndex, 0L); - } - - void SetFolder(LPCTSTR pstrPath) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pstrPath); - ::SendMessage(m_hWnd, DLM_SETFOLDER, 0, (LPARAM)pstrPath); - } - - BOOL SetItemState(int iIndex, const LVITEM* pItem) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pItem); - return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)pItem); - } - - BOOL SetItemState(int iIndex, UINT uState, UINT uMask) - { - ATLASSERT(::IsWindow(m_hWnd)); - LV_ITEM lvi = { 0 }; - lvi.stateMask = uMask; - lvi.state = uState; - return (BOOL)::SendMessage(m_hWnd, DLM_SETITEMSTATE, (WPARAM)iIndex, (LPARAM)&lvi); - } - - void SetOneItem(int iIndex, LPCVOID pPA) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DLM_SETONEITEM, (WPARAM)iIndex, (LPARAM)pPA); - } - - void SetSelect(int iIndex) - { - ATLASSERT(::IsWindow(m_hWnd)); - ::SendMessage(m_hWnd, DLM_SETSELECT, (WPARAM)iIndex, 0L); - } - - void SetSelPathName(LPCTSTR pstrPath) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pstrPath); - ::SendMessage(m_hWnd, DLM_SETSELPATHNAME, 0, (LPARAM)pstrPath); - } - - BOOL SetSortOrder() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, DLM_SETSORTORDER, 0, 0L); - } - - HRESULT Update() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (HRESULT)::SendMessage(m_hWnd, DLM_UPDATE, 0, 0L); - } - - BOOL ValidateFolder() - { - ATLASSERT(::IsWindow(m_hWnd)); - return (BOOL)::SendMessage(m_hWnd, DLM_VALIDATEFOLDER, 0, 0L); - } - -// Functions - BOOL GetFirstSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath) - { - ATLASSERT(::IsWindow(m_hWnd)); - return DocList_GetFirstSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath); - } - - BOOL GetNextSelectedWaveFile(int* pIndex, LPTSTR szPath, const size_t cchPath) - { - ATLASSERT(::IsWindow(m_hWnd)); - return DocList_GetNextSelectedWaveFile(m_hWnd, pIndex, szPath, cchPath); - } -}; - -typedef CDocListCtrlT CDocListCtrl; - -#endif // WIN32_PLATFORM_PSPC - - -/////////////////////////////////////////////////////////////////////////////// -// CCapEdit - -template -class CCapEditT : public TBase -{ -public: -// Constructors - CCapEditT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CCapEditT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - HWND hWnd = /*TBase*/CWindow::Create(GetWndClassName(), hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? - return hWnd; - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_CAPEDIT; - } -}; - -typedef CCapEditT CCapEdit; - -/////////////////////////////////////////////////////////////////////////////// -// CTTStatic - -#ifndef WIN32_PLATFORM_WFSP // Tooltips not supported on SmartPhone - -template -class CTTStaticT : public TBase -{ -public: -// Constructors - CTTStaticT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CTTStaticT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? - return hWnd; - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_TSTATIC; - } - -// Operations - BOOL SetToolTipText(LPCTSTR pstrTipText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pstrTipText); - ATLASSERT(lstrlen(pstrTipText) <= 253); - CTempBuffer buff; - int cchLen = lstrlen(pstrTipText) + 3; - LPTSTR pstr = buff.Allocate(cchLen); - if(pstr == NULL) - return FALSE; - SecureHelper::strcpy_x(pstr, cchLen, _T("~~")); - SecureHelper::strcat_x(pstr, cchLen, pstrTipText); - return SetWindowText(pstr); - } -}; - -typedef CTTStaticT CTTStatic; - - -/////////////////////////////////////////////////////////////////////////////// -// CTTButton - -template -class CTTButtonT : public TBase -{ -public: -// Constructors - CTTButtonT(HWND hWnd = NULL) : TBase(hWnd) - { } - - CTTButtonT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - HWND hWnd = TBase::Create(hWndParent, rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); - ATLASSERT(hWnd != NULL); // Did you remember to call SHInitExtraControls() ?? - return hWnd; - } - -// Attributes - static LPCTSTR GetWndClassName() - { - return WC_TBUTTON; - } - -// Operations - BOOL SetToolTipText(LPCTSTR pstrTipText) - { - ATLASSERT(::IsWindow(m_hWnd)); - ATLASSERT(pstrTipText); - ATLASSERT(lstrlen(pstrTipText) <= 253); - CTempBuffer buff; - int cchLen = lstrlen(pstrTipText) + 3; - LPTSTR pstr = buff.Allocate(cchLen); - if(pstr == NULL) - return FALSE; - SecureHelper::strcpy_x(pstr, cchLen, _T("~~")); - SecureHelper::strcat_x(pstr, cchLen, pstrTipText); - return SetWindowText(pstr); - } -}; - -typedef CTTButtonT CTTButton; - -#endif // !WIN32_PLATFORM_WFSP - - -// --- SmartPhone specific controls --- - -#ifdef WIN32_PLATFORM_WFSP - -/////////////////////////////////////////////////////////////////////////////// -// CSpinCtrlT - CSpinCtrl : SmartPhone adapted UpDown control - -template -class CSpinCtrlT : public CUpDownCtrlT< TBase > -{ -public: -// Constructors - CSpinCtrlT(HWND hWnd = NULL) : CUpDownCtrlT< TBase >(hWnd) - { } - - CSpinCtrlT< TBase >& operator =(HWND hWnd) - { - m_hWnd = hWnd; - return *this; - } - - HWND Create(HWND hWndParent, HWND hBuddy, DWORD dwStyle, int nID, LPCTSTR szExpandedName = NULL) - { - ATLASSERT(::IsWindow(hWndParent)); - CUpDownCtrlT< TBase >::Create(hWndParent, NULL, szExpandedName, dwStyle, 0, nID, NULL); - ATLASSERT(m_hWnd != NULL); // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)? - if (hBuddy != NULL) - { - ATLASSERT(::IsWindow(hBuddy)); - SetBuddy(hBuddy); - } - return m_hWnd; - } -}; - -typedef CSpinCtrlT CSpinCtrl; - - -/////////////////////////////////////////////////////////////////////////////// -// CSpinned - SmartPhone association of control and Spin - -template -class CSpinned : public TBase -{ -public: - CSpinCtrl m_SpinCtrl; - DWORD m_dwSpinnedStyle; - -// Constructors - CSpinned(HWND hWnd = NULL) : TBase(hWnd) - { - m_dwSpinnedStyle = WS_VISIBLE | UDS_ALIGNRIGHT | UDS_EXPANDABLE; - - if (t_bExpandOnly == true) - m_dwSpinnedStyle |= UDS_NOSCROLL; - else - m_dwSpinnedStyle |= UDS_HORZ | UDS_ARROWKEYS | UDS_SETBUDDYINT | UDS_WRAP; - - if (hWnd != NULL) - AttachOrCreateSpinCtrl(); - } - - CSpinned& operator =(HWND hWnd) - { - Attach(hWnd); - return *this; - } - - void Attach(HWND hWnd) - { - ATLASSERT(!IsWindow()); - TBase* pT = static_cast(this); - pT->m_hWnd = hWnd; - if (hWnd != NULL) - AttachOrCreateSpinCtrl(); - } - - HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szExpandedName = NULL, - DWORD dwStyle = 0, DWORD dwExStyle = 0, - ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) - { - - TBase* pT = static_cast(this); - TBase::Create(hWndParent, rect, NULL, dwStyle, dwExStyle, MenuOrID, lpCreateParam); - ATLASSERT(pT->m_hWnd != NULL); - - m_SpinCtrl.Create(hWndParent, pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + (int)MenuOrID.m_hMenu, szExpandedName); - - ATLASSERT(m_SpinCtrl.m_hWnd != NULL); // Did you remember to call AtlInitCommonControls(ICC_UPDOWN_CLASS)? - - return pT->m_hWnd; - } - -// Attributes - CSpinCtrl& GetSpinCtrl() - { - return m_SpinCtrl; - } - -// Implementation - // Attach our existing SpinCtrl or create one - bool AttachOrCreateSpinCtrl() - { - TBase* pT = static_cast(this); - - HWND hSpin = ::GetDlgItem(pT->GetParent(), ATL_IDW_SPIN_ID + pT->GetDlgCtrlID()); - - if (hSpin != NULL) - { - m_SpinCtrl.Attach(hSpin); -#ifdef DEBUG - TCHAR sClassName[16]; - ::GetClassName(hSpin, sClassName, 16); - ATLASSERT(!_tcscmp(sClassName, UPDOWN_CLASS)); - ATLASSERT(m_SpinCtrl.GetBuddy().m_hWnd == pT->m_hWnd); -#endif // DEBUG - } - else - { - m_SpinCtrl.Create(pT->GetParent(), pT->m_hWnd, m_dwSpinnedStyle, ATL_IDW_SPIN_ID + pT->GetDlgCtrlID()); - } - - return m_SpinCtrl.m_hWnd != NULL; - } -}; - - -/////////////////////////////////////////////////////////////////////////////// -// CSpinListBox - SmartPhone spinned ListBox control -// CExpandListBox - SmartPhone expandable ListBox control -// CExpandEdit - SmartPhone expandable Edit control -// CExpandCapEdit - SmartPhone expandable CapEdit control - -typedef CSpinned CSpinListBox; -typedef CSpinned CExpandListBox; -typedef CSpinned CExpandEdit; -typedef CSpinned CExpandCapEdit; - -#endif // WIN32_PLATFORM_WFSP - -#endif // _WTL_CE_NO_CONTROLS - -}; // namespace WTL - -#endif // __ATLWINCE_H__ diff --git a/plugins/SmartAutoReplier/wtl/atlwinx.h b/plugins/SmartAutoReplier/wtl/atlwinx.h deleted file mode 100644 index 629d29778f..0000000000 --- a/plugins/SmartAutoReplier/wtl/atlwinx.h +++ /dev/null @@ -1,525 +0,0 @@ -// Windows Template Library - WTL version 8.1 -// Copyright (C) Microsoft Corporation. All rights reserved. -// -// This file is a part of the Windows Template Library. -// The use and distribution terms for this software are covered by the -// Common Public License 1.0 (http://opensource.org/licenses/cpl1.0.php) -// which can be found in the file CPL.TXT at the root of this distribution. -// By using this software in any fashion, you are agreeing to be bound by -// the terms of this license. You must not remove this notice, or -// any other, from this software. - -#ifndef __ATLWINX_H__ -#define __ATLWINX_H__ - -#pragma once - -#ifndef __ATLAPP_H__ - #error atlwinx.h requires atlapp.h to be included first -#endif - -#if (_ATL_VER >= 0x0700) - #include -#endif // (_ATL_VER >= 0x0700) - - -/////////////////////////////////////////////////////////////////////////////// -// Classes in this file: -// -// _U_RECT -// _U_MENUorID -// _U_STRINGorID - - -/////////////////////////////////////////////////////////////////////////////// -// Command Chaining Macros - -#define CHAIN_COMMANDS(theChainClass) \ - if(uMsg == WM_COMMAND) \ - CHAIN_MSG_MAP(theChainClass) - -#define CHAIN_COMMANDS_ALT(theChainClass, msgMapID) \ - if(uMsg == WM_COMMAND) \ - CHAIN_MSG_MAP_ALT(theChainClass, msgMapID) - -#define CHAIN_COMMANDS_MEMBER(theChainMember) \ - if(uMsg == WM_COMMAND) \ - CHAIN_MSG_MAP_MEMBER(theChainMember) - -#define CHAIN_COMMANDS_ALT_MEMBER(theChainMember, msgMapID) \ - if(uMsg == WM_COMMAND) \ - CHAIN_MSG_MAP_ALT_MEMBER(theChainMember, msgMapID) - - -/////////////////////////////////////////////////////////////////////////////// -// Macros for parent message map to selectively reflect control messages - -// NOTE: ReflectNotifications is a member of ATL's CWindowImplRoot -// (and overridden in 2 cases - CContainedWindowT and CAxHostWindow) -// Since we can't modify ATL, we'll provide the needed additions -// in a separate function (that is not a member of CWindowImplRoot) - -namespace WTL -{ - -inline LRESULT WtlReflectNotificationsFiltered(HWND hWndParent, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled, - UINT uMsgFilter = WM_NULL, UINT_PTR idFromFilter = 0, HWND hWndChildFilter = NULL) -{ - if((uMsgFilter != WM_NULL) && (uMsgFilter != uMsg)) - { - // The notification message doesn't match the filter. - bHandled = FALSE; - return 1; - } - - HWND hWndChild = NULL; - UINT_PTR idFrom = 0; - - switch(uMsg) - { - case WM_COMMAND: - if(lParam != NULL) // not from a menu - { - hWndChild = (HWND)lParam; - idFrom = (UINT_PTR)LOWORD(wParam); - } - break; - case WM_NOTIFY: - hWndChild = ((LPNMHDR)lParam)->hwndFrom; - idFrom = ((LPNMHDR)lParam)->idFrom; - break; -#ifndef _WIN32_WCE - case WM_PARENTNOTIFY: - switch(LOWORD(wParam)) - { - case WM_CREATE: - case WM_DESTROY: - hWndChild = (HWND)lParam; - idFrom = (UINT_PTR)HIWORD(wParam); - break; - default: - hWndChild = ::GetDlgItem(hWndParent, HIWORD(wParam)); - idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); - break; - } - break; -#endif // !_WIN32_WCE - case WM_DRAWITEM: - if(wParam) // not from a menu - { - hWndChild = ((LPDRAWITEMSTRUCT)lParam)->hwndItem; - idFrom = (UINT_PTR)wParam; - } - break; - case WM_MEASUREITEM: - if(wParam) // not from a menu - { - hWndChild = ::GetDlgItem(hWndParent, ((LPMEASUREITEMSTRUCT)lParam)->CtlID); - idFrom = (UINT_PTR)wParam; - } - break; - case WM_COMPAREITEM: - if(wParam) // not from a menu - { - hWndChild = ((LPCOMPAREITEMSTRUCT)lParam)->hwndItem; - idFrom = (UINT_PTR)wParam; - } - break; - case WM_DELETEITEM: - if(wParam) // not from a menu - { - hWndChild = ((LPDELETEITEMSTRUCT)lParam)->hwndItem; - idFrom = (UINT_PTR)wParam; - } - break; - case WM_VKEYTOITEM: - case WM_CHARTOITEM: - case WM_HSCROLL: - case WM_VSCROLL: - hWndChild = (HWND)lParam; - idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); - break; - case WM_CTLCOLORBTN: - case WM_CTLCOLORDLG: - case WM_CTLCOLOREDIT: - case WM_CTLCOLORLISTBOX: - case WM_CTLCOLORMSGBOX: - case WM_CTLCOLORSCROLLBAR: - case WM_CTLCOLORSTATIC: - hWndChild = (HWND)lParam; - idFrom = (UINT_PTR)::GetDlgCtrlID(hWndChild); - break; - default: - break; - } - - if((hWndChild == NULL) || - ((hWndChildFilter != NULL) && (hWndChildFilter != hWndChild))) - { - // Either hWndChild isn't valid, or - // hWndChild doesn't match the filter. - bHandled = FALSE; - return 1; - } - - if((idFromFilter != 0) && (idFromFilter != idFrom)) - { - // The dialog control id doesn't match the filter. - bHandled = FALSE; - return 1; - } - - ATLASSERT(::IsWindow(hWndChild)); - LRESULT lResult = ::SendMessage(hWndChild, OCM__BASE + uMsg, wParam, lParam); - if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC)) - { - // Try to prevent problems with WM_CTLCOLOR* messages when - // the message wasn't really handled - bHandled = FALSE; - } - - return lResult; -} - -}; // namespace WTL - -// Try to prevent problems with WM_CTLCOLOR* messages when -// the message wasn't really handled -#define REFLECT_NOTIFICATIONS_EX() \ -{ \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if((lResult == 0) && (uMsg >= WM_CTLCOLORMSGBOX) && (uMsg <= WM_CTLCOLORSTATIC)) \ - bHandled = FALSE; \ - if(bHandled) \ - return TRUE; \ -} - -#define REFLECT_NOTIFICATIONS_MSG_FILTERED(uMsgFilter) \ - { \ - bHandled = TRUE; \ - lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, NULL); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFICATIONS_ID_FILTERED(idFromFilter) \ - { \ - bHandled = TRUE; \ - lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, idFromFilter, NULL); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFICATIONS_HWND_FILTERED(hWndChildFilter) \ - { \ - bHandled = TRUE; \ - lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, WM_NULL, 0, hWndChildFilter); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFICATIONS_MSG_ID_FILTERED(uMsgFilter, idFromFilter) \ - { \ - bHandled = TRUE; \ - lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, idFromFilter, NULL); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFICATIONS_MSG_HWND_FILTERED(uMsgFilter, hWndChildFilter) \ - { \ - bHandled = TRUE; \ - lResult = WTL::WtlReflectNotificationsFiltered(m_hWnd, uMsg, wParam, lParam, bHandled, uMsgFilter, 0, hWndChildFilter); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_COMMAND(id, code) \ - if(uMsg == WM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_COMMAND_ID(id) \ - if(uMsg == WM_COMMAND && id == LOWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_COMMAND_CODE(code) \ - if(uMsg == WM_COMMAND && code == HIWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_COMMAND_RANGE(idFirst, idLast) \ - if(uMsg == WM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_COMMAND_RANGE_CODE(idFirst, idLast, code) \ - if(uMsg == WM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFY(id, cd) \ - if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFY_ID(id) \ - if(uMsg == WM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFY_CODE(cd) \ - if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFY_RANGE(idFirst, idLast) \ - if(uMsg == WM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECT_NOTIFY_RANGE_CODE(idFirst, idLast, cd) \ - if(uMsg == WM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ - { \ - bHandled = TRUE; \ - lResult = ReflectNotifications(uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - - -/////////////////////////////////////////////////////////////////////////////// -// Reflected message handler macros for message maps (for ATL 3.0) - -#if (_ATL_VER < 0x0700) - -#define REFLECTED_COMMAND_HANDLER(id, code, func) \ - if(uMsg == OCM_COMMAND && id == LOWORD(wParam) && code == HIWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_COMMAND_ID_HANDLER(id, func) \ - if(uMsg == OCM_COMMAND && id == LOWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_COMMAND_CODE_HANDLER(code, func) \ - if(uMsg == OCM_COMMAND && code == HIWORD(wParam)) \ - { \ - bHandled = TRUE; \ - lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_COMMAND_RANGE_HANDLER(idFirst, idLast, func) \ - if(uMsg == OCM_COMMAND && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ - { \ - bHandled = TRUE; \ - lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_COMMAND_RANGE_CODE_HANDLER(idFirst, idLast, code, func) \ - if(uMsg == OCM_COMMAND && code == HIWORD(wParam) && LOWORD(wParam) >= idFirst && LOWORD(wParam) <= idLast) \ - { \ - bHandled = TRUE; \ - lResult = func(HIWORD(wParam), LOWORD(wParam), (HWND)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_NOTIFY_HANDLER(id, cd, func) \ - if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom && cd == ((LPNMHDR)lParam)->code) \ - { \ - bHandled = TRUE; \ - lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_NOTIFY_ID_HANDLER(id, func) \ - if(uMsg == OCM_NOTIFY && id == ((LPNMHDR)lParam)->idFrom) \ - { \ - bHandled = TRUE; \ - lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_NOTIFY_CODE_HANDLER(cd, func) \ - if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code) \ - { \ - bHandled = TRUE; \ - lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_NOTIFY_RANGE_HANDLER(idFirst, idLast, func) \ - if(uMsg == OCM_NOTIFY && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ - { \ - bHandled = TRUE; \ - lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#define REFLECTED_NOTIFY_RANGE_CODE_HANDLER(idFirst, idLast, cd, func) \ - if(uMsg == OCM_NOTIFY && cd == ((LPNMHDR)lParam)->code && ((LPNMHDR)lParam)->idFrom >= idFirst && ((LPNMHDR)lParam)->idFrom <= idLast) \ - { \ - bHandled = TRUE; \ - lResult = func((int)wParam, (LPNMHDR)lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -#endif // (_ATL_VER < 0x0700) - - -/////////////////////////////////////////////////////////////////////////////// -// Dual argument helper classes (for ATL 3.0) - -#if (_ATL_VER < 0x0700) - -namespace ATL -{ - -class _U_RECT -{ -public: - _U_RECT(LPRECT lpRect) : m_lpRect(lpRect) - { } - _U_RECT(RECT& rc) : m_lpRect(&rc) - { } - LPRECT m_lpRect; -}; - -class _U_MENUorID -{ -public: - _U_MENUorID(HMENU hMenu) : m_hMenu(hMenu) - { } - _U_MENUorID(UINT nID) : m_hMenu((HMENU)LongToHandle(nID)) - { } - HMENU m_hMenu; -}; - -class _U_STRINGorID -{ -public: - _U_STRINGorID(LPCTSTR lpString) : m_lpstr(lpString) - { } - _U_STRINGorID(UINT nID) : m_lpstr(MAKEINTRESOURCE(nID)) - { } - LPCTSTR m_lpstr; -}; - -}; // namespace ATL - -#endif // (_ATL_VER < 0x0700) - - -namespace WTL -{ - -/////////////////////////////////////////////////////////////////////////////// -// Forward notifications support for message maps (for ATL 3.0) - -#if (_ATL_VER < 0x0700) - -// forward notifications support -#define FORWARD_NOTIFICATIONS() \ - { \ - bHandled = TRUE; \ - lResult = WTL::Atl3ForwardNotifications(m_hWnd, uMsg, wParam, lParam, bHandled); \ - if(bHandled) \ - return TRUE; \ - } - -static LRESULT Atl3ForwardNotifications(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) -{ - LRESULT lResult = 0; - switch(uMsg) - { - case WM_COMMAND: - case WM_NOTIFY: -#ifndef _WIN32_WCE - case WM_PARENTNOTIFY: -#endif // !_WIN32_WCE - case WM_DRAWITEM: - case WM_MEASUREITEM: - case WM_COMPAREITEM: - case WM_DELETEITEM: - case WM_VKEYTOITEM: - case WM_CHARTOITEM: - case WM_HSCROLL: - case WM_VSCROLL: - case WM_CTLCOLORBTN: - case WM_CTLCOLORDLG: - case WM_CTLCOLOREDIT: - case WM_CTLCOLORLISTBOX: - case WM_CTLCOLORMSGBOX: - case WM_CTLCOLORSCROLLBAR: - case WM_CTLCOLORSTATIC: - lResult = ::SendMessage(::GetParent(hWnd), uMsg, wParam, lParam); - break; - default: - bHandled = FALSE; - break; - } - return lResult; -} - -#endif // (_ATL_VER < 0x0700) - -}; // namespace WTL - -#endif // __ATLWINX_H__ -- cgit v1.2.3