From 532ea133bc8ffa390bb3ad2f680b604b02190168 Mon Sep 17 00:00:00 2001 From: Daniel Romischer Date: Sun, 14 Feb 2016 21:16:31 -0800 Subject: [PATCH] initial oogynize check in _ this actually used to work! --- .gitignore | 156 ++ AddIns/AddIn.Common/AddIn.Common.csproj | 65 + AddIns/AddIn.Common/CommonFunctions.cs | 399 +++++ AddIns/AddIn.Common/CommonTypes.cs | 31 + AddIns/AddIn.Common/CommonValidations.cs | 37 + AddIns/AddIn.Common/IAddIn.cs | 14 + AddIns/AddIn.Common/IDynResolve.cs | 14 + AddIns/AddIn.Common/IWorkspace.cs | 24 + .../AddIn.Common/Properties/AssemblyInfo.cs | 36 + AddIns/Addin.Office/Access.cs | 324 ++++ AddIns/Addin.Office/AddIn.cs | 13 + AddIns/Addin.Office/Addin.Office.csproj | 106 ++ AddIns/Addin.Office/Excel.cs | 383 +++++ AddIns/Addin.Office/PowerPoint.cs | 379 +++++ .../Addin.Office/Properties/AssemblyInfo.cs | 36 + AddIns/Addin.Office/Publisher.cs | 361 +++++ AddIns/Addin.Office/Visio.cs | 320 ++++ AddIns/Addin.Office/Word.cs | 424 +++++ Client Services/ButtonWPForm/ButtonForm.xaml | 19 + .../ButtonWPForm/ButtonForm.xaml.cs | 211 +++ Client Services/ButtonWPForm/ButtonFormMgr.cs | 324 ++++ .../ButtonFormPages/Page_AddEdit.xaml | 18 + .../ButtonFormPages/Page_AddEdit.xaml.cs | 81 + .../ButtonWPForm/ButtonWPForm.csproj | 156 ++ .../ButtonWPForm/ButtonWPFormCCW.cs | 249 +++ .../ButtonWPForm/CaptionButtonStarter.cs | 131 ++ .../ButtonWPForm/ComponentState.cs | 90 ++ .../ButtonWPForm/DispatcherThread.cs | 131 ++ Client Services/ButtonWPForm/IButtonForm.cs | 34 + .../ButtonWPForm/IButtonFormPage.cs | 18 + Client Services/ButtonWPForm/IClientEvents.cs | 31 + Client Services/ButtonWPForm/MyKeyFile.SNK | Bin 0 -> 596 bytes .../ButtonWPForm/Properties/AssemblyInfo.cs | 62 + .../Properties/Resources.Designer.cs | 63 + .../ButtonWPForm/Properties/Resources.resx | 117 ++ .../Properties/Settings.Designer.cs | 26 + .../ButtonWPForm/Properties/Settings.settings | 7 + Client Services/GUIDebugStepExe/App.xaml | 8 + Client Services/GUIDebugStepExe/App.xaml.cs | 16 + .../GUIDebugStepExe/GUIDebugStepExe.csproj | 112 ++ .../GUIDebugStepExe/GUIDebugStepTestForm.xaml | 22 + .../GUIDebugStepTestForm.xaml.cs | 77 + .../Properties/AssemblyInfo.cs | 55 + .../Properties/Resources.Designer.cs | 63 + .../GUIDebugStepExe/Properties/Resources.resx | 117 ++ .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + Client Services/GUIWPForms/ComponentState.cs | 77 + .../GUIWPForms/DispatcherThread.cs | 131 ++ Client Services/GUIWPForms/GUIFormsMgr.cs | 381 +++++ Client Services/GUIWPForms/GUIState.cs | 55 + .../GUIWPFPages/PageImages/AddWorkspace.png | Bin 0 -> 48982 bytes .../GUIWPFPages/PageImages/Close.png | Bin 0 -> 49981 bytes .../GUIWPFPages/PageImages/CloseAll.png | Bin 0 -> 50404 bytes .../PageImages/DeleteWorkspace.png | Bin 0 -> 50764 bytes .../GUIWPFPages/PageImages/EditWorkspace.png | Bin 0 -> 50083 bytes .../GUIWPFPages/PageImages/Hide.png | Bin 0 -> 48775 bytes .../GUIWPFPages/PageImages/House.png | Bin 0 -> 943 bytes .../GUIWPFPages/PageImages/Launch.png | Bin 0 -> 48895 bytes ...WorkspaceSelector_DeleteWorkspacePage.xaml | 20 + ...kspaceSelector_DeleteWorkspacePage.xaml.cs | 158 ++ .../WorkspaceSelector_NewWorkspacePage.xaml | 25 + ...WorkspaceSelector_NewWorkspacePage.xaml.cs | 201 +++ ...WorkspaceSelector_RenameWorkspacePage.xaml | 25 + ...kspaceSelector_RenameWorkspacePage.xaml.cs | 210 +++ .../WorkspaceSelector_StandardPage.xaml | 151 ++ .../WorkspaceSelector_StandardPage.xaml.cs | 418 +++++ Client Services/GUIWPForms/GUIWPForms.cs | 237 +++ Client Services/GUIWPForms/GUIWPForms.csproj | 212 +++ .../GUIWPForms/GUIWPForms.csproj.bak | 129 ++ .../GUIWPForms/GUIWPForms/ArtifactWall.xaml | 63 + .../GUIWPForms/ArtifactWall.xaml.cs | 269 ++++ .../GUIWPForms/SettingsNAboutUs.xaml | 42 + .../GUIWPForms/SettingsNAboutUs.xaml.cs | 101 ++ .../GUIWPForms/WorkspaceSelector.xaml | 20 + .../GUIWPForms/WorkspaceSelector.xaml.cs | 249 +++ Client Services/GUIWPForms/IGUIWPForms.cs | 32 + Client Services/GUIWPForms/MyKeyFile.SNK | Bin 0 -> 596 bytes .../GUIWPForms/Properties/AssemblyInfo.cs | 58 + .../Properties/Resources.Designer.cs | 63 + .../GUIWPForms/Properties/Resources.resx | 101 ++ .../Properties/Settings.Designer.cs | 26 + .../GUIWPForms/Properties/Settings.settings | 6 + .../GUIWPForms/Properties/licenses.licx | 1 + Components/log4net.dll | Bin 0 -> 270336 bytes DataAccessLayer/DB.cs | 298 ++++ DataAccessLayer/Data.cs | 48 + DataAccessLayer/DataAccessLayer.csproj | 224 +++ DataAccessLayer/DataTypes.cs | 564 +++++++ DataAccessLayer/MyKeyFile.SNK | Bin 0 -> 596 bytes DataAccessLayer/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + DataAccessLayer/Properties/Resources.resx | 120 ++ .../Properties/Settings.Designer.cs | 37 + DataAccessLayer/Properties/Settings.settings | 14 + DataAccessLayer/ResourceHelper.cs | 68 + .../Files/DupFiles1/Albin likes apples.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles1/Book1.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles1/Book1.xlsx | Bin 0 -> 7832 bytes .../TestData/Files/DupFiles1/Book2.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles1/Book2.xlsx | Bin 0 -> 7832 bytes .../TestData/Files/DupFiles1/Book3.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles1/Book4.xls | Bin 0 -> 16896 bytes .../Files/DupFiles1/DatabaseBills.accdb | Bin 0 -> 335872 bytes .../Files/DupFiles1/DatabaseReceits.accdb | Bin 0 -> 319488 bytes .../TestData/Files/DupFiles1/Doc1.rtf | 154 ++ .../TestData/Files/DupFiles1/Doc2.rtf | 154 ++ .../TestData/Files/DupFiles1/Document1.docx | Bin 0 -> 10049 bytes .../TestData/Files/DupFiles1/Document2.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles1/Document3.docx | Bin 0 -> 10181 bytes .../TestData/Files/DupFiles1/Document4.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles1/Document5.docx | Bin 0 -> 10048 bytes .../TestData/Files/DupFiles1/Document6.docx | Bin 0 -> 10064 bytes .../TestData/Files/DupFiles1/Document7.docx | Bin 0 -> 10079 bytes .../Files/DupFiles1/Doris likes apples.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles1/Doris.xlsx | Bin 0 -> 7821 bytes .../TestData/Files/DupFiles1/Drawing1.vsd | Bin 0 -> 18432 bytes .../TestData/Files/DupFiles1/Drawing2.vsd | Bin 0 -> 18432 bytes .../TestData/Files/DupFiles1/Map1.mmap | Bin 0 -> 22963 bytes .../TestData/Files/DupFiles1/Map2.mmap | Bin 0 -> 22963 bytes .../TestData/Files/DupFiles1/MoreDefects.TXT | 5 + .../TestData/Files/DupFiles1/New Mindmap1.mm | 4 + .../TestData/Files/DupFiles1/New Mindmap2.mm | 4 + .../Files/DupFiles1/OogyKeepInMind.txt | 27 + .../Files/DupFiles1/Presentation1.ppt | Bin 0 -> 101376 bytes .../Files/DupFiles1/Presentation2.ppt | Bin 0 -> 101888 bytes .../TestData/Files/DupFiles1/Publication1.pub | Bin 0 -> 67584 bytes .../TestData/Files/DupFiles1/Publication2.pub | Bin 0 -> 200704 bytes .../TestData/Files/DupFiles1/doris.docx | Bin 0 -> 11174 bytes .../TestData/Files/DupFiles1/doris2.docx | Bin 0 -> 11092 bytes .../TestData/Files/DupFiles1/textfile1.txt | 11 + .../Files/DupFiles2/Albin likes apples.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles2/Book1.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles2/Book1.xlsx | Bin 0 -> 7832 bytes .../TestData/Files/DupFiles2/Book2.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles2/Book2.xlsx | Bin 0 -> 7832 bytes .../TestData/Files/DupFiles2/Book3.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles2/Book4.xls | Bin 0 -> 16896 bytes .../Files/DupFiles2/DatabaseBills.accdb | Bin 0 -> 294912 bytes .../Files/DupFiles2/DatabaseReceits.accdb | Bin 0 -> 319488 bytes .../TestData/Files/DupFiles2/Doc1.rtf | 154 ++ .../TestData/Files/DupFiles2/Doc2.rtf | 154 ++ .../TestData/Files/DupFiles2/Document1.docx | Bin 0 -> 10049 bytes .../TestData/Files/DupFiles2/Document2.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles2/Document3.docx | Bin 0 -> 10181 bytes .../TestData/Files/DupFiles2/Document4.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles2/Document5.docx | Bin 0 -> 10048 bytes .../TestData/Files/DupFiles2/Document6.docx | Bin 0 -> 10064 bytes .../TestData/Files/DupFiles2/Document7.docx | Bin 0 -> 10079 bytes .../Files/DupFiles2/Doris likes apples.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles2/Doris.xlsx | Bin 0 -> 7821 bytes .../TestData/Files/DupFiles2/Drawing1.vsd | Bin 0 -> 18432 bytes .../TestData/Files/DupFiles2/Drawing2.vsd | Bin 0 -> 18432 bytes .../TestData/Files/DupFiles2/Map1.mmap | Bin 0 -> 22963 bytes .../TestData/Files/DupFiles2/Map2.mmap | Bin 0 -> 22963 bytes .../TestData/Files/DupFiles2/MoreDefects.TXT | 5 + .../TestData/Files/DupFiles2/New Mindmap1.mm | 4 + .../TestData/Files/DupFiles2/New Mindmap2.mm | 4 + .../Files/DupFiles2/OogyKeepInMind.txt | 27 + .../Files/DupFiles2/Presentation1.ppt | Bin 0 -> 101376 bytes .../Files/DupFiles2/Presentation2.ppt | Bin 0 -> 101376 bytes .../TestData/Files/DupFiles2/Publication1.pub | Bin 0 -> 67584 bytes .../TestData/Files/DupFiles2/Publication2.pub | Bin 0 -> 200704 bytes .../TestData/Files/DupFiles2/doris.docx | Bin 0 -> 11174 bytes .../TestData/Files/DupFiles2/doris2.docx | Bin 0 -> 11092 bytes .../TestData/Files/DupFiles2/textfile1.txt | 11 + .../Files/DupFiles3/Albin likes apples.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles3/Book1.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles3/Book1.xlsx | Bin 0 -> 7832 bytes .../TestData/Files/DupFiles3/Book2.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles3/Book2.xlsx | Bin 0 -> 7832 bytes .../TestData/Files/DupFiles3/Book3.xls | Bin 0 -> 16896 bytes .../TestData/Files/DupFiles3/Book4.xls | Bin 0 -> 16896 bytes .../Files/DupFiles3/DatabaseBills.accdb | Bin 0 -> 294912 bytes .../Files/DupFiles3/DatabaseReceits.accdb | Bin 0 -> 319488 bytes .../TestData/Files/DupFiles3/Doc1.rtf | 154 ++ .../TestData/Files/DupFiles3/Doc2.rtf | 154 ++ .../TestData/Files/DupFiles3/Document1.docx | Bin 0 -> 10049 bytes .../TestData/Files/DupFiles3/Document2.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles3/Document3.docx | Bin 0 -> 10181 bytes .../TestData/Files/DupFiles3/Document4.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles3/Document5.docx | Bin 0 -> 10048 bytes .../TestData/Files/DupFiles3/Document6.docx | Bin 0 -> 10064 bytes .../TestData/Files/DupFiles3/Document7.docx | Bin 0 -> 10079 bytes .../Files/DupFiles3/Doris likes apples.doc | Bin 0 -> 27136 bytes .../TestData/Files/DupFiles3/Doris.xlsx | Bin 0 -> 7821 bytes .../TestData/Files/DupFiles3/Drawing1.vsd | Bin 0 -> 18432 bytes .../TestData/Files/DupFiles3/Drawing2.vsd | Bin 0 -> 18432 bytes .../TestData/Files/DupFiles3/Map1.mmap | Bin 0 -> 22963 bytes .../TestData/Files/DupFiles3/Map2.mmap | Bin 0 -> 22963 bytes .../TestData/Files/DupFiles3/MoreDefects.TXT | 5 + .../TestData/Files/DupFiles3/New Mindmap1.mm | 4 + .../TestData/Files/DupFiles3/New Mindmap2.mm | 4 + .../Files/DupFiles3/OogyKeepInMind.txt | 27 + .../Files/DupFiles3/Presentation1.ppt | Bin 0 -> 101376 bytes .../Files/DupFiles3/Presentation2.ppt | Bin 0 -> 101376 bytes .../TestData/Files/DupFiles3/Publication1.pub | Bin 0 -> 67584 bytes .../TestData/Files/DupFiles3/Publication2.pub | Bin 0 -> 200704 bytes .../TestData/Files/DupFiles3/doris.docx | Bin 0 -> 11174 bytes .../TestData/Files/DupFiles3/doris2.docx | Bin 0 -> 11092 bytes .../TestData/Files/DupFiles3/textfile1.txt | 11 + .../c9f487bd-7cef-4f45-8238-08a4be0a3ba3.png | Bin 0 -> 121658 bytes DataAccessLayer/TestData/TestData.cs | 348 ++++ DataAccessLayer/Tests/StressTest.cs | 572 +++++++ DataAccessLayer/app.config | 10 + DataAccessLayer/dArtifacts.cs | 874 ++++++++++ DataAccessLayer/dState.cs | 139 ++ DataAccessLayer/dUserSettings.cs | 183 +++ DataAccessLayer/dVersioningTables.cs | 108 ++ DataAccessLayer/dWorkspace.cs | 341 ++++ DataAccessLayer/nUnitTests.cs | 36 + Deskband/BandObjectBase/Attributes.cs | 37 + Deskband/BandObjectBase/BandObject.cs | 476 ++++++ Deskband/BandObjectBase/BandObject.csproj | 157 ++ Deskband/BandObjectBase/BandObject.resx | 120 ++ Deskband/BandObjectBase/BandObjectBase.sln | 55 + Deskband/BandObjectBase/BandObjects.snk | Bin 0 -> 596 bytes Deskband/BandObjectBase/ComInterop.cs | 246 +++ .../RegisterLib/RegisterLib.vcproj | 89 ++ Deskband/DeskBand/AssemblyInfo.cs | 58 + Deskband/DeskBand/DeskBand.cs | 503 ++++++ Deskband/DeskBand/DeskBand.csproj | 174 ++ Deskband/DeskBand/DeskBand.resx | 123 ++ Deskband/DeskBand/DeskBand.sln | 91 ++ Deskband/DeskBand/MyKeyFile.SNK | Bin 0 -> 596 bytes .../DeskBand/Properties/Resources.Designer.cs | 63 + Deskband/DeskBand/Properties/Resources.resx | 120 ++ Deskband/DeskBand/Register/Register.vcproj | 91 ++ GUILib/GUICommon.cs | 285 ++++ GUILib/GUILib.csproj | 103 ++ GUILib/MyKeyFile.SNK | Bin 0 -> 596 bytes GUILib/Properties/AssemblyInfo.cs | 36 + GUILib/ScreenCapture.cs | 207 +++ GUILib/WPFHelper.cs | 106 ++ GUILib/WPFHiddenWindow.cs | 148 ++ GUILib/app.config | 3 + Hooks/ButtonHook/ButtonHook.cpp | 1153 ++++++++++++++ Hooks/ButtonHook/ButtonHook.h | 17 + Hooks/ButtonHook/ButtonHook.vcproj | 236 +++ Hooks/ButtonHook/ButtonStrategy.cpp | 390 +++++ Hooks/ButtonHook/ButtonStrategy.h | 102 ++ Hooks/ButtonHook/CWHPaccess.cpp | 414 +++++ Hooks/ButtonHook/CWHPaccess.h | 97 ++ Hooks/ButtonHook/HookList.h | 151 ++ Hooks/ButtonHook/HookWndItem.h | 20 + Hooks/ButtonHook/Stdafx.cpp | 153 ++ Hooks/ButtonHook/Stdafx.h | 47 + Hooks/ButtonHook/WPFCaller.cpp | 1417 +++++++++++++++++ Hooks/ButtonHook/WPFCaller.h | 171 ++ Hooks/ButtonHook/resource.h | 15 + Hooks/ButtonHook/thread.h | 100 ++ Hooks/CaptionButton/CaptionButton.Designer.cs | 57 + Hooks/CaptionButton/CaptionButton.cs | 107 ++ Hooks/CaptionButton/CaptionButton.csproj | 115 ++ Hooks/CaptionButton/CaptionButton.resx | 120 ++ Hooks/CaptionButton/MyKeyFile.SNK | Bin 0 -> 596 bytes Hooks/CaptionButton/Program.cs | 49 + .../CaptionButton/Properties/AssemblyInfo.cs | 36 + .../Properties/Resources.Designer.cs | 63 + Hooks/CaptionButton/Properties/Resources.resx | 117 ++ .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + Oggynize_1.0.sln | 249 +++ Platform/Env.cs | 247 +++ Platform/ErrorReporting/UserError.cs | 24 + Platform/InstallationSpec.cs | 201 +++ Platform/Interacters/BHInteracter.cs | 489 ++++++ Platform/Logger.cs | 58 + Platform/MyKeyFile.SNK | Bin 0 -> 596 bytes Platform/OSWrapper.cs | 39 + Platform/ObjectPooling.txt | 3 + Platform/Platform.csproj | 99 ++ Platform/Properties/AssemblyInfo.cs | 36 + .../Resources/Themes/AeroTheme/ButtonDown.ico | Bin 0 -> 1790 bytes .../Resources/Themes/AeroTheme/ButtonUp.ico | Bin 0 -> 1790 bytes .../Resources/Themes/AeroTheme/ToggleUp.ico | Bin 0 -> 1790 bytes .../Themes/ClassicTheme/ButtonDown.ico | Bin 0 -> 1790 bytes .../Themes/ClassicTheme/ButtonUp.ico | Bin 0 -> 1790 bytes .../Themes/ClassicTheme/ToggleUp.ico | Bin 0 -> 1790 bytes .../Themes/VistaNoAeroTheme/ButtonDown.ico | Bin 0 -> 1790 bytes .../Themes/VistaNoAeroTheme/ButtonUp.ico | Bin 0 -> 1790 bytes .../Themes/VistaNoAeroTheme/ToggleUp.ico | Bin 0 -> 1790 bytes .../Resources/Themes/XPTheme/ButtonDown.ico | Bin 0 -> 1790 bytes .../Resources/Themes/XPTheme/ButtonUp.ico | Bin 0 -> 1790 bytes .../Resources/Themes/XPTheme/ToggleUp.ico | Bin 0 -> 1790 bytes Platform/Satellite/GUI.cs | 63 + Platform/Utilities/DebugLogger.cs | 91 ++ Platform/Utilities/FileM.cs | 154 ++ Platform/Utilities/RegM.cs | 191 +++ Platform/Win32.cs | 1362 ++++++++++++++++ Platform/app.config | 3 + Satellite/GUI.Designer.cs | 72 + Satellite/GUI.de.resx | 101 ++ Satellite/GUI.en.resx | 140 ++ Satellite/GUI.resx | 124 ++ Satellite/MyKeyFile.SNK | Bin 0 -> 596 bytes Satellite/Properties/AssemblyInfo.cs | 36 + Satellite/Satellite.csproj | 69 + Settings/AppConfig.xml | 29 + Settings/ButtonThemeSetting.cs | 166 ++ Settings/MyKeyFile.SNK | Bin 0 -> 596 bytes Settings/Properties/AssemblyInfo.cs | 36 + Settings/Properties/Resources.Designer.cs | 78 + Settings/Properties/Resources.resx | 124 ++ Settings/Properties/Settings.Designer.cs | 26 + Settings/Properties/Settings.settings | 6 + Settings/RegPathsConfig.bat | 23 + Settings/Settings.csproj | 107 ++ Settings/SettingsAcc.cs | 459 ++++++ Settings/app.config | 3 + WorkspaceMgr/Closers/Closer_Generic.cs | 62 + WorkspaceMgr/Closers/Closer_IE.cs | 62 + WorkspaceMgr/Closers/Closer_Office.cs | 625 ++++++++ WorkspaceMgr/Closers/IClose.cs | 13 + WorkspaceMgr/Configurations.cs | 32 + WorkspaceMgr/HelperFunc.cs | 147 ++ WorkspaceMgr/IWorkspaceMgr.cs | 23 + WorkspaceMgr/Launchers/ILaunch.cs | 13 + WorkspaceMgr/Launchers/Launcher_Excel.cs | 155 ++ WorkspaceMgr/Launchers/Launcher_Generic.cs | 56 + WorkspaceMgr/Launchers/Launcher_Shell.cs | 83 + WorkspaceMgr/Launchers/Launcher_Visio.cs | 72 + WorkspaceMgr/Launchers/Launcher_Web.cs | 47 + WorkspaceMgr/MyKeyFile.SNK | Bin 0 -> 596 bytes WorkspaceMgr/Properties/AssemblyInfo.cs | 36 + WorkspaceMgr/ShowNHide/IShowNHide.cs | 16 + WorkspaceMgr/ShowNHide/ShowNHide_Generic.cs | 75 + WorkspaceMgr/ShowNHide/ShowNHide_Office.cs | 847 ++++++++++ WorkspaceMgr/WorkspaceMgr.cs | 248 +++ WorkspaceMgr/WorkspaceMgr.csproj | 134 ++ WorkspaceMgr/WorkspaceState.cs | 18 + WorkspaceMgr/WorkspaceTypes.cs | 291 ++++ zEasyTest/Program.cs | 47 + zEasyTest/Properties/AssemblyInfo.cs | 36 + zEasyTest/Settings_Test.cs | 32 + zEasyTest/WorkspaceMgr_Test.cs | 46 + zEasyTest/zEasyTest.csproj | 83 + 337 files changed, 30692 insertions(+) create mode 100644 .gitignore create mode 100644 AddIns/AddIn.Common/AddIn.Common.csproj create mode 100644 AddIns/AddIn.Common/CommonFunctions.cs create mode 100644 AddIns/AddIn.Common/CommonTypes.cs create mode 100644 AddIns/AddIn.Common/CommonValidations.cs create mode 100644 AddIns/AddIn.Common/IAddIn.cs create mode 100644 AddIns/AddIn.Common/IDynResolve.cs create mode 100644 AddIns/AddIn.Common/IWorkspace.cs create mode 100644 AddIns/AddIn.Common/Properties/AssemblyInfo.cs create mode 100644 AddIns/Addin.Office/Access.cs create mode 100644 AddIns/Addin.Office/AddIn.cs create mode 100644 AddIns/Addin.Office/Addin.Office.csproj create mode 100644 AddIns/Addin.Office/Excel.cs create mode 100644 AddIns/Addin.Office/PowerPoint.cs create mode 100644 AddIns/Addin.Office/Properties/AssemblyInfo.cs create mode 100644 AddIns/Addin.Office/Publisher.cs create mode 100644 AddIns/Addin.Office/Visio.cs create mode 100644 AddIns/Addin.Office/Word.cs create mode 100644 Client Services/ButtonWPForm/ButtonForm.xaml create mode 100644 Client Services/ButtonWPForm/ButtonForm.xaml.cs create mode 100644 Client Services/ButtonWPForm/ButtonFormMgr.cs create mode 100644 Client Services/ButtonWPForm/ButtonFormPages/Page_AddEdit.xaml create mode 100644 Client Services/ButtonWPForm/ButtonFormPages/Page_AddEdit.xaml.cs create mode 100644 Client Services/ButtonWPForm/ButtonWPForm.csproj create mode 100644 Client Services/ButtonWPForm/ButtonWPFormCCW.cs create mode 100644 Client Services/ButtonWPForm/CaptionButtonStarter.cs create mode 100644 Client Services/ButtonWPForm/ComponentState.cs create mode 100644 Client Services/ButtonWPForm/DispatcherThread.cs create mode 100644 Client Services/ButtonWPForm/IButtonForm.cs create mode 100644 Client Services/ButtonWPForm/IButtonFormPage.cs create mode 100644 Client Services/ButtonWPForm/IClientEvents.cs create mode 100644 Client Services/ButtonWPForm/MyKeyFile.SNK create mode 100644 Client Services/ButtonWPForm/Properties/AssemblyInfo.cs create mode 100644 Client Services/ButtonWPForm/Properties/Resources.Designer.cs create mode 100644 Client Services/ButtonWPForm/Properties/Resources.resx create mode 100644 Client Services/ButtonWPForm/Properties/Settings.Designer.cs create mode 100644 Client Services/ButtonWPForm/Properties/Settings.settings create mode 100644 Client Services/GUIDebugStepExe/App.xaml create mode 100644 Client Services/GUIDebugStepExe/App.xaml.cs create mode 100644 Client Services/GUIDebugStepExe/GUIDebugStepExe.csproj create mode 100644 Client Services/GUIDebugStepExe/GUIDebugStepTestForm.xaml create mode 100644 Client Services/GUIDebugStepExe/GUIDebugStepTestForm.xaml.cs create mode 100644 Client Services/GUIDebugStepExe/Properties/AssemblyInfo.cs create mode 100644 Client Services/GUIDebugStepExe/Properties/Resources.Designer.cs create mode 100644 Client Services/GUIDebugStepExe/Properties/Resources.resx create mode 100644 Client Services/GUIDebugStepExe/Properties/Settings.Designer.cs create mode 100644 Client Services/GUIDebugStepExe/Properties/Settings.settings create mode 100644 Client Services/GUIWPForms/ComponentState.cs create mode 100644 Client Services/GUIWPForms/DispatcherThread.cs create mode 100644 Client Services/GUIWPForms/GUIFormsMgr.cs create mode 100644 Client Services/GUIWPForms/GUIState.cs create mode 100644 Client Services/GUIWPForms/GUIWPFPages/PageImages/AddWorkspace.png create mode 100644 Client Services/GUIWPForms/GUIWPFPages/PageImages/Close.png create mode 100644 Client Services/GUIWPForms/GUIWPFPages/PageImages/CloseAll.png create mode 100644 Client Services/GUIWPForms/GUIWPFPages/PageImages/DeleteWorkspace.png create mode 100644 Client Services/GUIWPForms/GUIWPFPages/PageImages/EditWorkspace.png create mode 100644 Client Services/GUIWPForms/GUIWPFPages/PageImages/Hide.png create mode 100644 Client Services/GUIWPForms/GUIWPFPages/PageImages/House.png create mode 100644 Client Services/GUIWPForms/GUIWPFPages/PageImages/Launch.png create mode 100644 Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_DeleteWorkspacePage.xaml create mode 100644 Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_DeleteWorkspacePage.xaml.cs create mode 100644 Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_NewWorkspacePage.xaml create mode 100644 Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_NewWorkspacePage.xaml.cs create mode 100644 Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_RenameWorkspacePage.xaml create mode 100644 Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_RenameWorkspacePage.xaml.cs create mode 100644 Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_StandardPage.xaml create mode 100644 Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_StandardPage.xaml.cs create mode 100644 Client Services/GUIWPForms/GUIWPForms.cs create mode 100644 Client Services/GUIWPForms/GUIWPForms.csproj create mode 100644 Client Services/GUIWPForms/GUIWPForms.csproj.bak create mode 100644 Client Services/GUIWPForms/GUIWPForms/ArtifactWall.xaml create mode 100644 Client Services/GUIWPForms/GUIWPForms/ArtifactWall.xaml.cs create mode 100644 Client Services/GUIWPForms/GUIWPForms/SettingsNAboutUs.xaml create mode 100644 Client Services/GUIWPForms/GUIWPForms/SettingsNAboutUs.xaml.cs create mode 100644 Client Services/GUIWPForms/GUIWPForms/WorkspaceSelector.xaml create mode 100644 Client Services/GUIWPForms/GUIWPForms/WorkspaceSelector.xaml.cs create mode 100644 Client Services/GUIWPForms/IGUIWPForms.cs create mode 100644 Client Services/GUIWPForms/MyKeyFile.SNK create mode 100644 Client Services/GUIWPForms/Properties/AssemblyInfo.cs create mode 100644 Client Services/GUIWPForms/Properties/Resources.Designer.cs create mode 100644 Client Services/GUIWPForms/Properties/Resources.resx create mode 100644 Client Services/GUIWPForms/Properties/Settings.Designer.cs create mode 100644 Client Services/GUIWPForms/Properties/Settings.settings create mode 100644 Client Services/GUIWPForms/Properties/licenses.licx create mode 100644 Components/log4net.dll create mode 100644 DataAccessLayer/DB.cs create mode 100644 DataAccessLayer/Data.cs create mode 100644 DataAccessLayer/DataAccessLayer.csproj create mode 100644 DataAccessLayer/DataTypes.cs create mode 100644 DataAccessLayer/MyKeyFile.SNK create mode 100644 DataAccessLayer/Properties/AssemblyInfo.cs create mode 100644 DataAccessLayer/Properties/Resources.Designer.cs create mode 100644 DataAccessLayer/Properties/Resources.resx create mode 100644 DataAccessLayer/Properties/Settings.Designer.cs create mode 100644 DataAccessLayer/Properties/Settings.settings create mode 100644 DataAccessLayer/ResourceHelper.cs create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Albin likes apples.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Book1.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Book1.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Book2.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Book2.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Book3.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Book4.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/DatabaseBills.accdb create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/DatabaseReceits.accdb create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Doc1.rtf create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Doc2.rtf create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Document1.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Document2.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Document3.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Document4.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Document5.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Document6.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Document7.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Doris likes apples.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Doris.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Drawing1.vsd create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Drawing2.vsd create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Map1.mmap create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Map2.mmap create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/MoreDefects.TXT create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/New Mindmap1.mm create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/New Mindmap2.mm create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/OogyKeepInMind.txt create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Presentation1.ppt create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Presentation2.ppt create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Publication1.pub create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/Publication2.pub create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/doris.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/doris2.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles1/textfile1.txt create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Albin likes apples.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Book1.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Book1.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Book2.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Book2.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Book3.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Book4.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/DatabaseBills.accdb create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/DatabaseReceits.accdb create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Doc1.rtf create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Doc2.rtf create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Document1.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Document2.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Document3.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Document4.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Document5.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Document6.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Document7.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Doris likes apples.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Doris.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Drawing1.vsd create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Drawing2.vsd create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Map1.mmap create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Map2.mmap create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/MoreDefects.TXT create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/New Mindmap1.mm create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/New Mindmap2.mm create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/OogyKeepInMind.txt create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Presentation1.ppt create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Presentation2.ppt create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Publication1.pub create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/Publication2.pub create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/doris.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/doris2.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles2/textfile1.txt create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Albin likes apples.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Book1.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Book1.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Book2.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Book2.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Book3.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Book4.xls create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/DatabaseBills.accdb create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/DatabaseReceits.accdb create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Doc1.rtf create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Doc2.rtf create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Document1.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Document2.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Document3.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Document4.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Document5.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Document6.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Document7.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Doris likes apples.doc create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Doris.xlsx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Drawing1.vsd create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Drawing2.vsd create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Map1.mmap create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Map2.mmap create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/MoreDefects.TXT create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/New Mindmap1.mm create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/New Mindmap2.mm create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/OogyKeepInMind.txt create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Presentation1.ppt create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Presentation2.ppt create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Publication1.pub create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/Publication2.pub create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/doris.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/doris2.docx create mode 100644 DataAccessLayer/TestData/Files/DupFiles3/textfile1.txt create mode 100644 DataAccessLayer/TestData/Files/Snapshots/c9f487bd-7cef-4f45-8238-08a4be0a3ba3.png create mode 100644 DataAccessLayer/TestData/TestData.cs create mode 100644 DataAccessLayer/Tests/StressTest.cs create mode 100644 DataAccessLayer/app.config create mode 100644 DataAccessLayer/dArtifacts.cs create mode 100644 DataAccessLayer/dState.cs create mode 100644 DataAccessLayer/dUserSettings.cs create mode 100644 DataAccessLayer/dVersioningTables.cs create mode 100644 DataAccessLayer/dWorkspace.cs create mode 100644 DataAccessLayer/nUnitTests.cs create mode 100644 Deskband/BandObjectBase/Attributes.cs create mode 100644 Deskband/BandObjectBase/BandObject.cs create mode 100644 Deskband/BandObjectBase/BandObject.csproj create mode 100644 Deskband/BandObjectBase/BandObject.resx create mode 100644 Deskband/BandObjectBase/BandObjectBase.sln create mode 100644 Deskband/BandObjectBase/BandObjects.snk create mode 100644 Deskband/BandObjectBase/ComInterop.cs create mode 100644 Deskband/BandObjectBase/RegisterLib/RegisterLib.vcproj create mode 100644 Deskband/DeskBand/AssemblyInfo.cs create mode 100644 Deskband/DeskBand/DeskBand.cs create mode 100644 Deskband/DeskBand/DeskBand.csproj create mode 100644 Deskband/DeskBand/DeskBand.resx create mode 100644 Deskband/DeskBand/DeskBand.sln create mode 100644 Deskband/DeskBand/MyKeyFile.SNK create mode 100644 Deskband/DeskBand/Properties/Resources.Designer.cs create mode 100644 Deskband/DeskBand/Properties/Resources.resx create mode 100644 Deskband/DeskBand/Register/Register.vcproj create mode 100644 GUILib/GUICommon.cs create mode 100644 GUILib/GUILib.csproj create mode 100644 GUILib/MyKeyFile.SNK create mode 100644 GUILib/Properties/AssemblyInfo.cs create mode 100644 GUILib/ScreenCapture.cs create mode 100644 GUILib/WPFHelper.cs create mode 100644 GUILib/WPFHiddenWindow.cs create mode 100644 GUILib/app.config create mode 100644 Hooks/ButtonHook/ButtonHook.cpp create mode 100644 Hooks/ButtonHook/ButtonHook.h create mode 100644 Hooks/ButtonHook/ButtonHook.vcproj create mode 100644 Hooks/ButtonHook/ButtonStrategy.cpp create mode 100644 Hooks/ButtonHook/ButtonStrategy.h create mode 100644 Hooks/ButtonHook/CWHPaccess.cpp create mode 100644 Hooks/ButtonHook/CWHPaccess.h create mode 100644 Hooks/ButtonHook/HookList.h create mode 100644 Hooks/ButtonHook/HookWndItem.h create mode 100644 Hooks/ButtonHook/Stdafx.cpp create mode 100644 Hooks/ButtonHook/Stdafx.h create mode 100644 Hooks/ButtonHook/WPFCaller.cpp create mode 100644 Hooks/ButtonHook/WPFCaller.h create mode 100644 Hooks/ButtonHook/resource.h create mode 100644 Hooks/ButtonHook/thread.h create mode 100644 Hooks/CaptionButton/CaptionButton.Designer.cs create mode 100644 Hooks/CaptionButton/CaptionButton.cs create mode 100644 Hooks/CaptionButton/CaptionButton.csproj create mode 100644 Hooks/CaptionButton/CaptionButton.resx create mode 100644 Hooks/CaptionButton/MyKeyFile.SNK create mode 100644 Hooks/CaptionButton/Program.cs create mode 100644 Hooks/CaptionButton/Properties/AssemblyInfo.cs create mode 100644 Hooks/CaptionButton/Properties/Resources.Designer.cs create mode 100644 Hooks/CaptionButton/Properties/Resources.resx create mode 100644 Hooks/CaptionButton/Properties/Settings.Designer.cs create mode 100644 Hooks/CaptionButton/Properties/Settings.settings create mode 100644 Oggynize_1.0.sln create mode 100644 Platform/Env.cs create mode 100644 Platform/ErrorReporting/UserError.cs create mode 100644 Platform/InstallationSpec.cs create mode 100644 Platform/Interacters/BHInteracter.cs create mode 100644 Platform/Logger.cs create mode 100644 Platform/MyKeyFile.SNK create mode 100644 Platform/OSWrapper.cs create mode 100644 Platform/ObjectPooling.txt create mode 100644 Platform/Platform.csproj create mode 100644 Platform/Properties/AssemblyInfo.cs create mode 100644 Platform/Resources/Themes/AeroTheme/ButtonDown.ico create mode 100644 Platform/Resources/Themes/AeroTheme/ButtonUp.ico create mode 100644 Platform/Resources/Themes/AeroTheme/ToggleUp.ico create mode 100644 Platform/Resources/Themes/ClassicTheme/ButtonDown.ico create mode 100644 Platform/Resources/Themes/ClassicTheme/ButtonUp.ico create mode 100644 Platform/Resources/Themes/ClassicTheme/ToggleUp.ico create mode 100644 Platform/Resources/Themes/VistaNoAeroTheme/ButtonDown.ico create mode 100644 Platform/Resources/Themes/VistaNoAeroTheme/ButtonUp.ico create mode 100644 Platform/Resources/Themes/VistaNoAeroTheme/ToggleUp.ico create mode 100644 Platform/Resources/Themes/XPTheme/ButtonDown.ico create mode 100644 Platform/Resources/Themes/XPTheme/ButtonUp.ico create mode 100644 Platform/Resources/Themes/XPTheme/ToggleUp.ico create mode 100644 Platform/Satellite/GUI.cs create mode 100644 Platform/Utilities/DebugLogger.cs create mode 100644 Platform/Utilities/FileM.cs create mode 100644 Platform/Utilities/RegM.cs create mode 100644 Platform/Win32.cs create mode 100644 Platform/app.config create mode 100644 Satellite/GUI.Designer.cs create mode 100644 Satellite/GUI.de.resx create mode 100644 Satellite/GUI.en.resx create mode 100644 Satellite/GUI.resx create mode 100644 Satellite/MyKeyFile.SNK create mode 100644 Satellite/Properties/AssemblyInfo.cs create mode 100644 Satellite/Satellite.csproj create mode 100644 Settings/AppConfig.xml create mode 100644 Settings/ButtonThemeSetting.cs create mode 100644 Settings/MyKeyFile.SNK create mode 100644 Settings/Properties/AssemblyInfo.cs create mode 100644 Settings/Properties/Resources.Designer.cs create mode 100644 Settings/Properties/Resources.resx create mode 100644 Settings/Properties/Settings.Designer.cs create mode 100644 Settings/Properties/Settings.settings create mode 100644 Settings/RegPathsConfig.bat create mode 100644 Settings/Settings.csproj create mode 100644 Settings/SettingsAcc.cs create mode 100644 Settings/app.config create mode 100644 WorkspaceMgr/Closers/Closer_Generic.cs create mode 100644 WorkspaceMgr/Closers/Closer_IE.cs create mode 100644 WorkspaceMgr/Closers/Closer_Office.cs create mode 100644 WorkspaceMgr/Closers/IClose.cs create mode 100644 WorkspaceMgr/Configurations.cs create mode 100644 WorkspaceMgr/HelperFunc.cs create mode 100644 WorkspaceMgr/IWorkspaceMgr.cs create mode 100644 WorkspaceMgr/Launchers/ILaunch.cs create mode 100644 WorkspaceMgr/Launchers/Launcher_Excel.cs create mode 100644 WorkspaceMgr/Launchers/Launcher_Generic.cs create mode 100644 WorkspaceMgr/Launchers/Launcher_Shell.cs create mode 100644 WorkspaceMgr/Launchers/Launcher_Visio.cs create mode 100644 WorkspaceMgr/Launchers/Launcher_Web.cs create mode 100644 WorkspaceMgr/MyKeyFile.SNK create mode 100644 WorkspaceMgr/Properties/AssemblyInfo.cs create mode 100644 WorkspaceMgr/ShowNHide/IShowNHide.cs create mode 100644 WorkspaceMgr/ShowNHide/ShowNHide_Generic.cs create mode 100644 WorkspaceMgr/ShowNHide/ShowNHide_Office.cs create mode 100644 WorkspaceMgr/WorkspaceMgr.cs create mode 100644 WorkspaceMgr/WorkspaceMgr.csproj create mode 100644 WorkspaceMgr/WorkspaceState.cs create mode 100644 WorkspaceMgr/WorkspaceTypes.cs create mode 100644 zEasyTest/Program.cs create mode 100644 zEasyTest/Properties/AssemblyInfo.cs create mode 100644 zEasyTest/Settings_Test.cs create mode 100644 zEasyTest/WorkspaceMgr_Test.cs create mode 100644 zEasyTest/zEasyTest.csproj diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1bc915c --- /dev/null +++ b/.gitignore @@ -0,0 +1,156 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.sln.docstates + +# Build results + +[Dd]ebug/ +[Rr]elease/ +x64/ +build/ +[Bb]in/ +[Oo]bj/ + +# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets +!packages/*/build/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +*_i.c +*_p.c +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.log +*.scc + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +*.ncrunch* +.*crunch*.local.xml + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.Publish.xml + +# NuGet Packages Directory +## TODO: If you have NuGet Package Restore enabled, uncomment the next line +#packages/ + +# Windows Azure Build Output +csx +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Others +sql/ +*.Cache +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.[Pp]ublish.xml +*.pfx +*.publishsettings + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file to a newer +# Visual Studio version. Backup files are not needed, because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +App_Data/*.mdf +App_Data/*.ldf + + +#LightSwitch generated files +GeneratedArtifacts/ +_Pvt_Extensions/ +ModelManifest.xml + +# ========================= +# Windows detritus +# ========================= + +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Mac desktop service store files +.DS_Store diff --git a/AddIns/AddIn.Common/AddIn.Common.csproj b/AddIns/AddIn.Common/AddIn.Common.csproj new file mode 100644 index 0000000..8d5aef2 --- /dev/null +++ b/AddIns/AddIn.Common/AddIn.Common.csproj @@ -0,0 +1,65 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {D32C4454-9334-47AA-9A3F-456B8B12220A} + Library + Properties + Foo.AddIn.Common + Foo.AddIn.Common + v3.5 + 512 + + + true + full + false + ..\..\Target\Debug\AddIns\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\Target\Release\AddIns\ + TRACE + prompt + 4 + + + + + 3.5 + + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AddIns/AddIn.Common/CommonFunctions.cs b/AddIns/AddIn.Common/CommonFunctions.cs new file mode 100644 index 0000000..415b7eb --- /dev/null +++ b/AddIns/AddIn.Common/CommonFunctions.cs @@ -0,0 +1,399 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Collections.Generic; +using System.Runtime.InteropServices.ComTypes; +using System.Runtime.InteropServices; +using System.Drawing; +using System.Diagnostics; + +namespace Foo.AddIn.Common +{ + #region Structs + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int left; + public int top; + public int right; + public int bottom; + + public Rectangle AsRectangle + { + get + { + return new Rectangle(this.left, this.top, this.right - this.left, this.bottom - this.top); + } + } + + public static RECT FromXYWH(int x, int y, int width, int height) + { + RECT rect = new RECT(); + rect.left = x; + rect.top = y; + rect.right = x + width; + rect.bottom = y + height; + return rect; + } + + public static RECT FromRectangle(Rectangle rectangle) + { + RECT rect = new RECT(); + rect.left = rectangle.Left; + rect.top = rectangle.Top; + rect.right = rectangle.Right; + rect.bottom = rectangle.Bottom; + return rect; + } + } + + #endregion + + public static class Functions + { + #region Enums + + public static class FuncEnum + { + public enum WindowAction : int + { + SW_HIDE = 0, + SW_SHOWNORMAL = 1, + SW_NORMAL = 1, + SW_SHOWMINIMIZED = 2, + SW_SHOWMAXIMIZED = 3, + SW_MAXIMIZE = 3, + SW_SHOWNOACTIVATE = 4, + SW_SHOW = 5, + SW_MINIMIZE = 6, + SW_SHOWMINNOACTIVE = 7, + SW_SHOWNA = 8, + SW_RESTORE = 9, + SW_SHOWDEFAULT = 10, + SW_FORCEMINIMIZE = 11, + SW_MAX = 11 + } + + public enum WindowMessage : int + { + WM_NULL = 0x0000, + WM_CREATE = 0x0001, + WM_DESTROY = 0x0002, + WM_MOVE = 0x0003, + WM_SIZE = 0x0005, + WM_ACTIVATE = 0x0006, + WM_SETFOCUS = 0x0007, + WM_KILLFOCUS = 0x0008, + WM_ENABLE = 0x000A, + WM_SETREDRAW = 0x000B, + WM_SETTEXT = 0x000C, + WM_GETTEXT = 0x000D, + WM_GETTEXTLENGTH = 0x000E, + WM_PAINT = 0x000F, + WM_CLOSE = 0x0010, + WM_QUERYENDSESSION = 0x0011, + WM_QUIT = 0x0012, + WM_QUERYOPEN = 0x0013, + WM_ERASEBKGND = 0x0014, + WM_SYSCOLORCHANGE = 0x0015, + WM_ENDSESSION = 0x0016, + WM_SHOWWINDOW = 0x0018, + WM_CTLCOLOR = 0x0019, + WM_WININICHANGE = 0x001A, + WM_SETTINGCHANGE = 0x001A, + WM_DEVMODECHANGE = 0x001B, + WM_ACTIVATEAPP = 0x001C, + WM_FONTCHANGE = 0x001D, + WM_TIMECHANGE = 0x001E, + WM_CANCELMODE = 0x001F, + WM_SETCURSOR = 0x0020, + WM_MOUSEACTIVATE = 0x0021, + WM_CHILDACTIVATE = 0x0022, + WM_QUEUESYNC = 0x0023, + WM_GETMINMAXINFO = 0x0024, + WM_PAINTICON = 0x0026, + WM_ICONERASEBKGND = 0x0027, + WM_NEXTDLGCTL = 0x0028, + WM_SPOOLERSTATUS = 0x002A, + WM_DRAWITEM = 0x002B, + WM_MEASUREITEM = 0x002C, + WM_DELETEITEM = 0x002D, + WM_VKEYTOITEM = 0x002E, + WM_CHARTOITEM = 0x002F, + WM_SETFONT = 0x0030, + WM_GETFONT = 0x0031, + WM_SETHOTKEY = 0x0032, + WM_GETHOTKEY = 0x0033, + WM_QUERYDRAGICON = 0x0037, + WM_COMPAREITEM = 0x0039, + WM_GETOBJECT = 0x003D, + WM_COMPACTING = 0x0041, + WM_COMMNOTIFY = 0x0044, + WM_WINDOWPOSCHANGING = 0x0046, + WM_WINDOWPOSCHANGED = 0x0047, + WM_POWER = 0x0048, + WM_COPYDATA = 0x004A, + WM_CANCELJOURNAL = 0x004B, + WM_NOTIFY = 0x004E, + WM_INPUTLANGCHANGEREQUEST = 0x0050, + WM_INPUTLANGCHANGE = 0x0051, + WM_TCARD = 0x0052, + WM_HELP = 0x0053, + WM_USERCHANGED = 0x0054, + WM_NOTIFYFORMAT = 0x0055, + WM_CONTEXTMENU = 0x007B, + WM_STYLECHANGING = 0x007C, + WM_STYLECHANGED = 0x007D, + WM_DISPLAYCHANGE = 0x007E, + WM_GETICON = 0x007F, + WM_SETICON = 0x0080, + WM_NCCREATE = 0x0081, + WM_NCDESTROY = 0x0082, + WM_NCCALCSIZE = 0x0083, + WM_NCHITTEST = 0x0084, + WM_NCPAINT = 0x0085, + WM_NCACTIVATE = 0x0086, + WM_GETDLGCODE = 0x0087, + WM_SYNCPAINT = 0x0088, + WM_NCMOUSEMOVE = 0x00A0, + WM_NCLBUTTONDOWN = 0x00A1, + WM_NCLBUTTONUP = 0x00A2, + WM_NCLBUTTONDBLCLK = 0x00A3, + WM_NCRBUTTONDOWN = 0x00A4, + WM_NCRBUTTONUP = 0x00A5, + WM_NCRBUTTONDBLCLK = 0x00A6, + WM_NCMBUTTONDOWN = 0x00A7, + WM_NCMBUTTONUP = 0x00A8, + WM_NCMBUTTONDBLCLK = 0x00A9, + WM_KEYDOWN = 0x0100, + WM_KEYUP = 0x0101, + WM_CHAR = 0x0102, + WM_DEADCHAR = 0x0103, + WM_SYSKEYDOWN = 0x0104, + WM_SYSKEYUP = 0x0105, + WM_SYSCHAR = 0x0106, + WM_SYSDEADCHAR = 0x0107, + WM_KEYLAST = 0x0108, + WM_IME_STARTCOMPOSITION = 0x010D, + WM_IME_ENDCOMPOSITION = 0x010E, + WM_IME_COMPOSITION = 0x010F, + WM_IME_KEYLAST = 0x010F, + WM_INITDIALOG = 0x0110, + WM_COMMAND = 0x0111, + WM_SYSCOMMAND = 0x0112, + WM_TIMER = 0x0113, + WM_HSCROLL = 0x0114, + WM_VSCROLL = 0x0115, + WM_INITMENU = 0x0116, + WM_INITMENUPOPUP = 0x0117, + WM_MENUSELECT = 0x011F, + WM_MENUCHAR = 0x0120, + WM_ENTERIDLE = 0x0121, + WM_MENURBUTTONUP = 0x0122, + WM_MENUDRAG = 0x0123, + WM_MENUGETOBJECT = 0x0124, + WM_UNINITMENUPOPUP = 0x0125, + WM_MENUCOMMAND = 0x0126, + WM_CTLCOLORMSGBOX = 0x0132, + WM_CTLCOLOREDIT = 0x0133, + WM_CTLCOLORLISTBOX = 0x0134, + WM_CTLCOLORBTN = 0x0135, + WM_CTLCOLORDLG = 0x0136, + WM_CTLCOLORSCROLLBAR = 0x0137, + WM_CTLCOLORSTATIC = 0x0138, + WM_MOUSEMOVE = 0x0200, + WM_LBUTTONDOWN = 0x0201, + WM_LBUTTONUP = 0x0202, + WM_LBUTTONDBLCLK = 0x0203, + WM_RBUTTONDOWN = 0x0204, + WM_RBUTTONUP = 0x0205, + WM_RBUTTONDBLCLK = 0x0206, + WM_MBUTTONDOWN = 0x0207, + WM_MBUTTONUP = 0x0208, + WM_MBUTTONDBLCLK = 0x0209, + WM_MOUSEWHEEL = 0x020A, + WM_PARENTNOTIFY = 0x0210, + WM_ENTERMENULOOP = 0x0211, + WM_EXITMENULOOP = 0x0212, + WM_NEXTMENU = 0x0213, + WM_SIZING = 0x0214, + WM_CAPTURECHANGED = 0x0215, + WM_MOVING = 0x0216, + WM_DEVICECHANGE = 0x0219, + WM_MDICREATE = 0x0220, + WM_MDIDESTROY = 0x0221, + WM_MDIACTIVATE = 0x0222, + WM_MDIRESTORE = 0x0223, + WM_MDINEXT = 0x0224, + WM_MDIMAXIMIZE = 0x0225, + WM_MDITILE = 0x0226, + WM_MDICASCADE = 0x0227, + WM_MDIICONARRANGE = 0x0228, + WM_MDIGETACTIVE = 0x0229, + WM_MDISETMENU = 0x0230, + WM_ENTERSIZEMOVE = 0x0231, + WM_EXITSIZEMOVE = 0x0232, + WM_DROPFILES = 0x0233, + WM_MDIREFRESHMENU = 0x0234, + WM_IME_SETCONTEXT = 0x0281, + WM_IME_NOTIFY = 0x0282, + WM_IME_CONTROL = 0x0283, + WM_IME_COMPOSITIONFULL = 0x0284, + WM_IME_SELECT = 0x0285, + WM_IME_CHAR = 0x0286, + WM_IME_REQUEST = 0x0288, + WM_IME_KEYDOWN = 0x0290, + WM_IME_KEYUP = 0x0291, + WM_MOUSEHOVER = 0x02A1, + WM_MOUSELEAVE = 0x02A3, + WM_CUT = 0x0300, + WM_COPY = 0x0301, + WM_PASTE = 0x0302, + WM_CLEAR = 0x0303, + WM_UNDO = 0x0304, + WM_RENDERFORMAT = 0x0305, + WM_RENDERALLFORMATS = 0x0306, + WM_DESTROYCLIPBOARD = 0x0307, + WM_DRAWCLIPBOARD = 0x0308, + WM_PAINTCLIPBOARD = 0x0309, + WM_VSCROLLCLIPBOARD = 0x030A, + WM_SIZECLIPBOARD = 0x030B, + WM_ASKCBFORMATNAME = 0x030C, + WM_CHANGECBCHAIN = 0x030D, + WM_HSCROLLCLIPBOARD = 0x030E, + WM_QUERYNEWPALETTE = 0x030F, + WM_PALETTEISCHANGING = 0x0310, + WM_PALETTECHANGED = 0x0311, + WM_HOTKEY = 0x0312, + WM_PRINT = 0x0317, + WM_PRINTCLIENT = 0x0318, + WM_HANDHELDFIRST = 0x0358, + WM_HANDHELDLAST = 0x035F, + WM_AFXFIRST = 0x0360, + WM_AFXLAST = 0x037F, + WM_PENWINFIRST = 0x0380, + WM_PENWINLAST = 0x038F, + WM_APP = 0x8000, + WM_USER = 0x0400, + WM_REFLECT = WM_USER + 0x1c00, + WM_CHANGEUISTATE = 0x0127, + WM_UPDATEUISTATE = 0x0128, + WM_QUERYUISTATE = 0x0129 + } + } + + #endregion + + #region DLLImports + + [DllImport("ole32.dll")] + public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); + + [DllImport("user32.dll")] + extern public static bool GetWindowRect(IntPtr hWnd, out RECT rect); + + [DllImport("user32.dll")] + extern public static bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); + + [DllImport("User32.dll")] + extern public static bool IsWindow(IntPtr hwnd); + + [DllImport("User32.dll")] + extern public static bool IsWindowVisible(IntPtr hwnd); + + [DllImport("user32.dll")] + extern public static int ShowWindow(IntPtr hwnd, FuncEnum.WindowAction nCmdShow); + + [DllImport("User32.dll")] + extern public static int GetWindowThreadProcessId(IntPtr hWnd, ref int lpdwProcessId); + + [DllImport("User32.dll")] + extern public static int SendMessage(IntPtr hWnd, FuncEnum.WindowMessage Msg, IntPtr wParam, IntPtr lParam); + + #endregion + + #region Functions + + /// + /// Returns the .Net Process Object that owns the passed in hWnd + /// + public static Process GetProcessFromHandle(IntPtr hWnd) + { + int currentPid = 0; + GetWindowThreadProcessId(hWnd, ref currentPid); + + Process process; + process = Process.GetProcessById(currentPid); + return process; + } + + /// + /// Attaches to instance of COM object matching progid + /// and returns an object. Client must cast and know + /// expected type. + /// + public static Object GetCOMObject(string progId) + { + Object app = null; + try + { + app = Marshal.GetActiveObject(progId); + } + catch (SystemException) { /* ignore */ } + return app; + } + + /// + /// Use this to Get A specific type of Object from the ROT + /// + public static List GetRunningObjectsOfType() + { + // Get the table. + var res = new List(); + IBindCtx bc; + + CreateBindCtx(0, out bc); + IRunningObjectTable runningObjectTable; + + bc.GetRunningObjectTable(out runningObjectTable); + IEnumMoniker monikerEnumerator; + runningObjectTable.EnumRunning(out monikerEnumerator); + monikerEnumerator.Reset(); + + // Enumerate and fill our nice dictionary. + IMoniker[] monikers = new IMoniker[1]; + IntPtr numFetched = IntPtr.Zero; + + while (monikerEnumerator.Next(1, monikers, numFetched) == 0) + { + object o; + runningObjectTable.GetObject(monikers[0], out o); + + if (o is T) + { + res.Add((T)o); + } + o = null; + } + return res; + } + + /// + /// Get a windows rectangle in a .NET structure + /// + /// The window handle to look up + /// The rectangle + public static Rectangle GetWindowRect(IntPtr hwnd) + { + RECT rect = new RECT(); + GetWindowRect(hwnd, out rect); + return rect.AsRectangle; + } + + #endregion + } + + +} diff --git a/AddIns/AddIn.Common/CommonTypes.cs b/AddIns/AddIn.Common/CommonTypes.cs new file mode 100644 index 0000000..a7338f9 --- /dev/null +++ b/AddIns/AddIn.Common/CommonTypes.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.AddIn.Common +{ + /// + /// Common Return Value for Addins + /// + public class FuncRetVal + { + public FuncRetValEnum Type { get; set; } + public string Message { get; set; } + } + + /// + /// Useful for Returns where we + /// need more information on failures + /// + public enum FuncRetValEnum + { + Action_Succeeded, + Action_Failed, + NoAction_Needed, + ParameterInvalid, + ArtifactUnavailable, + FunctionallityNotSupported, + ErrorThrown + } +} diff --git a/AddIns/AddIn.Common/CommonValidations.cs b/AddIns/AddIn.Common/CommonValidations.cs new file mode 100644 index 0000000..48ad9e1 --- /dev/null +++ b/AddIns/AddIn.Common/CommonValidations.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +namespace Foo.AddIn.Common +{ + public static class Validate + { + /// + /// Validate ArtifactLocation * We could later do much more work here * + /// + /// + public static bool IsValidArtifactLocation(string strArtifactLocation, ref FuncRetVal retVal) + { + // All URLs should contain that character (Files aren't allowed to contain it) + bool bIsUrl = strArtifactLocation.Contains('/'); + + if (String.IsNullOrEmpty(strArtifactLocation)) + { + retVal.Type = FuncRetValEnum.ParameterInvalid; + return false; + } + else if (!bIsUrl && !File.Exists(strArtifactLocation)) + { + // Check File existence (if it doesn't return false) + return false; + } + else + { + return true; + } + } + + } +} diff --git a/AddIns/AddIn.Common/IAddIn.cs b/AddIns/AddIn.Common/IAddIn.cs new file mode 100644 index 0000000..d11504d --- /dev/null +++ b/AddIns/AddIn.Common/IAddIn.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.AddIn.Common +{ + public interface IAddIn + { + // I + + + } +} diff --git a/AddIns/AddIn.Common/IDynResolve.cs b/AddIns/AddIn.Common/IDynResolve.cs new file mode 100644 index 0000000..b045e82 --- /dev/null +++ b/AddIns/AddIn.Common/IDynResolve.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.AddIn.Common +{ + public interface IDynResolve + { + // I + + + } +} diff --git a/AddIns/AddIn.Common/IWorkspace.cs b/AddIns/AddIn.Common/IWorkspace.cs new file mode 100644 index 0000000..53b75ac --- /dev/null +++ b/AddIns/AddIn.Common/IWorkspace.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.AddIn.Common +{ + public interface IWorkspace + { + // Launchers + FuncRetVal Launch(string strArtifactLocation, int WindowHeight, int WindowWidth, int WindowTop, int WindowLeft); + FuncRetVal Launch(string strArtifactLocation); + + // ShowNHiders + FuncRetVal Show(string strArtifactLocation); + FuncRetVal Hide(string strArtifactLocation); + + // Closers + FuncRetVal QueryClose(string strArtifactLocation); + FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact, out int WindowHeight, out int WindowWidth, out int WindowTop, out int WindowLeft); + FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact); + FuncRetVal Close(string strArtifactLocation); + } +} diff --git a/AddIns/AddIn.Common/Properties/AssemblyInfo.cs b/AddIns/AddIn.Common/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..166cc13 --- /dev/null +++ b/AddIns/AddIn.Common/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("AddIn.Common")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("AddIn.Common")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("39d7351f-149f-4d32-a3ae-d07ec27515af")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AddIns/Addin.Office/Access.cs b/AddIns/Addin.Office/Access.cs new file mode 100644 index 0000000..b0ce159 --- /dev/null +++ b/AddIns/Addin.Office/Access.cs @@ -0,0 +1,324 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.AddIn.Common; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Drawing; + +// Ignore 'Ambiguity' warning message, seems like no way around those +#pragma warning disable 0467 + +namespace Foo.Addin.Office +{ + public class Access_Workspace : IWorkspace + { + public const string Access_ProgId = "Access.Application"; + + public FuncRetVal Launch(string strArtifactLocation, int WindowHeight, int WindowWidth, int WindowTop, int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Access.Application app = new Microsoft.Office.Interop.Access.Application(); + app.Visible = true; + + // Must test the following here: + // - open both .mdb and .adp (access project files with this) + // - how does this behave when db is password protected? + app.OpenCurrentDatabase(strArtifactLocation, true, ""); + + // ToDo: Check if a new process got created? / or if hWnd exists??? + // - Also PERFORM Window Positioning + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Launch(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Access.Application app = new Microsoft.Office.Interop.Access.Application(); + app.Visible = true; + + // Must test the following here: + // - open both .mdb and .adp (access project files with this) + // - how does this behave when db is password protected? + app.OpenCurrentDatabase(strArtifactLocation, true, ""); + + // ToDo: Check if a new process got created? / or if hWnd exists??? + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Show(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningAccessApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Access.Application app in RunningAccessApps) + { + if (app.CurrentProject.FullName.ToLower() == strArtifactLocation.ToLower()) + { + IntPtr hWnd = (IntPtr)app.hWndAccessApp(); + if (!Functions.IsWindowVisible(hWnd)) + { + Functions.ShowWindow(hWnd, Functions.FuncEnum.WindowAction.SW_SHOW); + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Hide(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningAccessApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Access.Application app in RunningAccessApps) + { + if (app.CurrentProject.FullName.ToLower() == strArtifactLocation.ToLower()) + { + IntPtr hWnd = (IntPtr)app.hWndAccessApp(); + if (Functions.IsWindowVisible(hWnd)) + { + Functions.ShowWindow(hWnd, Functions.FuncEnum.WindowAction.SW_HIDE); + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal QueryClose(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningAccessApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Access.Application app in RunningAccessApps) + { + if (app.CurrentProject.FullName.ToLower() == strArtifactLocation.ToLower()) + { + IntPtr hWnd = (IntPtr) app.hWndAccessApp(); + if (Functions.SendMessage(hWnd, Functions.FuncEnum.WindowMessage.WM_QUERYENDSESSION, IntPtr.Zero, IntPtr.Zero) != 0) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + return retVal; + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact, out int WindowHeight, out int WindowWidth, out int WindowTop, out int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + WindowTop = 0; + WindowLeft = 0; + WindowWidth = 0; + WindowHeight = 0; + + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningAccessApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Access.Application app in RunningAccessApps) + { + if (app.CurrentProject.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Get Handle and Process + IntPtr hWnd = (IntPtr)app.hWndAccessApp(); + Process process = Functions.GetProcessFromHandle((IntPtr)hWnd); + + // Get the Window properties + Rectangle rect = Functions.GetWindowRect(hWnd); + WindowHeight = rect.Height; + WindowWidth = rect.Width; + WindowLeft = rect.Left; + WindowTop = rect.Top; + + // Close the database + //app.CloseCurrentDatabase(); + if (bAutoSaveArtifact) + app.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll); + else + app.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveNone); + Marshal.FinalReleaseComObject(app); // force clean-up + + // Kill the process + process.Kill(); + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningAccessApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Access.Application app in RunningAccessApps) + { + if (app.CurrentProject.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Get Handle and Process + IntPtr hWnd = (IntPtr)app.hWndAccessApp(); + Process process = Functions.GetProcessFromHandle((IntPtr)hWnd); + + // Close the database + //app.CloseCurrentDatabase(); + if(bAutoSaveArtifact) + app.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll); + else + app.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveNone); + Marshal.FinalReleaseComObject(app); // force clean-up + + // Kill the process + process.Kill(); + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningAccessApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Access.Application app in RunningAccessApps) + { + if (app.CurrentProject.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Get Handle and Process + IntPtr hWnd = (IntPtr)app.hWndAccessApp(); + Process process = Functions.GetProcessFromHandle((IntPtr)hWnd); + + // Close the database + //app.CloseCurrentDatabase(); + app.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll); + Marshal.FinalReleaseComObject(app); // force clean-up + + // Kill the process + process.Kill(); + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + } +} diff --git a/AddIns/Addin.Office/AddIn.cs b/AddIns/Addin.Office/AddIn.cs new file mode 100644 index 0000000..7f834bd --- /dev/null +++ b/AddIns/Addin.Office/AddIn.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.AddIn.Common; + +namespace Foo.Addin.Office +{ + public class AddIn : IAddIn + { + + } +} diff --git a/AddIns/Addin.Office/Addin.Office.csproj b/AddIns/Addin.Office/Addin.Office.csproj new file mode 100644 index 0000000..83e97bc --- /dev/null +++ b/AddIns/Addin.Office/Addin.Office.csproj @@ -0,0 +1,106 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {0CA1DD2E-2752-4587-ADB4-77194411648B} + Library + Properties + Foo.Addin.Office + Foo.Addin.Office + v3.5 + 512 + + + true + full + false + ..\..\Target\Debug\AddIns\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\Target\Release\AddIns\ + TRACE + prompt + 4 + + + + False + False + + + False + False + + + False + False + + + False + False + + + False + False + + + False + False + + + + 3.5 + + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + + {D32C4454-9334-47AA-9A3F-456B8B12220A} + AddIn.Common + + + + + {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52} + 2 + 3 + 0 + primary + False + + + + + \ No newline at end of file diff --git a/AddIns/Addin.Office/Excel.cs b/AddIns/Addin.Office/Excel.cs new file mode 100644 index 0000000..5d003e3 --- /dev/null +++ b/AddIns/Addin.Office/Excel.cs @@ -0,0 +1,383 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; +using System.Diagnostics; +using System.Reflection; + +using Foo.AddIn.Common; +using System.Drawing; + +// Ignore 'Ambiguity' warning message, seems like no way around those +#pragma warning disable 0467 + +namespace Foo.Addin.Office +{ + public class Excel_Workspace : IWorkspace + { + public const string Excel_ProgId = "Excel.Application"; + + public FuncRetVal Launch(string strArtifactLocation, int WindowHeight, int WindowWidth, int WindowTop, int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Excel.Application app = null; + app = new Microsoft.Office.Interop.Excel.Application(); + + // Mark the Application as visible + app.Visible = true; + + // Position the Window + IntPtr hWnd = (IntPtr)app.Hwnd; + Functions.SetWindowPos(hWnd, IntPtr.Zero, WindowLeft, WindowTop, WindowHeight, WindowWidth, 0); + + // Open/Load the Document + Microsoft.Office.Interop.Excel.Workbook workbook = app.Workbooks.Open(strArtifactLocation, Missing.Value, Missing.Value, Missing.Value, Missing.Value, + Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, + Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); + if (workbook != null) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + } + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Launch(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Excel.Application app = null; + app = new Microsoft.Office.Interop.Excel.Application(); + + // Mark the Application as visible + app.Visible = true; + + Microsoft.Office.Interop.Excel.Workbook workbook = app.Workbooks.Open(strArtifactLocation, Missing.Value, Missing.Value, Missing.Value, Missing.Value, + Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, + Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); + if (workbook != null) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + } + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Show(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningExcelWorkbooks = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = book.Application; + bool bIsTheOnlyDocumentInApp = (app.Workbooks.Count == 1); + + // If For some reason the App is visible + if (app.Visible) + { + // Make Sure that this Workbook is activated + if (!bIsTheOnlyDocumentInApp) + { + book.Activate(); + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + } + return retVal; + } + + app.Visible = true; + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Hide(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningExcelWorkbooks = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = book.Application; + bool bIsTheOnlyDocumentInApp = (app.Workbooks.Count == 1); + + if (!app.Visible) + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + + // If this is NOT the Only open workbook in this App + // ~Activate the other workbook + if (!bIsTheOnlyDocumentInApp) + { + foreach (Microsoft.Office.Interop.Excel.Workbook book2 in app.Workbooks) + { + if (book2.FullName.ToLower() != strArtifactLocation.ToLower()) + { + book2.Activate(); + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + } + else + { + app.Visible = false; + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal QueryClose(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningExcelWorkbooks = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (book.Saved) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + return retVal; + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact, out int WindowHeight, out int WindowWidth, out int WindowTop, out int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + WindowTop = 0; + WindowLeft = 0; + WindowWidth = 0; + WindowHeight = 0; + + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningExcelWorkbooks = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // In case there is a running rogue excel process left open, + // we can always force it to close by closing the process + // int hWnd = app.Hwnd; + // Process process = Win32Functions.GetProcessFromHandle((IntPtr) hWnd); + var app = book.Application; + + // Get the Window properties + IntPtr hWnd = (IntPtr)app.Hwnd; + Rectangle rect = Functions.GetWindowRect(hWnd); + WindowHeight = rect.Height; + WindowWidth = rect.Width; + WindowLeft = rect.Left; + WindowTop = rect.Top; + + // Close the Workbook + book.Close(bAutoSaveArtifact, strArtifactLocation, false); + Marshal.FinalReleaseComObject(book); // force clean-up + + // Close Excel if this is the last Workbook + if (app.Workbooks.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up, should clean up excel process + //process.Close(); + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningExcelWorkbooks = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // In case there is a running rogue excel process left open, + // we can always force it to close by closing the process + // int hWnd = app.Hwnd; + // Process process = Win32Functions.GetProcessFromHandle((IntPtr) hWnd); + var app = book.Application; + + // Close the Workbook + book.Close(bAutoSaveArtifact, strArtifactLocation, false); + Marshal.FinalReleaseComObject(book); // force clean-up + + // Close Excel if this is the last Workbook + if (app.Workbooks.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up, should clean up excel process + //process.Close(); + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningExcelWorkbooks = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // In case there is a running rogue excel process left open, + // we can always force it to close by closing the process + // int hWnd = app.Hwnd; + // Process process = Win32Functions.GetProcessFromHandle((IntPtr) hWnd); + var app = book.Application; + + // Close the Workbook + book.Close(true, strArtifactLocation, false); + Marshal.FinalReleaseComObject(book); // force clean-up + + // Close Excel if this is the last Workbook + if (app.Workbooks.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up, should clean up excel process + //process.Close(); + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + } +} diff --git a/AddIns/Addin.Office/PowerPoint.cs b/AddIns/Addin.Office/PowerPoint.cs new file mode 100644 index 0000000..6cd41af --- /dev/null +++ b/AddIns/Addin.Office/PowerPoint.cs @@ -0,0 +1,379 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.AddIn.Common; +using System.Runtime.InteropServices; + +// Ignore 'Ambiguity' warning message, seems like no way around those +#pragma warning disable 0467 + +namespace Foo.Addin.Office +{ + public class PowerPoint_Workspace : IWorkspace + { + public const string PowerPoint_ProgId = "PowerPoint.Application"; + + public FuncRetVal Launch(string strArtifactLocation, int WindowHeight, int WindowWidth, int WindowTop, int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.PowerPoint.Application app = null; + app = Functions.GetCOMObject(PowerPoint_ProgId) as Microsoft.Office.Interop.PowerPoint.Application; + + // If no existing PowerPoint App is open, open a new one + if (app == null) + { + app = new Microsoft.Office.Interop.PowerPoint.Application(); + app.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; + } + + // If there is an existing presentation, don't position the window + bool bThereIsAnExistingPresentation = (app.Presentations.Count > 0); + + // Open the PowerPoint Presentation + Microsoft.Office.Interop.PowerPoint.Presentation presentation = null; + presentation = app.Presentations.Open(strArtifactLocation, Microsoft.Office.Core.MsoTriState.msoFalse, + Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue); + + if (presentation != null) + { + // Position the Window + if (!bThereIsAnExistingPresentation) + { + IntPtr hWnd = (IntPtr) app.HWND; + Functions.SetWindowPos(hWnd, IntPtr.Zero, WindowLeft, WindowTop, WindowHeight, WindowWidth, 0); + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + } + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Launch(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.PowerPoint.Application app = null; + app = Functions.GetCOMObject(PowerPoint_ProgId) as Microsoft.Office.Interop.PowerPoint.Application; + + // If no existing PowerPoint App is open, open a new one + if (app == null) + { + app = new Microsoft.Office.Interop.PowerPoint.Application(); + app.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; + } + + // Open the PowerPoint Presentation + Microsoft.Office.Interop.PowerPoint.Presentation presentation = null; + presentation = app.Presentations.Open(strArtifactLocation, Microsoft.Office.Core.MsoTriState.msoFalse, + Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue); + + if (presentation != null) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + } + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Show(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPowerPoints = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + switch (presentation.Application.Visible) + { + case Microsoft.Office.Core.MsoTriState.msoTrue: + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + + case Microsoft.Office.Core.MsoTriState.msoFalse: + { + presentation.Application.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; + + //Functions.ShowWindow((IntPtr)presentation.Application.HWND, (int)Functions.WindowAction.SW_SHOW); + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Hide(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPowerPoints = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + switch (presentation.Application.Visible) + { + case Microsoft.Office.Core.MsoTriState.msoTrue: + { + presentation.Application.Visible = Microsoft.Office.Core.MsoTriState.msoFalse; + + //Functions.ShowWindow((IntPtr)presentation.Application.HWND, (int)Functions.WindowAction.SW_HIDE); + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + + case Microsoft.Office.Core.MsoTriState.msoFalse: + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal QueryClose(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPowerPoints = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + switch (presentation.Saved) + { + case Microsoft.Office.Core.MsoTriState.msoTrue: + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + + case Microsoft.Office.Core.MsoTriState.msoFalse: + { + retVal.Type = FuncRetValEnum.Action_Failed; + return retVal; + } + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact, out int WindowHeight, out int WindowWidth, out int WindowTop, out int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + WindowTop = 0; + WindowLeft = 0; + WindowWidth = 0; + WindowHeight = 0; + + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPowerPoints = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = presentation.Application; + + // Save this Presentation + if (bAutoSaveArtifact) + presentation.Save(); + + // Pass out the Window Information + WindowTop = (int) presentation.Application.Top; + WindowLeft = (int) presentation.Application.Left; + WindowHeight = (int) presentation.Application.Height; + WindowWidth = (int)presentation.Application.Width; + + // Close this Presentation + presentation.Close(); + + Marshal.FinalReleaseComObject(presentation); // force clean-up + + // Close PowerPoint if there are no more Presentations + if (app.Presentations.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up, kill application for sure + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPowerPoints = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = presentation.Application; + + // Save this Presentation + if(bAutoSaveArtifact) + presentation.Save(); + + // Close this Presentation + presentation.Close(); + + Marshal.FinalReleaseComObject(presentation); // force clean-up + + // Close PowerPoint if there are no more Presentations + if (app.Presentations.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up, kill application for sure + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPowerPoints = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = presentation.Application; + + // Save this Presentation + presentation.Save(); + + // Close this Presentation + presentation.Close(); + + Marshal.FinalReleaseComObject(presentation); // force clean-up + + // Close PowerPoint if there are no more Presentations + if (app.Presentations.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up, kill application for sure + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + } +} diff --git a/AddIns/Addin.Office/Properties/AssemblyInfo.cs b/AddIns/Addin.Office/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..7a95a77 --- /dev/null +++ b/AddIns/Addin.Office/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Addin.Office")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Addin.Office")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("79a22796-d344-456e-90a3-9e28c0f31d31")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/AddIns/Addin.Office/Publisher.cs b/AddIns/Addin.Office/Publisher.cs new file mode 100644 index 0000000..ed0abbc --- /dev/null +++ b/AddIns/Addin.Office/Publisher.cs @@ -0,0 +1,361 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.AddIn.Common; +using System.Diagnostics; + +// Ignore 'Ambiguity' warning message, seems like no way around those +#pragma warning disable 0467 + +namespace Foo.Addin.Office +{ + public class Publisher_Workspace : IWorkspace + { + public const string Publisher_ProgId = "Publisher.Application"; + + public FuncRetVal Launch(string strArtifactLocation, int WindowHeight, int WindowWidth, int WindowTop, int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Publisher.Application app = new Microsoft.Office.Interop.Publisher.Application(); + + // Opens Publisher + Microsoft.Office.Interop.Publisher.Document doc = null; + doc = app.Open(strArtifactLocation, false, false, Microsoft.Office.Interop.Publisher.PbSaveOptions.pbSaveChanges); + + // Position the Window + IntPtr hWnd = (IntPtr)doc.ActiveWindow.Hwnd; + Functions.SetWindowPos(hWnd, IntPtr.Zero, WindowLeft, WindowTop, WindowHeight, WindowWidth, 0); + + if (doc != null) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + } + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Launch(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Publisher.Application app = new Microsoft.Office.Interop.Publisher.Application(); + + // Opens Publisher + Microsoft.Office.Interop.Publisher.Document doc = null; + doc = app.Open(strArtifactLocation, false, false, Microsoft.Office.Interop.Publisher.PbSaveOptions.pbSaveChanges); + + if (doc != null) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + } + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Show(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPublisherApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + + if (pubDoc.ActiveWindow.Visible) + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + else + { + pubDoc.ActiveWindow.Visible = true; + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Hide(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPublisherApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + + if (!pubDoc.ActiveWindow.Visible) + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + else + { + pubDoc.ActiveWindow.Visible = false; + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal QueryClose(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPublisherApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (pubDoc.Saved) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact, out int WindowHeight, out int WindowWidth, out int WindowTop, out int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + WindowTop = 0; + WindowLeft = 0; + WindowWidth = 0; + WindowHeight = 0; + + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPublisherApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Save the Document + if (bAutoSaveArtifact) + pubDoc.Save(); + + // Get the Window properties + WindowTop = pubDoc.ActiveWindow.Top; + WindowLeft = pubDoc.ActiveWindow.Left; + WindowWidth = pubDoc.ActiveWindow.Width; + WindowHeight = pubDoc.ActiveWindow.Height; + + // Get the Handle + IntPtr hWnd = (IntPtr)pubDoc.ActiveWindow.Hwnd; + Process process = Functions.GetProcessFromHandle(hWnd); + + // Send Close Message + if (Functions.SendMessage((IntPtr)hWnd, Functions.FuncEnum.WindowMessage.WM_CLOSE, IntPtr.Zero, IntPtr.Zero) == 0) + { + process.Kill(); + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + return retVal; + } + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPublisherApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Save the Document + if(bAutoSaveArtifact) + pubDoc.Save(); + + // Get the Handle + IntPtr hWnd = (IntPtr)pubDoc.ActiveWindow.Hwnd; + Process process = Functions.GetProcessFromHandle(hWnd); + + // Send Close Message + if (Functions.SendMessage((IntPtr)hWnd, Functions.FuncEnum.WindowMessage.WM_CLOSE, IntPtr.Zero, IntPtr.Zero) == 0) + { + process.Kill(); + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + return retVal; + } + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningPublisherApps = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Save the Document + pubDoc.Save(); + + // Get the Handle + IntPtr hWnd = (IntPtr)pubDoc.ActiveWindow.Hwnd; + Process process = Functions.GetProcessFromHandle(hWnd); + + // Send Close Message + if (Functions.SendMessage((IntPtr)hWnd, Functions.FuncEnum.WindowMessage.WM_CLOSE, IntPtr.Zero, IntPtr.Zero) == 0) + { + process.Kill(); + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + return retVal; + } + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + } +} diff --git a/AddIns/Addin.Office/Visio.cs b/AddIns/Addin.Office/Visio.cs new file mode 100644 index 0000000..1275022 --- /dev/null +++ b/AddIns/Addin.Office/Visio.cs @@ -0,0 +1,320 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.AddIn.Common; +using System.Runtime.InteropServices; + +// Ignore 'Ambiguity' warning message, seems like no way around those +#pragma warning disable 0467 + +namespace Foo.Addin.Office +{ + public class Visio_Workspace : IWorkspace + { + public const string Visio_ProgId = "Visio.Application"; + + public FuncRetVal Launch(string strArtifactLocation, int WindowHeight, int WindowWidth, int WindowTop, int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Visio.Application app = null; + app = new Microsoft.Office.Interop.Visio.Application(); + + // Mark the Application as visible + app.Visible = true; + + app.Documents.Open(strArtifactLocation); + + // ToDo: Check if a new process got created? / or if hWnd exists??? + // - Also PERFORM Window Positioning + app.ActiveWindow.SetWindowRect(WindowLeft, WindowTop, WindowWidth, WindowHeight); + + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Launch(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + + Microsoft.Office.Interop.Visio.Application app = null; + app = new Microsoft.Office.Interop.Visio.Application(); + + // Mark the Application as visible + app.Visible = true; + + app.Documents.Open(strArtifactLocation); + + // Keep Track of all our Excel Instances -- not needed in visio? + ///WorkspaceState.Launched_ExcelInstances.Add(app); + + retVal.Type = FuncRetValEnum.Action_Succeeded; + + //if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + //{ + // Process.Start(strArtifactLocation); + //} + //return FuncDepBoolType.ParametersInvalid; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Show(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningVisioDocs = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // TO DO - (doc.Application.Documents.Count == 1); not working, why?!?!? odd + bool bIsTrue = (doc.Application.Documents.Count == 1); // not working, why?!?!? odd + //bool bIsTheOnlyDocumentInApp = true; + + if (!doc.Application.Visible) // && bIsTheOnlyDocumentInApp) + { + doc.Application.Visible = true; + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Hide(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningVisioDocs = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // TO DO - (doc.Application.Documents.Count == 1); not working, why?!?!? odd + bool bIsTrue = (doc.Application.Documents.Count == 1); // not working, why?!?!? odd + //bool bIsTheOnlyDocumentInApp = true; + + if (doc.Application.Visible) // && bIsTheOnlyDocumentInApp) + { + doc.Application.Visible = false; + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal QueryClose(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningVisioDocs = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (doc.Saved) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + return retVal; + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact, out int WindowHeight, out int WindowWidth, out int WindowTop, out int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + WindowTop = 0; + WindowLeft = 0; + WindowWidth = 0; + WindowHeight = 0; + + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningVisioDocs = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (bAutoSaveArtifact) + doc.Save(); + + var app = doc.Application; + + // Get the Window properties + app.ActiveWindow.GetWindowRect(out WindowLeft, out WindowTop, out WindowWidth, out WindowHeight); + + doc.Close(); + Marshal.FinalReleaseComObject(doc); // Force Clean-up + + if (app.Documents.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningVisioDocs = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if(bAutoSaveArtifact) + doc.Save(); + + var app = doc.Application; + + doc.Close(); + Marshal.FinalReleaseComObject(doc); // Force Clean-up + + if (app.Documents.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningVisioDocs = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + doc.Save(); + + var app = doc.Application; + + doc.Close(); + Marshal.FinalReleaseComObject(doc); // Force Clean-up + + if (app.Documents.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + } +} diff --git a/AddIns/Addin.Office/Word.cs b/AddIns/Addin.Office/Word.cs new file mode 100644 index 0000000..b5ab8de --- /dev/null +++ b/AddIns/Addin.Office/Word.cs @@ -0,0 +1,424 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.AddIn.Common; +using System.Runtime.InteropServices; +using System.Reflection; + +// Ignore 'Ambiguity' warning message, seems like no way around those +#pragma warning disable 0467 + +namespace Foo.Addin.Office +{ + public class Word_Workspace : IWorkspace + { + public const string Word_ProgId = "Word.Application"; + + public FuncRetVal Launch(string strArtifactLocation, int WindowHeight, int WindowWidth, int WindowTop, int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Word.Application app = null; + app = Functions.GetCOMObject(Word_ProgId) as Microsoft.Office.Interop.Word.Application; + + // If no existing Word App is open, open a new one + if (app == null) + { + app = new Microsoft.Office.Interop.Word.Application(); + app.Visible = true; + } + + object fileName = strArtifactLocation; + object missing = Missing.Value; + Microsoft.Office.Interop.Word.Document doc = null; + doc = app.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, + ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); + + if (doc != null) + { + // Find the correct Window and position it + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + { + window.Top = WindowTop; + window.Left = WindowLeft; + window.Height = WindowHeight; + window.Width = WindowWidth; + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + } + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Launch(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + Microsoft.Office.Interop.Word.Application app = null; + app = Functions.GetCOMObject(Word_ProgId) as Microsoft.Office.Interop.Word.Application; + + // If no existing Word App is open, open a new one + if (app == null) + { + app = new Microsoft.Office.Interop.Word.Application(); + app.Visible = true; + } + + object fileName = strArtifactLocation; + object missing = Missing.Value; + Microsoft.Office.Interop.Word.Document doc = null; + doc = app.Documents.Open(ref fileName, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, + ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing, ref missing); + + if (doc != null) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + } + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Show(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningWordDocuments = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (!window.Visible) + { + window.Visible = true; + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Hide(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningWordDocuments = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (window.Visible) + { + window.Visible = false; + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.NoAction_Needed; + return retVal; + } + } + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal QueryClose(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningWordDocuments = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (doc.Saved) + { + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + else + { + retVal.Type = FuncRetValEnum.Action_Failed; + return retVal; + } + } + } + + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact, out int WindowHeight, out int WindowWidth, out int WindowTop, out int WindowLeft) + { + FuncRetVal retVal = new FuncRetVal(); + WindowTop = 0; + WindowLeft = 0; + WindowWidth = 0; + WindowHeight = 0; + + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningWordDocuments = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Found the document to close * Close it Without Prompting * + object saveOption = null; + if (bAutoSaveArtifact) + saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges; + else + saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges; + + object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat; + object routeDocument = false; + var app = doc.Application; + + // Let's get the Window that belongs to this document + Microsoft.Office.Interop.Word.Window docWindow = null; + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + docWindow = window; + } + + // Get the Window properties + WindowTop = docWindow.Top; + WindowLeft = docWindow.Left; + WindowWidth = docWindow.Width; + WindowHeight = docWindow.Height; + + //Object missing = Missing.Value; + doc.Close(ref saveOption, ref originalFormat, ref routeDocument); + Marshal.FinalReleaseComObject(doc); // force clean-up + + // Close the Window + if (docWindow != null) + docWindow.Close(ref saveOption, ref routeDocument); + + // Close Word if this is the Last Document Instance + if (app.Documents.Count == 0) + { + app.Quit(ref saveOption, ref originalFormat, ref routeDocument); + + Marshal.FinalReleaseComObject(docWindow); + Marshal.FinalReleaseComObject(app); // force clean-up, closes Process for sure + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation, bool bAutoSaveArtifact) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningWordDocuments = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Found the document to close * Close it Without Prompting * + object saveOption = null; + if (bAutoSaveArtifact) + saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges; + else + saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdDoNotSaveChanges; + + object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat; + object routeDocument = false; + var app = doc.Application; + + // Let's get the Window that belongs to this document + Microsoft.Office.Interop.Word.Window docWindow = null; + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + docWindow = window; + } + + //Object missing = Missing.Value; + doc.Close(ref saveOption, ref originalFormat, ref routeDocument); + Marshal.FinalReleaseComObject(doc); // force clean-up + + // Close the Window + if (docWindow != null) + docWindow.Close(ref saveOption, ref routeDocument); + + // Close Word if this is the Last Document Instance + if (app.Documents.Count == 0) + { + app.Quit(ref saveOption, ref originalFormat, ref routeDocument); + + Marshal.FinalReleaseComObject(docWindow); + Marshal.FinalReleaseComObject(app); // force clean-up, closes Process for sure + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + public FuncRetVal Close(string strArtifactLocation) + { + FuncRetVal retVal = new FuncRetVal(); + if (!Validate.IsValidArtifactLocation(strArtifactLocation, ref retVal)) + return retVal; + + try + { + var RunningWordDocuments = Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Found the document to close * Close it Without Prompting * + object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges; + object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat; + object routeDocument = false; + var app = doc.Application; + + // Let's get the Window that belongs to this document + Microsoft.Office.Interop.Word.Window docWindow = null; + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + docWindow = window; + } + + //Object missing = Missing.Value; + doc.Close(ref saveOption, ref originalFormat, ref routeDocument); + Marshal.FinalReleaseComObject(doc); // force clean-up + + // Close the Window + if (docWindow != null) + docWindow.Close(ref saveOption, ref routeDocument); + + // Close Word if this is the Last Document Instance + if (app.Documents.Count == 0) + { + app.Quit(ref saveOption, ref originalFormat, ref routeDocument); + + Marshal.FinalReleaseComObject(docWindow); + Marshal.FinalReleaseComObject(app); // force clean-up, closes Process for sure + } + + retVal.Type = FuncRetValEnum.Action_Succeeded; + return retVal; + } + } + retVal.Type = FuncRetValEnum.ArtifactUnavailable; + } + catch (Exception e) + { + retVal.Message = e.Message; + retVal.Type = FuncRetValEnum.ErrorThrown; + } + return retVal; + } + + } +} diff --git a/Client Services/ButtonWPForm/ButtonForm.xaml b/Client Services/ButtonWPForm/ButtonForm.xaml new file mode 100644 index 0000000..0ea6367 --- /dev/null +++ b/Client Services/ButtonWPForm/ButtonForm.xaml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + diff --git a/Client Services/ButtonWPForm/ButtonForm.xaml.cs b/Client Services/ButtonWPForm/ButtonForm.xaml.cs new file mode 100644 index 0000000..024ec88 --- /dev/null +++ b/Client Services/ButtonWPForm/ButtonForm.xaml.cs @@ -0,0 +1,211 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Runtime.InteropServices; +using System.Drawing; +using System.Reflection; +using SnapshotImage = System.Drawing.Image; + +// Ooganizer namespaces +using Foo.ClientServices.ButtonWPForm.ButtonFormPages; +using Foo.Platform; +using Foo.Platform.Win32; +using Foo.Platform.ErrorReporting; +using Foo.Platform.Interacters; +using System.Windows.Interop; + +namespace Foo.ClientServices.ButtonWPForm +{ + /// + /// Interaction logic for ButtonWindow Form + /// + [ComVisible(false)] + public partial class ButtonForm : Window + { + //// + // Public Properties + //// + public IntPtr HookedWindow { get { return _hHookedWnd; } set { _hHookedWnd = value; } } // Passed in by FormMgr + public System.Drawing.Image SnapShot { get { return _SnapShot; } set { _SnapShot = value; } } // Passed in by FormMgr + //public Artifact Artifact { get { return _Artifact; } } + //public string ArtifactTitle { get { return _ArtifactTitle; } } + //public string ArtifactLocation { get { return _ArtifactLocation; } } + //public string CurrentWorkspaceName { get { return _CurrentWorkspaceName; } } + + //// + // Private Member Variables + //// + private IntPtr _hHookedWnd = IntPtr.Zero; + private System.Drawing.Image _SnapShot = null; + private bool _PerformanceCache = false; + private static ButtonForm s_PerfCacheButtonFormObj = null; + private bool _PerfCacheLoadedHidden = false; + //private Artifact _Artifact; + //private string _ArtifactTitle; + //private string _ArtifactLocation; + //private string _CurrentWorkspaceName; + + //// + // ButtonFormPages + //// + IButtonFormPage[] m_ButtonFormPages = new IButtonFormPage[1]; + + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// Construct WPF ButtonForm :) + /// + public ButtonForm() + { + InitializeComponent(); + } + + /// + /// Construct WPF ButtonForm (Performance Cache) + /// + public ButtonForm(bool bPerformanceCache) + { + if (bPerformanceCache && (s_PerfCacheButtonFormObj == null)) + { + _PerformanceCache = bPerformanceCache; + s_PerfCacheButtonFormObj = this; + } + + InitializeComponent(); + } + + /// + /// As part of Performance Caching (load one instance of this form + /// hidden and not visible to the user (called by FormMgr) ~also + /// allows to hide and existing one + /// ~Should only be called by FormMgr when creating the first object + /// + public void LoadHideButtonFormPerfCache() + { + if (!_PerfCacheLoadedHidden && _PerformanceCache && (s_PerfCacheButtonFormObj != null)) + { + s_PerfCacheButtonFormObj.Opacity = 0; + s_PerfCacheButtonFormObj.WindowState = WindowState.Minimized; + s_PerfCacheButtonFormObj.ShowInTaskbar = false; + s_PerfCacheButtonFormObj.Show(); + s_PerfCacheButtonFormObj.Hide(); + _PerfCacheLoadedHidden = true; + } + } + + /// + /// Window Load Event. We want all object loading to happen in the Load Event, + /// because we construct the WPFForm and show it right away, so this is called right at + /// start up, so put all the object loading in here to be cleaner and simplify FormObject Creator + /// + private void OnLoad(object sender, RoutedEventArgs args) + { + try + { + if (_PerformanceCache && (this == s_PerfCacheButtonFormObj)) // Preload child pages + { + PreloadAllChildPages(); + + // Add Message Hook for performance WPForm * To make sure it is always invisible * + HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); + source.AddHook(new HwndSourceHook(MessageHook)); + } + else if (!_PerformanceCache && (HookedWindow != IntPtr.Zero) && (this != s_PerfCacheButtonFormObj)) + { + //// + // Resolve the Window and set the properties accordingly, + // our child pages depend on this information + //// + //ResolverDispatch resolver = new ResolverDispatch(); + //ArtifactGroup artifacts = resolver.GetArtifacts(HookedWindow); + + //if (artifacts.Length > 0) + //{ + // _Artifact = artifacts.GetPrimary; + // _ArtifactTitle = _Artifact.Name; + // _ArtifactLocation = _Artifact.Location; + + // // Workspace + // _CurrentWorkspaceName = SrvrCommon.GetCurrentWorkspaceName(); + + // // Now Load the Page + // LoadPageAccordingToState(); + //} + //else + //{ + // // Somemething went wrong Resolving + // UserError.Show("Document not Found", "Failed to accurately find the document for the Window"); + // Close(); //~imp, we must close this Form + //} + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - A fatal error occured loading ButtonForm", MethodBase.GetCurrentMethod().Name), e); + Close(); //~imp, we must close this Form + } + } + + /// + /// This Message Hook is for the Hidden WPForm that we use for better performance, + /// We want to make sure that it is never displayed *It can occur that explore can show it, without this* + /// + private IntPtr MessageHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + // force opacity at all times + if (Opacity == 1.0) + Opacity = 0.0; + + // force minimized at all times + if (WindowState != WindowState.Minimized) + WindowState = WindowState.Minimized; + + // force Not to be seen in taskbar + if (ShowInTaskbar == true) + ShowInTaskbar = false; + + return System.IntPtr.Zero; + } + + /// + /// For Performance, we need to preload all Child Pages + /// + private void PreloadAllChildPages() + { + m_ButtonFormPages[0] = (IButtonFormPage) new Page_AddEdit(); + m_ButtonFormPages[0].ParentWPFContainer = this; + } + + /// + /// Show different pages depending on the state we are in. (Currently only 1 state) + /// + private void LoadPageAccordingToState() + { + m_ButtonFormPages[0] = (IButtonFormPage) new Page_AddEdit(); + m_ButtonFormPages[0].ParentWPFContainer = this; + + if (!frmButtonForm.Navigate((Page) m_ButtonFormPages[0])) + Log.Info(string.Format("{0}() - ButtonForm could not navigate to Page_AddEdit", MethodBase.GetCurrentMethod().Name)); + } + + /// + /// When this window closes position the Hooked Window back to it's original position + /// + private void Window_Closed(object sender, EventArgs e) + { + // GUICommon.PositionWindowBackToWhereItWas(HookedWindow, true); + BHInteracter.SetAsActiveWindow(HookedWindow); + } + } +} diff --git a/Client Services/ButtonWPForm/ButtonFormMgr.cs b/Client Services/ButtonWPForm/ButtonFormMgr.cs new file mode 100644 index 0000000..ee6ae40 --- /dev/null +++ b/Client Services/ButtonWPForm/ButtonFormMgr.cs @@ -0,0 +1,324 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Drawing; +using System.Threading; +using System.Windows.Interop; +using System.EnterpriseServices; +using System.Windows; +using System.IO; +using System.Windows.Threading; +using System.Collections; +using System.Reflection; + +// Ooganizer Namespaces +using Foo.Platform; +using Foo.Platform.Win32; + +namespace Foo.ClientServices.ButtonWPForm +{ + /// + /// This class manages the creation/deletion and actions of (1 - n) ButtonForms + /// + [ComVisible(false)] + internal class ButtonFormMgr + { + private const int INITIAL_OBJECT_CAPACITY = 30; + private Hashtable m_ObjectList = null; + private Dispatcher m_Dispatcher = null; + + // we have one btnForm loaded (hidden) always, as a performance cache + private ButtonForm m_btnForm = null; + private bool m_IsBtnFormCached = false; + + // Imp! - allows external caller to run any action on a ButtonForm + public delegate void _Action(ButtonForm btnForm); + + //custom private delegates + private delegate void delegate_Create(int hParentWND, Image snapshot); + private delegate void delegate_Delete(int hParentWND); + private delegate int delegate_CreateWindow(int hParentWND); + private delegate void delegate_Action(int hParentWND, _Action action); + + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + public ButtonFormMgr(Dispatcher disp) + { + m_ObjectList = new Hashtable(); + m_Dispatcher = disp; + + if (!m_IsBtnFormCached) + BetterPerformance(); + } + + /// + /// Calls Create_ButtonForm via Dispatcher if neccessary + /// + /// handle to Parent/Owner Window + public void Create_ButtonFormDISP(int hParentWND, Image snapshot) + { + if (hParentWND != 0) + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + Create_ButtonForm(hParentWND, snapshot); + } + else + { + object[] parameters = new object[] { hParentWND, snapshot }; + m_Dispatcher.Invoke((delegate_Create)Create_ButtonFormDISP, System.Windows.Threading.DispatcherPriority.Normal, parameters); + } + } + } + + /// + /// Calls Create_ButtonFormWindow via Dispatcher if neccessary + /// + /// handle to Parent/Owner Window + public int Create_ButtonFormWindowDISP(int hParentWND) + { + if (hParentWND != 0) + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + return Create_ButtonFormWindow(hParentWND); + } + else + { + object[] parameters = new object[] { hParentWND }; + return (int)m_Dispatcher.Invoke((delegate_CreateWindow)Create_ButtonFormWindowDISP, System.Windows.Threading.DispatcherPriority.Normal, parameters); + } + } + return 0; + } + + /// + /// Calls Delete_ButtonForm via Dispatcher if neccessary + /// + /// handle to Parent/Owner Window + public void Delete_ButtonFormDISP(int hParentWND) + { + if (hParentWND != 0) + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + Delete_ButtonForm(hParentWND); + } + else + { + object[] parameters = new object[] { hParentWND }; + m_Dispatcher.Invoke((delegate_Delete)Delete_ButtonFormDISP, System.Windows.Threading.DispatcherPriority.Normal, parameters); + } + } + } + + /// + /// Use this Dispatching Action Function to run any _Action on the ButtonForm + /// + /// handle to Parent/Owner Window + public void RunAction_ButtonFormDISP(int hParentWND, _Action action) + { + if (hParentWND != 0) + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + RunAction_ButtonForm(hParentWND, action); + } + else + { + object[] parameters = new object[] { hParentWND, action }; + m_Dispatcher.Invoke((delegate_Action)RunAction_ButtonFormDISP, System.Windows.Threading.DispatcherPriority.Normal, parameters); + } + } + } + + /// + /// Calls Terminate via Dispatcher if neccessary + /// + /// handle to Parent/Owner Window + public void TerminateDISP() + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + Terminate(); + } + else + { + m_Dispatcher.Invoke((Action)TerminateDISP, System.Windows.Threading.DispatcherPriority.Normal, null); + } + } + + /// + /// Creates a new ButtonForm object into the ObjectList + /// + /// handle to Parent/Owner Window + private void Create_ButtonForm(int hParentWND, Image snapshot) + { + try + { + if (!m_IsBtnFormCached) + BetterPerformance(); + + m_ObjectList[hParentWND] = new ButtonForm(); + ButtonForm btnForm = (ButtonForm)m_ObjectList[hParentWND]; + + if (btnForm != null) + { + // We use the InteropHelper to set the Owner Property + WindowInteropHelper InteropHelper = new WindowInteropHelper(btnForm); + InteropHelper.Owner = (IntPtr)hParentWND; + + // Set the important Fields into the Button Form + btnForm.HookedWindow = (IntPtr)hParentWND; // give it the handle to the hooked window + btnForm.SnapShot = snapshot; // give it the snapshot of the window + + RECT ParentWndRect = new RECT(); + Win32Functions.GetWindowRect((IntPtr)hParentWND, out ParentWndRect); + + // Get Initial Location for the form + btnForm.Top = ParentWndRect.top; + btnForm.Left = ParentWndRect.left; + + // Get Initial Height and Width of the form + btnForm.Height = (ParentWndRect.bottom - ParentWndRect.top); + btnForm.Width = (ParentWndRect.right - ParentWndRect.left); + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + } + + /// + /// Use this function to delete the ButtonForm Object + /// + /// handle to Parent/Owner Window + private void Delete_ButtonForm(int hParentWND) + { + try + { + if (m_ObjectList.ContainsKey(hParentWND)) + { + ButtonForm btnForm = (ButtonForm)m_ObjectList[hParentWND]; + if (btnForm != null) + { + m_ObjectList.Remove(hParentWND); + btnForm.Close(); + } + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + } + + /// + /// Use this to run void() function actions on the specified buttonform + /// + /// handle to Parent/Owner Window + /// a pointer to a delegate (action function) to run + private void RunAction_ButtonForm(int hParentWND, _Action action) + { + try + { + if (m_ObjectList.ContainsKey(hParentWND)) + { + ButtonForm btnForm = (ButtonForm)m_ObjectList[hParentWND]; + if (btnForm != null) + action(btnForm); + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + } + + /// + /// Use this to actually create the Window, call this after calling Create_ButtonForm + /// This will create the window by calling Show(), this will also show the window + /// + /// handle to Parent/Owner Window + /// the Handle to the newly created window object + private int Create_ButtonFormWindow(int hParentWND) + { + try + { + if (m_ObjectList.ContainsKey(hParentWND)) + { + ButtonForm btnForm = (ButtonForm)m_ObjectList[hParentWND]; + + // We use the InteropHelper to see if this WPFForm has been created previously + WindowInteropHelper InteropHelper = new WindowInteropHelper(btnForm); + if (InteropHelper.Handle == IntPtr.Zero) + { + btnForm.Show(); + } + return (int)InteropHelper.Handle; + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + return 0; + } + + /// + /// Kills all ButtonForm Instances (STOPS ALL) + /// + private void Terminate() + { + try + { + foreach (object o in m_ObjectList) + { + if ((o != null) && (o is ButtonForm)) + { + ButtonForm btnForm = (ButtonForm)o; + btnForm.Close(); + } + } + m_ObjectList.Clear(); + + if (m_IsBtnFormCached) + { + m_btnForm.Close(); + m_IsBtnFormCached = false; + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + } + + /// + /// In order to improve first WPForm performance we have one + /// WPForm ButtonForm loaded at all times. (opacity set to 0). + /// ~it has no parent setting so it is just a form of the desktop + /// + private void BetterPerformance() + { + if (!m_IsBtnFormCached) + { + try + { + // Performance Cache (keeps a window loaded always) + m_btnForm = new ButtonForm(true); + m_btnForm.LoadHideButtonFormPerfCache(); + m_IsBtnFormCached = true; + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + } + } + } +} diff --git a/Client Services/ButtonWPForm/ButtonFormPages/Page_AddEdit.xaml b/Client Services/ButtonWPForm/ButtonFormPages/Page_AddEdit.xaml new file mode 100644 index 0000000..0ca688a --- /dev/null +++ b/Client Services/ButtonWPForm/ButtonFormPages/Page_AddEdit.xaml @@ -0,0 +1,18 @@ + + + + + + diff --git a/Client Services/GUIDebugStepExe/GUIDebugStepTestForm.xaml.cs b/Client Services/GUIDebugStepExe/GUIDebugStepTestForm.xaml.cs new file mode 100644 index 0000000..42ee850 --- /dev/null +++ b/Client Services/GUIDebugStepExe/GUIDebugStepTestForm.xaml.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +// Foo Namespaces +using Foo.ClientServices.ButtonWPForm; +using Foo.ClientServices.GUIWPForms; + +namespace Foo.ClientServices.GUIDebugStepExe +{ + /// + /// Interaction logic for Window1.xaml + /// + public partial class GUIDebugStepTestForm : Window + { + + // Private Members + GUIWPForms.GUIWPForms m_Gui = null; + ButtonWPForm.ButtonWPFormCCW m_ButtonForm = null; + + public GUIDebugStepTestForm() + { + InitializeComponent(); + } + + private void btnLaunchArtifactWall_Click(object sender, RoutedEventArgs e) + { + m_Gui.LaunchArtifactWall(IntPtr.Zero); + } + + private void btnWorkspaceSelector_Click(object sender, RoutedEventArgs e) + { + m_Gui.LaunchWorkspaceSelector(IntPtr.Zero); + } + + private void btnSettingsNMain_Click(object sender, RoutedEventArgs e) + { + m_Gui.LaunchSettingsNAboutUs(IntPtr.Zero); + } + + private void btnButtonForm_Click(object sender, RoutedEventArgs e) + { + } + + private void wvGUIDebugStepTestForm_Loaded(object sender, RoutedEventArgs e) + { + // Instantiate the objects + m_Gui = new GUIWPForms.GUIWPForms(); + //m_ButtonForm = new ButtonWPForm.ButtonWPFormCCW(); + + // instantiate any dependent threads, etc + m_Gui.Start(); + //m_ButtonForm.Start(); + } + + private void wvGUIDebugStepTestForm_Closed(object sender, EventArgs e) + { + // close any dependent threads + m_Gui.Stop(); + //m_ButtonForm.Stop(); + + // delete objects + m_Gui = null; + //m_ButtonForm = null; + } + } +} diff --git a/Client Services/GUIDebugStepExe/Properties/AssemblyInfo.cs b/Client Services/GUIDebugStepExe/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d549f5b --- /dev/null +++ b/Client Services/GUIDebugStepExe/Properties/AssemblyInfo.cs @@ -0,0 +1,55 @@ +using System.Reflection; +using System.Resources; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GUIDebugStepExe")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GUIDebugStepExe")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Client Services/GUIDebugStepExe/Properties/Resources.Designer.cs b/Client Services/GUIDebugStepExe/Properties/Resources.Designer.cs new file mode 100644 index 0000000..8728cf7 --- /dev/null +++ b/Client Services/GUIDebugStepExe/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.ClientServices.GUIDebugStepExe.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Foo.ClientServices.GUIDebugStepExe.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Client Services/GUIDebugStepExe/Properties/Resources.resx b/Client Services/GUIDebugStepExe/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Client Services/GUIDebugStepExe/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Client Services/GUIDebugStepExe/Properties/Settings.Designer.cs b/Client Services/GUIDebugStepExe/Properties/Settings.Designer.cs new file mode 100644 index 0000000..7f1368d --- /dev/null +++ b/Client Services/GUIDebugStepExe/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.ClientServices.GUIDebugStepExe.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Client Services/GUIDebugStepExe/Properties/Settings.settings b/Client Services/GUIDebugStepExe/Properties/Settings.settings new file mode 100644 index 0000000..8f2fd95 --- /dev/null +++ b/Client Services/GUIDebugStepExe/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/Client Services/GUIWPForms/ComponentState.cs b/Client Services/GUIWPForms/ComponentState.cs new file mode 100644 index 0000000..9f7509a --- /dev/null +++ b/Client Services/GUIWPForms/ComponentState.cs @@ -0,0 +1,77 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; +using System.Reflection; + +// Ooganizer Namespaces +using Foo.Platform; +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// This class is responsible for launch all secondary threads required for this application as + /// well as hold any variables that are needed by all classes + /// created. + /// + [ComVisible(false)] + internal class ComponentState + { + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// This class manages the state / main variables of the COM+ that maybe needed by multiple classes. + /// It is responsible for starting and stopping any secondary threads. + /// + static ComponentState() + { + // We must subscribe to assembly resolver + Log.Info(string.Format("{0}() - GUIWPForms ComponentState() called. Application is starting...", MethodBase.GetCurrentMethod().Name)); + + // Let's Preload the Database *Right here, right now* that should be good for all of us + Data.Artifacts.DoesArtifactExistInSystem(DataTypeHelpers.CreateLocationOnlyArtifact("C:\\Dummy.file")); + + // Start GUI Dispatcher Thread + Log.Info(string.Format("{0}() - GUIWPForms ComponentState() called. Activating DispatcherThread", MethodBase.GetCurrentMethod().Name)); + DispatcherThread.Run = true; + } + + /// + /// Private Variables + /// + private static bool s_bApplicationIsRunning = false; + + /// + /// Use this to enable/disable all threads and variables for + /// the component states + /// + public static bool ApplicationIsRunning + { + get { return s_bApplicationIsRunning; } + set + { + if (!value) + { + Log.Info(string.Format("{0}() - ComponentState() sApplicationRunning set to False", MethodBase.GetCurrentMethod().Name)); + DispatcherThread.Run = false; + } + + s_bApplicationIsRunning = value; + } + } + + /// + /// Use this to access the GUIFormsMgr Object in order to + /// communicate to wpfForms (Setter should only be called by + /// DispatcherThread) + /// + public static GUIFormsMgr GUIFormsMgr + { + get { return DispatcherThread.s_GUIFormsMgr; } + } + } +} diff --git a/Client Services/GUIWPForms/DispatcherThread.cs b/Client Services/GUIWPForms/DispatcherThread.cs new file mode 100644 index 0000000..c53fada --- /dev/null +++ b/Client Services/GUIWPForms/DispatcherThread.cs @@ -0,0 +1,131 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; +using System.Threading; +using System.Reflection; + +// Ooganizer Namespaces +using Foo.Platform; +using System.Windows.Threading; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// This class is responsible for creation and deltion of ButtonFormMgr.cs on a + /// Dispatcher Thread. ~The Dispatcher is responsible for all the messages being passed + /// for the Form Objects, it must be running at all times and created before any forms get + /// created. + /// + [ComVisible(false)] + class DispatcherThread + { + + // Member Variables + private static Thread s_DispatcherThread = null; + private static bool s_DispatcherThreadIsInitialized = false; + internal static GUIFormsMgr s_GUIFormsMgr = null; + + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// Constructor by default will launch the thread if needed + /// + static DispatcherThread() + { + Log.Info(string.Format("{0}() - DispatcherThread() called", MethodBase.GetCurrentMethod().Name)); + StartDispatcherThreadIfNeeded(); + } + + /// + /// Use this property to set the Dispatcher to running / not running + /// + public static bool Run + { + get { return s_DispatcherThreadIsInitialized; } + set + { + if (!value) + TerminateDispatcherThreadIfNeeded(); + + s_DispatcherThreadIsInitialized = value; + } + } + + /// + /// Message Loop Thread for wpfGUIForms + /// + private static void DispatcherThreadProc() + { + // Create ButtonFormMgr Object on this thread *Allow global access to the object* + Log.Info(string.Format("{0}() - About to new GUIFormsMgr via DispatcherThread", MethodBase.GetCurrentMethod().Name)); + s_GUIFormsMgr = new GUIFormsMgr(Dispatcher.CurrentDispatcher); + + Log.Info(string.Format("{0}() - GUIFormsMgr DispatcherThread is initialized s_DispatcherThreadIsInitialized is True", MethodBase.GetCurrentMethod().Name)); + s_DispatcherThreadIsInitialized = true; // always set to true to allow caller to exit out + + if (s_GUIFormsMgr != null) + { + Log.Info(string.Format("{0}() - GUIFormsMgr Launched via DispatcherThread", MethodBase.GetCurrentMethod().Name)); + + //Enter Dispatcher Message Loop + System.Windows.Threading.Dispatcher.Run(); + } + else + { + Log.Error(string.Format("{0}() - GUIFormsMgr Launch Failed! Exiting Thread - Major Error must have occured", MethodBase.GetCurrentMethod().Name)); + // exit thread - no need to stay here + } + } + + /// + /// Use this function to start ThreadProc(above) if needed. COM+ can shutdown the thread anytime, + /// we need to make sure that the thread is alive BEFORE calling ButtonForms + /// + private static void StartDispatcherThreadIfNeeded() + { + if (s_DispatcherThread != null && s_DispatcherThread.IsAlive) + { + return; + } + else + { + s_DispatcherThreadIsInitialized = false; + + // Start a new Thread so it can become the Message Loop + s_DispatcherThread = new Thread(new ThreadStart(DispatcherThread.DispatcherThreadProc)); + + // GUI components require the thread to be STA; otherwise throws an error + s_DispatcherThread.SetApartmentState(ApartmentState.STA); + Log.Info(string.Format("{0}() - Starting DispatcherThread...", MethodBase.GetCurrentMethod().Name)); + s_DispatcherThread.Start(); + Log.Info(string.Format("{0}() - DispatcherThread Started.", MethodBase.GetCurrentMethod().Name)); + + // Make sure the Application Object is running + // (COM will eventually just time out otherwise) + //while (!s_DispatcherThreadIsInitialized) + // System.Threading.Thread.Sleep(20); // Syncronous call + } + } + + /// + /// Terminates all ButtonForm Objects and the Message Dispatcher Thread *do this only on shutdown* + /// + private static void TerminateDispatcherThreadIfNeeded() + { + if (s_DispatcherThreadIsInitialized) + { + // Delete s_GUIFormsMgr and all wpfForms from this thread + s_GUIFormsMgr.TerminateDISP(); + s_GUIFormsMgr = null; + + s_DispatcherThread.Abort(); + s_DispatcherThreadIsInitialized = false; + Log.Info(string.Format("{0}() - GUIFormsMgr is DispatcherThread shutdown s_DispatcherThreadIsInitialized is False", MethodBase.GetCurrentMethod().Name)); + } + } + + } +} diff --git a/Client Services/GUIWPForms/GUIFormsMgr.cs b/Client Services/GUIWPForms/GUIFormsMgr.cs new file mode 100644 index 0000000..ed06472 --- /dev/null +++ b/Client Services/GUIWPForms/GUIFormsMgr.cs @@ -0,0 +1,381 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Drawing; +using System.Threading; +using System.Windows.Interop; +using System.EnterpriseServices; +using System.Windows; +using System.IO; +using System.Windows.Threading; +using System.Collections; +using System.Reflection; + +using Foo.Platform; +using Foo.GUILib; + +namespace Foo.ClientServices.GUIWPForms +{ + internal enum WPForms + { + ArtifactWall, + WorkspaceSelector, + SettingsNAboutUs, + } + + /// + /// Object Factory Creator for WPForms above + /// + internal class GUIWPFormsObjectFactory + { + /// + /// Object Form Factory for all our GUI Forms + /// + /// a WPF form object to create + /// true if to create a performanceCache window, should be false all other times + /// + public static Window CreateWPFormWindow(WPForms form, bool bPerformanceCache) + { + Window wpfForm = null; + switch (form) + { + case WPForms.ArtifactWall: + wpfForm = new ArtifactWall(bPerformanceCache); + break; + + case WPForms.WorkspaceSelector: + wpfForm = new WorkspaceSelector(bPerformanceCache); + break; + + case WPForms.SettingsNAboutUs: + wpfForm = new SettingsNAboutUs(bPerformanceCache); + break; + } + + // Imp! - if this is being loaded for performance we must handle it + WPFHiddenWindow.ExecuteShowOnAHiddenWindow(wpfForm, bPerformanceCache); + + return wpfForm; + } + } + + /// + /// This class manages the creation/deletion and actions of (1 - n) ButtonForms + /// + [ComVisible(false)] + internal class GUIFormsMgr + { + + private const int INITIAL_OBJECT_CAPACITY = 30; + private Hashtable m_ObjectList = null; + private Dispatcher m_Dispatcher = null; + + // load one instance of all wpforms (hidden) cached always, as a performance cache + private Window[] m_wpfCachedForms = null; + private bool m_AreWpfFormsCached = false; + + // Imp! - allows external caller to run any action on a Window + public delegate void _Action(Window wpfForm); + + //custom private delegates + private delegate bool delegate_Create(WPForms wpfFormType); + private delegate bool delegate_Show(WPForms wpfFormType); + private delegate bool delegate_Delete(WPForms wpfFormType); + private delegate bool delegate_Action(WPForms wpfFormType, _Action action); + + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// GUIFormsMgr - Responsible for managing the GUI Window Messaging Threads + /// + /// Dispatcher Thread Context + public GUIFormsMgr(Dispatcher disp) + { + m_ObjectList = new Hashtable(); + m_Dispatcher = disp; + + if (!m_AreWpfFormsCached) + BetterPerformance(); + } + + /// + /// Calls Create_WpfForm via Dispatcher if neccessary + /// + /// Object type to create + public bool Create_WpfFormDISP(WPForms wpfFormType) + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + return Create_WpfForm(wpfFormType); + } + else + { + object[] parameters = new object[] { wpfFormType }; + return (bool) m_Dispatcher.Invoke((delegate_Create)Create_WpfFormDISP, System.Windows.Threading.DispatcherPriority.Normal, parameters); + } + } + + /// + /// Calls Show_WpfForm via Dispatcher if neccessary + /// + /// Object type to create + public bool Show_WpfFormDISP(WPForms wpfFormType) + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + return Show_WpfForm(wpfFormType); + } + else + { + object[] parameters = new object[] { wpfFormType }; + return (bool) m_Dispatcher.Invoke((delegate_Create)Show_WpfFormDISP, System.Windows.Threading.DispatcherPriority.Normal, parameters); + } + } + + /// + /// Calls Delete_WpfForm via Dispatcher if neccessary + /// + /// Object type to delete + public bool Delete_WpfFormDISP(WPForms wpfFormType) + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + return Delete_WpfForm(wpfFormType); + } + else + { + object[] parameters = new object[] { wpfFormType }; + return (bool)m_Dispatcher.Invoke((delegate_Delete)Delete_WpfFormDISP, System.Windows.Threading.DispatcherPriority.Normal, parameters); + } + } + + /// + /// Use this Dispatching Action Function to run any _Action on the WpfForm + /// + /// Object type to run action on + public bool RunAction_WpfFormDISP(WPForms wpfFormType, _Action action) + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + return RunAction_WpfForm(wpfFormType, action); + } + else + { + object[] parameters = new object[] { wpfFormType, action }; + return (bool) m_Dispatcher.Invoke((delegate_Action)RunAction_WpfFormDISP, System.Windows.Threading.DispatcherPriority.Normal, parameters); + } + } + + /// + /// Calls Terminate via Dispatcher if neccessary + /// + public void TerminateDISP() + { + if (m_Dispatcher.Thread == Thread.CurrentThread) + { + Terminate(); + } + else + { + m_Dispatcher.Invoke((Action)TerminateDISP, System.Windows.Threading.DispatcherPriority.Normal, null); + } + } + + /// + /// Creates a new WpfForm object into the ObjectList + /// + /// Object type to run action on + private bool Create_WpfForm(WPForms wpfFormType) + { + try + { + if (!m_AreWpfFormsCached) + BetterPerformance(); + + // we only allow one object * so delete the previous one if exists * + if (m_ObjectList[wpfFormType] != null) + Delete_WpfForm(wpfFormType); + + m_ObjectList[wpfFormType] = GUIWPFormsObjectFactory.CreateWPFormWindow(wpfFormType, false); + Window wpfForm = (Window) m_ObjectList[wpfFormType]; + + if (wpfForm == null) + { + Log.Error(string.Format("{0}() - Some Type of Error Occured. wpfForm is null", MethodBase.GetCurrentMethod().Name)); + return false; + } + else + { + return true; + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + return false; + } + + /// + /// Show a WpfForm object in the ObjectList + /// + /// Object type to run action on + private bool Show_WpfForm(WPForms wpfFormType) + { + try + { + Window wpfForm = (Window)m_ObjectList[wpfFormType]; + + if (wpfForm == null) + { + Log.Error(string.Format("{0}() - Some Type of Error Occured. wpfForm is null", MethodBase.GetCurrentMethod().Name)); + return false; + } + else + { + // We use the InteropHelper to see if this WPFForm has been created previously + WindowInteropHelper InteropHelper = new WindowInteropHelper(wpfForm); + if (InteropHelper.Handle == IntPtr.Zero) + { + wpfForm.Show(); + return true; + } + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + return false; + } + + /// + /// Use this function to delete the WpfForm Object + /// + /// Object type to run action on + private bool Delete_WpfForm(WPForms wpfFormType) + { + try + { + if (m_ObjectList.ContainsKey(wpfFormType)) + { + Window wpfForm = (Window)m_ObjectList[wpfFormType]; + if (wpfForm != null) + { + m_ObjectList.Remove(wpfFormType); + wpfForm.Close(); + return true; + } + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + return false; + } + + /// + /// Use this to run void() function actions on the specified wpfForm + /// + /// Object type to run action on + /// a pointer to a delegate (action function) to run + private bool RunAction_WpfForm(WPForms wpfFormType, _Action action) + { + try + { + if (m_ObjectList.ContainsKey(wpfFormType)) + { + Window wpfForm = (Window)m_ObjectList[wpfFormType]; + if (wpfForm != null && action != null) + { + action(wpfForm); + return true; + } + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + return false; + } + + /// + /// Kills all ButtonForm Instances (STOPS ALL) + /// + private void Terminate() + { + try + { + foreach (object o in m_ObjectList) + { + if ((o != null) && (o is Window)) + { + Window WpfForm = (Window)o; + WpfForm.Close(); + } + } + m_ObjectList.Clear(); + + if (m_AreWpfFormsCached) + { + foreach (Window window in m_wpfCachedForms) + { + if (window != null) + window.Close(); + } + + // Caching is incomplete + m_AreWpfFormsCached = false; + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + } + + /// + /// In order to improve WPForm performance we have one set of forms + /// loaded at all times. (opacity set to 0). + /// ~it has no parent setting so it is just a form of the desktop + /// + private void BetterPerformance() + { + if (!m_AreWpfFormsCached && (m_wpfCachedForms == null)) + { + try + { + lock (this) + { + int nForms = Enum.GetValues(typeof(WPForms)).Length; + if (nForms > 0) + { + // Allocate the cached forms array + m_wpfCachedForms = new Window[nForms]; + + // Iterate thru enums and create the corresponding objects in the Cache + for (int i = 0; i < nForms; ++i) + { + WPForms form = (WPForms)Enum.ToObject(typeof(WPForms), i); + m_wpfCachedForms[i] = GUIWPFormsObjectFactory.CreateWPFormWindow(form, true); + } + + // Caching is complete + m_AreWpfFormsCached = true; + } + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + } + } + } + + } +} diff --git a/Client Services/GUIWPForms/GUIState.cs b/Client Services/GUIWPForms/GUIState.cs new file mode 100644 index 0000000..77642e2 --- /dev/null +++ b/Client Services/GUIWPForms/GUIState.cs @@ -0,0 +1,55 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +// Foo Namespaces +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; +using System.Windows; + +namespace Foo.ClientServices.GUIWPForms +{ + + /// + /// Used to save GUI State Information for all of GUIWPForms, + /// such as last selected SortOrder etc. ~very useful for having multiple forms + /// communicate with each other * C# Singleton # + /// + public static class GUIState + { + // WorkspaceSelector_StandardPage comboBox Workspace SortOrder + public static SortOrderForWorkspaces LastSelectedSotOrderWorkspaces { get; set; } + public static int LastSelectedSotOrderWorkspacesIndex { get; set; } + + // WorkspaceSelector_StandardPage dataGrid Selected WorkspaceName + public static string LastSelectedWorkspaceName { get; set; } + + // ArtifactWall + public static SortOrderForArtifacts LastSelectedSotOrderArtifacts { get; set; } + public static int LastSelectedSotOrderArtifactsIndex { get; set; } + + // Keeping track of launched WPF GUI's + public static Window CurrentlyShowingWPFWindow { get; set; } + + /// + /// Defaults + /// + static GUIState() + { + // Defaults for comboBox Workspace SortOrder + LastSelectedSotOrderWorkspaces = SortOrderForWorkspaces.Ascending; + LastSelectedSotOrderWorkspacesIndex = 0; + + // Defaults for Selected WorkspaceName + LastSelectedWorkspaceName = String.Empty; + + // Artifact Wall + LastSelectedSotOrderArtifacts = SortOrderForArtifacts.Ascending; + LastSelectedSotOrderArtifactsIndex = 0; + + // Keeping track of launched WPF GUI's + CurrentlyShowingWPFWindow = null; + } + } +} diff --git a/Client Services/GUIWPForms/GUIWPFPages/PageImages/AddWorkspace.png b/Client Services/GUIWPForms/GUIWPFPages/PageImages/AddWorkspace.png new file mode 100644 index 0000000000000000000000000000000000000000..01bdc8837c988bde677a49285b53ae2c1f4710db GIT binary patch literal 48982 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 literal 0 HcmV?d00001 diff --git a/Client Services/GUIWPForms/GUIWPFPages/PageImages/Close.png b/Client Services/GUIWPForms/GUIWPFPages/PageImages/Close.png new file mode 100644 index 0000000000000000000000000000000000000000..21f27ff2b28fb39618173a104ac6480e32608d55 GIT binary patch literal 49981 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 literal 0 HcmV?d00001 diff --git a/Client Services/GUIWPForms/GUIWPFPages/PageImages/CloseAll.png b/Client Services/GUIWPForms/GUIWPFPages/PageImages/CloseAll.png new file mode 100644 index 0000000000000000000000000000000000000000..d758b0c2b1f4746c17309b6ee0dc9c89c937cc12 GIT binary patch literal 50404 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 literal 0 HcmV?d00001 diff --git a/Client Services/GUIWPForms/GUIWPFPages/PageImages/DeleteWorkspace.png b/Client Services/GUIWPForms/GUIWPFPages/PageImages/DeleteWorkspace.png new file mode 100644 index 0000000000000000000000000000000000000000..2471d6ab651c01565e0acf23a09675f21c2e2279 GIT binary patch literal 50764 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 kK^1ESUEAMjxl3Agjrm;e9( literal 0 HcmV?d00001 diff --git a/Client Services/GUIWPForms/GUIWPFPages/PageImages/EditWorkspace.png b/Client Services/GUIWPForms/GUIWPFPages/PageImages/EditWorkspace.png new file mode 100644 index 0000000000000000000000000000000000000000..6a987528d4bc0754d26987dbbcc2161c19e777e6 GIT binary patch literal 50083 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 fv^K*RoS2ikwMl4kd?;n@L%=d%}JP*!|EL literal 0 HcmV?d00001 diff --git a/Client Services/GUIWPForms/GUIWPFPages/PageImages/House.png b/Client Services/GUIWPForms/GUIWPFPages/PageImages/House.png new file mode 100644 index 0000000000000000000000000000000000000000..17bb9ed90d61a58aedc35d265b84aecf82a56cd7 GIT binary patch literal 943 zcmV;g15o^lP)004R=004l4008;_004mL004C`008P>0026e000+nl3&F}00006 zVoOIv0RI600RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000Sga6xAP000mG000mG zT*j@#00091Nklu#~Je=^<-vCKLMWt%|Sr6@_9bLc@yb4iB-=#)f^f5CZg+m zok}J46c`_NE06+aKLbyGvaoTG90VSy5SAMF`pF z8jTAQk(GfkXd2!_6YsQRNQ>sWh+iOfuIMEC7GfbCwMUCBEkq@mP7C}g}N9?~@VW>4Sq@AVI)qnX|~=G{M7Te(9Z(M|WBLnvS2 zI5xiTBQ$~QxlZNYy`Nv$IZ)PbFE0-&)TwN?KbcNvh{iGq-={C2u!X==U|ANrE>TKh z7zU-%QpfzC3&&2M{_dizR#)rI=EjA3eSNK7Z=_7qOxT+h&8e2@?0%NsvG=iT8_RL2 z+^tY36q;ABUi)FWT>k#txnJ+gcH8tDjb?3reqq+K%wJlYn=9>Ls>|xyl??X0DEqQG z>h*Psi$(X+rOUH7uHX2gF!y`j^}K4eTK(r#gTWxSZ8JJLn(QCQ9!&OheUwUekG0!o zwNxtQZ`~^W_|DshYhQi+?c;4cRZ>dUYgKZ&(ZuBB#F6pw*IxxhJRbi~_HW^tVeh=- Rn3Vtk002ovPDHLkV1i_;xn2MO literal 0 HcmV?d00001 diff --git a/Client Services/GUIWPForms/GUIWPFPages/PageImages/Launch.png b/Client Services/GUIWPForms/GUIWPFPages/PageImages/Launch.png new file mode 100644 index 0000000000000000000000000000000000000000..288a59a79896bc6b66dc7416b5c6357628981da0 GIT binary patch literal 48895 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 literal 0 HcmV?d00001 diff --git a/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_DeleteWorkspacePage.xaml b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_DeleteWorkspacePage.xaml new file mode 100644 index 0000000..7581305 --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_DeleteWorkspacePage.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_DeleteWorkspacePage.xaml.cs b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_DeleteWorkspacePage.xaml.cs new file mode 100644 index 0000000..2781d2e --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_DeleteWorkspacePage.xaml.cs @@ -0,0 +1,158 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; + +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; +using System.Windows.Threading; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// Interaction logic for WorkspaceSelector_DeleteWorkspacePage.xaml + /// + public partial class WorkspaceSelector_DeleteWorkspacePage : Page + { + // passed to us by parent + private WorkspaceSelector m_WorkspaceSelectorObj = null; + private bool m_bPerformanceCache = false; + + // private state variables + private string m_strWorkspaceName; + + public WorkspaceSelector_DeleteWorkspacePage(bool bPerformanceCache) + { + m_strWorkspaceName = String.Empty; + m_bPerformanceCache = bPerformanceCache; + if (!m_bPerformanceCache) + { + } + InitializeComponent(); + } + + /// + /// Occurs when page gets loaded + /// + private void Page_Loaded(object sender, RoutedEventArgs e) + { + if (!m_bPerformanceCache) + { + // Make sure that the Selector Frame is big enough to hold this page + m_WorkspaceSelectorObj = (WorkspaceSelector)this.Tag; + + // Make sure that we have a workspace Name to work with otherwise Navigate Back + if (String.IsNullOrEmpty(GUIState.LastSelectedWorkspaceName)) + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + else + m_strWorkspaceName = GUIState.LastSelectedWorkspaceName; + + // Set Height and Width + m_WorkspaceSelectorObj.Height = this.Height + m_WorkspaceSelectorObj.MarginTopBottom; + m_WorkspaceSelectorObj.Width = this.Width; + + // Set the Warning Label for this Particular Workspace + ConstructAreYouSureMessage(); + } + } + + /// + /// Constructs a thorough Warning Message to be displayed to the user in the label + /// Iterates and warns the user of exactly the number of changes that will occur in the system + /// + private void ConstructAreYouSureMessage() + { + int nArtifactsCount = Data.Artifacts.GetArtifactLinkCountForWorkspace(m_strWorkspaceName); + int nUniqueArtifactsCount = Data.Artifacts.GetUniqureArtifactsCountForWorkspace(m_strWorkspaceName); + if (nArtifactsCount >= 0 && nUniqueArtifactsCount >= 0) + { + StringBuilder sr = new StringBuilder(); + sr.Append(String.Format("Are you Sure you want to Delete Workspace '{0}'? \n\n", m_strWorkspaceName)); + sr.Append(String.Format("This Workspace contains {0} Artifact Links ", (nArtifactsCount - nUniqueArtifactsCount))); + sr.Append(String.Format("and {0} Artifacts. ", nUniqueArtifactsCount)); + sr.Append(String.Format("\n\n In Total: {0} Items will be deleted. There is no way to undo this operation.", nArtifactsCount)); + txtAreYouSure.Text = sr.ToString(); + } + else + { + // an error occured + Foo.Platform.ErrorReporting.UserError.Show("An Error Occurred", "Navigating you back to the WorkspaceSelector"); + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + } + + /// + /// Button Yes Event Handler - Go ahead and delete the workspace + /// + private void btnYes_Click(object sender, RoutedEventArgs e) + { + if (Data.Workspace.DeleteWorkspace(GUIState.LastSelectedWorkspaceName)) + { + + // Show Confirm Delete Message and Go Back + StringBuilder sr = new StringBuilder(); + sr.Append(String.Format("The Workspace '{0}' was deleted successfully. \n\n", m_strWorkspaceName)); + sr.Append("You will no longer be able to access this Workspace and any Artifacts that were exclusive to it."); + ShowMessageAndNavigateBack(sr.ToString()); + + // Set GUI State + GUIState.LastSelectedWorkspaceName = String.Empty; + } + else + { + // an error occured + Foo.Platform.ErrorReporting.UserError.Show("An Error Occurred", String.Format("An Error occured while deleting the Workspace {0}. Navigating you back to the WorkspaceSelector", m_strWorkspaceName)); + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + } + + /// + /// Shows the passed in message in the text box and then navigates back to the main page + /// + /// + private void ShowMessageAndNavigateBack(string strMessage) + { + // Hide the buttons + btnYes.Visibility = Visibility.Hidden; + btnNo.Visibility = Visibility.Hidden; + + // Show Message + txtAreYouSure.Text = strMessage; + + // Pause for 2 second and Navigate Back + DispatcherTimer dispatcherTimer = new DispatcherTimer(); + dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); + dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1, 500); + dispatcherTimer.Start(); + } + + /// + /// Timer set specifically to allow the message to be seen for a little bit before navigating back + /// + void dispatcherTimer_Tick(object sender, EventArgs e) + { + DispatcherTimer dispatcherTimer = (DispatcherTimer) sender; + dispatcherTimer.Stop(); + + // Navigate Back + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + + /// + /// Button No Event Handler - Go back to parent + /// + private void btnNo_Click(object sender, RoutedEventArgs e) + { + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + } +} diff --git a/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_NewWorkspacePage.xaml b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_NewWorkspacePage.xaml new file mode 100644 index 0000000..c118703 --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_NewWorkspacePage.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_NewWorkspacePage.xaml.cs b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_NewWorkspacePage.xaml.cs new file mode 100644 index 0000000..d342aab --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_NewWorkspacePage.xaml.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Threading; +using System.Windows.Forms; +using System.Drawing; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// Interaction logic for WorkspaceSelector_NewWorkspacePage.xaml + /// + public partial class WorkspaceSelector_NewWorkspacePage : Page + { + // passed to us by parent + private WorkspaceSelector m_WorkspaceSelectorObj = null; + private bool m_bPerformanceCache = false; + + // private state variables + private bool m_bIsValidName; + + public WorkspaceSelector_NewWorkspacePage(bool bPerformanceCache) + { + m_bPerformanceCache = bPerformanceCache; + if (!m_bPerformanceCache) + { + } + InitializeComponent(); + } + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + if (!m_bPerformanceCache) + { + // Make sure that the Selector Frame is big enough to hold this page + m_WorkspaceSelectorObj = (WorkspaceSelector)this.Tag; + m_WorkspaceSelectorObj.Height = this.Height + m_WorkspaceSelectorObj.MarginTopBottom; + m_WorkspaceSelectorObj.Width = this.Width; + + // Set the Warning Label for this Particular Workspace + ConstructAreYouSureMessage(); + + // Set intial Error Message + SetWarningMessage("Enter Characters"); + m_bIsValidName = false; + + // Set intial focus + txtNewName.Focus(); + } + } + + /// + /// Constructs a renaming Message to be displayed to the user + /// + private void ConstructAreYouSureMessage() + { + StringBuilder sr = new StringBuilder(); + sr.Append("Create New Workspace \n"); + txtCreateWorkspaceTitle.Text = sr.ToString(); + } + + /// + /// Sets the validator label to a warning message + /// + /// + private void SetWarningMessage(string strMessage) + { + lblWarningMessage.Foreground = new SolidColorBrush(Colors.OrangeRed); + lblWarningMessage.Content = strMessage; + } + + /// + /// Sets the validator label to a success message + /// + /// + private void SetSuccessMessage(string strMessage) + { + lblWarningMessage.Foreground = new SolidColorBrush(Colors.RoyalBlue); + lblWarningMessage.Content = strMessage; + } + + /// + /// Button Yes Event Handler - Go ahead and Create the new WorkspaceName + /// + private void btnYes_Click(object sender, RoutedEventArgs e) + { + if (m_bIsValidName) + { + if (!DataAccessLayer.Data.Workspace.InsertWorkspaceName(txtNewName.Text)) + { + // an error occured + Foo.Platform.ErrorReporting.UserError.Show("An Error Occurred", "Creating the Workspace Failed! Navigating you back to the WorkspaceSelector"); + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + else + { + // Set GUI State + GUIState.LastSelectedWorkspaceName = txtNewName.Text; + + // Show Success Message + ShowMessageAndNavigateBack(String.Format("Workspace '{0}' has been successfully created", txtNewName.Text)); + } + } + } + + /// + /// Shows the passed in message in the text box and then navigates back to the main page + /// + /// + private void ShowMessageAndNavigateBack(string strMessage) + { + // Hide the buttons + btnYes.Visibility = Visibility.Hidden; + btnNo.Visibility = Visibility.Hidden; + + // Hide the textbox and Labels + lblEnterNewName.Visibility = Visibility.Hidden; + txtNewName.Visibility = Visibility.Hidden; + lblWarningMessage.Visibility = Visibility.Hidden; + + // Show Message + txtCreateWorkspaceTitle.Text = strMessage; + + // Dynamically calculate the height of the textbox * No need to do this in this case * + // System.Drawing.Size sz = new System.Drawing.Size((int)this.Width, int.MaxValue); + // Font font = new Font(txtRenameWorkspaceTitle.FontFamily.ToString(), (float)txtRenameWorkspaceTitle.FontSize); + // sz = TextRenderer.MeasureText(txtRenameWorkspaceTitle.Text, font, sz, TextFormatFlags.WordBreak); + // Change Height as needed + // lblRenameWorkspaceTitle.Height = sz.Height; + // txtRenameWorkspaceTitle.Height = sz.Height; + + // default to change height to Max available space + lblCreateWorkspaceTitle.Height = this.Height - m_WorkspaceSelectorObj.MarginTopBottom; + txtCreateWorkspaceTitle.Height = this.Height - m_WorkspaceSelectorObj.MarginTopBottom; + + // Pause for 1.5 second and Navigate Back + DispatcherTimer dispatcherTimer = new DispatcherTimer(); + dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); + dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1, 500); + dispatcherTimer.Start(); + } + + /// + /// Timer set specifically to allow the message to be seen for a little bit before navigating back + /// + void dispatcherTimer_Tick(object sender, EventArgs e) + { + DispatcherTimer dispatcherTimer = (DispatcherTimer)sender; + dispatcherTimer.Stop(); + + // Navigate Back + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + + /// + /// Button No Event Handler - Go back to parent + /// + private void btnNo_Click(object sender, RoutedEventArgs e) + { + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + + /// + /// Perform NewWorkspaceName TextBox Validation + /// + private void txtNewName_TextChanged(object sender, TextChangedEventArgs e) + { + System.Windows.Controls.TextBox textBox = (System.Windows.Controls.TextBox)sender; + if (String.IsNullOrEmpty(textBox.Text)) + { + SetWarningMessage("Enter Characters"); + m_bIsValidName = false; + } + else if (!DataAccessLayer.DataTypes.DataTypeValidation.IsValidWorkspaceName(textBox.Text)) + { + SetWarningMessage("Invalid Workspace Name"); + m_bIsValidName = false; + } + else if (DataAccessLayer.Data.Workspace.DoesWorkspaceNameExist(textBox.Text)) + { + SetWarningMessage("Workspace Name Already Exists"); + m_bIsValidName = false; + } + else + { + SetSuccessMessage("Valid Workspace Name"); + m_bIsValidName = true; + } + } + } +} diff --git a/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_RenameWorkspacePage.xaml b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_RenameWorkspacePage.xaml new file mode 100644 index 0000000..d56356f --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_RenameWorkspacePage.xaml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_RenameWorkspacePage.xaml.cs b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_RenameWorkspacePage.xaml.cs new file mode 100644 index 0000000..d951b1b --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_RenameWorkspacePage.xaml.cs @@ -0,0 +1,210 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Threading; +using System.Windows.Forms; +using System.Drawing; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// Interaction logic for WorkspaceSelector_RenameWorkspacePage.xaml + /// + public partial class WorkspaceSelector_RenameWorkspacePage : Page + { + // passed to us by parent + private WorkspaceSelector m_WorkspaceSelectorObj = null; + private bool m_bPerformanceCache = false; + + // private state variables + private string m_strWorkspaceName; + private bool m_bIsValidName; + + public WorkspaceSelector_RenameWorkspacePage(bool bPerformanceCache) + { + m_bPerformanceCache = bPerformanceCache; + if (!m_bPerformanceCache) + { + } + InitializeComponent(); + } + + private void Page_Loaded(object sender, RoutedEventArgs e) + { + if (!m_bPerformanceCache) + { + // Make sure that the Selector Frame is big enough to hold this page + m_WorkspaceSelectorObj = (WorkspaceSelector)this.Tag; + + // Make sure that we have a workspace Name to work with otherwise Navigate Back + if (String.IsNullOrEmpty(GUIState.LastSelectedWorkspaceName)) + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + else + m_strWorkspaceName = GUIState.LastSelectedWorkspaceName; + + // Set Height and Width + m_WorkspaceSelectorObj.Height = this.Height + m_WorkspaceSelectorObj.MarginTopBottom; + m_WorkspaceSelectorObj.Width = this.Width; + + // Set the Warning Label for this Particular Workspace + ConstructAreYouSureMessage(); + + // Set intial Error Message + SetWarningMessage("Enter Characters"); + m_bIsValidName = false; + + // Set intial focus + txtNewName.Focus(); + } + } + + /// + /// Constructs a renaming Message to be displayed to the user + /// + private void ConstructAreYouSureMessage() + { + StringBuilder sr = new StringBuilder(); + sr.Append(String.Format("Rename Workspace '{0}'\n", m_strWorkspaceName)); + txtRenameWorkspaceTitle.Text = sr.ToString(); + } + + /// + /// Sets the validator label to a warning message + /// + /// + private void SetWarningMessage(string strMessage) + { + lblWarningMessage.Foreground = new SolidColorBrush(Colors.OrangeRed); + lblWarningMessage.Content = strMessage; + } + + /// + /// Sets the validator label to a success message + /// + /// + private void SetSuccessMessage(string strMessage) + { + lblWarningMessage.Foreground = new SolidColorBrush(Colors.RoyalBlue); + lblWarningMessage.Content = strMessage; + } + + /// + /// Button Yes Event Handler - Go ahead and Rename the WorkspaceName + /// + private void btnYes_Click(object sender, RoutedEventArgs e) + { + if (m_bIsValidName) + { + if (!DataAccessLayer.Data.Workspace.RenameWorkspace(m_strWorkspaceName, txtNewName.Text)) + { + // an error occured + Foo.Platform.ErrorReporting.UserError.Show("An Error Occurred", "Renaming the Workspace Failed! Navigating you back to the WorkspaceSelector"); + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + else + { + // Set GUI State + GUIState.LastSelectedWorkspaceName = txtNewName.Text; + + // Show Success Message + ShowMessageAndNavigateBack(String.Format("'{0}' has been successfully renamed to '{1}'", m_strWorkspaceName, txtNewName.Text)); + } + } + } + + /// + /// Shows the passed in message in the text box and then navigates back to the main page + /// + /// + private void ShowMessageAndNavigateBack(string strMessage) + { + // Hide the buttons + btnYes.Visibility = Visibility.Hidden; + btnNo.Visibility = Visibility.Hidden; + + // Hide the textbox and Labels + lblEnterNewName.Visibility = Visibility.Hidden; + txtNewName.Visibility = Visibility.Hidden; + lblWarningMessage.Visibility = Visibility.Hidden; + + // Show Message + txtRenameWorkspaceTitle.Text = strMessage; + + // Dynamically calculate the height of the textbox * No need to do this in this case * + // System.Drawing.Size sz = new System.Drawing.Size((int)this.Width, int.MaxValue); + // Font font = new Font(txtRenameWorkspaceTitle.FontFamily.ToString(),(float) txtRenameWorkspaceTitle.FontSize); + // sz = TextRenderer.MeasureText(txtRenameWorkspaceTitle.Text, font, sz, TextFormatFlags.WordBreak); + // Change Height as needed + // lblRenameWorkspaceTitle.Height = sz.Height; + // txtRenameWorkspaceTitle.Height = sz.Height; + + // default to change height to Max available space + lblRenameWorkspaceTitle.Height = this.Height - m_WorkspaceSelectorObj.MarginTopBottom; + txtRenameWorkspaceTitle.Height = this.Height - m_WorkspaceSelectorObj.MarginTopBottom; + + // Pause for 1.5 second and Navigate Back + DispatcherTimer dispatcherTimer = new DispatcherTimer(); + dispatcherTimer.Tick += new EventHandler(dispatcherTimer_Tick); + dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1, 500); + dispatcherTimer.Start(); + } + + /// + /// Timer set specifically to allow the message to be seen for a little bit before navigating back + /// + void dispatcherTimer_Tick(object sender, EventArgs e) + { + DispatcherTimer dispatcherTimer = (DispatcherTimer)sender; + dispatcherTimer.Stop(); + + // Navigate Back + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + + /// + /// Button No Event Handler - Go back to parent + /// + private void btnNo_Click(object sender, RoutedEventArgs e) + { + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + } + + /// + /// Perform NewWorkspaceName TextBox Validation + /// + private void txtNewName_TextChanged(object sender, TextChangedEventArgs e) + { + System.Windows.Controls.TextBox textBox = (System.Windows.Controls.TextBox)sender; + if (String.IsNullOrEmpty(textBox.Text)) + { + SetWarningMessage("Enter Characters"); + m_bIsValidName = false; + } + else if (!DataAccessLayer.DataTypes.DataTypeValidation.IsValidWorkspaceName(textBox.Text)) + { + SetWarningMessage("Invalid Workspace Name"); + m_bIsValidName = false; + } + else if (DataAccessLayer.Data.Workspace.DoesWorkspaceNameExist(textBox.Text)) + { + SetWarningMessage("Workspace Name Already Exists"); + m_bIsValidName = false; + } + else + { + SetSuccessMessage("Valid Workspace Name"); + m_bIsValidName = true; + } + } + } +} diff --git a/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_StandardPage.xaml b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_StandardPage.xaml new file mode 100644 index 0000000..c5b5c68 --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_StandardPage.xaml @@ -0,0 +1,151 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_StandardPage.xaml.cs b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_StandardPage.xaml.cs new file mode 100644 index 0000000..ece8dc3 --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPFPages/WorkspaceSelector_StandardPage.xaml.cs @@ -0,0 +1,418 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Collections.ObjectModel; +using Microsoft.Windows.Controls; +using System.Data; +using System.ComponentModel; + +// Foo Namespace +using Foo.WorkspaceMgr; +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; +using Foo.GUILib; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// Interaction logic for WorkspaceSelector_StandardPage.xaml + /// + public partial class WorkspaceSelector_StandardPage : Page + { + // passed to us by parent + private WorkspaceSelector m_WorkspaceSelectorObj = null; + private bool m_bPerformanceCache = false; + + // WorkspaceMgr - Imp + private WorkspaceMgr.WorkspaceMgr m_WorkspaceMgr = null; + + // private DT holds all information needed for the DataGrid + public DataTable WorkspacesDT { get; private set; } + + /// + /// Constructor + /// + /// + public WorkspaceSelector_StandardPage(bool bPerformanceCache) + { + // We preload & require the WorkspaceMgr in this class + m_WorkspaceMgr = new WorkspaceMgr.WorkspaceMgr(); + + // Preload Database call - to make sure it is fast when the user sees it + String[] workspaceNames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + + m_bPerformanceCache = bPerformanceCache; + if (!m_bPerformanceCache) + { + } + + InitializeComponent(); + } + + /// + /// Called when we want to Update the DataGrid with new DataTable Items + /// ~Responsible for reloading the WorkspacesDT + /// + private void UpdateWorkspaceGridItems(SortOrderForWorkspaces sortOrder) + { + // First Step - Clear the Grid + WorkspacesDT.Rows.Clear(); + + // Second Step - Fill the Grid with the WorkspaceNames + String[] workspaceNames = Data.Workspace.GetAllWorkspaceNames(sortOrder); + + int i = 0; + int selectedIndex = -1; + foreach (string workspaceName in workspaceNames) + { + var row = WorkspacesDT.NewRow(); + WorkspacesDT.Rows.Add(row); + row["WorkspaceName"] = workspaceName; + row["ButtonResUri"] = "PageImages/Launch.png";//"PageImages/Launch.png"; + row["ButtonToolTipText"] = "Launch This Workspace"; + + // Let's Determine which index is supposed to be selected + if (!String.IsNullOrEmpty(GUIState.LastSelectedWorkspaceName) && + (workspaceName == GUIState.LastSelectedWorkspaceName)) + selectedIndex = i; + + i = i + 1; // incr. + } + + // Third Step - Refresh The DataGrid + dataGridWorkspaces.ItemsSource = WorkspacesDT.DefaultView; + // Other ways to refresh * appears to not be needed here * could be useful later + //dataGridWorkspaces.ItemsSource = (WorkspacesDT as IListSource).GetList(); + //dataGridWorkspaces.Items.Refresh(); + + // Fourth Step - Reset the ColumnWidth of the WorkspaceName if no Scrollbar is visible + if (workspaceNames.Length <= 13) + { + // scrollbar not visible + DataGridLength gridbuffer = new DataGridLength(188 + 18); + dataGridWorkspaces.Columns[0].Width = gridbuffer; + } + else + { + // scrollbar visible + DataGridLength gridbuffer = new DataGridLength(188); + dataGridWorkspaces.Columns[0].Width = gridbuffer; + } + + // Fifth Step - Set the Selected Index of the DataGrid to the last set + // Workspace Or 0 if not found + if (selectedIndex >= 0) + dataGridWorkspaces.SelectedIndex = selectedIndex; + else + dataGridWorkspaces.SelectedIndex = 0; + } + + #region Page Events + + /// + /// Called when the Page is loaded + /// + private void Page_Loaded(object sender, RoutedEventArgs e) + { + if (!m_bPerformanceCache) + { + // Make sure that the Selector Frame is big enough to hold this page + m_WorkspaceSelectorObj = (WorkspaceSelector)this.Tag; + m_WorkspaceSelectorObj.Height = this.Height + m_WorkspaceSelectorObj.MarginTopBottom; + m_WorkspaceSelectorObj.Width = this.Width; + + // InitializeWorkspaceDT + WorkspacesDT = new DataTable("WorkspaceData"); + WorkspacesDT.Columns.Add(new DataColumn("WorkspaceName", typeof(string))); + WorkspacesDT.Columns.Add(new DataColumn("ButtonResUri", typeof(string))); + WorkspacesDT.Columns.Add(new DataColumn("ButtonToolTipText", typeof(string))); + + // Set Workspaces Label + lblCurrentWorkspace.Content = "Workspaces"; + + // Load ComboBox Sort Orders + comboBoxSortBy.Items.Add(WPFHelper.CreateAComboBoxItem("Sort By Last Accessed", SortOrderForWorkspaces.LastAccessedDescending)); + comboBoxSortBy.Items.Add(WPFHelper.CreateAComboBoxItem("Sort By Most Frequently Used", SortOrderForWorkspaces.MostFrequentlyAccessedDescending)); + comboBoxSortBy.Items.Add(WPFHelper.CreateAComboBoxItem("Sort By Name", SortOrderForWorkspaces.Ascending)); + + // Load GUI State (or Default Index) + comboBoxSortBy.SelectedIndex = GUIState.LastSelectedSotOrderWorkspacesIndex; + + // Assign ToolTips for the Buttons + btnNew.ToolTip = WPFHelper.CreateNewStringToolTip("New Workspace", 0, 120); + btnEdit.ToolTip = WPFHelper.CreateNewStringToolTip("Rename Workspace", 0, 120); + btnDelete.ToolTip = WPFHelper.CreateNewStringToolTip("Delete Workspace", 0, 120); + btnCloseAll.ToolTip = WPFHelper.CreateNewStringToolTip("Close All Workspaces", 0, 120); + } + } + + #endregion + + #region ComboBox Events + + /// + /// Combo Box - SortBy - Selection Change Event * Deal with repopulating the Workspace Datagrid + /// + private void comboBoxSortBy_SelectionChanged(object sender, SelectionChangedEventArgs e) + { + ComboBox combobox = sender as ComboBox; + if (combobox != null) + { + ComboBoxItem item = (ComboBoxItem)combobox.SelectedItem; + string Content = item.Content.ToString(); + SortOrderForWorkspaces sortOrder = (SortOrderForWorkspaces)item.Tag; + + // Save the State Information * Last SortOrder and Last SortOrder Index * + GUIState.LastSelectedSotOrderWorkspaces = sortOrder; + GUIState.LastSelectedSotOrderWorkspacesIndex = combobox.SelectedIndex; + + // Update The Grid + UpdateWorkspaceGridItems(sortOrder); + } + } + + #endregion + + #region DataGrid Events + + /// + /// Upon double-click we should be launching the Workspace (unload any previously loaded ones) + /// + private void dataGridWorkspaces_MouseDoubleClick(object sender, MouseButtonEventArgs e) + { + string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); + if (!String.IsNullOrEmpty(strWorkspaceName)) + { + + } + } + + /// + /// Selection changed - Keep track of last selected workspace in GUIState + /// + private void dataGridWorkspaces_SelectedCellsChanged(object sender, SelectedCellsChangedEventArgs e) + { + string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); + if (!String.IsNullOrEmpty(strWorkspaceName)) + GUIState.LastSelectedWorkspaceName = strWorkspaceName; + } + + /// + /// Get Whatever Workspace the User currently has selected in the Grid + /// + /// Selected Workpsace Or Empty String if there is none + private string dataGrid_GetSelectedWorkspaceIfThereIsOne() + { + String strWorkspaceName = String.Empty; + + // We only allow single selection + IList cells = dataGridWorkspaces.SelectedCells; + if (cells.Count > 0) + { + DataGridCellInfo cell = cells[0]; + DataRowView row = (DataRowView)cell.Item; + strWorkspaceName = row["WorkspaceName"].ToString(); + } + return strWorkspaceName; + } + + /// + /// Creates the DataGrid Context Menu according to the Selected Workspace State + /// + /// valid Context Menu or Null + private ContextMenu dataGrid_CreateDataGridContextMenu() + { + string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); + if (!String.IsNullOrEmpty(strWorkspaceName)) + { + // We also want to load the state of the workspace here + ContextMenu menu = new ContextMenu(); + menu.PlacementTarget = this; + + // Load all the MenuItems + MenuItem m1 = new MenuItem(); + m1.Header = "Launch"; + m1.Click += new RoutedEventHandler(ContextMenu_Item_Click); + m1.FontWeight = FontWeights.Bold; + m1.Icon = WPFHelper.CreateWPFImageFromRelativeResourceUri("PageImages/Launch.png", 16, 16); + menu.Items.Add(m1); + + MenuItem m2 = new MenuItem(); + m2.Header = "Show"; + m2.Click += new RoutedEventHandler(ContextMenu_Item_Click); + m2.Icon = WPFHelper.CreateWPFImageFromRelativeResourceUri("PageImages/Hide.png", 16, 16); + menu.Items.Add(m2); + + MenuItem m3 = new MenuItem(); + m3.Header = "Hide"; + m3.Click += new RoutedEventHandler(ContextMenu_Item_Click); + m3.Icon = WPFHelper.CreateWPFImageFromRelativeResourceUri("PageImages/Hide.png", 16, 16); + menu.Items.Add(m3); + + MenuItem m4 = new MenuItem(); + m4.Header = "Close"; + m4.Click += new RoutedEventHandler(ContextMenu_Item_Click); + m4.Icon = WPFHelper.CreateWPFImageFromRelativeResourceUri("PageImages/Close.png", 16, 16); + menu.Items.Add(m4); + + // Load all the Events + menu.Closed += new RoutedEventHandler(ContextMenu_Closed); + menu.MouseLeave += new MouseEventHandler(ContextMenu_MouseLeave); + return menu; + } + return null; + } + + /// + /// We need to manually implement the context menu upon right click and not use wpf, + /// because of the mouse leave event + /// + private void dataGridWorkspaces_MouseRightButtonDown(object sender, MouseButtonEventArgs e) + { + ContextMenu menu = dataGrid_CreateDataGridContextMenu(); + if (menu != null) + { + // Make sure that leave doesn't work + m_WorkspaceSelectorObj.DontCloseOnMouseLeave = true; + + // Show the Context Menu + menu.IsOpen = true; + } + } + + #endregion + + #region ContextMenu Events + + /// + /// Context Menu - Closed Event + /// + void ContextMenu_Closed(object sender, RoutedEventArgs e) + { + // Make sure that navigator leave works again + m_WorkspaceSelectorObj.DontCloseOnMouseLeave = false; + + // Close the Navigation Form *if the mouse is NOT over it* + if (!WPFHelper.IsMouseCursorOverWPFormWindow(m_WorkspaceSelectorObj)) + m_WorkspaceSelectorObj.Close(); + } + + /// + /// Context Menu - Mouse Leave Event + /// + void ContextMenu_MouseLeave(object sender, MouseEventArgs e) + { + // On Leave just close the Menu + ContextMenu menu = (ContextMenu)sender; + menu.IsOpen = false; + } + + /// + /// Context Menu - Menu Item Clicked Event + /// + void ContextMenu_Item_Click(object sender, RoutedEventArgs e) + { + MenuItem m = (MenuItem)sender; + + string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); + if (!String.IsNullOrEmpty(strWorkspaceName)) + { + bool bSuccess = false; + switch (m.Header.ToString()) + { + case "Launch": + { + bSuccess = m_WorkspaceMgr.LaunchWorkspace(strWorkspaceName); + } + break; + + case "Show": + { + bSuccess = m_WorkspaceMgr.HideShowWorkspace(strWorkspaceName, true); + } + break; + + case "Hide": + { + bSuccess = m_WorkspaceMgr.HideShowWorkspace(strWorkspaceName, false); + } + break; + + case "Close": + { + bSuccess = m_WorkspaceMgr.CloseWorkspace(strWorkspaceName); + } + break; + } + } + } + + #endregion + + #region Button Click Events + + /// + /// New Button - Event Handler + /// + private void btnNew_Click(object sender, RoutedEventArgs e) + { + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_NewWorkspacePage); + } + + /// + /// Edit Button - Event Handler + /// + private void btnEdit_Click(object sender, RoutedEventArgs e) + { + string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); + if (!String.IsNullOrEmpty(strWorkspaceName)) + { + GUIState.LastSelectedWorkspaceName = strWorkspaceName; + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_RenameWorkspacePage); + } + } + + /// + /// Delete Button - Event Handler + /// + private void btnDelete_Click(object sender, RoutedEventArgs e) + { + string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); + if (!String.IsNullOrEmpty(strWorkspaceName)) + { + GUIState.LastSelectedWorkspaceName = strWorkspaceName; + m_WorkspaceSelectorObj.NavigateToChildPage(ChildPages.WorkspaceSelector_DeleteWorkspacePage); + } + } + + /// + /// CloseAll Button - Event Handler + /// + private void btnCloseAll_Click(object sender, RoutedEventArgs e) + { + MessageBox.Show("Does Nothing"); + } + + /// + /// Button on the Grid is being clicked - Event Handler + /// + private void ButtonGrid_Click(object sender, RoutedEventArgs e) + { + string strWorkspaceName = dataGrid_GetSelectedWorkspaceIfThereIsOne(); + if (String.IsNullOrEmpty(strWorkspaceName)) + return; + } + + #endregion + } +} diff --git a/Client Services/GUIWPForms/GUIWPForms.cs b/Client Services/GUIWPForms/GUIWPForms.cs new file mode 100644 index 0000000..f72febb --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms.cs @@ -0,0 +1,237 @@ +// For GUIDebugStepExe Debugging Only - Uncomment this #define +#define GUIDEBUGSTEPEXE + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Runtime.InteropServices; +using System.Windows.Interop; +using System.EnterpriseServices; +using System.Reflection; + +using Foo.Platform; +using Foo.Platform.Win32; +using System.Windows; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// GUIWPForms - Com Callable Wrapper Class exposed to ButtonHook. + /// This class is responsible for creating the ButtonWPForm (a form created in response to a ButtonHook W32 Click) + /// + [Guid("481C24F8-D619-460b-955A-22055571430C")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("Foo.ClientServices.GUIWPForms")] + [ComVisible(true)] + [ObjectPooling(Enabled = true, MinPoolSize = 1, MaxPoolSize = 2500, CreationTimeout = 5000)] +#if GUIDEBUGSTEPEXE + public class GUIWPForms : IGUIPWPForms +#else + public class GUIWPForms : ServicedComponent, IProcessInitializer, IGUIPWPForms +#endif + { + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + #region Construction / Destruction + public GUIWPForms() {} + ~GUIWPForms() { } + #endregion + +#if GUIDEBUGSTEPEXE + #region GuiDebugStepCustomStarterStopers + public void Start() + { + Log.Info(string.Format("{0}() - ComponentState Application Is being started", MethodBase.GetCurrentMethod().Name)); + ComponentState.ApplicationIsRunning = true; + } + + public void Stop() + { + Log.Info(string.Format("{0}() - ComponentState Application Is being stopped", MethodBase.GetCurrentMethod().Name)); + ComponentState.ApplicationIsRunning = false; + } + #endregion +#else + #region IProcessInitializer Members + public void Startup(object punkProcessControl) + { + Log.Info(string.Format("{0}() - ComponentState Application Is being started", MethodBase.GetCurrentMethod().Name)); + ComponentState.ApplicationIsRunning = true; + } + + public void Shutdown() + { + Log.Info(string.Format("{0}() - ComponentState Application Is being stopped", MethodBase.GetCurrentMethod().Name)); + ComponentState.ApplicationIsRunning = false; + } + #endregion +#endif + + #region IGUIPWPForms Members + + /// + /// Launches the ArtifactWall WPForm (if one already exists, relaunches) + /// + /// handle to the Button on the Deskband (used for positioning) + /// true if successful, false otherwise + public bool LaunchArtifactWall(IntPtr hDeskbandButtonWnd) + { + try + { + RECT rect; + bool bFillRect = false; + if (hDeskbandButtonWnd != IntPtr.Zero) + bFillRect = Win32Functions.GetWindowRect(hDeskbandButtonWnd, out rect); + + // First Step - Create the WpfForm + ComponentState.GUIFormsMgr.Create_WpfFormDISP(WPForms.ArtifactWall); + + // Second Step - If we have a Rect, set the location + if (bFillRect) + { + //GUIFormsMgr._Action action = new GUIFormsMgr._Action(delegate(Window wpfForm) + //{ + // wpfForm.Height = nHeight; + // wpfForm.Width = nWidth; + //}); + //ComponentState.GUIFormsMgr.RunAction_WpfFormDISP(WPForms.ArtifactWall, action); + } + + // Third Step - Show the WpfForm + ComponentState.GUIFormsMgr.Show_WpfFormDISP(WPForms.ArtifactWall); + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error Occured", MethodBase.GetCurrentMethod().Name), e); + } + return true; + } + + /// + /// Closes the ArtifactWall if exists + /// + /// true if closed, false if not existent + public bool CloseArtifactWall() + { + try + { + return ComponentState.GUIFormsMgr.Delete_WpfFormDISP(WPForms.ArtifactWall); + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error Occured", MethodBase.GetCurrentMethod().Name), e); + } + return false; + } + + /// + /// Launches the WorkspaceSelector WPForm (if one already exists, relaunches) + /// + /// handle to the Button on the Deskband (used for positioning) + /// true if successful, false otherwise + public bool LaunchWorkspaceSelector(IntPtr hDeskbandButtonWnd) + { + try + { + RECT rect = new RECT(); + rect.top = 0; + rect.left = 0; + bool bSuccess = false; + bool bFillRect = false; + if (hDeskbandButtonWnd != IntPtr.Zero) + bFillRect = Win32Functions.GetWindowRect(hDeskbandButtonWnd, out rect); + + // First Step - Create the WpfForm + bSuccess = ComponentState.GUIFormsMgr.Create_WpfFormDISP(WPForms.WorkspaceSelector); + if (!bSuccess) + return false; + + // Second Step - If we have a Rect, set the location of the Workspace Selector + if (bFillRect) + { + GUIFormsMgr._Action action = new GUIFormsMgr._Action(delegate(Window wpfForm) + { + wpfForm.Top = rect.top + rect.AsRectangle.Height + 2; + wpfForm.Left = rect.left - 200; + }); + bSuccess = ComponentState.GUIFormsMgr.RunAction_WpfFormDISP(WPForms.WorkspaceSelector, action); + if (!bSuccess) + return false; + } + + // Third Step - Show the WpfForm + bSuccess = ComponentState.GUIFormsMgr.Show_WpfFormDISP(WPForms.WorkspaceSelector); + if (!bSuccess) + return false; + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error Occured", MethodBase.GetCurrentMethod().Name), e); + return false; + } + return true; + } + + /// + /// Closes the WorkspaceSelector if exists + /// + /// + /// true if closed, false if not existent + public bool CloseWorkspaceSelector() + { + try + { + return ComponentState.GUIFormsMgr.Delete_WpfFormDISP(WPForms.WorkspaceSelector); + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error Occured", MethodBase.GetCurrentMethod().Name), e); + } + return false; + } + + /// + /// Launches the Settings and Abouts WPForm (if one already exists, relaunches) + /// + /// handle to the Button on the Deskband (used for positioning) + /// true if successful, false otherwise + public bool LaunchSettingsNAboutUs(IntPtr hDeskbandButtonWnd) + { + try + { + // First Step - Create the WpfForm + ComponentState.GUIFormsMgr.Create_WpfFormDISP(WPForms.SettingsNAboutUs); + + // Second Step - Show the WpfForm + ComponentState.GUIFormsMgr.Show_WpfFormDISP(WPForms.SettingsNAboutUs); + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error Occured", MethodBase.GetCurrentMethod().Name), e); + } + return true; + } + + /// + /// Closes the Settings And About us + /// + /// true if closed, false if not existent + public bool CloseSettingsNAboutUs() + { + try + { + return ComponentState.GUIFormsMgr.Delete_WpfFormDISP(WPForms.WorkspaceSelector); + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error Occured", MethodBase.GetCurrentMethod().Name), e); + } + return false; + } + + #endregion + } +} diff --git a/Client Services/GUIWPForms/GUIWPForms.csproj b/Client Services/GUIWPForms/GUIWPForms.csproj new file mode 100644 index 0000000..da59d58 --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms.csproj @@ -0,0 +1,212 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {A02E052C-3C52-43DB-BB30-A47446B8165F} + Library + Properties + Foo.ClientServices.GUIWPForms + GUIWPForms + v3.5 + 512 + {60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} + 4 + + + + + + + + + + + true + MyKeyFile.SNK + + + true + full + false + ..\..\Target\Debug\ + TRACE;DEBUG + prompt + 4 + + + pdbonly + true + ..\..\Target\Release\ + TRACE + prompt + 4 + + + + + False + ..\..\Components\log4net.dll + + + 3.0 + + + 3.0 + + + + 3.5 + + + + + + 3.5 + + + 3.5 + + + + + 3.0 + + + 3.0 + + + + + + + + + + ArtifactWall.xaml + + + SettingsNAboutUs.xaml + + + WorkspaceSelector.xaml + + + + WorkspaceSelector_DeleteWorkspacePage.xaml + + + WorkspaceSelector_NewWorkspacePage.xaml + + + WorkspaceSelector_RenameWorkspacePage.xaml + + + WorkspaceSelector_StandardPage.xaml + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618} + DataAccessLayer + + + {C1282050-455B-44F4-8520-1C005E38EFB2} + GUILib + + + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Platform + + + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35} + WorkspaceMgr + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + MSBuild:Compile + Designer + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + Designer + MSBuild:Compile + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + + + + + + $(FrameworkDir)\regasm.exe "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /unregister +$(FrameworkDir)\regasm.exe "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /tlb:$(TargetName).tlb /codebase +REM $(FrameworkDir)\regsvcs.exe /reconfig "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /appdir:"$(SolutionDir)target\$(ConfigurationName)" + + + \ No newline at end of file diff --git a/Client Services/GUIWPForms/GUIWPForms.csproj.bak b/Client Services/GUIWPForms/GUIWPForms.csproj.bak new file mode 100644 index 0000000..4cea55f --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms.csproj.bak @@ -0,0 +1,129 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {A02E052C-3C52-43DB-BB30-A47446B8165F} + Library + Properties + Foo.ClientServices.GUIWPForms + GUIWPForms + v3.5 + 512 + true + MyKeyFile.SNK + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + False + ..\..\Components\log4net.dll + + + 3.0 + + + 3.0 + + + + 3.5 + + + + + 3.5 + + + 3.5 + + + + + 3.0 + + + 3.0 + + + + + + + + + ArtifactWall.xaml + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Platform + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + MSBuild:Compile + Designer + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + copy "$(TargetDir)$(TargetFileName)" "$(SolutionDir)target\$(ConfigurationName)" /Y +copy "$(TargetDir)$(TargetName).pdb" "$(SolutionDir)target\$(ConfigurationName)" /Y +$(FrameworkDir)\regasm.exe "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /unregister +$(FrameworkDir)\regasm.exe "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /tlb:$(TargetName).tlb /codebase +$(FrameworkDir)\regsvcs.exe /reconfig "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /appdir:"$(SolutionDir)target\$(ConfigurationName)" + + + \ No newline at end of file diff --git a/Client Services/GUIWPForms/GUIWPForms/ArtifactWall.xaml b/Client Services/GUIWPForms/GUIWPForms/ArtifactWall.xaml new file mode 100644 index 0000000..69cd747 --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms/ArtifactWall.xaml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Client Services/GUIWPForms/GUIWPForms/ArtifactWall.xaml.cs b/Client Services/GUIWPForms/GUIWPForms/ArtifactWall.xaml.cs new file mode 100644 index 0000000..455a4dd --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms/ArtifactWall.xaml.cs @@ -0,0 +1,269 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Navigation; +using System.Windows.Shapes; +using System.Windows.Interop; +using System.Windows.Threading; +using System.Threading; + +using Foo.Platform; +using Foo.GUILib; +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; +using System.Data; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// Interaction logic for Window1.xaml + /// + public partial class ArtifactWall : Window + { + private bool m_bPerformanceCache = false; + + // Height and Width Settings + private int m_ItemHeight = 0; + private int m_ItemWidth = 0; + private int m_ImageHeight = 0; + private int m_ImageWidth = 0; + private int m_StackPanelHeight = 0; + private int m_StackPanelWidth = 0; + + // Hard-coded Settings + private const int ITEM_BORDER_THICKNESS = 2; + private const int SELECTION_BORDER_SIZE_MARGIN = 10; + + + // private DT holds all information needed for the DataGrid + public DataTable ArtifactsDT { get; private set; } + + //object CreateImage(string Path) + //{ + // Image myImage1 = new Image(); + // myImage1.Height = HEIGHT; + // myImage1.Width = WIDTH; + // BitmapImage myBitmapImage1 = new BitmapImage(); + // myBitmapImage1.BeginInit(); + // myBitmapImage1.UriSource = new Uri(Path); + // myBitmapImage1.DecodePixelHeight = HEIGHT; + // myBitmapImage1.DecodePixelWidth = WIDTH; + // myBitmapImage1.EndInit(); + // myImage1.Source = myBitmapImage1; + + // //myImage1.Margin = new Thickness(25); + // return myImage1; + //} + + Path CreatePath() + { + LineGeometry myLineGeometry = new LineGeometry(); + myLineGeometry.StartPoint = new Point(10, 50); + myLineGeometry.EndPoint = new Point(1600,50); + + Path myPath = new Path(); + myPath.Stroke = Brushes.Black; + myPath.StrokeThickness = 1; + myPath.Data = myLineGeometry; + return myPath; + } + + void AddWorkspaceArtifacts(string workspaceName) + { + //using (OoganizerState oogyState = new OoganizerState()) + //{ + // oogyState.SetCurrentWorkspace(workspaceName); + + // using (OoganizerAPIProxy proxy = oogyState.GetAPIProxy()) + // { + // Workspace workspace = proxy.API.GetWorkspace(workspaceName); + + // foreach (OoganizerDAL.Artifact artifact in workspace.Artifacts) + // { + // xamCarouselPanel1.ChildElements.Add(CreateImage(artifact.Snapshot_Path)); + // } + // } + //} + } + + private void CalculateHeightAndWidthSettings() + { + + // Image Settings + m_ImageHeight = 627; + m_ImageWidth = 400; + + // StackPanel Settings + const int STACK_PANEL_ITEMS_HEIGHT = 84; // add together the other StackPanel items + m_StackPanelHeight = m_ImageHeight + STACK_PANEL_ITEMS_HEIGHT; + m_StackPanelWidth = m_ImageWidth; + + // Item settings + m_ItemHeight = m_StackPanelHeight + SELECTION_BORDER_SIZE_MARGIN; + m_ItemWidth = m_StackPanelWidth + SELECTION_BORDER_SIZE_MARGIN; + } + + /// + /// + /// + /// + private void UpdateArtifactsWall(SortOrderForWorkspaces sortOrder) + { + // First Step - Clear the DT + ArtifactsDT.Rows.Clear(); + + // Second Step - Calculate Height/Width Settings + CalculateHeightAndWidthSettings(); + + // Third Step - Fill the DT with Artifact Information + ArtifactItem[] artifacts = Data.Artifacts.GetAllArtifactsInTheSystem(SortOrderForArtifacts.MostFrequentlyAccessedAscending); + foreach (ArtifactItem artifact in artifacts) + { + var row = ArtifactsDT.NewRow(); + ArtifactsDT.Rows.Add(row); + + // Border Settings + row["BorderBrush"] = "Aqua"; + row["BorderThickness"] = ITEM_BORDER_THICKNESS; + + // StackPanel Settings + row["StackPanelHeight"] = m_StackPanelHeight; + row["StackPanelWidth"] = m_StackPanelWidth; + row["StackPanelBackground"] = "Transparent"; + + // Image Settings + row["ImagePath"] = artifact.SnapshotFile; + row["ImageHeight"] = m_ImageHeight; + row["ImageWidth"] = m_ImageWidth; + + // Artifact Information + if(artifact.IsFile) + row["Title"] = artifact.Name + " (" + artifact.FileName + ")"; + else if(artifact.IsUrl) + row["Title"] = artifact.Name + " (" + artifact.Location + ")"; + + row["LastLaunch"] = "Last Accessed: " + artifact.LastAccessed.ToString(); + row["FreqLaunch"] = "No. Times Accessed: " + artifact.AccessCounter.ToString(); + row["Notes"] = artifact.Note; + } + + // Third Step - Set xmlCarousel's Item Size + xamCarouselPanel1.ViewSettings.ItemSize = new Size(m_ItemWidth, m_ItemHeight); + + // Fourth Step - Set the number of items * we could change this later* + xamCarouselPanel1.ViewSettings.ItemsPerPage = 3; + + // Fifth Step - Refresh The xmlCarousel + xamCarouselPanel1.ItemsSource = ArtifactsDT.DefaultView; + } + + public ArtifactWall(bool bPerformanceCache) + { + InitializeComponent(); + + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowConstructor(this, bPerformanceCache)) + { + m_bPerformanceCache = true; + } + else + { + // Set Window Position Here + WindowState = WindowState.Maximized; + WindowStartupLocation = WindowStartupLocation.CenterScreen; + + xamCarouselPanel1.ViewSettings.ItemPath = CreatePath(); + xamCarouselPanel1.ViewSettings.ItemHorizontalScrollBarVisibility = ScrollBarVisibility.Hidden; + xamCarouselPanel1.ViewSettings.ItemVerticalScrollBarVisibility = ScrollBarVisibility.Hidden; + xamCarouselPanel1.ViewSettings.AutoScaleItemContentsToFit = true; + xamCarouselPanel1.Focus(); + } + + //WindowInteropHelper hInter = new WindowInteropHelper(this); + //int width = System.Windows.Forms.Screen.FromHandle(hInter.Handle).Bounds.Width; + //int height = System.Windows.Forms.Screen.FromHandle(hInter.Handle).Bounds.Height; + } + + #region Page Events + + private void Window_Loaded(object sender, RoutedEventArgs e) + { + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowOnLoad(this, m_bPerformanceCache)) + { + // Do anything you would like to load + } + else + { + // InitializeArtifactsDT + ArtifactsDT = new DataTable("ArtifactsData"); + + // Border Related Settings + ArtifactsDT.Columns.Add(new DataColumn("BorderBrush", typeof(string))); + ArtifactsDT.Columns.Add(new DataColumn("BorderThickness", typeof(string))); + + // Image related Settings + ArtifactsDT.Columns.Add(new DataColumn("ImagePath", typeof(string))); + ArtifactsDT.Columns.Add(new DataColumn("ImageHeight", typeof(string))); + ArtifactsDT.Columns.Add(new DataColumn("ImageWidth", typeof(string))); + + // StackPanel Settings + ArtifactsDT.Columns.Add(new DataColumn("StackPanelHeight", typeof(string))); + ArtifactsDT.Columns.Add(new DataColumn("StackPanelWidth", typeof(string))); + ArtifactsDT.Columns.Add(new DataColumn("StackPanelBackground", typeof(string))); + + // Artifact Settings + ArtifactsDT.Columns.Add(new DataColumn("Title", typeof(string))); + ArtifactsDT.Columns.Add(new DataColumn("LastLaunch", typeof(string))); + ArtifactsDT.Columns.Add(new DataColumn("FreqLaunch", typeof(string))); + ArtifactsDT.Columns.Add(new DataColumn("Notes", typeof(string))); + + // + UpdateArtifactsWall(SortOrderForWorkspaces.Ascending); + } + } + + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowClosing(this, m_bPerformanceCache)) + { + // Do anything you would like to load + } + else + { + + } + } + + #endregion + + # region Button Click Events + + private void btnClose_Click(object sender, RoutedEventArgs e) + { + this.Close(); + } + + private void btnUp_Click(object sender, RoutedEventArgs e) + { + + } + + private void btnDown_Click(object sender, RoutedEventArgs e) + { + + } + + #endregion + } +} + diff --git a/Client Services/GUIWPForms/GUIWPForms/SettingsNAboutUs.xaml b/Client Services/GUIWPForms/GUIWPForms/SettingsNAboutUs.xaml new file mode 100644 index 0000000..f2be67e --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms/SettingsNAboutUs.xaml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + Auto-Hide Workspaces + + Auto-Save Office Documents + + + + + + + + + + + + + + + + diff --git a/Client Services/GUIWPForms/GUIWPForms/SettingsNAboutUs.xaml.cs b/Client Services/GUIWPForms/GUIWPForms/SettingsNAboutUs.xaml.cs new file mode 100644 index 0000000..90117ee --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms/SettingsNAboutUs.xaml.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +using Foo.GUILib; +using Foo.Platform.Satellite; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// Interaction logic for SettingsNAboutUs.xaml + /// + public partial class SettingsNAboutUs : Window + { + private bool m_bPerformanceCache = false; + + public SettingsNAboutUs(bool bPerformanceCache) + { + InitializeComponent(); + + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowConstructor(this, bPerformanceCache)) + { + m_bPerformanceCache = true; + } + else + { + // Set Window Position Here + WindowStartupLocation = WindowStartupLocation.CenterScreen; + } + } + + #region Internationalization + + private void LoadAllTexts_Internationalization() + { + // Load Tab Headers + tabSettings.Header = GUIResx.GetString("TAB_SETTINGSNABOUTUS_SETTINGS"); + tabHelp.Header = GUIResx.GetString("TAB_SETTINGSNABOUTUS_HELP"); + tabAboutUs.Header = GUIResx.GetString("TAB_SETTINGSNABOUTUS_ABOUTUS"); + + // Load Group Labels + groupBoxWorkspaceSelector.Header = GUIResx.GetString("GROUPBOX_SETTINGABOUTUS_WORKSPACESELECTOR"); + groupBoxArtifactWall.Header = GUIResx.GetString("GROUPBOX_SETTINGABOUTUS_ARTIFACTWALL"); + + // Load Labels + + + + + } + + #endregion + + + #region Window Events + + private void Window_Loaded(object sender, RoutedEventArgs e) + { + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowOnLoad(this, m_bPerformanceCache)) + { + + } + else + { + // Load Texts + LoadAllTexts_Internationalization(); + } + } + + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowClosing(this, m_bPerformanceCache)) + { + + } + else + { + + } + } + + #endregion + + private void btnClose_Click(object sender, RoutedEventArgs e) + { + this.Close(); + } + } +} diff --git a/Client Services/GUIWPForms/GUIWPForms/WorkspaceSelector.xaml b/Client Services/GUIWPForms/GUIWPForms/WorkspaceSelector.xaml new file mode 100644 index 0000000..7e0fefe --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms/WorkspaceSelector.xaml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + diff --git a/Client Services/GUIWPForms/GUIWPForms/WorkspaceSelector.xaml.cs b/Client Services/GUIWPForms/GUIWPForms/WorkspaceSelector.xaml.cs new file mode 100644 index 0000000..c3deb69 --- /dev/null +++ b/Client Services/GUIWPForms/GUIWPForms/WorkspaceSelector.xaml.cs @@ -0,0 +1,249 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; +using System.Windows.Interop; +using System.Reflection; +using System.Windows.Threading; + +using Foo.Platform; +using Foo.GUILib; + + +namespace Foo.ClientServices.GUIWPForms +{ + public enum ChildPages + { + WorkspaceSelector_StandardPage, + WorkspaceSelector_NewWorkspacePage, + WorkspaceSelector_RenameWorkspacePage, + WorkspaceSelector_DeleteWorkspacePage, + } + + /// + /// Interaction logic for WorkspaceSelector.xaml + /// + public partial class WorkspaceSelector : Window + { + private bool m_bPerformanceCache = false; + private Page[] m_ChildPages = null; + + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + // Allow Childresn access to the Frame + public Frame WorkspaceSelectorFrm { get { return frmWorkspaceSelector; } } + + // Allow Children to overwrite MouseLeave Close Behavior + public bool DontCloseOnMouseLeave { get; set; } + + // Allow Children access to margin top/bottom + public int MarginTopBottom { get; set; } + + // internal flags + private bool m_bMouseFirstTimeEnter = false; + private bool m_bMouseHasEnteredBack = false; + private bool m_bMouseLeaveTimerCreated = false; + + /// + /// Child Page Creation Factory * should only be called internally * + /// + /// the page to instantiate + /// a new page object or null + private Page CreateChildPage(ChildPages page) + { + Page pageObj = null; + switch (page) + { + case ChildPages.WorkspaceSelector_NewWorkspacePage: + pageObj = new WorkspaceSelector_NewWorkspacePage(m_bPerformanceCache); + break; + + case ChildPages.WorkspaceSelector_RenameWorkspacePage: + pageObj = new WorkspaceSelector_RenameWorkspacePage(m_bPerformanceCache); + break; + + case ChildPages.WorkspaceSelector_DeleteWorkspacePage: + pageObj = new WorkspaceSelector_DeleteWorkspacePage(m_bPerformanceCache); + break; + + case ChildPages.WorkspaceSelector_StandardPage: + pageObj = new WorkspaceSelector_StandardPage(m_bPerformanceCache); + break; + } + return pageObj; + } + + /// + /// Use this to actually navigate to a child page object on the WorkspaceSelector + /// + /// a page to navigate to + public void NavigateToChildPage(ChildPages page) + { + try + { + Page pageObj = CreateChildPage(page); + if (pageObj != null) + { + pageObj.Tag = this; // pass out this object + if (!frmWorkspaceSelector.Navigate(pageObj)) + Log.Info(string.Format("{0}() - WorkspaceSelector could not navigate to ChildPage {1}", MethodBase.GetCurrentMethod().Name, (int)page)); + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error Thrown", MethodBase.GetCurrentMethod().Name, e)); + } + } + + /// + /// WorkspaceSelector Constructor - set's default values for the object + /// Instantiates all child pages when in Performance Mode + /// + /// true if this is a cached form for performance, false every other time + public WorkspaceSelector(bool bPerformanceCache) + { + InitializeComponent(); + + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowConstructor(this, bPerformanceCache)) + { + m_bPerformanceCache = true; + + // Performance Load the Child Pages as well + int n = Enum.GetValues(typeof(ChildPages)).Length; + m_ChildPages = new Page[n]; + + // Iterate thru enums and create the corresponding objects in the Cache + for (int i = 0; i < n; ++i) + { + ChildPages page = (ChildPages)Enum.ToObject(typeof(ChildPages), i); + m_ChildPages[i] = CreateChildPage(page); + } + } + + // By default allow mouse leave to close the form + DontCloseOnMouseLeave = false; + + // MarginTopBottom is the space up and below the frame 2 * 6 = 12 (but we want 2 pixels trimmed) + MarginTopBottom = 10; + } + + #region Window Events + + /// + /// Window Load Event - Hook into MessageHook if in performance mode, + /// otherwise load default child + /// + private void Window_Loaded(object sender, RoutedEventArgs e) + { + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowOnLoad(this, m_bPerformanceCache)) + { + // To Anything her you may want to do + } + else + { + // Navigate to the Default Page + NavigateToChildPage(ChildPages.WorkspaceSelector_StandardPage); + + // Set the GUI State to this object + GUIState.CurrentlyShowingWPFWindow = this; + + // Start the Load Mouse Enter Timer for 1.5 seconds + DispatcherTimer dispatcherTimer = new DispatcherTimer(); + dispatcherTimer.Tick += new EventHandler(dispatcherTimerOnLoadMouseEnter_Tick); + dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1, 500); + dispatcherTimer.Start(); + } + } + + /// + /// keep track of window closed + /// + private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) + { + // * For Performance Caching * + if (WPFHiddenWindow.HiddenWindowClosing(this, m_bPerformanceCache)) + { + // To Anything her you may want to do + } + else + { + // Set the GUI State to this object + GUIState.CurrentlyShowingWPFWindow = null; + } + } + + /// + /// Keep track of mouse enter + /// + private void Window_MouseEnter(object sender, MouseEventArgs e) + { + m_bMouseFirstTimeEnter = true; + m_bMouseHasEnteredBack = true; + } + + /// + /// General Standard behavior - Close the form on Mouse Leave, except when + /// children overwrite this behavior via DontCloseOnMouseLeave + /// + private void Window_MouseLeave(object sender, MouseEventArgs e) + { + m_bMouseHasEnteredBack = false; + if (!m_bMouseLeaveTimerCreated) + { + // Start Mouse Leave Timer for 1.5 seconds + DispatcherTimer dispatcherTimer = new DispatcherTimer(); + dispatcherTimer.Tick += new EventHandler(dispatcherTimerMouseLeave_Tick); + dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 1, 500); + dispatcherTimer.Start(); + + // Set flag + m_bMouseLeaveTimerCreated = true; + } + } + + #endregion + + /// + /// Run One Time - after Mouse Leaves. Closes Form if Mouse has not entered + /// + void dispatcherTimerMouseLeave_Tick(object sender, EventArgs e) + { + // Turn off the timer + DispatcherTimer dispatcherTimer = (DispatcherTimer)sender; + dispatcherTimer.Stop(); + m_bMouseLeaveTimerCreated = false; + + // Close this window, but only if the mouse has not entered back || + // we are told not to do it + if (!m_bMouseHasEnteredBack && !DontCloseOnMouseLeave) + this.Close(); + } + + /// + /// Run One Time - Upon Load. Closes form if mouse has not entered + /// + void dispatcherTimerOnLoadMouseEnter_Tick(object sender, EventArgs e) + { + // We only want to run this timer Once * Always * + DispatcherTimer dispatcherTimer = (DispatcherTimer)sender; + dispatcherTimer.Stop(); + + // Close this window, but only if the mouse has not entered back + // Close this Form *always* + if (!m_bMouseFirstTimeEnter && !DontCloseOnMouseLeave) + this.Close(); + } + + } +} diff --git a/Client Services/GUIWPForms/IGUIWPForms.cs b/Client Services/GUIWPForms/IGUIWPForms.cs new file mode 100644 index 0000000..ea6875a --- /dev/null +++ b/Client Services/GUIWPForms/IGUIWPForms.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Runtime.InteropServices; + +namespace Foo.ClientServices.GUIWPForms +{ + /// + /// GUIPWPForms uses IGUIPWPForms Interface. It exposes functions to external + /// callers regarding the type of GUIWPForms we can launch. + /// ~Most functions require an hWnd which is the DeskbandButton to properly Position the form. + /// ~However if hWnd is Zero and we are in Debug we just center it. * For Debugging Purpose * + /// + [Guid("652DDE0A-D3FA-4525-8272-1616127819D2")] + [InterfaceType(ComInterfaceType.InterfaceIsDual)] + [ComVisible(true)] + public interface IGUIPWPForms + { + // ArtifactWall + bool LaunchArtifactWall(IntPtr hDeskbandButtonWnd); + bool CloseArtifactWall(); + + // WorkspaceSelector + bool LaunchWorkspaceSelector(IntPtr hDeskbandButtonWnd); + bool CloseWorkspaceSelector(); + + // Settings N' About Us Page + bool LaunchSettingsNAboutUs(IntPtr hDeskbandButtonWnd); + bool CloseSettingsNAboutUs(); + } +} diff --git a/Client Services/GUIWPForms/MyKeyFile.SNK b/Client Services/GUIWPForms/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/Client Services/GUIWPForms/Properties/AssemblyInfo.cs b/Client Services/GUIWPForms/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..8a9f4bf --- /dev/null +++ b/Client Services/GUIWPForms/Properties/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Windows; +using System.EnterpriseServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GUIWPForms")] +[assembly: AssemblyDescription("Performance Caching for GUIWPForms")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Ooganizer Corporation")] +[assembly: AssemblyProduct("GUIWPForms")] +[assembly: AssemblyCopyright("Copyright © Ooganizer Corporation 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(true)] +[assembly: ApplicationID("E6A84616-5ED1-4679-B26D-64F80A5E41CD")] +[assembly: ApplicationActivation(ActivationOption.Server)] +[assembly: ApplicationAccessControl(Value = false, Authentication = AuthenticationOption.None)] +[assembly: ApplicationName("Foo.ClientServices")] +[assembly: Description("Provides Data Access and Performance Caching for Ooganizer Components")] + +//In order to begin building localizable applications, set +//CultureYouAreCodingWith in your .csproj file +//inside a . For example, if you are using US english +//in your source files, set the to en-US. Then uncomment +//the NeutralResourceLanguage attribute below. Update the "en-US" in +//the line below to match the UICulture setting in the project file. + +//[assembly: NeutralResourcesLanguage("en-US", UltimateResourceFallbackLocation.Satellite)] + +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Client Services/GUIWPForms/Properties/Resources.Designer.cs b/Client Services/GUIWPForms/Properties/Resources.Designer.cs new file mode 100644 index 0000000..2a780dd --- /dev/null +++ b/Client Services/GUIWPForms/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.ClientServices.GUIWPForms.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Foo.ClientServices.GUIWPForms.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Client Services/GUIWPForms/Properties/Resources.resx b/Client Services/GUIWPForms/Properties/Resources.resx new file mode 100644 index 0000000..85c9090 --- /dev/null +++ b/Client Services/GUIWPForms/Properties/Resources.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Client Services/GUIWPForms/Properties/Settings.Designer.cs b/Client Services/GUIWPForms/Properties/Settings.Designer.cs new file mode 100644 index 0000000..d100d52 --- /dev/null +++ b/Client Services/GUIWPForms/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.ClientServices.GUIWPForms.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Client Services/GUIWPForms/Properties/Settings.settings b/Client Services/GUIWPForms/Properties/Settings.settings new file mode 100644 index 0000000..15034e7 --- /dev/null +++ b/Client Services/GUIWPForms/Properties/Settings.settings @@ -0,0 +1,6 @@ + + + + + + diff --git a/Client Services/GUIWPForms/Properties/licenses.licx b/Client Services/GUIWPForms/Properties/licenses.licx new file mode 100644 index 0000000..e8ba8ea --- /dev/null +++ b/Client Services/GUIWPForms/Properties/licenses.licx @@ -0,0 +1 @@ +Infragistics.Windows.Controls.XamCarouselListBox, Infragistics3.Wpf.v8.2, Version=8.2.20082.1002, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb diff --git a/Components/log4net.dll b/Components/log4net.dll new file mode 100644 index 0000000000000000000000000000000000000000..ffc57e11254ad9530867b35d15aaf38eb4747d8d GIT binary patch literal 270336 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 + /// Private Properties + /// + private static string _dbPath = "C:\\_ROOT_\\TestANizer\\DataAccessLayer"; + private static string _dbName = "OggyNize.sdf"; + private static string _dbPassword = "1kso123!~~!@"; + private static string _connString { get { return String.Format("Data Source={0}\\{1}; encryption mode=platform default; Password=\"{2}\"; Encrypt = TRUE;", Path.GetFullPath(_dbPath), _dbName, _dbPassword); } } + + /// + /// Public Properties + /// + public static bool DoesDBExist { get { return (File.Exists(_dbPath + "\\" + _dbName)); } } + + /// + /// Use this to create the Default Database + /// + public static void CreateDefaultDB() + { + CreateDB(_dbPath, _dbName, _dbPassword); + } + + /// + /// Use this to delete the Default Database + /// + public static void DeleteDefaultDB() + { + if (!String.IsNullOrEmpty(_dbPath) && + !String.IsNullOrEmpty(_dbName) && + Directory.Exists(_dbPath) && + File.Exists(_dbPath + "\\" + _dbName)) + { + File.Delete(_dbPath + "\\" + _dbName); + } + } + + /// + /// Use this function to create a New Database, if it doesn't already exist + /// + /// Path to the Database + /// Name of the Database + /// Password to use on the Database + internal static void CreateDB(string dbPath, string dbName, string dbPassword) + { + try + { + if (dbPath.Length > 3 && dbPath[dbPath.Length - 1] == '\\') + dbPath = dbPath.Remove(dbPath.Length - 1); + + if (!String.IsNullOrEmpty(dbName) && !dbName.ToLower().Contains(".sdf")) + dbName = dbName + ".sdf"; + + if (!String.IsNullOrEmpty(dbPath) && + !String.IsNullOrEmpty(dbName) && + Directory.Exists(dbPath) && + !File.Exists(dbPath + "\\" + dbName)) + { + _dbPath = dbPath; + _dbName = dbName; + _dbPassword = dbPassword; + using (SqlCeEngine engine = new SqlCeEngine(_connString)) + { + engine.CreateDatabase(); + } + + // This will now Construct all the necessary Tables + // we need ~very nice and automatic + CreateInitialDBTables(); + } + } + catch (Exception) { /* ignore */ } + } + + /// + /// Responsible for creating all the initial Tables for the database + /// + private static void CreateInitialDBTables() + { + foreach (string TableResourceName in ResourceHelper.GetTableResourceNames()) + { + string strSQL = ResourceHelper.GetTextSqlFromResourceFile(TableResourceName); + string[] strCommands = strSQL.Split(';'); + + foreach (string strCommand in strCommands) + { + // Is there a Label + if (strCommand.Contains(':')) + { + string[] strLabelAndCommand = strCommand.Split(':'); + string strLabel = strLabelAndCommand[0]; + string strCommand2 = strLabelAndCommand[1]; + + // Save the Label in the Version Map + string strTableName = ResourceHelper.GetTableNameFromTableResourceName(TableResourceName); + ResourceHelper.s_VersioningTablesMap[strTableName] = strLabel; + + // Run the Command + RunSQLCommandTextExecuteNonQuery(strCommand2.Trim()); + } + else + { + RunSQLCommandTextExecuteNonQuery(strCommand.Trim()); + } + } + } + + // Now that all Tables are created, we can now save the VersionMap into the Database + dVersioningTables versionTable = new dVersioningTables(); + foreach (string key in ResourceHelper.s_VersioningTablesMap.Keys) + versionTable.AddUpdateVersionInformationForSpecifiedTable(key, ResourceHelper.s_VersioningTablesMap[key]); + } + + /// + /// Use this to Run SQL with the ExecuteNonQuery() Command Object + /// + /// SQL Text/Commands to execute + /// the result of the ExecuteNonQuery() operation + internal static int RunSQLCommandTextExecuteNonQuery(string SqlCommandText) + { + int nResult = -1; + try + { + using (SqlCeConnection conn = new SqlCeConnection(_connString)) + { + conn.Open(); + using (SqlCeCommand cmd = conn.CreateCommand()) + { + cmd.CommandText = SqlCommandText; + nResult = cmd.ExecuteNonQuery(); + } + } + } + catch (Exception) { /* ignore */ } + return nResult; + } + + /// + /// Use this to Run SQL with the ExecuteNonQuery() Command Object + /// + /// SQL Text/Commands to execute + /// Allows the use of sql parameters + /// the result of the ExecuteNonQuery() operation + internal static int RunSQLCommandTextExecuteNonQuery(string SqlCommandText, SqlCeParameter[] parameters) + { + int nResult = -1; + try + { + using (SqlCeConnection conn = new SqlCeConnection(_connString)) + { + conn.Open(); + using (SqlCeCommand cmd = conn.CreateCommand()) + { + cmd.CommandText = SqlCommandText; + foreach (SqlCeParameter parameter in parameters) + cmd.Parameters.Add(parameter); + nResult = cmd.ExecuteNonQuery(); + } + } + } + catch (Exception) { /* ignore */ } + return nResult; + } + + /// + /// Use this to Run SQL with the ExecuteScalar() Command Object + /// + /// SQL Text/Commands to execute + /// the result of the ExecuteScalar() operation + internal static object RunSQLCommandTextExecuteScalar(string SqlCommandText) + { + object oResult = null; + try + { + using (SqlCeConnection conn = new SqlCeConnection(_connString)) + { + conn.Open(); + using (SqlCeCommand cmd = conn.CreateCommand()) + { + cmd.CommandText = SqlCommandText; + oResult = cmd.ExecuteScalar(); + } + } + } + catch (Exception) { /* ignore */ } + + // Try Parsing the oResult, if an error occurs return null + try + { + if (String.IsNullOrEmpty(oResult.ToString())) + oResult = null; + } + catch (Exception) { oResult = null; } + return oResult; + } + + /// + /// Use this to Run SQL with the ExecuteScalar() Command Object + /// + /// SQL Text/Commands to execute + /// Allows the use of sql parameters + /// the result of the ExecuteScalar() operation + internal static object RunSQLCommandTextExecuteScalar(string SqlCommandText, SqlCeParameter[] parameters) + { + object oResult = null; + try + { + using (SqlCeConnection conn = new SqlCeConnection(_connString)) + { + conn.Open(); + using (SqlCeCommand cmd = conn.CreateCommand()) + { + cmd.CommandText = SqlCommandText; + foreach (SqlCeParameter parameter in parameters) + cmd.Parameters.Add(parameter); + oResult = cmd.ExecuteScalar(); + } + } + } + catch (Exception) { /* ignore */ } + + // Try Parsing the oResult, if an error occurs return null + try + { + if (String.IsNullOrEmpty(oResult.ToString())) + oResult = null; + } + catch (Exception) { oResult = null; } + return oResult; + } + + /// + /// Use this to Run SQL with the DataAdapter Fill() + /// + /// SQL Text to execute + /// the result of the DataAdapter Fill() operation + internal static DataSet RunSQLTextFillDataSet(string SqlText) + { + DataSet dataset = new DataSet(); + try + { + using (SqlCeConnection conn = new SqlCeConnection(_connString)) + { + conn.Open(); + using (SqlCeDataAdapter dataAdapter = new SqlCeDataAdapter(SqlText, conn)) + { + dataAdapter.Fill(dataset); + } + } + } + catch (Exception) { /* ignore */ } + return dataset; + } + + /// + /// Use this to Run SQL with the DataAdapter Fill() + /// + /// SQL Text to execute + /// Allows the use of sql parameters + /// the result of the DataAdapter Fill() operation + internal static DataSet RunSQLTextFillDataSet(string SqlText, SqlCeParameter[] parameters) + { + DataSet dataset = new DataSet(); + try + { + using (SqlCeConnection conn = new SqlCeConnection(_connString)) + { + conn.Open(); + using (SqlCeCommand cmd = conn.CreateCommand()) + { + cmd.CommandText = SqlText; + foreach (SqlCeParameter parameter in parameters) + cmd.Parameters.Add(parameter); + + using (SqlCeDataAdapter dataAdapter = new SqlCeDataAdapter(cmd)) + { + dataAdapter.Fill(dataset); + } + } + } + } + catch (Exception) { /* ignore */ } + return dataset; + } + } +} diff --git a/DataAccessLayer/Data.cs b/DataAccessLayer/Data.cs new file mode 100644 index 0000000..86d1b84 --- /dev/null +++ b/DataAccessLayer/Data.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.DataAccessLayer +{ + public class Data + { + /// + /// Public Properties + /// + public static dArtifacts Artifacts { get { return _artifacts; } } + public static dWorkspace Workspace { get { return _workspace; } } + public static dState State { get { return _state; } } + public static dUserSettings UserSettings { get { return _UserSettings; } } + + /// + /// Internal Properties + /// + internal static dVersioningTables VersioningTables { get { return _VersioningTables; } } + + /// + /// Private Locations for above Properties + /// + private static dArtifacts _artifacts; + private static dWorkspace _workspace; + private static dState _state; + private static dVersioningTables _VersioningTables; + private static dUserSettings _UserSettings; + + static Data() + { + // Upon First Instantiation of Data, + // ensure that the Default DB Exists + DB.CreateDefaultDB(); + + // Load All Public Data Types + _artifacts = new dArtifacts(); + _workspace = new dWorkspace(); + _state = new dState(); + _UserSettings = new dUserSettings(); + + // Load All Internal Data Types + _VersioningTables = new dVersioningTables(); + } + } +} diff --git a/DataAccessLayer/DataAccessLayer.csproj b/DataAccessLayer/DataAccessLayer.csproj new file mode 100644 index 0000000..8c84f88 --- /dev/null +++ b/DataAccessLayer/DataAccessLayer.csproj @@ -0,0 +1,224 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618} + Library + Properties + Foo.DataAccessLayer + DataAccessLayer + v3.5 + 512 + true + MyKeyFile.SNK + + + true + full + false + ..\Target\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\Target\Release\ + TRACE + prompt + 4 + + + + + + 3.5 + + + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + + + + + + + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DataAccessLayer/DataTypes.cs b/DataAccessLayer/DataTypes.cs new file mode 100644 index 0000000..3af222e --- /dev/null +++ b/DataAccessLayer/DataTypes.cs @@ -0,0 +1,564 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Data.SqlTypes; +using System.Data; + +namespace Foo.DataAccessLayer.DataTypes +{ + // ArtifactTypes + public enum ArtifactTypes + { + File, + Url + } + + // Artifacts + public enum SortOrderForArtifacts + { + None, + Ascending, + Descending, + LocationAscending, + LocationDescending, + LastAccessedAscending, + LastAccessedDescending, + MostFrequentlyAccessedAscending, + MostFrequentlyAccessedDescending + } + + // Workspaces + public enum SortOrderForWorkspaces + { + None, + Ascending, + Descending, + LastAccessedAscending, + LastAccessedDescending, + MostFrequentlyAccessedAscending, + MostFrequentlyAccessedDescending + } + + /// + /// This class holds the SortOrder Helper SQL functions for the SortOrder Enums listed above + /// + public class SortOrderSQLHelpers + { + /// + /// Use this to create the OrderBy Clause for the Workspace SortOrder Function + /// + /// sql string to add sortOrder to + /// the Workspace SortOrder Enum + /// modified SQL String + public static string SortOrderForArtifactsHelper(string sql, SortOrderForArtifacts sortOrder) + { + switch (sortOrder) + { + case SortOrderForArtifacts.None: + break; + + case SortOrderForArtifacts.Ascending: + sql = sql + " ORDER BY [Artifacts].[Name] ASC"; + break; + + case SortOrderForArtifacts.Descending: + sql = sql + " ORDER BY [Artifacts].[Name] DESC"; + break; + + case SortOrderForArtifacts.LastAccessedAscending: + sql = sql + " ORDER BY [Artifacts].[LastAccessed] ASC"; + break; + + case SortOrderForArtifacts.LastAccessedDescending: + sql = sql + " ORDER BY [Artifacts].[LastAccessed] DESC"; + break; + + case SortOrderForArtifacts.LocationAscending: + sql = sql + " ORDER BY [Artifacts].[Location] ASC"; + break; + + case SortOrderForArtifacts.LocationDescending: + sql = sql + " ORDER BY [Artifacts].[Location] DESC"; + break; + + case SortOrderForArtifacts.MostFrequentlyAccessedAscending: + sql = sql + " ORDER BY [Artifacts].[AccessCounter] ASC"; + break; + + case SortOrderForArtifacts.MostFrequentlyAccessedDescending: + sql = sql + " ORDER BY [Artifacts].[AccessCounter] DESC"; + break; + } + return sql; + } + + /// + /// Use this to create the OrderBy Clause for the Workspace SortOrder Function + /// + /// sql string to add sortOrder to + /// the Workspace SortOrder Enum + /// modified SQL String + public static string SortOrderForWorkspacesHelper(string sql, SortOrderForWorkspaces sortOrder) + { + switch (sortOrder) + { + case SortOrderForWorkspaces.None: + break; + + case SortOrderForWorkspaces.Ascending: + sql = sql + " ORDER BY [Workspaces].[Name] ASC"; + break; + + case SortOrderForWorkspaces.Descending: + sql = sql + " ORDER BY [Workspaces].[Name] DESC"; + break; + + case SortOrderForWorkspaces.LastAccessedAscending: + sql = sql + " ORDER BY [Workspaces].[LastAccessed] ASC"; + break; + + case SortOrderForWorkspaces.LastAccessedDescending: + sql = sql + " ORDER BY [Workspaces].[LastAccessed] DESC"; + break; + + case SortOrderForWorkspaces.MostFrequentlyAccessedAscending: + sql = sql + " ORDER BY [Workspaces].[AccessCounter] ASC"; + break; + + case SortOrderForWorkspaces.MostFrequentlyAccessedDescending: + sql = sql + " ORDER BY [Workspaces].[AccessCounter] DESC"; + break; + } + return sql; + } + } + + /// + /// Validation Classes + /// + public class DataTypeValidation + { + /// + /// Checks the logistics of the WorkspaceName (not the DB) + /// + /// true if valid logistically, false otherwise + public static bool IsValidWorkspaceName(string WorkspaceName) + { + if ((String.IsNullOrEmpty(WorkspaceName)) || + (WorkspaceName.Length < 1) || + (WorkspaceName.Length > 75)) + return false; + else + return true; + } + + /// + /// Use this to check the return of an ArtifactItemGroup + /// + /// ArtifactGroup + /// true if ArtifactItemGroup is Empty, false otherwise + public static bool IsEmptyArtifactItemGroup(ArtifactItem[] artifactItems) + { + if ((artifactItems.Length == 1) && !artifactItems[0].IsLocationValid) + return true; + else + return false; + } + + /// + /// Use this to check the return of an WorkspaceItemGroup + /// + /// WorkspaceItemGroup + /// true if WorkspaceItemGroup is Empty, false otherwise + public static bool IsEmptyWorkspaceItemGroup(WorkspaceItem[] workspaceItems) + { + if ((workspaceItems.Length == 1) && !workspaceItems[0].IsValid) + return true; + else + return false; + } + + /// + /// Uset this for quick and easy DataSet Validation + /// + /// a dataset object + /// true if dataset is empty, false otherwise + public static bool IsEmptyDataSet(DataSet dataset) + { + if ((dataset == null) || + (dataset.Tables.Count == 0) || + ((dataset.Tables.Count == 1) && (dataset.Tables[0].Rows.Count <= 0))) + { + return true; + } + return false; + } + + /// + /// For internal use only - Check if the TableName entered is Valid + /// + /// a table name + /// true if valid logistically, false otherwise + internal static bool IsValidTableName(string TableName) + { + if ((String.IsNullOrEmpty(TableName)) || + (TableName.Length < 1) || + (TableName.Length > 75)) + return false; + else + return true; + } + + /// + /// For internal use only - Check to see if Version information is valid + /// + /// Version Information for a table + /// true if valid logistically, false otherwise + internal static bool IsValidVersionInformation(string VersionInformation) + { + bool bIsValid = (!String.IsNullOrEmpty(VersionInformation) && (VersionInformation.Length == 8)); + if (bIsValid) + { + string[] versionEntities = VersionInformation.Split('.'); + bIsValid = (versionEntities.Length == 3); + } + return (bIsValid); + } + } + + /// + /// Helper Classes + /// + public class DataTypeHelpers + { + /// + /// Many Artifact Checking Functions (Except for Insert/modify) Only need the location, + /// So if you have a location, use this function to create a quick Artifact to use in those + /// checking functions + /// + /// + /// + public static ArtifactItem CreateLocationOnlyArtifact(string location) + { + ArtifactItem artifactItem = new ArtifactItem() + { + Location = location + }; + return artifactItem; + } + + /// + /// Use this to create an empty ArtifactItemGroup (should only be used internally) + /// + /// An Empty ArtifactItemGroups + internal static ArtifactItem[] EmptyArtifactItemGroup() + { + ArtifactItem[] artifactItems = new ArtifactItem[] { new ArtifactItem() { Location = "" } }; + return artifactItems; + } + + /// + /// Use this to create an empty WorkspaceItemGroup (should only be used internally) + /// + /// An Empty WorkspaceItemGroups + internal static WorkspaceItem[] EmptyWorkspaceItemGroup() + { + WorkspaceItem[] workspaceItems = new WorkspaceItem[] { new WorkspaceItem() { Name = "" } }; + return workspaceItems; + } + + } + + /// + /// Use this class for some of our Workspace Methods. Holds Workspace Information as well + /// as performs Validation. + /// + public class WorkspaceItem + { + public string Name { get; set; } + public DateTime LastAccessed { get; private set; } + public int AccessCounter { get; set; } + + // Needed to make sure that dateTime is within limits of SQL, + // Otherwise SQL stmt may generate an error + public bool SetLastAccessed(DateTime dateTime) + { + if (dateTime >= SqlDateTime.MinValue.Value && + dateTime <= SqlDateTime.MaxValue.Value) + { + LastAccessed = dateTime; + return true; + } + return false; + } + + // *Custom Tag Property * To be used by Callers to tag the object + public string Tag { get; set; } + + // default + public WorkspaceItem() + { + Name = ""; + LastAccessed = SqlDateTime.MinValue.Value; + AccessCounter = 0; + + // Tag + Tag = ""; + } + + /// + /// Performs basic Type Validity Tests + /// + public bool IsValid + { + get + { + if ((Name.Length > 1) && + (Name.Length <= 75) && + (AccessCounter >= 0) && + (LastAccessed != SqlDateTime.MinValue.Value) + ) + { + return true; + } + else + { + return false; + } + } + } + + #region ICloneable Members + public object Clone() + { + return this.MemberwiseClone(); + } + #endregion + } + + /// + /// Use this Class for all our Artifact Methods. Holds Artifact Information as well + /// as performs Validation. Use IsValidFileIntegrity() for IO validation + /// + public class ArtifactItem : ICloneable + { + public String Name { get; set; } + public ArtifactTypes Type { get; set; } + public String Location { get; set; } + public String Note { get; set; } + public String SnapshotFile { get; set; } + public DateTime LastAccessed { get; private set; } + public int AccessCounter { get; set; } + + // Needed to make sure that dateTime is within limits of SQL, + // Otherwise SQL stmt may generate an error + public bool SetLastAccessed(DateTime dateTime) + { + if (dateTime >= SqlDateTime.MinValue.Value && + dateTime <= SqlDateTime.MaxValue.Value) + { + LastAccessed = dateTime; + return true; + } + return false; + } + + // default + public ArtifactItem() + { + SetAsFileType(); + Name = ""; + Location = ""; + Note = ""; + SnapshotFile = ""; + + // LinkProperties + WindowTop = 0; + WindowLeft = 0; + WindowHeight = 0; + WindowWidth = 0; + + // Access properties + LastAccessed = SqlDateTime.MinValue.Value; + AccessCounter = 0; + + // Tag + Tag = ""; + } + + // Type Check + public bool IsUrl { get { return Type == ArtifactTypes.Url; } } + public bool IsFile { get { return Type == ArtifactTypes.File; } } + + // Type Helpers + public string FileName + { + get + { + if (IsFile) + { + int nIndex = Location.LastIndexOf('\\'); + if (nIndex > 0 && nIndex < Location.Length) + return Location.Substring((nIndex + 1)); + } + return String.Empty; + } + } + public string FileLocation + { + get + { + if (IsFile) + { + int nIndex = Location.LastIndexOf('\\'); + if (nIndex > 0 && nIndex < Location.Length) + return Location.Substring(0,nIndex); + } + return String.Empty; + } + } + + // Type Setting + public void SetAsFileType() { Type = ArtifactTypes.File; } + public void SetAsUrlType() { Type = ArtifactTypes.Url; } + public bool SetType(string strType) + { + if (strType.ToUpper() == "FILE") + { + SetAsFileType(); + return true; + } + else if (strType.ToUpper() == "URL") + { + SetAsUrlType(); + return true; + } + else + { + return false; + } + } + + // Setters + public bool SetFile(string fileNameAndLocation) + { + if ((fileNameAndLocation.Length > 1) && File.Exists(fileNameAndLocation)) + { + SetAsFileType(); + Location = fileNameAndLocation; + return true; + } + return false; + } + public bool SetUrl(string Url) + { + if ((Url.Length > 1)) // To Do - Better Url Checking + { + SetAsUrlType(); + Location = Url; + return true; + } + return false; + } + + // *Custom Tag Property * To be used by Callers to tag the object + public string Tag { get; set; } + + /// + /// This Information is used by the link in the Workspace. + /// ~This information is only filed in the artifact when being retrieved + /// from a workspace which has link information + /// + public int WindowTop { get; set; } + public int WindowLeft { get; set; } + public int WindowHeight { get; set; } + public int WindowWidth { get; set; } + + /// + /// Use this function to do proper validation of the Link Properties + /// + public bool AreWorkspaceLinkPropertiesValid + { + get + { + if ((WindowHeight > 0) && + (WindowWidth > 0)) + return true; + else + return false; + } + } + + /// + /// Performs basic Type Validity Tests + /// + public bool IsValid + { + get + { + if((Name.Length > 1) && + (Name.Length <= 150) && + (Location.Length > 1) && + (Location.Length <= 300) && + (Note.Length <= 3000) && + (SnapshotFile.Length > 1) && + (SnapshotFile.Length <= 300) && + (AccessCounter >= 0) //&& + //(LastAccessed != SqlDateTime.MinValue.Value) + ) + { + return true; + } + else + { + return false; + } + } + } + + /// + /// Since Artifact Location is our main source of determining + /// existence (this provides an easy check only for valid location) + /// + public bool IsLocationValid + { + get + { + if ((Location.Length > 1) && + (Location.Length <= 300)) + return true; + else + return false; + } + } + + /// + /// Performs Advanced File Validity Tests + /// + public bool IsValidFileIntegrity + { + get + { + if (IsFile && !File.Exists(Location)) + return false; + + // To Do * Check if is Valid Url * + + if (!File.Exists(SnapshotFile)) + return false; + + return true; + } + } + + #region ICloneable Members + public object Clone() + { + return this.MemberwiseClone(); + } + #endregion + } + +} diff --git a/DataAccessLayer/MyKeyFile.SNK b/DataAccessLayer/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/DataAccessLayer/Properties/AssemblyInfo.cs b/DataAccessLayer/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..d1bc0a6 --- /dev/null +++ b/DataAccessLayer/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("DataAccessLayer")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DataAccessLayer")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("4eac069e-728a-48b2-989e-0be548d211ef")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/DataAccessLayer/Properties/Resources.Designer.cs b/DataAccessLayer/Properties/Resources.Designer.cs new file mode 100644 index 0000000..7458a06 --- /dev/null +++ b/DataAccessLayer/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.DataAccessLayer.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Foo.DataAccessLayer.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/DataAccessLayer/Properties/Resources.resx b/DataAccessLayer/Properties/Resources.resx new file mode 100644 index 0000000..5ea0895 --- /dev/null +++ b/DataAccessLayer/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/DataAccessLayer/Properties/Settings.Designer.cs b/DataAccessLayer/Properties/Settings.Designer.cs new file mode 100644 index 0000000..d7fe635 --- /dev/null +++ b/DataAccessLayer/Properties/Settings.Designer.cs @@ -0,0 +1,37 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.DataAccessLayer.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.ApplicationScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.SpecialSettingAttribute(global::System.Configuration.SpecialSetting.ConnectionString)] + [global::System.Configuration.DefaultSettingValueAttribute("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\\TestData\\Files\\DupF" + + "iles2\\DatabaseBills.accdb;Persist Security Info=True")] + public string DatabaseBillsConnectionString { + get { + return ((string)(this["DatabaseBillsConnectionString"])); + } + } + } +} diff --git a/DataAccessLayer/Properties/Settings.settings b/DataAccessLayer/Properties/Settings.settings new file mode 100644 index 0000000..cf1ae0b --- /dev/null +++ b/DataAccessLayer/Properties/Settings.settings @@ -0,0 +1,14 @@ + + + + + + <?xml version="1.0" encoding="utf-16"?> +<SerializableConnectionString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> + <ConnectionString>Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TestData\Files\DupFiles2\DatabaseBills.accdb;Persist Security Info=True</ConnectionString> + <ProviderName>System.Data.OleDb</ProviderName> +</SerializableConnectionString> + Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\TestData\Files\DupFiles2\DatabaseBills.accdb;Persist Security Info=True + + + \ No newline at end of file diff --git a/DataAccessLayer/ResourceHelper.cs b/DataAccessLayer/ResourceHelper.cs new file mode 100644 index 0000000..ac9adf3 --- /dev/null +++ b/DataAccessLayer/ResourceHelper.cs @@ -0,0 +1,68 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Reflection; +using System.IO; +using System.Collections.Specialized; + +namespace Foo.DataAccessLayer +{ + class ResourceHelper + { + // Used by DB to keep track of labels and Versioning + public static StringDictionary s_VersioningTablesMap = new StringDictionary(); + + /// + /// Get All Sql Table Resource Names + /// + /// + public static string[] GetTableResourceNames() + { + List tableResources = new List(); + + string[] resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames(); + foreach (string ResourceName in resourceNames) + { + if(ResourceName.Contains("DataAccessLayer.Sql.Tables.")) + tableResources.Add(ResourceName); + } + + return tableResources.ToArray(); + } + + /// + /// Gives you just the Table Name without the Resource string before and after + /// + /// a table Resource name + /// the table name + public static string GetTableNameFromTableResourceName(string TableResouceName) + { + // First trim the sqlce + TableResouceName = TableResouceName.Replace(".sqlce", ""); + + // Now find the last dot and trim from there + int index = TableResouceName.LastIndexOf('.'); + return TableResouceName.Substring(index + 1); + } + + /// + /// Get the Text/SQL String from a specified ResourceFileName + /// + /// a specific ResourceFileName + /// + public static string GetTextSqlFromResourceFile(string resourceFileName) + { + StreamReader stream = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceFileName)); + if (stream != null) + { + string strText = stream.ReadToEnd(); + strText = strText.Replace('\r', ' '); + strText = strText.Replace('\n', ' '); + return strText; + } + else + return string.Empty; + } + } +} diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Albin likes apples.doc b/DataAccessLayer/TestData/Files/DupFiles1/Albin likes apples.doc new file mode 100644 index 0000000000000000000000000000000000000000..07ad7bce56853ef8ed7aaaf2860427a52fd4a9aa GIT binary patch literal 27136 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 HLE!%Yv|*zT literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Book1.xls b/DataAccessLayer/TestData/Files/DupFiles1/Book1.xls new file mode 100644 index 0000000000000000000000000000000000000000..c8510221e08a92ff31721dc7369c0867d4831e3a GIT binary patch literal 16896 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 VFs}rH>K-TieSb%g{v6i-{|n7=F)siB literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/DatabaseReceits.accdb b/DataAccessLayer/TestData/Files/DupFiles1/DatabaseReceits.accdb new file mode 100644 index 0000000000000000000000000000000000000000..c0e3c70908c27fe3916f5d24f007840485080d9d GIT binary patch literal 319488 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 Z^-^V+8p&?&rz^8@8)2zNsFtn``j#^dm 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Document2.doc b/DataAccessLayer/TestData/Files/DupFiles1/Document2.doc new file mode 100644 index 0000000000000000000000000000000000000000..97b5bf064df816d2ee7ffcec7f414d83664a1c03 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Document4.doc b/DataAccessLayer/TestData/Files/DupFiles1/Document4.doc new file mode 100644 index 0000000000000000000000000000000000000000..b58cabf8ec46e235e24d5fcbdba40e6ba314a853 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Document7.docx b/DataAccessLayer/TestData/Files/DupFiles1/Document7.docx new file mode 100644 index 0000000000000000000000000000000000000000..4f8c40176a43ffce8e3b8621ad72859b657e7461 GIT binary patch literal 10079 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 WjZiGMp literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Doris likes apples.doc b/DataAccessLayer/TestData/Files/DupFiles1/Doris likes apples.doc new file mode 100644 index 0000000000000000000000000000000000000000..ececba8c58cef7cd41295ab5b2efbc7384ed85d7 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Doris.xlsx b/DataAccessLayer/TestData/Files/DupFiles1/Doris.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0672cc572fe3551fc572d6d55a036607e7c5302b GIT binary patch literal 7821 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Drawing1.vsd b/DataAccessLayer/TestData/Files/DupFiles1/Drawing1.vsd new file mode 100644 index 0000000000000000000000000000000000000000..85e0a90e47add380748a0e681cec8d335318492e GIT binary patch literal 18432 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Drawing2.vsd b/DataAccessLayer/TestData/Files/DupFiles1/Drawing2.vsd new file mode 100644 index 0000000000000000000000000000000000000000..e36bdbf0a4f12dfd4d83a7330c29d9c8adab4726 GIT binary patch literal 18432 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 RP+9;0E`X1di<1W;@IOeH=qUgI literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Map2.mmap b/DataAccessLayer/TestData/Files/DupFiles1/Map2.mmap new file mode 100644 index 0000000000000000000000000000000000000000..14fb76e011cfed0d7a74af0668e882b7ed919e5e GIT binary patch literal 22963 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 RP+9;0E`X1di<1W;@IOeH=qUgI literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/MoreDefects.TXT b/DataAccessLayer/TestData/Files/DupFiles1/MoreDefects.TXT new file mode 100644 index 0000000..b9bbe1c --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles1/MoreDefects.TXT @@ -0,0 +1,5 @@ + + + +[ButtonHook] +- When W32Window get's a message and ::IsWindow(::GetParent(hWnd)) is false Close down everything!!! diff --git a/DataAccessLayer/TestData/Files/DupFiles1/New Mindmap1.mm b/DataAccessLayer/TestData/Files/DupFiles1/New Mindmap1.mm new file mode 100644 index 0000000..e88a40f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles1/New Mindmap1.mm @@ -0,0 +1,4 @@ + + + + diff --git a/DataAccessLayer/TestData/Files/DupFiles1/New Mindmap2.mm b/DataAccessLayer/TestData/Files/DupFiles1/New Mindmap2.mm new file mode 100644 index 0000000..e88a40f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles1/New Mindmap2.mm @@ -0,0 +1,4 @@ + + + + diff --git a/DataAccessLayer/TestData/Files/DupFiles1/OogyKeepInMind.txt b/DataAccessLayer/TestData/Files/DupFiles1/OogyKeepInMind.txt new file mode 100644 index 0000000..1e3616f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles1/OogyKeepInMind.txt @@ -0,0 +1,27 @@ +[ShellExecuteLauncher.cs] +------------------------- +Right now ShellExecuteLauncher iterates thru all top level windows +until it finds the name of the file in the title bar. + +comments: +-to avoid collisions with duplicate file names (hold a map of + previous window handles), so if the file name is in the title and + it is not already mapped it's the new window. + +-maybe invoke bh or resolvers to do the work and skip title search + all together. + +Workspace launching (more testing to do with new resolver events) +~but one possibility could be: +------------------------- +launcher calls BH -> AboutToLaunchWorkspace(), button hook disables +all newly created buttons and listens for WM_CREATE and parentNotify_WM_CREATES... +... in order... that is our in order handle table. + +launcher calls BH -> LaunchDone(artifacts), we use the artifacts in order +in our table and launcher gets the list of handles. + +~this would work if launcher accurately launches in order and all windows +are created in order. ~launcher should wait till resolve event occurs? +~before launching next??? +-------------------------------------------- diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Presentation1.ppt b/DataAccessLayer/TestData/Files/DupFiles1/Presentation1.ppt new file mode 100644 index 0000000000000000000000000000000000000000..390ef099570a99668498126ec2ddc39e352dc7dc GIT binary patch literal 101376 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

fus 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

    -d-$m3-#fnwBN?k7{TR~(PtWhZ9dqNbUb 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

    snZ8Qb3yiz{m5(I3D+E0`)gLW!Hg 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 JpSZT!{y!X{RW$$r literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Publication2.pub b/DataAccessLayer/TestData/Files/DupFiles1/Publication2.pub new file mode 100644 index 0000000000000000000000000000000000000000..b75dfb86acc26fae5931aead9430d3996d25b1aa GIT binary patch literal 200704 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%0AJRcnB}&h8&pnyLUYlXG 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/doris2.docx b/DataAccessLayer/TestData/Files/DupFiles1/doris2.docx new file mode 100644 index 0000000000000000000000000000000000000000..124e9b56976a88638fc9691cfe6a957bb90094d0 GIT binary patch literal 11092 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 Bf`0%2 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/textfile1.txt b/DataAccessLayer/TestData/Files/DupFiles1/textfile1.txt new file mode 100644 index 0000000..de850da --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles1/textfile1.txt @@ -0,0 +1,11 @@ +WM_ENTERIDLE fuSource:MSGF_DIALOGBOX hwnd:001b11dc +WN_SETTEXT lpsz:000BEF18("SHELLY TO DO.txt - Notepad") + +[Open dialog sends the following things] +WM_COMMAND wNotifyCode:BN_CLICKED wID:IDOK hwndCtrl:004F092E +WM_NOTIFY idCtrl:1148 pnmh:000BEB30 +WM_NOTIFY idCtrl:1148 pnmh:000BEB6C + +[Tada!] +Use ::GetOpenFileName or ::GetSaveFileName passing pointer to a OPENFILENAME structure. + diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Albin likes apples.doc b/DataAccessLayer/TestData/Files/DupFiles2/Albin likes apples.doc new file mode 100644 index 0000000000000000000000000000000000000000..07ad7bce56853ef8ed7aaaf2860427a52fd4a9aa GIT binary patch literal 27136 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 HLE!%Yv|*zT literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Book1.xls b/DataAccessLayer/TestData/Files/DupFiles2/Book1.xls new file mode 100644 index 0000000000000000000000000000000000000000..13be6fb459870d2f10779c4a194ea50b5d6d649a GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Book1.xlsx b/DataAccessLayer/TestData/Files/DupFiles2/Book1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..150de4a0254d2ef5588633c2b70f6056e7fe12da GIT binary patch literal 7832 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Book2.xls b/DataAccessLayer/TestData/Files/DupFiles2/Book2.xls new file mode 100644 index 0000000000000000000000000000000000000000..1adb97f3d9438965cff864d28a67a12b506e5165 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Book2.xlsx b/DataAccessLayer/TestData/Files/DupFiles2/Book2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..715c15df8d16a4b50b49e3b43bc74c7aed4014a3 GIT binary patch literal 7832 zcmeHMXH-+^)=sDfMCsCd?@d4{f`CFu=paR;7a4pIoZ!TdH1vTe%`&+lrgbL0XTpw004jypsUmI$`}X$ zP+$W9B!CH^fgIf4#lqgjNXyf~!r73|!w$xfF#_ax1HeH4{-5iAY6m{VKvh}=2m=ok zCmFZNS?$9D2*DHBca)biXqv~OI||GU=xQo!tfKnCZwT`Pu#@B?Z*DXmStfgxl|ak= zpHGbYK`TJY&EVWh!yBuvdok1HSed0@3afNuT$$QQ2M!=F0gIF zJY{*{2na5_Dd;&#;(P50z<;S~A0(XFUG4o_WhXG$#H|%FZ8+9&tLDg-iy-AU@(DWU z1708$PMLgPrGkzYKsAr2wW36P_mhL^$PyHPY^R`i{4Gwn<~e0SD!dNyojcm zgD>!VB)i?M11$NAPp9P6S&?|07$rSJv*h9e6QK5&P^;1wVBSMNfuJJ^AJ7Xla^^96{%`EHmRWCAGWDfQN zF#W)0sDb^ZzB>lf>x+-I=xI#(Ra)yfWXpt2pN`si6s750e`CsI^_aAi>LrcIgQ;nl zkw;cclIiG4UU^s;Rb9*}v#AKJDk=Wfs#A8PfO@xy^*}Ubp2cL$f>h8uIyGL&VWiC! z+^4t&(#MiVY+GdrX>x$w{g3`fW~viYL-eA{X6eKe0xk}W57eKOa)>3!tu3tL65xEzVzx5=tcQ4 z8PpY2ya=k9>p2FIhLy#BO<^Tq7F-P*o?4H6!n{RPlVU|?$YX1*a7rH86Nl3pvSU7% zD>v~5n+A_=7zJl%Uf`$3bIi(p30PKNeAee}hFo9k5U?rQge?{5zg&8jz4 zCW)0qZl*I12p9>fL_>)~fc&lVVnJQ;#^uzl=E?%sM*~bKPsS>aUis{5oSxmBW37(& z8Db9^x>W+`TQTxNGve>LQ5&(!tHTS{PY-K z3(CbPv+EbZu>hNenhlpRqZrpV^ywmmQW>rFw*ZJCd6xHQ`(K5LWwG!b}QEt*@dNZ4{ZTk?e*4Z!? zQ15a-3`_9KJ8`25>Cy8Q(H`%VJeD>6(=)LrvBFBT`K~=_uhN z3Wi4{+yjpFql7CIMqHoB_?|bWD8p94;r=cBq7r6i&rB=sjE_@NpO8p|t!IeqbG_vf zEKth;i8fjey{9;jo5lZ?C%)#e*81T90Gia_1>p}*xL8}*S@8e33x1E=RXtTWN|f~7 z^)Yt_7q}gJH8rkl=vY}&5tO>kKA7(D>o{G_44FYCZ|aG;=fKuFlXzhLngEQuAEVwS zjm;pq2=kb1UlCkR(W5+wLp?GaEYI}J>*Dhqv+Lf3KO$X@iDkhNRcKiJ1kol0Nyv=Co5Xfhd& zMCyph-Cm1$kPAW&g(+?3Bf@e$CYT})k8R@7@M%N$$S~eCYUJ;eU*Aq z{UOHL9_wp^6qVcoutk|X!F%bE_)Y3zOYf&2k<=0GVsV>$y>2xqmrWe=t≷7vMrY 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Book4.xls b/DataAccessLayer/TestData/Files/DupFiles2/Book4.xls new file mode 100644 index 0000000000000000000000000000000000000000..45a95f0c6702f9e25b0c30a7af5e249e02be6978 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/DatabaseBills.accdb b/DataAccessLayer/TestData/Files/DupFiles2/DatabaseBills.accdb new file mode 100644 index 0000000000000000000000000000000000000000..427bf49d4e694aff7992658e1187eefb93df527d GIT binary patch literal 294912 zcmeI53w&Hxedo`e8I49Wni?AglHIieYhh^Cg25(|XGqPnp zBgsx&8YB|vhp-gVbfN8*E{}W`wtTvD!=vpIC~RnH3+xukvt3@>23p$iT434IZDxP} zbMBdYXY{ZvDe@z~JG#36d!GOEJ?B2oJul@b)jioWlIa=Gq#B!=Q|SXLpp^Q^NU--* z*|W#K_q(UZ8(yy7@!EGjk$c0xul>^tAN_vK$G-Ks-|747=RWn$mVbHE$2u~npTF}H zUwg+dwmf_LcYnO?O{e}K@|yY^e(D`9lyNosc--CZ$)nY z&3}FJ^{t<&e$Qk554`RFe*W<-Z#ezwn{P}1)ertM`~6($pS8UE;Wg#o|6Xe_z2-s zl<{$$n5n3W7>kl3i&d})iI38JP{zkPgb@{sC7V)f%$zz zai%RQ5SZUWLeLgTBym=Y1k@|AKmb}R&CZ7;3a!c{@^C(ZbrL)_S6!14!pf){vg(#g z9{7S1C3R3SRZ?IfaReofU_K5Llw?CfHK|cGf?rnksYz9#(y9l?9@UF|0;a27lPp}0 z<6Lb0rpMHn%DARc)uM(VpN7vhkVmzT0i2Jh4ww(aXGk4_`;cl==MlU7Z&nW@%yHOP z=<{~?%cye*DXYr0$zj-zBA!S-l&I=d4{5E(;p;H`if$taM?zntjvy|PM^rz2wqYNE z7Hf;lyVV)kjKgI_9aR?)LsmV8Qh?8a0fkFS*}te2U=pnWODQVYqOa2j@dID5^SkrQ zmGC2F0-Nhcazrv$XRutnViyYOQ?bi$o}D%_{MOD$v*lZ+LhxOp;|t(_5PMuj@V^Xu zg-YOmQg&62|8eXI6~+G;c9bdnFU4-u$?HIY1W14cNPq-LfCNZ@1W4c-AP{hVHzCRB zM7=|59X)QEbT!16zHX_So9el?LdDmS$}hH*{*Stg_(!z~r-jv3M=XjfpHlIevp%lt zu|@?6%BvEGRU@jQ?WoAL=*rz0RM^JV04i`&VU-GF1uBNU>MSIw&Pru4th#Yb>xvy> z_0`Jq)jL-RAVpHum+g)E|9lm(nK7}_q@nR236KB@kN^pg011!)36KB@kieBkAmIE{ zT(pX#W!hiaHI;8q-)^+GqXAQlwG}!IIJ)D2=OiHhy-K@nu69hDe@Rhifct-fZvx^Y zjDY=L3`+0~!EM?vv?zr`-H7geN-+Hj-nHokM_YvQodJwR>ZkLx`Ri{C#qIHt?Jqd1 z@Qq;-Kl!fEi)Luk+%1jNW4e)f0*%`Pxc4y-Fg{EzUzO*p|28ON zu^JuU^>+dJa!}yIT7-)}N=UDJ?Zc$VH$vg}UT_lVQP78a{}8?j45K@F6dlUP@r6Ko zA0+VKZ&!hD1iz%a)?3%c#NRhzi*|DaHUEBH`3*M> zK=<|me6`4TPe*p1$>nZBmgaJM^#3pE|0;mI)crvA5A1nVCtm!ZzlU{~*6y`JoW}R7m*kDr@}Mk4Cz{+0qu0{4xbn@>=$MN%Yx? zvEGXOT?*@kQ$z~5kpKyh011!)36KB@kN^pgz|~8@aeiuhyknHU%>P%Ld_M8ML~mka z;%o6=k9Wk&;(t;;Reo3b&tm^2HW<6LsL}uGO*u6u0TLhq5+DH*AOR8}f%ys8HnI6# z&2KwBzcp=_N+7k=0L1^Y1hO28FpO)NfNs}ZY66!QNXYp>bnXx^W0`~2SG3rsM2g@r z4SjKrdtn14bEQZCy2Vz91S{QQE7P6nw%!y3J^7i~$O(2>h`r1yU_{g63nOmJNnq-& z2yLpfb-1;)y}fI2u)pr+IiGJfYU@iJH1H;DXdSf)$K5(MnHCp2uogYL9T9X@$$#83%jY5fuGj(e4 z{Gd^La5ysn&9(D&eoI%U63?tXbE^OTu5;~~`$tdp8Z9C-Y=_VHcU1*jhlg9+?>p7i zJFEk)oWogXSNn-mtwz`69Bz({o{%XtRApig2Pe9^x;itXNTPNYpU2tYiQZ$bv+_Bd z-Jj__ro)NN;b8DS$Vh#tRy@Mx?^>%f(ogX$jmw66*TOaIi?d>`? zkQwc7ZyoMBmKiwVX2ts1U74KNFuUb&Ce!xnu6DPCY@Ff9*q-P#f!yTT`@Mxc<1?dO zd40m3@ysGyYAkip+oN&aEG7Y6^g7$LNzj-Kj-EQzI&l6(Z+Au;uQkS_gIxoiUEL=D zN*mv}oL4WyA^{R00TLhq5+DH*Ac5s2fceH{=>M!+AQY)cHB4hJ^tpvuJ<{-sAuwe$ zL2VxbDkzoLiGUohTrC2|a#UU~0zSV~t`Pxi2UOl50;XoDTq^jEHapgfbCOA*zguupUB8gpCl&MYtJ4T!dR7Bt+N@At}OE2o)mS z2BA`fJ0PqRp$5Ww5q3e?Ai`b<8%5X;;U*CpA?TW%Bw2q=kRIo%VB~G}J z011!)36KB@kN^pg011%5OM`&pY}8}8CAC4f|Nl!PgZ#A28G+QzOX~4&pR#tGV5U@f} z1hkW7Xf7{U183h6B(pocVjBO;iA4G7Q- zD1cx_4nVMdL((bTiytO>^njENJu*WCJ(5ENJ?2A%3b)%x`W7o}vchJ?jRZ)51W14c zNPq-LfCR350*>=mJ@30{TH>4k@5vji%x*_2(j zgoT_`0?nS>NPq-LfCNZ@1W14cNPq-LfCNZ@1g>EMZ2!N8GnYvt0TLhq5+DH*AOR8} z0TLjAtCoPX44O|bLl~-IIRd#7!jSfVjBVyd0wh2JBtQZrKmsH{0wh2JBtQZra19e+ z{r?)yTqcbKNPq-LfCNZ@1W14cNPq-LfCO9utpBqpkN^pg011!)36KB@kN^pg011%5 zwNJoto(p1)G`*$NN0OOjEcxNY1Br^nGx1l&|GE72^jDQ?2)L!q0NbPdzj~7bDQ#Fh)QuqUDHDM`N(9}=>|y+R5Xl9UtPw;riU`IL zfwQm(Fsg1EAti(A>;Kb4V2>sODa=Qp_Yi{hUlCSzuM8=&c&@rZz4yx|D0?(P_34Zo z17XR!8Z5n8{M+GW9Tu{jCos`yOlQ=B0z($f6IeR}%7CQY3>Ki7lMih4FHJJ-QIgrB zwHnp|ZC5jY+q@*gwX2myZjTaBS{L{p+{V1pDfbg8m!f3@Mt2tf_IrV2HB`6gm;YB& zrv21!Z!!?-(KfSgqiAksz9H*?&&r)mlBCwhkdvX<$@W)EqbqfbYKS%H9)0cEpn_wMO8x^JNQtV`p{-TKtu1XRNf?j!pmZ=gte5<%mU zZG*K(m`=}^QTM2szq<+`%oDJEAob$zDepA`U>6q2F8b-(XQ1*qwf6TvJ z1e|mniBlg2&J%bivKt~O*g8s(izT{nNC8pTAy=_4WQ%&?mZ8MTWhX`A1t%mHAt@b7 zEaWDjR5?tvg_F0i@wgVjB8!Oi5h${Nd$k(n)VpM*@*q#$Roc{hKFb5;)*>_e%=Q;e zakojk8__Se^2&8iKl41~;${urR)%0ciD$d54T zqAL<00TLhq5+DH*AOR8}0TLjAl_b!x9Fe7#Ban*a2;>R~BZT??O^f^$pbS+Y0TLhq z5+DH*AOR8}0TLhq5+DH*cu@$j{{Nz2WuPQL0wh2JBtQZrKmsH{0wh2JBydF$VEzA! z$_^?+0wh2JBtQZrKmsH{0wh2JBtQZ$3W0$0q|8i+>5b=_|8K*6e_p3lM}BHJqsCfH z6o)-fIJcjk8W0W~6~+9~G8e2&J;@o{3^V>G0TLhq5+DH*AOR8}0TLhq5+H%gMZj?~ zy8bWm2h=mk^ZB#Or4i#L0TLhq5+DH*AOR8}0TLhq5+DH*SZ)G~ZU0|~MtGjAD2sKmsH{0wh2JBtQZrKmsH{0wk~m0&M?Z0z7&p0TLhq5+DH*AOR8}0TLhq z5+H%Agur6k|2LrhAA4x__Wuyu|F4q#r8$zTK|KmsH{0wh2JBtQZrKmsH{ z0wh2J^AKSB|2%MLMFJ#10wh2JBtQZrKmsH{0wh2J*9d`t^BW0CN)N{Ndu{n>+%HOB zM_7ea*fYExPO!(sPY^$)bo+mWbrBMa68JF|L2VJix$ZGwrV{Y`c)^K?k5G{hr6R^h zK+i2u=%d_I*l&SZ2~>+3K<9(3N~06PB=%K#lNOlwsMBh~=c)rH!*IPW@9HT0i%GZk zJ*>uju8*n(f(hmn;tRMNcTCR=b@BvZ_gqqnTei5M+I($I$qnaZN+&5abXV|Ib5h+l`$*>xm+lh>nV~$z*-G8dqUg8k85?sPlTA|31Ys9mZ?ZBlD6mr)cZrD|$sP*uk9G!E`o7}!IY)W`<7U)`nZ)t31K zL=QamPUu$V>XyO0NaN7J=v0HQqPG|8^zCqA^5pIEL#3)A>IU%uR)#vD8r1_u3AKS9 zP@-8;LW={v9f6iBHI0Mb@?8^g)~Nc>^>P9~6Oo+*O5T!%WCz%`pu1!N$;r&Flm1K* zZH#x}CBbh|DYXHfJZ}$`s$y^A*mye(PNV89H0eVpP>EXtsYATmiUZm3;U`}yaoeL* zEY|oEhf@`*Xvbt!7m%p5>JYz^WIRxefRId|!k$|NC@d3=r zHHw5GPjw=0MFF^}n3Ij!9>sBul5~sWk~?dQz1-ey(rwX-V+*VoopdL3Ntrj@HVAu+ z`ht+6W(%A2`8{0_+&%iDElRx&#vY}f)C7DPq+U7=d+_AilFQS}NEA5h&E7nuV3`7E z6ESN!wchLzJ&KX3A%OL+{nzaQgZM{ox>?80th9Jf-J$9K? zu0?wt_Qfo)Qgh*Y!(-<1mcHx7msVf^h7xArEdD(Q$y~c*`H~`N=e)FRqU=!|+H2Kc zK4dC6NvYXFgZ7Rg!LZXo8NGBo?_p-}j*;`XxTieu9y{CEC&gz<) z#+s(RwY4=hyBi<5`}l$8yYs$k;!(p#}f8t-Bo5Pw>~OT9`E9 zQQMARCn^}mq#du=@{I4qv)-7PH?@=Q8(TemiAghJ*@2ghHvBfjWB_k9=kT5|q*Abz zm(&5gs-@g_o)q30#_$``rZPHh0PhteaOK}tVRWA1unX>6@N0thjYvhc+Kscl_*Fyi z8texki5uZ$I5cXPHEJhJYxI7n=CIf0AS^5gspg#4?={0(M>Fy61Y&R38jAe{_I_xZ z0*ik9Bt2QU@SoKpuf$I`;%>rk2W;D*+vZur@xNK6kOrw()#&hh^Odd?{14!@THd+F zQFrohADgwD?9_a03Gm89HS{s2o|$#!FDFKe&2Ve^+y@Ot@SZ%X9s-4v*rg69BMOH> zS5hozVlVH};(roSFZ@gDn~|bMlm%16^77iBlDi6WT5`D=JkszdIW0BqG$bhnP3lfa zdr;b%5qC9W+of~82`-vo)&w_ou$L0wH%m@SNxsw)--#Gn^mQOwNqR+(X02Z*;;^Ou zVr9jj$Ax)s#$xv9>XTIGQrJgOB89u0b;8D0!{;jzQU?g&H9Qn>R2atyj?sV&XEb9F z<^R`0A88Bep^?UXasM5E_PO#CQ)bAe<3tem;=-k`Yl*hhbbd)+}DyP1^MNR@L z9BSF}Mn?bbK%tghRIr)*QYsky1Ku42z4oBK){ z4Q>IjeQkl>*sqDyU-2Squ&fc?Ge11%|4fKxpjIX&c-Km^p z;7dwfSNUl0iK&V}EaY^>TObsvNHt7j3`|RUraCvR74#a65!sL_krj+9bj@2%ANy z!rvAVwnNyexRC$}kN^pg011!)36KB@kN^oRjzGxyX8Bz8{{~dqFoE2~4~vVMzE*&M z)SPvdA7A6lM}Wc)0QxNd6+oZmKLzNs{PzHTmj5WA&+=ae^jZG%fIiEABhY904+Z)x z|7}2@w^CJkpB#!KQH9JGw8GY7X^K$ zKPw2ORq`+Y{Xw7Uj}R-6NsNL7NPq-LfCNZ@1W14cNPq-ZfI!IEJ!k!2T7L1@ApcRl z3dlb-EoU&oZ1gyTfIoB_5mRlB+55!+{%gGom}$XxrrJjbhcl;+ z4P-|9jk#{Dccwa9hg)0Q+q(t_`&*B787tk^Z>-u{2VFzm?(a->X9i9gSGpg8Gj-xr z*SW#|u6ARnTmGG?Q<=`u`(2N^cL9tB&kvf2pvVB?stOKdGQ(O&-CMz#>L1ATi$2;+ ze;sh92D?za$_EiQO!9d5r*2dzItM5bCL z)$o~*@)n^Nk-(tItGn8ba=Pn6Y^q*+)!!asQ=KOUv@cAjIb9l-@iL~XL-|zO{h2oH zQh%4Ilr-f-+A87ajV4ZMce=AfWj+Pw1IAQU5L#3P{l0ZSiB%G{_O}_4aw7o}AOR8} z0TLhq5+DH*Ac46F1f2bPp8t=c4k2s2p=Y?>rAp!7I?VciVyvxdal~$&i&MP@pYh|Z zsF%yVVAkL(UgvM(SKKxDir4v*PU$+Rpbp&&Dx%z=W~}qq;RaPA-PnEW{B^8%EsEFq zleGlPF)mHUD#}>Aadc^Kfh=<~Odx)!0yzMXJE8dYj`fkpHNg2+;xpQDT|86L_@4wwfCNZ@ z1W14cNPq-LfCNZjVFVm!qs#@Wx1hWJpFQW11W14cNPq-LfCNZ@1W14cNPq-LKzh6{ z!-n4SOWzhBh~o?=Yg`3_>Z{2QCSRBT9+oBH?&)ESv6od}?>8PW;9dsZ>unV#TTj4==jga`WP9t| zqpT!Z=&}XR0#m2Qx}$j2+0t`$ri)sW011!) z36KB@kN^pg011!)30xY1fb(9=m9EqgR0n0$IVNh?yB_543(6h;FO^1JaommZ|JcR3 ze5;VndKEe3jbQf%@XIF+ZBaZIK;B}(a{;JNF6&$X{?Y$8VU1f^v-lj=SZ>0M05ZP+ zG|puOVHw$9JUhUqg0cT8brkN#;3wq^r=q}(gfeqZfyeO824Hfzg1G_wa|Q$e{7%4? zc><<|vJyX-h;bf2LHOANmlvH|K!+!}W(=PP>tKT#~?j{ko?Z*s+{ONB^)1W14cNPq-LfCNZ@1W14cNZ^tP z6t{0*l4sZP^kO^}`)MdPSj_q2196-$#CN$-#?%*+?@eAvwk2;){_n(}CVn%~nb?&0 zneHF37_I1s1W14cNPq-LfCNZ@1W14cNZ>LP@J5GApY0sBMjWL|EMv{>aB>-OUaB4{ z)dSI`lXuj0jDzm`~NPq-LfCNZ@1W14cNPq;cbONmZ zU+FotH2tKOF4cZJ|DUP$O9ft6`|**gURV3^X{%mW`|&}nURV3^8LeJd`|K+AdEY?R5lxk5!nCtJfnm{KMZ~i}-sV{A6$x`$F(1CzD1ncJ|7`r zQ<$$lJDqREsWoZjEPfgs|B(O*kN^pg011!)36KB@kia!Wfb;)dLz&5>kN^pg011!) z36KB@kN^pg013<>keXq#2!o16_?h9w&TTNm;!+G29f;$6D!JE<$-(@8ml7%6k^l*i z011!)36KB@kN^pg011!)30yV;X8uE&*-<=vUmahp3ipQC#pcvJ0F-T0{S5zxyKdKNcg4!+{q^&;x1x}e4o zJ7=S_)OjQU5+DH*AOR8}0TLhq5+DH*Ac4gZaGXqj%zr>VlRTe4TU>bbMFJ#10wh2J zBtQZrKmsH{0wh2JBrq$1=~+!L(QvVWI8H;^emAa^`d0Ffl8-0PB=;rPCcmHfgTy0= zn#7OeAC3>kH^skG{+{w|`G)fE#6B8(Yiumm9@`cxjeR%zq3GG@&gk=HpDlX}7KrCY z0wh2JBtQZrKmsIiDFlM*6>#3Jy3zA-La#G?ULD42!z1Vg*{OQfSseS+B-SBL!(RGm z)~OwODyN_-4JvfVM5oCfI2?k*TJ2zsTID&AnVx13-COhcDAqdm$7SNVNA2-~*}Z^Z zjJNITcF$Yg0=zXr{YfZ)8d{920Z1mG{pv0+Ak1(zoz@O}Ft=47e&TFGqdKi+>8X0V z+TwXZ*Vbu6^#~jc>8`8=XiDIq9g$|#IZbauJ6Wq%dtqQTWrWeE^%{egvp7M#(-Og$ zR)1C}m{n`KMOzQMA*{wq(lQ;F&O>DC^f6du5ltHZ`vF0+KciyP(mi*B=M-s#KIgC& z^)O(Jqs$zF(|&|K!)cWdy`NY&k|CgF>Fca6F9kVvo6lPl91bI4QnVh<_sx9(88C@o z54fDst74DfOiE@!j%{5)Ku2}J#&bcj-n;VP&VbN7F`aYWaLZxsyPFb;x?oUw*(~~cc^WiM_jJ? zJDItn<-ReX(>wv?2T)RHxdq9B==KKKh0x_H^KLQ)SC`yEtkXu-gxodZty60}HDroB z>uBapvmiXUtguegC?Vpt;0}ZclXE9U)Y+m^1yLvMO|TcGUTzuYjfWoLJSeWPo7tgX#=ck zFa7!TU&snLErlFFfK3Q7ihbTy?X?E0al4nyv-iGNApI9OR=}Sllu3XDNPq-LfCNZ@ z1W14cNPq-Lz$M@~8}mK>gS!8JZT_5)NPq-LfCNZ@1W14cNPq-LfCNZ@1cX53s>cv= zQi;Z^J{3#=36KB@kN^pg011!)36KB@kN^pgzUPyJdE-G+matj zyesjmiC;=?=Sm}vQ$~T>=%*8B4d$%F8yxl7fVl;9xAOb{Y3cp!oL;X6i$Z! zU&$Lv#!DV3`G?S#L(hg@5!w^l8u~!+w}WpCRt8@P{8L~u&=cqgeAW3A=V|9I=Qd}x z?)N`mYL>??q-30&jD6VpR5?Z?II1*+!9+^^6#JG!qoZ(j+lBviUtj+X+irXCj`zRq z>-#=gx9<0U_Ehp^4;=pbmjgFG8GG_?s&*fL^3kn( zdURv#?GOE*>Byh`;@RNqzVhj(UimNMhktzc&EJgu#gY4e?Hh0YW3~TFC3ipl+}OK5 z_u6OL#{8NTDOWR7IWf8n%1N|E%E^GC)!2RHjM0jdlW2>SlYwbP${C{-S5BfWQcgx{ z6)9(oR$MuWwn#Y{gI1)RFi)Im6K?Tl#}shXyuhlI)zmf(WI#S zVvu<;Uu)#!YmHVo2{u|EU)&6e^|eMmeXY?7>uaO+>5C+wyL>@K5qG`fBv>O~60Fe* zC&5OWPlDroHPUvxu?-fOH9&p-ElDT&!`Kf$yO7`YW#Wq)36KB@kibifK>Lw8wN{?t z>LyGA)qzRN4ylx~v+7)cZ06I-VkWMmn35-}r-#bG+)jU$!gMb(Nzo)Ga*^47Ce*ru z`Mi$n`FUg_A#s%|nh;HV`zH&#fC{deIjbGh%^b?do`PmFo6$os9mOP3GGUf1X*&t6 zWUjOcd{{jI(*bCZL0azBlj(F~BCURynAx}5aGZdT2~1ve7_v;lb`Dx+p_NQSGpZM= zmHCn+-G#GidFd5xcR*`l(WeFx|2RS!fo#%|K?+5?7Q`Tvlw}a#hFMZQg!p8-pA2|) zz^^w+TuR*szZt}H2D2p<+ZFRNM1{spGu$56Iy{8b$mC5k?Yp6aq}SLdTncBE$+JJ! z*MdwQq^A$Un?L?s*@5gp#)p7t0PJhf=DxOn%qUbiPy^YoofhYGOt=fyUJ); z?jfs+&O34EOX&NK+=1E=&KM>{GjksHXgwyOqudD}LPu*mJKr9-kbALAMA(B+t&0hS zKBDjRG8JML_oGp`6a8c+J<(_t?zf{_UwP6Tf&37vJaVtK8cPT=ZC;PQvq~C0?frIZ z@r;nWY!=#!cHaGZjeerpdF#A;aiO^v^4bFTCR7P`#3eC-XM>QI=_XAM31hkQ%Cu*b z;3xNV&vq43YbHc9Pq))Zsia$`Y@EciRi0-uDW5!NPva+~PV11eaAlTT|4+CBN}X0V zxeEv6ZjGv*z6+~*rD9>+ucMz!9MevU{>fx<=3ei&fcHQt!U?QZPFV!=UG{dLU3Jr| zA}x=;;`*QDs{j6Zae&D5UEZCA z<;KhlSSxk=r~~fz>erVMyfTsAMIE<{(TXc4(H6CJ<4aPpa$)tRZ%N>>u;%|NTDK z|3e0HBLNa10TLhq5+H#~BM{WJB5%2-S(fmVcS*a9RAK)P|N2vNED$KKn6rDnr1k%H zEg+a#7T=PVt&7E8*hR%#nyX+nxjTFTUBYU1GJax#OY6zFiUlsMC%y3JU0D$ICOGig zaTmXA;6>IaM0?`2Z5%d{6s#-=Xw$Y~&`(Vkn4DwPL>WkAbIi6na{a&ARzc+YfBrQg Px&EIt?yIX{{lEVY$WyTZ literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/DatabaseReceits.accdb b/DataAccessLayer/TestData/Files/DupFiles2/DatabaseReceits.accdb new file mode 100644 index 0000000000000000000000000000000000000000..77b797a02f54212149e255c2f75bcc4a32b505d1 GIT binary patch literal 319488 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Doc1.rtf b/DataAccessLayer/TestData/Files/DupFiles2/Doc1.rtf new file mode 100644 index 0000000..ca783c7 --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles2/Doc1.rtf @@ -0,0 +1,154 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f49\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f50\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\f52\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f53\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f55\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} +{\f56\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; +\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; +\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}}{\*\rsidtbl \rsid5513996}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator HPinvent} +{\creatim\yr2010\mo1\dy18\hr14\min23}{\revtim\yr2010\mo1\dy18\hr14\min23}{\version2}{\edmins0}{\nofpages1}{\nofwords1}{\nofchars8}{\nofcharsws8}{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701 +\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot5513996 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5513996 \hich\af1\dbch\af31505\loch\f1 Doc1.Rtf}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5513996 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000002068 +d7b37398ca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Doc2.rtf b/DataAccessLayer/TestData/Files/DupFiles2/Doc2.rtf new file mode 100644 index 0000000..f6b7f34 --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles2/Doc2.rtf @@ -0,0 +1,154 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;} +{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; +\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; +\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}}{\*\rsidtbl \rsid15009392}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator HPinvent} +{\creatim\yr2010\mo1\dy18\hr14\min23}{\revtim\yr2010\mo1\dy18\hr14\min23}{\version2}{\edmins0}{\nofpages1}{\nofwords1}{\nofchars8}{\nofcharsws8}{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701 +\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot15009392 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15009392 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af31507\afs20 \ltrch\fcs0 \insrsid15009392 \hich\af31506\dbch\af31505\loch\f31506 Doc2.rtf}{\rtlch\fcs1 \af31507\afs20 \ltrch\fcs0 +\insrsid15009392\charrsid15009392 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f000000000000000000000000f00c +7fba7398ca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Document1.docx b/DataAccessLayer/TestData/Files/DupFiles2/Document1.docx new file mode 100644 index 0000000000000000000000000000000000000000..94dcb41242099bef7eaf521c4d424a4804707e36 GIT binary patch literal 10049 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Document2.doc b/DataAccessLayer/TestData/Files/DupFiles2/Document2.doc new file mode 100644 index 0000000000000000000000000000000000000000..97b5bf064df816d2ee7ffcec7f414d83664a1c03 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Document4.doc b/DataAccessLayer/TestData/Files/DupFiles2/Document4.doc new file mode 100644 index 0000000000000000000000000000000000000000..b58cabf8ec46e235e24d5fcbdba40e6ba314a853 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Document7.docx b/DataAccessLayer/TestData/Files/DupFiles2/Document7.docx new file mode 100644 index 0000000000000000000000000000000000000000..4f8c40176a43ffce8e3b8621ad72859b657e7461 GIT binary patch literal 10079 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 WjZiGMp literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Doris likes apples.doc b/DataAccessLayer/TestData/Files/DupFiles2/Doris likes apples.doc new file mode 100644 index 0000000000000000000000000000000000000000..ececba8c58cef7cd41295ab5b2efbc7384ed85d7 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Doris.xlsx b/DataAccessLayer/TestData/Files/DupFiles2/Doris.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0672cc572fe3551fc572d6d55a036607e7c5302b GIT binary patch literal 7821 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Drawing1.vsd b/DataAccessLayer/TestData/Files/DupFiles2/Drawing1.vsd new file mode 100644 index 0000000000000000000000000000000000000000..f1a9e28f5ee20e66679c58426a2e546725b4afd0 GIT binary patch literal 18432 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 ANB{r; literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Drawing2.vsd b/DataAccessLayer/TestData/Files/DupFiles2/Drawing2.vsd new file mode 100644 index 0000000000000000000000000000000000000000..f1a9e28f5ee20e66679c58426a2e546725b4afd0 GIT binary patch literal 18432 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 ANB{r; literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Map1.mmap b/DataAccessLayer/TestData/Files/DupFiles2/Map1.mmap new file mode 100644 index 0000000000000000000000000000000000000000..14fb76e011cfed0d7a74af0668e882b7ed919e5e GIT binary patch literal 22963 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 RP+9;0E`X1di<1W;@IOeH=qUgI literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Map2.mmap b/DataAccessLayer/TestData/Files/DupFiles2/Map2.mmap new file mode 100644 index 0000000000000000000000000000000000000000..14fb76e011cfed0d7a74af0668e882b7ed919e5e GIT binary patch literal 22963 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 RP+9;0E`X1di<1W;@IOeH=qUgI literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/MoreDefects.TXT b/DataAccessLayer/TestData/Files/DupFiles2/MoreDefects.TXT new file mode 100644 index 0000000..b9bbe1c --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles2/MoreDefects.TXT @@ -0,0 +1,5 @@ + + + +[ButtonHook] +- When W32Window get's a message and ::IsWindow(::GetParent(hWnd)) is false Close down everything!!! diff --git a/DataAccessLayer/TestData/Files/DupFiles2/New Mindmap1.mm b/DataAccessLayer/TestData/Files/DupFiles2/New Mindmap1.mm new file mode 100644 index 0000000..e88a40f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles2/New Mindmap1.mm @@ -0,0 +1,4 @@ + + + + diff --git a/DataAccessLayer/TestData/Files/DupFiles2/New Mindmap2.mm b/DataAccessLayer/TestData/Files/DupFiles2/New Mindmap2.mm new file mode 100644 index 0000000..e88a40f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles2/New Mindmap2.mm @@ -0,0 +1,4 @@ + + + + diff --git a/DataAccessLayer/TestData/Files/DupFiles2/OogyKeepInMind.txt b/DataAccessLayer/TestData/Files/DupFiles2/OogyKeepInMind.txt new file mode 100644 index 0000000..1e3616f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles2/OogyKeepInMind.txt @@ -0,0 +1,27 @@ +[ShellExecuteLauncher.cs] +------------------------- +Right now ShellExecuteLauncher iterates thru all top level windows +until it finds the name of the file in the title bar. + +comments: +-to avoid collisions with duplicate file names (hold a map of + previous window handles), so if the file name is in the title and + it is not already mapped it's the new window. + +-maybe invoke bh or resolvers to do the work and skip title search + all together. + +Workspace launching (more testing to do with new resolver events) +~but one possibility could be: +------------------------- +launcher calls BH -> AboutToLaunchWorkspace(), button hook disables +all newly created buttons and listens for WM_CREATE and parentNotify_WM_CREATES... +... in order... that is our in order handle table. + +launcher calls BH -> LaunchDone(artifacts), we use the artifacts in order +in our table and launcher gets the list of handles. + +~this would work if launcher accurately launches in order and all windows +are created in order. ~launcher should wait till resolve event occurs? +~before launching next??? +-------------------------------------------- diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Presentation1.ppt b/DataAccessLayer/TestData/Files/DupFiles2/Presentation1.ppt new file mode 100644 index 0000000000000000000000000000000000000000..61d4880eb8be158cbef6f6804a06146ad5eb85de GIT binary patch literal 101376 zcmeFZbzE0V`!4(?q)SpjDd}!OTDnsOL>dI7yIVm*8fj?+DN#acLFtz6QW^|E`ke*a zXS>-x&)(Uh9SU?Pf%e?j|DFA5z830)TIRJS81pq|=B>1XpBnJh0W<(^0^9<)4WJ32 z1)vRZ2S5klE`Tn89)Lc80e~TZ5r8p(34kfUJpeNRa{vo~`v8^zRshxjHUPE&b^!JO z4gih-P5{mTEoZUF889sr&IUI5+zJ^;P|YM>+=kdp$m+#2}yr#Zllzv&3Ui~(J6 z>fk^goNzzmWaXZV4_9CXu-6PrKNq8K@hQ+Dp&d>cM2fhRq zk+1)QBLTHt7Cg@s zJl*~@#u3!W2E_b(2R$DV+&=4pzxRAqkiKT_tjr64YU}@6efYrhe?0r|wjX+OD>PWZ zLEex4gWB=)`wz`=2>-bMcYC1X<%osfxU^}U?$BI{Rw&W{<*IS81uT1vYvGAr;Zx;Ct-Rt-SXj7(9SY; z>|1&4KCs~!i9tsc^HekOgUqm`+19WLjjSo**Rs)DCMI=p95k((?{lmtnT=Y)adqDb z_BkZmh2u0Snsi{wDJIisrC4QS?vmu|!ghAvzaV_27DOr+=kf&|^Y%EV$p9G2!kl~)( zBFbD&DA6YJ?tCj098U67liJTT|LX-!6stYO^%Jpm>_hci7M{X~3}OR=^N@%>IYEG_ z$Ri-)gGCVqTvNiR@Ay;?g3ulSveft_9QZoX6OFVik>Zgf}TT`-Sqftz&pP*mchKE$^mxXL0`rpc_%Y+k$AwV(q*RUZ>C$)(wm58l$lOhZ8BhqYX22T)w3RegJ%KD`;R`* zp1){%4B9>iqzAO{|IytMx3P9Kv3AtcaI-aWxC`})iu@l7;F#1i=m)tXKmic5_}#IA z7(IIvO9wVq==Xd^8}GSp4^XSiAQwbGes_#Oia}%HU}j)z0v`FR$DSX%-*XQDxp!_P zRpc)~LOf>2QFnJ$m#AjM4Ygyk}_&u%VR?N(D)MsBVZ`ZJ^S) zFtpP)U4R||lElE!xAZ~K2c+AC^My5hHAf6O%~OBc8})E-fcKriT?EWf1PlfW%(n@u zQ9TI51NL;rD4;c+0<_Z-tgJ?09XA8T4@UJl3J}fwrcm(v$Jgxq6#K=b zij7iKZl=I_xJi4A%z1l2P3V%5+^+uiGpS*6c0Y6ZiVJV`Cy#dfkE$*WH(%|n={Z1L z8FVIjrw~=-f>zvthRDAj?o{g^v8`^0?2mUnAj>6NUmD~2$1j<>oA57M&0EkO#=fnM zEksU=lqYXpl>Iax$UttyhOmOULv2&Aa?4^9_q9g$131M=wV35k+JL@VyD@R%EG3%^zplh>kT1=-PhFsvdFhh8 z>{IQ~D-7w}DfB~%J^cFlMr4jRJR1GJ_Xb&8FlE?2W^;L3f3V@{R-TW4N8U(2oLITeg+GSgQFo4NUO8eu z#-Y0qp;OE}mUvpOqeM!tUS}x3h}bKPw}`9Gu~#zzrYX?K8(zl}Ac$?1#zz}|>26U&voWmR)Gj!W(2c_=$3HYC+mwqIsACZqGx;fX zh~FC-(KPd2dqwb!56&XeaW6+i1N#S;hutyX5mRCJf-q1Ml(pFs$A;Arp zgh9E0=n?aIU}s=SnPVsD^lh|$t=F- z5W}kd8rs+^fbxa!3Rd(Kg>RTl%{{Ba>X`keX9?J`c2^%{y}g09`p7A*-7BQwzHz3~ z>74C8G;7JfQ^cvH zVFgAagWVVTWWIjoYDqJi< zG@XL^CcA*Jvzs4(ob0{ohi{jXa?=UBzgMCu$A+e$9axBu@ai{{WR@FCR=DJ2-MK0&G=|6h!~*u@C4T(NxM;yp1{B(a4*aZW93VTeV^W2M4Qfb<;dX+CVoNA z$--LjtY*gwr1-HE_Rno^h2Fg)DerKDxqi!Y>2v;A!ZnTM7Dbi)nna=c1f%}Nj=3~z zznM9GvOA>xn)&nr&TnNq^Yj}+tp+tra(v>VZe4eHPm?CtHMbVVnIc`>^s)zcw++&0{C4vNU4whE-F51+g390uj)FTWT@hj&j5Iv{w>Xsmj^WG!LI)arA}k2qP8c7(EycUU(SHsaAk}DcFF{X?3mI? zEfLWh!IUPK@A0c`*eeno+kPya_mJ@IuITg>Jt&#{SPYBfENh}<*Q!$S-(K0bc$9;F zuXyQIR}n5s9xjU`e?-nu{zj`&(t{|?H?$HFT85V8p{|5ga>PGlbj4}3J`ZjQeY@(AcXwe)gQ^t8KHsF{Z43RfH4c23}fAnHw_cPhlHL4>JaFm%)9=hwedTLEIMy zc2<`7X*uR#2%s{7j_iNEEGme-LuLEIM8PlQa(=LH6jpEr9td3iDO-lZ@Gw*`kwjrx z*pMa&=(~|V2*RT9 zqEO<~czpzY=*>C}`y%>+XF}~qM;tlzVOzaW1Po~l((Azi0uAjapxpzclZ6U|>I#LS zjL>cZii37nkPnR^*#0;|=*x8ITWE2=bvyLVf_)8?Xc457K&} z1VB+J4;#TRtR4;rj8X&G8^BQBoyMHNp@1=jg9mw0L}6r~!IXl^MS)U4al3%9k;AsI zA-ymR_7wqY%UNffMnFHl&<{4O7ugtOB8TB4o~0!K8*;FtiYeWJwI>M_A;-2rKJ;jE z7#^Y^lnHi(0J`XOWQ>3EF@BqW&vL*#`)!VW0Q2u(4lW%$Zy({_X~Z$Y>41Q8e=ANI zgrMSn_@z3`Tu@4}3~5dz0H`RaYlDHtC>H<@D6wr}2MACcS4d*vXHk zBSORW!$DmEZ6l#+4s9bDPH()yhPv_RZ6wF30z4EC8d{)0M}*1+?`H@eG)~aI^UoQe zJE3?`JeV!ih=x^`B*y;O>2}VTu7jf9<#trHxM1WHV)!@|8BfbTb@{c>a zTgAvtVB}%>AQc{%2*23bQDh>*)2E-G3%`~5kN5wZ9`KCpQfgwy3EY&a30Pzbxxz;g znDnio=VBy1b}3(SbHT~N&uq(vs=2)z+Q>P|s`_pof)Xs5xXGeAkd zf<3)1fAx-)p+1Jr=QYal!K*u^4$Ns-iw82%eNp(>ElvE-qaveUB2`7McrAJ7XyhT@ zjP1Y-=k2@M7`boxwq{RYCfkE$(0Dwj)WW}oPavOH0&?Tn~ zJ-Eo<)+-ya|L98F-Ly@U1g>-)_IEj|IILZS5<+_)4xg@%Irlo+@AE`2k`qLKHduNe zBg-Tao^kaSyMXEPok$Z(qSbab(4ar-az>8ABMQNt3IJ>XM*~Ak6Lm*7OA`l3pNr8c zi{;OLNp!aMk&D@}7mK(mHU3))CYKdB##qW_QL`-E`AL(#FVSpWB668eG}nx|5l&{{ zaNqDuW+Nj-cmx=U4%toGnZMF6MMHP1n9dQjQ+9KBj(>Z#H`grL7AecY;YP5PbVij> zg4WXdwyElb)oYCGJKsG9;;8*TU3oMYgY@B1TI00>e~Qdk4S5}l!R9guI_})>?KFl4 zU*{h&GJA`bLDcY9+sQvJdmzyt+%Fcv^Q!MZ%7LGAvxCL=C#i5gV1AV#>H$cSG0JFq{j%r?iLSKkg17O+DnGvd(z=AM0>R`=HJQWm25h;4Cb9`t-A~ z{x5b1|0{bEXm{|(r~dEmNmM{v)y^sfg9EG+9_qeR2TmS-yM}u4^v-YBXDvtg*Zs4d z4&uMA&w5cGlnnL7kMf{0Y(X3}M?ly7=AhB}kpdc-(@q8Vpiw!Url(Po?1hR0{4-rQrNj3dEPMB7OmH#2*Z1hL@!m#xgPvt`+(qdL}NlkKR}tjw4F1Y&!LnL#wj`itgHrNck5r z_XlPC`lwguM%p&l$5&L*3UFAy7nSaTRsr@rSnjp~GyRL{x-GIpVAJ z82O0LbmCR-v5T;0*4ZQ>Td5UZS}o`%F0&EQO6LomLzg@9ZMbZOZvMq{4@+ZovrLmo z>B-z4K3B3MuKiB8=pz3&;V}`c=iC_G>58UA35E7za}IlCHE&>(U43tC^lW`oOXjv4 z3i8(RzkL%~akF@riXKAyWEpLCU-KSUZDHLB7_L9d_s1)Y`*om)_&`rVJJX+}R$xRU zw1!D+`k#O`Y``5SDz`ScH-M-QTQk~<)G{VAJk!VKF(G0^6T6M+$_|h6oGf&ZQ;>-$ zrsQEXnLgtzWVJ)Vm%+v7CXF`L+{?Rq(<=j29qY3hLa2gWp}qpc<^Ardx0$9|QCa+^YC&P95GhEN2aL$Fd^9q^(YuLe*#dY_igti>8hSA+$3QM6k zWq$7$4Ue}st{Gg=dLYJIu5)MwP0T+x^RCE{SQD6uLDXjkPNzo_mgdGLiUtmjCeR_} z?-v}H@mAeft@M2>)vj;T|=G|?qTCtM8 zyAk~{-6KpC~q#Gq!C{hqW_8E4^SuGD#CC%Y{ORFRxjb@IJ9sx?_l# zWnQ9zeSbNJ26J%rT{P~|!zQ?m0gn|^qKU?DNPLpfSA*n9sAhO%69tDVr8RM~-9wqL zQ{s6zU6lPqwp!OUoBq1rT`)@d+sh&&&OOAK&=SfOM{V{`EVJ!8u)fYG{jQ#b>IFe+ z-`f}#O>gbZPzl()cw+eeGJi)aqO|@9cH1YUxB|KjyqbQ|QuE+uIdST>5z`0z+suqS zI6Cg*;)+cSoV}#mC9;T3wZ%InG*Lrt$Fd4a4Evezx+4FSVb#HqmD_Xi6RX_hsD2 zdc4k8Ka~^(Z$x|nUCMgg#baBlJykL4MI;t_Bs?36g$zHnBvSE{MZ+QTocYnK>t>lZ ztLLvUdUKEl>|m%~tvAq#sT0+_@h#w@9wV!?%e{1c^tT%cEtle76q?%lIJ%(iOHE_- zZQ6*0Q8UX7R6KrLLaC?~$88dhX5LP6UryZ!pFFIeh2$Ojo4PkIjHLFCTj|rBhghz) z7jW`Q*-a|lv08iZ+*MZvrB`5$aq78=9jRm7O%v-Pc*5St!r1x(7IC^*tqZ>&~+; z6w*ZZ*OY^U)H|)yL!9kesBmyt`|aPnTF@xQC{Q}QhemQ=2F5eJs*%TgX}Fz>db8JM zTT6>{^{MzhGBc60Jh#*~BMIjWo>H9g^){NE%UzOE=`MWX`r0v?3io zX1F)R@$80QK<2=OAQF`aE9*{2i-wC+XaY0T`9%RF`^o)c zi8xQ&&dbW*b29?z`IF>4pYgo(`90%Buu}e|Ec%%Nwt>8OrwkAqhJk2)6=LP^TL!?# zfuWq*3_v#_H9Iy8VQT;wcS1G=^dJrnhPrj8U;6#=Pze4vTLWlWg;sPZ{XX!2sO;fE z{0|!hT@d`CviD{DYn46p+%uKE2G9*V0)4Xy?B81;K$fGR9jC1*0<24)zzYGg<~XbM znKcKL0#e~Ywip`F#c#G4r$N}W(_;#8OLL?96pl6&CdTHD6lW5i!qME((uBeR+PT1B znb=S-QJ!UjogG?0S6~={gL*&^1b_4Z!f!nQXdg#fi25Bq$}p}Ij#9%^~oY5KDRnzK4TJLP}BZn=r8<5|NUFx5?r zY^;qbEKQtEEHO3A%I2O9stFcmrmtbU`~xZmt>|0PEchs| zc^RL?Z@X68g+GU7bcT;qAz>e4rcJzc5nRBdS4i$5RE`ORS;0Fr=UlvnqFs_G@*$XU zSElod6#PwF#F`%0N-aV!yQ8KTm#<*=dl@``l6m>*4T}(egXUxXU1)RTKLTDVF6Sucp-PXfNTMZu!}NVg+*VV=D2at6Y{oK#l1C>qI@tpvDYvsj*`iZ ztD5KSWBo;ZOJ|l;oh;|uX1+M4(P8-umz4aHF_S~}{>}M5AE!5HF_Tq%>w zw|xn#l;1z7j8a-W>?e=)WN5Y3DOX1g@$-B0&R;!+KXU^XYv@e)&|85D zgd2o=o}2;x> zUXOu%<%0&o$0db)=ZIZZ&DErWoQAQk??G~vu@PZtyOuYqOq+t^obNviagOnaZH>4b zYcan<#Z~i5Re#@CMTH>VU;Tlfmx*%|??G#^LAeC3tQI}~YF1_7YvIb|UcR)vn2YFL z+^kvwb?^Q$Zu_q`ZW}Nr+6n|_HwOP%Yv`nKIX`ncP%Hh49-se) zHkeO-;8L@iec+Y6?~0d^;y(w_&|J<{z1))`jvC<_FQwiy%SU0Cmdd+x^){Q7bje2PPS8lIKBJ$wSTC4i@Divkl z{SLQU^kpHjxMrdJ>%;Pjhii$_gx@_mtDmjkK72SDGW-;$UzYcaJ4aD1ZVFrjHKN9| z*Ctm3r#lFE>T$0JmIt*Sj7W`bEi$Kysv{)Cyi_iCtBDX@m)GOrvEa+I(dNhHW!Fx+ zhnGXli=laBjc~J(Ol=01w%>~#`pyRahIa04;dyppHw4O~>L`MwC)YOdE*M`c9PyPX zVa}r^t>M4ZCSU7-x!`vF(LIBN_t7jdm1ZKVy742z>`V)}Ov+l!$kA7AJ$t?wMclqA z)pxb$8uB!Eh_{1_4QodGK_gEw{HCGS#r7lkO{40$XU#VNpUgNJ;HfgC5Jr`p;`aUTx zy%uYbY>oEW;g5qYZLmzPQE=z;PGuUmlvgj-e3XBPCBo;NqsK7mMUy0OoJUUBY1>zI z2m4X9MNwQq>bfuLa+=y}D%2n>y)^nMy`T~m{+i-GX=R07CVt~gmpwS zaQ|5Ygz^II`3G?4-X3jbSEFSi$&{rfQ*o)bB@ zOoE%Eao)tfS6kI|S)=bhY>fsV2}pyF1T09GVrQ*;(T(EARN3}2vZBZZitC-Hu?#E< zq7({ky6S2@*eaCY8BXB`58obW5_;CGzEAG+#euKpD6an5?a)%h!I~88j7oxc&2VQQ z3Ai5t@${<=@OkbFdgCYeH#WfMZJK}2{TCkzoEMtEXZ$<%bLWTd_uO+}!wL!DpFa2a zv047{k-$8((*y2b9|_>-6a3kJ4%(fd!2h4JpMy3yKQ^XN$*@0sBtQYKe^ZbHOFDR9 zBy@K5M@zbqQ)3S(?~lzDl0|7(s&kCTj5eNA>yniSmo7@sFwh?;qcse=UB}1pU8m>VIGU zRaPCCQy0Pfg48tU*-%)7qBT4RhSaW1t@whMY%Y4BRE&XNGhD$AEbS5MRa`nb_|&Pi zt*g||YnDF!9>;IG)>8S@+tu|kyVU$B$N~~aEWRI&dKHT;_*?c~pv63iH5l+=elvo_ zM`nda$D4VBuTr%sBX&eCu?4}cvjgYR{R-?hqx}12oV4xD7vu@t>FQ&(Wh3y!eI&Sqr|QyWF;G-?*c7fperDG)4wef6k%eoH0ZJ6 zE{;*heaj(@peW~6>{Lkl<N*$Ye-;JR8imq=Gg;yEY;J?^6TlDqe8+PiLAv(5F{H zn-9RJS6-_9O_yk#*>WPq*|NM~v-Cb@RHWmitK-ToNNCk4f!Uk8`9jCVp?kBjpC|~E z3Xq!S#6>#HW}SuVef--VWarVK+;O#inB_5Eu2-YdmnGQ6L7F2|!5)W;9XzUBqgH&w zxUUVTUrutI+mPBPFUn4Dm^>kkc!pPDV4F~F_?muk#Iv@Omrd-QY08a0CCrPGh}PF) z70ee5GoG={tJg+8Gb#8$)>~e+H+1yNhTeCJCky}$4T0tbfTNj-l?mHVzlsLd2KP+t z&n$Hm(V8f5L}$G+Tp~xW8CBCu8kThwSMR{YQ%J;G()*u|4=>IKTufp-BWm_Foy{-;MJ}4@mq!=n^8l>E0 zp45F!Z6OpYeS2wOmtjtFm5CM&p6}O{-|Io;4*=v$hxF|KQ~XrzvnHIK!)htpjPv5x zV~@B1jlL0`GYPU&$jFQ2B1O_>>mV}oNAa5KnWFu&UZi95zHm)%44%MMud`b+^}<&> zKBc`ARD`fkup=W^cBw6Q$y52Cvx`FfFamzTww^X`*wD=EE1EQ<(z zRb6gcG&?8%ZJ5y5+Ua_#DO1clTpo&p5zPjh4@0Em&#|U_nd@Hr+BjBJPdXvnh!WP< z`EKgnFS@2v11A|q8*|~6vswL9RW=HvZfB-hQrPq}lP!L<%#2{xF2hc|a^@k!!^lu! z7qNh71RRa8AX42F6Y)K=;BF4(RJzh79QlempBcTHoH1Dr)xYP zPt|xjAAW!LdH(6+r-J<6hgms`%oFcqHFdx5kM|rO?i+n;`D&vpa+FEJ*704>=ljBw zry?atH;}q$+_x8BPU{MKY!Bwu`|Q4guVdMIhC$w+AmbQxIRk+#!1_IV@q#gRcctMa z18v$P^<_v6EXUIMk zHc93XSext8aAD`kYIf-;bW|aPVLx|uv77r|c}+3Hv7a$|GMLYBgDZvpa&#bl_NVWG zk!T)5=^tLKl5Jmj;#t^>5OO`?R+6!dv=Vn0(R%--L(b>8IEU*arklbmwzqP&vG^UM zA_)?1qKHs;a?C3V-sCH$;&0|)B0c22r5YC*khs-Rm8LPX9LfIJ9WJWOqU$c)ete2I zdVzHL`0fa^bJUGKS%R+dgs+_TLCS9~J|19P^QBcKKJZHs4K{q$bCbX`qMA5!x)GaC zYh~jgmTyD2mSiF;<7&U4=(kP{Grb$-&LOr6F&!bEA46(b%uM9g(w;SS*wQ_>c@pY- zd=R>cl}3AjIOk=D{HCz>N%`CZ6ws8pI(I6T2+Ex--cMr-1;+N}zA1RW!vy9_XaDzgG1U~Rk`2=&p4a(Rs-<}-o;{U%(R`QTdP0L zrVOL|u~EDfA5-OZ$*&3(wlOUaFg_MhlP%q1s8-!LEJ%p0r?}Z}a44cKxk+bhQc7rs z{oOW)iM@YsY^O@)Vi04j)Q3%Uv&#zWzGi+NS_u!+{XP3nlO@B*C<*^#NZvK2RdHaIPn+wx;?}wsO-%Wqw zcJ51gy_TX=BV%-r(AmeVSJsK4-F4gycY;$d$;9itGy&^5O8a*pVf;|?UTue%Dh{m38 zF<(~1tp%#AT(Q>bUYT7duXJEc<@t`f))2>I5JnuYl63O&h>zsaJvMT}yT__x4x26IV4z|7xiBd*q6r#YH?p)>G_a)r1z0;=HxQySb9A)5&c^0o1o)wW1FMa#i8Z)q zYGZF@;0P}5@39%%8@Paitt{C%+1Yv7tPISpsVEHZaR^aaI&x4^IJ$z6@qG|7yvGT} zaYAt*WPBfl42+DxKNkThehd7F0r$^h{*{L7M-11GG~7R8xPQd({D|TC5ySfrz?`qwppRQhWTmcp1jOn!5Rj_TMH|b1CjQ92NZuxOSicjt z*}E&1fn{O8NJmARjXR8&LNG0=SJ}F~JqgLMKX0LIxA-O?z0Th?3#D+yJ@Ta)t!U&$ z9i`vd?CSHMvAguKOJTAuPql`=Y+Fg}W-LXkxlQ3J!Guj-7a1a*Ba-x{OrrvZ)l1#M z+aw%|IM}?Ut@x+^;zLYs2tl#+0ro=Kz#gALJLe8(y0^Zv{hfFL;(Fp<=7c#*{N|VW zq7xq@lTTiH4QnY%mpsLL{VnUp7cV{Msr~=l z%q^60{37tyR{%Q^N|54IeFa&9Dj2xgI63}i7J7DZDhOWPRI~wy{~U)}3e70~X2QG5ml5Q&Z%Q+3=mg5`P}s9sTJdjpFH?0e z7ilW4<@77OozhNB;``3Sre)sB)=(@Nzw4e=NUJk9H0}8L_9{=_T4-i+k}Q!J241t+ zamCyiE%)RFMN(5ZT37Pi1!t0i3x*RR0*%6L_T}&BN0O18_g#_jdvoZcsCk$VVd_ec zL>tNAjLhCuuqJ5La)!Afk9u;s=M&MoitwTbxGwi;3c1kDV@dSnO=NPVBSokX*mq1uKL>h7%#N zELCr=CCQ{OtBp$*o~<{hNOgm}dPZyo*Ra1DphQPf$OH~O827%l*v)l>H%0NxCW*nc znTXurfs=eC9`h1hVHCWaKk_B?IppxR&`&fN+UpRir{Zx?$_?RpTB;1`5uF)GwGcuBIo2^Mf8&ysohzW)!Mr25Q*r zQDWS{T`Qs9Zoa~RW&|gcyq{5B7BI_mnK|P`8C76q+vdIZi4Q9J(L;%=J7~vQy=fci zFNJWfhY;gGkVYdOxt>)SAI8X+i+Dd_2}YhRjNpCKZs5uh<72sdbsHbvR~0yX32>O* z+o!&sl6NmcGvSphLPK6X*V|T6TEAMo z&x=4X;eT>}WA#2S6@Jgn`kz6#?U+7b{b736DR0c33RzH2b7t%_bB)9#Yl}vC3eM%6c#HB+YwSF zK77Sv-|oV>^?dZe1@AWU@ec znW$9Y?%kABufpqU53!GraeS(EnJDWuKYx(LLl1tEL^X$9WN#qh5R}f(hM-@zyBayy z?Z*=M=sC;1(e7PM{!d&gMDmmD;#UZ7FA|(JeC-yd&3PFF)QH*rV^R%)jN}xH+VD*#u=o)IGYFJ4WjrzDx=rE zCFxP$a_g1euIBA|xZs&Rm4!(HDWCq=mzMEWyPs+isQa&m6GZqCqo+Oc&Y;`azsPK- zv{h_EbAe-7U?i@qu*Hl#-JFogT4dbxN$^SYH8!;(ah><6@me^6iaZS*qTY)6Z*%zF zG&A2;^9@J$!Uee6@ea!gmYF45Y8Y4IXMSTw4)BI8Ag)MI-}8;l)r!p9w28zMDX`=8 zC%fAGO6I!@C7U#*-XQ)RGu*QBH)8ZeC*l*-1owuRxW)3FAHR|43rpme`s^4ElT<^y zE?KGUlO4LOD}sI$u_q&$HgHjQG0QCNK?^%sqU;q_czFiqeeDk26@(cFsmH#0pX|DKH2ybB!-c#)T$h%PyqUGWi+N~P)= zvhqzPDGwDIz$GxxkO|M$p{w`)q!!C!vaDa_ZAbs*%a(VF2V0`c=I#Sy0Rzk8L8_Jd z+K>d57fSZqrNMR9!gYy~o!5(TS<7)lmt;qlj=Fk8YMDOWqLn|+W@_=xSW98c?0juM zwK~d&ccIe8i2;8|%?fQ}%bd*p(d@ME-PWm@6^ni**W%35>69|PJae*8JtrN48?Q;4 zQQEG2tJKmRLn;!yP{jQf{{7}g!9tpx=ADn9P02afOq~;!q_33<>UIP&=;|BBwG?yu zdv)A>zu_wD?n->eIt+)p$hkh*{%&#Dw0r#>;&?hl0*XvsO%%gpbuo;9snB(7Ox&lN z>gp3U^A4_o>qHmfcO~janm-wCYU(JzZyDt~I1I5&Iob(vEa8WdT*i{@>=?^DN#Zi= z99>XC8xqmH8ES8NcjbE@XO00~qFyr5^d<>=S>jAb*x-f>BEiCn1ZO5Hi8O zr@GikTw8?k5vKa1gXkq;(l6UkV!}MR(iC!=5=FAb-cs^7^1B>hUw5N=V*QyYYM!y1 zJK;^v6;IZpJJocL_>5{|yv&-bJVhC0OMQFrqP!bpy>umJ1RhWD#*;5xTwul0>HK7i z=v{i#zFi_?%Jc43JaiYj3&@`AZIcsig5JhTTu}>;z2=5cn`-7GD|^FwQ$?D@(c%iL zX0tU&6Ac?b@ex;CeHkE#|H07ODYGKU@U+i_tl#TUz*{NK!IHwy!BW z-6RseArCB9VQI%)xk47U??u(oCL!A8NY61QD7}_EtN-dKZ%#@=;W&Sd>di)kRB+{2 z@~qE}zSsl0qZPL`Zcdmlhx*&~V^dB?cJVX`Ag>ru4oS96sugu4?BLv%GnzC#A-YD> z9{0ck%XDhh>An2yh40qpcZ0u*#XB>`ej0CI=Em;e88lz!aVMH!uEl*Vry^i3lR3UZ zhWVCGGW45xsc;o{c2Lk{8=Q$8=3**BmQo|>WpPA7cvRP>t7*H3`K}ts7J0A;QTVB) z;9+v50}XK{^~kbAm<&Cf?F4*EhF~f(6tqW_cpcz>&m0Pm!KXa-Tic!W6hi+UXt3%|kcTEep#P;2r{xgQg^wv7bVy(fI{$Y9a zIt}v9EahblCYROfxAAuhaH?#dm4?M|#=1^Cx)m1^rQ~#7zTJv*JpMDIvt>*E^#%@U z_i}3C;BPt1<;f2pHSozzq<`13h1Jf(U`iyQaJUA98@tRt8x3y7}c2qWeeNsdib>m&e zYJMAeMri+ik&uxrcE`k=u_i;tF0sf0n%rkIc8MaPB8PPEBtAO6-oDS2<+ReWZoNwU zZ0YuL#OqkfcSm7^oXTeX2XPy9@KevlKkhh9`!|iNQ7KBUk+f*Y6I|B0sBp<6{*~vE ze8!ZF^t%g0g2#qpTkezx<`y5u+;+M?HmRujj z%Sh6yeB@;L{3hJR@9{`uwW#>o%-wWy=PlM=ECE-drH5B)PHY}#Y`e{QB&D5DWn|8h zQ&)VY+M9abBqF>*#QpHw%nprIl5)*q&DS?GA{ef#>HUTU5+~W0eV0@N*^^FGCl3Fm z?Ed5b1wOx2|IP}a&@UG5^QzMGtJm)Z{KcN}{Cef| zhPzs>IYekAg~Zx3jJy>nYxk%;{2DRNS?uaA9q~mL&o-Db7oBb3O_+2RW1FVf^U5+~ z_#S690*(0+_scmU-pDSE(v7ZyR|vR?bYJRWjUfxR3jeZ?Lq!{Y#m> zhkfGOA27YQw%9H4YM`vQ-zSO#_bI({(-YDpu z#-bF5X|LglY~1P>vC*R417yiBA5?hor=Gd>HmvEvU9y&{U5|MD=zUNsV|*pIltin+ zETx^a!#i4%mjSf0wF!bHw4+bBMyL;Lk%a8od@tlZq55R9-sdxknj(;_;~;eybDJmD za5Yt-?xuvyck_voN%@W4$DQ9TmpZ~e%nm;+XdJ}061-ej#^LlZjf&%u=`$A6$NGei zvvd{Ses(3>&yZFy_Vgj)4z6h7aUfo8(&H3L3by_n+N>I7jQikC(R?RU?U3|i?tz5O z*Vq9lixDcg(ieOAOseZ&XdG#}vZL}^rOwj{+J_wwVpAy?HNz2EE`C6XdUQ>17{@T< zc8Y56HR0vOkWX#bGHDFVi`(vLo970HlNzIUU{qIZmc}Y%V{51yX(W$k`@eVPnp^dJ zZPUO4V_<&8|$+8y(9^}+0#C(FGWdWxg)GrVRi<#!3b@(#iIV)p3MSrsC{1o#7Z z2A#_q;e5kc4X(gOmT92K>Od!${--CUSg^G&8cR&RJjyj{eZEJFaY>v)gK`BcW(7mx z1lX(_aTT^Dk)M-j)UpF#3e6)d6;%|cPaD4`>9)RLci}*KFPr`7A&Cgb12;^sI)RSI z9J_a_N1L5qhRZrt$Bp{xuT`sVXBwE&qG!#-;6m63J0`FNhkWi%_^J3?KX-x#>? zFbU?&6c$I1J$o+oU_AIk@DCrfCTK7#tcKS1tG0z$)_JwQ)Z$ zsQ!lw<&9H=d0VhhI)N?xKMUnQ3*}!dlqVbC3~m5*mMu`Q{;h>FOszu+*s0cB{fr&I z`GEyFFq1aURoC~H#h&jwyCjtQSI**Jb}c6m5mz#Z?hB<6Z@Sj%I7z*{1uQqZ_6&JH zDQGRXzu#~;uJd^FW|3Ka~O_ zn{^~Db*wSfrgyIF{ry9@;b@z<}itTJ-H!{u~`A6iVI9mHmOM4^7y_zOzAp2pBB zo{pACnttdq{L0KHwSqiN4XhXHpGfo?OYXEI6L;}5)+k5jwUKeP>b1{s9L3H7Tgm?} z;d6fQ|A)dS9uO`VOdkjz?0-&n{yEwC>yw=-HL{TjAbj3}iSze_k9vpoI1oNWOCmTm zbY%|oXm8bg`K;JvEkAT4TjrP31X7{eXUX|Y)6mdZC5f|oGT#dlXj=T}z7)2^(L6M& zR?K!=Eq$=qdi`~5M9U_TUQRG#1=2ioynQo$$@8A4yt08obDL1yg*F`V+@L^iOeXSSnUhL(iy>>GRDpXDVvfo;K z6K++UTs&;t6jyRx+7)}{M3sPN!a?3yT2qcOFZr4FsD|B-L@DDrZ~6#2M{M*{ONFa+ zesBE()BN{&3X&%UG$%bhknb`R*H@-gYH*Kv`9@<$BDa zY?}8HQCT*B-+|Pj$zfPB)=P49;j+9@W)f>1A==q`*KRQt+I~N&fKeP)Qv8^&4LhVV zUg0})pBua;`-UiNr+YrCmh%*O<1Qc$u{`n!4isBpozZKEC3Oz^Zf7d@YMTuH(6cG! zo8MgW>!q99nrBf!p$Bw?G8QjQ=jN zcz#;`55*$;>0ycr5R2LWC@=mIi+?Q^w}=dA?7*ZE1)sA0EwQ+!IUYR*{%yf@!4Y!Y zG#-0GM-`G<`I@O7Etfj_9?T&0#kGosxC;me+vAgE4LT`bA~k4kcA%r|Emg6tWJ&Fk zSGc|Bz40VJ8n4G^dOIO9Dnxyc^RqCUa2=^fA-B$ZL3K5SnpFB)>;XNW*KBV&L&?7@ z6=5P^X+89uqj`^Skf$#7sMT#xm*B?RmvR04*S6H_9Sytm`~-Tg*IK)bw7D_XTGU#< z)GfMYPVIfW?>bSxCN2x7b;B{IY-s-r0;>@;7P<6{!4}%YyKqxUx64OZbq5E&*hE~^ zw9y~i&7JY#?lGiw!@}c=BhtysiT;+&OsI|0+}ic@O#)F*5}}}V8jrjY^)o{E)D^J{ zSx<5G*_Tq7ee4tjCyE_~Yd=v+1X$6LQCkH)Ee#Gbysv3Ym(^q$D|oj-s*Rke_sTAO zss4#ttBZlqb(g$P6I$7{c%9Q8CK;FGg`X|Sw`IeN^m(o7eyg%GUgGK}LVbQCLW7`N zINO!a6O|)JKXKiLaVle8{(G)0nQ2a9@?9hb-_NvP8Q=uN-mS2aj*W4<-U$kb5kyp< zL5PmCD@352_DU1KvS1pIishvCU`*kj7KxXE6vxH9hhB3z7n6uXZahMoK&bZ9xD|Wj zeUFX<`&=+_R-?EpSJl#?Uk0YD!^puwsZsY+F0w}wCLEf*2V}$zuI{CG4cJ}>@=(KP zIhD}_G@_uT?Bs|nVSCm`&|Y!A*Nge)_)_zQ-KA2WYb4QKI7spm8{;gqRCAo2RbjXn zEMB~d-Cn!dX39T|twEF@meF7rY@=69F7~b!rkkbE7AMO`E#MYaASQfA5rxGly z;t5|fj?Ma243h?+PV2MS-+YxtvQED=AY3z~y-;A*f~>t@`LqoEg=BHaPO+50<*+&i zlU7M>wGvb{Zco&;H?@v^<0ZHG@Gs+5eUX_hR(;WsKcXOuQ0`7`oK0f;;Z49?`2W}5 znZQ%E{r!KNB6CrulFFDAAsI84nFd3la0u5_hlr3Qq7yRTq7X8V9dV@0B}0lNLxj*^ z%9zNr_Bof^^&76&bN~P6b$`#Zw%5m5XH9#p_u6aNd$YcW*BiQ578>wj3@yivQ$*h< z_}np9zGa;?6zVr&JHCnIa}R@;AfxJomtx_Go=Hu*8CPUZJm*9LbhSTe2Jk(2DubBE ztG4DP^IilGU)o-KZ@pfM4Ly&P6D*yoL73Uq{gzviyqqtb`HYCMk=6}kY9vd9`OSKL zFAd(=$BSDwsWu{B#YriXvkZ=PrmC8?yIHtynh7=^^USy|)x003l34?MS$sgj#Fqz+$(ZP%J+x~WQ_3E+mFV599#OEi9V6N5#F8KTe zK0o=B=O+W3&d0HV+m~}|ebMm6s2<&$w%a{*DPclEj46=D#NjiR~lmXF{;E{WhKlXkJj$(HqG$k zl*@Q3YA{9BMa3kWZMb*0?H<1~WgRwUaW5wQy<_TJD*V$mSo>Sced0f)%s6~da7eM_ zlyI6hiD)SBe>kZ2PJV&$T2(r&_=q{>n+PGjpad%ZGke2vDWVDIa$Tj5;ZB65`D9>E z>PDKJGtptKJ67MEMPE6nM&S}lE=pf{<3s43pxWytyADxss;nWAfq8*eMa zlJ97rvWfWOM7O`r$3ZF3hr&3ogEfDTedxQ=mWj~@Y!!!H?xT!ER;^s?ugO7S<1K{K zr7>NGcN*p$KGx$T3QRKA89j0JyznR>Rd;vc9Dhs7`315ir|??S+vz8;gOr!wO01Li z;W>DJf99_TO78B+q!S;+?fA?!(O}y!IS|CIVSI}VtAe)(W*>?vilj)xFvkUi2e~S5 zTEtg4EZ!4y3wZfXncjZ=!OaDquR0V2X&=xr=J%l8DRVc%U`a_*Ux6v?vO3eYD@+gY zSVyZ9u5KZo=hNFp@h9EBOiiz6!xOw4sH;=WT-&5ehtHcK@)0ZvjD>Hk>|4LQd(`J> zv|mE^ZP#=Ak+G@II*B8kNLABjhX*0khPs$)}ILz-m{oW_(a>$^@?wlj7r`* zh*ju)mZcYyr;#;v^NRx0kr$)1eaMXPw=C_VhZ9H4Ze9%R-*wm7`l-;@)89`{Rp zS0{y3_Ba`?{}s*CAcq$G_o?sOWbNoE()$wo_;kMXyZ8*9DZOu#shOW5QIs{!s~OUN zO+(~UQfp|$@Q=|x+bv?Bi}w^~;Nw*7?d}zRe6#nyj+4Q;x;N8>nC3*sCV`igCH!O4 zS;o(TJNpSYIb9|@j(5Fpk(;5dT2gdR@wD3#>bYs}`PLk%?^(G+lSiM8;V0mRI5%W=`*dx`_QR3JE|{cK&|>w!U;>kpww}*hT|0yxuT*GemL=s zk+m;62AkA1u%6#qBnk)H=G5NQn^Zmbi+phX-YMCa!Qb>4#2!tZ61nt6V!}&O>h)CQ z(6x0YIy-nBb@X=km6%HNS0=QF1lKfj6NH%nVuqLu$kh%icP6Bk zR({i0N*0(9R5>>{aNg`|0Z+iWI9%a=@x;0rp=*H&li7Z0#U)b=CqI$PGL#+F-F7E8 zKi)GueqTj2d#Yph^S-3x!B&e-yIw?DXyxd83wQX1H61M#4JYd~A`gGKVJ5xn<&_fi zIz5MsrWhy96fSk@DtcC$S?=PxIp5-Hb*C$jp47-|G!K673t_ybg%cSyzkYkF&|h$d zZm-86T`%%lF-&CaY@mBwh)~_#&=?+*cQ2!*be__T*$nVKi^}ze%yI_H{rWq?Miuf8wZI)`DiE=i`;l3bk zg_|!yN6Ld8KS{=db;wUt_e(bTJSLmWORWK((-B@?xm6N(@j!Cwo9`zJ*Lmx=HO$Rn zt2sC=QucLnTr%x3^?JWsRdnM6$pif&>wM&w<}5xvPxv76z>ST=E>^!1XCy`_5cEsS z3pi`Hm2J-5N64R?$j^LPty_IBKz%w; zvqUtlhYYgE=`~TF}|=5c=TT z+r}++_10jZyYRy)>9NNrJX5V+eVp`od1<)nYi6RTr{KF}XKFsdS+3JB?(1))FS>i~ zWZ`}@q4k{$1n$gFn)l%)u=6L-GDf_@mNvcYapS)d&-iq%H-nB!vkc!S zEsCkLDd>62GTX=#Ehpe%lpo@yZS}o)6f-DRO>KG0qGr)ZxYKGOXw-vQb8FwOB2IDU zU0j+Q@6)}16UNB}?i_IeoI+(z zcuDO##v9kMpMo)$#+_AMlR$s$442LBPqbH4y#2iRy#p2qM}N3ZXFdqAN$Y8k z4}D!%b4kYNlw(Lniw4%sd1&)klY*!Akd?x_2Tv$wn+F&Zd&o!9)VQ%zJJn^cDxX#k zuN}wyitdZ}_Zo>;_k_PV65k`fIbsGQu>rhyfFtprkHl7kGGYueOA^)mQNbr&?%nZJ6_#{&m3#|I4nK!ptHO zmfFjLwdrI(JX_S|6Y5?hXw*oQw|{vU*>Fl3pDGqdRUMGd&EIEE7Gu;qL7ZlhZrhn{RQ?q_UNMik!)!}T(%r=F z@zE%`O(F{&{d;*|hL6yvcUhf}%ice`t=jPR>20ckRn)!}@9&x8T{kV7=wwBzKu3 zbC#|NvFQ8av3_gIE#W3X*GTu;-8mPIm2GU&Pb<{C-M{N%GjWBT@i*gU9I@LwR zP2OICxW1PgAJb#$=`DsAzCF>3s7U!RQ{yfEjrQKuObrK>FjsVU@5m6tbpa2#=@6Y@ zOWKQ-CQnn%WALpq(KhQ3$!;*++1}SZ&oMREEcPI1RxaSG%E=5ThariifYFC4&)@WJ z&XOCpMB3j~IN6xxyrtDH*XUM?IV}~}N!``gzR4*0{+9j0TSw`8&3EE%*A)&cz8(!^ zcj%U_Alpmr#qQ~IjiPEmU9u5-JOCHEH+;%V;P7L%bH8*tczNAS9=gr_jXV1N9L-KG zy#un_O?j_6UZ2=-DEiL$l==Y;+TpGvdn~Lzt{)QcpLE^#>W)hEowMh7aSn$&T%WyS zd3<2ITqCx0Hq@D6r&g%}(~x|@l3zb}Q+=-7#K_yBoZF(+TIpp+u;;Ztcsuh2njGj7 z?;W@-w0_n}PGdVI!Jp%ZE%hb98%cuC=HHAP zfq@A@O?RWljkXfQ*J#`bq(KXdnx$a@1zp}bnH>1@fORJY8Qu6<5Kf#eSB%r}SlLlt zMntX25I-cg05!Fay8Vgns~|S8Cx@W5zD9JDOaUzcqw5t>v;Q zpx@0P{cP??fhv!znYD`sHTr|@!DG8GkpZ+ zb#SCHf!7C!KGxa=?8Rf@3N{S_`6n`=wl-0#^yong&@Q`|Hpq>0}%~sPiYy=W)O#j<`{Awu>{tAeg}kFMM7=)q=G9Vy(-}! z{_+KGQw?qTtj(6sU1>&LSyvHE z?N7NQnl{W5WpSI`K9w{-=BL%PvPAquNq=VQA4?+~u3~n_r5e6a?*Q z73Spzv^g#8t-0xbV9vW^n@%W-O4{06Rm|=i-)pq(pee!QEG|wbw$v|oL${YGjirbQ z&E4#X0M{GSB0Tbo{pB7U$x4cvt)D6`9Ef8)sUL9qh+v^e_p8GiUCuFg(h0ry<2Y=E ztlt`>>1*vDyz-9Mgd!?0&yr1GIljL>#&$2(JS_M?D<&;2wl$k$ zbgKai;g?OB?~f1U^hQk73|Pu=osOG+{Pwcnqbb&-&Z0e%kG-AKjbcO}>Qo6%54-Na z#Tb+)fBC$R0-rjDK{Q6z%8x!Z;{CWBCrtr+V^i%*8Mjz1jqJgWt}X6TMeh!e1^-~7 z`nBVsil+G0>cDBexWx&@;eej47bSI)_LRT4ap1falYj|oOV$U?wGlRsD`g6N6Ok9DIhuK)Aj0Wmwqy8~laF3+6l@i3 zEZe_912Y!cR&srT&p7+joEX_wrc&Mm;%&wClr5A~SxrqLu`=ue+CPGJ-abStr}#!h z`-KJ@%QTiVYp16Ieoz&2siQYaS=sQ~xaM}{gO+=(tb$*?m5q}nv{aZag6WjBxcPZ^ zM6X%L;Mbso{Yxtw6}seNtZK9T3o4V^T^iJ4nulmB_ytW4VT=_zq~h1NxVO=X8N7Euni@@GQ1CN`8_m$J9nlv^s_&z}sTj1#KFiV<#O(iiI- zKN|B@?W?ZYNF^aO%{O#J(n>7ETW^m$o@w*3kczWg$0Oet_3NokREiYsIVjN{;h?@X z_}4PSs>9lW+pJSRA53>+5vs0Q%=4s(wpD*P;V>CI`0dG~r2Qw$S&bJx-US*u zi-8S|3rzMmMwhewzDxWc|7CXdv;=VcbgbcDW>?!2_&xQXnAuo8%>ABlEnB3oZoA)8 zM}W3Qhs=LtW+RHU3i-{I1p>7V&PzCiM1n^R`1LiJB&5YaddZd;sW@Ot7LkR0h$=C0GjzBXD3$|9s?I^ zD`HvE`k_H+6jBz;B}aWx8pqHb19^_421Z?0st5f4d&gyv%n#@akUtQ5qY(fU2y_i7 z2q+lnIuLqM-2e&!3Iz%Sx(O5x6af?o6a^Fw1kfX~K)(Xr0=f+p2NVx<2k0(P0#G7Q z63{)MWS|tFRG|AnX+Y^f894{+E#Onf4uf@eaX#b9^IPB4cXqeN>O0$k zY!pHGS^p$pxfmh3%Y$mDP}3NwKlAbwfE>k1YL@tbq!*+0fhp# zj=@0l=q&I;5{bX5fQt^T3h^-jJ$W;EIR)xRP0S08qeRDpGyq}=Xe0y;M?VFD5`a*W zWW@0eIKUZKAOBabPFPP!01|)%AOT1K5`Y9C0Z0H6fCL}`NB|Om1Rw!O01|)%AOT1K z5`Y9C0Z0H6fCL}`NB|Om1Rw!O01|)%AOT1K5`Y9C0Z0H6fCL}`NB|Om1Rw!O01|)% zAOT1K5`Y9C0Z0H6fCL}`NB|Om1Rw!O01|)%AOT1K5`Y9C0Z0H6fCL}`NB|Om1Rw!O z01|)%AOT1K5`Y9C0Z0H6fCL}`NB|Om1Rw!O01|)%AOT1K5`Y9C0Z0H6fCL}`NB|Om z1Rw!O01|)%AOT1K5`Y9C0Z0H6fCT=362P@B;W5%HXTac>+Hk*pZChGGq;Vu;^B@v} z!2`E6FnHev68#})B^Aj*3dJBG1)2mLz`eAD|Jfg$WhE0*=&DS>If!RNldlwMrJT^Q zMgsq)eWi(EtMVbW!m6NEO@m)r!bxM6mfA?sKs#cjaiD!y{8us|H5~X#ynKGUv{rHh zrkN_kA2|xmn z03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA z2|xmn03-kjKmw2eBmfCO0+0YC00}?>kN_kA2|xmn03-kjKmw2eBmfCO0+0YC00}?> zkN_kA2|xmn03-kjKmw4!e<%S8(jNEl_g^NUf}BUN;Kv$qLR=9Z!~k&tZtR-#iTw0 cZq`n&XnUz6`iLF4M%;e8Qh*mc{udDVF90*WssI20 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Presentation2.ppt b/DataAccessLayer/TestData/Files/DupFiles2/Presentation2.ppt new file mode 100644 index 0000000000000000000000000000000000000000..ce7f00638051e19fe98cdac28682dd5b7c7e19e7 GIT binary patch literal 101376 zcmeFZ1z1;0+b;g2J0wIvX%G;l5u}yw76fUK?vjucP(&JOX#^=jLK*?-mIjehI+T$9 z&jNjQvwh#azw@2z`hVw~JzV#1X3d(JHMO3(=b2~G(|zt^$}5s7*cm4PLx3F}qrs4W ziH8SaxF6TJFxZdlqvPY_AJGaR051P=|A+LzA*g2q7&B-L5rK~c0F5~c04e|)05Jdt z044wy05$*)0GI->a{zb%_y7a|gaGFOhyX4CAOMg6kOEu;xCB53Kn_3wKnXwvKn*|x zKnp+za2bFefB}FJ;0gc}z*T^20L%a^0IUFP0PFx90Gt3^0M`My0eApz0Pq6v0q_F| z00;sI0SE)!1h@qt0w4+?1|SX~0U!w=1t1L|10V|^2LSa~Bk-aAQv$v+fC_*rfEvJU z0CfNjfI9%109pWd0ki>h0CWNL0Q3P201N?)0E_|d0hj=o0+<1q16Tl90$2f91K0rA z0@wlA12_OU0yqIU1GoU(2XF;&18@iM0C)i43E%~w1WK|7IVnKPt$=TLk^|iMo9;ZA zF`x@h9304l8|-ZuFW-I6e-V}gd&4mQYcUEr*unNOZE*4+QV9O^jskePGibFP3<{Z^ z)PVwwgf-|9N6=cMlbByi`D2(K1`h`ng#Z9m;*WQKe}xXB51*ahLjofQJ;xG^1k`p( z@H}Jibi0!n2T&tx5cBUH^n65c`?LrC-t!ef`l{*EGLin&*8f_4xWV&(Jp1pqA9`{N zG+4kv-jDu++VSiA56y81|G58qd%%LXxa54fhoRcSed=uuf~&1)cJ8{nDa}EQ2Cv@n zO)Ko!kt$SSXhXlZ{%RXB0qjV*~r(lfy!T$pVYvpZb) z^IccR0m**bHHUerCPo|zPnz`3cN*3uOe38Xv;gs2RR0Q7_H4=Mw4HZe!GT_ z^XOQID0L-<`3}*8#<%=|!6eVsX}pcIgNW5pEq7~2kG)4j4wThM+{un3lNaK8Au)A) zi~v)RMnEJ0iy|txri9UGdR7jA&@KQDfT5i|v!S)Km7S5(H5W?@k&t>R1Xcpkotwv$ zRX)7&ug_n~lnn|LwWX9>LaCDbAmcBm?N3wMUwgg0XKqfrYc97eZK)~t<}#moOg91Q z^l1E3O)Q;&iMw!AbcVjw_xfxyP{%rFje|2bi1O#F)$X%qUwz~YQ9{$M!w@Y$Gq5SqV8j&UC`VUi*AsbOj&8vZ-Hj_6-d?79)N?t3YPaD zeQ;;yobeH8`!tXq(8B*mr+LfT%E8FWK}Y4jjgkFbs8TqCK>kxB*!Jgwlk{JRF zmW%^E0b)ccIAq`#x`G@!U~H#haUj#-09SkT=n)vBZzp+A)8yblD<6~!lKN2H5Z7Bl zrSV|sCv8H49s!a>z%bTzLC_PVTZ8k0)qTxE2sp`8d(s=VaBzV49mAai%uo;v1}e;} z0jg0g2*U&Rbjm28HJt*q(*mrl24EdG0r3`qQ6l$;vlU;QFu89igz@?pNZ!U?8=lyY)hBh@8dSRJs)Dt?tC(PTyhqg`r03j;ii` z#Ki$8k|vq3JZJR$c63CZm0-tepO7tOTNEGs8@_4I>AK>WFF$=r)n0>t)neL=?jQNK zIx-g}E>xPlWlr+*j2{EJ0W-oP);5iG&Z3&x8r~a~^oMY=6G{Qk4e&z7+&x$xaj*pj zG)(tpz;0d0dlxA?x7-mDJw2@OY4$+?3h6gSbFYIEz1Re1?oZlZ`bEqos`O>Lxs9+) zsibFWwbI`lkQS-SX?@Etj%(wxi#M?5c%IwUd%sSI_)zCyKb*II?kFG*B7T3CN@riF zUtXc~(0a257EJ#&-)i69YTMCU#A$NY54ELHD$zA1WenQY=`1H}GFjBcta%rS_5?Q8 zw#!(uV~bp#A`i-9JWe(GJfr(@$z9#UE8M4dsxb_6TvB(kx^_j5LoZvLZI32LDfPky zY02kzf-W&6b0p9Y%69YUW*d+>+;pq=-psTtyK!tRRHmDg#vU4Cg|O%@KX4Fmsj8D{ z{MkFZp7EUzHK}IJLoTUrlvr?7Fw2>`S^CG{e-^6U&Ocs=I*0FZ`{?F@%*(CjTp~^< zNZkIp>0zS$PV`{r?SnZ4iG;I4AXinL!tA3bsBkdJy;L+V)GJNtJ96L7X_tM6{{C?NB zHDpZ6Swy#pjsETad3o0Dfa0mpP%Ct04}yhxJf*t?9rt8hJ*FdyE#C!XA?!KwBTLM^ zV-?1({u)%@!;AWb`x18e2MVtz5>@vsb1NhE8eYWUMA}k6OnZA1ed&>7Qk%!)I&;HR zxrt9=pEcKbvOII#Ro?F}i7RCuNLwcHC=2!)A5bmqEX-eH+Vd?YyV^0;bzst*t(nIr zC+FoeZK$P?h>+M;5j)1Xs~CDzZkC6qgn&?zT=SJdJ*D?<04;|c%AUnlE5oV7*0>w( zgSdsFVj)fi7(4ztmGSM<-r=sjbi%Bqc4boV!t?L^?nLdDt1vcxnP9SxdSp65hbE9O zLNu9xRgs=^zN3qWV2tdY;`_}Dahb{IyS|m7%SQ$!pzoXA8s^e%BuOnX6s^4KgHlc^ zv=%LmdecuumoDX#As?czlK(NDecYXTK6*kuH^1E{CYXy~9^3WmyhXI`Xp;{eLNf9W zaEceufWKyPBtuFNNn!WWMlI;>B~fYnn@qLq?(-YjqcPW27Mf)h_Nrp}Yhw)h=Gv!| zth_%?>yl}b_Niyn`#Qaq?8wrs3$h$gG0O0a3RAmb|Bg0^uXB3&30s1AenW99w-TP` zN{pSToiIPf`FmGP4`>M^uXw$4SW*vKr`=l;i|YO&uHIEIrMf2_)FQ^ud57r3_9o+| z{Cn-ib1v@o>0>tW9zI7#iamVeuLfiajfyu$H23q!!q#)dX%1fA-#!S)%wBjyUTQe% zx=HlAw`wDjw!0s^P5+kWNJ|5n^Ki%Km{O}gQTC2Ira?cIes4y<)KFOjFHXWZrsSyH zaWxT91z$pg^S9`wR-8o<)-CU=9rut4Y%ghb=RGW#_>>QeVk>H(WYH*B@Y!12GkcVQ zaW8-Vb!Q$PY8KvA2cD3O!R*x*gSdxb>J@Y%AsYG?B|$Fd%gHz2#)z-Hx_5uxCVlAX z;@V2DW=x!!NW`LBvH5d>piWJQ<&>0N?{8;+A)|amz9y;GT>FJ+Yl?}_%j^Slz;GqH za;Ay!c%urFZ~?R%{+~s1&Pp^;!SC+xkest4_aiS1=JnSk$LkEqDMabP{xit|(iVmW z|G$gmh@I5%SCW&0LjmGWNeT=V9fVN6U;UBXoDv!+-A_Uz3p7?g2o3Ttga%Tc{2(+G zhks3IASKc%p-~33#q@-@Pyp2rq%6??PGbHYx#0wPA#(HegxswBPbN1wuz3VJKt17L z3kdX}+Fs{ju#aFFg#d*ieE`H7f4J|10*3?pf}jg7m|-m^%#{V!cfvHG`#7)xl$etY zWjG?h7Y0nw6tF;O2>imSVJ2MhFt1E%SR@ETocUV@^$A`?P{R^H+(mF7@}YZBSrGTd zg`Jjl>!ci0Fa%JUKu7jpFN+Fd?@-xZFd^^@xr`s|8}%Bv0uKZ(`-Ck+VR#rCm`Fmf zG#p411oT~pkoJ&@0&orB!+_4|#D~J)^;!_eK0aPMiGhBOkMST6>KxFa6mS%$-3Y=$ z@Ip}HlXzVOUFgj^340-WfoDSP$3PrD@nP#dPy`Hl9n$N;0Rj!}C!pN}q?3gTgz5@~ zp^VUO0*ZrnSC9{lA>@O%E#M88dU_%aeR1t;Su(mkfJe0_0$cG+H z4#P*}gEGMm5kME6jEvzgzR36a_wfZaOy&C=!vu5jUk)xFJZ}%--bus}!pVSua=#ZR z4?<9JKm0;1CUz*LaEdq^G5}N*)U|;?W0VO12Nc^juzdt54stdi@Z%aPRS1j^IqdjH z(-EOz`{AIjfVPp)G>5j43@0}#aG-AdbsNcgq5u!VhlUm?&=H|>!Tb3b9~viU-}&bZ z(48QBC?3oh#FNU^fgpe&Y~=g9FnaPnV}TKo|4kgunQ?>q35@NjgKBW%=n>z7N%_Z} zomxIh0~mQ&Hb{jJCchl9PPqmaT)#DmD&M&)k1ugk z_{DA3b)O5R$0_8FZ_GKKolxr>n@JbF`NF1Xu#)|&soIjSvwldd1!i!SS_#1gnPrO$ zB)hNf=dY$y`1g1R!IAP%wmQ1qe>EzDCQ0C!EcUcxLED^-+LeM3-@jY$NYl~l`KTn z$abt?u3pvp&^?Q{RlB?&)7`EP7>=d5_;xUV#PB!%=J2g6;+E2Jd_u|-4{I!^-eq@F zp^PUgACQK5w;J~1wU|ZAbily=d4Ibyiz!_R?$Ckv1p~YBe+@Qn0uPI)*>hf5;0ftZWh+fSILr%9zWBkpF395yi zcDRNm=E!3VpU;Qzx)2+`O2tMkAvMFXZRdBVfcpL z{JRLrD%)h^A-UjADF6m3nP0-pNrWc ziS5I3L1?P_k+aE>$JJYkGz4!ct~f8kF-B4@2$`he%}f~WehFvp6qHJRroL>*fpGj0 z4zGf9A{_-e#Ld@0XwY`T*7UV*Av(tW(#Z@yTlxF;F9~ih^<+6oZWgfk{vs95W<1-eKeJv0tnW-0 z|Im6P0OnT)Qf@)S5V*w?B7_6`hLGt6v9vXW3n2D{YQUqQ{h&8cN_aqdbYbf#6d(*3 z5EKPlU7muGOM1ZMy{ln$3bN20K<&JMpN1m<1r(2MPhN z-;{FUmr@9RDFyGBQgDAM1>(!ph+n`P@kd5WKcwFR>B%ZVrJ&=m-@MF`p_NuZ2`{<> ze~2P%ey(*vf#Bf^riXXo+ZWrMk*eSr_N|At^;b1WHQYM`xYmARPE(gq0+A+ z%m*aAduf)Yhg;WH#ugRPb8xSIBX|`dPV;8L+In<_l^SjJ>HF5~!Gm)%UR-}GK z?%DJ%0eidyp51nr&>YXEz^EYhOAgGgWLaaPm|Q#IY5QHWstVXdXK#hIj*VAh!Sq&L zPSy&+=BD7{eY2)SjK_4(7SN~m)bFuZ=hhs9;rcU|dAi8BR|9&88}t;kGyO$s`GwR& zYnaHI&oNlT`dx9uGOGi7e2IE-)Wa=FEh0jLQ$4Mpo<|I6V6iq{+~$;@mV^#+a#9h6 z<=hM=l0Q1}TW(Wur?7M17f1il*u%A?>XCw`jJ;uk5F}%pt1H8BG2M{A?}^qop=-R= zA?%qO=>79ZvM5GubdO0 z^sSX)&RA{tBNeapt7rP}F7mXuAd2e_@^bieJ?yRA?I5D0PcwdD!^j-WC%h zC$5(3*e%%x2DTp3tpdqJeUcEDCkaf^y_=YqSrZ?=m=KoZXwt&Xc6vxzBO{tps4~hK zeR)Ke0o#N zv7fGR*M5i#gEt^X!Vt3>b9UPjYfF?3dlia}5emRLUmh#DdFo14DpbQrIRJKsyz#dy0K(|jTNRj#p(r-L*4p4cRI z@0zvX6B;Io{?ey!3n*nZqBx9#(M{V(%%zkK2*{uGT_tJ4sHmxUWgxbD)Iy)+GRUqMy5@^7 z6yikY%kqH%${kk8kDY9rsc>j@m%#k~|hfZQH0ppxpQpw`FFx19Qv)1Fh zrJ+H(^j!K8DTmtq9Al2J5q-(qxtvQi&~@7|w$BIl$0=Nc$JYn>9Iw*6)DVnPe)~E5 z%JAG<6}XR59zMx7n|^_X@3t~zxry$6v8E9V^Rn-X$O?`f%D?G>%3AN*-W0cIY-mou zcPmi1SgX*F!`ON^^74Z>1UWnMqUfbsFUCJ(sU%^&X%}ttKvoHhoxdq{DRrtPrv>@o zDZ{-%))zOueN+390!S1dF0MEp&gsv6Ncv)*p+WF$G5*mZO7A*EQ-8$op%ooUzX$vuDtmYk z|HB4B8w7u->|qvvt+I!nd#bWm0lHxapl>#U{d)@p$Z{041F5`?`tIi|Q}VQOGb;b2W+WN7L@aVp^{984W7j414(oeK<> ziUai$7fO51%?qgs0a8!@JA0IeD48B)2asU|L6g)<}8GNZ+}4tQvPVW5wQG( zEIR+)@dO+6*zYZ0M}S(6k8`%=P~9LV54Ak$B>m|D&1s!qobbQjx7^6Z;k4oQSjt8Q z)>eiT7Di4+7Fa4KrglHVV%Cm!4kq7kh?yGy2t$2E2A)QF^2AfUHpBuEyNDHL;(TA}0zn(=udr}0PH8}joIRxo`p@W`JfLv!c zeEgHH^B*ggf2>&ko)ybk!?v?lEX!)YTCwQkQdkmk%9t}u(5R&J9(py{O8Fazm+JMH z9(#PY_bSC1d#yIwP7|3hQ@r-oc`}j5vo?=#Ok#;K%|5AW#g?vwMKoj0?r6@bk7uUi zeh(6Tno*Z?-^NbbP(fFG2PYla?AO*|-Y?#oN*bNAC+=&Xtz(R~!(*-@0!vKz{d#p!?1_nAeeP)mm5!`Bvdm3ih` zNT^0;jcp|^ALZ8x&eu#)k_+pNYH9Mx;=wzhb&x$1Q>Qd3HheHdk@J?Cb>{+_O6$3G zuFr=~8kx`Lb!BJemO_9v|t_K?z4Ua?@Keo-!qu4tm4F*c;^PeEt+t)aPVBl@VnQBXuLy zu+Aw;c|O1Kp5>hmiCcHc*c-WU+rPy=xIENoUCjK`r7;*~kh?(Kp~9Zd zx02$AOo9e26hnTS(`KI8G!$Oim?kQ!GK?7}1qzK{ltwNLTH}A&h}zz0HyyntTcW$& z6=}9(L;kQNKl_eU?nFXuwxjrN%L^NMIzRL4Pt;AzqH|2j7*Jt59-j-EZpKqkat<>X zT@3Cv)Rl0(T~TK&`iW98aQXasdz!Gwhc{mdxJt(?VpO6B&zRmIe$^v46HYtN`;T$k z|7_zngOL44U?<7=-QM-jV&Sg!7#D#DdEv3px}%NdNOU!NSWsh7C7hV<`vsh2dd5MS zFcQi8PX32Gm%{C8$SP9NdY-}iJ1}T}Axm;w&0rR|NGgf_cKFWA1iCe`NYo}rjhB@P z4{GjWJ;-Rhkts!2g2%&;CN0SH;AkPW(?YsXeI&PYq3aD7DfZRLNB$$u6@=*aQCwK| z7vd`Q%>4-4SObKDFFqAd8!6N)NyV_pz#ellsA{stCcU-Dmc=ebV2*2dWl1SCKA*vl zlC-sa*i_@K+(Mxa-fecFJLWZI{MWWQ%cUBQ-swFTrjqjH;8vYRz(jb#E`a1BU{XoF z`W`+piZo=^+oI%L$=uaDA*ybOtSC18}vk``85qD#8Y&FAAbwBGedN4VQC-M zvrN4Al~p8}i>=pq)g_}nVuxwnA2IcH4gbR)j_I}6Z?Z&=QY_>qFZVM%U45$?*VTL> zCX2nPnE3LuJD&*TWNeoslvicamG6`}US`n7=p(;PW(d!TOSh)r)gzY?Rf&l($aATs z_-ZX))Q*3NZS+NTq4T@$Ty7d~n7?fmXS@)gOn+v9x2aEB7U=_5N00pe#T(VDM#Jqy zCF)Z64HX7>?pk?T2W;}K}0;a-Go?n=zq?9 zI4_HF)B~Nb&YpbF_?4fmkVHer4a1A?vUDj7U50W*zM_A+mFl$|O{f`qA#!eDHnmLG z+|g*e#=A=9G8)rnzj~3uBKFEX(9#v^VkJw>2VGQal5%w$2<`IxA5@4%1NbJ%ZuQew ztQ`8j@nIxKzFv;*6J#LDWFFnbCwgvkA}`!%e)d=^B)Z?QR151}Z6`BI|J*m%^&_)z zY_$dV8ky*!R>K>|L{THxRbIP2j9w&WX=$r5UlcpmX!i3eNI>WORu#;D9lbnI1HJoN z7CP*(+GvsAFLRSiJ#zWsMwwO*-@WI$skyZ)8k0ej4TZXDEu)jJ5|MqRX^wN2 zI5LdKDx*Y_d=3X+WHzR5xcj!9Q++7lYFwfDQUE_O%197Y8+$TCiwp7()*(p&lahm&oerBF{O780O$L&0todL z`pfr#8~$7Cxu55nB@*K=CeWkk9W*ILyz!~7;uHp77sM@~9(%noW?<_zVI9y*#vb=yrS|PbsJM@3s2K$|hT~R5 zzEfIKcV4FNI%o+8-w238VCtvhR~ z-Iz<|oAf^r1PM*MI#qFR%#DS^=oRl)crbf8aZvZ%1d^bh+5myW8DIp1hyXTZ z;QIh@CUCMxVgw1Y8)(4qAGPOaC(3W8#y^(+Kfk>>`&#^>2>QR>(%)SAby^LWQ|G|^ zg0wVe$RYoOl9?EOVi9`Yjc_^Ju%t(5)OeSr;1fS2ty9xDEn9f@ zxgAw>E+=v;w<+slbt-vNkom?An|(VR@yHjR^|9zdqQg3l)a&?f^h4#xsIP zCPY}eK?wIDI4#j5u8*IfSEuRBBoIZ!c^sVFZ0c0;$oSqZr}%eAu36fPbF2-dAKVMn zaWP!WS?g0 zC&{$7cDE|}l()k8D=!;dW6m6aS4m|^d^#1#Jg

    Pq#cQHb5LowIJUVao=9$?)g1I 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 O)io){M1r#Q2jlR?X^+#Rg_9 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 T#0s<#r|&HVc){b}fWUtNx-PpW literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Publication1.pub b/DataAccessLayer/TestData/Files/DupFiles2/Publication1.pub new file mode 100644 index 0000000000000000000000000000000000000000..215aa5beb5b9d8a4067077521207caf7f60488d3 GIT binary patch literal 67584 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/Publication2.pub b/DataAccessLayer/TestData/Files/DupFiles2/Publication2.pub new file mode 100644 index 0000000000000000000000000000000000000000..a0dda952087eed0998aabb46c187c093058793c4 GIT binary patch literal 200704 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/doris2.docx b/DataAccessLayer/TestData/Files/DupFiles2/doris2.docx new file mode 100644 index 0000000000000000000000000000000000000000..124e9b56976a88638fc9691cfe6a957bb90094d0 GIT binary patch literal 11092 zcmeHtWmFy8vNi7RvXS8K4uRkn+}+(FxCVC%4#7QGaF^h&!QGwU4sR#-o_Eg4J>whS z|9AVx>a_>V>h9IEx~k?Xd1-J63=k*~7!VMUHy|rdiJYdOARxq$ARy=qHoQuEfC#$ETDYT@Q z7qm~FFOsRHREtSlyL2Q_O1jba?!gyRYnj1giaVO0OxBY-o#=3sR-Rh}l{h!p#kpS` zTBQ0It@|vtrO!^$FTr(vw8pm{8gWE&DBLG3ECr7%{Y>pbbN>^GDwB6d%HvvROJME& zC;peN$Y*B-S0V`lyVHgZY#_5y$>Gfo_dZZ)=rEJKga*N z<^N${{L7<9#xF^M3nB!cL9Q7LcylhnkxVVDO60hb9DxU>9)r3fjpQ%3x8)Hx%P;Bf zUhNIb&87#W&+r!UK~)-Pe9xXw*B4*2a{6D&x^Ph!eim8Tsv(5~DZ3y_3WiisP+zmELU+}?ks2A-B$xTt|>VRrVeu3w!) zZx%_16VC_E^lW}O408b5z;1!Tkj7fF&oRo9`kD^UnrWQ;bDUur9LKsv?)PhvSG|bn zAUfC_*s$?SFXs$!O3N@X z0tcEB-c^)8f`qrdwtxcAW=1HXU9=#&ektHSGk6tvLFB zRFMgv&|yF5Qvl44Al@)Sy?y;h?l2v*KY{_jt$o1s2Ng((U)=dCYs!?DqNkZqyu~+( zXgV62uD+qM>(Jw`!&-=LfNL*F(izGb^NuD}nq^2IOj%MFGrE{kIPH$~*0lSoem7=} zOw3k78x>+fO#@ACmKeOX%PMp=HYE6-p_(l!h4d}{ade6Eh-0G@kGwXWIIw<@u)M&@ z84V&SQAmL|K+~LUS0BTfDvd;b=E?k!8eBz*(zQDN6s5XgXVO}| zRC0tZq?4Q}T@6uCvZUSQX`OIL3mWE9*8aq%OT-rBX#)rKxu<)`nm1wu&vweOMhv0=%~H*(MS{v^}NaWTPzL8*?$8SPi?$onfnVKN#h0 zO&oweab{DJCzx*U%UHPZGUe*1)2pgHC&T(EBajaN`LRi=E8k3l0s)c72LZwSgD@Y= zO>9gUe~rvPKQ+f1a&}7`7#+y-uEZbgj3{03pq<0#zoyg6;P=>u5L$#K&CBP$o09a# zU)=Ho?QS**!JM}VG0^&mHDB<^w!mXeFi}}0t{C5|t{cxWA70K+hIYU8_)17r@@4L{ zAAtbv4Yk~&?z7{lFxk2LyH8aoD}*bkqslKQqIqLG-b;r7%hcQE^X))q~wS~}s(GJFZ^I0LJAF(q;n z@}I6a95>%WRfffTbeb7vOQM?vbwNQpN5v{Fn1B%&&ffURb;bm5w_l)iD|U%2eM!w~ zsC96Ltu%{B(X6Vkt+4Z1Xtox#ud;Rvw^wE=zr`=7)q?Z}*S92`JGyRe^AH>dsX7ZN zR83+T74t1$9kfV#cjJ)h(lA@buI&}}GL$h=E?YEhZBnhC3uR1%?{rtUXldlM(1jn{ z%enU>YRt5usKWB!o&C~k5W+b5Enz72D7iG#ta z>Of9O>d=na4KsZaK1!Cr)s-d<`J5RJxEiH4O?3ru^YqlM6M*jI!MS-mj-$GvgoWi| zX1M0ggPuB$@n|b+8i-%gq`GrSezV*)RO~x3@>1_@i9qk~Xp@9O*!YuqynhL0X9<-5q-eF6iW?sDc_lB%hCM!Ab}&^<|m<1 zx0?jwEiJp&CI6LXrG2>YYXn9(q4H$wM{Y*ahC4ydZw{J41QTR5Mgp%|$fH~2Dxn%I_Cwj=QQoqmE+)&Deue`~Z=Ve@=gG&|AZTlI2ZP;h z9`$3!UDso6%FKT%WifaZxz`Eg)%eh&4RLi+*`(zbe~b!qc^|c>Gw7}6*!Jo*sFN^m zMqgXA2xp>pi&#(1LGRdFB}}N)2W2@lfM}6s4ErcD5hB<&mVqScU?@fEHgeb;01wGw z6}x^&TAC{usAOJslu3a$6#0QlVTc@XJYr976BR(CmK zC?27f$2Rj>TKd3Tnr>Hnq}?ILTk|h(M0l$6GcxD|#ce9TYukDZ^jj?9cc)?zZeg@C zIFE;Dz+elvqj4O|$(VlHVYRDw>|G`+?q(0Fd(8MIOCS-Xtfel-!8W3d1x7cSQT8+} z!*nD{txx*Qp0BPEpno@)55n7ALB7R&uClODfNI10n3kx>uONbuyABgIFLG>T-+`nu zL79zKLGfO6g3&&vu-v9_c{77t=l*7B{g}(tBCy8sixS(oF+8Wc_JIDX)aFOq#A^JV zvC44Cdw9hHK;J8?%9RfoCnW918$aZ^MljOPl{PW(m=48479!8>etlgtNTFDb5kVF( zG>z{$ULm<>UTwxS@F>bRI*V>BLLq{lB}DyW-%?3aJjlLL9lv3ajyDN>FOt}kSc2&( zf&`0yh}T$p>w+wba#)yVY|^86tU8+U`I*4JG&UEAGnAF=n?gS&Fy zNNu!39|%;vDr~Smnh4ny3%4WJVRnT;$sl}#%6*8p;frO6b+Lzt`b1FMl`p9=ZCd`R zUb9_8&%Q|O$6Ety`UQ)Bu zoGl(?!6ADm1}P9}SbzuH6$EgL z`jyW;Hb*Bu6s*TDFrPp13)rZ6uXOkdZa)orU8#Mt%T7RLQNsM?yK!~B1 z5-<`Tf_IsuVvM;dW4}??8;Yy_;bb}g94V5RtMFE(Jw&%g5Dk%;e zmgmil-yPx?gpS}IU{OxdoPG1|46_#sGEc;@n{_67I|(D?1AS1jVqoZYV%MXD71~Vn z%#>Se3l9@~KoEhg^2i-zjmLPTU+)+{cgijW}X{x3-c>C+abc zB~*?}1}EVjijY)KJjITKj(w_=c8zvim!RZeHo`5#%*7zWRssY);6aexSxBBYF@ah5 zQCSME3|t5>>ugdGJ+VdmMKQ2lN#k?nJ~5NgIo_cQ#!R|dAGEm=V^9~rl*Id3E4dwn zTRUCW2=Z%XW3rh#N^*O3(6%B?WSc{3(hb6}p2)kWtvs2gY`_^hGLm%KAaeFuENbM( z3kXy25N+rR{~&H=i366x!rE{5Jmx&dLKW0ujv0vu?@}FBVUsM0%iwc1r@Cl_B^;Tg zikoJk4td-ZehgB@vY{UF$TN2@!isI7v#{GCcp6HiLE{L#kya9n66-3)6>di_LGGd) zDh~YiEUU~TJ#QmoBGMOH4=3);7SBqBtOHr>h}aY#m&=MY7q70M2Kr1q}ag!@d{|_^@%;`Lz>G193X_c)0T1JbT#2vGQ@eq z8R7L?7|?7gLui!KcA9%bJ`Ml74IP#j#tSB^Esd%vQzI1QyEV9~lX*%o(Jn`vM zLwrldwnl=?_yxDM?JcOV)|pF?ZM~V_>8ad+DK9|r(v7V3QTtX7d#FF#Jozo4!1K!Y zNy?_#$nK%zW@UIo}y(+-)_M*151@B_^x>gpa?qjBr=Qv$_8j%45Oq<$6&L z;*0^#Lo52~YU(}SgYsF{uIH7h@8fVc+qF&8>NWE8<@?Jfe!xClR$*D@-LqkXw+G?9 z|4a0hozksdw6Ch%W@H$t*ek{HU6HO_{N(XvKikHYWX%{+GBbC~;BZP>|BT7|aia$o z(_LoPsJ9){-MzLguR`O*mwRk4^CvDVS~d4ed~O|gSvjB3g7+RKVs(ldkQ}RQ-2udT z1kkp+$)jo>m=+vMak}kDOEOx%ZF&->-)o=vJk>f}8Mj=WD6P}H?rg72m15Z2z5-;f zR}5JQ-sX6Z4_`smti}uTw>Eqko*oK8-)cEw;%9^Q2*Pd26yfI|f7+3_zreXY|L3rq zu|SLK0hA)3AwWRT{-_^KfqO2>28PxqKjUs~{OC`aJ@72?0V(c`T=q^JLWCONS-cNU z*YzgJkoN*lakV|2D_gae25=~m#9}2Urf16YDlck}fmJXG8^MzSDO6-idChNdmVP}Q z3c3I8ESpJ_?3gTe)GP*h+A<#Zgem(GkCMZn$!UiSfq66t>^McyJk6w!#{SCkHfN9} zH5~gBVZsDMBsWo@D#rT$Qpzxz#*ymErYdd=ZMh^QNsvm=tr9VNdfkD)Wv-yYAvuPl zl?f}AAU+1_XtX?8WWU$wW9^(=jO)?opgQ5S0MQKw=%!>=`D(7uDrIE3Lwa39RgguPm9rzX3g0~HIzz_G(Ugi^>ZER4;yL(V1{%-b1bHzuQ2Fe? zj$?*JDT4*5DL~qZeH3?=A=?EfnWQ9SPd(KUvEEujX^k5Q_wSFW6iLcQ5O3QLAGnhv znS78Xk(O6Ryeq(G2bIgEaMa^Gr95}y+bvvSU>o#P>9dgu=*d#Q_Y{l{!j^690}8Tg?6KrIXfsG$NS zFnLEidnZN%d;6cH1a3C`S2qQ&T!!MXEKoOXB|S%0I4z&{mk+8JD~54cCua|;F|k8~ z@2|IRuzbyw5uPTt-L7Rl`aBYi==wNo%!{DF+cIJ{O)@?qRa9G^d|&95L3cq%VUWl) zw#g!(KXP`r1KA3_$4nN*ObUyi?EWdf!-Q@KN(;4UrhcYG+gy|c$8xt+O4`fbaVb~E zS{H*8;TE=Bi2Xc3f0cIibjnvW@zdvyI|V{M++BIYqbP|1JzieZQfpC+y_Xz5Gokj387gqY-pkKrw-k|UF@4@Sn!rZRn(~IWn-$x{MiK-PGpWq12 zMuFoKfrgtzIpTld`9RT!l390Ra|O8omy7g`Q(zSe!ipN9!rWCC79Djy)i2SitqNL} zUk>xYyElq)MHqW*e8A4JcB@EsbP--sw}R@^Wqlr088w=+@hh1t#d=r;Y07C9o0XMv z5vwo0jt|ju%XZCuZT1@J&w+kQ5Peblkq z!g49~F7nFQ++bP$Ugy$^VvJ$D@U_lq$L8sWI-NYBml-qp`FA7yE~PNt_>a@m~jQ)iy@2`>}n4KTgp_ zXwa~>!x1&Yt+n4jH_W-3NeSd@L-xHZ9J^3SF>ez{f3KYIgFwl5;O+QGP5FrH`}E-_ z7m@}o)bm>wo@2K{%9>A~ddc>vr=cp)zN#4*oFEyU$nKu=C!?wjxwS}tZX-a~xa(`g z9^QYuRxMnb*fvsmv02^d@5?{*{>%DlWQjzm)mCHbrmQi`>xWEg)HKQrYVQgN-Up_y zb_CvN)H+{pWP3<5)N>!k=br|rRJhU;T^Y)t>V~yF*t2&{-Lq{H#3_`rJZlYprCsK3@AgHAy*6-{r zH61mv>6OuzNtk1h9#Lw4rpqJZ)3v(P#{?T*Zf$BE3K|LWQ4cCAO0ux6xR>=pa~QEv z#JaVu7U_A)3N+&k?~l3d@D9YFr4ze|wb*(wgw=>Gz3cYwx#j4MJcwL?@vQ?_v{F^! zTAvW)^VqVTDYm~{L*sU4=97}-s#&4}dF2&kI_lP+7#S<(0j-k0aOPj`8Q!4KMdSn> zTYA&)|`c9A=MXRY7&9F3IW@ z$oNrCnA=zPhE20gBetGuJ<4V+&ROMyL@tkk)CTS59!WkN_6L;<6gypdO`)C&mD(5V zyAVVa;?nafLnN64Y`gCEqh~rIuv;BN`X}uy9-r}XX2&-F$U7-m&C(*;#&i<2F&aUMRz$l-)F`fofqdpz;Oej!O{^0upQ+s zt2xO>LIK%$R$}^y)0$wRbj@q`at5zIMChTir(U#bTzSW}R67%hXE?7K0%o4qCTg%o zyA>H&FZa-T!2vd_)t6PZBw5;Rq&;rx8>D{0D(}F|)v3w+G%xa=)BEQ{_>A2g$f^da zkH6sL6KJL;8=Kq^Yr^7`*pjq&Xu8;WGO!&{_zNM)*VvL!ZST)mrdFoI%$hr+cUhL; zoiLYL(wHc2H)}xNGlKR+_MzHAm;=tm{C-Uu-EM{Z(Cr{1$`EyxzHCN;bkQd0UB4}+ zS%pE-z|UC3^ktQn57n2_VwG8L<7mAimcOzB*0Y{E*Nyq36Gs^`8Mv<<< zO#E$vh<)ZW;I zcgF5NvVWazxM)_ZaDAJ8ngn6*#TR@dUPMu>yN5#O=m)&pRT!-8VSV7^uP5&LQ?dTE z_-pw8GAr)$yIJ6U{xbXTMG!PZ!m@*a(RGJ{aX}@2zZJ@9Cj`=1Z|+mDb4p4Z z5nt`J1R+QFaO5HA~a)?R1s* zn?_AFZ7x4;%_VxC4Iaoi4VM{2tSx4up8dcbi*>Eg1*vRw<0N3S(OOr`3VCV8Y%S+3 zu@Yew&^G13C_F)au^SEIYd0G!bNA_*zJd>^XQ#hCsVwyRvNC-DJ2RM85;dcFy4b&G z9|_>&HtnQy_>SvpK{?revtZD$(R2WQr2bktHH*Ek=9$)bDpCgDu;$+9Ibd~MD)6BC zlE3-{jF0~cprBy%z;f!J+Yf)GEq@vQp&3zL`tJt*-XQfCEJzlx9po?VQojTL-Zk=9 zU^g)B{D1Y3{BG&@9)dq@y#jkI|D&Veclhr+%74O{;QtN(eSi6P6TfTuf10=lO8fsx zOa4-|{to|LllT*EkNa=<-xP}9@xNEff8z0gdDE}U|5i8uZsG6c=bw0>P67Y{`MntZ z9sT!;;IHUv!oQ&Zs1JUJ|DMMEX@Kv|AFKDjNu9hjB#<6IoAKa5x_}jkH`UKy{{!3F Bf`0%2 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles2/textfile1.txt b/DataAccessLayer/TestData/Files/DupFiles2/textfile1.txt new file mode 100644 index 0000000..de850da --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles2/textfile1.txt @@ -0,0 +1,11 @@ +WM_ENTERIDLE fuSource:MSGF_DIALOGBOX hwnd:001b11dc +WN_SETTEXT lpsz:000BEF18("SHELLY TO DO.txt - Notepad") + +[Open dialog sends the following things] +WM_COMMAND wNotifyCode:BN_CLICKED wID:IDOK hwndCtrl:004F092E +WM_NOTIFY idCtrl:1148 pnmh:000BEB30 +WM_NOTIFY idCtrl:1148 pnmh:000BEB6C + +[Tada!] +Use ::GetOpenFileName or ::GetSaveFileName passing pointer to a OPENFILENAME structure. + diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Albin likes apples.doc b/DataAccessLayer/TestData/Files/DupFiles3/Albin likes apples.doc new file mode 100644 index 0000000000000000000000000000000000000000..07ad7bce56853ef8ed7aaaf2860427a52fd4a9aa GIT binary patch literal 27136 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 HLE!%Yv|*zT literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Book1.xls b/DataAccessLayer/TestData/Files/DupFiles3/Book1.xls new file mode 100644 index 0000000000000000000000000000000000000000..21c4c805e00f43f13cdb785547c0b20f233e83eb GIT binary patch literal 16896 zcmeHO32a=&8UEjT?R}0zVkeFha&DYB@r~nkE^=%RjznyZLQp^iC62S3xG{EWHZ+m2 zV%j3LB}HIEq9$%>N>RBAB~T6(O43#!p{1=_C`X|R6(CxwR-{xd2-trA%)Z@u^N!su z6>3n%n&&tFoB94@{`ud`yxHIUy6V)ihbF&4T3Sve^hvs$$`rbRd(I+N5>3Somp@6T z(~?Mp+q3BmvcSiXbvin)1UZOYip+f;LN<}hkw+m{Adf~q2YC$gSY)^WRUwZ<9*xj%zU^|=)FQtHEBlEQQ$_2Pd&?MLqvo@(GRmSF;D z7B=}xbV6L|BKa?K{rDRneBp=B8PiZ4l+|c6xcAd;+AieSZL3~LVH^bv_FGGaLfSCv zr`l!BQo4-x(lz+&6uPg46%s-wrX;Bw_q{%#_2ADjkjD?p;8WH1=;chQlr8{=E+Io) z^gwa)ECPQ^_d@xzz2498FE=rY%S!3q8PA7KBAS=s;Tsg79|uq3O7th>EwqPY!J3WT zz1PKili|-Itr9YH8Z5&J7IsM?AmsV=PADXJ|8pCR%#;~nLl$z;$ zJ2R<)ou3d*VHu6)m@c3ujHDb>t9_QQ)mX63wLB%}Lqz{fhcP;=bRx`j4lROig<

  1. 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Book1.xlsx b/DataAccessLayer/TestData/Files/DupFiles3/Book1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..150de4a0254d2ef5588633c2b70f6056e7fe12da GIT binary patch literal 7832 zcmeHMcT`hp^G@gikzS`?<@y=X`&EzrE+=zUSm-o^$igGc(USqot0EM-3nV5CH%Hc7VaH&L`$T z0DvAJ0H6X)0F9LqPVUxD?q+&E&em=w!rqQ>wyY5#-!lLX_V@o@|5H2gCLXHMCQ2T% zt2W8LLCfug3?>Ip;9ph$lEu_A7S~w>GiIr&tg($906!xy48~7YiIG}u+_ypbmc4|Q z2R)n^4}?~L)LX#$l_qpc9^3KL<#^epV0zn3b3(=HWHZyb;vhmu!GtBci2j&)flsgi z-=;4pH||}Ck;=h2hn0}YaH+L%E7!K%3JN#`mW}?rPl8Wmq*PALu7FJO-J4!hvmdyU ze_^p~u1OHyK*G}?V-%^@z28@acu^>*E~IqnRY|v?L&pmSnv-ny&LAL@V~D~-EdyZt zgjL#?!F?dOOiIjWk}BZ*JwVVx)ecA^yQkXkd1V(c%)+w`GHo)}aH(eBL4Y*vIqd|C z+pZ80inxHfp;5uY3}Bce*86&s^4fc6%aH{r$=KHPV+xTIdJ56w~^U|Di{iVM*COQ==pi*jybpFpsYL;~monz>rT z-9&`H-`TQy{tdDJnb3-g?Z<}Ixz1I!2IaZKuTE-2nYr~4wR(0vmKLrR)~ZL@T#CCp z!MK577-n#1q5rD!^vdVEdaO*AA{uRVd`e{!miI^Py-PA~kv+5Iu)Ry&#qgNP;`Y=u z+{`;CKGkycu%H}?WT=Zj;}Q#z5v7<;CD-dYuWUn7*pDelxz>9#h-MQtMA3c70mDt_ znYg35by_X!!l529p!RW7{zIgj;BMSi2Z7sA!S5`l2|URZvoKHhigV@uHg@2es9tvxmu2d{=S1dZKq zs2)nB`AcobSQ+j{__MwTTkrg4*UiY+0Br&bc~ajsL;q}kG#Ty(HgJ)({2O(bZG*tD9> z@w5=7w6+^a-LPV4m4~v59c@3Hd85lLK>A6`QIYuuYuxFsr^i&n)>6-I!1FudEt+&1 zlax0lr83zEMa{%C;-HifK#{gNnb7Ve^K!;ED|Jz_(O`=Uhhr7{PyDxZj*g{fxvP`> zhj=4~F1-Zwe>L;PGUD&KQ9pdW*96M}7i?}M!x90@mp?NlN=NB?p=#h2*p^ za#mv6t7vPTr5+;mTHm=RO5U-*rdNT)3dk?wUy-8P;WBecs7%^;cy3`)zvT- zT=x2$Hk@l~7)OS~R5%{^o_?6+^w^#V3eQyL;F@>A6q~%b7v8SGIwWg% z-z)T3oslJ$xC{2i8!|DCQd^xEIb1dANEP6sP%2eOOs!oG0duD&L~dEo_x8%Oi@kx? zhL;B3rqJueVFgZw>yH!-+iDNqG0%kQ@KHn0$T0CVgifr=($T`?!_hmB#lUs< zw`uh0h2-z8+}#7J#6t!Rgn1-L0?takF9l zk6BOLkG>49x3LNd*?tm!95mCK^ud2;VU#udYP$dC#yZ`+w_*F~K^t%L(UH$3a&bHM zL8M5=(ausg@}Ic+`ODFO*C!fy0-Y|13W>C z>BP(*OD@@1*PeHIH&hNwfub2xdUX_20H@%*1AEuMSf39s;?^NK#piHFrh&8;xQyJ4EXzRN<{ zK2&a|Dl2PuW!klMLYW6-FIrxW)+N%8+Ib}qwCW>=K;vOQP(W%BKsIlXO-w z!V6D-3R+g@d#`c)$nMCiBU!tkQ<`9!X12P9)L7RLyp+y|E_Oaex7G*Qt}6r>m`!_6 z4^Me{jNbqDZKddrf*`#EQb+iX>?Rn)zmTp>Q#sLCk_)XWqF>$CzaE^3Pl%qt;;Nh zaoIeBKF&wi+t2-!-z_B?UL zB#}!U^fX)`T#!m|C!C2=`n^I8%lpO1pj~bmBhv_y0d;?Gou@5MQ*wsd9 z!jr|mE*=TK`4Nku0jr&U)r;f$%l9heG53*?Um{df_4~_ll4+^~Z>8+KnI;B9PR0h z_b86J5}k9?a44@NuG*;D(9AhMb@Pe^Txi_z$WH^d@b+nMUv~#m($n6eYs3?tTZpdU z)uj&Q8CU9*?erZM@b{j{KK%HFxppQ)j2kM7w&f1U+-6Fae>hje^!8mzGqxc8T|7Js zYJZW96%STeX+ip1$#Qe|fm^$MFIG9aX!}V~@q$r*%hHrB*rVeWs|SkV z-KJ{mIF zgPK!XmQE#{uTnOoaa06nfp9774Z@4mPTOzdN*EUwWr4`E*b;3yse&djmu8X(Zr@01 zGg@Yjl4$I0pR*L4W^mGWn&&VqfYqUstiy>m#>e!*m@UYps<5lCZZHFL6CU10uqrX1B zc{2{@6*&B!v*LLKe*U+Lyh~^F}#t1KbVB)P2w*Bem#LgKX0& z{sAuS9uoh)xCsS_uEw`j?Z#h9!CJ7o5Ea&&HP{dRPbuhTXKn57Ch}vE`0m&!Ei||t z>sXQ#<>Y$kZNr4zWsZwT7CegWbVpvtF)pfD!`r9RmDY4gdwOjxOt*CMJQeeG zlz@IVlB)T#ZDYOE97Rq>uD48+=1bgrypx%4tzTuysk-Z;yo}CV80X5;N3CiGfj}um z5>FX%Bf{%K!|-3{r8FIjdPACR#PY@{mT$}y7H2Z$Zandn%k_@PQZ6~4XtuZ)p2sSC zyIQ^;L0#OyqW7dUZKwnG+}}vH!y2`M9D3xG&BY(2 zQ{861^lgR9)zaP=eQR|2L;p>?3tQ!>3e)%B#YJw{RLqblOU|hqSY0C8BCYE5;`VJo zyj)RIxz(hfD4)0%L@_cvuj=xw6nTXMne!0_y0TdsD=vNIGK~boK>p*rkJR~+?&9Zx z`f@R-gi#-V!8CCen-KlICj@sL878$VyuSF*g6wGWk70;VBK^UX_l%?w59@-llq^c_ z^k>aH3+oqf@4R85%?nAN3Luj3k9-PyNSRMuGZgK$(HqRUjUo^0KTy%>TRObp{w|( z%H4jcR{G=DFabSlt>~7>856a>YV){6u9evjsny0MkOs)KjAlAh>|3(BNKf;$BIskg zYg%~M-|IYuJ~r)Dl~;|~oK!O%CUAAf3;W!$t5P<

    zTuY=}^SKIB!RXyC?NxD-294&hz^Fj-Z`=Ld#s_N# z!det48?jumr-|;JJQ9g{tjojAeKmo{p$ecQ^&Bpqxa7%1E^A5aIU5yu+{klgzL7K7 zbL`*ghmx;1Kw{}9i7i3of2N;>v-7{~`_8-HE>xV7<}7wXu&Q>*%JHFaD3H8}i4zYg zdofGLcn6NU3Hvk=V;gSdeI)Og}My8t0$xRH#cKa+FVeScrY69Migtv;4t3&sa zrNwV0R5-IPAJXD<8>XAx9HR)P?AiP*sC6!4Gx0>GGOBvEEor#P!o0*OwNuU^98s8o zf>OX#$NSUpU(OlmL2B?0)0vh%Ud-(kB#wC3&YGKCc=BwnERzN8u53)7q*a{wS;!!g zUwIb|OO03>W^m8-am1LV$mo-2LIOKh|H&@wC+c3h>u?#2<#=R|jlV{AoII*6^>*-9H=N#x{=r zxz&3X=WNsOCsG)8IC-W8c-HuApX#SE1@SMtR%Zduo*I4vw3Gh;_<4pnYkF2${WOiG z{LhR3O|bs=C>U(x?f1X`XOtgm?JUY!aq{zBxM+Tf@UI6O8Ebn|DIg6)bX)A`91_A0rX(&e=Rme0|5UAAiz`} literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Book2.xls b/DataAccessLayer/TestData/Files/DupFiles3/Book2.xls new file mode 100644 index 0000000000000000000000000000000000000000..7244f0005ae9c6ab014e6efcdbf5d4e77a1cd97b GIT binary patch literal 16896 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≷7vMrY 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/DatabaseBills.accdb b/DataAccessLayer/TestData/Files/DupFiles3/DatabaseBills.accdb new file mode 100644 index 0000000000000000000000000000000000000000..427bf49d4e694aff7992658e1187eefb93df527d GIT binary patch literal 294912 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 Px&EIt?yIX{{lEVY$WyTZ literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/DatabaseReceits.accdb b/DataAccessLayer/TestData/Files/DupFiles3/DatabaseReceits.accdb new file mode 100644 index 0000000000000000000000000000000000000000..77b797a02f54212149e255c2f75bcc4a32b505d1 GIT binary patch literal 319488 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Doc1.rtf b/DataAccessLayer/TestData/Files/DupFiles3/Doc1.rtf new file mode 100644 index 0000000..ca783c7 --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles3/Doc1.rtf @@ -0,0 +1,154 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fbidi \fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;} +{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f49\fbidi \fswiss\fcharset238\fprq2 Arial CE;}{\f50\fbidi \fswiss\fcharset204\fprq2 Arial Cyr;} +{\f52\fbidi \fswiss\fcharset161\fprq2 Arial Greek;}{\f53\fbidi \fswiss\fcharset162\fprq2 Arial Tur;}{\f54\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f55\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic);} +{\f56\fbidi \fswiss\fcharset186\fprq2 Arial Baltic;}{\f57\fbidi \fswiss\fcharset163\fprq2 Arial (Vietnamese);}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;} +{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; +\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; +\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}}{\*\rsidtbl \rsid5513996}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator HPinvent} +{\creatim\yr2010\mo1\dy18\hr14\min23}{\revtim\yr2010\mo1\dy18\hr14\min23}{\version2}{\edmins0}{\nofpages1}{\nofwords1}{\nofchars8}{\nofcharsws8}{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701 +\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot5513996 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\nowidctlpar\wrapdefault\faauto\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 { +\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5513996 \hich\af1\dbch\af31505\loch\f1 Doc1.Rtf}{\rtlch\fcs1 \af1\afs20 \ltrch\fcs0 \f1\fs20\insrsid5513996 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f0000000000000000000000002068 +d7b37398ca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Doc2.rtf b/DataAccessLayer/TestData/Files/DupFiles3/Doc2.rtf new file mode 100644 index 0000000..f6b7f34 --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles3/Doc2.rtf @@ -0,0 +1,154 @@ +{\rtf1\adeflang1025\ansi\ansicpg1252\uc1\adeff31507\deff0\stshfdbch31505\stshfloch31506\stshfhich31506\stshfbi31507\deflang1033\deflangfe1033\themelang1033\themelangfe0\themelangcs0{\fonttbl{\f0\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f34\fbidi \froman\fcharset1\fprq2{\*\panose 02040503050406030204}Cambria Math;} +{\f37\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;}{\flomajor\f31500\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbmajor\f31501\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhimajor\f31502\fbidi \froman\fcharset0\fprq2{\*\panose 02040503050406030204}Cambria;} +{\fbimajor\f31503\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\flominor\f31504\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;} +{\fdbminor\f31505\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\fhiminor\f31506\fbidi \fswiss\fcharset0\fprq2{\*\panose 020f0502020204030204}Calibri;} +{\fbiminor\f31507\fbidi \froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f39\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\f40\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\f42\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\f43\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\f44\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f45\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\f46\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\f47\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f409\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\f410\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\f412\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\f413\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\f416\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;}{\flomajor\f31508\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\flomajor\f31509\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flomajor\f31511\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\flomajor\f31512\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\flomajor\f31513\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flomajor\f31514\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\flomajor\f31515\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\flomajor\f31516\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbmajor\f31518\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fdbmajor\f31519\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fdbmajor\f31521\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbmajor\f31522\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fdbmajor\f31523\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fdbmajor\f31524\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbmajor\f31525\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fdbmajor\f31526\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\fhimajor\f31528\fbidi \froman\fcharset238\fprq2 Cambria CE;}{\fhimajor\f31529\fbidi \froman\fcharset204\fprq2 Cambria Cyr;}{\fhimajor\f31531\fbidi \froman\fcharset161\fprq2 Cambria Greek;}{\fhimajor\f31532\fbidi \froman\fcharset162\fprq2 Cambria Tur;} +{\fhimajor\f31535\fbidi \froman\fcharset186\fprq2 Cambria Baltic;}{\fbimajor\f31538\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbimajor\f31539\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;} +{\fbimajor\f31541\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fbimajor\f31542\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbimajor\f31543\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);} +{\fbimajor\f31544\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fbimajor\f31545\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbimajor\f31546\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);} +{\flominor\f31548\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\flominor\f31549\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\flominor\f31551\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\flominor\f31552\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\flominor\f31553\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\flominor\f31554\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\flominor\f31555\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\flominor\f31556\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fdbminor\f31558\fbidi \froman\fcharset238\fprq2 Times New Roman CE;} +{\fdbminor\f31559\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fdbminor\f31561\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;}{\fdbminor\f31562\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;} +{\fdbminor\f31563\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fdbminor\f31564\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\fdbminor\f31565\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;} +{\fdbminor\f31566\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\fhiminor\f31568\fbidi \fswiss\fcharset238\fprq2 Calibri CE;}{\fhiminor\f31569\fbidi \fswiss\fcharset204\fprq2 Calibri Cyr;} +{\fhiminor\f31571\fbidi \fswiss\fcharset161\fprq2 Calibri Greek;}{\fhiminor\f31572\fbidi \fswiss\fcharset162\fprq2 Calibri Tur;}{\fhiminor\f31575\fbidi \fswiss\fcharset186\fprq2 Calibri Baltic;} +{\fbiminor\f31578\fbidi \froman\fcharset238\fprq2 Times New Roman CE;}{\fbiminor\f31579\fbidi \froman\fcharset204\fprq2 Times New Roman Cyr;}{\fbiminor\f31581\fbidi \froman\fcharset161\fprq2 Times New Roman Greek;} +{\fbiminor\f31582\fbidi \froman\fcharset162\fprq2 Times New Roman Tur;}{\fbiminor\f31583\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\fbiminor\f31584\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);} +{\fbiminor\f31585\fbidi \froman\fcharset186\fprq2 Times New Roman Baltic;}{\fbiminor\f31586\fbidi \froman\fcharset163\fprq2 Times New Roman (Vietnamese);}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0; +\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128; +\red192\green192\blue192;}{\*\defchp \fs22\loch\af31506\hich\af31506\dbch\af31505 }{\*\defpap \ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 }\noqfpromote {\stylesheet{ +\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext0 \sqformat \spriority0 Normal;}{\*\cs10 \additive \ssemihidden \sunhideused \spriority1 Default Paragraph Font;}{\* +\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv \ql \li0\ri0\sa200\sl276\slmult1 +\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 \fs22\lang1033\langfe1033\loch\f31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 +\snext11 \ssemihidden \sunhideused \sqformat Normal Table;}}{\*\rsidtbl \rsid15009392}{\mmathPr\mmathFont34\mbrkBin0\mbrkBinSub0\msmallFrac0\mdispDef1\mlMargin0\mrMargin0\mdefJc1\mwrapIndent1440\mintLim0\mnaryLim1}{\info{\operator HPinvent} +{\creatim\yr2010\mo1\dy18\hr14\min23}{\revtim\yr2010\mo1\dy18\hr14\min23}{\version2}{\edmins0}{\nofpages1}{\nofwords1}{\nofchars8}{\nofcharsws8}{\vern32771}}{\*\xmlnstbl {\xmlns1 http://schemas.microsoft.com/office/word/2003/wordml}} +\paperw12240\paperh15840\margl1440\margr1440\margt1440\margb1440\gutter0\ltrsect +\widowctrl\ftnbj\aenddoc\trackmoves1\trackformatting1\donotembedsysfont0\relyonvml0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\horzdoc\dghspace120\dgvspace120\dghorigin1701 +\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot15009392 \fet0{\*\wgrffmtfilter 2450}\ilfomacatclnup0\ltrpar \sectd \ltrsect\linex0\sectdefaultcl\sftnbj {\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl2 +\pnucltr\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl6 +\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang +{\pntxtb (}{\pntxta )}}\pard\plain \ltrpar\ql \li0\ri0\sa200\sl276\slmult1\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0\pararsid15009392 \rtlch\fcs1 \af31507\afs22\alang1025 \ltrch\fcs0 +\fs22\lang1033\langfe1033\loch\af31506\hich\af31506\dbch\af31505\cgrid\langnp1033\langfenp1033 {\rtlch\fcs1 \af31507\afs20 \ltrch\fcs0 \insrsid15009392 \hich\af31506\dbch\af31505\loch\f31506 Doc2.rtf}{\rtlch\fcs1 \af31507\afs20 \ltrch\fcs0 +\insrsid15009392\charrsid15009392 +\par }{\*\themedata 504b030414000600080000002100828abc13fa0000001c020000130000005b436f6e74656e745f54797065735d2e786d6cac91cb6ac3301045f785fe83d0b6d8 +72ba28a5d8cea249777d2cd20f18e4b12d6a8f843409c9df77ecb850ba082d74231062ce997b55ae8fe3a00e1893f354e9555e6885647de3a8abf4fbee29bbd7 +2a3150038327acf409935ed7d757e5ee14302999a654e99e393c18936c8f23a4dc072479697d1c81e51a3b13c07e4087e6b628ee8cf5c4489cf1c4d075f92a0b +44d7a07a83c82f308ac7b0a0f0fbf90c2480980b58abc733615aa2d210c2e02cb04430076a7ee833dfb6ce62e3ed7e14693e8317d8cd0433bf5c60f53fea2fe7 +065bd80facb647e9e25c7fc421fd2ddb526b2e9373fed4bb902e182e97b7b461e6bfad3f010000ffff0300504b030414000600080000002100a5d6a7e7c00000 +00360100000b0000005f72656c732f2e72656c73848fcf6ac3300c87ef85bd83d17d51d2c31825762fa590432fa37d00e1287f68221bdb1bebdb4fc7060abb08 +84a4eff7a93dfeae8bf9e194e720169aaa06c3e2433fcb68e1763dbf7f82c985a4a725085b787086a37bdbb55fbc50d1a33ccd311ba548b63095120f88d94fbc +52ae4264d1c910d24a45db3462247fa791715fd71f989e19e0364cd3f51652d73760ae8fa8c9ffb3c330cc9e4fc17faf2ce545046e37944c69e462a1a82fe353 +bd90a865aad41ed0b5b8f9d6fd010000ffff0300504b0304140006000800000021006b799616830000008a0000001c0000007468656d652f7468656d652f7468 +656d654d616e616765722e786d6c0ccc4d0ac3201040e17da17790d93763bb284562b2cbaebbf600439c1a41c7a0d29fdbd7e5e38337cedf14d59b4b0d592c9c +070d8a65cd2e88b7f07c2ca71ba8da481cc52c6ce1c715e6e97818c9b48d13df49c873517d23d59085adb5dd20d6b52bd521ef2cdd5eb9246a3d8b4757e8d3f7 +29e245eb2b260a0238fd010000ffff0300504b03041400060008000000210096b5ade296060000501b0000160000007468656d652f7468656d652f7468656d65 +312e786d6cec594f6fdb3614bf0fd87720746f6327761a07758ad8b19b2d4d1bc46e871e698996d850a240d2497d1bdae38001c3ba618715d86d87615b8116d8 +a5fb34d93a6c1dd0afb0475292c5585e9236d88aad3e2412f9e3fbff1e1fa9abd7eec70c1d1221294fda5efd72cd4324f1794093b0eddd1ef62fad79482a9c04 +98f184b4bd2991deb58df7dfbb8ad755446282607d22d771db8b944ad79796a40fc3585ee62949606ecc458c15bc8a702910f808e8c66c69b9565b5d8a314d3c +94e018c8de1a8fa94fd05093f43672e23d06af89927ac06762a049136785c10607758d9053d965021d62d6f6804fc08f86e4bef210c352c144dbab999fb7b471 +7509af678b985ab0b6b4ae6f7ed9ba6c4170b06c788a705430adf71bad2b5b057d03606a1ed7ebf5babd7a41cf00b0ef83a6569632cd467faddec9699640f671 +9e76b7d6ac355c7c89feca9cccad4ea7d36c65b258a206641f1b73f8b5da6a6373d9c11b90c537e7f08dce66b7bbeae00dc8e257e7f0fd2badd5868b37a088d1 +e4600ead1ddaef67d40bc898b3ed4af81ac0d76a197c86826828a24bb318f3442d8ab518dfe3a20f000d6458d104a9694ac6d88728eee2782428d60cf03ac1a5 +193be4cbb921cd0b495fd054b5bd0f530c1931a3f7eaf9f7af9e3f45c70f9e1d3ff8e9f8e1c3e3073f5a42ceaa6d9c84e5552fbffdeccfc71fa33f9e7ef3f2d1 +17d57859c6fffac327bffcfc793510d26726ce8b2f9ffcf6ecc98baf3efdfdbb4715f04d814765f890c644a29be408edf3181433567125272371be15c308d3f2 +8acd249438c19a4b05fd9e8a1cf4cd296699771c393ac4b5e01d01e5a30a787d72cf1178108989a2159c77a2d801ee72ce3a5c545a6147f32a99793849c26ae6 +6252c6ed637c58c5bb8b13c7bfbd490a75330f4b47f16e441c31f7184e140e494214d273fc80900aedee52ead87597fa824b3e56e82e451d4c2b4d32a423279a +668bb6690c7e9956e90cfe766cb37b077538abd27a8b1cba48c80acc2a841f12e698f13a9e281c57911ce298950d7e03aba84ac8c154f8655c4f2af074481847 +bd804859b5e696007d4b4edfc150b12addbecba6b18b148a1e54d1bc81392f23b7f84137c2715a851dd0242a633f900710a218ed715505dfe56e86e877f0034e +16bafb0e258ebb4faf06b769e888340b103d3311da9750aa9d0a1cd3e4efca31a3508f6d0c5c5c398602f8e2ebc71591f5b616e24dd893aa3261fb44f95d843b +5974bb5c04f4edafb95b7892ec1108f3f98de75dc97d5772bdff7cc95d94cf672db4b3da0a6557f70db629362d72bcb0431e53c6066acac80d699a6409fb44d0 +8741bdce9c0e4971624a2378cceaba830b05366b90e0ea23aaa241845368b0eb9e2612ca8c742851ca251ceccc70256d8d87265dd96361531f186c3d9058edf2 +c00eafe8e1fc5c509031bb4d680e9f39a3154de0accc56ae644441edd76156d7429d995bdd88664a9dc3ad50197c38af1a0c16d684060441db02565e85f3b966 +0d0713cc48a0ed6ef7dedc2dc60b17e92219e180643ed27acffba86e9c94c78ab90980d8a9f0913ee49d62b512b79626fb06dccee2a432bbc60276b9f7dec44b +7904cfbca4f3f6443ab2a49c9c2c41476dafd55c6e7ac8c769db1bc399161ee314bc2e75cf8759081743be1236ec4f4d6693e5336fb672c5dc24a8c33585b5fb +9cc24e1d4885545b58463634cc5416022cd19cacfccb4d30eb45296023fd35a458598360f8d7a4003bbaae25e331f155d9d9a5116d3bfb9a95523e51440ca2e0 +088dd844ec6370bf0e55d027a012ae264c45d02f708fa6ad6da6dce29c255df9f6cae0ec38666984b372ab5334cf640b37795cc860de4ae2816e95b21be5ceaf +8a49f90b52a51cc6ff3355f47e0237052b81f6800fd7b802239daf6d8f0b1571a8426944fdbe80c6c1d40e8816b88b8569082ab84c36ff0539d4ff6dce591a26 +ade1c0a7f669880485fd484582903d284b26fa4e2156cff62e4b9265844c4495c495a9157b440e091bea1ab8aaf7760f4510eaa69a6465c0e04ec69ffb9e65d0 +28d44d4e39df9c1a52ecbd3607fee9cec7263328e5d661d3d0e4f62f44acd855ed7ab33cdf7bcb8ae889599bd5c8b3029895b6825696f6af29c239b75a5bb1e6 +345e6ee6c28117e73586c1a2214ae1be07e93fb0ff51e133fb65426fa843be0fb515c187064d0cc206a2fa926d3c902e907670048d931db4c1a44959d366ad93 +b65abe595f70a75bf03d616c2dd959fc7d4e6317cd99cbcec9c58b34766661c7d6766ca1a9c1b327531486c6f941c638c67cd22a7f75e2a37be0e82db8df9f30 +254d30c1372581a1f51c983c80e4b71ccdd28dbf000000ffff0300504b0304140006000800000021000dd1909fb60000001b010000270000007468656d652f74 +68656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73848f4d0ac2301484f78277086f6fd3ba109126dd88d0add40384e4350d363f24 +51eced0dae2c082e8761be9969bb979dc9136332de3168aa1a083ae995719ac16db8ec8e4052164e89d93b64b060828e6f37ed1567914b284d262452282e3198 +720e274a939cd08a54f980ae38a38f56e422a3a641c8bbd048f7757da0f19b017cc524bd62107bd5001996509affb3fd381a89672f1f165dfe514173d9850528 +a2c6cce0239baa4c04ca5bbabac4df000000ffff0300504b01022d0014000600080000002100828abc13fa0000001c0200001300000000000000000000000000 +000000005b436f6e74656e745f54797065735d2e786d6c504b01022d0014000600080000002100a5d6a7e7c0000000360100000b000000000000000000000000 +002b0100005f72656c732f2e72656c73504b01022d00140006000800000021006b799616830000008a0000001c00000000000000000000000000140200007468 +656d652f7468656d652f7468656d654d616e616765722e786d6c504b01022d001400060008000000210096b5ade296060000501b000016000000000000000000 +00000000d10200007468656d652f7468656d652f7468656d65312e786d6c504b01022d00140006000800000021000dd1909fb60000001b010000270000000000 +00000000000000009b0900007468656d652f7468656d652f5f72656c732f7468656d654d616e616765722e786d6c2e72656c73504b050600000000050005005d010000960a00000000} +{\*\colorschememapping 3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d3822207374616e64616c6f6e653d22796573223f3e0d0a3c613a636c724d +617020786d6c6e733a613d22687474703a2f2f736368656d61732e6f70656e786d6c666f726d6174732e6f72672f64726177696e676d6c2f323030362f6d6169 +6e22206267313d226c743122207478313d22646b3122206267323d226c743222207478323d22646b322220616363656e74313d22616363656e74312220616363 +656e74323d22616363656e74322220616363656e74333d22616363656e74332220616363656e74343d22616363656e74342220616363656e74353d22616363656e74352220616363656e74363d22616363656e74362220686c696e6b3d22686c696e6b2220666f6c486c696e6b3d22666f6c486c696e6b222f3e} +{\*\latentstyles\lsdstimax267\lsdlockeddef0\lsdsemihiddendef1\lsdunhideuseddef1\lsdqformatdef0\lsdprioritydef99{\lsdlockedexcept \lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority0 \lsdlocked0 Normal; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority9 \lsdlocked0 heading 1;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 2;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 3;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 4; +\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 5;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 6;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 7;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 8;\lsdqformat1 \lsdpriority9 \lsdlocked0 heading 9; +\lsdpriority39 \lsdlocked0 toc 1;\lsdpriority39 \lsdlocked0 toc 2;\lsdpriority39 \lsdlocked0 toc 3;\lsdpriority39 \lsdlocked0 toc 4;\lsdpriority39 \lsdlocked0 toc 5;\lsdpriority39 \lsdlocked0 toc 6;\lsdpriority39 \lsdlocked0 toc 7; +\lsdpriority39 \lsdlocked0 toc 8;\lsdpriority39 \lsdlocked0 toc 9;\lsdqformat1 \lsdpriority35 \lsdlocked0 caption;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority10 \lsdlocked0 Title;\lsdpriority1 \lsdlocked0 Default Paragraph Font; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority11 \lsdlocked0 Subtitle;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority22 \lsdlocked0 Strong;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority20 \lsdlocked0 Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority59 \lsdlocked0 Table Grid;\lsdunhideused0 \lsdlocked0 Placeholder Text;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority1 \lsdlocked0 No Spacing; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 1;\lsdunhideused0 \lsdlocked0 Revision; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority34 \lsdlocked0 List Paragraph;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority29 \lsdlocked0 Quote;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority30 \lsdlocked0 Intense Quote; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 1; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 1;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 2; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 2;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 3;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 3; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 4; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 4;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 5; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 5;\lsdsemihidden0 \lsdunhideused0 \lsdpriority60 \lsdlocked0 Light Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority61 \lsdlocked0 Light List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority62 \lsdlocked0 Light Grid Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority63 \lsdlocked0 Medium Shading 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority64 \lsdlocked0 Medium Shading 2 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority65 \lsdlocked0 Medium List 1 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority66 \lsdlocked0 Medium List 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority67 \lsdlocked0 Medium Grid 1 Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority68 \lsdlocked0 Medium Grid 2 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority69 \lsdlocked0 Medium Grid 3 Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority70 \lsdlocked0 Dark List Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdpriority71 \lsdlocked0 Colorful Shading Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority72 \lsdlocked0 Colorful List Accent 6;\lsdsemihidden0 \lsdunhideused0 \lsdpriority73 \lsdlocked0 Colorful Grid Accent 6; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority19 \lsdlocked0 Subtle Emphasis;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority21 \lsdlocked0 Intense Emphasis; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority31 \lsdlocked0 Subtle Reference;\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority32 \lsdlocked0 Intense Reference; +\lsdsemihidden0 \lsdunhideused0 \lsdqformat1 \lsdpriority33 \lsdlocked0 Book Title;\lsdpriority37 \lsdlocked0 Bibliography;\lsdqformat1 \lsdpriority39 \lsdlocked0 TOC Heading;}}{\*\datastore 010500000200000018000000 +4d73786d6c322e534158584d4c5265616465722e352e3000000000000000000000060000 +d0cf11e0a1b11ae1000000000000000000000000000000003e000300feff090006000000000000000000000001000000010000000000000000100000feffffff00000000feffffff0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +fffffffffffffffffdfffffffeffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff +ffffffffffffffffffffffffffffffff52006f006f007400200045006e00740072007900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000016000500ffffffffffffffffffffffffec69d9888b8b3d4c859eaf6cd158be0f000000000000000000000000f00c +7fba7398ca01feffffff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000 +00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff0000000000000000000000000000000000000000000000000000 +000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffffffffffffffffffff000000000000000000000000000000000000000000000000 +0000000000000000000000000000000000000000000000000105000000000000}} \ No newline at end of file diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Document1.docx b/DataAccessLayer/TestData/Files/DupFiles3/Document1.docx new file mode 100644 index 0000000000000000000000000000000000000000..94dcb41242099bef7eaf521c4d424a4804707e36 GIT binary patch literal 10049 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Document2.doc b/DataAccessLayer/TestData/Files/DupFiles3/Document2.doc new file mode 100644 index 0000000000000000000000000000000000000000..97b5bf064df816d2ee7ffcec7f414d83664a1c03 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Document4.doc b/DataAccessLayer/TestData/Files/DupFiles3/Document4.doc new file mode 100644 index 0000000000000000000000000000000000000000..b58cabf8ec46e235e24d5fcbdba40e6ba314a853 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Document7.docx b/DataAccessLayer/TestData/Files/DupFiles3/Document7.docx new file mode 100644 index 0000000000000000000000000000000000000000..4f8c40176a43ffce8e3b8621ad72859b657e7461 GIT binary patch literal 10079 zcmeHNWmr^O+a9`8LQ0g7?v@f6TDqH|d+6>`Qo2DIq(QnnB&0#T(o z&h=g2|M%TL)?RbXzMpIFweF{vk{kje0RS0*3IG6}02XhO_{`w|fX7Gxzykm(yskLd z-o?z`#Zb-D!OU5o)x*yAF$58w{v7}w_WXaZ|KJssRDJ@SERVblj#0>L$0rJ0G#29XbKlrE~#pXkNIBrxjybOckv+u#Q z%NzusXESA-DJHN6jBXx_>kBAU?0Qq%Kr~{bC3-YLGRTIPg$>6}AgeG4*=B%(p}NkC zdBfb$E!y|MY+cnFLZ+JeUD0Cd)!ye<{)D;lWF(Nby-U1nvJHt#$0@`?wAz^N= zeNrgEsy+N}Xl!#YSS29QePy`XzYYa!Naj<7UwC*bDSrl3^H^sqfl7njw>|ZGxuZFx z<}yL#t~2V^RoR_VngV=Kze)^a*8M#KK*6n;9u+??iy(#>21Qy1_51S8qf<@HE=lLOQ|%&zr0v1EV-LNbYirGY+@v&b zuzC7zP;n|FIODTmfe>;zNc+pXnG7STWg8E>`bZQd?S9?#APX$1kqRq&@D!U+Tw;z; z6h{eUtvXDMMuf_ot0Gq~w7*TQDVAIYP4!LO5ZU*rlBTx4Q%!{QwEQ`3EGrA>^V&Ww zUc)JDeLhk@baUv;U^rnv3J5&QYRqUW)9Vy%&G4O>)RujeHY?7!6rFd)3i9PU@ZK;o zCX^X12Q7T`#K$!gLB{~cWftPuS1w5TM4Oq&*ZW#LxSGvU1m>vzt|L>X)yh|}1>ryd z0LTHTaPD9yQ?`F8iYeH{)eh#(ez>telm-sw%V2W;v#-+lVe4*o+z@DJTkwoGi{Nce zNPlDE^ABa$fQZ(+oGO}{j5@z-ba9ne$meU3Mv|7B2{jq}?%*Ce>bn!Mx>`+yvuA$N>9rzzvn^9upGCa50!3nKI*k)XjA<>0<4Z$(!VIwSG3CmM6|F zBdt;I*-6#2WK-QS@$4W_%;U4!exMTViP{tmw)+^t8a+X|H!za zK$eSvXvu@X1A(!E=A|hHwC{YF{SWrppT)Q?B$rr1QbL69yUhmL3$QAD>VAwSu~uJUJjEzGvytv=gF zs$3Z4bqH~6j*m!`H7@2U?TtQ^CPyiswSQoVClxKi+ETMEwE8-ny7wT)f5)GB2{qyy zU!8B{6&dPRV>E9orh(3-K{3Kk1Da(b1Kb|P^$V;0#=O*gOU=}n9&38R)Vz|t?uB|) z!63xmW5njBjL?M9ZxxfnE)=h7#aZ0)WFl53=tGY9-A?MTvCh;}Sm9}Ckb*B?rG?G~6zF<62Rqy*;G7u) z!AjdTF-dKK(-ceoA}{1CJv9!htM&KH^w9eEt>?3Mm`w-3N`)&%*)PoNT|gef$#f$6nj;6NOkV4tQ#7Ep*!Rk3yy7{BR@}hM(cg_#a&6gK zGBN<5L-$HPMJ3Y*eV7#ZPZ$*E3~rr<#c7T_pC?r8FFrbBEAy0Q%tTB*3aM#jh+C?S zK3{H*m{tcG2O0TNO*_s+kTJ3!l87Q~iEv=Ry+GaSwY6&0(AAIN zkQYi^dDy>1`ld*6Oex`%*J(`{xja1HtHZ+hoy-G^&`x9&*XUT)Su=PF& zU)zpxyHz@Y^Cf9->uVfc(aJ3%Q*|opYCeGdW}9rq94c%*A{^A%%g)Klm~@eR5sa)K zP49khYV{Hu1yn$T^EHw=hb8^XmIkbnpPxBqyVXyX^62@5-+js)DpM$!v^A^Jf*_kx zk~v@0&RLr{&vuf`PcA-@Di2UyZQKDCVFRpE3GV ztM_FuNIRyjNqoYBEa@R~)eldAED^O2m)9XU04!6jal|4k+1{B~^apDmH1t!LhtE3m zNCdwQHa;1~kTD!nt8K+m#U$a#J>R)JFV7a0=)=jT5WU#GSnXa%5!HDyQf!wQvZ2n_ ze!Dl?N0}>{?RRoKPW;6~yZ8R8o38!l#*+tk!s6*jB-`7Yv%P`Ha*^BHW+}o$`9LYN zi`ZTuB;zaU{>eiEE)7RoI%>x@!fw>b z=&oEia#Bb3Kyr@rhYAGPGA{@woNoeR(f1Ejc4k~tu7c!5G`3hJC|)wjbH1mhOE-_K zv%>UC)7ZwmbF;1XMsejYned7vZ<6juA7Tul#NSLkdX`O3t{F$ZmYRg+hfq=|+ux~n zVWy|Zc<3ViP^vXRTDx{L8Q?3Yu-vIs$+*}ym|q!55b;QDyd_Y8jk^9qjIYa4CzN80 zhS5Yc76ljbaNkiKX?epwY|H%+L4m008k;tzS+N|s-fHVLHwLaS7v5ZoQgIeK`Q%sV zCyrdDH+GnMdIDka7i+tHgmK^Nh}Pt15{fxN*T75t5J7F1W`)gnapD|WM=;(v;Ap;!JyOTIVcKx-HM>Z$&$2}qUl zp{;PN*8Xt^cKO!ojh<30N3*;o_FI8mLiv@_A&n2FK(YO4kjC_jtTf%l*XFWW-DOH7 zKK$jRm_$<{$cSR|@EQi8CynMK0BL-XD4`_o}?n8 z48(-2phnLC_e>nxvDL@u-r;|E`ch(y&EZXcnO*+ES|+Xj<=Ll|J$`emkZPwARqjz! z3_ef2exoJXwLtr%Dzc4{@(7tr43#|c-g_?fQ$KhFumNx4X!U2Q|z7Ol8fUgf$rdjT#KZ^Nl2?0khRkJ*I`xr(*eqDnPBvHUCZ@e*XUFuVtng>QX`yi=|7Oh1l0MIBSr4)j zeO{NORcIgkwPAMpO;uS_XA5K|AjRB+)V9-Z(294e1r^;*!zm@D zTW}-PD%c~YaK&T$ZRHvGgQ#CaF@AJ39M^sz;&iyyRo+_o2>MX$BldWPoR6KDoSpcN z{IQtzlaueV?D+!{0j2#!xiOKDCrml(y*-NfJPK_bR?|W6c$F#vpGplK26%P?4kzdZ8{CX1e z9=+&>2;k)f( zA8`K2h3K5~UM&Mxp^hOSF77Ac@h|d9gR2oC6jES4}5&@azvzof}vuTTj*w9~mgqj{0XN5|X>372_jN zW6onPKJjz8eSNv&2$nCQ$+ZUek+(^ybg2RoP9L)R%EpAE`Oc8eY)A`#$vEY=Z*&~) z9C7-NY<6aDw8&a2R*hKVHV%sGhG1v#+fINgyVtNYp4nPgu3;hs;NKyx_pq?|;U-3) ze={U+IK2-_r`dv+!E~+VLLhxf!!w4Bx1WW7gE@)xt*3($7@wK*EsyfmdJ~7PO~eR< zo48J6fOHV!^I)79d&!Q9KEL?(ilz%mWR@98VA#T2?YZbe&;x$jxxLB|EAx;brfHJ{ z)v|@#&mZppQC%`;nMk}~DF_N80D%8T+-DA}wW@)PZOwk@OHKUnkMddwH0cUE4oa(V zA%zHJAoniZLSXKEl58w^OscZfmcjo{qlS@uM>?6)Mp4qx{Mo&dgaZLl-Z)z1vrMEH z1?F_$ML^Ju?~|{Qww^=ZvFp(6(Zmj0yuq2Yjwjh?e|Jqv#|vt7-k`zc7!HNsOI5K< zH|u3|IJG{{8Q@HdAWnFcIK~eK#w#Ry;jeVwDx8F@;O1ia$%e zlmRc`X*_ zGi-+tVY@}}$4-9vihn>UR_#{#E4@s%bAqur9pjW+zxLw4fuOv#=2(=+%mrp4UKbiov&+9NxjZH zxgm6a9Zw(=vnmmGp^o^()h;b1TJK!{tZ{^>hp_-Uv4o=u^se@e`#;iBue&P6751Th zupAf{Ry%>EzDiDD2WK{rgToI}!itRlt(U-7E>mSt0ah<*p+3S<1&vl=R^eiQ)9$Ie} z%gQbAH-g8X^0GxBb&rN<6sI9Zh&*{lLqkL8J=25M5|=GL>@0jq>0M zq(tTHhC*zL0)=-8o?wt@LuAWk>t)mvAuyw za5mFkAe>B}M@$pmZ_3+TGFUU;QnwF`M}eR5=(5pxYU@Q6Q1BSZ#l54tmTG(ecYaFV z>Ef=UQYY!Ua8f_MQNMdn`*yehsSMf?LoPgU2)g*^Qg{OfcifLo6$D0AykDtm0(Sao zK>y2C7*S!DPrSZO_v445P?T$&&TF9EyPEj-6-iZ*grBA=D+R~v%b3&OeW1MeORv*z zj@I815XnBV=9t}mHXGzx%s~qw5kq@8E^RhN>!m$1fhU{!P4c*jLkWVw&s}5>Mjz)K z*V3BFN7^N9poxt#fv}ACUMGY0dXTx@wH;C)e;_Ss#F1<6Wg({Y!SZDqwTyfo@!3u?=7sgeZ5Ywyaa5J5zj-s&23{Xx31&>)(QFiceZ;a$kL%zO0zS zr538Po`|i&sfX<(*&7vm{&084$JS$Etia(OpFsvqe%n%}&-O6b16fUfZP!rU7e>Lq zN5drhVdDg_Ncchk0KkFm!OuFPvx}##+0R(GCS%!ok{`Ek8N7Li@@83X4iSGVmNTzo zoMZ*v>RUFUZV?Z^#)yigxBsmSldkLj%u?C#gYP)|7J2%<(=2oK(1Uub!^m&4{kA08 zE&SLB*%F*Yv-_Majdw1m&oC3swTD#Fj?6AP)GrS9Mn#vFvKVh;od_Qyq&*u>0YSbW zxNs^fch$dajTOvJvmi?Yr}3s-?gQ<4sn#e>YnG2+D(3g~oyd%+=40v68W(hR%~ABu zWeu(Cvr>OZJaWr;=B@j*>TsxmcyJ40xx%+NsdcFQc&(}-$X{gOWy#7xVv+P~oArjY zH4RhFd!K9uymY!u2Hy{ef*0(SU5(2{D-YgiX57{e0)^>5L=(VP>~3hUtH1GAPp zJ#o&VOkU04OSZEAaG~KtaOWOmG#l7>cuKc?3#mPPy!(s}bC@@%$Jr97XRlU;PpQU2o#OMwHMMnHT3Zkj zC(%kxDl-Y2P{Sq+ctZ6kWN;pS5S$ihr) zf_z5QWVWamn5PY7DRr%H?s2L$w8<=aTrf&Jm^5PMHs4H@|7^bO+E)IqVUhMF+KI$u z_331wod56?1J2ziiG@h7jrej7x(jvzt*#F$L`T4Uj?rKnKPZ*#!+UvTrt_rn-Gz<{ zKfL;IYz?%;1%sIuv+;S&uGxDkf>N<>=IQk>^G5j@!%mW0Z29hz`i$FIQjm{$INiMz zP@S>hSl!sh<;WnL2Rm7zSO9bM4|-z-fHSyGQWT{)5`)SzE&Gs9QsAke^5E7rY2Y9;^qQqPizEDh0DiW{Iv@CiLx=2)q!Bf_M$O1SS6wLL042iTybSS;uL!sZ9qTdI`|&{3`g;^F@SNuoyWWW zq|^-QCE5#LasOqx#d|DayKy1r4Nfk9R%M}%adQ?y966@rfiHqDqFxb-z*}k|(FBAg zy?`&I6`gDM^pWoo4k7OQfix8X3N%9oaFvo!;1;p(1STCA+DqYr5ktw}<$F-mf8DAH z=Lrx!{B`1Rbnq&QZV8o0o2(^Y<0Bay)nG7+I_w^#Nk8YH z)B>8mcRP|)>W8zA;QR63@=CW-j6o9EO3@o1$vR;V4JcJSZe&Oxm1@D``Z2t7>>-2u zIays>#34~^!DFuC^^h-%;DZMyqu><(xKD)zuVG~z)knfaVk@b(;1M{vSO@L6Vs}!Z z6!spkMH`8=VG@B6Q4KsDq09I5PYo3I1!A?ZB)xZw7zlhTz5OWJIyto@a#kF)pGV z3|X?&UAE)nG7h)r5{I)q9o)TQvckfiCQYx3_g{=j!U0Z$1w5Sk1GLwQxeg{2Ain$6w{FAElPFV_cgyd~ z*v87wxE&Y6wTSK8PomCar)SjtPs?s(vTkAi@m~%U4xR;;Vg2(-q@R(@FT+2aOHz{i ztAM|rmG}h{Rci>+e$iD)+VV#=)tDXG2q~F_#f6BUtH5mWaT>KmSx8~5F za0iTk!+&oT{VwA7vfQ5{1Yl){e}yH#B(lH5e=k$~3AcoGtA4`&QndIT|9kTMCmtUb z)&Io*mP-FF;jbC#pLiH)U=n`MPk%@MHA(mtT}=85`j3?1clhsN+@AuZDE?Tz{|)Mt WjZiGMp literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Doris likes apples.doc b/DataAccessLayer/TestData/Files/DupFiles3/Doris likes apples.doc new file mode 100644 index 0000000000000000000000000000000000000000..ececba8c58cef7cd41295ab5b2efbc7384ed85d7 GIT binary patch literal 27136 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Doris.xlsx b/DataAccessLayer/TestData/Files/DupFiles3/Doris.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..0672cc572fe3551fc572d6d55a036607e7c5302b GIT binary patch literal 7821 zcmeHMcQjmU_ny(2=rwvLM4uoDLXa?w8lC7R3?sTI(TyN_i5k5{uhC)%f<%evC87k; zd*?UFz4yz#Zthy&-{0?^wdS0)=AHelGw*)(-p{+YiUK+Y82}4_0{{S+0NR=z5k^1& zfC>`;AO(yA^`zl;PUdz_h7a8B%^eMR-E3iunZrQNmjE=>@Bh92r*`0dEL5qDpD6G^ zZjx!6g3T^8fCw^leT3vrlZhQkG{65)-t*u@{*_^05e%8>c&RXkwuDUc`3BQ z-)DTx4_b+<&;rS;GN4>_-iw{Cz{o0tP+4XeVN2E|8a|va^2b)pA2&f3Qk~H)a&qTm zTJ-wo#C#0Yl{vm*vmQ8!xUo5A=FpZ?Neojo%|d=X0%79lN>z|CNrWbO9!_t{S@(DZ8Kl%7BNW+#V}k<*|k*TD3EzJ+z2p*lQ^Rq|jz z0NoE_Ix(=n*mp;7dj0F82Mn|(d`fNgoKodNCLSZ!ZpG=EgfC5)Egz9}Qa`6P)|#4z z8M4I!;@ zusyH~C62|8Dr&({xEtSBFOvkNFv&F1+dVD|(iWhCzKQ&#yFK#$o!)hrxZ~=@mOskJ7#m) zF2?*M=2rd5+h)|QVo(Nw(>I8Vjxu67^zzS2juC{rp; zlE{N^WH1fz8wx1JKuJP?d~Ne0L0t((6*O&T3jBm40mfHPMk|jZym!@3&u+}I)g*Wi za)b=tECuv^GxS6;;_taJm&RF7AH@NCRBj|h5dp=QKQkpv%|N-8pUg{S>kil}L266| zhbBaog|9;JgCHAychZApaevkMJO>#7DCbWy3=cPg0;h!$3KQ9BgOx!$Z0G%fVbYgzqPItzih4CN~F zP9vL4W}5>%HILLYpSMKy&Q}*EfpQyxWh(ECF-+V=WxoDI!lg$llef@PSWdR}~4B1ra(g>9R z+;E6?w#W8DFI6dT0AgM)ga1xqIAN1!$imCx1Cl1PT_k>Uuh*q^!f6xBZ0iG?=LMul z$8`&fOpsbRp?^H%%o`#etSCCc69@-*W+k;!aw3An>cOG75krOAp_^X3$AEsxAoB32 zBn~q_FT^bG^Lu_K9{_L?{ls$VW_{|9jgh;U&<7JI{K!aR(38@%rx)Lj)OWuf#moiw zJ!d#~I$avrYGdHxvHZgO+<&$;;j{Pt;s`_5oiy*A?Jdd$H=VZ^$88*MPEXx$5(!!{ z4TSQgpYE@Ag_cU3oi%i_ZQA5M$JI~qbwJFA;?&@_ZVkk0+7NKun@AzE(Q$VATU#lzT0lC^c!Z==o;$9@VD zs!Q~;bcza4!E6?eNQzLGM;P8O5|*!&xWFo1DV;^R2cHDf*2~G^yoUrZkbF(tx|Mc~ zHZF>G7D0~hOM5+8 zMi&E-_5ycJf%B8nS-91yYkQ(-m`-Yawv>m@9?7fwDKMp zH6NVI8qir)ce_r~s1ggeL?V-mHbB&uzTxX5W?w~lY!Wv8*0J6z2_J{umImX*uL|$J zKn|ma4AC=8d~p^}p~H6&wCKToe%FyZzK~Q3M7bcxlugo`E_1)j?e+s37Z?k z)b!hrKkl>JzY6T+1ePjH9U4=#OhuLk;Gd|+jF}y^CKoFTh~Qe=s~fL1XP2pClQ0bt z#Ao2+3&jNiLT_+zU+AL0f1-*vD)$us+OP;C)%lHUEze7Ay3Fo+YB;$V%S`k(=jO!r zkrDgbdj{Ntu@msu83uDL3FVU5aVX06^V!Gc7Te}d&Ze*%Y@zkctcqI5BL*Fc)WJPw zAQAVJ9;0czSzo)H3Yvx9(r5BVAhjH-jte1;U2n7z%oWo$AcLI)=Dk~n6ZDi^^D2SS zk;h)ZaQ^~2A|87>&>+zR`*hej$RYn?BBc_nsM}VcOxF*<#XE_@!(=*9iC5fBz56PD z-5{P-0rv%h3&Bmwy^o+J5&m?etl+?fFp%h5Zc?^+%ZyS-`bnBaKW9HwN#Jt|b@WD) zF!uR!ZzsDD=fbe@V87XZpX~K9jkPD0ViO*r&z3@DlQsG(&=SdO{4|sHORu%wtku;k zj|V@rF>CduOt=w*Y-EDWe8gV9Q+A>HMd;-5U3k8F5*vF(gL_0i(xV+tFvrcA~=;~(E1=yhcNJ}=~j6K>!F`xNb+7BO#-=GT8-%Hj@ z|Fw1W^GRxkoSRb)8yFERnPSB*StSkgivzVXVT9rzHDe@X!t39B(c3l`Lx(Yd3EW0>1 zcqT&~9^_LKn+4r2uRl>^rA9W>6|*5p5+Uxa-=1>CC1vg1nhKs~POoBm0&NUWg?Lqs zXQ#|dtqCV%FH}qGklRW^GI7yK8nh9Gau;vq(S`I13NvwuG8yA7SxEiICvMIrU}@b? zXwzMz3lnPUc{^_vvO^&KKD(POf$ecLx;Fl51(3Zkb3{gXHci9?8C<@&{cbAJJhx6c zvmw88ZGA$+F9}ammM-(lx}l+0ZXp^>0S2yLPt?K_f4U+`CWb!eM5%% zPHzXC*NBWSYR=3Yq@^idb02<<%Mi&|(V_#NHaoMa);W1&-u}92$g-V#LL_%&o4Kzc z_RUTV+G_~niM=EN95ZjFGWVvTZdn&8qrpzkhYvbM_8eihdjKbGLIrmu-*6rBLObi> z)U|$A)oze?Z_K!aqPo(`hHBFZcNPv@$n$a^(B*5c=-eFcl=^ zEy}T=bLqqesFqG#&KmRePSBGyC zuN+ZR$l{`TDWq1;)?H-MGFdx-y#>H?$3LkJ42QSb`m52 zYTS-Wi5qeE=1vu)w+PfYjKF$iOFgMl>AK`jfonyccV-F?!qFH=`b2{t;!_`hqGVxW zhc~s@+dJh(8gDY%gUX@nQeh?5nNv8PkQ~qKZlQG-hdmORP~A12Hy^(cLq{A*bkcHd z$%2RLE@h#NXKK(MDiXGKTeEHs} zUHf~^o?RliCxKcqMxFPFQT+ikxT%T*+}@GT6z*XDot2E4|F#8C*$)sKt*p?-PZhl3 z_c>#JI@dt9rr+hIpqMC?=nFScR|C)JDO1SG{u*?mSo3SU>GsJ&S4;xgPS&d|bZw3* zF4g#KPPBF~rL|UO?H+Sl<~#R7(c)@9lGK(AcV`cEe(A)TvWjt^Jv4nXxo%<$NY%kK zQ5fBXe>N{JK6z_#P4sbD)omE(N%rlQ7;sZ3iP*v?^+_~SA)6fBa)$yJRet}v}2_#oa(2n2d2r?N2%g4A5>Bu~BPZRJ|H2lek&W!W1IGGz+fL!TQdEukE z!6&|jGvLrlaBrn^QcPD^_F%;RH^W6eq_=b$=DBprWH^FSQe&n_S=H;8r6onIK|2&h zIxuRL=+C4xwzvP6bKlwa+m#X{r96ik3v9@pFfe~E81y45q-DVf6}_IRrne7EkvIJ^ z9%YHp^%jqj$yu)O7)$BcNlTN6;P_@yyQc%fHMkO(sN@hORaWj~td7|G_T^O9OpZOa zqZ1G~ivEn|Y)+9!4aOLS{$7;Xh{-zBf|qTax(18mI<{tEVolItqOhQ5T%|q3+6e_( zmrk0Y{3vk%N%ziIZj~z`JMrftRbe%AZ3#oo#zw_<$sM{wqaX6d~4 z1I1d5lQh~j=aTuu{Ptv>e-lc6u6SH-S%T!I975Lxj(c&KZvvT4_p>H5x@QfP^k-mv`p^e)>5?+k2PvAX>i8~WEedp1dzmSNF5Bc<&bdGn8__Bc?U_$_M!(Rcv= zG_L!@VShY-F}zbz_$$C)hY)`let+7aqT){@iOYt6?dbm5Pz%*A`se=cWt_{MzMn|J zsEOpIzTaiz%iXD;#zc6(>{VR`xO`Ul3D8FL1K{V$;j-yvJ@wNxisU~p{x_NW-=mD9 z+HJr8{Xe7p&}f%YE=!W1@4`aAoMpgY{RD%%!_&<4~R2KjM literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Drawing1.vsd b/DataAccessLayer/TestData/Files/DupFiles3/Drawing1.vsd new file mode 100644 index 0000000000000000000000000000000000000000..f1a9e28f5ee20e66679c58426a2e546725b4afd0 GIT binary patch literal 18432 zcmeHu2Ut``*YMoCcMEk3uu5~6Dk{1lpvJaKRcuRJODszjF$f5#(Wr}xHJViclNb#e zP3&S#H7-UIOJXpw<_%^kQe;iIOOYnr|IAV}?N9PO@Ap0b_x$hh9PaG7XJ*cvIcLt9 za&MIg%l4mkC`Z3Z;}HvWF=mMK0-k_8+52075F7Fs*TpalMza7Q`=9i`NCKU}D;~f9 zr2ju95QWm=FB?fwC`yB8CR&b7`EMsN%mOb;?(Y=roiF|l?cbsKr|tipI{yjH|K|4p zo#T&vgRMiihbZnAVAzXtj4h~XzrN}QVe%T%@VrMl(U>kF`ba)E{i zfQJe5i*c6lv;wdO-~&JifP?@d02=^X06PFNKtF)~0QLY50FD4o0L}md03-lX02csP zfdBZQ-jVp9eLlCpf2#Q~XpmeXB7BkKZtP$G$GY(EO8=Gi|6Oh4dj2=JkL?am1$h3# zb107K@znI9{bL$DXa0BEzZ=y5pE=+~P5Ph7cY(*Cp0Da)6#iMl@4f0oB~fJ@>waQd_70B9W7i+OlCDJ5Y+ zQd)d!Tz2+QUlfh~=H$$zlq{4MZwUmrP2AqEXdh)~CuMfq9qxDU`>AnRfFByYATA>* z3-Fj9{2uoQ+a^vv02sFt0P~Owfa$ga;I^<#@NfJM%TOH=9-^KSK5cSPV05VI4ffLN z=@=b2B_=d#T3}4*w7{vM(Wc^9Z0eY#MH$ear0|gE@(Y9)xK5mYD?i+~m|!1YAODv| z1`PN0@$)s2{pG(u(;wWwvh{@xZOR3LV>>{92A=%^_uCdGr$5pa++VCKxc@l-SXNj^ z@LaYJ0MBPwH}Kfd061o$pb@MqPVmHWj2Ap{|Ncr>uz)5;q@*oPO2bY5P8OI4oUn|> z0tAnq6OoyooEf)B8kUlplr?8+Nc;Ycj zgaSMTVjYG&)_>d%ZV#u%<>Q0RgLel149}Ojk-=AO*94!PVHGUBb2RuAJXhu23H|_{ zQLj7=4ubd7;mHPi{N()R$?f?aPhJRK59R#-^)Pra)PtWlpe~U~qF=+B zet8ZT9B12IaC8$~aICdh(+`)$`i|Qe4}f{Q2(S&{XJGOIz>EC!@(HhVUg&Qi{O(CP zeRu5IPEPdsB|QHwR6=kbjPSG3N?DaC=x6 z@i;pHU>V?XCKcW9;HSx-+2RZ&{JuADLj337KbC;Wb4a~nrVf&ZWX3H^NlUiE%Y8@| z-Fqatgh|HPib!hhFofp8I7f98Aop$liC90dy>}-E^uX>oHYG?7Xy&=4+`UMK3a@=TqxVRWqS64IW=FOYv?Af#RX!q{jE+_}hXXejGQ>RWvevF?Va&T}!w>xehYir0p zk&VPUFhiX#Hx79)sG;cz`ts%xJ_=u6T-tyqr@u;nheqXKpqU2R(m*@aHtuV0;_?mj zQ)6}Wq?#sbw1EyW&;*JJAZiJStbFkf%1wMpv|7Ze>$h6OeQ%35Z;SWi{>~!v98ZgU zSI_-6mUq0Z{NZUWuCt}(!J>`VsCqjaL9455n0$(j{F6Du-ekV6s*p<|2Hem<*9Thg zKQ&)vd&iqFzvE5b@n+o_m?2y1p&TK|bDufl2fG40vwZP&uR2HezE!+3fz3ksC6=>o zfgQ@TFR*)MP=Vbg$!*7H^6RcgokbS;V#|E7RleBzXug=AFBasBh52I9&U~>=zOc@C z@D}vX&!6p9(bkzxa;b6Aa<_wlqsNF)pkR!MNK}!B6IBY~7!j4IVkfFNWTJ{2D0okK zZrTq@Lx_PmL<(Y0!fRooN^~?)Ws|6~O;p(>s>JZ4U!to20hN8e*x}81E>#}wSR1uk zo3(1B8ghj?wqe!s*0-g90pq6$_zvkyCQ z;(5Em?qwWw8(gr`tYD>i!Agt6{pyU5KYs+ZoL-Vb%QtatHrb3-W{!34x5KZ_R#jH% zPcGZa+Tu-Z@eX8f@!l*u;&=>rxL8Y>*BK)Pwq$D3Os&-M6G2eMTw;w%p1(b^&Zu+X z5$#LTmlRI6o2SlDuT|%((Ff{t%CD5y)OE^dO6yt9B0JlBv7J~|OjGKeLuPheCKOXV z^R6cjpZtkD_r&#r!x4VpA37{ve=A1o{Uxd^Q*Y#2m|kwFLurs4-l)aSvFA)@>}w)CGUO}K0DYY>@p(E^5$PA){MSY>5p~=lz;gF zz=!y`-ohv1^cD-BH$vR)xFf|p;dzyr@VvS3yhX%$ftz@SFy3tR2izc=ovl0~V~F~= z{-XYtzCz!m=hWY*XnS&vu)0rNB?uzqKJhg{+#_GA@ULM7R9jK0Ni5<=LRR@B@lxfT z#nl-#ti{z-J|Go(!0G{eqWX9Z>qPZ>syT`EW%0-=ef3W@tW141<-CM)K`5n|%DGIm z8~0E-W;*u9`87@X4VA4i@7&Mf3I-yd`8VHFefi@_DnRG+uuI6z;cT4mY)ieYOjWK9 z&T-do56ySWemX%vOF!Dia+QT&C)xrzD2_yY3q_<|v)+v3*eF7WeT=c6&rfGcu8x{{y1^iVmu zx<6^~ahkXx=$Y5lXSt^qok|c(B6fFpUA%N%-X6Pg!l(~7+~6o@CQXbBX+K*bzvWZL z&S2FCE|M&jY?ADj9CtkGWJcW@d4gn*^Z1OgXJ*T&MY3k|*ZnspDl!s6cxbTy({6xt&I_^xIW>UBAs$g)O^;jI-KH zrk=oTmS%1nNO>JdYg)U(t#~E#2D6Vj(=qc9H)iEm3fJq!Z>bAhBa*AoX9d0^=2l$Z z5ncXvg|__b@|?RBo#iJ8ZbPeZe%uL&%&j&{tw-E3L`9dMzVyaQf(j@+rTIc*J%Tmv z1R>jxhF@L^$nAyKr!ZDLo&!D)`Q=hjSnMI(2_ z;XNTMdUAWiD^*=~Up0zRye1gMd!iNVGR~u*z>I=S?br3YwEc8u%s1M7KWS+#S(y64 zyn>flHvRQ@p=MvOpK#a+K}t^J+eOEUKHr~|=2MAs9yP_j7qwa1vCn_AG}bZ@C3M}U zyU)Xdi{L0KRZnM5d~e0wADd#=xLo?7DfYmCVWRT*+pzRFcC6C)^v&%#l^LfOy;ND; z^m4;B!+iwt0DN z*S)9P!--?CqQkUaGExoYQLQ*VCuczy);;cR}q4h6&o<}Tqo@SD_}^a#pJnvNFoSMuNB@8h50%`3oD7JAI@ zAet_1$nsw*66-wNBq%^q{8p6YqI{|FP{CSBzC`e*=3|=&=fARvyeZL3J{L>dB?@iZ z=)3!W4xO|5K(QLF)c#!0)Q4$3WTo<7CI7szq!4kG{gs0!4g7A5a;j3TT&zUvlm*H|%1@MED<3NB zm4q7Es6Esp)hRWTcg|EVRPU)OM}q^0D7LEKojIVPiFtw~5FI0eFNOH{WAzPnsd{#L z>!S2Y{2l2HD831?;-4H%SElbNIa#tk`9=wo7yl)Szlq}8j#QOgSP+ilmjg-hx9Mf+ z4e69dtZ6hu1J|rPP$Np-B4o%d(tV`9c)?xKNr~67* z{XmCK%s>fcKA+l1p6I@v`pV+Vs6OJj&zN631JK zE9kUSKTA)KnJ<54Bq^;ta|jA0f}&T@E9`IOCK|fDhYH!g@=O#|VSg)`9TXGVDI__u z-&rOq!-8W%{f7#9v5}(f%B2&gOidUnG$Za#UvX*QIR1BbA1h-%EuI_acq)ZcbQQH@I(x@-&W`Ck z$e68gvA7l`ezVr5>AQq76!%5k7qd$im1w?MzVl$>=6e~-^CQwz^{e%YF8;0`uAFVAy z=yl)SMaK_Q)W`2jGCA*^a?A`>-zusoLQO>+U4PwR-B{f;U99dk9m>`1(jC?nmwcl; zQbOy<64b_cmW(QyRN~D~E6FL@S%MChT<2da`B%x4lCBbg-c^tM^r8J#4NmK4Wd{E z`Yu(|w6n4`mqV)LOj&(PN9St3qN|7#w)JYI@zt^Q7v*8v%Pd`(xn_OP{s^yw^4lE$ ze762s1YSPY@ypwX5X^QYecVvI9#$l6+mEo;al-JrpeS+pC-UfiQ&pntU5Wki`ta+j z@4c7yj~S4q+9RymEq0I`z97k^hO<8k;wg`?qzO_*b#tSH?aAZ)V)S|Z6v@_6+X-}S z8`Nt*@d#DhcuPJ*mg32FoI%Tp(Y9OWmxY;1ig6)I>i5kznASuWE8Ln{#K%b+JGtvdO7hEm4%3m zEk81x6q5gXEO-IdJ*IQIfqofoz$Bqn3!3RP*old5Y|uzyFE9>ebv86FFhdzEG7j#~ zESb;dz1&QvpoEsD8SyC93}wsFuu_mf!9l?9bk@383xy( z7Qi*6WiH5V9ST6BPD>a080apGQv?zFk;_iltT+cX4fU6;aN|y;Rt%)&;|Ig)o21s( z89ndIsF9=0;y@EOv`^xVbM)(vqs~?KuelHo5Ov1;LCpBf^O%?T~HWA8mjw49o4I5Y3l5%l#4;8yQyVn`1HuTx>dBi{jOD2!S-WeC3c~&>OM2CLpGI57x z<@{lzQ#lly@ET7Ns@I9&fa+#8QJGR?R%bl2`IXd>F2n(Hi^7*`PBdrZh_`Ha`3NSuqzknBbIDKDrx9!2giTiN`NEO$ zoK0a9*L>@-bKfIP@;1%*O`FanWCjxE_fc`znRsGS9#M=w*4}u-e8VH{yW8(RFwkII zxdwV1Y8i^i#|>W*`SNC%g-!Rgj?Q8_7H76t1|if*bT+|(UBIJBMd|l>hbr1QHBDh% z2HHC|g)$c)22Fw;+k40jP|r3+QZYhgK-c6X7_0lF@IuN7j!NxO0(C{XLqW|;M_tB{ zQs$zu!7?s|icLqeNFKVkg@h{l?t=AftG;+OtQ&<7THenFORjH%O+?uFguO}E9TVL} zo286mrnmU@FXIR9S5&r=1PR7%VW6ilXI0cJIM=ssH_(AYNvbx8N*0Yo=3~e@BT?Ff zcmMIJ|BDH8f|CLuH7SK!3R({w-a?Roz*lAFwhs&DLU#CI8@gf=;#h~-9R5aqoO9(Ls21Y>>~L^5N%=# zb#WXT_KSgzK(H(9pOnI)I+dIh_Fo-g{GDCshn3hT+f}x65gPK*?SRHkMsu2lMCgGx%%y6>W@M%eVA5D~3xK znz=Vtu`7cR4Fk&+Tr&2J@> z9v};QUo`yU1LO-g9sJw{bLvqL3cQ0RqY3pe4C<$77@F>gq9?-n&mXZk5?C~X>#3&& zeB{da=ZEoU@_QF;A3tg_C(1g2$$C1NK|M^?!_vB&Ne1;WSp;schsjS%$v!4;P=e=7 zt{UFQWXl{BWG;w;+nmjzqXgYNBC9{;QG&$?7Vw8We)_1TTaKTjey3hAYa5@nHyIm%MriHR1tBW7q>fIe+mg=yun{cjr_KhW z8EXn39YHui4y$Q`K@EZ9894M=PRwNmv$tFAV{;F3%Q}|eL!UIB`>uIp48$>(=lPe- ziMn|_9582+sxVikdnQzbF+EeEg6RpIFLugD*+JM0QL`3@&6C7u_>UVRT5T+6OUgP3 z7y!y+?Bj-aC|fw|k=hLBe09m0mfv>1)<4UhC`n)mGKn~nDzPz?Cg_Wk)Vqf~0PB#^QOr?NXce*AT%GnRet&k@x(e*Oz&HBJU2nH+v-yv&d2v zxm2C-WZ8WwD{z{OIM?lxtUMq%d&nI`-5*vg!||}xhAUJ}ta^HV9&f`uGJ-2)!(=F; zY!iL667YKh)}A9R${?HBCHUuX&^@ zr;^~fRJ8GYc`tG8uCOxd#iHM6rX4;Jbd>ve6EHYmocgAi!j-8{iBQ&K5!3Y>|Ps!Etz>+htcb_i5Tp zO}Eblm;0EMfF*&;J=i)=M|}_1v~9tV#t$Wr?^ICLBath?4t(73H(YK=bR<;^#lwM> z|ANbPkBOub2E6EUv3q>+whHbr4kU2G_t-8(Mp6Ptgigbu>3wt^FqWMP>JqSk1CS7e zuO8fqills@Rye?h+an?H{~WNH(T4$qDXDx-)(2%W)-)+y zc_E%;oGK7bbQ_E+SlCTtZ(nFu)-ed1w=0hz$bJahH?@lYI-HTIE>yM-5tFLN4csED zlPj$y9Ny!G>zjE4Ts_Iiq3jQ>hmsQqQ{(tNFEo>%V#BF#dd+@_WIO-xd;DRN^7eON zX(J{h1?_yE%t7WYL!I*tbP|Xl5HXoBx5j}t)l1<P ztEkva25l-<`y&Rk0-W@+^1g|cWhrP;Gra_*l``2P{=+WT;|8r4gsLqBq8>Mp@YM*5 zMMM+b+~XnG`KW; zt>rhiiTb85LpXoS=FO1MvTfY9;Mh>EWs%R^O z>k;6K%o#SxW^v%o7&Q2^Nv<>vAIUKI>#R8FFOv*qQ(@3l(q=l5g|b@cxKd_7d3&%F z!En3;v9nVn{kVa}<8*f%w>!OCVbVZDe1X~|Vbn-hwpx#369i`}is}(Y7 z&Y(%a$XJt-u#lp>y%8H2)y?t*lc@Cg=p(U>UXF}FibVz5RIUe0FXn+Z5sVaWZAyV5 z3#?B)nvGkCLe6n5^il-OVTVoaa;hxOhZe0#}PL`*7r6bWqKNT z(R6SFQ;-CI9<-o^W*8y=T{k`p334jh8fodpI%AK7dKCuKPe6LSQIg$4FG5D(3ipMD zq&cH-8Q`jyDNGB&GyVW65mb|jLsB#itID!&9feqHO+!T+5sGj#tQXnB{pnHfFwhf8 zCjPLh$0$s_f=+ds#D=A&!(uZ@?FF@-fCnZO+Wp6B9fKGs1&n5)`@nGry^Nuw(BAYm zP;}7phh6n}9tgzKz)v+zu#`}QfQ2z6hsB0Iu<+R7b&ddr_P6QJ*FX1xG<8ilbxHyk z#ULL94gj3R+Hk5FFnF@>#!OikPPs|DFWz-y#^#1o69F@-kH&j_IF$n!zdnr9hH&aE zU;_FumK(#VTEI-`!#o3w%mqR8+uPQYP2p4uU`F;~N;ij7`v4QzhxukpI8_dqp?#PO zuZL6Ct_Utm_11HIYdAFyFg|^lJ=?;mMSvODhuQi@IF%2WF@2bo+Hk4_F!=gjcTZEd zhf^(pd8rRGXGb{YOx)k@wL!6@*h9_ZRza zxhtGf0A{j@2L7RDh(Ew_#=tzQNdjwwPy9;hW>*t(0%(gS%QTB-w$R|k!caN`=3y1r z0Rc<1)I=19o}r$(C=F?nLA^jd8JY{blBE!23h~AM>@)tUsnuCqflzopjQlQfQ)q|2RAm5zBymxbgMdR{Fs#f@eRv+5Pt~H4}lu zWIR`p6e}BOAUuEyrUTF5#N***8nQ}kft5zjn_!UBD)8t@&p=h65$e8ugI{J?`Ho@2e;5^1hnCt&_=_20(E%)zTFn+JVRr-F3UjkTVM@WY$we)2M8~c=TcR0OoDLfX?>Nq(Z6B0fR&8P*bTVKywo? zU_(7LV{N8U^}oVw1&k2v@;ObeZ4BiH7zjgqN|gdl1Yn-Gbp>d$0fWDf?Bjd}u@L4BBSfW{8yfERiS{TdCJ=hASpn?@;rMY9z) zt+E00yzdtPll!Yu?p^b!w*k}LFK7^9Bg7*L)@6#z+3@55Z~=G#W&rp~DgJ5$-|)qo zY1RO+!DMRbx7&ns#~bKO;uahN)i!p7!7Aic@GGf!s|L<4QCtxyND{0g4RnS9W!j-E zJJ6)1$c~)*#*5|PeNVYGC^s4{{RQ)tXrLFM>^f(Z!ACL=c#&|_5hZa^oD~|zMJc}w zfx6PIz<%Z*bwP;4UfNXQTbrhxOt>G)#uqp7S_~%&pl?kEFaB~X^a_(cg$fx0ZVk3VgNKs& z-vm*agJCNaHbzYgGgGyu(SUL9-DHJLl80SQUB<3vSlZozBI+AZ1uip`EW83syE`Lc zLpKn1j|l;Vtq1P~znJhS{r4sXRDWOoBynK1(4g$jHK=Xha({W z2g};uZ7cuJ%P|xJqu+f5S_j~iBr4ZLjL1S-csKU{90!%#m1{YU}&)@Gm~#E7vF6~+Wc zQqGNZe;ei`oQlkfe9Vc>=cBvefVR2`0vqY;*2!={5(HQN@Lst3iZYUtSqfqdbjx%E z?%qEll6rrgrNGHvbVA|+J1F1p7aXt@^tTxVC*+aP((xEU;+vv@26|QQeZhOM>9D|F z)CoHcb6~H-T2h11dj>iY0@erf?1j@Ksn_=iZZ*=$F=+VfLW%T4ul~~Zfv(>f=%&jt z)XtK@5VUed<6WG#%$Pvkm>^xj70LGs8ED25!neUd8d4<$HHaCCQa#qY{MF$9AAWGP ANB{r; literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Drawing2.vsd b/DataAccessLayer/TestData/Files/DupFiles3/Drawing2.vsd new file mode 100644 index 0000000000000000000000000000000000000000..f1a9e28f5ee20e66679c58426a2e546725b4afd0 GIT binary patch literal 18432 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 ANB{r; literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Map1.mmap b/DataAccessLayer/TestData/Files/DupFiles3/Map1.mmap new file mode 100644 index 0000000000000000000000000000000000000000..14fb76e011cfed0d7a74af0668e882b7ed919e5e GIT binary patch literal 22963 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 RP+9;0E`X1di<1W;@IOeH=qUgI literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Map2.mmap b/DataAccessLayer/TestData/Files/DupFiles3/Map2.mmap new file mode 100644 index 0000000000000000000000000000000000000000..14fb76e011cfed0d7a74af0668e882b7ed919e5e GIT binary patch literal 22963 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 RP+9;0E`X1di<1W;@IOeH=qUgI literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/MoreDefects.TXT b/DataAccessLayer/TestData/Files/DupFiles3/MoreDefects.TXT new file mode 100644 index 0000000..b9bbe1c --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles3/MoreDefects.TXT @@ -0,0 +1,5 @@ + + + +[ButtonHook] +- When W32Window get's a message and ::IsWindow(::GetParent(hWnd)) is false Close down everything!!! diff --git a/DataAccessLayer/TestData/Files/DupFiles3/New Mindmap1.mm b/DataAccessLayer/TestData/Files/DupFiles3/New Mindmap1.mm new file mode 100644 index 0000000..e88a40f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles3/New Mindmap1.mm @@ -0,0 +1,4 @@ + + + + diff --git a/DataAccessLayer/TestData/Files/DupFiles3/New Mindmap2.mm b/DataAccessLayer/TestData/Files/DupFiles3/New Mindmap2.mm new file mode 100644 index 0000000..e88a40f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles3/New Mindmap2.mm @@ -0,0 +1,4 @@ + + + + diff --git a/DataAccessLayer/TestData/Files/DupFiles3/OogyKeepInMind.txt b/DataAccessLayer/TestData/Files/DupFiles3/OogyKeepInMind.txt new file mode 100644 index 0000000..1e3616f --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles3/OogyKeepInMind.txt @@ -0,0 +1,27 @@ +[ShellExecuteLauncher.cs] +------------------------- +Right now ShellExecuteLauncher iterates thru all top level windows +until it finds the name of the file in the title bar. + +comments: +-to avoid collisions with duplicate file names (hold a map of + previous window handles), so if the file name is in the title and + it is not already mapped it's the new window. + +-maybe invoke bh or resolvers to do the work and skip title search + all together. + +Workspace launching (more testing to do with new resolver events) +~but one possibility could be: +------------------------- +launcher calls BH -> AboutToLaunchWorkspace(), button hook disables +all newly created buttons and listens for WM_CREATE and parentNotify_WM_CREATES... +... in order... that is our in order handle table. + +launcher calls BH -> LaunchDone(artifacts), we use the artifacts in order +in our table and launcher gets the list of handles. + +~this would work if launcher accurately launches in order and all windows +are created in order. ~launcher should wait till resolve event occurs? +~before launching next??? +-------------------------------------------- diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Presentation1.ppt b/DataAccessLayer/TestData/Files/DupFiles3/Presentation1.ppt new file mode 100644 index 0000000000000000000000000000000000000000..61d4880eb8be158cbef6f6804a06146ad5eb85de GIT binary patch literal 101376 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Presentation2.ppt b/DataAccessLayer/TestData/Files/DupFiles3/Presentation2.ppt new file mode 100644 index 0000000000000000000000000000000000000000..ce7f00638051e19fe98cdac28682dd5b7c7e19e7 GIT binary patch literal 101376 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

    Pq#cQHb5LowIJUVao=9$?)g1I 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 O)io){M1r#Q2jlR?X^+#Rg_9 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 T#0s<#r|&HVc){b}fWUtNx-PpW literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Publication1.pub b/DataAccessLayer/TestData/Files/DupFiles3/Publication1.pub new file mode 100644 index 0000000000000000000000000000000000000000..215aa5beb5b9d8a4067077521207caf7f60488d3 GIT binary patch literal 67584 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/Publication2.pub b/DataAccessLayer/TestData/Files/DupFiles3/Publication2.pub new file mode 100644 index 0000000000000000000000000000000000000000..a0dda952087eed0998aabb46c187c093058793c4 GIT binary patch literal 200704 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/doris2.docx b/DataAccessLayer/TestData/Files/DupFiles3/doris2.docx new file mode 100644 index 0000000000000000000000000000000000000000..124e9b56976a88638fc9691cfe6a957bb90094d0 GIT binary patch literal 11092 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 Bf`0%2 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles3/textfile1.txt b/DataAccessLayer/TestData/Files/DupFiles3/textfile1.txt new file mode 100644 index 0000000..de850da --- /dev/null +++ b/DataAccessLayer/TestData/Files/DupFiles3/textfile1.txt @@ -0,0 +1,11 @@ +WM_ENTERIDLE fuSource:MSGF_DIALOGBOX hwnd:001b11dc +WN_SETTEXT lpsz:000BEF18("SHELLY TO DO.txt - Notepad") + +[Open dialog sends the following things] +WM_COMMAND wNotifyCode:BN_CLICKED wID:IDOK hwndCtrl:004F092E +WM_NOTIFY idCtrl:1148 pnmh:000BEB30 +WM_NOTIFY idCtrl:1148 pnmh:000BEB6C + +[Tada!] +Use ::GetOpenFileName or ::GetSaveFileName passing pointer to a OPENFILENAME structure. + diff --git a/DataAccessLayer/TestData/Files/Snapshots/c9f487bd-7cef-4f45-8238-08a4be0a3ba3.png b/DataAccessLayer/TestData/Files/Snapshots/c9f487bd-7cef-4f45-8238-08a4be0a3ba3.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c917e3ec4c8defa1a07eded99be818249a5d19 GIT binary patch literal 121658 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
      ;Dt|NR%hOF3 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 + /// Static Constructor is responsible for setting up the locationpaths + /// + static TestData() + { + _TestDataDirFilesLocation = GetTestDataFilesDirectoryFromRunningAssembly(Assembly.GetExecutingAssembly().Location); + if (!String.IsNullOrEmpty(_TestDataDirFilesLocation)) + _TestDataDirFilesSnapshotLocation = _TestDataDirFilesLocation + "\\" + TEST_DATADIREFILESSNAPSHOT_NAME; + + // Now Load our File Name Map + LoadTestDataFilesIntoOurList(); + } + + /// + /// Private Data struct useful for our TestData Files + /// + private class TestDataFile + { + public string Name { get; set; } + public string File { get; set; } + public string Type { get; set; } + public TestDataFile(string Name, string File, string Type) + { + this.Name = Name; + this.File = File; + this.Type = Type; + } + } + + // Holds all our TestData Files + private static List _testDataFiles = new List(); + + // Get a new Random Number + private static int RandomNumber(int min, int max) + { + Random random = new Random(); + return random.Next(min, max); + } + + /// + /// Loads our TestFiles Into our Private Map + /// + private static void LoadTestDataFilesIntoOurList() + { + _testDataFiles.Add(new TestDataFile("Albin likes apples", "Albin likes apples.doc", "doc")); + _testDataFiles.Add(new TestDataFile("Book1", "Book1.xls", "xls")); + _testDataFiles.Add(new TestDataFile("Book1", "Book1.xlsx", "xlsx")); + _testDataFiles.Add(new TestDataFile("Book2", "Book2.xls", "xls")); + _testDataFiles.Add(new TestDataFile("Book2", "Book2.xlsx", "xlsx")); + _testDataFiles.Add(new TestDataFile("Book3", "Book3.xls", "xls")); + _testDataFiles.Add(new TestDataFile("Book3", "Book4.xls", "xls")); + _testDataFiles.Add(new TestDataFile("DatabaseBills", "DatabaseBills.accdb", "accdb")); + _testDataFiles.Add(new TestDataFile("DatabaseReceits", "DatabaseReceits.accdb", "accdb")); + _testDataFiles.Add(new TestDataFile("Doc1", "Doc1.rtf", "rtf")); + _testDataFiles.Add(new TestDataFile("Doc2", "Doc2.rtf", "rtf")); + + //// Artifacts used in ThreadProc13 *Begin* + _testDataFiles.Add(new TestDataFile("Document1", "Document1.docx", "docx")); + _testDataFiles.Add(new TestDataFile("Document2", "Document2.doc", "doc")); + _testDataFiles.Add(new TestDataFile("Document3", "Document3.docx", "docx")); + _testDataFiles.Add(new TestDataFile("Document4", "Document4.doc", "doc")); + _testDataFiles.Add(new TestDataFile("Document5", "Document5.docx", "docx")); + _testDataFiles.Add(new TestDataFile("Document6", "Document6.docx", "docx")); + _testDataFiles.Add(new TestDataFile("Document7", "Document7.docx", "docx")); + _testDataFiles.Add(new TestDataFile("Doris liks apples", "Doris likes apples.doc", "doc")); + _testDataFiles.Add(new TestDataFile("Doris", "Doris.docx", "docx")); + _testDataFiles.Add(new TestDataFile("Doris", "Doris.xlsx", "xlsx")); + _testDataFiles.Add(new TestDataFile("Doris2", "Doris2.docx", "docx")); + _testDataFiles.Add(new TestDataFile("Drawing1", "Drawing1.vsd", "vsd")); + _testDataFiles.Add(new TestDataFile("Drawing2", "Drawing2.vsd", "vsd")); + _testDataFiles.Add(new TestDataFile("Map1", "Map1.mmap", "mmap")); + _testDataFiles.Add(new TestDataFile("Map2", "Map2.mmap", "mmap")); + //// Artifacts used in ThreadProc13 *End* + + _testDataFiles.Add(new TestDataFile("MoreDefects", "MoreDefects.txt", "txt")); + _testDataFiles.Add(new TestDataFile("New Mindmap1", "New Mindmap1.mm", "mm")); + _testDataFiles.Add(new TestDataFile("New Mindmap2", "New Mindmap2.mm", "mm")); + _testDataFiles.Add(new TestDataFile("OogyKeepInMind", "OogyKeepInMind.txt", "txt")); + _testDataFiles.Add(new TestDataFile("Presentation1", "Presentation1.ppt", "ppt")); + _testDataFiles.Add(new TestDataFile("Presentation2", "Presentation2.ppt", "ppt")); + _testDataFiles.Add(new TestDataFile("Publication1", "Publication1.pub", "pub")); + _testDataFiles.Add(new TestDataFile("Publication2", "Publication2.pub", "pub")); + _testDataFiles.Add(new TestDataFile("textfile1", "textfile1.txt", "txt")); + + // Sort the List by File Type + _testDataFiles.Sort(delegate(TestDataFile t1, TestDataFile t2) { return t1.Type.CompareTo(t2.Type); }); + } + + /// + /// Fills Default Database with Test Data + /// + public static void FillDBWithTestData() + { + if (!String.IsNullOrEmpty(_TestDataDirFilesLocation) && !String.IsNullOrEmpty(_TestDataDirFilesSnapshotLocation)) + { + + #region File Type Workspaces + //// + // First Let's Create a workspace for each file Type + //// + string FileType = String.Empty; + string strWorkspaceName = String.Empty; + foreach (TestDataFile dataFile in _testDataFiles) + { + bool bFileTypeIsSet = false; + if (String.IsNullOrEmpty(FileType)) + { + FileType = dataFile.Type; + bFileTypeIsSet = true; + } + else if (FileType != dataFile.Type) + { + FileType = dataFile.Type; + bFileTypeIsSet = true; + } + + // Create New FileType Based Workspace + if (bFileTypeIsSet) + { + strWorkspaceName = "FileType Workspace for ." + FileType; + Debug.Assert(Data.Workspace.InsertWorkspaceName(strWorkspaceName)); + } + + // Add the Artifact to the corresponding Workspace + Debug.Assert(AddTestArtifactToWorkspace(dataFile.Name, dataFile.File, strWorkspaceName, 1)); + } + #endregion + + #region Simple Word and Excel + //// + // Let's create a Simple Word and Excel Workspace + //// + Debug.Assert(Data.Workspace.InsertWorkspaceName("Office Simple doc & xls")); + foreach (TestDataFile dataFile in _testDataFiles) + { + if (dataFile.Type == "doc" || + dataFile.Type == "xls") + { + // Add the Artifact to the corresponding Workspace + Debug.Assert(AddTestArtifactToWorkspace(dataFile.Name, dataFile.File, "Office Simple doc & xls", 1)); + } + } + #endregion + + #region Advanced Word and Excel + //// + // Let's create a Advanced Word and Excel Workspace + //// + Debug.Assert(Data.Workspace.InsertWorkspaceName("Office Advanced docx & xlsx")); + foreach (TestDataFile dataFile in _testDataFiles) + { + if (dataFile.Type == "docx" || + dataFile.Type == "xlsx") + { + // Add the Artifact to the corresponding Workspace + Debug.Assert(AddTestArtifactToWorkspace(dataFile.Name, dataFile.File, "Office Advanced docx & xlsx", 1)); + } + } + #endregion + + #region PowerPoint and Text Files + //// + // Let's create a Ppt and Txt files workspace for now + //// + Debug.Assert(Data.Workspace.InsertWorkspaceName("PowerPoint and Text Files")); + foreach (TestDataFile dataFile in _testDataFiles) + { + if (dataFile.Type == "ppt" || + dataFile.Type == "txt") + { + // Add the Artifact to the corresponding Workspace + Debug.Assert(AddTestArtifactToWorkspace(dataFile.Name, dataFile.File, "PowerPoint and Text Files", 1)); + } + } + #endregion + + #region ShuffleWorkspace1 - 7 Items + Debug.Assert(Data.Workspace.InsertWorkspaceName("ShuffleWorkspace1 - 7 Items")); + for (int i = 0; i < 7; ++i) + { + TestDataFile dataFile = _testDataFiles[RandomNumber(0, _testDataFiles.Count)]; + AddTestArtifactToWorkspace(dataFile.Name, dataFile.File, "ShuffleWorkspace1 - 7 Items", 1); + } + #endregion + + #region ShuffleWorkspace2 - 6 Items + Debug.Assert(Data.Workspace.InsertWorkspaceName("ShuffleWorkspace2 - 6 Items")); + for (int i = 0; i < 6; ++i) + { + TestDataFile dataFile = _testDataFiles[RandomNumber(0, _testDataFiles.Count)]; + AddTestArtifactToWorkspace(dataFile.Name, dataFile.File, "ShuffleWorkspace2 - 6 Items", 1); + } + #endregion + + #region ShuffleWorkspace3 - 5 Items + Debug.Assert(Data.Workspace.InsertWorkspaceName("ShuffleWorkspace3 - 5 Items")); + for (int i = 0; i < 5; ++i) + { + TestDataFile dataFile = _testDataFiles[RandomNumber(0, _testDataFiles.Count)]; + AddTestArtifactToWorkspace(dataFile.Name, dataFile.File, "ShuffleWorkspace3 - 5 Items", 1); + } + #endregion + + #region DuplicateWorkspace1 + int nNumberOfArtifacts1 = RandomNumber(3, 10); + string strDupWkspace1 = "DuplicateWorkspace1 - " + nNumberOfArtifacts1.ToString() + " Items"; + Debug.Assert(Data.Workspace.InsertWorkspaceName(strDupWkspace1)); + for (int i = 0; i < nNumberOfArtifacts1; ++i ) + { + int nDuplicates = RandomNumber(1, 3); + int nArtifact = RandomNumber(0, _testDataFiles.Count); + + // Add Duplicates + for (int j = 1; j <= nDuplicates; ++j) + AddTestArtifactToWorkspace(_testDataFiles[nArtifact].Name, _testDataFiles[nArtifact].File, strDupWkspace1 , j); + } + #endregion + + #region DuplicateWorkspace2 + int nNumberOfArtifacts2 = RandomNumber(3, 10); + string strDupWkspace2 = "DuplicateWorkspace2 - " + nNumberOfArtifacts2.ToString() + " Items"; + Debug.Assert(Data.Workspace.InsertWorkspaceName(strDupWkspace2)); + for (int i = 0; i < nNumberOfArtifacts2; ++i) + { + int nDuplicates = RandomNumber(1, 3); + int nArtifact = RandomNumber(0, _testDataFiles.Count); + + // Add Duplicates + for (int j = 1; j <= nDuplicates; ++j) + AddTestArtifactToWorkspace(_testDataFiles[nArtifact].Name, _testDataFiles[nArtifact].File, strDupWkspace2, j); + } + #endregion + + #region DuplicateWorkspace3 + int nNumberOfArtifacts3 = RandomNumber(3, 10); + string strDupWkspace3 = "DuplicateWorkspace3 - " + nNumberOfArtifacts3.ToString() + " Items"; + Debug.Assert(Data.Workspace.InsertWorkspaceName(strDupWkspace3)); + for (int i = 0; i < nNumberOfArtifacts3; ++i) + { + int nDuplicates = RandomNumber(1, 3); + int nArtifact = RandomNumber(0, _testDataFiles.Count); + + // Add Duplicates + for (int j = 1; j <= nDuplicates; ++j) + AddTestArtifactToWorkspace(_testDataFiles[nArtifact].Name, _testDataFiles[nArtifact].File, strDupWkspace3, j); + } + #endregion + } + } + + /// + /// Quick Helper Function to add Test Artifacts to a Workspace + /// + /// Name of the artifact you would like to give + /// name of the file such as File1.jpg + /// name of workspace to add to + /// pass in a number from 1 - 3 (i have 3 dup directories) + /// true, if successfully added, false otherwise + public static bool AddTestArtifactToWorkspace(string ArtifactName, string FileName, string WorkspaceName, int DupFileDirIndex) + { + if (!String.IsNullOrEmpty(_TestDataDirFilesLocation) && !String.IsNullOrEmpty(_TestDataDirFilesSnapshotLocation)) + { + ArtifactItem artifactItem = new ArtifactItem() + { + Name = ArtifactName, + Location = _TestDataDirFilesLocation + "\\" + TEST_DATADIRFILESDUPFILESDIR + DupFileDirIndex.ToString() + "\\" + FileName, + SnapshotFile = _TestDataDirFilesSnapshotLocation + "\\" + "c9f487bd-7cef-4f45-8238-08a4be0a3ba3.png", + Note = "", + WindowLeft = 100, + WindowTop = 100, + WindowHeight = 400, + WindowWidth = 400, + }; + + artifactItem.SetAsFileType(); + return Data.Artifacts.AddArtifactToWorkspace(WorkspaceName, artifactItem); + } + return false; + } + + /// + /// Iterate and find the TestData Directory in the executing path + /// + /// location of currently executing assembly + /// valid path string to test data or "" if not found + private static string GetTestDataFilesDirectoryFromRunningAssembly(string AssemblyLocation) + { + DirectoryInfo directory = new DirectoryInfo(Path.GetDirectoryName(AssemblyLocation)); + + //// + // Iterate the executing Assembly Directory upward to find the testData or Project Directory + //// + bool bFindTestData = false; + while (!bFindTestData && (directory != null) && directory.Exists) + { + + // First Check to see if this Directory has the ProjectName as a SubDir + DirectoryInfo[] dirProjectNameDirs = directory.GetDirectories(PROJECT_NAME, SearchOption.TopDirectoryOnly); + + if(dirProjectNameDirs.Length == 1) + { + // Check if there is a TestData Dir Underneath (return if there is) + DirectoryInfo[] dirTestDataDirs = dirProjectNameDirs[0].GetDirectories(TEST_DATADIR_NAME, SearchOption.TopDirectoryOnly); + + if(dirTestDataDirs.Length == 1) + { + // Now Check for the Files Directory + DirectoryInfo[] dirTestDataFilesDirs = dirTestDataDirs[0].GetDirectories(TEST_DATADIRFILES_NAME, SearchOption.TopDirectoryOnly); + + if (dirTestDataFilesDirs.Length == 1) + return dirTestDataFilesDirs[0].FullName; + } + } + + // Keep going up the chain + directory = directory.Parent; + } + return String.Empty; + } + } +} diff --git a/DataAccessLayer/Tests/StressTest.cs b/DataAccessLayer/Tests/StressTest.cs new file mode 100644 index 0000000..f653d05 --- /dev/null +++ b/DataAccessLayer/Tests/StressTest.cs @@ -0,0 +1,572 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; +using DataAccessLayer.TestData; +using System.Threading; +using System.IO; + +namespace DataAccessLayer.Tests +{ + /// + /// Use this class to do a ThreadStressTest on the DB + /// Launch this class via CommandLine app and Call RunStressTest() + /// + internal static class StressTest + { + const int THREAD_SLEEP_EACH_ITERATION = 5; + + /// + /// Thread1 - Test ArtifactGroup Reading + /// + static private void ThreadProc1() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread1 - Error : Workspacenames is wrong length"); + continue; + } + + foreach (string workspacename in workspacenames) + { + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacename, SortOrderForArtifacts.Ascending); + + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread1 - Error : ArtifactGroup is Empty"); + } + } + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread2 - Test ArtifactGroup Reading + /// + static private void ThreadProc2() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread2 - Error : Workspacenames is wrong length"); + continue; + } + + foreach (string workspacename in workspacenames) + { + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacename, SortOrderForArtifacts.Ascending); + + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread2 - Error : ArtifactGroup is Empty"); + } + } + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread3 - Test ArtifactGroup Reading + /// + static private void ThreadProc3() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread3 - Error : Workspacenames is wrong length"); + continue; + } + + foreach (string workspacename in workspacenames) + { + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacename, SortOrderForArtifacts.Ascending); + + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread3 - Error : ArtifactGroup is Empty"); + } + } + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread4 - Test ArtifactGroup Reading + /// + static private void ThreadProc4() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread4 - Error : Workspacenames is wrong length"); + continue; + } + + foreach (string workspacename in workspacenames) + { + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacename, SortOrderForArtifacts.Ascending); + + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread4 - Error : ArtifactGroup is Empty"); + } + } + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread5 - Test ArtifactGroup Reading + /// + static private void ThreadProc5() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread5 - Error : Workspacenames is wrong length"); + continue; + } + + foreach (string workspacename in workspacenames) + { + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacename, SortOrderForArtifacts.Ascending); + + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread5 - Error : ArtifactGroup is Empty"); + } + } + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread3 - Test ArtifactGroup Reading + /// + static private void ThreadProc6() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread6 - Error : Workspacenames is wrong length"); + continue; + } + + foreach (string workspacename in workspacenames) + { + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacename, SortOrderForArtifacts.Ascending); + + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread6 - Error : ArtifactGroup is Empty"); + } + } + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread7 - Test Artifact part of a Workspace + /// + static private void ThreadProc7() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread7 - Error : Workspacenames is wrong length"); + continue; + } + + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacenames[0], SortOrderForArtifacts.Ascending); + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread7 - Error : ArtifactGroup is Empty"); + } + else + { + foreach (ArtifactItem artifactItem in artifactItems) + { + if (!Data.Artifacts.IsArtifactPartOfWorkspace(workspacenames[0], artifactItem)) + Console.WriteLine("Thread7 - Error: Artifact / Workspace Validation Error"); + } + } + + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread8 - Test Artifact part of a Workspace + /// + static private void ThreadProc8() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread8 - Error : Workspacenames is wrong length"); + continue; + } + + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacenames[1], SortOrderForArtifacts.Ascending); + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread8 - Error : ArtifactGroup is Empty"); + } + else + { + foreach (ArtifactItem artifactItem in artifactItems) + { + if (!Data.Artifacts.IsArtifactPartOfWorkspace(workspacenames[1], artifactItem)) + Console.WriteLine("Thread8 - Error: Artifact / Workspace Validation Error"); + } + } + + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread9 - Test Artifact part of a Workspace + /// + static private void ThreadProc9() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread9 - Error : Workspacenames is wrong length"); + continue; + } + + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacenames[2], SortOrderForArtifacts.Ascending); + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread9 - Error : ArtifactGroup is Empty"); + } + else + { + foreach (ArtifactItem artifactItem in artifactItems) + { + if (!Data.Artifacts.IsArtifactPartOfWorkspace(workspacenames[2], artifactItem)) + Console.WriteLine("Thread9 - Error: Artifact / Workspace Validation Error"); + } + } + + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread10 - Test Artifact part of a Workspace + /// + static private void ThreadProc10() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread10 - Error : Workspacenames is wrong length"); + continue; + } + + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacenames[0], SortOrderForArtifacts.Ascending); + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread10 - Error : ArtifactGroup is Empty"); + } + else + { + foreach (ArtifactItem artifactItem in artifactItems) + { + if (!Data.Artifacts.IsArtifactPartOfWorkspace(workspacenames[0], artifactItem)) + Console.WriteLine("Thread10 - Error: Artifact / Workspace Validation Error"); + } + } + + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread11 - Test Artifact part of a Workspace + /// + static private void ThreadProc11() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread11 - Error : Workspacenames is wrong length"); + continue; + } + + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacenames[1], SortOrderForArtifacts.Ascending); + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread11 - Error : ArtifactGroup is Empty"); + } + else + { + foreach (ArtifactItem artifactItem in artifactItems) + { + if (!Data.Artifacts.IsArtifactPartOfWorkspace(workspacenames[1], artifactItem)) + Console.WriteLine("Thread11 - Error: Artifact / Workspace Validation Error"); + } + } + + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread12 - Test Artifact part of a Workspace + /// + static private void ThreadProc12() + { + while (true) + { + string[] workspacenames = Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending); + if (workspacenames.Length <= 1) + { + Console.WriteLine("Thread12 - Error : Workspacenames is wrong length"); + continue; + } + + ArtifactItem[] artifactItems = Data.Artifacts.GetAllArtifactsForWorkspace(workspacenames[2], SortOrderForArtifacts.Ascending); + if (DataTypeValidation.IsEmptyArtifactItemGroup(artifactItems)) + { + Console.WriteLine("Thread12 - Error : ArtifactGroup is Empty"); + } + else + { + foreach (ArtifactItem artifactItem in artifactItems) + { + if (!Data.Artifacts.IsArtifactPartOfWorkspace(workspacenames[2], artifactItem)) + Console.WriteLine("Thread12 - Error: Artifact / Workspace Validation Error"); + } + } + + Thread.Sleep(THREAD_SLEEP_EACH_ITERATION); + } + } + + /// + /// Thread13 - Create a Write Artifact Thread! (Let's see what happens) + /// + static private void ThreadProc13() + { + //while (true) + //{ + // bool bSuccess = false; + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Document1", "Document1.docx", "ProjectNotes"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Document2", "Document2.doc", "ProjectNotes"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Document3", "Document3.docx", "Office"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Document4", "Document4.doc", "Presentations"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Document5", "Document5.docx", "Presentations"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Document6", "Document6.docx", "Presentations"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Document7", "Document7.docx", "Office"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Doris", "Doris.xlsx", "ProjectNotes"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Doris2", "Doris2.docx", "ProjectNotes"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Doris liks apples", "Doris likes apples.doc", "Office"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Drawing1", "Drawing1.vsd", "MyMindMaps"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Drawing2", "Drawing2.vsd", "MyMindMaps"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Map1", "Map1.mmap", "MyMindMaps"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + + // bSuccess = TestData.TestData.AddTestArtifactToWorkspace("Map2", "Map2.mmap", "MyMindMaps"); + // if (!bSuccess) + // Console.WriteLine("Thread13 - Error: Adding Artifact Failed!"); + + // Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + //} + } + + /// + /// Thread14 - Create another Write Artifact Thread! (Let's see what happens) + /// + static private void ThreadProc14() + { + while (true) + { + foreach (string workspacename in Data.Workspace.GetAllWorkspaceNames(SortOrderForWorkspaces.Ascending)) + { + ArtifactItem[] artifacts = Data.Artifacts.GetAllArtifactsForWorkspace(workspacename, SortOrderForArtifacts.Ascending); + + if (!DataTypeValidation.IsEmptyArtifactItemGroup(artifacts)) + { + foreach (ArtifactItem artifact in artifacts) + { + artifact.WindowHeight = 678; + if (!Data.Artifacts.ModifyExistingArtifactProperties(artifact, workspacename)) + { + Console.WriteLine("Thread14 - Error: ModifyExistingArtifactProperties Failed"); + } + } + } + else + { + Console.WriteLine("Thread14 - Error: artifactsgroup is empty"); + } + } + + Thread.Sleep((20 * THREAD_SLEEP_EACH_ITERATION)); + } + } + + /// + /// Entry Point for running all the thread tests + /// + static public void RunStressTest() + { + Console.WriteLine("TestDataAccessLayer"); + Thread thread1 = new Thread(new ThreadStart(StressTest.ThreadProc1)); + Thread thread2 = new Thread(new ThreadStart(StressTest.ThreadProc2)); + Thread thread3 = new Thread(new ThreadStart(StressTest.ThreadProc3)); + Thread thread4 = new Thread(new ThreadStart(StressTest.ThreadProc4)); + Thread thread5 = new Thread(new ThreadStart(StressTest.ThreadProc5)); + Thread thread6 = new Thread(new ThreadStart(StressTest.ThreadProc6)); + Thread thread7 = new Thread(new ThreadStart(StressTest.ThreadProc7)); + Thread thread8 = new Thread(new ThreadStart(StressTest.ThreadProc8)); + Thread thread9 = new Thread(new ThreadStart(StressTest.ThreadProc9)); + Thread thread10 = new Thread(new ThreadStart(StressTest.ThreadProc10)); + Thread thread11 = new Thread(new ThreadStart(StressTest.ThreadProc11)); + Thread thread12 = new Thread(new ThreadStart(StressTest.ThreadProc12)); + Thread thread13 = new Thread(new ThreadStart(StressTest.ThreadProc13)); + Thread thread14 = new Thread(new ThreadStart(StressTest.ThreadProc14)); + Console.WriteLine("Threads Created"); + + //// + // Start All the Threads + //// + thread1.Start(); + thread2.Start(); + thread3.Start(); + thread4.Start(); + thread5.Start(); + thread6.Start(); + thread7.Start(); + thread8.Start(); + thread9.Start(); + thread10.Start(); + thread11.Start(); + thread12.Start(); + thread13.Start(); + thread14.Start(); + + Console.WriteLine("Threads Started...."); + + Console.WriteLine("To Quit Press the 'Q' Key and then Enter"); + while (true) + { + string str = Console.ReadLine(); + if (str == "Q" || str == "q") + { + break; + } + System.Threading.Thread.Sleep(100); + } + + Console.WriteLine("Stopping Threads...."); + thread1.Abort(); + thread2.Abort(); + thread3.Abort(); + thread4.Abort(); + thread5.Abort(); + thread6.Abort(); + thread7.Abort(); + thread8.Abort(); + thread9.Abort(); + thread10.Abort(); + thread11.Abort(); + thread12.Abort(); + thread13.Abort(); + thread14.Abort(); + } + } +} diff --git a/DataAccessLayer/app.config b/DataAccessLayer/app.config new file mode 100644 index 0000000..a515812 --- /dev/null +++ b/DataAccessLayer/app.config @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/DataAccessLayer/dArtifacts.cs b/DataAccessLayer/dArtifacts.cs new file mode 100644 index 0000000..3c5f27d --- /dev/null +++ b/DataAccessLayer/dArtifacts.cs @@ -0,0 +1,874 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; +using System.Data.SqlServerCe; +using System.IO; +using Foo.DataAccessLayer.DataTypes; + +namespace Foo.DataAccessLayer +{ + public class dArtifacts + { + /// + /// Checks to see if this artifact is already in the system. The Location is the UniqueID + /// so no other artifact may exist that has the exact same location + /// + /// Artifact To Check (Location Needed Only) + /// true if found, false otherwise + public bool DoesArtifactExistInSystem(ArtifactItem artifactItem) + { + // Check Artifact Integrity + if ((artifactItem == null) || + !artifactItem.IsLocationValid) + return false; + + object obj = null; + lock (this) + { + string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + } + return (obj != null); + } + + /// + /// Searches all Artifact's Names & Notes for the specified SearchQuery using SQL's Like stmt + /// + /// string to use in 'Like' (Must be less than 75 Characters) + /// Specify Sort Order + /// returns ArtifactItem[] of all found artifacts + public ArtifactItem[] SearchArtifactsInTheSystem(string SearchQuery, SortOrderForArtifacts SortOrder) + { + if (!String.IsNullOrEmpty(SearchQuery) && (SearchQuery.Length <= 75)) + { + lock (this) + { + DataSet dataset = SearchArtifactsInTheSystemIntoDataSet(SearchQuery, SortOrder); + if (!DataTypeValidation.IsEmptyDataSet(dataset)) + { + int nRows = dataset.Tables[0].Rows.Count; + ArtifactItem[] resultArtifacts = new ArtifactItem[nRows]; + + for (int i = 0; i < nRows; ++i) + { + DataRow datarow = dataset.Tables[0].Rows[i]; + resultArtifacts[i] = new ArtifactItem(); + + // Add Artifact Fields + resultArtifacts[i].Name = datarow["Name"].ToString(); + resultArtifacts[i].SetType(datarow["Type"].ToString()); + resultArtifacts[i].Location = datarow["Location"].ToString(); + resultArtifacts[i].Note = datarow["Note"].ToString(); + resultArtifacts[i].SnapshotFile = datarow["SnapShotFile"].ToString(); + + if (!String.IsNullOrEmpty(datarow["LastAccessed"].ToString())) + resultArtifacts[i].SetLastAccessed(DateTime.Parse(datarow["LastAccessed"].ToString())); + + if (!String.IsNullOrEmpty(datarow["AccessCounter"].ToString())) + resultArtifacts[i].AccessCounter = int.Parse(datarow["AccessCounter"].ToString()); + } + return resultArtifacts; + } + } + } + + // return Blank Item + return DataTypeHelpers.EmptyArtifactItemGroup(); + } + + /// + /// Searches all Artifact's Names & Notes for the specified SearchQuery using SQL's Like stmt + /// + /// string to use in 'Like' (Must be less than 75 Characters) + /// Specify Sort Order + /// returns DataSet of all found artifacts + public DataSet SearchArtifactsInTheSystemIntoDataSet(string SearchQuery, SortOrderForArtifacts SortOrder) + { + if (!String.IsNullOrEmpty(SearchQuery) && (SearchQuery.Length <= 75)) + { + lock (this) + { + string sql = "SELECT [Name],[Type],[Location],[Note],[SnapShotFile],[LastAccessed],[AccessCounter] FROM Artifacts"; + sql = sql + String.Format(" WHERE [Name] LIKE '%{0}%' OR [Note] LIKE '%{0}%' OR [Location] LIKE '%{0}%'", SearchQuery); + sql = SortOrderSQLHelpers.SortOrderForArtifactsHelper(sql, SortOrder); + DataSet dataset = DB.RunSQLTextFillDataSet(sql); + return dataset; + } + } + return new DataSet(); // empty dataset + } + + /// + /// Returns an ArtifactItem[] of all Artifacts in the System (WorkspaceLinkProperties won't be filled in) + /// + /// Specify Sort Order + /// returns ArtifactItem[] of all artifacts + public ArtifactItem[] GetAllArtifactsInTheSystem(SortOrderForArtifacts SortOrder) + { + lock (this) + { + DataSet dataset = GetAllArtifactsInTheSystemIntoDataSet(SortOrder); + if (!DataTypeValidation.IsEmptyDataSet(dataset)) + { + int nRows = dataset.Tables[0].Rows.Count; + ArtifactItem[] resultArtifacts = new ArtifactItem[nRows]; + + for (int i = 0; i < nRows; ++i) + { + DataRow datarow = dataset.Tables[0].Rows[i]; + resultArtifacts[i] = new ArtifactItem(); + + // Add Artifact Fields + resultArtifacts[i].Name = datarow["Name"].ToString(); + resultArtifacts[i].Type = (ArtifactTypes) Enum.Parse(typeof(ArtifactTypes), datarow["Type"].ToString(), true); + resultArtifacts[i].Location = datarow["Location"].ToString(); + resultArtifacts[i].Note = datarow["Note"].ToString(); + resultArtifacts[i].SnapshotFile = datarow["SnapShotFile"].ToString(); + + if (!String.IsNullOrEmpty(datarow["LastAccessed"].ToString())) + resultArtifacts[i].SetLastAccessed(DateTime.Parse(datarow["LastAccessed"].ToString())); + + if (!String.IsNullOrEmpty(datarow["AccessCounter"].ToString())) + resultArtifacts[i].AccessCounter = int.Parse(datarow["AccessCounter"].ToString()); + } + return resultArtifacts; + } + } + + // return Blank Item + return DataTypeHelpers.EmptyArtifactItemGroup(); + } + + /// + /// Returns a DataSet of All Artifacts in the System (WorkspaceLinkProperties won't be filled in) + /// + /// Specify Sort Order + /// returns DataSet of all artifacts + public DataSet GetAllArtifactsInTheSystemIntoDataSet(SortOrderForArtifacts SortOrder) + { + lock (this) + { + string sql = "SELECT [Name],[Type],[Location],[Note],[SnapShotFile],[LastAccessed],[AccessCounter] FROM Artifacts"; + sql = SortOrderSQLHelpers.SortOrderForArtifactsHelper(sql, SortOrder); + DataSet dataset = DB.RunSQLTextFillDataSet(sql); + return dataset; + } + } + + /// + /// Increments the access counter and sets LastAccessed for the + /// specified artifact. Call this whenever you have launched an Artifact. + /// + /// Artifact To Check (Location Needed Only) + /// true if successful set the internal counters, false otherwise + public bool ArtifactWasLaunched(ArtifactItem artifactItem) + { + // Check Artifact Validity + if ((artifactItem == null) || + !artifactItem.IsLocationValid) + return false; + + lock (this) + { + // existence check + if (!DoesArtifactExistInSystem(artifactItem)) + return false; + + // First Step - is to get the AccessCounter already in the db + string sql = "SELECT [AccessCounter] FROM Artifacts WHERE [Location]=@location"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + + int accesscount = 1; + object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + if (obj != null) + { + accesscount = int.Parse(obj.ToString()); + accesscount = accesscount + 1; // increment by 1 + } + + // Second Step - is to set the access counter and today's date for the artifact + string sql2 = "UPDATE Artifacts SET [LastAccessed]=@lastaccessed,[AccessCounter]=@accesscounter WHERE [Location]=@location"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@lastaccessed", DateTime.Now), + new SqlCeParameter("@accesscounter", accesscount), + new SqlCeParameter("@location", artifactItem.Location), + }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + return (nResult == 1); + } + } + + /// + /// Check to see if the artifact is part of the workspace + /// + /// WorskpaceName to check the Artifact against + /// Artifact To Check (Location Needed Only) + /// true, if part of the specified workspace, false otherwise + public bool IsArtifactPartOfWorkspace(string WorkspaceName, ArtifactItem artifactItem) + { + // Check Artifact & Workspace Validity + if ((artifactItem == null) || + !artifactItem.IsLocationValid || + !DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return false; + + object obj = null; + lock (this) + { + // Check to make sure that this is a valid WorkspaceName + if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) + return false; + + // First Step - Get the UID of the Artifact to look up in the Links table + string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + + if (obj != null) + { + int uid = int.Parse(obj.ToString()); + + // Second Step - Lookup if there is any item in the Links table that matches the uid and workspace name + string sql2 = "SELECT [UID] FROM WorkspaceLinks WHERE [AID] = @aid AND [WorkspaceName] = @workspacename"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@aid", uid), + new SqlCeParameter("@workspacename", WorkspaceName), + }; + + obj = DB.RunSQLCommandTextExecuteScalar(sql2, sqlparams2); + return (obj != null); + } + } + return false; + } + + /// + /// Uses The workspace stored in the State Table and determines if the Artifact is part of that Workspace + /// + /// Artifact To Check (Location Needed Only) + /// true, if part of the current workspace in the state table, false otherwise + public bool IsArtifactPartOfCurrentWorkspaceState(ArtifactItem artifactItem) + { + // Check validity of the Artifact + if ((artifactItem == null) || + !artifactItem.IsLocationValid) + return false; + + lock(this) + { + string CurrentWorkspace = Data.State.GetCurrentWorkspaceName(); + if (!String.IsNullOrEmpty(CurrentWorkspace)) + { + return IsArtifactPartOfWorkspace(CurrentWorkspace, artifactItem); + } + } + return false; + } + + /// + /// Use this when you have an Artifact that doesn't have any WorkspaceLink Properties and you + /// want to fill the Artifact's WorkspaceLink properties with the first artifact that matches the + /// specified workspace sort order + /// + /// artifactItem without WorkspaceLink Properties (Location Needed Only) + /// SortOrder of workspace to use when filling the first found artifact that matches + /// an artifact item with workspaceLink properties filled out if successfull + public ArtifactItem GetWorkspaceLinkPropertiesForArtifact(ArtifactItem artifactItem, SortOrderForWorkspaces sortOrder) + { + // ensure artifact integrity + if ((artifactItem == null) || + !(artifactItem.IsLocationValid)) + return artifactItem; // nothing filled out + + lock (this) + { + // First Step - Get the UID of the artifact + string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + + if (obj != null) + { + int aid = int.Parse(obj.ToString()); + + // Second Step - is to get the WorkspaceLink that matches the artifact by the sort order + string sql2 = "SELECT [WorkspaceLinks].[WindowTop], [WorkspaceLinks].[WindowLeft],[WorkspaceLinks].[WindowHeight], [WorkspaceLinks].[WindowWidth]"; + sql2 = sql2 + " FROM [WorkspaceLinks] , [Workspaces] WHERE [WorkspaceLinks].[WorkspaceName] = [Workspaces].[Name] AND [WorkspaceLinks].[AID]=@aid"; + + // Add WorkspacesSortOrder + sql2 = SortOrderSQLHelpers.SortOrderForWorkspacesHelper(sql2, sortOrder); + + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@aid", aid) }; + + DataSet dataset = DB.RunSQLTextFillDataSet(sql2, sqlparams2); + if (!DataTypeValidation.IsEmptyDataSet(dataset)) + { + // Just get the first item + DataRow datarow = dataset.Tables[0].Rows[0]; + + // Clone the original artifact + ArtifactItem resultArtifact = (ArtifactItem) artifactItem.Clone(); + + // Add Artifact Fields + resultArtifact.WindowTop = int.Parse(datarow["WindowTop"].ToString()); + resultArtifact.WindowLeft = int.Parse(datarow["WindowLeft"].ToString()); + resultArtifact.WindowHeight = int.Parse(datarow["WindowHeight"].ToString()); + resultArtifact.WindowWidth = int.Parse(datarow["WindowWidth"].ToString()); + return resultArtifact; + } + } + } + + // nothing filled out + return artifactItem; + } + + /// + /// Retrieve all Artifacts associated with the specified Workspace (uses links table to determine which artifacts) + /// + /// The WorkspaceName for which to get all Artifacts + /// Specify Sort Order + /// Group of Artifact Items, Could be Empty, use DataTypeValidator to check for Empty ArtifactGroup + public ArtifactItem[] GetAllArtifactsForWorkspace(string WorkspaceName, SortOrderForArtifacts SortBy) + { + // Ensure Workspace Name Integrity + if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return DataTypeHelpers.EmptyArtifactItemGroup(); // return Blank Item + + lock (this) + { + // Check to make sure that this is a valid WorkspaceName (in DB) + if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) + return DataTypeHelpers.EmptyArtifactItemGroup(); // return Blank Item + + // First Step - Use a Join to get all the matching artifacts + string sql = "SELECT [Artifacts].[Name], [Artifacts].[Type], [Artifacts].[Location], [Artifacts].[Note], [Artifacts].[SnapShotFile], [Artifacts].[LastAccessed], [Artifacts].[AccessCounter], [WorkspaceLinks].[WindowTop], "; + sql = sql + "[WorkspaceLinks].[WindowLeft], [WorkspaceLinks].[WindowHeight], [WorkspaceLinks].[WindowWidth], [WorkspaceLinks].[WorkspaceName] "; + sql = sql + "FROM [WorkspaceLinks] , [Artifacts] "; + sql = sql + "WHERE [WorkspaceLinks].[AID] = [Artifacts].[UID] AND [WorkspaceLinks].[WorkspaceName] = @workspacename "; + + // Add ArtifactsSortOrder + sql = SortOrderSQLHelpers.SortOrderForArtifactsHelper(sql, SortBy); + + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; + + DataSet dataset = DB.RunSQLTextFillDataSet(sql, sqlparams); + if (!DataTypeValidation.IsEmptyDataSet(dataset)) + { + int nRows = dataset.Tables[0].Rows.Count; + ArtifactItem[] resultArtifacts = new ArtifactItem[nRows]; + + for (int i = 0; i < nRows; ++i) + { + DataRow datarow = dataset.Tables[0].Rows[i]; + resultArtifacts[i] = new ArtifactItem(); + + // Add Artifact Fields + resultArtifacts[i].Name = datarow["Name"].ToString(); + resultArtifacts[i].Type = (ArtifactTypes)Enum.Parse(typeof(ArtifactTypes), datarow["Type"].ToString(), true); + resultArtifacts[i].Location = datarow["Location"].ToString(); + resultArtifacts[i].Note = datarow["Note"].ToString(); + resultArtifacts[i].SnapshotFile = datarow["SnapShotFile"].ToString(); + + if(!String.IsNullOrEmpty(datarow["LastAccessed"].ToString())) + resultArtifacts[i].SetLastAccessed(DateTime.Parse(datarow["LastAccessed"].ToString())); + + if (!String.IsNullOrEmpty(datarow["AccessCounter"].ToString())) + resultArtifacts[i].AccessCounter = int.Parse(datarow["AccessCounter"].ToString()); + + resultArtifacts[i].WindowTop = int.Parse(datarow["WindowTop"].ToString()); + resultArtifacts[i].WindowLeft = int.Parse(datarow["WindowLeft"].ToString()); + resultArtifacts[i].WindowHeight = int.Parse(datarow["WindowHeight"].ToString()); + resultArtifacts[i].WindowWidth = int.Parse(datarow["WindowWidth"].ToString()); + } + return resultArtifacts; + } + + } + + // return Blank Item + return DataTypeHelpers.EmptyArtifactItemGroup(); + } + + /// + /// Get's the artifact link count for the passed in workspace + /// + /// The WorkspaceName for which to get all Artifact Links + /// 0 or positive number for the number of records, -1 if error occurs + public int GetArtifactLinkCountForWorkspace(string WorkspaceName) + { + // Ensure Workspace Name Integrity + if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return -1; // return error + + lock (this) + { + // Check to make sure that this is a valid WorkspaceName (in DB) + if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) + return -1; // return Blank Item + + // First Step - Get the count of all artifacts for this workspace + string sql = "SELECT COUNT([WorkspaceLinks].[AID]) FROM [WorkspaceLinks] WHERE [WorkspaceLinks].[WorkspaceName] = @workspacename"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; + + object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + if (obj != null) + { + int i = int.Parse(obj.ToString()); + return i; + } + } + return -1; // return error + } + + /// + /// Get's the unique artifact link count for the passed in workspace (this means only artifact links + /// that are unique to this workspace) + /// + /// The WorkspaceName for which to get all unique Artifact Links + /// 0 or positive number for the number of records, -1 if error occurs + public int GetUniqureArtifactsCountForWorkspace(string WorkspaceName) + { + // Ensure Workspace Name Integrity + if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return -1; // return Blank Item + + lock (this) + { + // Check to make sure that this is a valid WorkspaceName (in DB) + if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) + return -1; // return Blank Item + + // First Step - We need all the links that are part of the workspace in the links table + string sql2 = "SELECT [AID] FROM WorkspaceLinks WHERE [WorkspaceName]=@workspacename"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; + + DataSet dataset = DB.RunSQLTextFillDataSet(sql2, sqlparams2); + List workspaceLinksListAIDs = new List(); + + if (!DataTypeValidation.IsEmptyDataSet(dataset)) + { + foreach (DataRow row in dataset.Tables[0].Rows) + workspaceLinksListAIDs.Add(int.Parse(row[0].ToString())); + } + + // Second Step - We now should check which AIDs are not referenced anywhere else, those AIDS are + // counted as being unique to this workspace + string sql4 = "SELECT [UID] FROM WorkspaceLinks WHERE [AID]=@aid AND [WorkspaceName]<>@workspacename"; + List workspaceLinksListAIDsWithoutReferences = new List(); + + foreach (int aid in workspaceLinksListAIDs) + { + SqlCeParameter[] sqlparams4 = new SqlCeParameter[] { new SqlCeParameter("@aid", aid), new SqlCeParameter("@workspacename", WorkspaceName) }; + object obj = DB.RunSQLCommandTextExecuteScalar(sql4, sqlparams4); + + if (obj == null) // this aid has no references + workspaceLinksListAIDsWithoutReferences.Add(aid); + } + + return workspaceLinksListAIDsWithoutReferences.Count; + } + } + + /// + /// Adds an Artifact to a Workspace (shouldn't already be in that workspace) + /// If the artifact already exists and the only thing being done is that the artifact is + /// being added to a new workspace (a link will be created) + /// + /// WorkspaceName to insert Artifact into + /// the Artifact to Add (Must be complete - pass All Validations) + /// true if successful, false otherwise + public bool AddArtifactToWorkspace(string WorkspaceName, ArtifactItem artifactItem) + { + // ensure artifact and workspace integrity + if ((artifactItem == null) || + !(artifactItem.IsValid) || + !(artifactItem.IsLocationValid) || + !(artifactItem.IsValidFileIntegrity) || + !(artifactItem.AreWorkspaceLinkPropertiesValid) || + !DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return false; + + lock (this) + { + // Check to make sure that this is a valid WorkspaceName + if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) + return false; + + //// + // Do a little more Integrity Checking, to know where we are at + //// + bool bExists = DoesArtifactExistInSystem(artifactItem); + bool bAlreadyInWorkspace = false; + + if(bExists) + bAlreadyInWorkspace = IsArtifactPartOfWorkspace(WorkspaceName, artifactItem); + + // If we already have it in this workspace, just modify the + // Artifact's Properties & Workspace Properties + if (bAlreadyInWorkspace) + return ModifyExistingArtifactProperties(artifactItem, WorkspaceName); // * also modify workspacelink properties * + + // if it exists, but is not part of this workspace, then we should create a link for the artifact and + // update any of the artifact's properties + if (bExists && !bAlreadyInWorkspace) + { + // First Step - Get the UID of the artifact + string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + + if (obj != null) + { + int aid = int.Parse(obj.ToString()); + int uid = 0; + + // Second Step - Is to get the Max UID for the Links table to Insert to + string sql2 = "SELECT MAX (UID) FROM WorkspaceLinks"; + object obj2 = DB.RunSQLCommandTextExecuteScalar(sql2); + + if (obj2 != null) + { + uid = int.Parse(obj2.ToString()); + uid = uid + 1; // incr. by one + } + + // Third Step - Create a new Entry for this workspace in the Links Table + string sql3 = "INSERT INTO WorkspaceLinks ([UID],[AID],[WorkspaceName],[WindowTop],[WindowLeft],[WindowHeight],[WindowWidth])"; + sql3 = sql3 + " VALUES (@uid,@aid,@workspacename,@windowtop,@windowleft,@windowheight,@windowwidth)"; + SqlCeParameter[] sqlparams3 = new SqlCeParameter[] + { + new SqlCeParameter("@uid", uid), + new SqlCeParameter("@aid", aid), + new SqlCeParameter("@workspacename", WorkspaceName), + new SqlCeParameter("@windowtop", artifactItem.WindowTop), + new SqlCeParameter("@windowleft", artifactItem.WindowLeft), + new SqlCeParameter("@windowheight", artifactItem.WindowHeight), + new SqlCeParameter("@windowwidth", artifactItem.WindowWidth), + }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql3, sqlparams3); + if (nResult != 1) + return false; + + // Now we can just Modify the Artifact's Properties, in case they changed + return ModifyExistingArtifactProperties(artifactItem); // no need to modify workspace properties here - only modify artifact + } + } + else + { + + // First Step - Is to get the Max UID for the Artifact table to Insert to + int uid = 0; + string sql = "SELECT MAX (UID) FROM Artifacts"; + object obj = DB.RunSQLCommandTextExecuteScalar(sql); + + if (obj != null) + { + uid = int.Parse(obj.ToString()); + uid = uid + 1; // incr. by one + } + + // Second Step - Is to Actually Insert the new Artifact into the Artifact Table + string sql3 = "INSERT INTO Artifacts ([UID],[Name],[Type],[Location],[Note],[SnapShotFile],[LastAccessed],[AccessCounter]) "; + sql3 = sql3 + "VALUES (@uid,@name,@type,@location,@note,@snapshotfile,@accessed,@counter)"; + SqlCeParameter[] sqlparams3 = new SqlCeParameter[] + { + new SqlCeParameter("@uid", uid), + new SqlCeParameter("@name", artifactItem.Name), + new SqlCeParameter("@type", artifactItem.Type.ToString()), + new SqlCeParameter("@location", artifactItem.Location), + new SqlCeParameter("@note", artifactItem.Note), + new SqlCeParameter("@snapshotfile", artifactItem.SnapshotFile), + new SqlCeParameter("@accessed", DateTime.Now), + new SqlCeParameter("@counter", "0"), + }; + + int nResult = 0; + nResult = DB.RunSQLCommandTextExecuteNonQuery(sql3, sqlparams3); + if (nResult != 1) + return false; + + // Third Step - Get the highest UID for the Link table + int aid = uid; // save the uid of the artifact as the aid + uid = 0; + string sql4 = "SELECT MAX (UID) FROM WorkspaceLinks"; + object obj4 = DB.RunSQLCommandTextExecuteScalar(sql4); + + if (obj != null) + { + uid = int.Parse(obj4.ToString()); + uid = uid + 1; // incr. by one + } + + // Fourth Step - Is to Now Insert the Link to the Workspace into the Links Table + string sql5 = "INSERT INTO WorkspaceLinks ([UID],[AID],[WorkspaceName],[WindowTop],[WindowLeft],[WindowHeight],[WindowWidth]) VALUES (@uid,@aid,@workspacename,@windowtop,@windowleft,@windowheight,@windowwidth)"; + SqlCeParameter[] sqlparams5 = new SqlCeParameter[] + { + new SqlCeParameter("@uid", uid), + new SqlCeParameter("@aid", aid), + new SqlCeParameter("@workspacename", WorkspaceName), + new SqlCeParameter("@windowtop", artifactItem.WindowTop), + new SqlCeParameter("@windowleft", artifactItem.WindowLeft), + new SqlCeParameter("@windowheight", artifactItem.WindowHeight), + new SqlCeParameter("@windowwidth", artifactItem.WindowWidth), + }; + + nResult = DB.RunSQLCommandTextExecuteNonQuery(sql5, sqlparams5); + if (nResult != 1) + return false; + else + return true; + } + } + return false; + } + + /// + /// Deletes Artifact from the workspace (if no more references exists), + /// will delete the artifact entirely (in best scenario only a link will be deleted) + /// + /// WorkspaceName to Delete Artifact From + /// Artifact To Delete (Location Needed Only) + /// true if successful, false otherwise + public bool DeleteArtifact(string WorkspaceName, ArtifactItem artifactItem) + { + // ensure artifact and workspace integrity + if ((artifactItem == null) || + !(artifactItem.IsLocationValid) || + !DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return false; + + lock (this) + { + // Check to make sure that this is a valid Artifact + if (!DoesArtifactExistInSystem(artifactItem)) + return false; + + // Check to make sure that this is a valid WorkspaceName + if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) + return false; + + // First Step - Is to get the UID of the Artifact + string sql1 = "SELECT [UID] FROM Artifacts WHERE [Location]=@location"; + SqlCeParameter[] sqlparams1 = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + + object obj = DB.RunSQLCommandTextExecuteScalar(sql1, sqlparams1); + if (obj != null) + { + int uid = int.Parse(obj.ToString()); + + // Second Step - Is to Delete the Link in the Link Table + string sql2 = "DELETE FROM WorkspaceLinks WHERE [WorkspaceName]=@workspacename AND [AID]=@aid"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@workspacename", WorkspaceName) , + new SqlCeParameter("@aid", uid) + }; + + // We hope there at least one link in the links table (but we don't verify) + DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + + // Third Step - Next is to see if there are any other Links Left with this AID + string sql3 = "SELECT [UID] FROM WorkspaceLinks WHERE [AID]=@aid"; + SqlCeParameter[] sqlparams3 = new SqlCeParameter[] { new SqlCeParameter("@aid", uid) }; + + object obj3 = DB.RunSQLCommandTextExecuteScalar(sql3, sqlparams3); + if (obj3 == null) + { + // Fourth Step - Only if there are no other more links, Delete the Actually Artifact from the + // Artifact Table + string sql4 = "DELETE From Artifacts WHERE [UID]=@uid"; + SqlCeParameter[] sqlparams4 = new SqlCeParameter[] { new SqlCeParameter("@uid", uid) }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql4, sqlparams4); + if (nResult != 1) + return false; + else + return true; + } + } + } + return false; + } + + /// + /// Forces Deletion of the Artifact and all Links / References in the System + /// + /// Artifact To Delete (Location Needed Only) + /// true if successful, false otherwise + public bool DeleteArtifact(ArtifactItem artifactItem) + { + // ensure artifact integrity + if ((artifactItem == null) || + !(artifactItem.IsLocationValid)) + return false; + + lock (this) + { + + // Check to make sure that this is a valid Artifact + if (!DoesArtifactExistInSystem(artifactItem)) + return false; + + // First Step - Is to get the UID of the Artifact + string sql1 = "SELECT [UID] FROM Artifacts WHERE [Location]=@location"; + SqlCeParameter[] sqlparams1 = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + + object obj = DB.RunSQLCommandTextExecuteScalar(sql1, sqlparams1); + if (obj != null) + { + int uid = int.Parse(obj.ToString()); + + // Second Step - Is to Delete all the Links refering to the Artifact in the Links Table + string sql2 = "DELETE FROM WorkspaceLinks WHERE [AID]=@aid"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@aid", uid) }; + + DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + + // Third Step - Delete the Artifact from the Artifact Table + string sql3 = "DELETE From Artifacts WHERE [UID]=@uid"; + SqlCeParameter[] sqlparams3 = new SqlCeParameter[] { new SqlCeParameter("@uid", uid) }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql3, sqlparams3); + if (nResult != 1) + return false; + else + return true; + } + } + return false; + } + + /// + /// Modify Properties of an Artifact. Artifact's Location is the Unique Key, + /// it must already exist in the system for this update to work. + /// (this will only update Artifact Properties Not WorkspaceLink Properties) + /// + /// the Artifact to Modify (Must be complete - pass All Validations) + /// true if successful, false otherwise + public bool ModifyExistingArtifactProperties(ArtifactItem artifactItem) + { + // ensure artifact integrity + if ((artifactItem == null) || + !(artifactItem.IsValid) || + !(artifactItem.IsLocationValid) || + !(artifactItem.IsValidFileIntegrity)) + return false; + + object obj = null; + lock (this) + { + // ensure existence + if (!DoesArtifactExistInSystem(artifactItem)) + return false; + + // First Step - Get the UID of the Artifact so that we can update it + string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + + if (obj != null) + { + int uid = int.Parse(obj.ToString()); + + // Second Step - Is to Create the Update Statement to update the Artifact + string sql2 = "UPDATE Artifacts SET [Name]=@name,[Type]=@type,[Location]=@location,[Note]=@note,[SnapShotFile]=@snapshotfile, [LastAccessed]=@accessed, [AccessCounter]=@counter "; + sql2 = sql2 + "WHERE [UID]=@uid"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@uid", uid), + new SqlCeParameter("@name", artifactItem.Name), + new SqlCeParameter("@type", artifactItem.Type.ToString()), + new SqlCeParameter("@location", artifactItem.Location), + new SqlCeParameter("@note", artifactItem.Note), + new SqlCeParameter("@snapshotfile", artifactItem.SnapshotFile), + new SqlCeParameter("@accessed", artifactItem.LastAccessed), + new SqlCeParameter("@counter", artifactItem.AccessCounter), + }; + + int nResult = 0; + nResult = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + + if (nResult != 1) + return false; + else + return true; + } + } + return false; + } + + /// + /// Modify Properties of an Artifact and the properties of a workspaceLink. + /// Artifact's Location is the Unique Key, it must already exist in the system. + /// + /// the Artifact to Modify (Must be complete - pass All Validations) + /// the workspaceName whose Link properties to modify + /// true if successful, false otherwise + public bool ModifyExistingArtifactProperties(ArtifactItem artifactItem, string WorkspaceName) + { + // ensure artifact and workspace integrity + if ((artifactItem == null) || + !(artifactItem.IsValid) || + !(artifactItem.IsLocationValid) || + !(artifactItem.IsValidFileIntegrity) || + !(artifactItem.AreWorkspaceLinkPropertiesValid) || + !DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return false; + + lock (this) + { + // First Step - modify the Artifact's Properties *if fails, return* + if (!ModifyExistingArtifactProperties(artifactItem)) + return false; + + // Now Check Validity of the Workspace Properties before continuing + if (!artifactItem.AreWorkspaceLinkPropertiesValid) + return false; + + // Ensure existence of WorkspaceName + if (!Data.Workspace.DoesWorkspaceNameExist(WorkspaceName)) + return false; + + // Second Step - get the AID for the Artifact + string sql = "SELECT [UID] FROM Artifacts WHERE [Location] = @location"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@location", artifactItem.Location) }; + object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + + if (obj != null) + { + int uid = int.Parse(obj.ToString()); + + // Third Step - Is to Update the Workspace Link Properties + string sql2 = "UPDATE WorkspaceLinks SET [WindowTop]=@windowtop,[WindowLeft]=@windowleft,[WindowHeight]=@windowheight,[WindowWidth]=@windowwidth "; + sql2 = sql2 + "WHERE [AID]=@uid AND [WorkspaceName] = @workspacename"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@windowtop", artifactItem.WindowTop), + new SqlCeParameter("@windowleft", artifactItem.WindowLeft), + new SqlCeParameter("@windowheight", artifactItem.WindowHeight), + new SqlCeParameter("@windowwidth", artifactItem.WindowWidth), + new SqlCeParameter("@uid", uid), + new SqlCeParameter("@workspacename", WorkspaceName), + }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + if (nResult != 1) + return false; + else + return true; + } + } + + return false; + } + + } +} diff --git a/DataAccessLayer/dState.cs b/DataAccessLayer/dState.cs new file mode 100644 index 0000000..c8465ad --- /dev/null +++ b/DataAccessLayer/dState.cs @@ -0,0 +1,139 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; +using System.Data.SqlServerCe; +using Foo.DataAccessLayer.DataTypes; + +namespace Foo.DataAccessLayer +{ + public class dState + { + private const string EMPTY_WORKSPACE_NAME_STATE = "____CURRENT__WORKSPACE____IS___SET_TO__NIL__"; + + /// + /// Get the Current WorkspaceName in the State Table + /// + /// the name of the current's state workspace + public string GetCurrentWorkspaceName() + { + object obj = null; + lock (this) + { + string sql = "SELECT [CurrentWorkspaceName] FROM State"; + obj = DB.RunSQLCommandTextExecuteScalar(sql); + } + + if (obj != null) + { + if (obj.ToString() == EMPTY_WORKSPACE_NAME_STATE) + return string.Empty; + else + return obj.ToString(); + } + else + return string.Empty; + } + + /// + /// Set the Current WorkspaceName in the State Table + /// + /// the name of the new workspace name (Can NOT be String.Empty!, use ClearCurrentWorkspaceName() instead) + /// true if successful, false otherwise + public bool SetCurrentWorkspaceName(string currentWorkspaceName) + { + if (!String.IsNullOrEmpty(currentWorkspaceName) && DataTypeValidation.IsValidWorkspaceName(currentWorkspaceName)) + { + lock (this) + { + // Existence Check + if ((currentWorkspaceName != EMPTY_WORKSPACE_NAME_STATE) && + !Data.Workspace.DoesWorkspaceNameExist(currentWorkspaceName)) + return false; + + string currentWorkspaceNameInDB = GetCurrentWorkspaceName(); + + // check if different + bool bIsDifferent = (currentWorkspaceNameInDB.ToLower() != currentWorkspaceName.ToLower()); + if (!bIsDifferent) + return false; + + bool bInsert = !IsInEmptyWorkspaceNameState() && String.IsNullOrEmpty(currentWorkspaceNameInDB); + if (bInsert) + { + string sql = "INSERT INTO State ([CurrentWorkspaceName]) VALUES (@workspacename)"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@workspacename", currentWorkspaceName) }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql, sqlparams); + if (nResult != 1) + return false; + else + return true; + } + else + { + string sql = "UPDATE State SET [CurrentWorkspaceName]=@newworkspacename WHERE [CurrentWorkspaceName]=@oldworkspacename"; + SqlCeParameter[] sqlparams; + + if (!IsInEmptyWorkspaceNameState()) + { + sqlparams = new SqlCeParameter[] + { + new SqlCeParameter("@oldworkspacename", currentWorkspaceNameInDB), + new SqlCeParameter("@newworkspacename", currentWorkspaceName), + }; + } + else + { + sqlparams = new SqlCeParameter[] + { + new SqlCeParameter("@oldworkspacename", EMPTY_WORKSPACE_NAME_STATE), + new SqlCeParameter("@newworkspacename", currentWorkspaceName), + }; + } + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql, sqlparams); + if (nResult != 1) + return false; + else + return true; + } + } + } + return false; + } + + /// + /// Mostly used internally for the Empty WorkspaceName State + /// + /// true if we are in this state, false otherwise + internal bool IsInEmptyWorkspaceNameState() + { + object obj = null; + lock (this) + { + string sql = "SELECT [CurrentWorkspaceName] FROM State"; + obj = DB.RunSQLCommandTextExecuteScalar(sql); + } + + if (obj != null) + { + if (obj.ToString() == EMPTY_WORKSPACE_NAME_STATE) + return true; + else + return false; + } + else + return false; + } + + /// + /// Clears the current workspace in the State Table + /// + public void ClearCurrentWorkspaceName() + { + SetCurrentWorkspaceName(EMPTY_WORKSPACE_NAME_STATE); + } + } +} diff --git a/DataAccessLayer/dUserSettings.cs b/DataAccessLayer/dUserSettings.cs new file mode 100644 index 0000000..cd66417 --- /dev/null +++ b/DataAccessLayer/dUserSettings.cs @@ -0,0 +1,183 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data.SqlServerCe; +using Foo.DataAccessLayer.DataTypes; + +namespace Foo.DataAccessLayer +{ + public enum UserSetting + { + ON_LAUNCH_CLOSEPREVIOUS_WORKSPACE, + } + + public class dUserSettings + { + /// + /// Quick Check if there is already a Setting Information available for this Table + /// + /// a Setting enum + /// true if the DB has setting information for this setting + internal bool DoesSettingHaveAnEntry(UserSetting setting) + { + object obj = null; + lock (this) + { + string sql = "SELECT [SettingName] FROM UserSettings WHERE [SettingName] = @settingname"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@settingname", setting.ToString()) }; + obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + } + return (obj != null); + } + + /// + /// Retrieve Setting Value for the Setting as a string + /// + /// a Setting enum + /// setting value string, or empty.string if not found + public string GetSettingValueStr(UserSetting setting) + { + object obj = null; + lock (this) + { + string sql = "SELECT [SettingValue] FROM UserSettings WHERE [SettingName] = @settingname"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@settingname", setting.ToString()) }; + + obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + if (obj != null) + return obj.ToString(); + } + return String.Empty; + } + + /// + /// Set a Setting Value for the Setting as a string + /// + /// a Setting enum + /// a string value to store for a setting + /// true if successfully inserted or updated, false otherwise + public bool SetSettingValueStr(UserSetting setting, string strSettingValue) + { + // Ensure Value Integrity + if (String.IsNullOrEmpty(strSettingValue)) + return false; + + lock (this) + { + // First Determine if we need to update or insert + bool bUpdate = DoesSettingHaveAnEntry(setting); + + if (!bUpdate) // we need to insert + { + string sql = "INSERT INTO UserSettings ([SettingName],[SettingValue]) VALUES (@settingname,@settingvalue)"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] + { + new SqlCeParameter("@settingname", setting.ToString()), + new SqlCeParameter("@settingvalue", strSettingValue), + }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql, sqlparams); + return (nResult == 1); + } + else // we need to update + { + string sql2 = "UPDATE UserSettings SET [SettingValue]=@settingvalue WHERE [SettingName]=@settingname"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@settingname", setting.ToString()), + new SqlCeParameter("@settingvalue", strSettingValue), + }; + + + int nResult2 = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + return (nResult2 == 1); + } + } + } + + #region Helper Getter/Setters + + public bool GetSettingValueBool(UserSetting setting) + { + try + { + string strValue = GetSettingValueStr(setting); + if(!String.IsNullOrEmpty(strValue)) + { + bool bRet = bool.Parse(strValue); + return bRet; + } + } + catch(Exception){ /* ignore */ } + return false; + } + + public int GetSettingValueInt(UserSetting setting) + { + try + { + string strValue = GetSettingValueStr(setting); + if (!String.IsNullOrEmpty(strValue)) + { + int bRet = int.Parse(strValue); + return bRet; + } + } + catch (Exception) { /* ignore */ } + return int.MinValue; + } + + public DateTime GetSettingValueDateTime(UserSetting setting) + { + try + { + string strValue = GetSettingValueStr(setting); + if (!String.IsNullOrEmpty(strValue)) + { + DateTime bRet = DateTime.Parse(strValue); + return bRet; + } + } + catch (Exception) { /* ignore */ } + return DateTime.MinValue; + } + + public double GetSettingValueDouble(UserSetting setting) + { + try + { + string strValue = GetSettingValueStr(setting); + if (!String.IsNullOrEmpty(strValue)) + { + double bRet = double.Parse(strValue); + return bRet; + } + } + catch (Exception) { /* ignore */ } + return double.MinValue; + } + + public bool SetSettingValueBool(UserSetting setting, bool settingValue) + { + return SetSettingValueStr(setting, settingValue.ToString()); + } + + public bool SetSettingValueInt(UserSetting setting, int settingValue) + { + return SetSettingValueStr(setting, settingValue.ToString()); + } + + public bool SetSettingValueDateTime(UserSetting setting, DateTime settingValue) + { + return SetSettingValueStr(setting, settingValue.ToString()); + } + + public bool SetSettingValueDouble(UserSetting setting, double settingValue) + { + return SetSettingValueStr(setting, settingValue.ToString()); + } + + #endregion + } +} diff --git a/DataAccessLayer/dVersioningTables.cs b/DataAccessLayer/dVersioningTables.cs new file mode 100644 index 0000000..0039fa8 --- /dev/null +++ b/DataAccessLayer/dVersioningTables.cs @@ -0,0 +1,108 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data.SqlServerCe; +using Foo.DataAccessLayer.DataTypes; + +namespace Foo.DataAccessLayer +{ + internal class dVersioningTables + { + + /// + /// Quick Check if there is Version Information available for this Table + /// + /// a table name to check + /// true if the DB has version information for this Table + internal bool DoesTableHaveVersionEntry(string TableName) + { + // Check TableName Integrity + if (!DataTypeValidation.IsValidTableName(TableName)) + return false; + + object obj = null; + lock (this) + { + string sql = "SELECT [TableName] FROM VersioningTables WHERE [TableName] = @tablename"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@tablename", TableName) }; + + obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + } + return (obj != null); + } + + /// + /// Retrieve the Version information for the specified Table + /// + /// a table name to check + /// version information string, or empty.string if not found + internal string GetVersionInformationForTable(string TableName) + { + // Check TableName Integrity + if (!DataTypeValidation.IsValidTableName(TableName)) + return String.Empty; + + object obj = null; + lock (this) + { + string sql = "SELECT [Version] FROM VersioningTables WHERE [TableName] = @tablename"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@tablename", TableName) }; + + obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + if (obj != null) + return obj.ToString(); + } + return String.Empty; + } + + /// + /// Use this most often to insert/update the version information of a table into the VersioningTables Table + /// + /// The table name for which to insert version information + /// the version information in the format of n.n.nnnn + /// true if successfully inserted or updated, false otherwise + internal bool AddUpdateVersionInformationForSpecifiedTable(string TableName, string VersionInformation) + { + // Check TableName Integrity + if (!DataTypeValidation.IsValidTableName(TableName)) + return false; + + // Check Version Integrity + if (!DataTypeValidation.IsValidVersionInformation(VersionInformation)) + return false; + + lock (this) + { + // First Determine if we need to update or insert + bool bUpdate = DoesTableHaveVersionEntry(TableName); + + if (!bUpdate) // we need to insert + { + string sql = "INSERT INTO VersioningTables ([TableName],[Version]) VALUES (@tablename,@version)"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] + { + new SqlCeParameter("@tablename", TableName), + new SqlCeParameter("@version", VersionInformation), + }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql, sqlparams); + return (nResult == 1); + } + else // we need to update + { + string sql2 = "UPDATE VersioningTables SET [Version]=@version WHERE [TableName]=@tablename"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@tablename", TableName), + new SqlCeParameter("@version", VersionInformation), + }; + + + int nResult2 = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + return (nResult2 == 1); + } + } + } + } +} diff --git a/DataAccessLayer/dWorkspace.cs b/DataAccessLayer/dWorkspace.cs new file mode 100644 index 0000000..e2a46f6 --- /dev/null +++ b/DataAccessLayer/dWorkspace.cs @@ -0,0 +1,341 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Data; +using System.Data.SqlServerCe; +using Foo.DataAccessLayer.DataTypes; + +namespace Foo.DataAccessLayer +{ + public class dWorkspace + { + + /// + /// Quick Check to see If the WorkspaceName already exists + /// + /// Name of Workspace + /// true if Name exists, false otherwise + public bool DoesWorkspaceNameExist(string WorkspaceName) + { + // Check WorkspaceName Integrity + if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return false; + + object obj = null; + lock (this) + { + string sql = "SELECT [Name] FROM Workspaces WHERE [Name] = @workspacename"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; + + obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + } + return (obj != null); + } + + /// + /// Retrieve a String list of all WorkspaceNames in the Database + /// + /// Specify the SortOrder of the List + /// a list of worspace names, or empty[] if none exist + public string[] GetAllWorkspaceNames(SortOrderForWorkspaces SortBy) + { + List resultList = new List(); + lock (this) + { + string sql = "SELECT [Name] FROM Workspaces"; + + // Add WorkspaceSortOrder + sql = SortOrderSQLHelpers.SortOrderForWorkspacesHelper(sql, SortBy); + + DataSet dataset = DB.RunSQLTextFillDataSet(sql); + if (!DataTypeValidation.IsEmptyDataSet(dataset)) + { + foreach (DataRow row in dataset.Tables[0].Rows) + resultList.Add(row[0].ToString()); + } + } + return resultList.ToArray(); + } + + /// + /// Retrieve a Workspace List of all Workspaces in the Database + /// + /// Specify the SortOrder of the List + /// a list of worspaces + public WorkspaceItem[] GetAllWorkspaces(SortOrderForWorkspaces SortBy) + { + List resultList = new List(); + lock (this) + { + string sql = "SELECT [Name],[LastAccessed],[AccessCounter] FROM Workspaces"; + + // Add WorkspaceSortOrder + sql = SortOrderSQLHelpers.SortOrderForWorkspacesHelper(sql, SortBy); + + DataSet dataset = DB.RunSQLTextFillDataSet(sql); + if (!DataTypeValidation.IsEmptyDataSet(dataset)) + { + int nRows = dataset.Tables[0].Rows.Count; + WorkspaceItem[] resultWorkspaces = new WorkspaceItem[nRows]; + + for (int i = 0; i < nRows; ++i) + { + DataRow datarow = dataset.Tables[0].Rows[i]; + resultWorkspaces[i] = new WorkspaceItem(); + + // Add Workspace Fields + resultWorkspaces[i].Name = datarow["Name"].ToString(); + + if (!String.IsNullOrEmpty(datarow["LastAccessed"].ToString())) + resultWorkspaces[i].SetLastAccessed(DateTime.Parse(datarow["LastAccessed"].ToString())); + + if (!String.IsNullOrEmpty(datarow["AccessCounter"].ToString())) + resultWorkspaces[i].AccessCounter = int.Parse(datarow["AccessCounter"].ToString()); + } + + return resultWorkspaces; + } + } + + // return Blank Item + return DataTypeHelpers.EmptyWorkspaceItemGroup(); + } + + /// + /// Use this to modify a workspace Item (allows you to modify a workspace's properties NOT the name) + /// + /// a workspaceItem whose properties you want to update (Must pass all validations) + /// true if succesfully updated, false otherwise + public bool ModifyWorkspaceItem(WorkspaceItem workspaceItem) + { + // Check WorkspaceName Integrity + if ((workspaceItem == null) || + !workspaceItem.IsValid) + return false; + + lock (this) + { + // existence check + if (!DoesWorkspaceNameExist(workspaceItem.Name)) + return false; + + // First Step - is to create the update statement to make the neccessary modifications + string sql2 = "UPDATE Workspaces SET [LastAccessed]=@lastaccessed,[AccessCounter]=@accesscounter WHERE [Name]=@workspacename"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@accesscounter", workspaceItem.AccessCounter), + new SqlCeParameter("@lastaccessed", workspaceItem.LastAccessed), + new SqlCeParameter("@workspacename", workspaceItem.Name), + }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + return (nResult == 1); + } + } + + /// + /// Increments the access counter and sets LastAccessed for the + /// specified workspace name. Call this whenever you have launched a workspace. + /// + /// an existing workspace Name + /// true if successful set the internal counters, false otherwise + public bool WorkspaceWasLaunched(string WorkspaceName) + { + // Check WorkspaceName Integrity + if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return false; + + lock (this) + { + // existence check + if (!DoesWorkspaceNameExist(WorkspaceName)) + return false; + + // First Step - is to get the AccessCounter already in the db + string sql = "SELECT [AccessCounter] FROM Workspaces WHERE [Name]=@workspacename"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; + + int accesscount = 1; + object obj = DB.RunSQLCommandTextExecuteScalar(sql, sqlparams); + if (obj != null) + { + accesscount = int.Parse(obj.ToString()); + accesscount = accesscount + 1; // increment by 1 + } + + // Second Step - is to set the access counter and today's date for the workspace + string sql2 = "UPDATE Workspaces SET [LastAccessed]=@lastaccessed,[AccessCounter]=@accesscounter WHERE [Name]=@workspacename"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@lastaccessed", DateTime.Now), + new SqlCeParameter("@accesscounter", accesscount), + new SqlCeParameter("@workspacename", WorkspaceName), + }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + return (nResult == 1); + } + } + + /// + /// Inserts a new WorspaceName into the Workspace Table (if it not already exists) + /// + /// new non-existing unique workspace Name + /// true if successful, false otherwise + public bool InsertWorkspaceName(string WorkspaceName) + { + // Check WorkspaceName Integrity + if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return false; + + int nResult = -1; + lock (this) + { + // ensure uniqueness + if (DoesWorkspaceNameExist(WorkspaceName)) + return false; + + string sql = "INSERT INTO Workspaces ([Name],[LastAccessed],[AccessCounter]) VALUES (@workspacename,@accessed,@count)"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] + { + new SqlCeParameter("@workspacename",WorkspaceName), + new SqlCeParameter("@accessed",DateTime.Now), + new SqlCeParameter("@count","0"), + }; + + nResult = DB.RunSQLCommandTextExecuteNonQuery(sql, sqlparams); + } + return (nResult == 1); + } + + /// + /// Renames a Workspace to a new Name. In order to do so, we must also rename + /// all possible links that exists, so this process is a two-step process + /// + /// + /// + /// true if successful, false otherwise + public bool RenameWorkspace(string OldWorkspaceName, string NewWorkspaceName) + { + // Check WorkspaceName Integrity + if (!DataTypeValidation.IsValidWorkspaceName(OldWorkspaceName) || + !DataTypeValidation.IsValidWorkspaceName(NewWorkspaceName)) + return false; + + lock (this) + { + // ensure existence + if (!DoesWorkspaceNameExist(OldWorkspaceName)) + return false; + + // First Step - update Workspace Table + string sql = "UPDATE Workspaces SET [Name]=@newworkspacename WHERE [Name]=@oldworkspacename"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] + { + new SqlCeParameter("@oldworkspacename", OldWorkspaceName), + new SqlCeParameter("@newworkspacename", NewWorkspaceName), + }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql, sqlparams); + if (nResult != 1) + return false; + + // Second Step - update Links Table (any links that point to this workspace) + string sql2 = "UPDATE WorkspaceLinks SET [WorkspaceName]=@newworkspacename WHERE [WorkspaceName]=@oldworkspacename"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] + { + new SqlCeParameter("@oldworkspacename", OldWorkspaceName), + new SqlCeParameter("@newworkspacename", NewWorkspaceName), + }; + + int nResult2 = DB.RunSQLCommandTextExecuteNonQuery(sql2, sqlparams2); + if (nResult2 >= 0) + return true; + else + return false; + } + } + + /// + /// Deletes a Workspace. In order to do so, we must also delete and links + /// that the Workspace has. When Deleting links and encountering a link to + /// an artifact that is not references anywhere, we should delete the artifact + /// as well. So this is a five-step process. + /// + /// an existing workspace name + /// true if successful, false otherwise + public bool DeleteWorkspace(string WorkspaceName) + { + // Check WorkspaceName Integrity + if (!DataTypeValidation.IsValidWorkspaceName(WorkspaceName)) + return false; + + lock (this) + { + // ensure existence + if (!DoesWorkspaceNameExist(WorkspaceName)) + return false; + + // First Step - delete WorkspaceName from Workspace Table + string sql = "DELETE FROM Workspaces WHERE [Name]=@workspacename"; + SqlCeParameter[] sqlparams = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; + + int nResult = DB.RunSQLCommandTextExecuteNonQuery(sql, sqlparams); + if (nResult != 1) + return false; + + // Second Step - We need all the links that are part of the workspace in the links table + string sql2 = "SELECT [AID] FROM WorkspaceLinks WHERE [WorkspaceName]=@workspacename"; + SqlCeParameter[] sqlparams2 = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; + + DataSet dataset = DB.RunSQLTextFillDataSet(sql2, sqlparams2); + List workspaceLinksListAIDs = new List(); + + if (!DataTypeValidation.IsEmptyDataSet(dataset)) + { + foreach (DataRow row in dataset.Tables[0].Rows) + workspaceLinksListAIDs.Add(int.Parse(row[0].ToString())); + } + + // Third Step - We now have all the AIDs to look later so we can now delete all the links for this + // workspace from the links table + string sql3 = "DELETE FROM WorkspaceLinks WHERE [WorkspaceName]=@workspacename"; + SqlCeParameter[] sqlparams3 = new SqlCeParameter[] { new SqlCeParameter("@workspacename", WorkspaceName) }; + + nResult = DB.RunSQLCommandTextExecuteNonQuery(sql3, sqlparams3); + if (nResult == -1) + return false; + + // Fourth Step - We now should check which AIDs are still referenced in the Link table, those that + // still have references, we keep, others we want to delete + string sql4 = "SELECT [UID] FROM WorkspaceLinks WHERE [AID]=@aid"; + List workspaceLinksListAIDsWithoutReferences = new List(); + + foreach (int aid in workspaceLinksListAIDs) + { + SqlCeParameter[] sqlparams4 = new SqlCeParameter[] { new SqlCeParameter("@aid", aid) }; + object obj = DB.RunSQLCommandTextExecuteScalar(sql4, sqlparams4); + + if (obj == null) // this aid has no references + workspaceLinksListAIDsWithoutReferences.Add(aid); + } + + // Fifth Step - Now we want to delete all artifacts in the artifact table that have no references + // Since we already deleted all links, and workspaces, we should just directly delete the dangling + // Artifacts here + string sql5 = "DELETE FROM Artifacts WHERE [UID]=@uid"; + foreach (int aid in workspaceLinksListAIDsWithoutReferences) + { + SqlCeParameter[] sqlparam5 = new SqlCeParameter[]{ new SqlCeParameter("@uid", aid) }; + nResult = DB.RunSQLCommandTextExecuteNonQuery(sql5, sqlparam5); + + if (nResult != 1) // we expect there to be an artifact to delete + return false; + } + } + return true; + } + + } +} diff --git a/DataAccessLayer/nUnitTests.cs b/DataAccessLayer/nUnitTests.cs new file mode 100644 index 0000000..44e6211 --- /dev/null +++ b/DataAccessLayer/nUnitTests.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using NUnit.Framework; + +using Foo.DataAccessLayer; +using DataAccessLayer.TestData; + +namespace Foo.DataAccessLayer +{ + [TestFixture] + public class nUnitTests + { + + [SetUp] + public void Setup() + { + } + + [TearDown] + public void TearDown() + { + } + + [Test] + public void RecreateDatabaseAndLoadWithDefaultTestData() + { + // First Delete the DB, if it exists + DB.DeleteDefaultDB(); + + // Now Fill the DB with the Test Data + TestData.FillDBWithTestData(); + } + } +} diff --git a/Deskband/BandObjectBase/Attributes.cs b/Deskband/BandObjectBase/Attributes.cs new file mode 100644 index 0000000..7031052 --- /dev/null +++ b/Deskband/BandObjectBase/Attributes.cs @@ -0,0 +1,37 @@ +using System; +using System.Runtime.InteropServices; +using System.Reflection; + +namespace Foo.Deskband.BandObject +{ + /// + /// Represents different styles of a band object. + /// + [Flags] + [Serializable] + public enum BandObjectStyle : uint + { + Vertical = 1, + Horizontal = 2, + ExplorerToolbar = 4, + TaskbarToolBar = 8 + } + + /// + /// Specifies Style of the band object, its Name(displayed in explorer menu) and HelpText(displayed in status bar when menu command selected). + /// + [AttributeUsage(AttributeTargets.Class)] + public class BandObjectAttribute : System.Attribute + { + public BandObjectAttribute(){} + + public BandObjectAttribute(string name, BandObjectStyle style) + { + Name = name; + Style = style; + } + public BandObjectStyle Style; + public string Name; + public string HelpText; + } +} \ No newline at end of file diff --git a/Deskband/BandObjectBase/BandObject.cs b/Deskband/BandObjectBase/BandObject.cs new file mode 100644 index 0000000..b96febe --- /dev/null +++ b/Deskband/BandObjectBase/BandObject.cs @@ -0,0 +1,476 @@ +using System; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using SHDocVw; +using System.Reflection; +using System.Diagnostics; +using System.Drawing; +using System.ComponentModel; +using Microsoft.Win32; + +using System.Runtime.InteropServices; + +[assembly: AssemblyVersion("1.0.0.0")] + +namespace Foo.Deskband.BandObject +{ + /// + /// Contains main desk band functionality + /// + /// + /// + public class BandObjectBase : UserControl, IObjectWithSite, IDeskBand, IDeskBand2, IDockingWindow, IOleWindow, IInputObject + { + [DllImport("user32.dll")] + public static extern Int32 GetWindowLong(IntPtr hwnd, int nIndex); + + [DllImport("user32.dll")] + public static extern Int32 SetWindowLong(IntPtr hwnd, int nIndex, Int32 dwNewLong); + + [DllImport("user32.dll")] + public static extern bool SetLayeredWindowAttributes(IntPtr hwnd, Int32 crKey, int bAlpha, uint dwFlags); + + public const int GWL_EXSTYLE = -20; + public const int LWA_COLORKEY = 0x00000001; + public const int WS_EX_LAYERED = 0x00080000; + + [StructLayout(LayoutKind.Sequential)] + struct COLORREF + { + public byte R; + public byte G; + public byte B; + } + + public BandObjectBase() + { + InitializeComponent(); + } + + private void InitializeComponent() + { + this.SuspendLayout(); + // + // BandObjectBase + // + this.BackColor = System.Drawing.Color.Black; + this.Margin = new System.Windows.Forms.Padding(0); + this.Name = "BandObjectBase"; + this.Size = new System.Drawing.Size(24, 24); + this.MinimumSize = new System.Drawing.Size(24, 24); + this.MaximumSize = new System.Drawing.Size(24, 24); + this.ResumeLayout(false); + this.HandleCreated += new System.EventHandler(Band_HandleCreated); + this.HandleDestroyed += new System.EventHandler(Band_HandleDestroyed); + } + + private void Band_HandleCreated(object sender, EventArgs e) + { + IntPtr hWnd = this.Handle; + SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); + SetLayeredWindowAttributes(hWnd, 0x00000000, 0, LWA_COLORKEY); + } + + private void Band_HandleDestroyed(object sender, EventArgs e) + { + + } + + #region IObjectWithSite + + public virtual void GetSite(ref Guid riid, out Object ppvSite) + { + ppvSite = BandObjectSite; + } + + public virtual void SetSite(Object pUnkSite) + { + if (BandObjectSite != null) + Marshal.ReleaseComObject(BandObjectSite); + + if (Explorer != null) + { + Marshal.ReleaseComObject(Explorer); + Explorer = null; + } + + BandObjectSite = (IInputObjectSite)pUnkSite; + if (BandObjectSite != null) + { + //pUnkSite is a pointer to object that implements IOleWindowSite or something similar + //we need to get access to the top level object - explorer itself + //to allows this explorer objects also implement IServiceProvider interface + //(don't mix it with System.IServiceProvider!) + //we get this interface and ask it to find WebBrowserApp + _IServiceProvider sp = BandObjectSite as _IServiceProvider; + Guid guid = ExplorerGUIDs.IID_IWebBrowserApp; + Guid riid = ExplorerGUIDs.IID_IUnknown; + + try + { + object w; + sp.QueryService( + ref guid, + ref riid, + out w); + + //once we have interface to the COM object we can create RCW from it + Explorer = (WebBrowserClass)Marshal.CreateWrapperOfType( + w as IWebBrowser, + typeof(WebBrowserClass) + ); + + OnExplorerAttached(EventArgs.Empty); + } + catch (COMException) + { + //we anticipate this exception in case our object instantiated + //as a Desk Band. There is no web browser service available. + } + } + } + + #endregion + + #region IDeskband + + public virtual void GetWindow(out System.IntPtr phwnd) + { + phwnd = Handle; + } + + public virtual void ContextSensitiveHelp(bool fEnterMode){} + + /// + /// Called by explorer when band object needs to be showed or hidden. + /// + /// + public virtual void ShowDW(bool fShow) + { + if (fShow) + Show(); + else + Hide(); + } + + /// + /// Called by explorer when window is about to close. + /// + public virtual void CloseDW(UInt32 dwReserved) + { + Dispose(true); + } + + /// + /// Not used. + /// + public virtual void ResizeBorderDW(IntPtr prcBorder, Object punkToolbarSite, bool fReserved) { } + + public virtual void GetBandInfo(UInt32 dwBandID, UInt32 dwViewMode, ref DESKBANDINFO dbi) + { + + if ((dbi.dwMask & DBIM.MINSIZE) != 0) + { + dbi.ptMinSize.X = MinSize.Width; + dbi.ptMinSize.Y = MinSize.Height; + } + + if ((dbi.dwMask & DBIM.MAXSIZE) != 0) + { + dbi.ptMaxSize.X = MaxSize.Width; + dbi.ptMaxSize.Y = MaxSize.Height; + } + + if ((dbi.dwMask & DBIM.INTEGRAL) != 0) + { + dbi.ptIntegral.X = IntegralSize.Width; + dbi.ptIntegral.Y = IntegralSize.Height; + } + + if ((dbi.dwMask & DBIM.ACTUAL) != 0) + { + dbi.ptActual.X = Size.Width; + dbi.ptActual.Y = Size.Height; + } + + if ((dbi.dwMask & DBIM.TITLE) != 0) + { + dbi.wszTitle = Title; + } + + //Use the default background color by removing this flag + dbi.dwMask &= ~DBIM.BKCOLOR; + + //COLORREF bkColor; + //bkColor.R = Color.Black.R; + //bkColor.G = Color.Black.G; + //bkColor.B = Color.Black.B; + //Color.to + //dbi.crBkgnd = Int32.MaxValue; + //dbi.crBkgnd = 0xDEDEDE; + + dbi.dwModeFlags = (DBIMF)DBIM.TITLE | (DBIMF)DBIM.ACTUAL | (DBIMF)DBIM.MAXSIZE | (DBIMF)DBIM.MINSIZE | (DBIMF)DBIM.INTEGRAL; + dbi.dwModeFlags = dbi.dwModeFlags | DBIMF.ALWAYSGRIPPER | DBIMF.VARIABLEHEIGHT | DBIMF.ADDTOFRONT; + } + + #endregion + + #region IDeskBand2 + + public void CanRenderComposited(ref bool pfCanRenderComposited) + { + pfCanRenderComposited = true; + } + + public void GetCompositionState(ref bool pfCompositionEnabled) + { + pfCompositionEnabled = _compositionEnabled; + } + + public void SetCompositionState(bool fCompositionEnabled) + { + _compositionEnabled = fCompositionEnabled; + } + + #endregion + + #region IInputObject + + /// + /// Called explorer when focus has to be chenged. + /// + public virtual void UIActivateIO(Int32 fActivate, ref MSG Msg) + { + if( fActivate != 0 ) + { + Control ctrl = GetNextControl(this,true);//first + if( ModifierKeys == Keys.Shift ) + ctrl = GetNextControl(ctrl,false );//last + + if( ctrl != null ) ctrl.Select(); + this.Focus(); + } + } + + public virtual Int32 HasFocusIO() + { + return this.ContainsFocus ? 0 : 1; //S_OK : S_FALSE; + } + + /// + /// Called by explorer to process keyboard events. Undersatands Tab and F6. + /// + /// + /// S_OK if message was processed, S_FALSE otherwise. + public virtual Int32 TranslateAcceleratorIO(ref MSG msg) + { + if( msg.message == 0x100 )//WM_KEYDOWN + if( msg.wParam == (uint)Keys.Tab || msg.wParam == (uint)Keys.F6 )//keys used by explorer to navigate from control to control + if( SelectNextControl( + ActiveControl, + ModifierKeys == Keys.Shift ? false : true, + true, + true, + false ) + ) + return 0;//S_OK + + return 1;//S_FALSE + } + + #endregion + + #region EventHandlers + + /// + /// Override this method to handle ExplorerAttached event. + /// + /// + protected virtual void OnExplorerAttached(EventArgs ea) + { + if ( ExplorerAttached != null ) + ExplorerAttached(this, ea); + } + + /// + /// Notifies explorer of focus change. + /// + protected override void OnGotFocus(System.EventArgs e) + { + base.OnGotFocus(e); + BandObjectSite.OnFocusChangeIS(this as IInputObject, 1); + } + /// + /// Notifies explorer of focus change. + /// + protected override void OnLostFocus(System.EventArgs e) + { + base.OnLostFocus(e); + if( ActiveControl == null ) + BandObjectSite.OnFocusChangeIS(this as IInputObject, 0); + } + + #endregion + + #region COM_Bookkeeping + + /// + /// Called when derived class is registered as a COM server. + /// + [ComRegisterFunctionAttribute] + public static void Register(Type t) + { + string guid = t.GUID.ToString("B"); + + RegistryKey rkClass = Registry.ClassesRoot.CreateSubKey(@"CLSID\"+guid ); + RegistryKey rkCat = rkClass.CreateSubKey("Implemented Categories"); + + BandObjectAttribute[] boa = (BandObjectAttribute[])t.GetCustomAttributes( + typeof(BandObjectAttribute), + false ); + + string name = t.Name; + string help = t.Name; + BandObjectStyle style = 0; + if( boa.Length == 1 ) + { + if( boa[0].Name != null ) + name = boa[0].Name; + + if( boa[0].HelpText != null ) + help = boa[0].HelpText; + + style = boa[0].Style; + } + + rkClass.SetValue(null, name ); + rkClass.SetValue("MenuText", name ); + rkClass.SetValue("HelpText", help ); + + if( 0 != (style & BandObjectStyle.Vertical) ) + rkCat.CreateSubKey("{00021493-0000-0000-C000-000000000046}"); + + if( 0 != (style & BandObjectStyle.Horizontal) ) + rkCat.CreateSubKey("{00021494-0000-0000-C000-000000000046}"); + + if( 0 != (style & BandObjectStyle.TaskbarToolBar) ) + rkCat.CreateSubKey("{00021492-0000-0000-C000-000000000046}"); + + if( 0 != (style & BandObjectStyle.ExplorerToolbar) ) + Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Toolbar").SetValue(guid,name); + + } + + /// + /// Called when derived class is unregistered as a COM server. + /// + [ComUnregisterFunctionAttribute] + public static void Unregister(Type t) + { + string guid = t.GUID.ToString("B"); + BandObjectAttribute[] boa = (BandObjectAttribute[])t.GetCustomAttributes( + typeof(BandObjectAttribute), + false ); + + BandObjectStyle style = 0; + if( boa.Length == 1 ) style = boa[0].Style; + + if( 0 != (style & BandObjectStyle.ExplorerToolbar) ) + Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Internet Explorer\Toolbar").DeleteValue(guid,false); + + Registry.ClassesRoot.CreateSubKey(@"CLSID").DeleteSubKeyTree(guid); + } + + #endregion + + #region Properties + + /// + /// Title of band object. Displayed at the left or on top of the band object. + /// + [Browsable(true)] + [DefaultValue("")] + public String Title + { + get + { + return _title; + } + set + { + _title = value; + } + } + + /// + /// Minimum size of the band object. Default value of -1 sets no minimum constraint. + /// + [Browsable(true)] + [DefaultValue(typeof(Size), "-1,-1")] + public Size MinSize + { + get + { + return _minSize; + } + set + { + _minSize = value; + } + } + + /// + /// Maximum size of the band object. Default value of -1 sets no maximum constraint. + /// + [Browsable(true)] + [DefaultValue(typeof(Size), "-1,-1")] + public Size MaxSize + { + get + { + return _maxSize; + } + set + { + _maxSize = value; + } + } + + /// + /// Says that band object's size must be multiple of this size. Defauilt value of -1 does not set this constraint. + /// + [Browsable(true)] + [DefaultValue(typeof(Size), "-1,-1")] + public Size IntegralSize + { + get + { + return _integralSize; + } + set + { + _integralSize = value; + } + } + + #endregion + + #region Member Variables + + /// + /// This event is fired after reference to hosting explorer is retreived and stored in Explorer property. + /// + public event EventHandler ExplorerAttached; + + protected WebBrowserClass Explorer; + protected IInputObjectSite BandObjectSite; + + private bool _compositionEnabled = true; + private String _title; + private Size _minSize = new Size(-1, -1); + private Size _integralSize = new Size(-1, -1); + private Size _maxSize = new Size(-1, -1); + + #endregion + } +} \ No newline at end of file diff --git a/Deskband/BandObjectBase/BandObject.csproj b/Deskband/BandObjectBase/BandObject.csproj new file mode 100644 index 0000000..488dc6f --- /dev/null +++ b/Deskband/BandObjectBase/BandObject.csproj @@ -0,0 +1,157 @@ + + + Local + 9.0.30729 + 2.0 + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} + Debug + AnyCPU + + + + + Foo.BandObject + BandObjects.snk + JScript + Grid + IE50 + false + Library + Foo.Deskband.BandObject + + + + + 0.0 + + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + true + + + + + + + + + + + ..\..\Target\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + full + prompt + + + ..\..\Target\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + none + prompt + + + + System + + + System.Drawing + + + System.Windows.Forms + + + + + Code + + + UserControl + + + Code + + + BandObject.cs + Designer + + + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + + + {EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B} + 1 + 1 + 0 + tlbimp + False + + + + + + + + + + "$(FrameworkSDKDir)bin\gacutil.exe" /if "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" +"$(FrameworkSDKDir)bin\gacutil.exe" /if "$(SolutionDir)target\$(ConfigurationName)\Interop.SHDocVw.dll" + + + \ No newline at end of file diff --git a/Deskband/BandObjectBase/BandObject.resx b/Deskband/BandObjectBase/BandObject.resx new file mode 100644 index 0000000..ff31a6d --- /dev/null +++ b/Deskband/BandObjectBase/BandObject.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Deskband/BandObjectBase/BandObjectBase.sln b/Deskband/BandObjectBase/BandObjectBase.sln new file mode 100644 index 0000000..09953a4 --- /dev/null +++ b/Deskband/BandObjectBase/BandObjectBase.sln @@ -0,0 +1,55 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BandObjectLib", "BandObjectLib.csproj", "{BDB3B670-A17B-483E-954C-52FC2B6FF9D3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RegisterLib", "RegisterLib\RegisterLib.vcproj", "{E35915FE-ED91-4AE5-B566-F269CD854498}" + ProjectSection(ProjectDependencies) = postProject + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} = {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} + EndProjectSection +EndProject +Global + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 3 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = http://myhome.romischer.com:8080/ + SccLocalPath0 = . + SccProjectUniqueName1 = BandObjectLib.csproj + SccLocalPath1 = . + SccProjectUniqueName2 = RegisterLib\\RegisterLib.vcproj + SccProjectName2 = RegisterLib + SccLocalPath2 = RegisterLib + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Win32.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Any CPU.Build.0 = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Win32.ActiveCfg = Release|Any CPU + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Win32.ActiveCfg = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Win32.Build.0 = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Any CPU.ActiveCfg = Release|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Win32.ActiveCfg = Release|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Deskband/BandObjectBase/BandObjects.snk b/Deskband/BandObjectBase/BandObjects.snk new file mode 100644 index 0000000000000000000000000000000000000000..87ebce5af27cbb0f28c6d1e8f354cb3f4bebf483 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096uIz@cHwk5(539}KNIjQOJuhJ~WZg|b7 zM=+nq`MQ9Rdjs~ysqvLl`r`E0aiJg`I&K5j=US@8Oaf%k_x=2_YQwCgA6dF(Ay^k>gd?G$|p@l;cWZ@(; ztAF_Ps}6iWqw?%g!q4;~g{<^M09D4pwj~ke!TimEfuJ*7M(MJRpLnl%^%$vq=-Hz} z+4tsP$U26k<;+u%-W}!Qy2lk!T)OaN@SielrG?kh?S?^tb(rkncU*wIgf`o#amMf7 zp)!*mI8`8xK#met8Qwl!5?RzM9ZDFe*&TDmxqhqyVzs~*Cttv2&P0RVDW<~ON?t$I zs#n9zd7H6`xK#zXC~6kBn~f3uvF9VFSl4DckEgdv=Bz=HL5+9$I}dYY5{1HNu*3t( z_++ct)gEx+C(GV9=IsuJ9PrLiu(6I`O%ob?y5Pv=d%5l3vFxa3+QAuJOj)#STW}w1 zj2}R#PKhPmLa>;#L{AQnUFkZu-9q6A{0mQXT(yNMg{2a(C%lKPy;$cOAC10`d;<+8 i>4Qz#hu_etKq|3@Jb_wQN*U-=bQ@Z1T_-~C@OOR literal 0 HcmV?d00001 diff --git a/Deskband/BandObjectBase/ComInterop.cs b/Deskband/BandObjectBase/ComInterop.cs new file mode 100644 index 0000000..f09d526 --- /dev/null +++ b/Deskband/BandObjectBase/ComInterop.cs @@ -0,0 +1,246 @@ +using System; +using System.Drawing; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace Foo.Deskband.BandObject +{ + + abstract class ExplorerGUIDs + { + public static readonly Guid IID_IWebBrowserApp = new Guid("{0002DF05-0000-0000-C000-000000000046}"); + public static readonly Guid IID_IUnknown = new Guid("{00000000-0000-0000-C000-000000000046}"); + } + + [Flags] + public enum DBIM : uint + { + MINSIZE = 0x0001, + MAXSIZE = 0x0002, + INTEGRAL = 0x0004, + ACTUAL = 0x0008, + TITLE = 0x0010, + MODEFLAGS = 0x0020, + BKCOLOR = 0x0040, + } + + [Flags] + public enum DBIMF : uint + { + NORMAL = 0x0001, + FIXED = 0x0002, + FIXEDBMP = 0x0004, + VARIABLEHEIGHT = 0x0008, + UNDELETEABLE = 0x0010, + DEBOSSED = 0x0020, + BKCOLOR = 0x0040, + USECHEVRON = 0x0080, + BREAK = 0x0100, + ADDTOFRONT = 0x0200, + TOPALIGN = 0x0400, + NOGRIPPER = 0x0800, + ALWAYSGRIPPER = 0x1000, + NOMARGINS = 0x2000, + } + + [Flags] + public enum DBIF : uint + { + VIEWMODE_NORMAL = 0x0000, + VIEWMODE_VERTICAL = 0x0001, + VIEWMODE_FLOATING = 0x0002, + VIEWMODE_TRANSPARENT = 0x0004 + } + + [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)] + public struct DESKBANDINFO + { + public DBIM dwMask; + public Point ptMinSize; + public Point ptMaxSize; + public Point ptIntegral; + public Point ptActual; + [MarshalAs(UnmanagedType.ByValTStr, SizeConst=255)] + public String wszTitle; + public DBIMF dwModeFlags; + public Int32 crBkgnd; + }; + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct CMINVOKECOMMANDINFO + { + uint cbSize; + uint fMask; + IntPtr hwnd; + string lpVerb; + string lpParameters; + string lpDirectory; + int nShow; + uint dwHotKey; + IntPtr hIcon; + }; + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("FC4801A3-2BA9-11CF-A229-00AA003D7352")] + public interface IObjectWithSite + { + void SetSite([In ,MarshalAs(UnmanagedType.IUnknown)] Object pUnkSite); + void GetSite(ref Guid riid, [MarshalAs(UnmanagedType.IUnknown)] out Object ppvSite); + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("00000114-0000-0000-C000-000000000046")] + public interface IOleWindow + { + void GetWindow(out System.IntPtr phwnd); + void ContextSensitiveHelp([In] bool fEnterMode); + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("012dd920-7b26-11d0-8ca9-00a0c92dbfe8")] + public interface IDockingWindow + { + void GetWindow(out System.IntPtr phwnd); + void ContextSensitiveHelp([In] bool fEnterMode); + + void ShowDW([In] bool fShow); + void CloseDW([In] UInt32 dwReserved); + void ResizeBorderDW( + IntPtr prcBorder, + [In, MarshalAs(UnmanagedType.IUnknown)] Object punkToolbarSite, + bool fReserved); + } + + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("EB0FE172-1A3A-11D0-89B3-00A0C90A90AC")] + public interface IDeskBand + { + void GetWindow(out System.IntPtr phwnd); + void ContextSensitiveHelp([In] bool fEnterMode); + + void ShowDW([In] bool fShow); + void CloseDW([In] UInt32 dwReserved); + + void ResizeBorderDW( + IntPtr prcBorder, + [In, MarshalAs(UnmanagedType.IUnknown)] Object punkToolbarSite, + bool fReserved); + + void GetBandInfo( + UInt32 dwBandID, + UInt32 dwViewMode, + ref DESKBANDINFO pdbi); + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsDual)] + [Guid("79D16DE4-ABEE-4021-8D9D-9169B261D657")] + public interface IDeskBand2 + { + void GetBandInfo(UInt32 dwBandID, UInt32 dwViewMode, ref DESKBANDINFO pdbi); + + void CanRenderComposited(ref bool pfCanRenderComposited); + + void GetCompositionState(ref bool pfCompositionEnabled); + + void SetCompositionState([MarshalAs(UnmanagedType.Bool)] bool fCompositionEnabled); + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("0000010c-0000-0000-C000-000000000046")] + public interface IPersist + { + void GetClassID(out Guid pClassID); + } + + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("00000109-0000-0000-C000-000000000046")] + public interface IPersistStream + { + void GetClassID(out Guid pClassID); + + void IsDirty (); + + void Load ([In, MarshalAs(UnmanagedType.Interface)] Object pStm); + + void Save ([In, MarshalAs(UnmanagedType.Interface)] Object pStm, + [In] bool fClearDirty); + + void GetSizeMax ([Out] out UInt64 pcbSize); + } + + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("6d5140c1-7436-11ce-8034-00aa006009fa")] + public interface _IServiceProvider + { + void QueryService( + ref Guid guid, + ref Guid riid, + [MarshalAs(UnmanagedType.Interface)] out Object Obj); + } + + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("68284faa-6a48-11d0-8c78-00c04fd918b4")] + public interface IInputObject + { + void UIActivateIO(Int32 fActivate, ref MSG msg); + + [PreserveSig] + //[return:MarshalAs(UnmanagedType.Error)] + Int32 HasFocusIO(); + + [PreserveSig] + Int32 TranslateAcceleratorIO(ref MSG msg); + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("000214e4-0000-0000-c000-000000000046")] + public interface IContextMenu + { + [PreserveSig()] + int QueryContextMenu(uint hmenu, uint indexMenu, int idCmdFirst, int idCmdLast, uint uFlags); + [PreserveSig()] + void InvokeCommand (IntPtr pici); + [PreserveSig()] + void GetCommandString(int idCmd, uint uFlags, int reserved, string name, int cchMax); + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("f1db8392-7331-11d0-8c99-00a0c92dbfe8")] + public interface IInputObjectSite + { + [PreserveSig] + Int32 OnFocusChangeIS( [MarshalAs(UnmanagedType.IUnknown)] Object punkObj, Int32 fSetFocus); + } + + public struct POINT + { + public Int32 x; + public Int32 y; + } + + public struct MSG + { + public IntPtr hwnd; + public UInt32 message; + public UInt32 wParam; + public Int32 lParam; + public UInt32 time; + public POINT pt; + } + +} \ No newline at end of file diff --git a/Deskband/BandObjectBase/RegisterLib/RegisterLib.vcproj b/Deskband/BandObjectBase/RegisterLib/RegisterLib.vcproj new file mode 100644 index 0000000..f1975df --- /dev/null +++ b/Deskband/BandObjectBase/RegisterLib/RegisterLib.vcproj @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Deskband/DeskBand/AssemblyInfo.cs b/Deskband/DeskBand/AssemblyInfo.cs new file mode 100644 index 0000000..4c31478 --- /dev/null +++ b/Deskband/DeskBand/AssemblyInfo.cs @@ -0,0 +1,58 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly: AssemblyTitle("")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly: AssemblyVersion("1.0.0.0")] + +// +// In order to sign your assembly you must specify a key to use. Refer to the +// Microsoft .NET Framework documentation for more information on assembly signing. +// +// Use the attributes below to control which key is used for signing. +// +// Notes: +// (*) If no key is specified, the assembly is not signed. +// (*) KeyName refers to a key that has been installed in the Crypto Service +// Provider (CSP) on your machine. KeyFile refers to a file which contains +// a key. +// (*) If the KeyFile and the KeyName values are both specified, the +// following processing occurs: +// (1) If the KeyName can be found in the CSP, that key is used. +// (2) If the KeyName does not exist and the KeyFile does exist, the key +// in the KeyFile is installed into the CSP and used. +// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. +// When specifying the KeyFile, the location of the KeyFile should be +// relative to the project output directory which is +// %Project Directory%\obj\. For example, if your KeyFile is +// located in the project directory, you would specify the AssemblyKeyFile +// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] +// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework +// documentation for more information on this. +// +//[assembly: AssemblyDelaySign(false)] +//[assembly: AssemblyKeyFile(@"..\..\..\BandObjects.snk")] +//[assembly: AssemblyKeyName("")] diff --git a/Deskband/DeskBand/DeskBand.cs b/Deskband/DeskBand/DeskBand.cs new file mode 100644 index 0000000..5feca0f --- /dev/null +++ b/Deskband/DeskBand/DeskBand.cs @@ -0,0 +1,503 @@ +using System; +using System.ComponentModel; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using System.Reflection; + +using Foo.Platform; +using Foo.Deskband.BandObject; +using Foo.ClientServices.GUIWPForms; +using Microsoft.Win32; + +namespace Foo.Deskband.Deskband +{ + [Guid("AE07101B-46D4-4a98-AF68-0333EA26E113")] + [BandObject("Ooganizer", BandObjectStyle.Horizontal | BandObjectStyle.TaskbarToolBar, HelpText = "Tame the Chaos : Ooganizer")] + public class DeskBand : BandObjectBase + { + private Button btnLaunch; + private IContainer components; + private System.Threading.TimerCallback _clickTimerCallback; + private System.Threading.Timer _clickTimer; + private int _previousClick = 0; + private ContextMenuStrip contextMenuStrip; + private ToolStripMenuItem settingsToolStripMenuItem; + private ToolStripMenuItem aboutToolStripMenuItem; + private ToolStripMenuItem helpToolStripMenuItem; + private ToolStripMenuItem hideToolStripMenuItem; + private ToolStripMenuItem unloadToolStripMenuItem; + private ToolStripMenuItem showToolStripMenuItem; + private ToolStripSeparator toolStripWorkspaceOptionSeparator; + private MouseButtons _previousClickMouseButton = MouseButtons.None; + + // GUI Access Object + GUIWPForms GetGUI{ get { return new GUIWPForms(); } } + + + public DeskBand() + { + AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(OnAssemblyResolve); + InitializeComponent(); + InitializeClickTimer(); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + if (components != null) + components.Dispose(); + } + base.Dispose(disposing); + } + + private void InitializeClickTimer() + { + _clickTimerCallback = new System.Threading.TimerCallback(SingleClickCallback); + } + + #region Component Designer generated code + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.btnLaunch = new System.Windows.Forms.Button(); + this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); + this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.aboutToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.helpToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.unloadToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.hideToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.showToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripWorkspaceOptionSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.contextMenuStrip.SuspendLayout(); + this.SuspendLayout(); + // + // btnLaunch + // + this.btnLaunch.BackColor = System.Drawing.SystemColors.ControlText; + this.btnLaunch.ContextMenuStrip = this.contextMenuStrip; + this.btnLaunch.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.btnLaunch.Font = new System.Drawing.Font("Forte", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnLaunch.ForeColor = System.Drawing.SystemColors.ControlText; + this.btnLaunch.Location = new System.Drawing.Point(0, 0); + this.btnLaunch.Margin = new System.Windows.Forms.Padding(0); + this.btnLaunch.Name = "btnLaunch"; + this.btnLaunch.Size = new System.Drawing.Size(24, 24); + this.btnLaunch.TabIndex = 0; + this.btnLaunch.TabStop = false; + this.btnLaunch.Text = "O"; + this.btnLaunch.UseVisualStyleBackColor = false; + this.btnLaunch.HandleCreated += new System.EventHandler(this.btnLaunch_HandleCreated); + this.btnLaunch.HandleDestroyed += new System.EventHandler(this.btnLaunch_HandleDestroyed); + this.btnLaunch.Click += new System.EventHandler(this.btnLaunch_Click); + this.btnLaunch.MouseClick += new System.Windows.Forms.MouseEventHandler(this.btnLaunch_MouseClick); + this.btnLaunch.MouseDown += new System.Windows.Forms.MouseEventHandler(this.btnLaunch_MouseDown); + this.btnLaunch.MouseUp += new System.Windows.Forms.MouseEventHandler(this.btnLaunch_MouseUp); + // + // contextMenuStrip + // + this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.hideToolStripMenuItem, + this.unloadToolStripMenuItem, + this.showToolStripMenuItem, + this.toolStripWorkspaceOptionSeparator, + this.settingsToolStripMenuItem, + this.helpToolStripMenuItem, + this.aboutToolStripMenuItem}); + this.contextMenuStrip.Name = "contextMenuStrip"; + this.contextMenuStrip.Size = new System.Drawing.Size(153, 164); + this.contextMenuStrip.Opening += new System.ComponentModel.CancelEventHandler(this.contextMenuStrip_Opening); + // + // settingsToolStripMenuItem + // + this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.settingsToolStripMenuItem.Text = "Settings"; + this.settingsToolStripMenuItem.Click += new System.EventHandler(this.settingsToolStripMenuItem_Click); + // + // aboutToolStripMenuItem + // + this.aboutToolStripMenuItem.Name = "aboutToolStripMenuItem"; + this.aboutToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.aboutToolStripMenuItem.Text = "About"; + this.aboutToolStripMenuItem.Click += new System.EventHandler(this.aboutToolStripMenuItem_Click); + // + // helpToolStripMenuItem + // + this.helpToolStripMenuItem.Name = "helpToolStripMenuItem"; + this.helpToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.helpToolStripMenuItem.Text = "Help"; + // + // unloadToolStripMenuItem + // + this.unloadToolStripMenuItem.Name = "unloadToolStripMenuItem"; + this.unloadToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.unloadToolStripMenuItem.Text = "Unload"; + this.unloadToolStripMenuItem.Click += new System.EventHandler(this.unloadToolStripMenuItem_Click); + // + // hideToolStripMenuItem + // + this.hideToolStripMenuItem.Name = "hideToolStripMenuItem"; + this.hideToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.hideToolStripMenuItem.Text = "Hide"; + this.hideToolStripMenuItem.Click += new System.EventHandler(this.hideToolStripMenuItem_Click); + // + // showToolStripMenuItem + // + this.showToolStripMenuItem.Name = "showToolStripMenuItem"; + this.showToolStripMenuItem.Size = new System.Drawing.Size(152, 22); + this.showToolStripMenuItem.Text = "Show"; + this.showToolStripMenuItem.Click += new System.EventHandler(this.showToolStripMenuItem_Click); + // + // toolStripWorkspaceOptionSeparator + // + this.toolStripWorkspaceOptionSeparator.Name = "toolStripWorkspaceOptionSeparator"; + this.toolStripWorkspaceOptionSeparator.Size = new System.Drawing.Size(149, 6); + // + // DeskBand + // + this.BackColor = System.Drawing.SystemColors.ControlText; + this.Controls.Add(this.btnLaunch); + this.ForeColor = System.Drawing.SystemColors.ControlText; + this.MaxSize = new System.Drawing.Size(24, 24); + this.MinSize = new System.Drawing.Size(24, 24); + this.Name = "DeskBand"; + this.Title = ""; + this.contextMenuStrip.ResumeLayout(false); + this.ResumeLayout(false); + + } + #endregion + + #region Other Handlers + + private void btnLaunch_HandleCreated(object sender, EventArgs e) + { + //m_gui = new GUIWPForms(); + //MessageBox.Show("btnLaunch_Created is called!"); + } + + private void btnLaunch_HandleDestroyed(object sender, EventArgs e) + { + //m_gui = null; + //MessageBox.Show("btnLaunch_Destroyed is called!"); + } + + #endregion + + #region Button Click Handlers + + private void btnLaunch_MouseClick(object sender, MouseEventArgs e) + { + + } + + private void SingleClickCallback(Object arg) + { + switch (((MouseEventArgs)arg).Button) + { + case MouseButtons.Left: + { + //MessageBox.Show("Left Click"); + + try + { + GetGUI.LaunchArtifactWall(this.Handle); + } + catch (Exception e) + { + MessageBox.Show(e.Message); + } + + //LaunchArtifactWall(); + + break; + } + case MouseButtons.Right: + { + //LaunchContextMenu((MouseEventArgs)arg); + + break; + } + case MouseButtons.Middle: + { + // TODO - Handle middle button ... if desired + + break; + } + default: + { + break; + } + } + } + + private void DoubleClickCallback(MouseEventArgs args) + { + switch (args.Button) + { + case MouseButtons.Left: + { + try + { + GetGUI.LaunchWorkspaceSelector(this.Handle); + } + catch (Exception e) + { + MessageBox.Show(e.Message); + } + + //LaunchWorkspaceSelector(); + + break; + } + case MouseButtons.Right: + { + // TODO - Handle right button double click ... if desired + + break; + } + case MouseButtons.Middle: + { + // TODO - Handle middle button double click ... if desired + + break; + } + default: + { + break; + } + } + } + + private void LaunchContextMenu(MouseEventArgs args) + { + contextMenuStrip.Show(PointToScreen(args.Location)); + } + + private void btnLaunch_Click(object sender, EventArgs e) + { + + } + + private void btnLaunch_MouseDown(object sender, MouseEventArgs e) + { + // Do not remove this handler ... it seems to quiet down the taskbar context menu + // so we can do our own context menu + } + + private void btnLaunch_MouseUp(object sender, MouseEventArgs e) + { + int now = System.Environment.TickCount; + + if ((now - _previousClick) <= SystemInformation.DoubleClickTime && + e.Button == _previousClickMouseButton) + { + // Cancel click timer ... we've got a double click instead + _clickTimer.Change(System.Threading.Timeout.Infinite, + System.Threading.Timeout.Infinite); + + DoubleClickCallback(e); + + _previousClick = 0; + } + else + { + _previousClick = now; + _previousClickMouseButton = e.Button; + + // Fire the OnClick event after the DoubleClickTime so that double-click handling gets a chance + _clickTimer = new System.Threading.Timer(_clickTimerCallback, + (Object)e, + (int)(SystemInformation.DoubleClickTime * 1.3), + System.Threading.Timeout.Infinite); + } + } + + #endregion + + /// + /// Assembly Resolve Handler for entire Component + /// + static System.Reflection.Assembly OnAssemblyResolve(object sender, ResolveEventArgs args) + { + + string installPath = ""; + RegistryKey RootKey = Registry.LocalMachine.OpenSubKey("Software\\Ooganizer", false); + if (RootKey != null) + { + object keyvalue = RootKey.GetValue("InstallPath");; + if ((keyvalue != null) && (keyvalue.ToString() != "")) + installPath = keyvalue.ToString(); + } + + string[] asmName = args.Name.Split(','); + switch (asmName[0]) + { + case "GUIWPForms": + return Assembly.LoadFile(installPath + @"GUIWPForms.dll", Assembly.GetExecutingAssembly().Evidence); + + case "Platform": + return Assembly.LoadFile(installPath + @"Platform.dll", Assembly.GetExecutingAssembly().Evidence); + + default: + return null; + } + + //Assembly assembly = null; + //string[] asmName = args.Name.Split(','); + //string basePath = ""; + + //RegistryKey RootKey = Registry.LocalMachine.OpenSubKey("Software\\Ooganizer", false); + //if (RootKey != null) + //{ + // object keyvalue = null; + // keyvalue = RootKey.GetValue("InstallPath"); + // if ((keyvalue != null) && (keyvalue.ToString() != "")) + // basePath = keyvalue.ToString(); + //} + + //MessageBox.Show(System.Environment.CurrentDirectory); + ////MessageBox.Show(asmName[0]); + //switch (asmName[0]) + //{ + // case "GUIWPForms": + // assembly = Assembly.LoadFile(basePath + @"GUIWPForms.dll", Assembly.GetExecutingAssembly().Evidence); + // break; + // case "Platform": + // assembly = Assembly.LoadFile(basePath + @"Platform.dll", Assembly.GetExecutingAssembly().Evidence); + // break; + // default: + // break; + //} + + //return assembly; + } + + #region ContextMenu Handlers + + private void contextMenuStrip_Opening(object sender, CancelEventArgs e) + { + //string currentWorkspace = null; + //OoganizerState.WorkspaceState workspaceState = OoganizerState.WorkspaceState.Unloaded; + + //using (OoganizerState oogyState = new OoganizerState()) + //{ + // currentWorkspace = oogyState.GetCurrentWorkspace(); + + // if (currentWorkspace != null) + // { + // workspaceState = oogyState.GetWorkspaceState(currentWorkspace); + // } + //} + + //if (currentWorkspace == null) + //{ + // // Hide these options when there is no workspace loaded + // this.hideToolStripMenuItem.Visible = false; + // this.unloadToolStripMenuItem.Visible = false; + // this.showToolStripMenuItem.Visible = false; + // this.toolStripWorkspaceOptionSeparator.Visible = false; + //} + //else + //{ + // switch (workspaceState) + // { + // case OoganizerState.WorkspaceState.Hidden: + // this.hideToolStripMenuItem.Visible = false; + // this.unloadToolStripMenuItem.Visible = true; + // this.showToolStripMenuItem.Visible = true; + // this.toolStripWorkspaceOptionSeparator.Visible = true; + + // break; + + // case OoganizerState.WorkspaceState.Shown: + // this.hideToolStripMenuItem.Visible = true; + // this.unloadToolStripMenuItem.Visible = true; + // this.showToolStripMenuItem.Visible = false; + // this.toolStripWorkspaceOptionSeparator.Visible = true; + + // break; + + // default: + // // Otherwise hide workspace options + // this.hideToolStripMenuItem.Visible = false; + // this.unloadToolStripMenuItem.Visible = false; + // this.showToolStripMenuItem.Visible = false; + // this.toolStripWorkspaceOptionSeparator.Visible = false; + + // break; + // } + //} + } + + private void aboutToolStripMenuItem_Click(object sender, EventArgs e) + { + // Display About Form ... Form should provide : + // * company and product version information + // * support website / phone number + MessageBox.Show("Ooganizer 1.0"); + } + + private void settingsToolStripMenuItem_Click(object sender, EventArgs e) + { + // Display Settings Form ... Form should provide : + // * Settings + MessageBox.Show("Ooganizer Settings Form"); + } + + private void hideToolStripMenuItem_Click(object sender, EventArgs e) + { + //string currWorkspaceName = null; + + //using (OoganizerState oogyState = new OoganizerState()) + //{ + // currWorkspaceName = oogyState.GetCurrentWorkspace(); + + // if (currWorkspaceName != null) + // { + // oogyState.HideWorkspace(currWorkspaceName); + // } + //} + } + + private void showToolStripMenuItem_Click(object sender, EventArgs e) + { + //string currWorkspaceName = null; + + //using (OoganizerState oogyState = new OoganizerState()) + //{ + // currWorkspaceName = oogyState.GetCurrentWorkspace(); + + // if (currWorkspaceName != null) + // { + // oogyState.ShowWorkspace(currWorkspaceName); + // } + //} + } + + private void unloadToolStripMenuItem_Click(object sender, EventArgs e) + { + //string currWorkspaceName = null; + + //using (OoganizerState oogyState = new OoganizerState()) + //{ + // currWorkspaceName = oogyState.GetCurrentWorkspace(); + + // if (currWorkspaceName != null) + // { + // string currentWorkspaceName = oogyState.GetCurrentWorkspace(); + + // if (currentWorkspaceName != null) + // { + // oogyState.UnloadWorkspace(currentWorkspaceName); + // } + // } + //} + } + + #endregion + + + } +} diff --git a/Deskband/DeskBand/DeskBand.csproj b/Deskband/DeskBand/DeskBand.csproj new file mode 100644 index 0000000..79a58a5 --- /dev/null +++ b/Deskband/DeskBand/DeskBand.csproj @@ -0,0 +1,174 @@ + + + Local + 9.0.30729 + 2.0 + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7} + Debug + AnyCPU + + + + + Foo.DeskBand + MyKeyFile.SNK + JScript + Grid + IE50 + false + Library + Foo.Deskband.Deskband + + + + + 0.0 + + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + false + true + true + + + + + + + + + v3.5 + + + ..\..\Target\Debug\ + false + 285212672 + false + + + DEBUG;TRACE + + + true + 4096 + false + false + false + false + 4 + full + prompt + + + ..\..\Target\Release\ + false + 285212672 + false + + + TRACE + + + false + 4096 + true + false + false + false + 4 + none + prompt + + + + System + + + System.Data + + + System.Drawing + + + + System.Windows.Forms + + + System.XML + + + + + Code + + + UserControl + + + True + True + Resources.resx + + + DeskBand.cs + Designer + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + + + + + + {A02E052C-3C52-43DB-BB30-A47446B8165F} + GUIWPForms + + + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Platform + + + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} + BandObject + + + + + "$(FrameworkSDKDir)bin\gacutil.exe" /uf "$(TargetName)" + "$(FrameworkSDKDir)bin\gacutil.exe" /if "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" +"$(FrameworkDir)\regasm.exe" "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" tlb:$(TargetName).tlb /codebase + + \ No newline at end of file diff --git a/Deskband/DeskBand/DeskBand.resx b/Deskband/DeskBand/DeskBand.resx new file mode 100644 index 0000000..bd3ae11 --- /dev/null +++ b/Deskband/DeskBand/DeskBand.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + \ No newline at end of file diff --git a/Deskband/DeskBand/DeskBand.sln b/Deskband/DeskBand/DeskBand.sln new file mode 100644 index 0000000..bc198aa --- /dev/null +++ b/Deskband/DeskBand/DeskBand.sln @@ -0,0 +1,91 @@ +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeskBand", "DeskBand.csproj", "{ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}" + ProjectSection(ProjectDependencies) = postProject + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} = {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Register", "Register\Register.vcproj", "{E35915FE-ED91-4AE5-B566-F269CD854498}" + ProjectSection(ProjectDependencies) = postProject + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7} = {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BandObject", "..\BandObjectBase\BandObject.csproj", "{BDB3B670-A17B-483E-954C-52FC2B6FF9D3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RegisterLib", "..\BandObjectBase\RegisterLib\RegisterLib.vcproj", "{A6903D99-B950-4D1A-B715-0B808ED64376}" + ProjectSection(ProjectDependencies) = postProject + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} = {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} + EndProjectSection +EndProject +Global + GlobalSection(TeamFoundationVersionControl) = preSolution + SccNumberOfProjects = 5 + SccEnterpriseProvider = {4CA58AB2-18FA-4F8D-95D4-32DDF27D184C} + SccTeamFoundationServer = http://myhome.romischer.com:8080/ + SccLocalPath0 = . + SccProjectUniqueName1 = Register\\Register.vcproj + SccProjectName1 = Register + SccLocalPath1 = Register + SccProjectUniqueName2 = DeskBand.csproj + SccLocalPath2 = . + SccProjectUniqueName3 = ..\\BandObjectBase\\BandObject.csproj + SccProjectName3 = ../BandObjectBase + SccLocalPath3 = ..\\BandObjectBase + SccProjectUniqueName4 = ..\\BandObjectBase\\RegisterLib\\RegisterLib.vcproj + SccProjectName4 = ../BandObjectBase/RegisterLib + SccLocalPath4 = ..\\BandObjectBase\\RegisterLib + EndGlobalSection + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Win32.ActiveCfg = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Any CPU.Build.0 = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Win32.ActiveCfg = Release|Any CPU + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Win32.ActiveCfg = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Debug|Win32.Build.0 = Debug|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Any CPU.ActiveCfg = Release|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Mixed Platforms.Build.0 = Release|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Win32.ActiveCfg = Release|Win32 + {E35915FE-ED91-4AE5-B566-F269CD854498}.Release|Win32.Build.0 = Release|Win32 + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Win32.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Any CPU.Build.0 = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Win32.ActiveCfg = Release|Any CPU + {A6903D99-B950-4D1A-B715-0B808ED64376}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Debug|Win32.ActiveCfg = Debug|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Debug|Win32.Build.0 = Debug|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Release|Any CPU.ActiveCfg = Release|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Release|Mixed Platforms.Build.0 = Release|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Release|Win32.ActiveCfg = Release|Win32 + {A6903D99-B950-4D1A-B715-0B808ED64376}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Deskband/DeskBand/MyKeyFile.SNK b/Deskband/DeskBand/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/Deskband/DeskBand/Properties/Resources.Designer.cs b/Deskband/DeskBand/Properties/Resources.Designer.cs new file mode 100644 index 0000000..855091e --- /dev/null +++ b/Deskband/DeskBand/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.Deskband.Deskband.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Foo.Deskband.Deskband.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Deskband/DeskBand/Properties/Resources.resx b/Deskband/DeskBand/Properties/Resources.resx new file mode 100644 index 0000000..5ea0895 --- /dev/null +++ b/Deskband/DeskBand/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Deskband/DeskBand/Register/Register.vcproj b/Deskband/DeskBand/Register/Register.vcproj new file mode 100644 index 0000000..7a738d0 --- /dev/null +++ b/Deskband/DeskBand/Register/Register.vcproj @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/GUILib/GUICommon.cs b/GUILib/GUICommon.cs new file mode 100644 index 0000000..0e975d4 --- /dev/null +++ b/GUILib/GUICommon.cs @@ -0,0 +1,285 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Drawing; +using System.Windows.Forms; +using System.Diagnostics; + +// Ooganizer Namespaces +using Foo.Platform; +using Foo.Platform.Interacters; +using Foo.Platform.Win32; + +namespace Foo.GUILib +{ + /// + /// This is the generic GUICommon Class, that serves us a generic implementation to + /// everyone as to isolate ourselves from OS Changes + /// + public class GUICommon + { + // Keep track of all the origianl window positions that go + // thru here, ~we delete them when position back to org position + // get's called. + private static Dictionary s_orgWindowPosMap; + private static bool s_bOutOfProc_UseBH = false; + + // public properties + public static bool OutOfProc { get { return s_bOutOfProc_UseBH; } } + + // keep track of Window Positions + static GUICommon() + { + s_orgWindowPosMap = new Dictionary(); + } + + /// + /// Performs a screen snapshot of the passed in window handle. + /// + /// Window to Snap + /// a window image + public static Image PerformSnapshot(IntPtr hWnd) + { + if (hWnd != IntPtr.Zero) + { + ScreenCapture screencap = new ScreenCapture(); + + if (Env.Theme == Env.Themes.AeroTheme) + return screencap.SaveWindowUsingFullScreenShotCrop(hWnd); + else + return screencap.SaveWindowUsingDCNBitBlt(hWnd, false); + } + return null; + } + + /// + /// Positions a window in the center at Golden Ratio and takes a snapshot. + /// ~corner stone of our add workspace strategy + /// + /// handle to the window to manipulate + /// Set to true to use ButtonHook to Perform the action + public static Image PositionWindowToGoldenPosAndTakeSnapshot(IntPtr hWnd, bool bOutOfProc) + { + // use ButtonHook, Yes / No? + s_bOutOfProc_UseBH = bOutOfProc; + + // First thing to do is to save the org position + RECT rect; + Win32Functions.GetWindowRect(hWnd, out rect); + s_orgWindowPosMap[hWnd] = rect; + + // First we fade the window totally away + FadeWindow(hWnd, true); + + // now we want to fade it out of the monitor center + // However using the golden ratio as the size + FadeWindowOutOfMonitorCenterInGoldenRatio(hWnd, rect); + + // Make sure we are in position and drawing at this point, + // perform the snapshot and return + System.Threading.Thread.Sleep(10); + + //PositionWindowBackToWhereItWas(hWnd); + + Image image = PerformSnapshot(hWnd); + //image.Save(@"D:\Users\HPInvent\Desktop\Snapshot1.png", System.Drawing.Imaging.ImageFormat.Png); + //return null; + + return image; + } + + /// + /// Positions a window back to where it was prior to calling PositionWindowToGoldenPosAndTakeSnapshot(). + /// ~Hence, you should call this after calling that function + /// + /// handle to the window to manipulate + /// Set to true to use ButtonHook to Perform the action + public static void PositionWindowBackToWhereItWas(IntPtr hWnd, bool bOutOfProc) + { + // use ButtonHook, Yes / No? + s_bOutOfProc_UseBH = bOutOfProc; + + // try to retrieve the org value from the map + if (!s_orgWindowPosMap.ContainsKey(hWnd)) + return; + + RECT orgRect = s_orgWindowPosMap[hWnd]; + + // Set the Window totally invisible + SetAlphaTransparency(hWnd, 0); + + // As part of the effect, wait a little + System.Threading.Thread.Sleep(60); + + // Now just flat out position it back to where it was + Win32Functions.SetWindowPos(hWnd, IntPtr.Zero, orgRect.left, orgRect.top, orgRect.AsRectangle.Width, orgRect.AsRectangle.Height, (uint)SetWindowPosFlags.SWP_SHOWWINDOW); + + // Now Fade the Window out + FadeWindow(hWnd, false); + + //SetAlphaTransparency(hWnd, 0); // invisible + //SetAlphaTransparency(hWnd, 255); // visible + + // since we positioned the window back to where it was, + // we no longer need to keep track of it's org position + s_orgWindowPosMap.Remove(hWnd); + } + + /// + /// Use this generic function to set the transparency + /// + private static void SetAlphaTransparency(IntPtr hWnd, byte alpha) + { + if (s_bOutOfProc_UseBH) + BHInteracter.SetWindowTransparency(hWnd, alpha); + else + Win32_WrapperFunc.SetAlphaChannel(hWnd, alpha); + } + + /// + /// The Golden Ratio (~1.618) is used for the Snapshot to give it the best look + /// + /// pass in th screen for which to calculate the ratio for + /// the width and height to achieve the best golden ratio for that screen + private static void CalculateGoldenRatio(Screen screen, out RECT rect) + { + const int _MAXHEIGHT = 1100; // max pleasing height + const double _fGoldenRatio = 1.618; + const double _fsafetybuffer = 10; // 10% just in case + // safety buffer for height/width + + int maxHeight = screen.WorkingArea.Height; + int maxWidth = screen.WorkingArea.Width; + + // is this a potrait screen? + bool bIsPortrait = maxHeight > maxWidth; + + // calculated height and width + int height = 0; + int width = 0; + + // Normal Screen + if (!bIsPortrait) + { + // calculated height and width; + height = maxHeight - (int)(((double)maxHeight / 100) * _fsafetybuffer); + width = (int)((double)height / _fGoldenRatio); + } + else // Portrait + { + width = maxWidth - (int)(((double)maxWidth / 100) * _fsafetybuffer); + height = (int)((double)width * _fGoldenRatio); + } + + // Enforce that the height is not bigger than _MAXHEIGHT, anything bigger than + // that just look unpleasant. + if (height >= _MAXHEIGHT) + { + height = _MAXHEIGHT; + width = (int)((double)height / _fGoldenRatio); + } + + // pass out the calculated height and width + rect.left = 0; + rect.top = 0; + rect.bottom = height; + rect.right = width; + } + + /// + /// Use this to quickle fade a window + /// + /// Set to true to fade in, false to Fade out + private static void FadeWindow(IntPtr hWnd, bool bFadeIn) + { + + // Stole Increment Fading from Buttonhook + const int LOWER_INCREMENT = 7; + const int MIDDLE_INCREMENT = 15; + const int UPPER_INCREMENT = 25; + + // Increment Points *inverted* + const int LOWER_POINT = 60; + const int MIDDLE_POINT = 160; + const int UPPER_POINT = 230; + + // Fade in or Fade out? + byte alpha = (!bFadeIn)? (byte)0 : (byte)255; + bool bDone = false; + + if (!bFadeIn) // FadeOut + { + while (!bDone) + { + if (alpha >= UPPER_POINT) + { + alpha = 255; // just show the thing already + bDone = true; + } + else if (alpha <= LOWER_POINT) + alpha += LOWER_INCREMENT; + else if (alpha <= MIDDLE_POINT) + alpha += MIDDLE_INCREMENT; + else + alpha += UPPER_INCREMENT; + + SetAlphaTransparency(hWnd, alpha); + System.Threading.Thread.Sleep(20); + } + } + else // FadeIn + { + while (!bDone) + { + if (alpha <= (255 - UPPER_POINT)) //25 + { + alpha = 0; // just hide the thing already + bDone = true; + } + else if (alpha >= (255 - LOWER_POINT)) //195 + alpha -= LOWER_INCREMENT; + else if (alpha >= (255 - MIDDLE_POINT)) // 95 + alpha -= MIDDLE_INCREMENT; + else + alpha -= UPPER_INCREMENT; + + SetAlphaTransparency(hWnd, alpha); + System.Threading.Thread.Sleep(20); + } + } + } + + /// + /// Helper function to determine the monitor and it's center and + /// fade out the window there in GoldenRatio Siz + /// + private static void FadeWindowOutOfMonitorCenterInGoldenRatio(IntPtr hWnd, RECT orgRect) + { + // get the screen the original rect was mostly located + Screen screen = Screen.FromRectangle(orgRect.AsRectangle); + + // now figure out the best rect to use for this screen + RECT goldenRect; + CalculateGoldenRatio(screen, out goldenRect); + + // calculate where we must place the golden window + // (centering it on the screen) + Point pt = new Point(); + pt.Y = (screen.Bounds.Height - goldenRect.AsRectangle.Height) / 2; + pt.X = (screen.Bounds.Width - goldenRect.AsRectangle.Width) / 2; + + // Calculate the window center according to the screen + pt.Y = screen.Bounds.Top + pt.Y; + pt.X = screen.Bounds.Left + pt.X; + + // Make the window totally transparent and show it in the golden ratio position + SetAlphaTransparency(hWnd, 0); + Win32Functions.SetWindowPos(hWnd, IntPtr.Zero, pt.X, pt.Y, goldenRect.AsRectangle.Width, goldenRect.AsRectangle.Height, (uint) SetWindowPosFlags.SWP_SHOWWINDOW); + + // Now Fade the Window out + FadeWindow(hWnd, false); + } + + } +} + diff --git a/GUILib/GUILib.csproj b/GUILib/GUILib.csproj new file mode 100644 index 0000000..48fbdd5 --- /dev/null +++ b/GUILib/GUILib.csproj @@ -0,0 +1,103 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {C1282050-455B-44F4-8520-1C005E38EFB2} + Library + Properties + Foo.GUILib + GUILib + v3.5 + 512 + + + + + + + + + + + true + MyKeyFile.SNK + + + true + full + false + ..\Target\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\Target\Release\ + TRACE + prompt + 4 + + + + False + ..\Components\log4net.dll + + + 3.0 + + + 3.0 + + + + 3.5 + + + + 3.5 + + + + + + 3.0 + + + 3.0 + + + + + + + + + + + + + + + + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Platform + + + + + + + + + \ No newline at end of file diff --git a/GUILib/MyKeyFile.SNK b/GUILib/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/GUILib/Properties/AssemblyInfo.cs b/GUILib/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..0053aea --- /dev/null +++ b/GUILib/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("GUILib")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("GUILib")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("451a4209-15d4-49ef-a70f-2cc6c6d524b5")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/GUILib/ScreenCapture.cs b/GUILib/ScreenCapture.cs new file mode 100644 index 0000000..92d4734 --- /dev/null +++ b/GUILib/ScreenCapture.cs @@ -0,0 +1,207 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Runtime.InteropServices; +using System.Drawing; +using System.Windows.Forms; +using System.Reflection; + +using Foo.Platform; +using Foo.Platform.Win32; + +namespace Foo.GUILib +{ + + public class ScreenCapture + { + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// Saves a Window using a DC of the Full Screen, then crops the window out of the + /// full screen capture. We have to do this because SaveWindowUsingDCNBitBlt() doesn't + /// work for all programs that overwrite the glass area on Aero (like MS Office) + /// + /// + /// IMP! - This function will work on some multiple monitor configurations but currently NOT all! + /// If for example, the primary display is on the left and sec on the right, and the window is on the + /// right monitor, then all x and y values will be positive, (We currently only handle multiple monitors, + /// where one x or y value is negative!), + /// ~more calculations must be done for multiple x, multiple y positive configurations + /// + /// handle to a Window + public Image SaveWindowUsingFullScreenShotCrop(IntPtr hWnd) + { + try + { + // First get the Window Rect + RECT rectWnd; + Win32Functions.GetWindowRect(hWnd, out rectWnd); + + // Now figure out which monitor the window is in + IntPtr hMonitor = Win32Functions.MonitorFromRect(ref rectWnd, (int)Win32_Constants.MONITOR_DEFAULTTONEAREST); + + // Get the szDevice Name for the Monitor + MONITORINFOEX monitorinfoex = new MONITORINFOEX(); + monitorinfoex.cbSize = Marshal.SizeOf(monitorinfoex); + if (!Win32Functions.GetMonitorInfo(hMonitor, ref monitorinfoex)) + return null; + + // Use szDevice to create a DC + IntPtr hDC = Win32Functions.CreateDC(monitorinfoex.szDeviceName, IntPtr.Zero, IntPtr.Zero, IntPtr.Zero); + + //Here we make a compatible device context in memory for screen device context. + IntPtr hMemDC = Win32Functions.CreateCompatibleDC(hDC); + + // Let's get all the monitor dimensions we need + Rectangle rectDim = monitorinfoex.rcMonitor.AsRectangle; + int DisplayHeight = rectDim.Height; + int DisplayWidth = rectDim.Width; + + //The .net way to retrieve dimensions + Screen screen = Screen.FromHandle(hWnd); + + //We create a compatible bitmap of screen size using screen device context. + IntPtr hBitmap = Win32Functions.CreateCompatibleBitmap(hDC, DisplayWidth, DisplayHeight); + + if (hBitmap != IntPtr.Zero) + { + //Here we select the compatible bitmap in memeory device context and keeps the refrence to Old bitmap. + IntPtr hOld = (IntPtr)Win32Functions.SelectObject(hMemDC, hBitmap); + + //We copy the Bitmap to the memory device context. + Win32Functions.BitBlt(hMemDC, 0, 0, DisplayWidth, DisplayHeight, hDC, 0, 0, Win32_Constants.SRCCOPY); + + //We select the old bitmap back to the memory device context. + Win32Functions.SelectObject(hMemDC, hOld); + + //We delete the memory device context. + Win32Functions.DeleteDC(hMemDC); + + //Delete the screen device context. + Win32Functions.DeleteDC(hDC); + + //Image is created by Image bitmap handle and stored in local variable. + Image image = (Image)System.Drawing.Image.FromHbitmap(hBitmap); + + // * For Debugging * + //string strFileNameNPathWExtPNG = (Env.GetSnapshotDirectory() + @"\" + hWnd.ToString() + ".png"); + //image.Save(strFileNameNPathWExtPNG, System.Drawing.Imaging.ImageFormat.Png); + + //Release the memory for compatible bitmap. + Win32Functions.DeleteObject(hBitmap); + + //// + // Imp! - Now we want to crop the Window out of the Screen Image + // NOTE! - Here we convert the screen positions into the corresponding + // image position on that screen + //// + int height = rectWnd.AsRectangle.Height; + int width = rectWnd.AsRectangle.Width; + + rectWnd.left = Math.Abs(rectWnd.left - screen.Bounds.Left); + rectWnd.right = rectWnd.left + width; + + rectWnd.top = Math.Abs(rectWnd.top - screen.Bounds.Top); + rectWnd.bottom = rectWnd.top + height; + + // Convert the Rectangle for .Net Use + Rectangle rectangleWnd = rectWnd.AsRectangle; + + Bitmap bmpImage = new Bitmap(image); + Bitmap bmpCrop = bmpImage.Clone(rectangleWnd, bmpImage.PixelFormat); + + //Bitmap bmpCrop = (Bitmap)image; + //bmpCrop = bmpCrop.Clone(rectangleWnd, bmpCrop.PixelFormat); + + return (Image)bmpCrop; + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error thrown", MethodBase.GetCurrentMethod().Name), e); + } + + return null; + } + + /// + /// Saves the Window using a DC, this works well for bUseClientDC = true, but doesn't + /// work when using the Window's DC because of Aero drawing via directx, the window frame + /// won't be in the image + /// + /// handle to a Window + /// true to use ClientDC, false to use WindowDC + public Image SaveWindowUsingDCNBitBlt(IntPtr hWnd, bool bUseClientDC) + { + try + { + SIZE size; + IntPtr hDC; + IntPtr hBitmap; + Image image; + RECT Rect = new RECT(); + + if (bUseClientDC) + Win32Functions.GetClientRect(hWnd, out Rect); + else + Win32Functions.GetWindowRect(hWnd, out Rect); + + size.cx = (Rect.right - Rect.left); + size.cy = (Rect.bottom - Rect.top); + + // TRY USING GetDCEx() - May actually do better + //hDC = Win32Functions.GetDCEx(hWnd); + if (bUseClientDC) + hDC = Win32Functions.GetDC(hWnd); + else + hDC = Win32Functions.GetWindowDC(hWnd); + + //Here we make a compatible device context in memory for screen device context. + IntPtr hMemDC = Win32Functions.CreateCompatibleDC(hDC); + + //We create a compatible bitmap of screen size using screen device context. + hBitmap = Win32Functions.CreateCompatibleBitmap(hDC, size.cx, size.cy); + + if (hBitmap != IntPtr.Zero) + { + //Here we select the compatible bitmap in memeory device context and keeps the refrence to Old bitmap. + IntPtr hOld = (IntPtr)Win32Functions.SelectObject(hMemDC, hBitmap); + + //We copy the Bitmap to the memory device context. + Win32Functions.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, Win32_Constants.SRCCOPY); + + //We select the old bitmap back to the memory device context. + Win32Functions.SelectObject(hMemDC, hOld); + + //We delete the memory device context. + Win32Functions.DeleteDC(hMemDC); + + //We release the screen device context. + Win32Functions.ReleaseDC(hWnd, hDC); + + //Image is created by Image bitmap handle and stored in local variable. + image = (Image)System.Drawing.Image.FromHbitmap(hBitmap); + + // * For Debugging * + //string strFileNameNPathWExtPNG = (Env.GetSnapshotDirectory() + @"\" + hWnd.ToString() + ".png"); + //image.Save(strFileNameNPathWExtPNG, System.Drawing.Imaging.ImageFormat.Png); + + //Release the memory for compatible bitmap. + Win32Functions.DeleteObject(hBitmap); + return image; + } + else + { + Log.Error(string.Format("{0}() - hBitmap is Null, something is wrong", MethodBase.GetCurrentMethod().Name)); + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error thrown", MethodBase.GetCurrentMethod().Name), e); + } + + return null; + } + } +} diff --git a/GUILib/WPFHelper.cs b/GUILib/WPFHelper.cs new file mode 100644 index 0000000..c5d660c --- /dev/null +++ b/GUILib/WPFHelper.cs @@ -0,0 +1,106 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Controls; +using System.Windows.Media.Imaging; +using System.Windows.Media; +using System.Windows; + +namespace Foo.GUILib +{ + static public class WPFHelper + { + /// + /// Useful to create a simple wrapping tooltip for a wpf control + /// + /// + /// Set to 0 to leave default, else set to 0> to define max height + /// Set to 0 to leave default, else set to 0> to define max width + /// a ToolTip Object to assign to a control + public static ToolTip CreateNewStringToolTip(string strToolTipContent, int height, int width) + { + // Create the TextBlock + TextBlock tx = new TextBlock(); + if(height > 0) + tx.Height = height; + if(width > 0) + tx.Width = width; + tx.TextWrapping = TextWrapping.Wrap; + tx.Text = strToolTipContent; + + // Create the ToolTip with the TextBlock inside + ToolTip tt = new ToolTip(); + tt.Content = strToolTipContent; + return tt; + } + + /// + /// Useful if you want to know if the Mouse cursor is over the specified Wpf Window + /// (Uses windowsforms to do the calculations) + /// + /// true if the mouse cursor is over the specified form window, false otherwise + public static bool IsMouseCursorOverWPFormWindow(Window wpfWindow) + { + if (wpfWindow != null) + { + // Get the Point location of the mouse cursor + System.Drawing.Point point = System.Windows.Forms.Cursor.Position; + + // Get the rect for the Navigation Form + Point wpfFormLeftTopPoint = new Point(wpfWindow.Left, wpfWindow.Top); + Size wpfFormSize = new Size(wpfWindow.Width, wpfWindow.Height); + Rect rect = new Rect(wpfFormLeftTopPoint, wpfFormSize); + + // Return if the Mouse is over the Navigation Form + return (rect.Contains((double)point.X, (double)point.Y)); + } + return false; + } + + /// + /// For Dynamically Creating Text ComboBox Items + /// + /// Text Content to Display + /// object to tag to the menu item + /// + public static ComboBoxItem CreateAComboBoxItem(string strContent, object tag) + { + if (!String.IsNullOrEmpty(strContent) && (tag != null)) + { + ComboBoxItem item = new ComboBoxItem(); + item.Content = strContent; + item.Tag = tag; + return item; + } + return null; + } + + /// + /// For dynamically creating Image sources, this function helps you to create an image out of + /// a Resource Uri. You can then assign this image to a 'Source' property on an image wpf object + /// + /// a valid relative Resource Uri String to an image + /// the output image's desired height + /// the output image's desired width + /// + public static Image CreateWPFImageFromRelativeResourceUri(string strRelativeResourceUri, int ImageHeight, int ImageWidth) + { + if (!String.IsNullOrEmpty(strRelativeResourceUri)) + { + Image myImage = new Image(); + BitmapImage image = new BitmapImage(); + image.BeginInit(); + image.UriSource = new Uri(strRelativeResourceUri, UriKind.Relative); + image.EndInit(); + myImage.Stretch = Stretch.Fill; + myImage.Height = ImageHeight; + myImage.Width = ImageWidth; + myImage.Source = image; + return myImage; + } + return null; + } + + } +} diff --git a/GUILib/WPFHiddenWindow.cs b/GUILib/WPFHiddenWindow.cs new file mode 100644 index 0000000..c0fd561 --- /dev/null +++ b/GUILib/WPFHiddenWindow.cs @@ -0,0 +1,148 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Windows.Controls; +using System.Windows.Media.Imaging; +using System.Windows.Media; +using System.Windows; +using System.Windows.Interop; + +namespace Foo.GUILib +{ + /// + /// Class used to keep WPF Windows Hidden permanently. + /// Should be called by Performance WPF Window 'Hidden' loads + /// when constructed, and when loaded. + /// + /// Note: All WPFWindow's that use this class don't set certain properties on the + /// window until they are loaded and it's NOT a performance Cache window. + /// + public static class WPFHiddenWindow + { + private static Dictionary s_hWndToWindowMap = new Dictionary(); + + /// + /// * Core * 'Hiding' Function. Makes sure that the Window is and + /// stays hidden. + /// + /// a WPF window object + private static void HideWPFWindow(Window wpfWindow) + { + // Force Opacity + wpfWindow.WindowStyle = WindowStyle.None; + wpfWindow.Opacity = 0.0; + wpfWindow.ShowInTaskbar = false; + wpfWindow.ShowActivated = false; + + // Force a tiny Window in top-left corner + wpfWindow.Width = 5; + wpfWindow.Height = 5; + wpfWindow.Top = 0; + wpfWindow.Left = 0; + wpfWindow.WindowStartupLocation = WindowStartupLocation.Manual; + } + + /// + /// Call this to execute a Show() call on a wpfWindow Performance cache window. Returns true + /// if bPerformanceCache is true. This means that this Function did something to the window. + /// + /// a WPF window object + /// Pass in true, if this is a performance Cache window + /// true if bPerformanceCache is true, false otherwise + public static bool ExecuteShowOnAHiddenWindow(Window wpfWindow, bool bPerformanceCache) + { + if (bPerformanceCache) + { + HideWPFWindow(wpfWindow); + wpfWindow.Show(); + wpfWindow.Hide(); + return true; + } + return false; + } + + /// + /// Call this in your WPFWindow's constructor. Returns true if bPerformanceCache is true. + /// This means that this Function did something to the window. + /// + /// a WPF window object + /// Pass in true, if this is a performance Cache window + /// true if bPerformanceCache is true, false otherwise + public static bool HiddenWindowConstructor(Window wpfWindow, bool bPerformanceCache) + { + if (bPerformanceCache) + { + HideWPFWindow(wpfWindow); + return true; + } + return false; + } + + /// + /// Call this from your WPFWindow's OnLoad Event. Returns true if bPerformanceCache is true. + /// This means that this Function did something to the window. + /// + /// a WPF window object + /// Pass in true, if this is a performance Cache window + /// true if bPerformanceCache is true, false otherwise + public static bool HiddenWindowOnLoad(Window wpfWindow, bool bPerformanceCache) + { + if (bPerformanceCache) + { + HideWPFWindow(wpfWindow); + + // Add Message Hook for performanceCache WPForm * To make sure it is always invisible * + WindowInteropHelper interop = new WindowInteropHelper(wpfWindow); + HwndSource source = HwndSource.FromHwnd(interop.Handle); + source.AddHook(new HwndSourceHook(MessageHook)); + s_hWndToWindowMap[interop.Handle] = wpfWindow; + return true; + } + return false; + } + + /// + /// Call this from your WPFWindow's Closing Event. Returns true if bPerformanceCache is true. + /// This means that this Function did something to the window. + /// + /// a WPF window object + /// Pass in true, if this is a performance Cache window + /// true if bPerformanceCache is true, false otherwise + public static bool HiddenWindowClosing(Window wpfWindow, bool bPerformanceCache) + { + if (s_hWndToWindowMap.ContainsValue(wpfWindow)) + { + foreach (IntPtr hWnd in s_hWndToWindowMap.Keys) + { + if (s_hWndToWindowMap[hWnd] == wpfWindow) + { + s_hWndToWindowMap.Remove(hWnd); + break; + } + } + return true; + } + return false; + } + + /// + /// This Message Hook is for the Hidden wpfForm that we use for better performance, + /// We want to make sure that it is never displayed *It can occur that explorer.exe can show it, without this hook* + /// ~i.e. when explorer.exe crashes, and get's restarted + /// + private static IntPtr MessageHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) + { + // Get the Proper WPF Object and make sure it is Hidden + if (s_hWndToWindowMap.ContainsKey(hwnd)) + { + Window wpfWindow = s_hWndToWindowMap[hwnd]; + if (wpfWindow != null) + HideWPFWindow(wpfWindow); + } + + handled = false; + return System.IntPtr.Zero; + } + } +} diff --git a/GUILib/app.config b/GUILib/app.config new file mode 100644 index 0000000..b7db281 --- /dev/null +++ b/GUILib/app.config @@ -0,0 +1,3 @@ + + + diff --git a/Hooks/ButtonHook/ButtonHook.cpp b/Hooks/ButtonHook/ButtonHook.cpp new file mode 100644 index 0000000..1396732 --- /dev/null +++ b/Hooks/ButtonHook/ButtonHook.cpp @@ -0,0 +1,1153 @@ +// This is the main DLL file. + +#include "stdafx.h" +#define DLLAPI_BUTTON_HOOK +#include "ButtonHook.h" +#include + +using namespace Ooganizer; + +#ifdef _DEBUG + #import "..\\..\\Target\\Debug\\Settings.tlb" raw_interfaces_only +#else + #import "..\\..\\Target\\Release\\Settings.tlb" raw_interfaces_only +#endif +using namespace Settings; + +#ifdef _DEBUG + #import "..\\..\\Target\\Debug\\Platform.tlb" raw_interfaces_only +#else + #import "..\\..\\Target\\Release\\Platform.tlb" raw_interfaces_only +#endif +using namespace Platform; + +#ifdef _DEBUG + #import "..\\..\\Target\\Debug\\ButtonWPForm.tlb" +#else + #import "..\\..\\Target\\Release\\ButtonWPForm.tlb" +#endif +using namespace ButtonWPForm; + +//// +// ***** What type of Windows should have the Button ***** +//// +const DWORD WS_STYLES_TO_TEST_FOR = WS_CAPTION | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU; + +//// +// ***** Top-Level Dialogs ***** +//// +const DWORD WS_STYLES_TO_TEST_FOR_DIALOGS = WS_SYSMENU | WS_POPUP; + +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Macros and typedefs +//******************************************************************** +////////////////////////////////////////////////////////////////////// + +#define MSG_HOOK ( L"MSG_HOOK" ) +#define MSG_UNHOOK ( L"MSG_UNHOOK" ) + +//// +// Each DLL instance (All Instances) need to keeps track of the following +// Data members (these end up being the same values so no need to put them into the DS) +//// +HINSTANCE s_hModule = NULL; +UINT m_WMHook = NULL; +UINT m_WMUnHook = NULL; + +// enum to send MSG_HOOK and MSG_UNHOOK +typedef enum _MSG{_MSG_HOOK,_MSG_UNHOOK} MSG_; + +//// +// Each DLL instance (All instances not just the once whose window, +// we'll hook into) will hold a pointer to it's own +// CWHPaccess Object. (allowing it access to the Shared Data Segment) +//// +CWHPaccess* s_ButtonHookAccess = NULL; + +//// +// Each DLL instanc needs to keep track of it's recently closed windows +//// +#define NCLOSES_TO_TRACK 25 +// timeout values, we need to ignore activate messages for nTime when +// we unhook to avoid rehooking again in processes that have multiple windows +const int IGNORE_ACTIVATE_MESSAGE_TIMEOUT_MS = 150; +struct RecentWindowsWTimeouts +{ + HWND hWnd; + DWORD dwTimeInserted; +}; +RecentWindowsWTimeouts s_hRecentClosedWindows[NCLOSES_TO_TRACK] = {NULL,NULL}; +UINT s_HRecentListI = 0; + +////////////////////////////////////////////////////////////////////// +// Func: InsertRecentClosedWindow() +// Desc: Insert a recently closed window +////////////////////////////////////////////////////////////////////// +void InsertRecentClosedWindow(HWND hWnd) +{ + RecentWindowsWTimeouts recent; + recent.hWnd = hWnd; + recent.dwTimeInserted = GetTickCount(); + + s_hRecentClosedWindows[s_HRecentListI] = recent; + s_HRecentListI = s_HRecentListI + 1; + + if(s_HRecentListI == NCLOSES_TO_TRACK) + s_HRecentListI = 0; +} +////////////////////////////////////////////////////////////////////// +// Func: FindRecentClosedWindow() +// Desc: Find a recently closed window +////////////////////////////////////////////////////////////////////// +BOOL FindRecentClosedWindow(HWND hWnd) +{ + DWORD dwTickCount = GetTickCount(); + for (UINT i = 0; i < s_HRecentListI; ++i) + { + if(s_hRecentClosedWindows[i].hWnd == hWnd) + { + DWORD diffTime = dwTickCount - s_hRecentClosedWindows[i].dwTimeInserted; + if(diffTime < IGNORE_ACTIVATE_MESSAGE_TIMEOUT_MS) + return true; + else + return false; + } + } + return false; +} +bool IsAWindowToHookInto(HWND hwnd); +////////////////////////////////////////////////////////////////////// +// Func: EnumProc() +// Desc: Hook/Unhook all top level windows. Called for every top-level +// Window on the screen. +// +// Prms: lParam, if true send Hook Message, false send UnHook Msg +// +// Retr: TRUE, always +////////////////////////////////////////////////////////////////////// +BOOL CALLBACK EnumProc( HWND hWnd, LPARAM lParam ) +{ + switch (lParam) + { + case _MSG_HOOK: + if((m_WMHook >= 0xC000) && (m_WMHook <= 0xFFFF) && + (IsAWindowToHookInto(hWnd))) + { + log(LOGGING_DEBUG, L"Sending m_WMHook to hWnd %u Msg %u", hWnd, m_WMHook); + SendMessage( hWnd, m_WMHook, 0, 0 ); + } + break; + + case _MSG_UNHOOK: + if((m_WMUnHook >= 0xC000) && (m_WMUnHook <= 0xFFFF) && + /* Check if Window is hooked into */ + ( s_ButtonHookAccess->FindHookedWnd(hWnd) == TRUE )) + { + log(LOGGING_DEBUG, L"Sending m_WMUnHook to hWnd %u Msg %u", hWnd, m_WMHook); + SendMessage( hWnd, m_WMUnHook, 0, 0 ); + } + break; + + default: + break; + } + + return TRUE; +} +////////////////////////////////////////////////////////////////////// +// Func: GetProcessNameFromPID() +// Retr: Returns the process name in the buffer and true if everything went well, +// false otherwise. +////////////////////////////////////////////////////////////////////// +bool GetProcessNameFromHWND(HWND hwnd, wchar_t strProcessNameBuf[MAX_PATH + 1]) +{ + DWORD pid = NULL; + GetWindowThreadProcessId(hwnd,&pid); + HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid ); + + // Get the process name + if (NULL != hProcess ) + GetModuleBaseName( hProcess, NULL, strProcessNameBuf, (MAX_PATH + 1)); + + CloseHandle(hProcess); + return true; +} +////////////////////////////////////////////////////////////////////// +// Func: IsWhiteListed() +// Desc: Function allows us to Blacklist certain windows to not be +// included when hooking the WinProcButton Hook. +// a Window can be whitelisted either on Title or Type, passed in +// thru the configuration +// +// Prms: hwnd, handle to a window we want to check +// +// Retr: true, if window is WhiteListed, false otherwise +////////////////////////////////////////////////////////////////////// +bool IsWhiteListed(HWND hwnd) +{ + wchar_t strBuf[MAX_PATH + 1] = {0}; + + if(GetProcessNameFromHWND(hwnd,strBuf)) + { + _wcsupr_s(strBuf,MAX_PATH); + if(s_ButtonHookAccess->IsAllowedProcessName(strBuf)) + return true; + } + + if (GetWindowText(hwnd,strBuf,MAX_PATH)) + { + _wcsupr_s(strBuf,MAX_PATH); + if(s_ButtonHookAccess->IsAllowedWindowsTitle(strBuf)) + return true; + } + + if(GetClassName(hwnd,strBuf,MAX_PATH)) + { + _wcsupr_s(strBuf,MAX_PATH); + if(s_ButtonHookAccess->IsAllowedWindowsClass(strBuf)) + return true; + } + + return false; +} +////////////////////////////////////////////////////////////////////// +// Func: IsFileOpenOrFileSaveAsDialog() +// Desc: We also hook into FileOpen and FileSaveAs Dialogs(), in order +// to do so we compare the window class +// +// Retr: true, if dialog is of a fileopen/filesaveas class, false otherwise +////////////////////////////////////////////////////////////////////// +bool IsFileOpenOrFileSaveAsDialog(HWND hwnd) +{ + wchar_t strBuf[MAX_PATH + 1] = {0}; + if(GetClassName(hwnd,strBuf,MAX_PATH)) + { + _wcsupr_s(strBuf); + if(lstrcmp(strBuf, L"#32770") == 0) + return true; + } + return false; +} +////////////////////////////////////////////////////////////////////// +// Strc: FileNameAndLocationStruct() +// Desc: We use this to pass out location and file name by EnumFileNameAndLocationProc +////////////////////////////////////////////////////////////////////// +struct FileNameAndLocationStruct +{ + wchar_t location[MAX_PATH + 1]; + wchar_t filename[MAX_PATH + 1]; + wchar_t filetypes[MAX_PATH + 1]; +}; +////////////////////////////////////////////////////////////////////// +// Func: EnumFileNameAndLocationProc() +// Desc: Iterate all child windows and extract FileName and FileLocation +// +// Prms: lParam, a FileNameAndLocationStruct* +// +// Retr: TRUE, always +////////////////////////////////////////////////////////////////////// +BOOL CALLBACK EnumFileNameAndLocationProc( HWND hWnd, LPARAM lParam ) +{ + wchar_t strWindowText[MAX_PATH + 1] = {0}; + wchar_t strClassName[MAX_PATH + 1] = {0}; + GetWindowText(hWnd, strWindowText, MAX_PATH); + GetClassName(hWnd, strClassName, MAX_PATH); + + bool bContinue = false; + // We only care about the following 3 window classes + // all others continue iteration + if((lstrcmp(L"Edit", strClassName) == 0) || + (lstrcmp(L"ComboBox", strClassName) == 0) || + (lstrcmp(L"ToolbarWindow32", strClassName) == 0)) + { + bContinue = true; + } + + // skip this window + if(!bContinue) + return TRUE; + + // passed in file struct pointer + FileNameAndLocationStruct* pstruct = (FileNameAndLocationStruct*) lParam; + + // Stop if there is no window text + if(lstrlen(strWindowText) <= 0) + return TRUE; + + // ignore any window texts that have an & + if(wcsstr(strWindowText, L"&")) + return TRUE; + + // * Good for Debugging * + //log(LOGGING_DEBUG, L"Found Window Text - %s ", strWindowText); + + // File Types Window Text (pass out in case it's needed later) + if(wcsstr(strWindowText, L"*.")) + { + log(LOGGING_DEBUG, L"Found FileType Text %s", strWindowText); + lstrcpy(pstruct->filetypes,strWindowText); + return TRUE; + } + + // Is this a location text + if(wcsstr(strWindowText, L": ")) // This could be very much English Windows Specific (or not?, should check) + { + // get the location of ": " + int i = 0; + wchar_t* pBegin = strWindowText; + for (; i < MAX_PATH; ++i) + { + if((*pBegin == L':') && (*(pBegin + 1) == L' ')) + { + pBegin = pBegin + 2; // start after the ": " + break; + } + ++pBegin; + } + + if(pBegin != NULL) + { + log(LOGGING_DEBUG, L"Found Location Text %s", pBegin); + lstrcpy(pstruct->location,pBegin); + } + return TRUE; + } + + // illegal file name characters + wchar_t* illegalfilechars = L"\\/:*?\"<>|"; + int illegalsize = lstrlen(illegalfilechars); + + if(wcsstr(strWindowText,L".")) + { + // check to see if string contains any illegal + // file name characters + for(int i = 0; i < illegalsize; ++i) + { + wchar_t c[2] = {0}; + c[0] = illegalfilechars[i]; + + // found illegal character, ignore string as file name + if(wcsstr(strWindowText,c)) + return TRUE; + } + + // Found a 100% file name string (it contains a '.') + log(LOGGING_DEBUG, L"Found FileName Text %s", strWindowText); + lstrcpy(pstruct->filename,strWindowText); + return TRUE; + } + else if(lstrlen(strWindowText) >= 1) + { + // check to see if string contains any illegal + // file name characters + for(int i = 0; i < illegalsize; ++i) + { + wchar_t c[2] = {0}; + c[0] = illegalfilechars[i]; + + // found illegal character, ignore string as file name + if(wcsstr(strWindowText,c)) + return TRUE; + } + + // Found a possible Most likely file name string (must not contain a '.') + log(LOGGING_DEBUG, L"Found FileName Text %s", strWindowText); + lstrcpy(pstruct->filename,strWindowText); + return TRUE; + } + + return TRUE; +} +////////////////////////////////////////////////////////////////////// +// Func: GetFileNameAndLocationStringValuesFromDialogWindow() +// Desc: Iterates through all the child windows and get the values we need +// and pass them back out +// +// Prms: hwnd, handle the fileOpen dialog +// pCallerObj, WPFCaller object where we will write the retrieved information to +////////////////////////////////////////////////////////////////////// +bool GetFileNameAndLocationStringValuesFromDialogWindow(HWND hwnd, WPFCaller* pCallerObj) +{ + // Iterate all child Windows and parse all the texts, the enum function + // will do all the work + if(hwnd && ::IsWindow(hwnd)) + { + // Clear any old values in the caller object + memset(pCallerObj->m_strFileNameLocationBuf, 0, sizeof(pCallerObj->m_strFileNameLocationBuf)); + memset(pCallerObj->m_strFileTypesBuf, 0, sizeof(pCallerObj->m_strFileTypesBuf)); + + // Create temporary object to hold values + FileNameAndLocationStruct filenameAndLocation; + memset(filenameAndLocation.filename, 0, sizeof(filenameAndLocation.filename)); + memset(filenameAndLocation.location, 0, sizeof(filenameAndLocation.location)); + memset(filenameAndLocation.filetypes, 0, sizeof(filenameAndLocation.filetypes)); + + // Try to Resolve + log(LOGGING_DEBUG, L"About to call EnumFileNameAndLocationProc (EnumChildWindows)"); + EnumChildWindows(hwnd, EnumFileNameAndLocationProc, (LPARAM) &filenameAndLocation ); + + // get resolving lengths + int nLen1 = lstrlen(filenameAndLocation.filename); + int nLen2 = lstrlen(filenameAndLocation.location); + int nLen3 = lstrlen(filenameAndLocation.filetypes); + + // Handle errors * Good for Debugging * + /* + if(nLen1 == 0) + log(LOGGING_DEBUG, L"Error resolving - FileName - FileOpen or FileSaveAs Dialog"); + if(nLen2 == 0) + log(LOGGING_DEBUG, L"Error resolving - FileLocation - FileOpen or FileSaveAs Dialog"); + if(nLen3 == 0) + log(LOGGING_DEBUG, L"Error resolving - FileTypes - FileOpen or FileSaveAs Dialog"); + */ + + // Something went wrong! no point moving on + if(nLen1 == 0 || nLen2 == 0 || nLen3 == 0) + return false; + + //// + // Now Copy out the values to the buffers of the caller object that was passed in + //// + lstrcpyn(pCallerObj->m_strFileNameLocationBuf, filenameAndLocation.location, MAX_PATH); + lstrcat(pCallerObj->m_strFileNameLocationBuf, L"\\"); + lstrcat(pCallerObj->m_strFileNameLocationBuf, filenameAndLocation.filename); + lstrcpyn(pCallerObj->m_strFileTypesBuf, filenameAndLocation.filetypes, MAX_PATH); + + // Log info to see what's going on + log(LOGGING_DEBUG, L"GetFileNameAndLocation setting m_strFileNameLocattionBuf to %s", pCallerObj->m_strFileNameLocationBuf); + log(LOGGING_DEBUG, L"GetFileNameAndLocation setting m_strFileTypesBuf to %s", pCallerObj->m_strFileTypesBuf); + return true; + + } + return false; +} +////////////////////////////////////////////////////////////////////// +// Func: IsAWindowToHookInto() +// Desc: Broad check to see if we want to hook into a window. +// Called by CallWndHookProc. +// Window on the screen. +// +// Prms: hwnd, handle to a window we want to check// +// +// Note: This function calls IsBlackListed() for more window exclusions. +// +// Retr: true, if window is should be hooked into, false otherwise +////////////////////////////////////////////////////////////////////// +bool IsAWindowToHookInto(HWND hwnd) +{ + DWORD dwStyle = GetWindowLong(hwnd, GWL_STYLE); + DWORD dwExStyle = GetWindowLong(hwnd, GWL_EXSTYLE); + + if ( /* top-raised windows */ + ( ( dwExStyle & WS_EX_WINDOWEDGE ) == WS_EX_WINDOWEDGE ) + + /* Styles to test for (named above) */ + && ( ( dwStyle & WS_STYLES_TO_TEST_FOR ) == WS_STYLES_TO_TEST_FOR ) + + /* Has no parent = top-level window */ + && ( GetParent(hwnd) == NULL ) + + /* Check if Window is not already hooked into*/ + && ( s_ButtonHookAccess->FindHookedWnd(hwnd) == FALSE ) + + /* Check if Window has not been recently closed in this process*/ + && ( FindRecentClosedWindow(hwnd) == FALSE ) + + // **** CUSTOM INCLUSION LIST **** + && ( IsWhiteListed(hwnd) ) + + // Make sure the window is visible to begin with * bug fix for ms word* + && ( ::IsWindowVisible(hwnd)) + ) + { + return true; + } + else if ( // We also want to hook into the FileOpen & FileSaveAs Dialog + + /* top-raised windows */ + ( ( dwExStyle & WS_EX_WINDOWEDGE ) == WS_EX_WINDOWEDGE ) + + /* Styles to test for (named above) */ + && ( ( dwStyle & WS_STYLES_TO_TEST_FOR_DIALOGS ) == WS_STYLES_TO_TEST_FOR_DIALOGS ) + + /* Has a parent = it is a top-level window with parent */ + && ( GetParent(hwnd) != NULL ) + + /* Check if Window's parent is hooked into */ + && ( s_ButtonHookAccess->FindHookedWnd(GetParent(hwnd)) == TRUE ) + + /* Check if Window is not already hooked into*/ + && ( s_ButtonHookAccess->FindHookedWnd(hwnd) == FALSE ) + + /* Check if Window has not been recently closed in this process*/ + && ( FindRecentClosedWindow(hwnd) == FALSE ) + + // **** CUSTOM INCLUSION LIST **** + && ( IsWhiteListed(GetParent(hwnd)) ) + + // Make sure the window's parent is visible to begin with * bug fix for ms word * + && ( ::IsWindowVisible(GetParent(hwnd))) + + // * We currently hook only into Top-Level FileOpen/SaveAs Dialogs + && ( IsFileOpenOrFileSaveAsDialog(hwnd) ) + ) + { + return true; + } + else + { + return false; + } +} +////////////////////////////////////////////////////////////////////// +// Func: HookWndProc() +// Desc: Function that implements the WndProc for every process that +// has the window we are looking for. This is code is shared within +// the process on every window in the system. +// +// Note: This function is just the WndProc() Implementation +// All we have to do is process it if we care for it or pass it down +// to the next hook (that may be in the system). +// +// Prms: hWnd, handle to window +// Msg, passed in message +// wParam, specifies additional message information +// lParam, specifies additional message information +// +// Retr: LRESULT, +////////////////////////////////////////////////////////////////////// +LRESULT CALLBACK MyWndProc( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ) +{ + // default return + LRESULT result = 0; + + // Get the HookWndItem Information + BLANK_HookWndItem(item); + item = s_ButtonHookAccess->GetHookedWndItem(hWnd); + + bool bCloseMsg = ((Msg == WM_NCDESTROY) || (Msg == WM_DESTROY) || (Msg == WM_CLOSE)); + if(bCloseMsg) + log(LOGGING_DEBUG, L"Received WM_NCDESTROY or DESTROY MESSAGE or WM_CLOSE for window %u", item.hWnd); + + // Is this is a Window that is hooked? --- Ignore FileOpen / SaveDialog (Deal with them below) + if((item.hWnd != NULL) && (hWnd == item.hWnd) && !IsFileOpenOrFileSaveAsDialog(item.hWnd)) + { + //// + // Create wpfcaller object for this Window, if it doesn't exist + // ~Every wpfcaller is mapped to a single HookWndItem + //// + if(item.wpfcaller == NULL) + { + log(LOGGING_DEBUG, L"Creating a wpfCaller Instance for window %u", item.hWnd); + item.wpfcaller = new WPFCaller(item, s_hModule); + } + + //// + // Case StopHook wants us to Unhook the WmProc Hook or + // the Window gets Closed + //// + if ( (Msg == m_WMUnHook) || bCloseMsg ) + { + log(LOGGING_MEDIUM, L"Received WMUnook or bCloseMsg message for window %u", item.hWnd); + + // No Longer need to monitor this Window + s_ButtonHookAccess->DeleteHookedWnd(item.hWnd); + InsertRecentClosedWindow(item.hWnd); + + // Unhook Our WndProc Procedure (put the old one back) + log(LOGGING_MEDIUM, L"Unhooking a Window %u from the HookWndProc", item.hWnd); + SetWindowLong(hWnd,GWL_WNDPROC,(LONG) item.DefWndProc); + + // Delete this Window's CaptionButton Object + if(item.wpfcaller != NULL) + { + log(LOGGING_DEBUG, L"Deleting a wpfCaller Instance for Window %u", item.hWnd); + delete item.wpfcaller; + } + + // Call the old WindProc to handle Close message + if(bCloseMsg) + result = CallWindowProc( item.DefWndProc, hWnd, Msg, wParam, lParam ); + } + // All other Messages + else + { + // FOR TESTING - Skip Handling of Messages (Below) + // result = CallWindowProc( item->DefWndProc, hWnd, Msg, wParam, lParam ); + try + { + // the wpfCaller Handles all other Messages + if(item.wpfcaller != NULL) + result = item.wpfcaller->OnDefault( hWnd, Msg, wParam, lParam); + else + result = CallWindowProc( item.DefWndProc, hWnd, Msg, wParam, lParam); + } + catch(...) + { + log(LOGGING_LOW, L"*Error* Occured calling WpfCaller->OnDefault()"); + } + } + } + else if((item.hWnd != NULL) && (hWnd == item.hWnd) && IsFileOpenOrFileSaveAsDialog(item.hWnd)) // Deal with FileOpen / FileSave Dialog Here + { + //// + // Case StopHook wants us to Unhook the WmProc Hook or + // the Window gets Closed + //// + if ( (Msg == m_WMUnHook) || bCloseMsg ) + { + log(LOGGING_DEBUG, L"FileOpenOrFileSaveDialog() Received WMUnook or bCloseMsg message for Window %u", item.hWnd); + + // No Longer need to monitor this Window + s_ButtonHookAccess->DeleteHookedWnd(item.hWnd); + InsertRecentClosedWindow(item.hWnd); + + // Unhook Our WndProc Procedure (put the old one back) + log(LOGGING_DEBUG, L"FileOpenOrFileSaveDialog() Unhooking from the HookWndProc for Window %u", item.hWnd); + SetWindowLong(hWnd,GWL_WNDPROC,(LONG) item.DefWndProc); + + // Call the old WindProc to handle Close message + if(bCloseMsg) + { + // Handle CLose Message + result = CallWindowProc( item.DefWndProc, hWnd, Msg, wParam, lParam ); + } + } + else if((Msg == WM_COMMAND) && (LOWORD(wParam) == 1)) // Received Ok or Open Button + { + log(LOGGING_DEBUG, L"Reveived Command Message from Dialog Button %u - Ok or Open Button",LOWORD(wParam)); + // First Let's get the WPFCaller Instance of the main window and let it know that this occured + BLANK_HookWndItem(itemTmp); + itemTmp = s_ButtonHookAccess->GetHookedWndItem(GetParent(hWnd)); + + if(itemTmp.hWnd != NULL && itemTmp.wpfcaller != NULL) + { + // we want to obtain the File Location & File Name & File Types from the Dialogs + // ~this is the whole point why we hooked into it + log(LOGGING_DEBUG, L"Calling GetFileNameAndLocationStringValuesFromDialogWindow()"); + if((GetFileNameAndLocationStringValuesFromDialogWindow(hWnd, itemTmp.wpfcaller)) && + (lstrlen(itemTmp.wpfcaller->m_strFileNameLocationBuf) > 0)) + { + log(LOGGING_DEBUG, L"About to post WM_CLIENT_EVENT_OPENFILEORSAVEASDIALOGOCCURED to WPFCallerThread"); + log(LOGGING_DEBUG, L"Found FileNameLocation - %s", itemTmp.wpfcaller->m_strFileNameLocationBuf); + log(LOGGING_DEBUG, L"Found FileTypes - %s", itemTmp.wpfcaller->m_strFileTypesBuf); + + // Post to the WPFCallerThread that this Event Occured + // WM_CLIENT_EVENT_OPENFILEORSAVEASDIALOGOCCURED (WM_USER + 808) + PostThreadMessage(itemTmp.wpfcaller->m_threadID, (WM_USER + 808),0,0); + } + else + { + // This should resolve now since we are looking only for command id 1 + log(LOGGING_LOW, L"FileOpenOrFileSaveDialog() Error - GetFileNameAndLocationStringValuesFromDialogWindow Failed!"); + } + } + else + { + log(LOGGING_LOW, L"FileOpenOrFileSaveDialog() Error - Couldn't fetch Parents WPFCaller object - skipping file resolution"); + } + } + + // Forward all Messages + result = CallWindowProc(item.DefWndProc, hWnd, Msg, wParam, lParam); + } + + return result; +} +////////////////////////////////////////////////////////////////////// +// Func: CallWndHookProc() +// Desc: Function that will replace the normal WndProc with the HookWndProc +// procedure. It will do that for every process on the system that +// has a window. It will assign the function HookWndProc() +// +// Prms: nCode [in] = if == HC_ACTION CallWndHookProc must process the message +// wParam [in] = specifies if message is send by current process +// non-zero if it is current process, null otherwise +// LPARAM [in] = pointer to a CWPRETSTRUCT that contains details about the message +// +// Note: see MSDN for CallWndRetProc Function passed in with SetWindowHookEx +// ~We don't check wParam (pass directly thru) because we want to process all messages +// for all processes and don't care where it originates +// +// IMP!: In this function we check the Window and decide whether to display the button or not +// ~!IMP) WH_CALLWNDPROC hook is called in the context of the thread that calls SendMessage +// +// Retr: LRESULT, +////////////////////////////////////////////////////////////////////// +LRESULT WINAPI CallWndHookProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + + if (nCode == HC_ACTION) + { + LPCWPSTRUCT pCwp = (LPCWPSTRUCT) lParam; + + // Do we care about this Window?, We don't want to hook into all Windows + if(IsAWindowToHookInto(pCwp->hwnd)) + { + // Do we care about this Message? + if((pCwp->message == m_WMHook) /* We'll receive the Hook Message StartButtonHook is called */ + || (pCwp->message == WM_NCACTIVATE) /* Activates & deactivates a window, caption is redrawn. */ + || (pCwp->message == WM_CREATE) /* A new window is being created */ + || (pCwp->message == WM_ACTIVATE) /* a window is being activated */ + || (pCwp->message == WM_PAINT) /* I added this after figguring out that drag n' droped files don't trigger above messages */ + || (pCwp->message == WM_NCPAINT) /* Same as for WM_PAINT */ + ) + { + + // Log that we are hooking into a FileOpen Or FileSaveAsDialog + if(IsFileOpenOrFileSaveAsDialog(pCwp->hwnd)) + log(LOGGING_DEBUG, L"FileOpenOrFileSaveDialog() We are hooking into a FileOpen or FileSaveDialog"); + + // Create a hook Item, We are ready to hook into this Window + HookWndItem item; + + // hWnd = the handle to the current window + // DefWndProc = handle of the this window procedure (the address that is replaced by our Hook Function) + // HookWndProc = the address of this DLL instance's HookWndProc Function + item.hWnd = pCwp->hwnd; + item.DefWndProc = reinterpret_cast(GetWindowLong(pCwp->hwnd,GWL_WNDPROC)); + item.HookWndProc = MyWndProc; + item.wpfcaller = NULL; // The Caption Button will be initialized by MyHookWnd + + // Add the hook Item to the Global List + s_ButtonHookAccess->InsertHookedWndItem(item); + + //// + // ********************** INSTALL THE NEW WNDHOOK_PROCEDURE ********************** + // ******************************************************************************* + // GWL_WNDPROC - Sets a new address for the window procedure (WinProc()) + // Windows NT/2000/XP: You cannot change this attribute if the window does not + // belong to the same process as the calling thread. */The hook is responsible for + // putting the .dll into the memoryspace of every process. This Dll iterates thru + // all the Windows and right here hooks into the WndProc + //// + log(LOGGING_LOW, L"Installing HookWndProc for Window %u", pCwp->hwnd); + + // We have to call SetWindowLongPtr to install the WNDPROC. Not doins so causes + // our UnHook message to never be received by the Hooked Wnd + int result = SetWindowLongPtr( pCwp->hwnd, GWL_WNDPROC, (LONG) MyWndProc ); + } + } + } + + // We now pass in our Hook Handle down the current hook chain (in case other hooks are listening) + return (CallNextHookEx( s_ButtonHookAccess->get_hHook(), nCode, wParam, lParam )); +} +////////////////////////////////////////////////////////////////////// +// Func: Helper_ReadSafeArrayIntoWCharArr() +// Desc: Small Helper function to quickly read a SafeArray Into a WChar Array +// +// Prms: +pDes, char destination buffer to copy into +// -size, passes out the size of the safearray +// +pSrc, the Safearray source to copy from +// +// Note: Not much safety checking going on. Make sure the buffer has enough space! +// ~also only 1 dimensional arrays/safearrays work +// +// IMP!: MAX_PATH is the ultimate Max of size and elements of the pDest Buffer +////////////////////////////////////////////////////////////////////// +void Helper_ReadSafeArrayIntoWCharArr(wchar_t pDes[MAX_PATH][MAX_PATH],UINT& size,SAFEARRAY* pSrc) +{ + try + { + // this func only handles 1-dim arrays/safearrays + const int ONE_DIMENSIONAL = 1; + + long lUBound = 0; + long lLBound = 0; + SafeArrayGetLBound(pSrc, ONE_DIMENSIONAL, &lLBound); + SafeArrayGetUBound(pSrc, ONE_DIMENSIONAL, &lUBound); + + BSTR* pBSTR; + SafeArrayAccessData(pSrc, (void**) &pBSTR); + for (long n = lLBound; ((n <= lUBound) && (n < MAX_PATH)); ++n) + { + _bstr_t bstr(pBSTR[n], true); + lstrcpyn(&pDes[n][0],(wchar_t*) bstr , MAX_PATH); + } + SafeArrayUnaccessData(pSrc); + + // pass out the size + size = lUBound - lLBound + 1; + + // pSrc was empty so set size to 0 + if((size == 1) && (pDes[0][0] == 0)) + size = 0; + } + catch(...) + { + return; + } +} +////////////////////////////////////////////////////////////////////// +// Func: ReadOoganizerSettings() +// Desc: Calls OoganizerSettings COM Object to read in all the settings +// into our SharedDS. +// +// These are the important settings we need like Logging details, +// What windows to hook into, what window classes, and even +// window layout as well as debugging options +// +// Retr: true, if settings were read, false otherwise +////////////////////////////////////////////////////////////////////// +bool ReadOoganizerSettings() +{ + try + { + IOoganizerSettingsPtr pSettings(__uuidof(OoganizerSettingsAcc)); + + // Read Configuration File + _configurationPtr config = NULL; + if(FAILED(pSettings->ReadConfigXMLFile(&config))) + return false; + + // Get ButtonHook Settings + _ButtonHookSettingsPtr buttonhookSettings = NULL; + if(FAILED(config->get_ButtonHook(&buttonhookSettings))) + return false; + + // Let's do that First! ~Imp! Get/Set LogPath & Debug Settings + _bstr_t LogPath; + _LoggingSettingsPtr logSettings; + buttonhookSettings->get_LogSettings(&logSettings); + logSettings->get_LogPath(LogPath.GetAddress()); + s_ButtonHookAccess->SetLogPath((wchar_t*) LogPath); + log(LOGGING_DEBUG, L"Setting Log Path: %s", (wchar_t*) LogPath); + + // Logging Detail + unsigned long nLoggingDetail = 0; + logSettings->get_LoggingDetail(&nLoggingDetail); + s_ButtonHookAccess->SetLoggingDetail(static_cast(nLoggingDetail)); +#ifdef _DEBUG + log(LOGGING_DEBUG, L"Setting Log Detail: 4 (DEBUG)", nLoggingDetail); +#else + log(LOGGING_DEBUG, L"Setting Log Detail: %u", nLoggingDetail); +#endif + + //// + // Now set this instance's Logging option + //// + SetLoggingDetail(s_ButtonHookAccess->GetLoggingDetail(),s_ButtonHookAccess->GetLogPath()); + + SAFEARRAY* safeArray; + + // Get AllowedProcessNames + _AllowedProcessNamesWPtr processNames; + buttonhookSettings->get_AllowedProcessNames(&processNames); + processNames->get_ProcessName(&safeArray); + Helper_ReadSafeArrayIntoWCharArr(s_ButtonHookAccess->ALLOWED_PROCESS_NAMES,s_ButtonHookAccess->NUMBER_OF_ALLOWED_PROCESS_NAMES,safeArray); + + // log values + if(s_ButtonHookAccess->NUMBER_OF_ALLOWED_PROCESS_NAMES) + { + for (UINT i = 0; i < s_ButtonHookAccess->NUMBER_OF_ALLOWED_PROCESS_NAMES; ++i) + log(LOGGING_DEBUG, L"AllowedProcessName: %s", s_ButtonHookAccess->ALLOWED_PROCESS_NAMES[i]); + } + + // Get AllowedWindowTitles + _AllowedWindowTitlesWPtr windowTitles; + buttonhookSettings->get_AllowedWindowTitles(&windowTitles); + windowTitles->get_WindowTitle(&safeArray); + Helper_ReadSafeArrayIntoWCharArr(s_ButtonHookAccess->ALLOWED_WINDOW_TITLES,s_ButtonHookAccess->NUMBER_OF_ALLOWED_WINDOW_TITLES,safeArray); + + // log values + if(s_ButtonHookAccess->NUMBER_OF_ALLOWED_WINDOW_TITLES) + { + for (UINT i = 0; i < s_ButtonHookAccess->NUMBER_OF_ALLOWED_WINDOW_TITLES; ++i) + log(LOGGING_DEBUG, L"AllowedWindowTitle: %s", s_ButtonHookAccess->ALLOWED_WINDOW_TITLES[i]); + } + + // Get AllowedWindowClasses + _AllowedWindowClassesWPtr windowClasses; + buttonhookSettings->get_AllowedWindowClasses(&windowClasses); + windowClasses->get_WindowClass(&safeArray); + Helper_ReadSafeArrayIntoWCharArr(s_ButtonHookAccess->ALLOWED_WINDOW_CLASSES,s_ButtonHookAccess->NUMBER_OF_ALLOWED_WINDOW_CLASSES,safeArray); + + // log values + if(s_ButtonHookAccess->NUMBER_OF_ALLOWED_WINDOW_CLASSES) + { + for (UINT i = 0; i < s_ButtonHookAccess->NUMBER_OF_ALLOWED_WINDOW_CLASSES; ++i) + log(LOGGING_DEBUG, L"AllowedWindowClass: %s", s_ButtonHookAccess->ALLOWED_WINDOW_CLASSES[i]); + } + return true; + } + catch(...) + { + return false; + } +} +////////////////////////////////////////////////////////////////////// +// Func: SystemMetricsTesterHELPER() +// Desc: Use this for Debugging only when you need to know certain system metrics values +////////////////////////////////////////////////////////////////////// +void SystemMetricsTesterHELPER() +{ + int k = 0; + k = GetSystemMetrics(SM_CXEDGE); //2 on vista + k = GetSystemMetrics(SM_CYEDGE); //2 on vista + + k = GetSystemMetrics(SM_CXFRAME); //8 on vista + k = GetSystemMetrics(SM_CYFRAME); //8 on vista + + k = GetSystemMetrics(SM_CXFIXEDFRAME); //3 on vista + k = GetSystemMetrics(SM_CYFIXEDFRAME); //3 on vista + + k = GetSystemMetrics(SM_CXMIN); //124 on vista + k = GetSystemMetrics(SM_CYMIN); //36 on vista + + k = GetSystemMetrics(SM_CXBORDER); // 1 on vista + k = GetSystemMetrics(SM_CYBORDER); // 1 on vista + + k = GetSystemMetrics(SM_CXSIZE); //32 on vista + k = GetSystemMetrics(SM_CYSIZE); //19 on vista + + k = GetSystemMetrics(SM_CYCAPTION); //20 on vista + //k = GetSystemMetrics(SM_CXCAPTION); + + k = GetSystemMetrics(SM_CYSMCAPTION); //18 on vista + //k = GetSystemMetrics(SM_CXSMCAPTION); + + k = GetSystemMetrics(SM_CYSMSIZE); //17 on vista + k = GetSystemMetrics(SM_CXSMSIZE); //17 on vista +} +////////////////////////////////////////////////////////////////////// +// Func: StartWinProcButtonHook() +// Desc: Exported DLL function to allow a process to start/attach +// the system WinProcButtonhook. This function will attach the WinProc function +// to the process's window via the CallWndHookProc() function +// +// Note: We'll check if the system is supported here. We'll only allow +// to start the hook, if that is the case +// +// Retr: TRUE, if succesfully attached, FALSE otherwise (i.e. OS NOT SUPPORTED) +////////////////////////////////////////////////////////////////////// +BOOL WINAPI StartButtonHook() +{ + // Debugging ONLY when we need certain values (comment/uncomment) + //SystemMetricsTesterHELPER(); + + // Let's try to see if we can force a rehook + bool bThereWasAnExistingHook = false; + if(s_ButtonHookAccess->get_hHook() != NULL) + { + s_ButtonHookAccess->set_hHook(NULL); + bThereWasAnExistingHook = true; + } + + // Global doesn't exist, we can start + if(s_ButtonHookAccess->get_hHook() == NULL) + { + // Delete All Shared Data Hook Data - Just in case previous DLL Instance corrupted HookData + s_ButtonHookAccess->ClearHookSData(); + + // Don't start ButtonHook unless the OS supports it + VARIANT_BOOL bIsSupported; + _EnvironmentCCWPtr env(__uuidof(EnvironmentCCW)); + env->IsWindowsOSSupported(&bIsSupported); + + if(bIsSupported == -1) // TRUE + { + bool bSettings = ReadOoganizerSettings(); + clearLog(); // Start Fresh (with a new Log) + + // We won't be able to log until we have read in the settings + if(bThereWasAnExistingHook) + log(LOGGING_LOW, L"A previous ButtonHook Existed - overwriting it"); + + if(!bSettings) + log(LOGGING_LOW, L"ReadOoganizerSettings Failed!"); + else + log(LOGGING_MEDIUM, L"ReadOoganizerSettings Succeeded"); + + // There really is no sense to start ButtonHook with no Settings Info + if(bSettings) + { + log(LOGGING_LOW, L"StartButtonHook Called()"); + + // Create/Store Global Hook (every instance needs access to this HOOK) + // ~WH_CALLWNDPROC hook is called in the context of the thread that calls SendMessage + log(LOGGING_DEBUG, L"Setting the Windows Hook"); + HHOOK hook = SetWindowsHookEx( WH_CALLWNDPROC, CallWndHookProc, s_hModule, 0 ); + + if(hook == NULL) + { + log(LOGGING_LOW, L"Windows Hook Failed error %i", GetLastError()); + return FALSE; + } + else + { + // Assign the hook value to the Global DS + log(LOGGING_DEBUG, L"Windows Hook Succeeded Hook Set %i", hook); + s_ButtonHookAccess->set_hHook(hook); + } + + // Send Hook Msg - This forces all windows already open in the system and that + // we want to hook into to load the captionbutton + + if(m_WMHook >= 0xC000 && m_WMHook <= 0xFFFF) + { + log(LOGGING_DEBUG, L"StartButtonHook - About to call EnumWindows"); + EnumWindows( EnumProc, _MSG_HOOK ); + log(LOGGING_LOW, L"StartButtonHook EnumWindows Returns - Everything is O.K."); + } + else + { + log(LOGGING_LOW, L"Registered Message m_WMHook is invalid - something is terribly wrong"); + return FALSE; + } + + return TRUE; + } + } + } + return FALSE; +} +////////////////////////////////////////////////////////////////////// +// Func: StopWinProcButtonHook() +// Desc: Exported DLL function to allow a process to stop/deattach +// the WinProcButton system hook +// +// Retr: TRUE, if succesfully deattached, FALSE otherwise +////////////////////////////////////////////////////////////////////// +BOOL WINAPI StopButtonHook() +{ + // Global does exist, we can exit + if(s_ButtonHookAccess->get_hHook() != NULL) + { + // Send UnHook Msg + if(m_WMUnHook >= 0xC000 && m_WMUnHook <= 0xFFFF) + { + log(LOGGING_LOW, L"StopButtonHook Called()"); + EnumWindows( EnumProc, _MSG_UNHOOK ); + log(LOGGING_LOW, L"StopButtonHook() EnumWindows Returns - Everything is O.K."); + } + else + { + log(LOGGING_LOW, L"Registered Message m_WMUnHook is invalid - something is terribly wrong"); + return FALSE; + } + + try + { + // now we can exit + if ( UnhookWindowsHookEx( s_ButtonHookAccess->get_hHook() ) != 0 ) + { + log(LOGGING_MEDIUM, L"Successfully Unhooked Hook %i", s_ButtonHookAccess->get_hHook()); + } + else + { + log(LOGGING_LOW, L"Error Occrured in StopButtonHook %i", GetLastError()); + return FALSE; + } + + // Reset Global Hook - Delete All Shared Data + log(LOGGING_HIGH, L"Reset Global Hook & Clearing ALL Hook Related Data"); + s_ButtonHookAccess->set_hHook(NULL); + s_ButtonHookAccess->ClearHookSData(); + + // New Code: ~errors out~ Unregister all Window Classes here (used to be done in ~WPFCaller()) + /*if(!UnregisterClass(L"W32ButtonHookWndClass", s_hModule)) + log(LOGGING_DEBUG, L"Error occured for UnregisterClass W32ButtonHookWndClass");*/ + } + catch(...) + { + log(LOGGING_LOW, L"Error occured in StopButtonHook"); + return FALSE; + } + return TRUE; + } + return FALSE; +} +////////////////////////////////////////////////////////////////////// +// Func: IsButtonHookSet() +// Desc: Exported DLL function to allow a caller to know if the buttonhook +// is set or not +// +// Retr: TRUE, if Hook is attached, FALSE otherwise +////////////////////////////////////////////////////////////////////// +BOOL WINAPI IsButtonHookSet() +{ + return (s_ButtonHookAccess->get_hHook() != NULL); +} +////////////////////////////////////////////////////////////////////// +// Func: GetAllHookedWindowHandles() +// Desc: Exported DLL function to allow a caller to retrieve all Hooked +// Window Handles. +// ~passed in pBuf must be at least of size MAX_PATH +// +// Retr: int, returns the size of the passed out pBuf list +////////////////////////////////////////////////////////////////////// +int WINAPI GetAllHookedWindowHandles(int* pBuf) +{ + if(s_ButtonHookAccess->get_hHook() != NULL) + { + int buf[MAX_PATH] = {0}; + int nsize = 0; + s_ButtonHookAccess->GetHookedWindowListNSize(buf,&nsize); + + //// + // there could be nulls in the buf, so filter them out, + // to return a complete list the caller. Copy only Non-Null + // values to the output buffer * and ONLY EXISTING WINDOWS * + //// + int nNullsOrInvalid = 0; + for(int i = 0; i < nsize; ++i) + { + if(buf[i] != NULL && ::IsWindow((HWND) buf[i])) + *(pBuf + i) = buf[i]; + else + ++nNullsOrInvalid; + } + + // return the adjusted size, if needed + log(LOGGING_DEBUG, L"GetAllHookedWindowHandles() got called returning WindowHandles Buf size of %u", (nsize - nNullsOrInvalid)); + return (nsize - nNullsOrInvalid); + } + return 0; +} +////////////////////////////////////////////////////////////////////// +// Func: DllMain() +// Desc: Dll Main Entry Point - The DLL is being attached to every +// process in the system! ~therefore it must be fast. Also +// we can't start the main register hook function from here +// system call from here. (because this dll get loaded many times, +// we only however want the system hook code to be called only once. +// +// Note: Attaching the dll will cause MSG_HOOK to be registred +// +// Retr: TRUE, always +////////////////////////////////////////////////////////////////////// +BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) +{ + + switch ( ul_reason_for_call ) + { + case DLL_PROCESS_ATTACH: + + // This is to access DS segment's Hook Information, + // Across all instances of this DLL. + s_ButtonHookAccess = new CWHPaccess(); + + // Store local Module Handle + s_hModule = (HINSTANCE) hModule; + + // message is used to send to all windows when the HOOK attaches + m_WMHook = RegisterWindowMessage( MSG_HOOK ); + + // message is used to send to all windows when the HOOK unattaches + m_WMUnHook = RegisterWindowMessage( MSG_UNHOOK ); + + // get the shared setting logging information and store it into this instance + SetLoggingDetail(s_ButtonHookAccess->GetLoggingDetail(), s_ButtonHookAccess->GetLogPath()); + + break; + case DLL_PROCESS_DETACH: + case DLL_THREAD_DETACH: + case DLL_THREAD_ATTACH: + default: + break; + } + + return TRUE; +} \ No newline at end of file diff --git a/Hooks/ButtonHook/ButtonHook.h b/Hooks/ButtonHook/ButtonHook.h new file mode 100644 index 0000000..0264782 --- /dev/null +++ b/Hooks/ButtonHook/ButtonHook.h @@ -0,0 +1,17 @@ +// ButtonHook.h +#pragma once +#include "CWHPaccess.h" + +#ifdef DLLAPI_BUTTON_HOOK +#define ENTRY_FUNCTION extern "C" _declspec(dllexport) +#else +#define ENTRY_FUNCTION extern "C" _declspec(dllimport) +#endif + +//// +// Entry-Point (Exposed)Functions +//// +ENTRY_FUNCTION BOOL WINAPI StartButtonHook(void); +ENTRY_FUNCTION BOOL WINAPI StopButtonHook(void); +ENTRY_FUNCTION BOOL WINAPI IsButtonHookSet(void); +ENTRY_FUNCTION int WINAPI GetAllHookedWindowHandles(int* pBuf); diff --git a/Hooks/ButtonHook/ButtonHook.vcproj b/Hooks/ButtonHook/ButtonHook.vcproj new file mode 100644 index 0000000..7c4a7bc --- /dev/null +++ b/Hooks/ButtonHook/ButtonHook.vcproj @@ -0,0 +1,236 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Hooks/ButtonHook/ButtonStrategy.cpp b/Hooks/ButtonHook/ButtonStrategy.cpp new file mode 100644 index 0000000..91024c9 --- /dev/null +++ b/Hooks/ButtonHook/ButtonStrategy.cpp @@ -0,0 +1,390 @@ +#include "StdAfx.h" +#include "ButtonStrategy.h" +//#include "HiddenWindow.h" // for Some Strategies we need to create + // a hidden window and draw the buttons on it + +//// +// We are delay-loading the UXTheme.dll. In case we are running on +// a system where the dll doesn't exist, we'll only load it we know +// that this is a system where it should exist +//// +#include "uxtheme.h" +//// +// We are delay-loading the DWMapi.dll. In case we are running on +// a system where the dll doesn't exist, we'll only load it we know +// that this is a system where it should exist +//// +#include "dwmapi.h" + +using namespace Ooganizer; + +//******************************************************************** +// Clss ButtonStrategy +// +// Programmer Daniel Romischer +// Ooganizer Development Team +// +// Description Base/Abstract Class for all Button Strategies +// +// Note CalcCaptionRect() and CalcCaptionButtonRect() +// is implemented in the base class for now (as it appears +// to be the same calculation for all Button Strategies). +// +// Created 06-01-2008 +//******************************************************************** +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Construction / Destruction +//******************************************************************** +////////////////////////////////////////////////////////////////////// +ButtonStrategy::ButtonStrategy(void) +{ +} +ButtonStrategy::~ButtonStrategy(void) +{ +} +////////////////////////////////////////////////////////////////////// +// Func: CalcCaptionRect() +// Desc: Calculates the dimensions of the Caption Bar +// +// Prms: +hWnd, handle to a Windows +// +-Rect, returns the x,y RECT area dimension coordinates of the caption bar +// +-SIZE, returns the width and height of the Caption bar +////////////////////////////////////////////////////////////////////// +void ButtonStrategy::CalcCaptionRect(HWND hWnd, RECT &RectCaption, SIZE &heightNwidth)const +{ + RECT Rect; + SIZE sFrame; + DWORD dStyle = GetWindowLong( hWnd, GWL_STYLE ); + + // Get frame size of window + // (x and y height width dim of the resizable or non-resizable windows frame) + sFrame.cy = GetSystemMetrics( ( dStyle & WS_THICKFRAME ) ? SM_CYSIZEFRAME : SM_CYFIXEDFRAME ); + sFrame.cx = GetSystemMetrics( ( dStyle & WS_THICKFRAME ) ? SM_CXSIZEFRAME : SM_CXFIXEDFRAME ); + + // Gets the location of the Window + GetWindowRect( hWnd, &Rect ); + + // Height and Width of the Window + LONG height = Rect.bottom - Rect.top; // Window height not intersting to us (not used) + LONG width = Rect.right - Rect.left; + + // Pass the CaptionBar Dimension out + RectCaption.top = sFrame.cy; // 4, 8 + RectCaption.left = sFrame.cx; // 4, 8 + RectCaption.right = width - sFrame.cy; // 771 + + // SM_CYCAPTION = The height of a caption area, in pixels + // SM_CYBORDER = The height of a window border + int heightCaption = GetSystemMetrics( SM_CYCAPTION ); // 20 + int heightWindowBorder = GetSystemMetrics( SM_CYBORDER ); // 1 + + RectCaption.bottom = heightCaption; + + //heightCaption gives us the correct caption height, but in order to get the exact RECT location, + //calculated from top left, we need to add sFrame.cy to it. ~we substract the bottom border because, + //otherwise the height will be too long + + //sFrame.cy + heightCaption - heightWindowBorder; + + // sample return + // top = 4, left = 4, bottom = 23, right = 771 + + // Pass out the height & Width of the CaptionBar + heightNwidth.cx = heightCaption; + heightNwidth.cy = width; +} +//******************************************************************** +// Clss ClassicButtonStrategy +// +// Description Implementation for our Windows Classic Theme Strategy +// +// Note Uses DrawFrameControl() to draw the Button. This will +// Only work in Windows2000/XP without theme (classic View) +// +// Created 06-01-2008 +//******************************************************************** +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Construction / Destruction +//******************************************************************** +////////////////////////////////////////////////////////////////////// +ClassicButtonStrategy::ClassicButtonStrategy() +{ +} +ClassicButtonStrategy::~ClassicButtonStrategy() +{ +} +////////////////////////////////////////////////////////////////////// +// Func: draw() +// Desc: generic draw function - called for all default messages +////////////////////////////////////////////////////////////////////// +void ClassicButtonStrategy::draw(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ + // Use the regular Frame Control *Windows Classic* + // DrawFrameControl( hDc, const_cast(&rPos), DFC_BUTTON, DFCS_BUTTONPUSH ); + + HICON hIcon = (HICON) LoadImage(NULL, L"C:\\bridge.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); + DrawIcon(hDc, rPos.left, rPos.top, hIcon); +} +////////////////////////////////////////////////////////////////////// +// Func: drawButtonUp() +// Desc: draw the button in an up state +////////////////////////////////////////////////////////////////////// +void ClassicButtonStrategy::drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ + // Use the regular Frame Control *Windows Classic* + // DrawFrameControl( hDc, const_cast(&rPos), DFC_BUTTON, DFCS_BUTTONPUSH ); + + HICON hIcon = (HICON) LoadImage(NULL, L"C:\\bridge.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); + DrawIcon(hDc, rPos.left, rPos.top, hIcon); +} +////////////////////////////////////////////////////////////////////// +// Func: drawButtonDown() +// Desc: draw the button in a down state +////////////////////////////////////////////////////////////////////// +void ClassicButtonStrategy::drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ + // Use the regular Frame Control *Windows Classic* + // DrawFrameControl( hDc, const_cast(&rPos), DFC_BUTTON, DFCS_BUTTONPUSH | DFCS_PUSHED ); + + HICON hIcon = (HICON) LoadImage(NULL, L"C:\\bridge.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); + DrawIcon(hDc, rPos.left, rPos.top, hIcon); +} +//******************************************************************** +// Clss AeroButtonStrategy +// +// Description Implementation for our Windows Aero Theme Strategy +// +// Note +// +// +// Created 06-01-2008 +//******************************************************************** +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Construction / Destruction +//******************************************************************** +////////////////////////////////////////////////////////////////////// +AeroButtonStrategy::AeroButtonStrategy() +{ +} +AeroButtonStrategy::~AeroButtonStrategy() +{ +} +////////////////////////////////////////////////////////////////////// +// Func: CalcCaptionButtonRect() +// Desc: Calculates the dimensions of the Caption Button. Takes into +// account the number of caption buttons on the window and returns +// the pos (RECT) where to draw the Caption Button. +// +// Prms: +hWnd, handle to a Windows +// +-RectButtonPos, returns the x,y dimension of where to place the Button +////////////////////////////////////////////////////////////////////// +void AeroButtonStrategy::CalcCaptionButtonRect(HWND hWnd, RECT& RectButtonPos) const +{ + // Button Constants + const LONG BUTTON_MARGIN = 2; // The Margin Space between the Buttons + + //The width of a button in a window caption or title bar, in pixels + const LONG CAPTION_WIDTH = GetSystemMetrics(SM_CXSIZE); // should be 28 + + log(LOGGING_HIGH, "Caption Width = %i", CAPTION_WIDTH); + + RECT rect; + SIZE size; + // Get The dimensions of the CaptionBar + CalcCaptionRect(hWnd,rect,size); + + // sample return from CalcCaptionRect() + // top = 4, left = 4, bottom = 23, right = 771 + + // On Aero the distance of the Button is 10 not 6. Calculating by multiplying top * 2 (=8) + // ~this makes sense because our Rect start at the top most location (not where vista wants to draw the button + const LONG TOP_PLACEMENT = (2 * rect.top) + BUTTON_MARGIN; + const LONG BOTTOM_PLACEMENT = rect.bottom - BUTTON_MARGIN; + + // Left and Right Placement has to be calculated using the spacing on the right, the caption button widths, + // of (close, max, min) and the margins in between the buttons. (RECT includes all caption buttons), + // we also subtract rect.top from the left because a window border on right is not considered (+ another margin) + const LONG RIGHT_PLACEMENT = rect.right - (CAPTION_WIDTH * 3) - (BUTTON_MARGIN * 3) - (rect.top + BUTTON_MARGIN); + const LONG LEFT_PLACEMENT = RIGHT_PLACEMENT - CAPTION_WIDTH; // - BUTTON_MARGIN? + + //// + // Pass out the dimension of the CaptionButton + //// + RectButtonPos.top = TOP_PLACEMENT; + RectButtonPos.bottom = BOTTOM_PLACEMENT; + RectButtonPos.right = RIGHT_PLACEMENT; + RectButtonPos.left = LEFT_PLACEMENT; +} +////////////////////////////////////////////////////////////////////// +// Func: draw() +// Desc: generic draw function - called for all default messages +////////////////////////////////////////////////////////////////////// +void AeroButtonStrategy::draw(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ + // HTHEME hTheme = OpenThemeData(hWnd, L"OkButton;Button;Window"); + // HTHEME hTheme = OpenThemeData(hWnd, L"Button"); + + // DrawThemeParentBackground(hWnd,hDc,&rPos); + // DrawThemeBackground(hTheme,hDc,0,0,&rPos,0); + + HICON hIcon = (HICON) LoadImage(NULL, L"C:\\VistaNoAero.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); + DrawIcon(hDc, rPos.left, rPos.top, hIcon); +} +////////////////////////////////////////////////////////////////////// +// Func: drawButtonUp() +// Desc: draw the button in an up state +////////////////////////////////////////////////////////////////////// +void AeroButtonStrategy::drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ + HICON hIcon = (HICON) LoadImage(NULL, L"C:\\bridge.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); + DrawIcon(hDc, rPos.left, rPos.top, hIcon); +} +////////////////////////////////////////////////////////////////////// +// Func: drawButtonDown() +// Desc: draw the button in a down state +////////////////////////////////////////////////////////////////////// +void AeroButtonStrategy::drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ + HICON hIcon = (HICON) LoadImage(NULL, L"C:\\bridge.ico", IMAGE_ICON, 0, 0, LR_LOADFROMFILE); + DrawIcon(hDc, rPos.left, rPos.top, hIcon); +} +//******************************************************************** +// Clss VistaNoAeroStrategy +// +// Description Implementation for Vista when Aero (Glass) is not running +// +// Note +// +// +// Created 06-01-2008 +//******************************************************************** +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Construction / Destruction +//******************************************************************** +////////////////////////////////////////////////////////////////////// +VistaNoAeroStrategy::VistaNoAeroStrategy() +{ +} +VistaNoAeroStrategy::~VistaNoAeroStrategy() +{ +} +////////////////////////////////////////////////////////////////////// +// Func: CalcCaptionButtonRect() +// Desc: Calculates the dimensions of the Caption Button. Takes into +// account the number of caption buttons on the window and returns +// the pos (RECT) where to draw the Caption Button. +// +// Prms: +hWnd, handle to a Windows +// +-RectButtonPos, returns the x,y dimension of where to place the Button +////////////////////////////////////////////////////////////////////// +void VistaNoAeroStrategy::CalcCaptionButtonRect(HWND hWnd, RECT& RectButtonPos) const +{ + // Button Constants + const LONG BUTTON_MARGIN = 2; // The Margin Space between the Buttons + + //The width of a button in a window caption or title bar, in pixels + const LONG CAPTION_WIDTH = GetSystemMetrics(SM_CXSIZE); // 32 (appears to include left and righ Margin) + + RECT rect; + SIZE size; + // Get The dimensions of the CaptionBar + CalcCaptionRect(hWnd,rect,size); + log(LOGGING_HIGH, "rect is top %i, bottom %i, left %i, right %i", rect.top, rect.bottom, rect.left, rect.right); + + // sample return from CalcCaptionRect() + + // Vista Aero + // top = 4, left = 4, bottom = 23, right = 771 + + // Vista NoAero + // rect is top 8, bottom 27, left 8, right 831 + + // On Aero the distance of the Button is 10 not 6. Calculating by multiplying top * 2 (=8) + // ~this makes sense because our Rect start at the top most location (not where vista wants to draw the button + const LONG TOP_PLACEMENT = 10; //(2 * rect.top) + BUTTON_MARGIN; + const LONG BOTTOM_PLACEMENT = rect.bottom - BUTTON_MARGIN; + + // Left and Right Placement has to be calculated using the spacing on the right, the caption button widths, + // of (close, max, min) and the margins in between the buttons. (RECT includes all caption buttons), + // we also subtract rect.top from the left because a window border on right is not considered (+ another margin) + // 96 + const LONG RIGHT_PLACEMENT = rect.right - 96; + const LONG LEFT_PLACEMENT = RIGHT_PLACEMENT - 28; // - BUTTON_MARGIN? + + //// + // Pass out the dimension of the CaptionButton + //// + RectButtonPos.top = TOP_PLACEMENT; + RectButtonPos.bottom = BOTTOM_PLACEMENT; + RectButtonPos.right = RIGHT_PLACEMENT; + RectButtonPos.left = LEFT_PLACEMENT; +} +////////////////////////////////////////////////////////////////////// +// Func: draw() +// Desc: generic draw function - called for all default messages +////////////////////////////////////////////////////////////////////// +void VistaNoAeroStrategy::draw(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ + HICON hIcon = (HICON) LoadImage(NULL, L"C:\\VistaNoAero.ico", IMAGE_ICON, 28, 15, LR_LOADFROMFILE); + DrawIcon(hDc, rPos.left, rPos.top, hIcon); +} +////////////////////////////////////////////////////////////////////// +// Func: drawButtonUp() +// Desc: draw the button in an up state +////////////////////////////////////////////////////////////////////// +void VistaNoAeroStrategy::drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ +} +////////////////////////////////////////////////////////////////////// +// Func: drawButtonDown() +// Desc: draw the button in a down state +////////////////////////////////////////////////////////////////////// +void VistaNoAeroStrategy::drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ +} +//******************************************************************** +// Clss XPButtonStrategy +// +// Description Implementation for Windows XP Themed Strategy +// +// Note +// +// +// Created 06-01-2008 +//******************************************************************** +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Construction / Destruction +//******************************************************************** +////////////////////////////////////////////////////////////////////// +XPButtonStrategy::XPButtonStrategy() +{ +} +XPButtonStrategy::~XPButtonStrategy() +{ +} +////////////////////////////////////////////////////////////////////// +// Func: draw() +// Desc: generic draw function - called for all default messages +////////////////////////////////////////////////////////////////////// +void XPButtonStrategy::draw(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ +} +////////////////////////////////////////////////////////////////////// +// Func: drawButtonUp() +// Desc: draw the button in an up state +////////////////////////////////////////////////////////////////////// +void XPButtonStrategy::drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ +} +////////////////////////////////////////////////////////////////////// +// Func: drawButtonDown() +// Desc: draw the button in a down state +////////////////////////////////////////////////////////////////////// +void XPButtonStrategy::drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const +{ +} \ No newline at end of file diff --git a/Hooks/ButtonHook/ButtonStrategy.h b/Hooks/ButtonHook/ButtonStrategy.h new file mode 100644 index 0000000..64605ac --- /dev/null +++ b/Hooks/ButtonHook/ButtonStrategy.h @@ -0,0 +1,102 @@ +#pragma once + +namespace Ooganizer +{ + ////////////////////////////////////////////////////////////////////// + // Itce: ButtonStrategy + // Desc: This interface allows us to abstract out specific implementations + // for different caption buttons with different Themes. + // + // Note: following functions will be called from the windows messages to + // be implemented directly here independently and draw only the button. + // + // Note2: Each Button Strategy is directly tied to a C + ////////////////////////////////////////////////////////////////////// + class ButtonStrategy + { + public: + // generic draw function - called for all default messages + virtual void draw(HWND hWnd, const HDC &hdc, const RECT &rpos) const = 0; + // draw the button in an up state + virtual void drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const = 0; + // draw the button in a down state + virtual void drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const = 0; + + // returns the RECT position of the the CaptionButton + virtual void CalcCaptionButtonRect(HWND hWnd, RECT& RectButtonPos) const = 0; + + //// + // returns the dimension / size of the caption / title bar (impl. in base) + //// + void CalcCaptionRect(HWND hWnd, RECT& RectCaption, SIZE &heightNwidth) const; + + ButtonStrategy(void); + virtual ~ButtonStrategy(void); + }; + ////////////////////////////////////////////////////////////////////// + // Clss: ClassicButtonStrategy + // Desc: Implementation for our Windows Classic Theme Strategy + ////////////////////////////////////////////////////////////////////// + class ClassicButtonStrategy : public ButtonStrategy + { + public: + void draw(HWND hWnd, const HDC &hdc, const RECT &rpos) const; + void drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const; + void drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const; + + void CalcCaptionButtonRect(HWND hWnd, RECT& RectButtonPos) const {}; + + ClassicButtonStrategy(); + virtual ~ClassicButtonStrategy(); + }; + ////////////////////////////////////////////////////////////////////// + // Clss: AeroButtonStrategy + // Desc: Implementation for our Windows Aero (Glass) Strategy + ////////////////////////////////////////////////////////////////////// + class AeroButtonStrategy : public ButtonStrategy + { + public: + virtual void draw(HWND hWnd, const HDC &hdc, const RECT &rpos) const; + void drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const; + void drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const; + + void CalcCaptionButtonRect(HWND hWnd, RECT& RectButtonPos) const; + + AeroButtonStrategy(); + virtual ~AeroButtonStrategy(); + }; + ////////////////////////////////////////////////////////////////////// + // Clss: VistaNoAeroStrategy + // Desc: Implementation for Vista when Aero (Glass) is not running + ////////////////////////////////////////////////////////////////////// + class VistaNoAeroStrategy : public ButtonStrategy + { + public: + virtual void draw(HWND hWnd, const HDC &hdc, const RECT &rpos) const; + void drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const; + void drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const; + + void CalcCaptionButtonRect(HWND hWnd, RECT& RectButtonPos) const; + + // Uses Hidden Window Strategy + VistaNoAeroStrategy(); + virtual ~VistaNoAeroStrategy(); + }; + ////////////////////////////////////////////////////////////////////// + // Clss: XPButtonStrategy + // Desc: Implementation for Windows XP Themed Strategy + ////////////////////////////////////////////////////////////////////// + class XPButtonStrategy : public ButtonStrategy + { + public: + + virtual void draw(HWND hWnd, const HDC &hdc, const RECT &rpos) const; + void drawButtonUp(HWND hWnd, const HDC &hDc, const RECT &rPos) const; + void drawButtonDown(HWND hWnd, const HDC &hDc, const RECT &rPos) const; + + void CalcCaptionButtonRect(HWND hWnd, RECT& RectButtonPos) const{}; + + XPButtonStrategy(); + virtual ~XPButtonStrategy(); + }; +} \ No newline at end of file diff --git a/Hooks/ButtonHook/CWHPaccess.cpp b/Hooks/ButtonHook/CWHPaccess.cpp new file mode 100644 index 0000000..221381e --- /dev/null +++ b/Hooks/ButtonHook/CWHPaccess.cpp @@ -0,0 +1,414 @@ +#include "stdafx.h" +#include "CWHPaccess.h" + +using namespace Ooganizer; +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Global variables - Shared Data Segment (Shared across all instances +// of this dll!) +//******************************************************************** +////////////////////////////////////////////////////////////////////// +#pragma data_seg( ".CWHP" ) +HHOOK CWHPaccess::hHook = NULL; +HookWndItem CWHPaccess::HList[MAX_PATH] = {NULL,NULL,NULL,NULL}; +UINT CWHPaccess::HListI = 0; +wchar_t CWHPaccess::ALLOWED_PROCESS_NAMES[MAX_PATH][MAX_PATH] = {0}; +UINT CWHPaccess::NUMBER_OF_ALLOWED_PROCESS_NAMES = 0; +wchar_t CWHPaccess::ALLOWED_WINDOW_TITLES[MAX_PATH][MAX_PATH] = {0}; +UINT CWHPaccess::NUMBER_OF_ALLOWED_WINDOW_TITLES = 0; +wchar_t CWHPaccess::ALLOWED_WINDOW_CLASSES[MAX_PATH][MAX_PATH] = {0}; +UINT CWHPaccess::NUMBER_OF_ALLOWED_WINDOW_CLASSES = 0; +UINT CWHPaccess::nLoggingDetail = LOGGING_NONE; +wchar_t CWHPaccess::LoggingPath[MAX_PATH] = {0}; +#pragma data_seg() +#pragma comment( linker, "/SECTION:.CWHP,rws" ) +////////////////////////////////////////////////////////////////////// +// Constructor / Destructor +////////////////////////////////////////////////////////////////////// +CWHPaccess::CWHPaccess() +{ + InitializeCriticalSection(&cs); +} +CWHPaccess::~CWHPaccess() +{ + DeleteCriticalSection(&cs); +} +// Set/Get hHook +void CWHPaccess::set_hHook(HHOOK hook) +{ + EnterCS(); + hHook = hook; + LeaveCS(); +} +HHOOK CWHPaccess::get_hHook() +{ + return hHook; +} +// Public CRITICAL_SECTION Accessors +void CWHPaccess::EnterCS() +{ + EnterCriticalSection(&cs); +} +void CWHPaccess::LeaveCS() +{ + LeaveCriticalSection(&cs); +} +////////////////////////////////////////////////////////////////////// +// Func: ClearHookItem() +// Desc: Clears a single Hook Item +////////////////////////////////////////////////////////////////////// +void CWHPaccess::ClearHookItem(UINT nItem) +{ + if((nItem < 0) || (nItem >= MAX_PATH)) + return; + + HList[nItem].hWnd = NULL; + HList[nItem].DefWndProc = NULL; + HList[nItem].HookWndProc = NULL; + HList[nItem].wpfcaller = NULL; +} +////////////////////////////////////////////////////////////////////// +// Func: ClearHookSData() +// Desc: Clears all the data stored in the Shared DS segment's Hook List +////////////////////////////////////////////////////////////////////// +void CWHPaccess::ClearHookSData() +{ + EnterCS(); + hHook = NULL; + HListI = 0; + + for (int i=0; i < MAX_PATH; ++i) + ClearHookItem(i); + + LeaveCS(); +} +////////////////////////////////////////////////////////////////////// +// Func: InsertHookedWndItem() +// Desc: Inserts a HookWndItem into the Shared DS's HookedList +////////////////////////////////////////////////////////////////////// +BOOL CWHPaccess::InsertHookedWndItem(HookWndItem &Item) +{ + BOOL bRetVal = FALSE; + EnterCS(); + for (UINT i = 0;i < MAX_PATH; ++i) + { + if(HList[i].hWnd == NULL) + { + HList[i] = Item; + + log(LOGGING_DEBUG, L"Inserting HookedItem into DS index = %i", i); + // Keep track of the list top index *performance* + if(i > HListI) + { + HListI = i; + log(LOGGING_DEBUG, L"Inserting HookedItem setting HListI = %i", HListI); + } + bRetVal = TRUE; + break; + } + } + LeaveCS(); + + return bRetVal; +} +////////////////////////////////////////////////////////////////////// +// Func: FindHookedWnd() +// Desc: Finds Inserts a HookWndItem into the Shared DS's HookedList +////////////////////////////////////////////////////////////////////// +BOOL CWHPaccess::FindHookedWnd(HWND hWnd) +{ + BOOL bRetVal = FALSE; + + EnterCS(); + for (UINT i = 0;i <= HListI;++i) + { + if(HList[i].hWnd == hWnd) + { + bRetVal = TRUE; + break; + } + } + LeaveCS(); + + return bRetVal; +} +////////////////////////////////////////////////////////////////////// +// Func: GetHookedWndItem() +// Desc: Returns a matchin HookWndItem (.hWnd will be NULL if not found) +////////////////////////////////////////////////////////////////////// +HookWndItem CWHPaccess::GetHookedWndItem(HWND hWnd) +{ + BLANK_HookWndItem(retVal); + + EnterCS(); + for (UINT i = 0;i <= HListI;++i) + { + if(HList[i].hWnd == hWnd) + { + retVal = HList[i]; + } + } + LeaveCS(); + + return(retVal); +} +////////////////////////////////////////////////////////////////////// +// Func: GetHookedWindowListNSize() +// Desc: Use this to get a copy of the hooked window buffer and size in the Shared DS +////////////////////////////////////////////////////////////////////// +void CWHPaccess::GetHookedWindowListNSize(int* nbuf, int* nsize) +{ + EnterCS(); + + // write out the size + *nsize = HListI; + + for (UINT i = 0;i <= HListI;++i) + { + // write out the actual buffer + *(nbuf + i) = (int) HList[i].hWnd; + } + + LeaveCS(); +} +////////////////////////////////////////////////////////////////////// +// Func: SetHookedWndItem() +// Desc: Use this to overwrite Hook information for a window in the Shared DS +////////////////////////////////////////////////////////////////////// +BOOL CWHPaccess::SetHookedWndItem(HWND hWnd, HookWndItem& Item) +{ + BOOL bRetVal = FALSE; + EnterCS(); + for (UINT i = 0;i <= HListI;++i) + { + if((HList[i].hWnd == hWnd) && + (hWnd == Item.hWnd)) + { + HList[i] = Item; + bRetVal = TRUE; + } + } + LeaveCS(); + return bRetVal; +} +////////////////////////////////////////////////////////////////////// +// Func: DeleteHookedWnd() +// Desc: Finds Inserts a HookWndItem into the Shared DS's HookedList +////////////////////////////////////////////////////////////////////// +BOOL CWHPaccess::DeleteHookedWnd(HWND hWnd) +{ + + BOOL retVal = FALSE; + EnterCS(); + // Is it the Last Item in the list? + if(HList[HListI].hWnd == hWnd) + { + ClearHookItem(HListI); + if(HListI > 0) + { + HListI = HListI - 1; + log(LOGGING_DEBUG, L"DeleteHookedWnd HListI set to %i", HListI); + } + + retVal = TRUE; + } + else + { + for (UINT i = 0; i <= HListI; ++i) + { + if(HList[i].hWnd == hWnd) + { + ClearHookItem(i); + deltaListTopI(i); + retVal = TRUE; + break; + } + } + } + LeaveCS(); + + return retVal; +} +////////////////////////////////////////////////////////////////////// +// Func: deltaListTopI() +// Desc: *for performance * adjusts the Top index responding to a delete +////////////////////////////////////////////////////////////////////// +void CWHPaccess::deltaListTopI(int deletedIndex) +{ + UINT i; + + EnterCS(); + for(i = deletedIndex + 1; i <= HListI; ++i) + { + if(HList[i].hWnd == NULL) + { + continue; + } + break; + } + if(i > HListI) + { + if(deletedIndex > 0) + { + HListI = deletedIndex - 1; + log(LOGGING_DEBUG, L"deltaListTopI HListI set to %i", HListI); + } + else + { + log(LOGGING_DEBUG, L"deltaListTopI HListI set to %i", HListI); + HListI = 0; + } + } + LeaveCS(); +} +////////////////////////////////////////////////////////////////////// +// Func: AddAllowedProcessName() +// Desc: Add Allowed Process Name +////////////////////////////////////////////////////////////////////// +void CWHPaccess::AddAllowedProcessName(wchar_t* strProcessNameInUpperCase) +{ + if(strProcessNameInUpperCase) + { + EnterCS(); + int i = NUMBER_OF_ALLOWED_PROCESS_NAMES; + lstrcpyn(ALLOWED_PROCESS_NAMES[i], strProcessNameInUpperCase, MAX_PATH - 1); + NUMBER_OF_ALLOWED_PROCESS_NAMES = i + 1; + LeaveCS(); + + log(LOGGING_DEBUG, L"Allowing Process %s", strProcessNameInUpperCase); + } + +} +////////////////////////////////////////////////////////////////////// +// Func: IsAllowedProcessName() +// Desc: Find Allowed Process Name +////////////////////////////////////////////////////////////////////// +BOOL CWHPaccess::IsAllowedProcessName(wchar_t* strProcessNameInUpperCase) +{ + BOOL bRetVal = FALSE; + if(strProcessNameInUpperCase) + { + EnterCS(); + for (UINT i = 0; i < NUMBER_OF_ALLOWED_PROCESS_NAMES; ++i) + { + if(wcsstr(strProcessNameInUpperCase, ALLOWED_PROCESS_NAMES[i])) + { + bRetVal = TRUE; + break; + } + } + LeaveCS(); + } + return bRetVal; +} +////////////////////////////////////////////////////////////////////// +// Func: AddAllowedApplication() +// Desc: Add Allowed Windows Titles +////////////////////////////////////////////////////////////////////// +void CWHPaccess::AddAllowedWindowsTitle(wchar_t* strWindowsTitleInUpperCase) +{ + if(strWindowsTitleInUpperCase) + { + EnterCS(); + int i = NUMBER_OF_ALLOWED_WINDOW_TITLES; + lstrcpyn(ALLOWED_WINDOW_TITLES[i], strWindowsTitleInUpperCase, MAX_PATH - 1); + NUMBER_OF_ALLOWED_WINDOW_TITLES = i + 1; + LeaveCS(); + + log(LOGGING_DEBUG, L"Allowing Window %s", strWindowsTitleInUpperCase); + } +} +////////////////////////////////////////////////////////////////////// +// Func: IsAllowedWindowsTitle() +// Desc: Find Allowed Window Title +////////////////////////////////////////////////////////////////////// +BOOL CWHPaccess::IsAllowedWindowsTitle(wchar_t* strWindowsTitleInUpperCase) +{ + BOOL bRetVal = FALSE; + if(strWindowsTitleInUpperCase) + { + EnterCS(); + for (UINT i = 0; i < NUMBER_OF_ALLOWED_WINDOW_TITLES; ++i) + { + if(wcsstr(strWindowsTitleInUpperCase, ALLOWED_WINDOW_TITLES[i])) + { + bRetVal = TRUE; + break; + } + } + LeaveCS(); + } + return bRetVal; +} +////////////////////////////////////////////////////////////////////// +// Func: AddAllowedWindowsClass() +// Desc: Add Allowed Windows Class +////////////////////////////////////////////////////////////////////// +void CWHPaccess::AddAllowedWindowsClass(wchar_t* strWindowsClassInUpperCase) +{ + if(strWindowsClassInUpperCase) + { + EnterCS(); + int i = NUMBER_OF_ALLOWED_WINDOW_CLASSES; + lstrcpyn(ALLOWED_WINDOW_CLASSES[i], strWindowsClassInUpperCase, MAX_PATH - 1); + NUMBER_OF_ALLOWED_WINDOW_CLASSES = i + 1; + LeaveCS(); + + log(LOGGING_DEBUG, L"Allowing Window Class %s", strWindowsClassInUpperCase); + } +} +////////////////////////////////////////////////////////////////////// +// Func: IsAllowedWindowsClass() +// Desc: Find Allowed Window Class +////////////////////////////////////////////////////////////////////// +BOOL CWHPaccess::IsAllowedWindowsClass(wchar_t* strWindowsClassInUpperCase) +{ + BOOL bRetVal = FALSE; + if(strWindowsClassInUpperCase) + { + EnterCS(); + for (UINT i = 0; i < NUMBER_OF_ALLOWED_WINDOW_CLASSES; ++i) + { + if(wcsstr(strWindowsClassInUpperCase, ALLOWED_WINDOW_CLASSES[i])) + { + bRetVal = TRUE; + break; + } + } + LeaveCS(); + } + return bRetVal; +} +////////////////////////////////////////////////////////////////////// +// Func: SetLoggingDetail() +// Desc: Allows us to set a global used by all button hooks to log +////////////////////////////////////////////////////////////////////// +void CWHPaccess::SetLoggingDetail(LoggingDetail nLoggingDetailSetting) +{ + EnterCS(); + nLoggingDetail = nLoggingDetailSetting; + LeaveCS(); +} +////////////////////////////////////////////////////////////////////// +// Desc: Returns the Detail of our Logging (high, medium, low, or none) +////////////////////////////////////////////////////////////////////// +LoggingDetail CWHPaccess::GetLoggingDetail() +{ + return (static_cast(nLoggingDetail)); +} +////////////////////////////////////////////////////////////////////// +// Desc: Get Directory location where we should log to +////////////////////////////////////////////////////////////////////// +wchar_t* CWHPaccess::GetLogPath() +{ + return reinterpret_cast(&LoggingPath); +} +////////////////////////////////////////////////////////////////////// +// Desc: Set Directory location where we should log to +////////////////////////////////////////////////////////////////////// +void CWHPaccess::SetLogPath(wchar_t* buf) +{ + EnterCS(); + lstrcpyn(LoggingPath,buf,MAX_PATH - 1); + EnterCS(); +} \ No newline at end of file diff --git a/Hooks/ButtonHook/CWHPaccess.h b/Hooks/ButtonHook/CWHPaccess.h new file mode 100644 index 0000000..1d70f59 --- /dev/null +++ b/Hooks/ButtonHook/CWHPaccess.h @@ -0,0 +1,97 @@ +// CWHPaccess.h +#pragma once +#include "WPFCaller.h" + +namespace Ooganizer +{ + ////////////////////////////////////////////////////////////////////// + //******************************************************************** + // DS access Class - Created to easily enforce critical sections and + // share the statically created DS + //******************************************************************** + ////////////////////////////////////////////////////////////////////// + class CWHPaccess + { + public: + //// + // All these statics are put into the DS and shared accross all DLL instances + // ~Use accessor functions below to modify these + //// + static HINSTANCE hModule; + static HHOOK hHook; + static HookWndItem HList[MAX_PATH]; + static UINT HListI; + + static wchar_t ALLOWED_PROCESS_NAMES[MAX_PATH][MAX_PATH]; + static UINT NUMBER_OF_ALLOWED_PROCESS_NAMES; + + static wchar_t ALLOWED_WINDOW_TITLES[MAX_PATH][MAX_PATH]; + static UINT NUMBER_OF_ALLOWED_WINDOW_TITLES; + + static wchar_t ALLOWED_WINDOW_CLASSES[MAX_PATH][MAX_PATH]; + static UINT NUMBER_OF_ALLOWED_WINDOW_CLASSES; + + static UINT nLoggingDetail; + static wchar_t LoggingPath[MAX_PATH]; + + // Hook Handle + void set_hHook(HHOOK); + HHOOK get_hHook(); + + // Clears all Shared DS segment's Hook List data + // (imp, when releasing the hook) + void ClearHookSData(); + + // Allows a Caller to get a copy of all hooked Window Handles + // and size of the hooked window list + void GetHookedWindowListNSize(int* nbuf, int* nsize); + + //// + // Find,Insert,Deletion of HookWnd + //// + BOOL InsertHookedWndItem(HookWndItem& Item); + BOOL FindHookedWnd(HWND hWnd); + HookWndItem GetHookedWndItem(HWND hWnd); + BOOL SetHookedWndItem(HWND hWnd, HookWndItem& Item); + BOOL DeleteHookedWnd(HWND hWnd); + + //// + // Allowed ProcessNames & WindowTitles & Classes WhiteList + //// + void AddAllowedProcessName(wchar_t* strProcessNameInUpperCase); + BOOL IsAllowedProcessName(wchar_t* strProcessNameInUpperCase); + void AddAllowedWindowsTitle(wchar_t* strWindowsTitleInUpperCase); + BOOL IsAllowedWindowsTitle(wchar_t* strWindowsTitleInUpperCase); + void AddAllowedWindowsClass(wchar_t* strWindowsClassInUpperCase); + BOOL IsAllowedWindowsClass(wchar_t* strWindowsClassInUpperCase); + + //// + // Get/Set and use Logging Detail Levels + //// + void SetLoggingDetail(LoggingDetail nLoggingDetailSetting); + LoggingDetail GetLoggingDetail(); + wchar_t* GetLogPath(); + void SetLogPath(wchar_t* buf); + + // CRITICAL_SECTION + void EnterCS(); + void LeaveCS(); + + CWHPaccess(); + ~CWHPaccess(); + + private: + //// + // Private functions to keep track of iteration + //// + void deltaListTopI(int); + + //// + // Private Helper Functions + //// + void ClearHookItem(UINT nItem); + + //Many threads could update the DS. + CRITICAL_SECTION cs; + }; +} \ No newline at end of file diff --git a/Hooks/ButtonHook/HookList.h b/Hooks/ButtonHook/HookList.h new file mode 100644 index 0000000..1ecc834 --- /dev/null +++ b/Hooks/ButtonHook/HookList.h @@ -0,0 +1,151 @@ +//#pragma once +// +//#include "malloc.h" +// +//namespace Ooganizer +//{ +// +// enum ButtonState{BUTTON_UP,BUTTON_DOWN}; +// +// ////////////////////////////////////////////////////////////////////// +// // Clss: HookItem +// // Desc: Hook Item is used in the HookList. Each HookItem keeps track +// // of all the addresses needed for each hook, as well as the +// // hookstate. +// // +// // Note: Add State Items for a Window as neccessary +// ////////////////////////////////////////////////////////////////////// +// class HookItem +// { +// public: +// HWND m_hWnd; +// WNDPROC m_HookWndProc; +// WNDPROC m_DefWndProc; +// ButtonState m_btnState; +// +// // Constructor +// HookItem(HWND hWnd, WNDPROC hookWndProc, WNDPROC defWndProc): +// m_hWnd(hWnd), +// m_HookWndProc(hookWndProc), +// m_DefWndProc(defWndProc), +// m_btnState(BUTTON_UP) +// { +// } +// }; +// ////////////////////////////////////////////////////////////////////// +// // Clss: HookList +// // Desc: Generic List / Custom written list for the sake of speed. +// // Hook list is made up of individual HookItems. +// // +// // Note: You can use GetNext() to iterate thru all the items in the list. +// // ~adding or removing an item causes GetNext() to start over. +// ////////////////////////////////////////////////////////////////////// +// class HookList +// { +// public: +// ////////////////////////////////////////////////////////////////////// +// // Func: AddItem() +// // Desc: Adds a HookItem to the List +// ////////////////////////////////////////////////////////////////////// +// void AddItem(HookItem* pItem) +// { +// m_NbrItems++; +// +// if ( m_pHookItem == NULL ) +// m_pHookItem = (HookItem*) malloc( m_NbrItems * sizeof( HookItem ) ); +// else +// m_pHookItem = (HookItem*) realloc( m_pHookItem, m_NbrItems * sizeof( HookItem ) ); +// +// log(pItem->m_hWnd,"hase been added"); +// +// memcpy( m_pHookItem+(m_NbrItems-1), pItem, sizeof( HookItem ) ); +// } +// ////////////////////////////////////////////////////////////////////// +// // Func: GetItem() +// // Desc: Get a HookItem from the List +// ////////////////////////////////////////////////////////////////////// +// HookItem* GetItem(HWND hWnd) +// { +// UINT i; +// HookItem * pItem = m_pHookItem; +// for( i=0; im_hWnd!=hWnd; i++, pItem++ ); +// return ( i < m_NbrItems ) ? pItem : NULL; +// } +// ////////////////////////////////////////////////////////////////////// +// // Func: DelItem() +// // Desc: Deletes a HookItem from the List +// ////////////////////////////////////////////////////////////////////// +// void DelItem(HWND hWnd) +// { +// UINT i; +// HookItem * pItem = m_pHookItem; +// for( i =0; im_hWnd!=hWnd; i++, pItem++ ); +// if ( i < m_NbrItems ) +// { +// m_NbrItems--; +// memcpy( pItem, pItem+1, ( m_NbrItems - i ) * sizeof( HookItem ) ); +// m_pHookItem = (HookItem*) realloc( m_pHookItem, m_NbrItems * sizeof( HookItem ) ); +// +// log(pItem->m_hWnd,"hase been deleted"); +// } +// } +// ////////////////////////////////////////////////////////////////////// +// // Func: DelAllItems() +// // Desc: Deletes all HookItems from the List +// ////////////////////////////////////////////////////////////////////// +// void DelAllItems() +// { +// if ( m_pHookItem != NULL ) +// free( m_pHookItem ); +// m_pHookItem = NULL; +// m_NbrItems = 0; +// } +// ////////////////////////////////////////////////////////////////////// +// // Func: UnhookAllItems() +// // Desc: Responsible for iterating through entire list and 'unhooking' +// // the WndProc function of every HookItem +// // +// // Note: has to be put in here since the list has to be iterated here +// ////////////////////////////////////////////////////////////////////// +// void UnhookAllItems() +// { +// HookItem * pItem; +// +// while ( m_NbrItems > 0 ) +// { +// pItem = m_pHookItem+(m_NbrItems-1); +// +// // Unhook window +// HWND hWnd = pItem->m_hWnd; +// +// log(hWnd,"Unhooking..."); +// SetWindowLong( hWnd, GWL_WNDPROC, (LONG) pItem->m_DefWndProc ); +// SendMessage( hWnd, WM_NCPAINT, 1, 0 ); +// log(hWnd,"Sending WM_NCPAINT message..."); +// +// // Delete item +// DelItem( hWnd ); +// } +// } +// ////////////////////////////////////////////////////////////////////// +// // Func: CleanUp() +// // Desc: Unhooks all HookItems in the list and deletes the list +// ////////////////////////////////////////////////////////////////////// +// void CleanUp() +// { +// UnhookAllItems(); +// DelAllItems(); +// } +// ////////////////////////////////////////////////////////////////////// +// //******************************************************************** +// // Construction / Destruction +// //******************************************************************** +// ////////////////////////////////////////////////////////////////////// +// HookList():m_NbrItems(0),m_pHookItem(NULL){} +// ~HookList(){CleanUp();} +// +// protected: +// UINT m_NbrItems; +// HookItem* m_pHookItem; +// }; +//} \ No newline at end of file diff --git a/Hooks/ButtonHook/HookWndItem.h b/Hooks/ButtonHook/HookWndItem.h new file mode 100644 index 0000000..71cf895 --- /dev/null +++ b/Hooks/ButtonHook/HookWndItem.h @@ -0,0 +1,20 @@ +// HookWndItem.h +#pragma once +extern class CaptionButton; + +////////////////////////////////////////////////////////////////////// +// Strc: HookWndItem +// Desc: Hook Item is used in the HookedWndList. Each HookWndItem keeps track +// of all the addresses needed for each hook for each Windows, +// as well as each Window's ButtonState. +// +// Note: Add State Items for a Window as neccessary +////////////////////////////////////////////////////////////////////// +struct HookWndItem +{ + HWND hWnd; + WNDPROC HookWndProc; + WNDPROC DefWndProc; + ButtonState state; + CaptionButton* button; +}; \ No newline at end of file diff --git a/Hooks/ButtonHook/Stdafx.cpp b/Hooks/ButtonHook/Stdafx.cpp new file mode 100644 index 0000000..ca1c0cb --- /dev/null +++ b/Hooks/ButtonHook/Stdafx.cpp @@ -0,0 +1,153 @@ +// stdafx.cpp : source file that includes just the standard includes +// Ooganizer-Hook.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information +#include "stdafx.h" +#include "stdio.h" +#include "stdlib.h" + +////////////////////////////////////////////////////////////////////// +// Func: SetLoggingDetail() +////////////////////////////////////////////////////////////////////// +void SetLoggingDetail(LoggingDetail detail, wchar_t* logPath) +{ +#ifdef _DEBUG + g_LoggingDetail = LOGGING_DEBUG; +#else + g_LoggingDetail = detail; +#endif + + // If the log path is set externally set it here internally + // else set the log path to %USERPROFILE%\AppData\Local\Temp + if(logPath && logPath[0] != 0) + { + lstrcpyn(g_LogPath, logPath, (MAX_PATH - lstrlen(g_LOG_FILE_NAME))); + } + else + { + size_t len = 0; + errno_t err = 0; + wchar_t* pValue = NULL; + + if(err = _wdupenv_s( &pValue, &len, L"TMP")) + if(err = _wdupenv_s( &pValue, &len, L"TEMP")) + return; + + if(pValue != NULL) + lstrcpyn(g_LogPath, pValue, (MAX_PATH - lstrlen(g_LOG_FILE_NAME))); + } + + // Make sure Path ends with '\' + if(g_LogPath[lstrlen(g_LogPath) - 1] != L'\\') + lstrcat(g_LogPath, L"\\"); + + // Add the Log File name to the path variable (now we have everything) + // ~we are ready to do some serious logging + lstrcat(g_LogPath,g_LOG_FILE_NAME); +} +////////////////////////////////////////////////////////////////////// +// Func: GetLoggingDetail() +////////////////////////////////////////////////////////////////////// +_LoggingDetail GetLoggingDetail() +{ + return g_LoggingDetail; +} +////////////////////////////////////////////////////////////////////// +// Func: log() +// Desc: Logs to Ooganizer.log in defined LogPath or temporary folder +// Prms: Variable # of params +// +// Usge: Log("%s %d %d %d", "test", 1, 2, 3) +////////////////////////////////////////////////////////////////////// +//void log( LoggingDetail detail, char * pFmt, ... ) +//{ +// if(g_LoggingDetail >= detail) +// { +// FILE* pFile = NULL; +// errno_t err = 0; +// +// if ( !( err = fopen_s( &pFile, g_LogPath, "at" ) ) ) +// { +// fprintf( pFile, "ThreadId %i -", GetCurrentThreadId()); +// va_list arg; +// va_start( arg, pFmt ); +// vfprintf( pFile, pFmt, arg ); +// va_end( arg ); +// +// if ( pFmt[strlen( pFmt ) - 1] != '\n' ) +// fprintf( pFile, "\n" ); +// fclose( pFile ); +// } +// } +//} +////////////////////////////////////////////////////////////////////// +// Func: log() +// Desc: Logs to Ooganizer.log in defined LogPath or temporary folder using Wide Char +// Prms: Variable # of params +// +// Usge: Log("%s %d %d %d", "test", 1, 2, 3) +////////////////////////////////////////////////////////////////////// +void log( LoggingDetail detail, wchar_t * pFmt, ... ) +{ + if(g_LoggingDetail >= detail) + { + FILE* pFile = NULL; + errno_t err = 0; + + if ( !( err = _wfopen_s( &pFile, g_LogPath, L"at" ) ) ) + { + + if(detail == LOGGING_LOW) + fwprintf( pFile, L"ThreadId %i - [Imp] - ", GetCurrentThreadId()); // low == very important messages + else if(detail == LOGGING_MEDIUM) + fwprintf( pFile, L"ThreadId %i - {P/D} - ", GetCurrentThreadId()); // medium == program details + else if(detail == LOGGING_HIGH) + fwprintf( pFile, L"ThreadId %i - {X/D} - ", GetCurrentThreadId()); // high == more program details (extra} + else if(detail == LOGGING_DEBUG) + fwprintf( pFile, L"ThreadId %i - Debug - ", GetCurrentThreadId()); // debug == only show up in debug builds (Debug Only) + else + fwprintf( pFile, L"ThreadId %i - - ", GetCurrentThreadId()); // should never happen + + va_list arg; + va_start( arg, pFmt ); + vfwprintf( pFile, pFmt, arg ); + va_end( arg ); + + if ( pFmt[lstrlen( pFmt ) - 1] != '\n' ) + fwprintf( pFile, L"\n" ); + fclose( pFile ); + } + } +} +////////////////////////////////////////////////////////////////////// +// Func: log() +// Desc: Logs the window title text to the Log File +// Prms: HWND, handle to a window +// str, custom string to log +// +// Note: GetWindowText doesn't always return TRUE, if this function +// gets called during the WndProc it will return False +////////////////////////////////////////////////////////////////////// +void log(LoggingDetail detail, HWND hWnd, wchar_t* str) +{ + if(g_LoggingDetail >= detail) + { + wchar_t Title[MAX_PATH + 1] = {0}; + if (GetWindowText(hWnd,Title,MAX_PATH)) + log(detail, L"Window - %s - %s", Title, str); + } +} +////////////////////////////////////////////////////////////////////// +// Func: clearLog() +// Desc: clears the log file (used at startup) - Only Clears if Logging is enabled +////////////////////////////////////////////////////////////////////// +void clearLog() +{ + if(g_LoggingDetail != LOGGING_NONE) + { + FILE* pFile = NULL; + errno_t err = 0; + + if( !( err = _wfopen_s( &pFile, g_LogPath, L"w" ) ) ) + fclose( pFile ); + } +} \ No newline at end of file diff --git a/Hooks/ButtonHook/Stdafx.h b/Hooks/ButtonHook/Stdafx.h new file mode 100644 index 0000000..312dd01 --- /dev/null +++ b/Hooks/ButtonHook/Stdafx.h @@ -0,0 +1,47 @@ +// stdafx.h : include file for standard system include files, +// or project specific include files that are used frequently, +// but are changed infrequently +#pragma once + +// Compiler Error Messages that we want to disable: +#pragma warning ( disable : 4793 ) // Compiling functions as native code +#pragma warning ( disable : 4996 ) // 'strncpy': This function or variable may be unsafe + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include + +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Global Enums +//******************************************************************** +////////////////////////////////////////////////////////////////////// + +// Logging Detail Settings +typedef enum _LoggingDetail{LOGGING_NONE,LOGGING_LOW,LOGGING_MEDIUM,LOGGING_HIGH,LOGGING_DEBUG} LoggingDetail; + +// Enable Logging and if so, which detail (default = none) +static LoggingDetail g_LoggingDetail = LOGGING_NONE; +static wchar_t g_LogPath[MAX_PATH + 1] = {0}; +static const wchar_t g_LOG_FILE_NAME[] = L"ButtonHook.log"; // Log File for now is just hardcoded + +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Global Functions +//******************************************************************** +////////////////////////////////////////////////////////////////////// + +// Logs to Ooganizer.log in temporary folder if no log path is set +// %USERPROFILE%\AppData\Local\Temp\Ooganizer.log +//void log(LoggingDetail detail, char * pFmt, ... ); +void log( LoggingDetail detail, HWND hWnd, wchar_t* str); // Logs Window Text +void log( LoggingDetail detail, wchar_t * pFmt, ... ); + +// At Startup we clear the log +void clearLog(); + +// Set the global (for this dll instance) Logging Detail Setting +void SetLoggingDetail(LoggingDetail detail, wchar_t* logPath); + +// Get Logging Detail for custom debug behavior +_LoggingDetail GetLoggingDetail(); \ No newline at end of file diff --git a/Hooks/ButtonHook/WPFCaller.cpp b/Hooks/ButtonHook/WPFCaller.cpp new file mode 100644 index 0000000..334f1f1 --- /dev/null +++ b/Hooks/ButtonHook/WPFCaller.cpp @@ -0,0 +1,1417 @@ +#include "StdAfx.h" +#include "WPFCaller.h" +#include "CWHPaccess.h" +#include "shellapi.h" +#include "dde.h" +#include "ddeml.h" + +using namespace Ooganizer; + +// Specifies a nonzero timer identifier +#define NID_RESTORE_EVENT_TIMER (WM_USER + 1) +#define NID_CLOSE_BUT_NOT_DESTROY_EVENT_TIMER (WM_USER + 2) + +// * Messages send from WPFCaller class to WPFProc Thread +#define WM_KILLTHREAD (WM_USER + 501) + +// * Messages Send from W32Button to WPFProc Thread +#define WM_GETBUTTONTHEMESETTING (WM_USER + 601) +#define WM_W32BUTTONCLICKED (WM_USER + 602) + +// * External Messages * Send to us by outside +// Programs (most likely WPFForm or Platform) +#define WM_W32PINGISALIVE (WM_USER + 700) +#define WM_W32SETBUTTONSTATE (WM_USER + 701) +#define WM_W32GETBUTTONSTATE (WM_USER + 702) +#define WM_W32SETPARENTWINDOWTRANSPERANCY (WM_USER + 703) +#define WM_W32SETPARENTWINDOWACTIVE (WM_USER + 704) +#define WM_W32POSTMESSAGETOPARENTWINDOW (WM_USER + 705) + +// * Messages Only handled by WPFThreadProc * Events Send to +// C# Client Event Dispatcher for handling +#define WM_CLIENT_EVENT_WINDOWACTIVATE (WM_USER + 800) +#define WM_CLIENT_EVENT_DRAGNDROPOCCURED (WM_USER + 801) +#define WM_CLIENT_EVENT_MDICHILDWINDOWSWITCHOCCURED (WM_USER + 802) +#define WM_CLIENT_EVENT_PARENTGETSETTEXTOCCURED (WM_USER + 803) +#define WM_CLIENT_EVENT_PARENTNOTIFYLBUTTONCLICKOCCURED (WM_USER + 804) +#define WM_CLIENT_EVENT_PARENTNOTIFYWMCREATEOCCURED (WM_USER + 805) +#define WM_CLIENT_EVENT_PARENTCLOSEWITHOUTDESTROYOCCURED (WM_USER + 806) +#define WM_CLIENT_EVENT_PARENTSETFOCUSOCCURED (WM_USER + 807) +#define WM_CLIENT_EVENT_OPENFILEORSAVEASDIALOGOCCURED (WM_USER + 808) + +#ifdef _DEBUG + #import "..\\..\\Target\\Debug\\Settings.tlb" raw_interfaces_only +#else + #import "..\\..\\Target\\Release\\Settings.tlb" raw_interfaces_only +#endif +using namespace Settings; + +// access the SharedDS *initialized by WPFCaller() constructor* +CWHPaccess* s_WPFCallerAccess = NULL; + +////////////////////////////////////////////////////////////////////// +// Func: ReadButtonThemeSetting +// Desc: static function to quickly read in Button Theme Settings. +// ~Uses COM, must be called ONLY from within a COM initialized Thread! +////////////////////////////////////////////////////////////////////// +bool ReadButtonThemeSetting(WPFCaller* pCaller) +{ + HRESULT hr = S_FALSE; + + _ButtonThemeNIconSettingsCCWPtr pButtonThemeNIconSetting; + hr = pButtonThemeNIconSetting.CreateInstance(__uuidof(ButtonThemeNIconSettingsCCW)); + + if(SUCCEEDED(hr)) + { + log(LOGGING_HIGH, L"Succeed creating ButtonThemeNIconSettings Instance"); + } + else + { + log(LOGGING_LOW, L"FAILED to create the ButtonThemeNIconSettings COM Instance"); + return false; + } + + //// + // Get the Button Theme N Icon Settings + //// + IButtonThemeSettingPtr pThemeSetting; + IButtonIconLocationPtr pIconLocation; + pButtonThemeNIconSetting->GetIButtonThemeInterface(&pThemeSetting); + pButtonThemeNIconSetting->GetIButtonIconLocation(&pIconLocation); + + if(pThemeSetting == NULL) + log(LOGGING_LOW, L"pThemeSetting == NULL - Error"); + if(pIconLocation == NULL) + log(LOGGING_LOW, L"pIconLocation == NULL - Error"); + + if((pThemeSetting == NULL) || (pIconLocation == NULL)) + return false; + + //// + // Get Button Dimension/Location + //// + if(SUCCEEDED(hr)) + hr = pThemeSetting->Top(&pCaller->m_ButtonThemeSetting.Top); + if(SUCCEEDED(hr)) + hr = pThemeSetting->Right(&pCaller->m_ButtonThemeSetting.Right); + if(SUCCEEDED(hr)) + hr = pThemeSetting->Height(&pCaller->m_ButtonThemeSetting.Height); + if(SUCCEEDED(hr)) + hr = pThemeSetting->Width(&pCaller->m_ButtonThemeSetting.Width); + + //// + // Get Button Icon Location + //// + if(SUCCEEDED(hr)) + pIconLocation->GetBUTTON_UP(pCaller->m_ButtonThemeSetting.bstrBUTTON_UP.GetAddress()); + if(SUCCEEDED(hr)) + pIconLocation->GetBUTTON_DOWN(pCaller->m_ButtonThemeSetting.bstrBUTTON_DOWN.GetAddress()); + if(SUCCEEDED(hr)) + pIconLocation->GetTOGGLE_UP(pCaller->m_ButtonThemeSetting.bstrTOGGLE_UP.GetAddress()); + + if(SUCCEEDED(hr)) + { + log(LOGGING_HIGH, L"ReadButtonTheme Settings Successfully - Height=%i, Width=%i, Top=%i, Right=%i", + pCaller->m_ButtonThemeSetting.Height,pCaller->m_ButtonThemeSetting.Width,pCaller->m_ButtonThemeSetting.Top, pCaller->m_ButtonThemeSetting.Right); + + if(pCaller->m_ButtonThemeSetting.bIsInitialized) + pCaller->m_ButtonThemeSetting.bIsChanged = true; + + if(!pCaller->m_ButtonThemeSetting.bIsInitialized) + pCaller->m_ButtonThemeSetting.bIsInitialized = true; + } + else + { + pCaller->m_ButtonThemeSetting.bIsChanged = false; + pCaller->m_ButtonThemeSetting.bIsInitialized = false; + log(LOGGING_LOW, L"ReadButtonTheme Settings FAILED!"); + } + + if(SUCCEEDED(hr)) + return true; + else + return false; +} + +//// +// When we want to communicate back to the ButtonHook from externaly windows, +// we use these custom messages in order to do so. We keep track of them seperatly +// because we allow Custom Messages to return a Value to the caller. +//// +UINT s_nMessagesCustomMessages = 6; +UINT s_nMessagesCustomMessagesWeHave[] = +{ + WM_W32PINGISALIVE, + WM_W32SETBUTTONSTATE, + WM_W32GETBUTTONSTATE, + WM_W32SETPARENTWINDOWTRANSPERANCY, + WM_W32SETPARENTWINDOWACTIVE, + WM_W32POSTMESSAGETOPARENTWINDOW +}; +bool g_IsMessageACustomMessage(UINT msgID) +{ + for(UINT i = 0; i < s_nMessagesCustomMessages; ++i) + { + if(s_nMessagesCustomMessagesWeHave[i] == msgID) + return true; + } + return false; +} +//// +// For wndproc to know what we care about and pass it down to to W32WndProc +// ~these messages will be tagged with WM_USER for us to handle in our W32WndProc +//// +UINT s_nMessagesWPFormCaresAbout = 2; +UINT s_MessagesWPFormCaresAbout[] = +{ + WM_ACTIVATE, + WM_SIZE, +}; +bool g_IsMessageWPFormCaresAbout(UINT msgID) +{ + for(UINT i = 0; i < s_nMessagesWPFormCaresAbout; ++i) + { + if(s_MessagesWPFormCaresAbout[i] == msgID) + return true; + } + return false; +} +//// +// For wndproc to know what we care about and pass it down to to MainWndProc +// ~these messages will be send straight down for us to handle in our MainWndProc +//// +UINT s_nMessagesW32WindowCaresAbout = 8; +UINT s_MessagesW32WindowCaresAbout[] = +{ + WM_PAINT, + WM_DISPLAYCHANGE, + WM_THEMECHANGED, + WM_SIZE, + WM_MOVE, + WM_LBUTTONDOWN, + WM_MOUSEMOVE, + WM_SHOWWINDOW +}; +bool g_IsMessageW32WindowCaresAbout(UINT msgID) +{ + for(UINT i = 0; i < s_nMessagesW32WindowCaresAbout; ++i) + { + if(s_MessagesW32WindowCaresAbout[i] == msgID) + return true; + } + return false; +} +////////////////////////////////////////////////////////////////////// +// Desc: We need to make sure that we have the init button settings, +// before we can continue in many of our Messaging functions +////////////////////////////////////////////////////////////////////// +void MakeSureButtonThemeSettingWereInitialized(WPFCaller* pCaller) +{ + // We must make sure the Button has all the settings before + // we can draw,move it, etc so sleep the thread until we know we have them + while(!pCaller->m_ButtonThemeSetting.bIsInitialized) + Sleep(20); +} +////////////////////////////////////////////////////////////////////// +// Desc: For our WPFThread callback into WPForm we must make sure +// that we have the handle for our W32Button so to pass it down to them +////////////////////////////////////////////////////////////////////// +void MakeSureW32ButtonWindowGotCreated(WPFCaller* pCaller) +{ + // We must make sure the Button window got created so we can pass the + // handle down + while(pCaller->m_hwndW32Window == NULL) + Sleep(20); +} +////////////////////////////////////////////////////////////////////// +// Desc: For our Win32 Thread we must make sure we have a valid pointer to +// a WPFCaller Object. +////////////////////////////////////////////////////////////////////// +WPFCaller* GetWPFCallerObject(HWND ParenthWnd) +{ + if(s_WPFCallerAccess) + { + BLANK_HookWndItem(Item); + Item = s_WPFCallerAccess->GetHookedWndItem(ParenthWnd); + WPFCaller* pCaller = Item.wpfcaller; + return pCaller; + } + return NULL; +} +////////////////////////////////////////////////////////////////////// +// Func: DrawIconButton (Owner Drawing out Buttons) +// Desc: Responsible for drawing the owner buttons onto the caption bar +////////////////////////////////////////////////////////////////////// +bool DrawIconButton(HINSTANCE hInstance,HDC hdc, WPFCaller* pCaller) +{ + // static Icon handles: + static HANDLE hCurrIcon = NULL; + static HANDLE hButtonUp = NULL; + static HANDLE hButtonDown = NULL; + static HANDLE hToggleUp = NULL; + + // LoadIcon only loads once, but LoadImage does not, + // so in case you call the latter, use this flag + static bool bIconsLoaded = false; + + // Make sure that we don't continue unless we have all the settings + MakeSureButtonThemeSettingWereInitialized(pCaller); + + if (!bIconsLoaded || pCaller->m_ButtonThemeSetting.bIsChanged) + { + //// + // ButtonUp + //// + if(!hButtonUp) + { + HANDLE hTemp = hButtonUp; + hButtonUp = NULL; //*avoid poss. threading issue + DestroyIcon((HICON)hTemp); + } + hButtonUp = LoadImage(hInstance, (WCHAR*)pCaller->m_ButtonThemeSetting.bstrBUTTON_UP,IMAGE_ICON,pCaller->m_ButtonThemeSetting.Width,pCaller->m_ButtonThemeSetting.Height,LR_LOADFROMFILE); + if(!hButtonUp) + log(LOGGING_LOW, L"hButtonUp LoadImage Failed! with error %i - path %s",GetLastError(),(wchar_t*)pCaller->m_ButtonThemeSetting.bstrBUTTON_UP); + + //// + // ButtonDown + //// + if(!hButtonDown) + { + HANDLE hTemp = hButtonDown; + hButtonDown = NULL; //*avoid poss. threading issue + DestroyIcon((HICON)hTemp); + } + hButtonDown = LoadImage(hInstance, (WCHAR*)pCaller->m_ButtonThemeSetting.bstrBUTTON_DOWN,IMAGE_ICON,pCaller->m_ButtonThemeSetting.Width,pCaller->m_ButtonThemeSetting.Height,LR_LOADFROMFILE); + if(!hButtonDown) + log(LOGGING_LOW, L"hButtonDown LoadImage Failed! with error %i - path %s",GetLastError(),(wchar_t*)pCaller->m_ButtonThemeSetting.bstrBUTTON_DOWN); + + //// + // ToogleUp + //// + if(!hToggleUp) + { + HANDLE hTemp = hToggleUp; + hToggleUp = NULL; //*avoid poss. threading issue + DestroyIcon((HICON)hTemp); + } + hToggleUp = LoadImage(hInstance, (WCHAR*)pCaller->m_ButtonThemeSetting.bstrTOGGLE_UP,IMAGE_ICON,pCaller->m_ButtonThemeSetting.Width,pCaller->m_ButtonThemeSetting.Height,LR_LOADFROMFILE); + if(!hToggleUp) + log(LOGGING_LOW, L"hToggleUp LoadImage Failed! with error %i - path %s",GetLastError(),(wchar_t*)pCaller->m_ButtonThemeSetting.bstrTOGGLE_UP); + + // Everything went well. + bIconsLoaded = true; + pCaller->m_ButtonThemeSetting.bIsChanged = false; + } + + //// + // Now Draw the proper Icon State + //// + bool bUseToogleState = (pCaller->m_ButtonToggledState != BUTTON_NONE); + + if(!bUseToogleState && pCaller->m_ButtonState == BUTTON_DOWN) + hCurrIcon = hButtonDown; + else if(pCaller->m_ButtonState == BUTTON_UP) + hCurrIcon = hButtonUp; + else if(bUseToogleState || pCaller->m_ButtonState == BUTTON_TOGGLED) + hCurrIcon = hToggleUp; + + if(hCurrIcon != NULL) + { + if (!DrawIconEx(hdc,0,0,(HICON) hCurrIcon, + pCaller->m_ButtonThemeSetting.Width, + pCaller->m_ButtonThemeSetting.Height, + 0, NULL, DI_NORMAL)) + { + log(LOGGING_LOW, L"DrawIconEx Failed!"); + return false; + } + } + + return true; +} +////////////////////////////////////////////////////////////////////// +// Desc: Set static HeightNWidth (keeping track of the Window size) +////////////////////////////////////////////////////////////////////// +void Helper_GetRectAndSetHeightNWidth(HWND hWnd, WPFCaller* pCaller) +{ + RECT rect; + GetWindowRect(hWnd,&rect); + + pCaller->m_wndHeight = (rect.bottom - rect.top); + pCaller->m_wndWidth = (rect.right - rect.left); + pCaller->m_wndRECT = rect; +} +////////////////////////////////////////////////////////////////////// +// Desc: Set static HeightNWidth (keeping track of the Window size) +////////////////////////////////////////////////////////////////////// +void Helper_GetRectAndSetHeightNWidthUsingPlacement(HWND hWnd, WPFCaller* pCaller) +{ + WINDOWPLACEMENT place; + place.length = sizeof(WINDOWPLACEMENT); + GetWindowPlacement(hWnd,&place); + + pCaller->m_wndHeight = (place.rcNormalPosition.bottom - place.rcNormalPosition.top); + pCaller->m_wndWidth = (place.rcNormalPosition.right - place.rcNormalPosition.left); + pCaller->m_wndRECT = place.rcNormalPosition; +} +////////////////////////////////////////////////////////////////////// +// Func: W32WndProc (W32Window) +// Desc: Responsible for handling the Wnd32Window's incoming messages +////////////////////////////////////////////////////////////////////// +LRESULT CALLBACK W32WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) +{ + LRESULT result = 0; + PAINTSTRUCT ps; + HDC hdc; + int nTop = 0; + int nRight = 0; + bool bIsMaximized = false; + HINSTANCE hInst = NULL; + + // Use the ParentHWND to get access to the correct WPFCaller instance, + // we need to do this in case multiple windows exist in the same process + WPFCaller* pCaller = GetWPFCallerObject(::GetParent(hWnd)); + + // Nothing to do here, WPFCaller is not ready (just handle the message) + if(pCaller == NULL) + goto HANDLE_MESSAGE; + + //// + // Messages should be handled here (if we are interested) + //// + try + { + // For some calls we need th HINSTANCE + hInst = pCaller->m_hInst; + + switch(Msg) + { + //// + // Win32Button Messages we handle + //// + case WM_SIZE: + if(wParam == SIZE_MINIMIZED) + { + pCaller->m_bButtonIsMinimized = true; + } + else if((wParam == SIZE_RESTORED && pCaller->m_bButtonIsMinimized) || + (wParam == SIZE_MAXIMIZED && pCaller->m_bButtonIsMinimized)) + { + // the Button receives this message way before the parent does. + pCaller->m_bButtonIsBeingRestored = true; + } + // Intentional Fallthru + case WM_DISPLAYCHANGE: + case WM_MOVE: + { + // ~Calculate Offset for Maximized Windows - IMP + // in vista, we need 7 height offset + // we need 5 width offset + // ~i tried using the best values that make sense + const int YHEIGHT_OFFSET = GetSystemMetrics(SM_CYFRAME) - 1; // subtract 1 to better position the button (and not cut it off as much) + const int XWIDTH_OFFSET = (2 * GetSystemMetrics(SM_CXEDGE)) + GetSystemMetrics(SM_CXBORDER); + bool bIsMaximized = (IsZoomed(pCaller->m_hWnd) == TRUE); + + int YOFFSET = 0; + int XOFFSET = 0; + if(bIsMaximized) + { + YOFFSET = YHEIGHT_OFFSET; + XOFFSET = XWIDTH_OFFSET; + } + + // Set the Window Position (Use Offset if need be) + MakeSureButtonThemeSettingWereInitialized(pCaller); + Helper_GetRectAndSetHeightNWidth(pCaller->m_hWnd, pCaller); + nTop = pCaller->m_wndRECT.top + pCaller->m_ButtonThemeSetting.Top; + nRight = pCaller->m_wndRECT.left + pCaller->m_wndWidth - pCaller->m_ButtonThemeSetting.Right; + SetWindowPos(hWnd, HWND_TOP, nRight - XOFFSET, nTop + YOFFSET, pCaller->m_ButtonThemeSetting.Width, pCaller->m_ButtonThemeSetting.Height, NULL); + + bool bIsMinimizeMoveMessage = false; + if(Msg == WM_MOVE) + { + int x = LOWORD(lParam); + int y = HIWORD(lParam); + bIsMinimizeMoveMessage = (x > 33500) && (y > 33500); + } + // If the window is just too damn small to hold all the buttons just hide it! + // ~better user experience + const int MIN_WITDH_TO_DISPLAY_BUTTON_IN = 300; + if((pCaller->m_wndWidth > 25) && /* make sure width is bigger >0 may as well put in some magic number buffer */ + !bIsMinimizeMoveMessage && + (pCaller->m_wndWidth < MIN_WITDH_TO_DISPLAY_BUTTON_IN) && !pCaller->m_bButtonIsArtificiallyHidden_MOVE && !pCaller->m_bButtonIsMinimized) + { + log(LOGGING_DEBUG, L"WM_MOVE Setting ButtonWindow Artificially Hidden to true"); + pCaller->m_bButtonIsArtificiallyHidden_MOVE = true; + RedrawWindow(pCaller->m_hwndW32Window,NULL,NULL,(RDW_INVALIDATE | RDW_UPDATENOW)); + } + else if((pCaller->m_wndWidth >= MIN_WITDH_TO_DISPLAY_BUTTON_IN) && pCaller->m_bButtonIsArtificiallyHidden_MOVE && !pCaller->m_bButtonIsMinimized) + { + log(LOGGING_DEBUG, L"WM_MOVE Setting ButtonWindow Artificially Hidden to false"); + pCaller->m_bButtonIsArtificiallyHidden_MOVE = false; + pCaller->StartRestoreEventFadeTimer(); + } + return 0; + } + break; + + case WM_SHOWWINDOW: + if((BOOL) wParam == FALSE) // window is being hidden + { + pCaller->SetAlpha(0); + } + else if((BOOL) wParam == TRUE) // window is being shown + { + pCaller->StartRestoreEventFadeTimer(); + } + return 0; + + case WM_MOUSEMOVE: + TRACKMOUSEEVENT mouseEvent; + mouseEvent.cbSize = sizeof(TRACKMOUSEEVENT); + mouseEvent.dwFlags = TME_HOVER | TME_LEAVE; + mouseEvent.hwndTrack = hWnd; + mouseEvent.dwHoverTime = 25; + TrackMouseEvent(&mouseEvent); + break; + + case WM_LBUTTONDOWN: + log(LOGGING_HIGH, L"ButtonWindow received ButtonClick Sending Click Event to WPForm"); + PostThreadMessage(pCaller->m_threadID,WM_W32BUTTONCLICKED,NULL,NULL); + return 0; + + case WM_MOUSEHOVER: + pCaller->m_ButtonState = BUTTON_UP; + RedrawWindow(pCaller->m_hwndW32Window,NULL,NULL,(RDW_INVALIDATE | RDW_UPDATENOW)); + return 0; + + case WM_MOUSELEAVE: + pCaller->m_ButtonState = BUTTON_DOWN; + RedrawWindow(pCaller->m_hwndW32Window,NULL,NULL,(RDW_INVALIDATE | RDW_UPDATENOW)); + return 0; + + case WM_TIMER: + // FadeInTimer (Restore from Minimize) + if(wParam == NID_RESTORE_EVENT_TIMER) + { + // Increment Opaqueness + const int SLEEP_INCREMENT = 1; // 1 == lowest + const int LOWER_INCREMENT = 7; + const int MIDDLE_INCREMENT = 15; + const int UPPER_INCREMENT = 25; + + // Increment Points + const int SLEEP_DONE_POINT = 7; // (7 + 1) * 20 = 160ms of sleep + const int LOWER_POINT = 60; + const int MIDDLE_POINT = 160; + const int UPPER_POINT = 230; + + BYTE alpha = pCaller->GetAlpha(); + if(alpha >= UPPER_POINT) + alpha = 255; // just show the thing already + else if(alpha <= SLEEP_DONE_POINT) // sleep a little in the beginning... + alpha += SLEEP_INCREMENT; + else if(alpha <= LOWER_POINT) + alpha += LOWER_INCREMENT; + else if(alpha <= MIDDLE_POINT) + alpha += MIDDLE_INCREMENT; + else + alpha += UPPER_INCREMENT; + + // Set the calculated Alpha Opaqueness + pCaller->SetAlpha(alpha); + + // Close Restore Timer if we are done + if(pCaller->GetAlpha() == 255) + { + // Kill the Restore Timer + KillTimer(hWnd,NID_RESTORE_EVENT_TIMER); + log(LOGGING_DEBUG, L"Stopping Restore Event Timer"); + } + } + else if(wParam == NID_CLOSE_BUT_NOT_DESTROY_EVENT_TIMER) // Closing Timer for MDI Apps (notify WPFCaller) + { + // We'll run this timer 21x, that should give us ~5 seconds (more than enough, i hope in 99% of cases) + if(pCaller->m_StartCloseButNotDestroyTimerCount == 20) + { + log(LOGGING_DEBUG, L"Stopping Close But not Destroy Timer"); + pCaller->m_StartCloseButNotDestroyTimerCount = 0; + KillTimer(hWnd,NID_CLOSE_BUT_NOT_DESTROY_EVENT_TIMER); + } + else + { + log(LOGGING_DEBUG, L"EventDispatcherHandler - WM_CLOSE but no WM_DESTROY Occured letting WPFCaller know"); + pCaller->m_StartCloseButNotDestroyTimerCount = pCaller->m_StartCloseButNotDestroyTimerCount + 1; + PostThreadMessage(pCaller->m_threadID, WM_CLIENT_EVENT_PARENTCLOSEWITHOUTDESTROYOCCURED,0,0); + } + } + break; + + case WM_PAINT: + // If we are minimized and we are getting messages from our parent + // ~now we can launch the restore Timer + if(pCaller->m_bButtonIsBeingRestored && + (wParam == (WPARAM) pCaller->m_hWnd) && (lParam == (LPARAM) pCaller->m_hWnd)) + { + // restore timer will from now on handle the restore + pCaller->m_bButtonIsBeingRestored = false; + pCaller->m_bButtonIsMinimized = false; + + // Hides the Button Completly + log(LOGGING_DEBUG, L"WM_PAINT is starting StartRestoreEventFadeTimer()"); + pCaller->StartRestoreEventFadeTimer(); + } + + // Only Draw the button when we want to + if(!pCaller->m_bButtonIsMinimized && + !pCaller->m_bButtonIsArtificiallyHidden_MOVE) + { + hdc = BeginPaint(hWnd, &ps); + DrawIconButton(hInst,ps.hdc,pCaller); + EndPaint(hWnd, &ps); + } + return 0; + + case WM_THEMECHANGED: + log(LOGGING_MEDIUM, L"Received WM_THEMECHANGED. W32Button is trying to retrieve new Theme Settings via WPFProc"); + PostThreadMessage(pCaller->m_threadID,WM_GETBUTTONTHEMESETTING,NULL,NULL); + break; + + case WM_W32PINGISALIVE: + return 1; + + case WM_W32SETBUTTONSTATE: + log(LOGGING_DEBUG, L"Received WM_W32SetButtonState Message. Setting Button to %d", (int)lParam); + pCaller->m_ButtonState = (BUTTON_STATE) lParam; + + // Button will be toggled / untoggled when the caller set it + if(pCaller->m_ButtonState == BUTTON_TOGGLED) + pCaller->m_ButtonToggledState = BUTTON_TOGGLED; + else + pCaller->m_ButtonToggledState = BUTTON_NONE; + + RedrawWindow(pCaller->m_hwndW32Window,NULL,NULL,(RDW_INVALIDATE | RDW_UPDATENOW)); + return 1; + + case WM_W32GETBUTTONSTATE: + log(LOGGING_DEBUG, L"Received WM_W32GetButtonState Message. Sending Button State %d", (int)pCaller->m_ButtonState); + return (LRESULT) pCaller->m_ButtonState; + + case WM_W32SETPARENTWINDOWTRANSPERANCY: + { + if((int)lParam == 0) + log(LOGGING_DEBUG, L"Received WM_W32SETPARENTWINDOWTRANSPERANCY Message with Alpha Setting of %u - Invisible", (int)lParam); + else if((int)lParam == 255) + log(LOGGING_DEBUG, L"Received WM_W32SETPARENTWINDOWTRANSPERANCY Message with Alpha Setting of %u - Visible", (int)lParam); + + long dwStyle = (GetWindowLong(pCaller->m_hWnd,GWL_EXSTYLE) | WS_EX_LAYERED); + long retVal = SetWindowLong(pCaller->m_hWnd,GWL_EXSTYLE,dwStyle); + + if(retVal == 0) + { + log(LOGGING_LOW, L"WM_W32SETPARENTWINDOWTRANSPERANCY SetWindowLong Failed! It returned 0"); + return 0; + } + + // Set the Alpha Channel on the Parent Window + if(!SetLayeredWindowAttributes(pCaller->m_hWnd,RGB(0,0,0),(BYTE)lParam,LWA_ALPHA)) + { + log(LOGGING_LOW, L"WM_W32SETPARENTWINDOWTRANSPERANCY SetLayeredWindowAttributes Failed! It returned false"); + return 0; + } + + // Also Set it on the Button (let it become transparent/untransparent with the hooked window) + pCaller->SetAlpha((BYTE)lParam); + } + return 1; + + case WM_W32SETPARENTWINDOWACTIVE: + { + HWND hWnd = ::SetActiveWindow(pCaller->m_hWnd); + if(hWnd == NULL) + return 0; + else + return 1; + } + return 0; + + case WM_W32POSTMESSAGETOPARENTWINDOW: + { + if((int)lParam != 0) + { + wchar_t buf[MAX_PATH] = {0}; + if(GlobalGetAtomName((ATOM) lParam, buf,MAX_PATH) == 0) + { + log(LOGGING_DEBUG, L"*Error* - WM_W32SENDMESSAGETOPARENTWINDOW received no String from Atom"); + } + else + { + HWND hWndM = NULL; + UINT MsgM = 0; + WPARAM wParamM = 0; + LPARAM lParamM = 0; + int IntsM[4] = {0}; + + bool bParseFailed = false; + log(LOGGING_DEBUG, L"WM_W32SENDMESSAGETOPARENTWINDOW received String from Atom %s", buf); + + wchar_t* pToken = wcstok(buf, L";"); + for (int i = 0; (pToken != NULL) && (i < 4); ++i) + { + log(LOGGING_DEBUG, L"WM_W32SENDMESSAGETOPARENTWINDOW Token %d - %s", (i + 1), pToken); + IntsM[i] = _wtoi(pToken); + if(((i == 0) || (i == 1))&& (IntsM[i] == 0)) + { + log(LOGGING_DEBUG, L"*Error* - WM_W32SENDMESSAGETOPARENTWINDOW token %d is invalid", (i + 1)); + bParseFailed = true; + } + + pToken = wcstok(NULL, L";"); + } + + if(!bParseFailed) + { + hWndM = (HWND) IntsM[0]; + MsgM = (UINT) IntsM[1]; + wParamM = (WPARAM) IntsM[2]; + lParamM = (LPARAM) IntsM[3]; + + if(IsWindow(hWndM)) + { + log(LOGGING_DEBUG, L"WM_W32SENDMESSAGETOPARENTWINDOW Posting Message to hWnd %d, Msg %d, wParam %d, lParam %i", hWndM, MsgM, wParamM, lParamM); + PostMessage(hWndM,MsgM,wParamM,lParamM); + return 1; + } + else + log(LOGGING_DEBUG, L"*Error* - WM_W32SENDMESSAGETOPARENTWINDOW window handle %d is invalid", hWndM); + } + return 0; + } + } + else + { + log(LOGGING_DEBUG, L"*Error* - WM_W32SENDMESSAGETOPARENTWINDOW received no Atom"); + } + } + return 0; + + } + } + catch(...) + { + log(LOGGING_LOW, L"*Error* - A fatal error occured in W32WndProc for W32Button"); + } + + HANDLE_MESSAGE: + LRESULT lr = DefWindowProc(hWnd,Msg,wParam,lParam); + return (lr); +} +////////////////////////////////////////////////////////////////////// +// Func: WPFThreadProc (WPFButtonForm) +// Desc: Responsible for handling messages that are supposed to go to the WPFButtonForm +////////////////////////////////////////////////////////////////////// +DWORD WINAPI WPFThreadProc(__in LPVOID lpParameter) +{ + CoInitialize(NULL); + MSG msg; + + // Force the system to create a message queue for the thread + PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); + + IButtonFormPtr wpfForm; + IClientEventsPtr EventDispatcherForwarder; + + WPFCaller* pCaller = (WPFCaller*) lpParameter; + + // handle to parent window (Hooked Window) + HWND hWnd = pCaller->m_hWnd; + + // First thing we want to do is read the icon setting for the win32 button + // *we are doing it here because we are reading the settings using COM, + // and this thread is COM enabled + if(!ReadButtonThemeSetting(pCaller)) + return -1; + + // We need to sit here idly and wait to make sure that we got the Button Window Handle + MakeSureW32ButtonWindowGotCreated(pCaller); + HWND hWndButton = pCaller->m_hwndW32Window; // handle to the Button Window + log(LOGGING_DEBUG, L"WPFThreadProc: Wait over. ButtonW32 Window got created (%u).", hWndButton); + + // Try to create a WPF Form Objects + HRESULT hr = wpfForm.CreateInstance(__uuidof(ButtonWPFormCCW)); + + if(SUCCEEDED(hr)) + { + try + { + // Let's get the IClientEvents Interface to forward Window Client Events + log(LOGGING_HIGH, L"Trying to query for IClientEvents Interface"); + HRESULT hr = wpfForm.QueryInterface(__uuidof(IClientEvents), &EventDispatcherForwarder); + + if(SUCCEEDED(hr)) + log(LOGGING_HIGH, L"Querying for IClientEvents succeeded"); + else + log(LOGGING_LOW, L"Querying for IClientEvents failed"); + + // Let the WPF form know that we activated (and pass out the window handle + // that activated it) ~this is importanted for housekeeping. also pass out the + // Button Handle so that it can set it's state. ~Imp + log(LOGGING_DEBUG, L"Calling WPFThreadProc_ButtonWPForm_Activated Method with Parent (%u) and Button (%u)", hWnd, hWndButton); + wpfForm->WPFThreadProc_ButtonWPForm_Activated((long)hWnd, (long) hWndButton); + log(LOGGING_HIGH, L"Calling WPFThreadProc_ButtonWPForm_Activated Method Returned - Everything is O.K."); + + // Also let the Client Event know the same thing + log(LOGGING_DEBUG, L"WM_CLIENT_EVENT hWndInitialActivate() forwarding it to WPFButton for PID %u and hWnd %u with CommandLine %s", ::GetCurrentProcessId(), hWnd, ::GetCommandLine()); + _bstr_t CommandLinePrms(GetCommandLine()); + EventDispatcherForwarder->hWndInitialActivate(GetCurrentProcessId(), (long)hWnd,CommandLinePrms); + log(LOGGING_HIGH, L"WM_CLIENT_EVENT hWndInitialActivate() returned - Everything is O.K."); + + // Let OnDefault know that this Thread is ready to receive messages + pCaller->m_bThreadIsReady = true; + BOOL bRet = FALSE; + + while( (bRet = GetMessage( &msg, (HWND)-1, 0, 0 )) != 0) + { + if (bRet == -1) + { + // handle the error and possibly exit + log(LOGGING_LOW, L"A Fatal Error Occured in ThreadProc. Exiting!", hr); + goto STOPPING_THREAD; + break; + } + else + { + //// + // MAIN MESSAGE LOOP + //// + switch(msg.message) + { + case WM_KILLTHREAD: + log(LOGGING_MEDIUM, L"WM_KILLTHREAD was Posted to Thread. Exiting Window(%u) in pid(%u).", pCaller->m_hWnd, GetCurrentProcessId()); + pCaller->m_hwndWPForm = NULL; + goto STOPPING_THREAD; + break; + + case WM_GETBUTTONTHEMESETTING: + if(ReadButtonThemeSetting(pCaller)) + log(LOGGING_HIGH, L"Received GetButtonThemeSetting Message - Read ButtonThemeSettings Succeeded"); + else + log(LOGGING_LOW, L"Received GetButtonThemeSetting Message - Read ButtonThemeSettings Failed!"); + break; + + case WM_W32BUTTONCLICKED: + log(LOGGING_DEBUG, L"WM_W32BUTTONCLICKED passing down to WPFForm->W32BUTTONCLICKED()"); + pCaller->m_hwndWPForm = (HWND) wpfForm->W32BUTTONCLICKED(); + break; + + case (WM_USER + WM_ACTIVATE): + if((LOWORD(msg.wParam) == WA_ACTIVE) || + (LOWORD(msg.wParam) == WA_CLICKACTIVE)) + { + if(HIWORD(msg.wParam) == 0) + wpfForm->WindowEvent_WindowActivated(); + } + else if(LOWORD(msg.wParam) == WA_INACTIVE) + { + if(HIWORD(msg.wParam) == 0) + wpfForm->WindowEvent_WindowDeactivated(); + } + break; + + case (WM_USER + WM_SIZE): + if(msg.wParam == SIZE_MAXIMIZED) + wpfForm->WindowEvent_MaximizeOccured((long)HIWORD(msg.lParam),(long)LOWORD(msg.lParam)); + + else if(msg.wParam == SIZE_MINIMIZED) + wpfForm->WindowEvent_MinimizeOccured(); + + break; + + //// + // Client Window Events * WPFThreadProc sends them to a Event Dispatcher + // via COM to let C# know about these * + //// + case (WM_CLIENT_EVENT_MDICHILDWINDOWSWITCHOCCURED): + case (WM_CLIENT_EVENT_PARENTGETSETTEXTOCCURED): + case (WM_CLIENT_EVENT_PARENTSETFOCUSOCCURED): + { + log(LOGGING_DEBUG, L"WM_CLIENT_EVENT ReResolve() forwarding it to WPFButton"); + EventDispatcherForwarder->ReResolve(GetCurrentProcessId(),(long)hWnd); // Ideally only switches of active document occur this way + } + break; + + case (WM_CLIENT_EVENT_PARENTNOTIFYLBUTTONCLICKOCCURED): + case (WM_CLIENT_EVENT_PARENTNOTIFYWMCREATEOCCURED): + case (WM_CLIENT_EVENT_PARENTCLOSEWITHOUTDESTROYOCCURED): + { + log(LOGGING_DEBUG, L"WM_CLIENT_EVENT PossArtifactAddedDeleted() forwarding it to WPFButton"); + //EventDispatcherForwarder->ReResolve(GetCurrentProcessId(),(long)hWnd); + } + break; + + case (WM_CLIENT_EVENT_DRAGNDROPOCCURED): + { + log(LOGGING_DEBUG, L"WM_CLIENT_EVENT DragNDropOccured() forwarding it to WPFButton"); + EventDispatcherForwarder->DragNDropOccured(GetCurrentProcessId(),(long)hWnd,pCaller->m_nDragDroppedFilesCount,pCaller->m_bstrDragDroppedFilesSemiColonSep); + } + break; + + case (WM_CLIENT_EVENT_OPENFILEORSAVEASDIALOGOCCURED): + { + log(LOGGING_DEBUG, L"WM_CLIENT_EVENT OpenOrSaveFileDialogOccured() forwarding it to WPFButton"); + _bstr_t possLocAndFileName(pCaller->m_strFileNameLocationBuf); + _bstr_t FileTypes(pCaller->m_strFileTypesBuf); + EventDispatcherForwarder->OpenOrSaveFileDialogOccured(GetCurrentProcessId(), (long)hWnd, possLocAndFileName, FileTypes); + } + break; + } + } + } + + // Let the WPF Form know that this thread is exiting to allow it to do + // any cleanup it may want to do + STOPPING_THREAD: + + log(LOGGING_LOW, L"EventDispatcherHandler - hWindow %u Deactivation Occured for PID %u", hWnd,::GetCurrentProcessId()); + wpfForm->WPFThreadProc_ButtonWPForm_Deactivated(); + + // Also let the Client Event know the same thing + log(LOGGING_DEBUG, L"WM_CLIENT_EVENT hWndLastDeactivate() forwarding it to WPFButton for PID %u and hWnd %u", ::GetCurrentProcessId(), hWnd); + EventDispatcherForwarder->hWndLastDeactivate(GetCurrentProcessId(), (long)hWnd); + + } + catch(...) + { + log(LOGGING_LOW, L"*Error* - A fatal Error Occured in WPFThreadProc WpfButton. Exiting..."); + } + } + else + { + log(LOGGING_LOW, L"Error occured creating WPForm Instance COM %i. Exiting...",hr); + } + + pCaller->m_bThreadIsReady = false; + CoUninitialize(); + return 0; +} +//******************************************************************** +// Class WPFCaller +// +// Programmer Daniel Romischer +// Ooganizer Development Team +// +// Description ~This class holds the default wndproc to process all the +// messages and send them to the WPF COM Object via the COM Thread. +// +// Note ~ All the host's Windows Messages enter in on OnDefault() +// +// Created 05-26-2008 +//******************************************************************** +////////////////////////////////////////////////////////////////////// +//******************************************************************** +// Construction / Destruction +//******************************************************************** +////////////////////////////////////////////////////////////////////// +WPFCaller::WPFCaller(HookWndItem Item, HINSTANCE hInstance): +m_hWnd(Item.hWnd), +m_hwndWPForm(NULL), +m_hwndW32Window(NULL), +m_DefWndProc(Item.DefWndProc), +m_HookWndProc(Item.HookWndProc), +m_thread(NULL), +m_threadID(0), +m_bThreadIsReady(false), +m_hInst(hInstance), +m_wndHeight(0), +m_wndWidth(0), +m_ButtonState(BUTTON_NONE), +m_ButtonToggledState(BUTTON_NONE), +m_ButtonStateLastSaved(BUTTON_NONE), +m_ButtonToggledStateLastSaved(BUTTON_NONE), +m_bButtonIsArtificiallyHidden_MOVE(false), +m_bButtonIsMinimized(false), +m_bButtonIsBeingRestored(false), +m_StartCloseButNotDestroyTimerCount(0), +m_nDragDroppedFilesCount(0) +{ + + // Allow us access to the static DS *only load once* + if(s_WPFCallerAccess == NULL) + s_WPFCallerAccess = new CWHPaccess(); + + // just to make sure (to avoid any thread issues) assign out the this instance + // BEFORE creating the threads *below*. + Item.wpfcaller = this; + if(s_WPFCallerAccess->SetHookedWndItem(Item.hWnd, Item) == FALSE) + log(LOGGING_LOW, L"WPFCaller SetHookedWndItem FAILED!! (THIS IS NOT GOOD!)"); + + // Create the COM WPF Object for WPF Power and Flexibility + m_thread = CreateThread(NULL,0,&WPFThreadProc,(LPVOID)this,0,&m_threadID); + + if(m_threadID > 0) + log(LOGGING_HIGH, L"WPFCaller Spawned WPFThreadID %i",m_threadID); + else + log(LOGGING_LOW, L"Error - WPFCaller Failed to Spawn WPFThread",m_threadID); + + // Clear FileName/Types Buffer + memset(m_strFileNameLocationBuf,0,(MAX_PATH + 1)); + memset(m_strFileTypesBuf,0,(MAX_PATH + 1)); + + // We are creating a new Thread to deal with 2 windows (WPForm Window, + // Start Window32 Button (for speed) + Start(); +} +WPFCaller::~WPFCaller() +{ + log(LOGGING_DEBUG, L"~WPFCaller() got called"); + + // Destroy the Button Window + if(m_hwndW32Window && ::IsWindow(m_hwndW32Window)) + ::DestroyWindow(m_hwndW32Window); + + // Destroy the COM Thread + if(m_bThreadIsReady) + { + // First let's make sure the thread is even still running and valid, + // an error could have closed down the thread. Let's check if the handle + // gives us a valid id. + DWORD dwThreadId = GetThreadId(m_thread); + bool bThreadIsValid = ((dwThreadId != 0) && (dwThreadId == m_threadID)); + + // if this thread is not valid no need to continue below + if(!bThreadIsValid) + log(LOGGING_LOW, L"WPFThread ID %i was invalid when compared to Id %i, ~thread must already have been closed. An error must have occured", m_threadID, dwThreadId); + + if(bThreadIsValid) + { + // Pass QUIT Message to the COM Thread + log(LOGGING_DEBUG, L"Posting WM_KILLTHREAD Message to COM Thread %i", m_threadID); + PostThreadMessage(m_threadID, WM_KILLTHREAD, NULL, NULL); + + // We need to wait to make sure COM deallocated before exiting, + // otherwise the WPForm remains active, because deallocation never occurs + while(m_bThreadIsReady) + Sleep(20); + + log(LOGGING_DEBUG, L"Closing Thread Handle to Thread %i", m_threadID); + CloseHandle(m_thread); + + // Also Unregister all Window Classes here + //UnregisterClass(L"W32ButtonHookWndClass", m_hInst); + } + else + { + log(LOGGING_LOW, L"Did NOT close WPFThread m_bThreadIsReady was not true - this should mean WPFThread closed due to an error with COM"); + } + } + else + { + log(LOGGING_LOW, L"Did NOT close WPFThread m_bThreadIsReady was not true - this should mean WPFThread closed due to an error with COM"); + } +} +///////////////////////////////////////////////////////////////////// +// Desc: Get the Alpha Channel / Opaqueness of the Button +///////////////////////////////////////////////////////////////////// +BYTE WPFCaller::GetAlpha() +{ + COLORREF pcrKey; + BYTE pbAlpha; + DWORD dwFlags; + GetLayeredWindowAttributes(m_hwndW32Window, &pcrKey, &pbAlpha, &dwFlags); + return pbAlpha; +} +///////////////////////////////////////////////////////////////////// +// Desc: Set the Alpha Channel / Opaqueness for the Button +///////////////////////////////////////////////////////////////////// +void WPFCaller::SetAlpha(BYTE bAlpha) +{ + SetLayeredWindowAttributes(m_hwndW32Window, RGB(255,255,255),bAlpha, LWA_COLORKEY|LWA_ALPHA); +} +///////////////////////////////////////////////////////////////////// +// Desc: Use this to start the Fade event on the Button +///////////////////////////////////////////////////////////////////// +void WPFCaller::StartRestoreEventFadeTimer() +{ + log(LOGGING_DEBUG, L"Launching Restore Event Timer..."); + SetAlpha(0); // Hide Button Completly + SetTimer(m_hwndW32Window, NID_RESTORE_EVENT_TIMER,20,NULL); +} +///////////////////////////////////////////////////////////////////// +// Desc: Use this when a WM_CLOSE message is received. Some Apps won't +// close when this event occurs (but rather close an artifact), +// ~this allows us to detect this occurance +///////////////////////////////////////////////////////////////////// +void WPFCaller::StartCloseButNotDestroyTimer() +{ + // quarter of a second is more than enough time to know whether an app closed or not + // ~but just in case we'll run the timer multiple times over and over + m_StartCloseButNotDestroyTimerCount = 0; + log(LOGGING_DEBUG, L"Launching CloseButNotDestroyTimer..."); + SetTimer(m_hwndW32Window, NID_CLOSE_BUT_NOT_DESTROY_EVENT_TIMER,250,NULL); +} +///////////////////////////////////////////////////////////////////// +// Func: EventDispatcherHandler() +// Desc: Responsible for sending certain client events to the WPFThreadProc +// This allows us to be more interactive. +// +// Note: Not all Client events are handled here *only the easiest ones* +////////////////////////////////////////////////////////////////////// +void WPFCaller::EventDispatcherHandler(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) +{ + + switch(Msg) + { + // DragNDropOccured + case WM_DROPFILES: + { + HDROP hdrop = (HDROP) wParam; + wchar_t buf[MAX_PATH + 1] = {0}; + + m_bstrDragDroppedFilesSemiColonSep = L""; + m_nDragDroppedFilesCount = DragQueryFile(hdrop,0xFFFFFFFF,NULL,0); + //log(LOGGING_DEBUG, L"EventDispatcherHandler - hWindow %u received %d Dropped Files", hWnd, m_nDragDroppedFilesCount); + + for(int i = 0; i < m_nDragDroppedFilesCount; ++i) + { + if(i > 0) + m_bstrDragDroppedFilesSemiColonSep += L";"; + + DragQueryFile(hdrop,i,buf,MAX_PATH); + //log(LOGGING_DEBUG, L"EventDispatcherHandler - File %u - received dropped file %s", i, (char*) buf); + lstrcat((wchar_t *)m_bstrDragDroppedFilesSemiColonSep, buf); + } + + // Let WPFCaller know + PostThreadMessage(m_threadID, WM_CLIENT_EVENT_DRAGNDROPOCCURED ,0,0); + } + break; + + // MDIChildWindowSwitchOccured + case WM_KEYDOWN: + { + // Did Ctrl + F6 or Ctrl + Tab get pushed, if so a possible MDI + // switch occured so relay that information + if((wParam == VK_TAB || wParam == VK_F6) && + (GetKeyState(VK_CONTROL) < 0)) + { + // Let WPFCaller know + //log(LOGGING_DEBUG, L"EventDispatcherHandler - Ctrl + F6 or Ctrl + Tab got pushed - poss. MDIChildWindowSwitch occured"); + PostThreadMessage(m_threadID, WM_CLIENT_EVENT_MDICHILDWINDOWSWITCHOCCURED ,0,0); + } + } + break; + + // ParentGetSetTextOccured + case WM_GETTEXT: + case WM_SETTEXT: + { + // Let WPFCaller know + //log(LOGGING_DEBUG, L"EventDispatcherHandler - ParentGetSetText Occured - poss. MDIChildWindowSwitch occured"); + PostThreadMessage(m_threadID, WM_CLIENT_EVENT_PARENTGETSETTEXTOCCURED,0,0); + } + break; + + // ParentNotifyLButtonClick Occured + // ParentNotifyWMCreate Occured + case WM_PARENTNOTIFY: + { + WORD wMsg = LOWORD(wParam); + switch(wMsg) + { + case WM_CREATE: + { + // Let WPFCaller know + //log(LOGGING_DEBUG, L"EventDispatcherHandler - ParentNotify WM_CREATE Occured - poss. MDIChildWindow Creation occured"); + PostThreadMessage(m_threadID, WM_CLIENT_EVENT_PARENTNOTIFYWMCREATEOCCURED,0,0); + } + break; + + case WM_LBUTTONDOWN: + { + // Let WPFCaller know + //log(LOGGING_DEBUG, L"EventDispatcherHandler - ParentNotify LBUTTONDOWN Occured - poss. MDIChildWindowSwitch occured"); + PostThreadMessage(m_threadID, WM_CLIENT_EVENT_PARENTNOTIFYLBUTTONCLICKOCCURED,0,0); + } + break; + } + } + break; + + // Parent received a WM_CLOSE but didn't destroy itself + case WM_CLOSE: + { + //log(LOGGING_DEBUG, L"EventDispatcherHandler - Received WM_CLOSE running StartCloseButNotDestroyTimer()"); + StartCloseButNotDestroyTimer(); // Win32Button will let the WPFCaller know + } + break; + + // Parent received focus message + case WM_SETFOCUS: + { + // Let WPFCaller know + //log(LOGGING_DEBUG, L"EventDispatcherHandler - Parent SetFocus Occured - poss. MDIChildWindowSwitch occured"); + PostThreadMessage(m_threadID, WM_CLIENT_EVENT_PARENTSETFOCUSOCCURED,0,0); + } + break; + } +} +///////////////////////////////////////////////////////////////////// +// Func: HandleDDEMessages() +// Desc: Because DDE is a message-based protocol, it employs no functions or libraries. +// All DDE transactions are conducted by passing certain defined DDE messages between the +// client and server windows. +// ~We may need to use this for certain applications to listen in +// +// Note: We call this OnDefault(), because DDE message can get passed into us before WPFThread is up and running +////////////////////////////////////////////////////////////////////// +void WPFCaller::HandleDDEMessages(HWND hWnd, UINT Msg,WPARAM wParam,LPARAM lParam) +{ + switch(Msg) + { + case WM_DDE_ACK: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_ACK"); + break; + + case WM_DDE_ADVISE: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_ADVISE"); + break; + + case WM_DDE_DATA: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_DATA"); + break; + + case WM_DDE_EXECUTE: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_EXECUTE"); + break; + + case WM_DDE_INITIATE: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_INITIATE"); + { + wchar_t strBuf[MAX_PATH] = {0}; + ATOM lowword = LOWORD(lParam); + ATOM highword = HIWORD(lParam); + if(lowword != NULL) + { + int nSize = ::GlobalGetAtomName((ATOM)lowword,strBuf,MAX_PATH); + strBuf[nSize] = 0; + //log(LOGGING_DEBUG, L"Found lowword Atom, %d, with lowword String, %s", lowword, strBuf); + } + if(highword != NULL) + { + int nSize = ::GlobalGetAtomName((ATOM)highword,strBuf,MAX_PATH); + strBuf[nSize] = 0; + //log(LOGGING_DEBUG, L"Found highword Atom, %d, with highword String, %s", highword, strBuf); + } + } + break; + + case WM_DDE_POKE: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_POKE"); + break; + + case WM_DDE_REQUEST: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_REQUEST"); + break; + + case WM_DDE_TERMINATE: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_TERMINATE"); + break; + + case WM_DDE_UNADVISE: + //log(LOGGING_DEBUG, L"Received DDE Message WM_DDE_UNADVISE"); + break; + } +} +///////////////////////////////////////////////////////////////////// +// Func: OnDefault() +// Desc: Default handler for any WM_message received (ALL except WM_NCDESTROY +// and m_msgWMUnHook) the Destroy Messages delete this class and are handled +// therefore outside of it +////////////////////////////////////////////////////////////////////// +LRESULT WPFCaller::OnDefault(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam) +{ + LRESULT result = 0; + try + { + + // Handle DDE Messages + HandleDDEMessages(hWnd,Msg,wParam,lParam); + + // If this is a custom message forward it our Button, + // it will be the main handler for our custom messages because it can communicate + // to the COMThread as well as manipulate the Button (we can skip and return the value) + if((m_hwndW32Window != NULL) && (g_IsMessageACustomMessage(Msg))) + { + return SendMessage(m_hwndW32Window,Msg,wParam,lParam); + } + + // regular messages that our W32Button Cares about it, send it (no WM_USER offset needed here) + if((m_hwndW32Window != NULL) && (g_IsMessageW32WindowCaresAbout(Msg))) + { + // work-around for Minimize/Restore. Let the parent communicate + // to the child that it is being redrawn + if(Msg == WM_PAINT && m_bButtonIsMinimized) + { + wParam = (WPARAM) m_hWnd; + lParam = (LPARAM) m_hWnd; + PostMessage(m_hwndW32Window, Msg, wParam, lParam); + } + else + { + SendMessage(m_hwndW32Window, Msg, wParam, lParam); + } + } + + // We pass the Messages we care about forward to our COM/W32/WPF Thread + if(m_bThreadIsReady && (m_threadID != 0)) + { + // IF our COM object cares about this, send it + if(g_IsMessageWPFormCaresAbout(Msg)) + { + // We error if we use PostThreadMessage with message < WM_USER so we offset it + PostThreadMessage(m_threadID,(WM_USER + Msg),wParam,lParam); + } + + // our Event Dispatcher maybe interested in this + // message let it know about it + EventDispatcherHandler(hWnd,Msg,wParam,lParam); + } + + // Call the Default Window Proc - IMPORTANT - Always do this + result = CallWindowProc(m_DefWndProc, hWnd, Msg, wParam, lParam); + } + catch(...) + { + log(LOGGING_LOW, L"*Error* - A Fatal Error occured in WpfCaller's OnDefault() - (This can't be good)"); + } + return result; +} +////////////////////////////////////////////////////////////////////// +// Func: threadproc +// Desc: Thread Entry Point responsible for Dispatching the W32Window Messages +// +// Note: We are on purpose Ignoring Error Msg 1410. If the window class is already registered it +// will throw an error, we can safely continuen and instantiate the window class +////////////////////////////////////////////////////////////////////// +int WINAPI WPFCaller::threadproc(HINSTANCE hinstance, HINSTANCE hPrevInstance, void* vArg, int nCmdShow) +{ + if (!InitApplication(hinstance)) + { + // "Class already exists" this happens if the + // same window get's called again to be hooked into. + // this error can safely be ignored. + if(!(GetLastError() == 1410)) + { + log(LOGGING_LOW, L"initApplication failed error %i",GetLastError()); + return FALSE; + } + } + + if (!InitInstance(hinstance, nCmdShow)) + { + log(LOGGING_LOW, L"initInstance failed error %i",GetLastError()); + return FALSE; + } + + MSG msg; + BOOL bGotMessage; + m_bThreadIsReady = true; // Thread is up N' Ready and Receiving Messages + while ((bGotMessage = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0 ) + { + if(bGotMessage == -1) + { + // handle the error and possible exit + log(LOGGING_LOW, L"An Error Occured in ThreadProc Messaging. Exiting!"); + ExitThread(0); + } + else + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + + return msg.wParam; +} +////////////////////////////////////////////////////////////////////// +// Func: InitApplication() +// Desc: Responsible for setting up the WNDCLASSEX struct and register +// the transparent window with Windows via RegisterClassEx() +// +// Retr: TRUE, if successful, FALSE otherwise +////////////////////////////////////////////////////////////////////// +BOOL WPFCaller::InitApplication(HINSTANCE hInstance) +{ + // Fill in the window class structure with parameters + // that describe the main window. + WNDCLASSEX wcx; + + wcx.cbSize = sizeof(wcx); // size of structure + wcx.style = CS_HREDRAW | CS_VREDRAW; // redraw if size changes + wcx.lpfnWndProc = (WNDPROC) W32WndProc; // points to W32 window procedure + wcx.cbClsExtra = 0; // no extra class memory + wcx.cbWndExtra = 0; // no extra window memory + wcx.hInstance = hInstance; // handle to instance + wcx.hIcon = NULL; + wcx.hCursor = LoadCursor(NULL, IDC_ARROW); // predefined arrow + wcx.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH); // white background brush + wcx.lpszMenuName = L"MainMenu"; // name of menu resource + wcx.lpszClassName = L"W32ButtonHookWndClass"; // name of window class + wcx.hIconSm = NULL; + + // Register the window class. *may throw error 1410* + return RegisterClassEx(&wcx); +} +////////////////////////////////////////////////////////////////////// +// Func: InitInstance() +// Desc: Responsible for Creating and Showing a new Window Class Instance +// +// Retr: TRUE, if successful, FALSE otherwise +////////////////////////////////////////////////////////////////////// +BOOL WPFCaller::InitInstance(HINSTANCE hInstance, int nCmdShow) +{ + // Get the Dimensions of the hooked in Window + RECT rect; + GetWindowRect(m_hWnd,&rect); + + // set owner/parent window + HWND hParent = m_hWnd; + DWORD dwStyle; + + //dwStyle = ( WS_POPUP | WS_BORDER ); // For Debugging + dwStyle = ( WS_POPUP ); + + // If parent Window get's hidden for some reason, should we hide this window? + // by default owned windows don't hide, when their parent is hidden, + // they do hide when parent is minimized. + log(LOGGING_DEBUG, L"Calling CreateWindowEx with Parent %i", hParent); + + //( WS_POPUP | WS_BORDER ), // top-level window + m_hwndW32Window = CreateWindowEx( + ( WS_EX_LAYERED ), // A Layered window is by default transparent + L"W32ButtonHookWndClass", // name of window class + L"W32ButtonHookWndTitle",// title-bar string + dwStyle, // top-level window + rect.left, // default horizontal position + rect.top, // default vertical position + (rect.right - rect.left), // default width + (rect.bottom - rect.top), // default height + (HWND) hParent, // set owner window + // ~An owned window is always above its owner in the Z order and + // is hidden when its owner is minimized + (HMENU) NULL, // use class menu + hInstance, // handle to application instance + (LPVOID) NULL); // no window-creation data + + log(LOGGING_DEBUG, L"CreateWindowEx returns (m_hwndW32Window is set to %i) ", m_hwndW32Window); + + // we can use this to fade the window if we want too... (something to think about...) + //if(SetLayeredWindowAttributes(m_hwndW32Window, RGB(255,255,255),255, LWA_COLORKEY|LWA_ALPHA)){} + SetLayeredWindowAttributes(m_hwndW32Window, RGB(255,255,255),255, LWA_COLORKEY|LWA_ALPHA); + + // Show the window and send a WM_PAINT message to the window procedure. + ShowWindow(m_hwndW32Window, nCmdShow); + UpdateWindow(m_hwndW32Window); + + return (m_hwndW32Window != NULL); +} \ No newline at end of file diff --git a/Hooks/ButtonHook/WPFCaller.h b/Hooks/ButtonHook/WPFCaller.h new file mode 100644 index 0000000..e1cb7fb --- /dev/null +++ b/Hooks/ButtonHook/WPFCaller.h @@ -0,0 +1,171 @@ +#pragma once + +#include "thread.h" + +#ifdef _DEBUG + #import "..\\..\\Target\\Debug\\ButtonWPForm.tlb" +#else + #import "..\\..\\Target\\Release\\ButtonWPForm.tlb" +#endif +using namespace ButtonWPForm; + +namespace Ooganizer +{ + + enum BUTTON_STATE + { + // These are the states that coincide with the states defined + // in ButtonWPFormCCW + BUTTON_NONE = 1, + BUTTON_DOWN = 2, // BUTTON_ADD + BUTTON_TOGGLED = 3, // BUTTON_DELETE + + // Button Up is the Hover image (Used on Mouse Over), + // it is NOT DEFINED in BHInteracter + BUTTON_UP = 1000 + }; + + //// + // ButtonThemeSetting, this static holds our current Button Theme Setting + // ~This structure can be reloaded when a ThemeChange occured (WM_THEMECHANGED) + //// + struct ButtonThemeSetting + { + // Init Flags + bool bIsInitialized; + bool bIsChanged; + + // Int Button Dimension/Location + long Top; + long Right; + long Height; + long Width; + + // String Button Locations + _bstr_t bstrBUTTON_UP; + _bstr_t bstrBUTTON_DOWN; + _bstr_t bstrTOGGLE_UP; + + ButtonThemeSetting() + { + Top = 0; + Right = 0; + Height = 0; + Width = 0; + bIsInitialized = false; + bIsChanged = false; + } + }; + + class CWHPaccess; + class WPFCaller; + + #define BLANK_HookWndItem(n) HookWndItem n = {NULL,NULL,NULL,NULL} + ////////////////////////////////////////////////////////////////////// + // Strc: HookWndItem + // Desc: Hook Item is used in the HookedWndList. Each HookWndItem keeps track + // of all the addresses needed for each hook for each Windows, + // as well as each Window's WPFCaller. + ////////////////////////////////////////////////////////////////////// + struct HookWndItem + { + HWND hWnd; + WNDPROC HookWndProc; + WNDPROC DefWndProc; + WPFCaller* wpfcaller; + }; + ////////////////////////////////////////////////////////////////////// + // Clss: WPFCaller + // Desc: This class is responsible for overriding wndproc draw routines + // and communicate to the WPF COM object + ////////////////////////////////////////////////////////////////////// + class WPFCaller : Thread + { + public: + // All Windows Messages *Except NCDestroy & UnHook* enter here + virtual LRESULT OnDefault (HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); + WPFCaller(HookWndItem Item, HINSTANCE hInstance); + ~WPFCaller(); + + // Each WPFCaller is mapped to a HookWndItem (Hooked Window) + HWND m_hWnd; + WNDPROC m_HookWndProc; + WNDPROC m_DefWndProc; + HINSTANCE m_hInst; + + // Window W32 State Settings + // ~we are keeping track of the Hooked W32 sizes + int m_wndHeight; + int m_wndWidth; + RECT m_wndRECT; + + // We need to keep track of the Button State in order + // to know what to draw + BUTTON_STATE m_ButtonState; + BUTTON_STATE m_ButtonToggledState; // We can overwrite buttonDown state + // with another state. this allows us to + // specify which state to use to overwrite. + + BUTTON_STATE m_ButtonStateLastSaved; + BUTTON_STATE m_ButtonToggledStateLastSaved; + bool m_bButtonIsArtificiallyHidden_MOVE; + bool m_bButtonIsMinimized; + bool m_bButtonIsBeingRestored; + + // Transparency / Fade Effect + BYTE GetAlpha(); + void SetAlpha(BYTE bAlpha); + void StartRestoreEventFadeTimer(); + + // Client Events + void StartCloseButNotDestroyTimer(); + int m_StartCloseButNotDestroyTimerCount; + + // Drag N' Dropped Files + int m_nDragDroppedFilesCount; + _bstr_t m_bstrDragDroppedFilesSemiColonSep; + + // OpenFile or FileSaveAs Dialog Prms Passing + wchar_t m_strFileNameLocationBuf[MAX_PATH + 1]; + wchar_t m_strFileTypesBuf[MAX_PATH + 1]; + + // WPFProc Will load the Button Settings via COM which + // we'll use to draw the Icon + ButtonThemeSetting m_ButtonThemeSetting; + + // Window Handles + HWND m_hwndWPForm; // passed back to us by ButtonWPForm + HWND m_hwndW32Window; // our w32 Button + + // ThreadStuff (WPFComThread) + bool m_bThreadIsReady; + HANDLE m_thread; + DWORD m_threadID; + + private: + + // OnDefault() uses this function to possible send messages + // to the EventDispatcher in C# for further processing + void EventDispatcherHandler(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); + + // We don't need to right now, but we may need it more in the future. + // Office passes in startup file prms via DDE (other apps may too) + void HandleDDEMessages(HWND hWnd, UINT Msg,WPARAM wParam,LPARAM lParam); + + // Win32 Button Window * Created for better speed * + // Responsible for setting up the WNDCLASSEX struct and register the Window + BOOL InitApplication(HINSTANCE hInstance); + + // Responsible for Creating and Showing a new Window Class Instance + BOOL InitInstance(HINSTANCE hInstance, int nCmdShow); + + // Thread Entry + int WINAPI threadproc(HINSTANCE hinstance, HINSTANCE hPrevInstance, void* vArg, int nCmdShow); + + // Thread Entry + virtual DWORD Run(LPVOID vArg) + { + return(threadproc(m_hInst,NULL,vArg,TRUE)); + } + }; +} \ No newline at end of file diff --git a/Hooks/ButtonHook/resource.h b/Hooks/ButtonHook/resource.h new file mode 100644 index 0000000..3135bc0 --- /dev/null +++ b/Hooks/ButtonHook/resource.h @@ -0,0 +1,15 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by ButtonHook.rc +// + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 105 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif diff --git a/Hooks/ButtonHook/thread.h b/Hooks/ButtonHook/thread.h new file mode 100644 index 0000000..2b1d418 --- /dev/null +++ b/Hooks/ButtonHook/thread.h @@ -0,0 +1,100 @@ +#pragma once + +namespace Ooganizer +{ + // Generic Thread Class! + class Thread + { + public: + + // Starts the thread + // This function starts the thread pointed by m_pThreadFunc with default attributes + DWORD Start( void* arg = NULL ) + { + m_ThreadCtx.m_pUserData = arg; + m_ThreadCtx.m_hThread = CreateThread(NULL, 0, m_pThreadFunc, this, 0, &m_ThreadCtx.m_dwTID); + m_ThreadCtx.m_dwExitCode = (DWORD)-1; + return GetLastError(); + } + + // Stops the thread. + // This function stops the current thread + DWORD Stop ( bool bForceKill = false ) + { + log(LOGGING_HIGH, L"Hidden Wnd Thread Stopped()"); + if ( m_ThreadCtx.m_hThread ) + { + GetExitCodeThread(m_ThreadCtx.m_hThread, &m_ThreadCtx.m_dwExitCode); + + if ( m_ThreadCtx.m_dwExitCode == STILL_ACTIVE && bForceKill ) + TerminateThread(m_ThreadCtx.m_hThread, DWORD(-1)); + + m_ThreadCtx.m_hThread = NULL; + } + return m_ThreadCtx.m_dwExitCode; + } + + // Returns Thread Exit Code + DWORD GetExitCode() const + { + if ( m_ThreadCtx.m_hThread ) + GetExitCodeThread(m_ThreadCtx.m_hThread, (LPDWORD)&m_ThreadCtx.m_dwExitCode); + return m_ThreadCtx.m_dwExitCode; + } + + // Attaches a Thread Function + // Used primarily for porting but can serve in developing generic thread objects + void Attach( LPTHREAD_START_ROUTINE lpThreadFunc ){ + m_pThreadFunc = lpThreadFunc; + } + + // Detaches the Attached Thread Function + // Detaches the Attached Thread Function, If any. + void Detach( void ){ + m_pThreadFunc = Thread::EntryPoint; + } + + Thread(){ m_pThreadFunc = Thread::EntryPoint; /*Can call Detach Also*/ } + //plug-in constructor + Thread(PTHREAD_START_ROUTINE lpExternalRoutine){Attach(lpExternalRoutine);} + ~Thread(){ if(m_ThreadCtx.m_hThread) Stop(true);} + + protected: + + // Std Template: Override if you are sure of what you are doing + static DWORD WINAPI EntryPoint( LPVOID pArg) + { + Thread *pParent = reinterpret_cast(pArg); + pParent->ThreadCtor(); + pParent->Run( pParent->m_ThreadCtx.m_pUserData ); + pParent->ThreadDtor(); + return STILL_ACTIVE; + } + + // Override this method with the body/code of your thread + virtual DWORD Run( LPVOID /*arg */){return m_ThreadCtx.m_dwExitCode;} + // override this function to provide your extra initialization + virtual void ThreadCtor(){} + // Override this function to provide your extra destruction + virtual void ThreadDtor(){} + + //// + // Thread Context Inner Class (UserData Pointer, Handle, Thread ID) + //// + class CThreadContext + { + public: + CThreadContext(){memset(this, 0, sizeof(this));} + + // Attributes + public: + HANDLE m_hThread; // The Thread Handle + DWORD m_dwTID; // The Thread ID + LPVOID m_pUserData; // The user data pointer + LPVOID m_pParent; // The this pointer of the parent CThread object + DWORD m_dwExitCode; // The Exit Code of the thread + + } m_ThreadCtx; // The Thread Context Member + LPTHREAD_START_ROUTINE m_pThreadFunc; // The Worker Thread Function Pointer + }; +} \ No newline at end of file diff --git a/Hooks/CaptionButton/CaptionButton.Designer.cs b/Hooks/CaptionButton/CaptionButton.Designer.cs new file mode 100644 index 0000000..55ba685 --- /dev/null +++ b/Hooks/CaptionButton/CaptionButton.Designer.cs @@ -0,0 +1,57 @@ +namespace Foo.Hooks.CaptionButton +{ + partial class CaptionButton + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.SuspendLayout(); + // + // CaptionButton + // + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.SystemColors.ControlText; + this.ClientSize = new System.Drawing.Size(10, 10); + this.ControlBox = false; + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None; + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "CaptionButton"; + this.Opacity = 0.0; + this.ShowIcon = false; + this.ShowInTaskbar = false; + this.WindowState = System.Windows.Forms.FormWindowState.Minimized; + this.Load += new System.EventHandler(this.CaptionButton_Load); + this.HandleCreated += new System.EventHandler(CaptionButton_HandleCreated); + this.Shown += new System.EventHandler(CaptionButton_Shown); + this.ResumeLayout(false); + } + + #endregion + } +} + diff --git a/Hooks/CaptionButton/CaptionButton.cs b/Hooks/CaptionButton/CaptionButton.cs new file mode 100644 index 0000000..b10a3e4 --- /dev/null +++ b/Hooks/CaptionButton/CaptionButton.cs @@ -0,0 +1,107 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Windows.Forms; +using System.Runtime.InteropServices; +using System.Reflection; + +using Foo.Platform; +using Foo.Platform.Interacters; + +namespace Foo.Hooks.CaptionButton +{ + public partial class CaptionButton : Form + { + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + [DllImport("user32.dll")] + public static extern Int32 GetWindowLong(IntPtr hwnd, int nIndex); + + [DllImport("user32.dll")] + public static extern Int32 SetWindowLong(IntPtr hwnd, int nIndex, Int32 dwNewLong); + + [DllImport("user32.dll")] + public static extern bool SetLayeredWindowAttributes(IntPtr hwnd, Int32 crKey, int bAlpha, uint dwFlags); + + public const int GWL_EXSTYLE = -20; + public const int LWA_COLORKEY = 0x00000001; + public const int WS_EX_LAYERED = 0x00080000; + + [StructLayout(LayoutKind.Sequential)] + struct COLORREF + { + public byte R; + public byte G; + public byte B; + } + + public CaptionButton() + { + InitializeComponent(); + } + + ~CaptionButton() + { + } + + protected override void WndProc(ref Message m) + { + // Debug Only *Allows us to step right into buttonhook starting * + if (Program.DEBUG_ONLY_SETTING_STARTBUTTONHOOK && + !Program.DEBUG_ONLY_SETTING_STARTBUTTONHOOK_IS_STARTED) + { + Log.Info(string.Format("{0}() - * Debug Only Option * Starting ButtonHook", MethodBase.GetCurrentMethod().Name)); + BHInteracter.StartButtonHookDLLEntryW(); + Program.DEBUG_ONLY_SETTING_STARTBUTTONHOOK_IS_STARTED = true; + } + + if (m.Msg == BHInteracter.WM_CAPTIONBUTTON_START) + { + Log.Info(string.Format("{0}() - Received CAPTIONBUTTON_START Message", MethodBase.GetCurrentMethod().Name)); + BHInteracter.StartButtonHookDLLEntryW(); + } + else if (m.Msg == BHInteracter.WM_CAPTIONBUTTON_STOP) + { + Log.Info(string.Format("{0}() - Received CAPTIONBUTTON_STOP Message", MethodBase.GetCurrentMethod().Name)); + BHInteracter.StopButtonHookDLLEntryW(); + } + + // force opacity at all times + if (Opacity == 1.0) + Opacity = 0.0; + + // force minimized at all times + if (WindowState != FormWindowState.Minimized) + WindowState = FormWindowState.Minimized; + + // force Not to be seen in taskbar + if (ShowInTaskbar == true) + ShowInTaskbar = false; + + base.WndProc(ref m); + } + + void CaptionButton_Shown(object sender, System.EventArgs e) + { + Hide(); + } + + private void CaptionButton_HandleCreated(object sender, EventArgs e) + { + IntPtr hWnd = this.Handle; + SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) | WS_EX_LAYERED); + SetLayeredWindowAttributes(hWnd, 0x00000000, 0, LWA_COLORKEY); + } + + void CaptionButton_Load(object sender, System.EventArgs e) + { + Log.Info(string.Format("{0}() - CaptionButton Load Called! - passing out hWnd Handle {1}", MethodBase.GetCurrentMethod().Name,Handle.ToInt32())); + TemporaryVal.SetValI(Handle.ToInt32()); + } + } +} diff --git a/Hooks/CaptionButton/CaptionButton.csproj b/Hooks/CaptionButton/CaptionButton.csproj new file mode 100644 index 0000000..b37f858 --- /dev/null +++ b/Hooks/CaptionButton/CaptionButton.csproj @@ -0,0 +1,115 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {3854981D-5F6B-4AC5-A3F9-5C3761838821} + WinExe + Properties + Foo.Hooks.CaptionButton + CaptionButton + v3.5 + 512 + + + + + + + + + true + MyKeyFile.SNK + + + true + full + false + ..\..\Target\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\..\Target\Release\ + TRACE + prompt + 4 + + + + False + ..\..\Components\log4net.dll + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + Form + + + CaptionButton.cs + + + + + CaptionButton.cs + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Platform + + + + + + + + + \ No newline at end of file diff --git a/Hooks/CaptionButton/CaptionButton.resx b/Hooks/CaptionButton/CaptionButton.resx new file mode 100644 index 0000000..ff31a6d --- /dev/null +++ b/Hooks/CaptionButton/CaptionButton.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Hooks/CaptionButton/MyKeyFile.SNK b/Hooks/CaptionButton/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/Hooks/CaptionButton/Program.cs b/Hooks/CaptionButton/Program.cs new file mode 100644 index 0000000..337ec3f --- /dev/null +++ b/Hooks/CaptionButton/Program.cs @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Windows.Forms; + +// Ooganizer Namespaces +using Foo.Platform; +using Foo.Platform.Interacters; + +namespace Foo.Hooks.CaptionButton +{ + static class Program + { + static string DEBUG_ONLY_SETTING_STARTBUTTONHOOK_CMD_STRING = "/StartButtonHook"; + static internal bool DEBUG_ONLY_SETTING_STARTBUTTONHOOK = false; + static internal bool DEBUG_ONLY_SETTING_STARTBUTTONHOOK_IS_STARTED = false; + + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + + //// + // We want to make sure that we are getting the correct command line params + // otherwise we won't allow this .exe to start + //// + bool bStartButtonHook = false; + string[] args = Environment.GetCommandLineArgs(); + foreach (string arg in args) + { + if(!bStartButtonHook) + bStartButtonHook = (arg == BHInteracter.CAPTIONBUTTON_CMDLINE); + + if(!DEBUG_ONLY_SETTING_STARTBUTTONHOOK) + DEBUG_ONLY_SETTING_STARTBUTTONHOOK = (arg == DEBUG_ONLY_SETTING_STARTBUTTONHOOK_CMD_STRING); + } + + // Should only start if this exe is called through Platform's BHInteracter + if (bStartButtonHook) + { + Application.Run(new CaptionButton()); + } + } + } +} diff --git a/Hooks/CaptionButton/Properties/AssemblyInfo.cs b/Hooks/CaptionButton/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..e215914 --- /dev/null +++ b/Hooks/CaptionButton/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("OogyCaptionButton")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("OogyCaptionButton")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3696fc3e-e32a-4a2a-bff3-bd99ce83090f")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Hooks/CaptionButton/Properties/Resources.Designer.cs b/Hooks/CaptionButton/Properties/Resources.Designer.cs new file mode 100644 index 0000000..7295cd6 --- /dev/null +++ b/Hooks/CaptionButton/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.Hooks.CaptionButton.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Foo.Hooks.CaptionButton.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/Hooks/CaptionButton/Properties/Resources.resx b/Hooks/CaptionButton/Properties/Resources.resx new file mode 100644 index 0000000..ffecec8 --- /dev/null +++ b/Hooks/CaptionButton/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Hooks/CaptionButton/Properties/Settings.Designer.cs b/Hooks/CaptionButton/Properties/Settings.Designer.cs new file mode 100644 index 0000000..bb86ec2 --- /dev/null +++ b/Hooks/CaptionButton/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.Hooks.CaptionButton.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Hooks/CaptionButton/Properties/Settings.settings b/Hooks/CaptionButton/Properties/Settings.settings new file mode 100644 index 0000000..abf36c5 --- /dev/null +++ b/Hooks/CaptionButton/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/Oggynize_1.0.sln b/Oggynize_1.0.sln new file mode 100644 index 0000000..15d47c7 --- /dev/null +++ b/Oggynize_1.0.sln @@ -0,0 +1,249 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Platform", "Platform\Platform.csproj", "{F6929AFC-BF61-43A0-BABD-F807B65FFFA1}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Components", "Components", "{3E00D968-DF7D-4836-9A46-980BA5304FEB}" + ProjectSection(SolutionItems) = preProject + Components\log4net.dll = Components\log4net.dll + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Settings", "Settings\Settings.csproj", "{48D75C4F-2749-48BB-9386-721E0E94C144}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hooks", "Hooks", "{D54033AB-5562-487C-A096-AC8D9B185F40}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ButtonHook", "Hooks\ButtonHook\ButtonHook.vcproj", "{5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Client Services", "Client Services", "{AE52FFA4-5B75-44C4-B80D-7E406C69868E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ButtonWPForm", "Client Services\ButtonWPForm\ButtonWPForm.csproj", "{E179DF39-539A-407F-94DE-C21F690E02C4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataAccessLayer", "DataAccessLayer\DataAccessLayer.csproj", "{C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUILib", "GUILib\GUILib.csproj", "{C1282050-455B-44F4-8520-1C005E38EFB2}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Deskband", "Deskband", "{A51A5BDB-B9B7-4B5C-B5D2-57F5B6ABC634}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CaptionButton", "Hooks\CaptionButton\CaptionButton.csproj", "{3854981D-5F6B-4AC5-A3F9-5C3761838821}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeskBand", "Deskband\DeskBand\DeskBand.csproj", "{ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BandObject", "Deskband\BandObjectBase\BandObject.csproj", "{BDB3B670-A17B-483E-954C-52FC2B6FF9D3}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WorkspaceMgr", "WorkspaceMgr\WorkspaceMgr.csproj", "{09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUIWPForms", "Client Services\GUIWPForms\GUIWPForms.csproj", "{A02E052C-3C52-43DB-BB30-A47446B8165F}" + ProjectSection(ProjectDependencies) = postProject + {E179DF39-539A-407F-94DE-C21F690E02C4} = {E179DF39-539A-407F-94DE-C21F690E02C4} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GUIDebugStepExe", "Client Services\GUIDebugStepExe\GUIDebugStepExe.csproj", "{4C81A790-31CA-4A71-99AD-339D3837A5C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "zEasyTest", "zEasyTest\zEasyTest.csproj", "{6CDF553C-5060-4871-9CE8-63F66346716A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Satellite", "Satellite\Satellite.csproj", "{6DC93F91-D6D4-4C35-8A83-C180E8E22E16}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{C737AEEA-27C5-494F-8121-3E5C82315DD5}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Target", "Target", "{E7CF7E1E-CEAB-4015-BD70-7B2C727BD63E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Release", "Release", "{1295F70C-6CDC-4B99-AB85-5305CA8D7103}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Debug", "Debug", "{47DF5C34-9275-4F92-8E87-B81B899EBA1F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{208D8FE2-6A2C-438D-9CE9-CB4AAB6B33FD}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AddIns", "AddIns", "{113E65CD-E297-4114-9C1B-0446A12D2EE1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AddIn.Common", "AddIns\AddIn.Common\AddIn.Common.csproj", "{D32C4454-9334-47AA-9A3F-456B8B12220A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Addin.Office", "AddIns\Addin.Office\Addin.Office.csproj", "{0CA1DD2E-2752-4587-ADB4-77194411648B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Debug|Win32.ActiveCfg = Debug|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Release|Any CPU.Build.0 = Release|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1}.Release|Win32.ActiveCfg = Release|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Debug|Win32.ActiveCfg = Debug|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Release|Any CPU.Build.0 = Release|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {48D75C4F-2749-48BB-9386-721E0E94C144}.Release|Win32.ActiveCfg = Release|Any CPU + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Debug|Win32.ActiveCfg = Debug|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Debug|Win32.Build.0 = Debug|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Release|Any CPU.ActiveCfg = Release|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Release|Mixed Platforms.Build.0 = Release|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Release|Win32.ActiveCfg = Release|Win32 + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B}.Release|Win32.Build.0 = Release|Win32 + {E179DF39-539A-407F-94DE-C21F690E02C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Debug|Win32.ActiveCfg = Debug|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Release|Any CPU.Build.0 = Release|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E179DF39-539A-407F-94DE-C21F690E02C4}.Release|Win32.ActiveCfg = Release|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Debug|Win32.ActiveCfg = Debug|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Release|Any CPU.Build.0 = Release|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618}.Release|Win32.ActiveCfg = Release|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Debug|Win32.ActiveCfg = Debug|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Release|Any CPU.Build.0 = Release|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C1282050-455B-44F4-8520-1C005E38EFB2}.Release|Win32.ActiveCfg = Release|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Debug|Win32.ActiveCfg = Debug|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Release|Any CPU.Build.0 = Release|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3854981D-5F6B-4AC5-A3F9-5C3761838821}.Release|Win32.ActiveCfg = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Debug|Win32.ActiveCfg = Debug|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Any CPU.Build.0 = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7}.Release|Win32.ActiveCfg = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Debug|Win32.ActiveCfg = Debug|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Any CPU.Build.0 = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3}.Release|Win32.ActiveCfg = Release|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Debug|Any CPU.Build.0 = Debug|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Debug|Win32.ActiveCfg = Debug|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Release|Any CPU.ActiveCfg = Release|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Release|Any CPU.Build.0 = Release|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35}.Release|Win32.ActiveCfg = Release|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Debug|Win32.ActiveCfg = Debug|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Release|Any CPU.Build.0 = Release|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A02E052C-3C52-43DB-BB30-A47446B8165F}.Release|Win32.ActiveCfg = Release|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Debug|Win32.ActiveCfg = Debug|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Release|Any CPU.Build.0 = Release|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {4C81A790-31CA-4A71-99AD-339D3837A5C6}.Release|Win32.ActiveCfg = Release|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Debug|Win32.ActiveCfg = Debug|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Release|Any CPU.Build.0 = Release|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {6CDF553C-5060-4871-9CE8-63F66346716A}.Release|Win32.ActiveCfg = Release|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Debug|Win32.ActiveCfg = Debug|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Release|Any CPU.Build.0 = Release|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16}.Release|Win32.ActiveCfg = Release|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Debug|Win32.ActiveCfg = Debug|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Release|Any CPU.Build.0 = Release|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D32C4454-9334-47AA-9A3F-456B8B12220A}.Release|Win32.ActiveCfg = Release|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Debug|Win32.ActiveCfg = Debug|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Release|Any CPU.Build.0 = Release|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {0CA1DD2E-2752-4587-ADB4-77194411648B}.Release|Win32.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {5E8EB95C-9C4F-4DE3-A5E4-827268AF4E9B} = {D54033AB-5562-487C-A096-AC8D9B185F40} + {3854981D-5F6B-4AC5-A3F9-5C3761838821} = {D54033AB-5562-487C-A096-AC8D9B185F40} + {E179DF39-539A-407F-94DE-C21F690E02C4} = {AE52FFA4-5B75-44C4-B80D-7E406C69868E} + {A02E052C-3C52-43DB-BB30-A47446B8165F} = {AE52FFA4-5B75-44C4-B80D-7E406C69868E} + {4C81A790-31CA-4A71-99AD-339D3837A5C6} = {AE52FFA4-5B75-44C4-B80D-7E406C69868E} + {ACCDA683-C6AC-43DD-819F-4C3DE36E6BD7} = {A51A5BDB-B9B7-4B5C-B5D2-57F5B6ABC634} + {BDB3B670-A17B-483E-954C-52FC2B6FF9D3} = {A51A5BDB-B9B7-4B5C-B5D2-57F5B6ABC634} + {D32C4454-9334-47AA-9A3F-456B8B12220A} = {C737AEEA-27C5-494F-8121-3E5C82315DD5} + {0CA1DD2E-2752-4587-ADB4-77194411648B} = {C737AEEA-27C5-494F-8121-3E5C82315DD5} + {1295F70C-6CDC-4B99-AB85-5305CA8D7103} = {E7CF7E1E-CEAB-4015-BD70-7B2C727BD63E} + {47DF5C34-9275-4F92-8E87-B81B899EBA1F} = {E7CF7E1E-CEAB-4015-BD70-7B2C727BD63E} + {113E65CD-E297-4114-9C1B-0446A12D2EE1} = {1295F70C-6CDC-4B99-AB85-5305CA8D7103} + {208D8FE2-6A2C-438D-9CE9-CB4AAB6B33FD} = {47DF5C34-9275-4F92-8E87-B81B899EBA1F} + EndGlobalSection +EndGlobal diff --git a/Platform/Env.cs b/Platform/Env.cs new file mode 100644 index 0000000..ada570b --- /dev/null +++ b/Platform/Env.cs @@ -0,0 +1,247 @@ +using System; +using System.IO; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Text; + +namespace Foo.Platform +{ + /// + /// Oogy Environment Class for getting OS, Application, and Theme Settings + /// + public class Env + { + private static int m_dwMajorVersion = 0; + private static int m_dwMinorVersion = 0; + private static Themes m_Theme = Themes.Classic; + private static AssemblyRunTimePath m_RunTimePath = null; + + /// + /// Public Properties + /// + public static int MajorVersion {get{return m_dwMajorVersion;}} + public static int MinorVersion {get{return m_dwMinorVersion;}} + public static Themes Theme {get{return m_Theme;}} + + /// + /// This is our versioning system, does not correspond to Windows + /// + public enum OSVersions : int + { + OS_WINDOWS_VISTA = 1, + OS_WINDOWS_2000 = 2, /*incl. Server OSes*/ + OS_WINDOWS_2003 = 3, /*incl. Server OSes and Windows XP*/ + OS_WINDOWS_SE7EN = 7, /*for future use ?*/ + OS_NOT_SUPPORTED = 99 + } + + /// + /// This are our Theme Configurations for ButtonHook/GUI components. + /// + public enum Themes : int + { + Classic = 0, + XPtheme = 1, + AeroTheme = 2, + VistaNoAero = 3 + } + + /// + /// Static Constructor, immediatly sets our environment variables + /// + static Env() + { + ObtainEnvInformation(); + m_RunTimePath = new AssemblyRunTimePath(); + } + + /// + /// Call this function first - before querying for themes, etc + /// + private static void ObtainEnvInformation() + { + GetSystemInformation(out m_dwMajorVersion, out m_dwMinorVersion); + CheckWindowsXPTheme(); + CheckWindowsVistaTheme(); + } + + /// + /// Use to get the Oogy Application path. Creates folder if none exists + /// + /// Path to Ooganizer Application Folder + public static string GetAppdirectory() + { + string appDataFolder = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData); + string oogyAppData = appDataFolder + @"\Ooganizer"; + + if (!Directory.Exists(oogyAppData)) + { + // create oogy app data folder + Directory.CreateDirectory(oogyAppData); + } + + return oogyAppData; + } + + /// + /// Use to get the Oogy artifact snapshot image path. Creates folder if none exists + /// + /// Path to Ooganizer artifact snapshot data folder + public static string GetSnapshotDirectory() + { + string path = Platform.Env.GetAppdirectory() + @"\Snapshots"; + + if (!Directory.Exists(path)) + { + // create snapshot data folder + Directory.CreateDirectory(path); + } + + return path; + } + + /// + /// Use to get the Oogy log path. Creates folder if none exists + /// + /// Path to Ooganizer log folder + public static string GetLogDirectory() + { + string path = Platform.Env.GetAppdirectory() + @"\Logs"; + + if (!Directory.Exists(path)) + { + // create snapshot data folder + Directory.CreateDirectory(path); + } + + return path; + } + + /// + /// Use this to query the current running assembly path + /// + /// Path of assembly location + public static string GetRunTimePath() + { + return m_RunTimePath.strPath; + } + + /// + /// Quickly Check if the current OS Environment is supported by Oogy + /// + /// true if it is supported, false otherwise + public static bool IsWindowsOSSupported() + { + OSVersions version = OSVersionCheck(); + + if ((version == OSVersions.OS_WINDOWS_2003) || + (version == OSVersions.OS_WINDOWS_VISTA) || + (version == OSVersions.OS_WINDOWS_SE7EN)) + { + return true; + } + else + { + return false; + } + } + + /// + /// Retrieves Windows OS specific information + /// + /// dwMajorVersion[out] + /// dwMinorVersion[out] + /// is32bitNT[out] = supports 32-bit Windows NT + /// true, if succesfully retrieved, false otherwise + private static void GetSystemInformation(out int dwMajorVersion, out int dwMinorVersion) + { + dwMajorVersion = System.Environment.OSVersion.Version.Major; + dwMinorVersion = System.Environment.OSVersion.Version.Minor; + } + + /// + /// Use this function to obtain the current OS version information + /// + /// Returns the Current OSVersion Enum of this Environment + private static OSVersions OSVersionCheck() + { + switch(m_dwMajorVersion) // we ignore minor version for now + { + case 4: // Windows 2000? + return (OSVersions.OS_WINDOWS_2000); + case 5: // Windows XP && Windows 2003 + return (OSVersions.OS_WINDOWS_2003); + case 6: + return (OSVersions.OS_WINDOWS_VISTA); + case 7: + return (OSVersions.OS_WINDOWS_SE7EN); + default: + return (OSVersions.OS_NOT_SUPPORTED); + } + } + + /// + /// Vista Specific Theme Checking is done here + /// + /// + private static void CheckWindowsVistaTheme() + { + if(OSVersionCheck() == OSVersions.OS_WINDOWS_VISTA) + { + bool bIsAero = false; + if(Win32.Win32Functions.DwmIsCompositionEnabled(ref bIsAero) < 0) + return; //Call Failed + + if (bIsAero) + m_Theme = Themes.AeroTheme; + else + m_Theme = Themes.VistaNoAero; + } + } + + /// + /// XP Specific Theme Checking is done here + /// + /// + private static void CheckWindowsXPTheme() + { + if (OSVersionCheck() == OSVersions.OS_WINDOWS_2003) + { + if (Win32.Win32Functions.IsAppThemed()) + m_Theme = Themes.XPtheme; + else + m_Theme = Themes.Classic; + } + } + } + + /// + /// Since we only can query the Assembly path by instantiation, + /// we have a class that handles it + /// + internal class AssemblyRunTimePath + { + public string strPath; + public AssemblyRunTimePath(){strPath = Path.GetDirectoryName(GetType().Assembly.Location);} + } + + /// + /// EnvironmentCCW is a wrapper around Env - specifically made to be non-static + /// as to be able to be called from COM (ButtonHook/C++ code can now use Environment as well + /// + [Guid("85E2E5F6-877F-4edd-B7D1-D52C431F0AFC")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class EnvironmentCCW + { + public bool IsWindowsOSSupported() + { + return Env.IsWindowsOSSupported(); + } + public int GetCurWindowsTheme() + { + return (int)Env.Theme; + } + } + +} diff --git a/Platform/ErrorReporting/UserError.cs b/Platform/ErrorReporting/UserError.cs new file mode 100644 index 0000000..64a903b --- /dev/null +++ b/Platform/ErrorReporting/UserError.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Windows.Forms; + +namespace Foo.Platform.ErrorReporting +{ + public class UserError + { + /// + /// Display an Error to the User + /// + /// Error Title + /// Any Details about the Error that maybe pertinent to the User + public static void Show(string title, string detail) + { + string strTitle = "Error - " + title; + string strDetail = detail + "\n\n\nContact Ooganizer Support at http://ooganizer.com/support for more help and information."; + + MessageBox.Show(strDetail,strTitle); + } + + } +} diff --git a/Platform/InstallationSpec.cs b/Platform/InstallationSpec.cs new file mode 100644 index 0000000..5d7ac04 --- /dev/null +++ b/Platform/InstallationSpec.cs @@ -0,0 +1,201 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Win32; +using System.Reflection; + +namespace Foo.Platform +{ + /// + /// Installation Specific Settings. "HKLM\Software\Ooganizer", + /// The Installer must put the correct values in there so that we know where our files + /// are. ~Since now some of our assemblies are in the GAC, we require this. + /// + public class InstallationSpec + { + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// private statics + /// + private static string m_strInstallPath = ""; + //private static string m_strPlatformPath = ""; + //private static string m_strServerPath = ""; + //private static string m_strLogPath = ""; + private static RegistryKey s_OogyRootKey; + + /// + /// Public Properties + /// + public static string InstallPath { get { return m_strInstallPath; } } + //public static string PlatformPath { get { return m_strPlatformPath; } } + //public static string ServerPath { get { return m_strServerPath; } } + //public static string LogPath { get { return m_strLogPath; } } + + /// + /// Static Constructor, immediatly gets our installation specific variables + /// + static InstallationSpec() + { + s_OogyRootKey = Registry.LocalMachine.OpenSubKey("Software\\Ooganizer",false); + if (s_OogyRootKey != null) + { + object keyvalue = null; + + keyvalue = s_OogyRootKey.GetValue("InstallPath"); + if (isValidStr(keyvalue)) + m_strInstallPath = keyvalue.ToString(); + + //keyvalue = s_OogyRootKey.GetValue("PlatformPath"); + //if (isValidStr(keyvalue)) + // m_strPlatformPath = keyvalue.ToString(); + + //keyvalue = s_OogyRootKey.GetValue("ServerPath"); + //if (isValidStr(keyvalue)) + // m_strServerPath = keyvalue.ToString(); + + //keyvalue = s_OogyRootKey.GetValue("LogPath"); + //if (isValidStr(keyvalue)) + // m_strLogPath = keyvalue.ToString(); + } + else + { + Log.Error(string.Format("{0}() - Couldn't Open Software\\Ooganizer Registry Key for Reading", MethodBase.GetCurrentMethod().Name)); + } + } + + /// Returns true if passed in object is valid and not "" + private static bool isValidStr(object oToValidate) + { + if ((oToValidate != null) && (oToValidate.ToString() != "")) + return true; + else + return false; + } + } + + /// + /// Use this class for Debug Specific Settings + /// + public class DebugSpec + { + public static bool SkipCaptionButtonStarter { get; private set; } + + private static RegistryKey s_DebugSpecRootKey; + + static DebugSpec() + { + SkipCaptionButtonStarter = false; + + #if DEBUG + s_DebugSpecRootKey = Registry.LocalMachine.CreateSubKey("Software\\Ooganizer\\DebugSpec", RegistryKeyPermissionCheck.ReadWriteSubTree); + SkipCaptionButtonStarter = GetValB("SkipCaptionButtonStarter"); + #endif + } + + private static bool GetValB(string strValKey) + { + try + { + string val = GetVal(strValKey); + if (!String.IsNullOrEmpty(val)) + { + bool bVal = Boolean.Parse(val); + return bVal; + } + } + catch (Exception) { /* ignore */ } + return false; + } + + private static string GetVal(string strValKey) + { + try + { + object keyvalue = null; + keyvalue = s_DebugSpecRootKey.GetValue(strValKey); + if (isValidStr(keyvalue)) + return keyvalue.ToString(); + } + catch (Exception) { } + return String.Empty; + } + + /// Returns true if passed in object is valid and not "" + private static bool isValidStr(object oToValidate) + { + if ((oToValidate != null) && (oToValidate.ToString() != "")) + return true; + else + return false; + } + } + + /// + /// Temporary Values / "HKLM\Software\Ooganizer\TemporaryVal", + /// This class is being used to temporarily store values in the registry and retrieve them. + /// Useful for quick and dirty inter process communication. works out well for certain things. + /// + public class TemporaryVal + { + private static RegistryKey s_OogyRootKey; + + static TemporaryVal() + { + s_OogyRootKey = Registry.LocalMachine.OpenSubKey("Software\\Ooganizer", true); + } + + public static void SetVal(string strValue) + { + try { s_OogyRootKey.SetValue("TemporaryVal", strValue); } + catch (Exception) { } + } + + public static void SetValI(int iValue) + { + try{ SetVal(iValue.ToString()); } + catch (Exception){} + } + + public static string GetVal() + { + try + { + object keyvalue = null; + keyvalue = s_OogyRootKey.GetValue("TemporaryVal"); + if (isValidStr(keyvalue)) + return keyvalue.ToString(); + } + catch (Exception) { } + return String.Empty; + } + + public static int GetValI() + { + int I = 0; + try + { + string strVal = GetVal(); + I = int.Parse(strVal); + } + catch (Exception) { } + return I; + } + + public static void DeleteVal() + { + try { s_OogyRootKey.DeleteValue("TemporaryVal"); } + catch (Exception) { } + } + + /// Returns true if passed in object is valid and not "" + private static bool isValidStr(object oToValidate) + { + if ((oToValidate != null) && (oToValidate.ToString() != "")) + return true; + else + return false; + } + } +} diff --git a/Platform/Interacters/BHInteracter.cs b/Platform/Interacters/BHInteracter.cs new file mode 100644 index 0000000..e765075 --- /dev/null +++ b/Platform/Interacters/BHInteracter.cs @@ -0,0 +1,489 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Diagnostics; +using System.Threading; + +namespace Foo.Platform.Interacters +{ + /// + /// BHInteracter - ButtonHook Interacter. + /// Use this class abstraction to send/communicate with ButtonHook. + /// + public class BHInteracter + { + //// + // Our ButtonHook.Dll Entry Points (Delegates) + //// + internal delegate bool MyStartButtonHook(); + internal static MyStartButtonHook _MyStartButtonHook = null; + + internal delegate bool MyStopButtonHook(); + internal static MyStopButtonHook _MyStopButtonHook = null; + + internal delegate bool MyIsButtonHookSet(); + internal static MyIsButtonHookSet _MyIsButtonHookSet = null; + + internal delegate int MyGetAllHookedWindowHandles(IntPtr pBuf); + internal static MyGetAllHookedWindowHandles _MyGetAllHookedWindowHandles = null; + + /// + /// Use this to send down to Buttonhook so that it knows what to show + /// + public enum BUTTON_HOOK_STATE + { + BUTTON_NONE = 1, + BUTTON_ADD = 2, + BUTTON_DELETE = 3 + } + + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + //// + // Custom ButtonHook Message Handlers + //// + private const int WM_W32PINGISALIVE = (Platform.Win32.Win32_Constants.WM_USER + 700); + private const int WM_W32SETBUTTONSTATE = (Platform.Win32.Win32_Constants.WM_USER + 701); + private const int WM_W32GETBUTTONSTATE = (Platform.Win32.Win32_Constants.WM_USER + 702); + private const int WM_W32SETPARENTWINDOWTRANSPERANCY = (Platform.Win32.Win32_Constants.WM_USER + 703); + private const int WM_W32SETPARENTWINDOWACTIVE = (Platform.Win32.Win32_Constants.WM_USER + 704); + private const int WM_W32POSTMESSAGETOPARENTWINDOW = (Platform.Win32.Win32_Constants.WM_USER + 705); + + //// + // Custom OogyCaptionButton Message Handlers + //// + public const int WM_CAPTIONBUTTON_START = (Platform.Win32.Win32_Constants.WM_USER + 1200); + public const int WM_CAPTIONBUTTON_STOP = (Platform.Win32.Win32_Constants.WM_USER + 1201); + + //// + // OogyCaptionButton Spec + //// + private const int CAPTION_START_STOP_MAX_TRY_COUNT = 5; + public const string CAPTIONBUTTON_CMDLINE = @"/App:StartThis4Real639"; + private const string CAPTIONBUTTON_PROCESSNAME = "CaptionButton"; + private static string CAPTIONBUTTON_EXE = CAPTIONBUTTON_PROCESSNAME + ".exe"; + private static string CAPTIONBUTTON_EXE_FULLPATH = InstallationSpec.InstallPath + CAPTIONBUTTON_EXE; + private static IntPtr s_CaptionButtonHandle = IntPtr.Zero; + + /// + /// Validity internal State checking for OogyCaptionButton.exe + /// + private enum CAPTIONBUTTON_VALIDITY_STATE + { + VALIDITY_NONE = 1, + VALIDITY_CREATEDSUCCESS = 2, + VALIDITY_CREATEDFAILED = 3, + VALIDITY_STOPPEDSUCCESS = 4, + VALIDITY_STOPPEDFAILED = 5, + VALIDITY_INTEGRITYCHECK_FAILED = 6 + } + + // State Success / Error Checking + private static CAPTIONBUTTON_VALIDITY_STATE s_CaptionButtonState = CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_NONE; + + /// + /// Static Constructor Loads the ButtonHook.dll dynamically from the correct path + /// + static BHInteracter() + { + try + { + IntPtr procaddr = IntPtr.Zero; + string strButtonHookDll = InstallationSpec.InstallPath + "ButtonHook.dll"; + + Log.Info(string.Format("{0}() - BHInteracter() Trying to load ButtonHook.dll {1}", MethodBase.GetCurrentMethod().Name, strButtonHookDll)); + IntPtr ButtonHook = Win32.Win32Functions.LoadLibrary(strButtonHookDll); + if(ButtonHook != IntPtr.Zero) + Log.Info(string.Format("{0}() - BHInteracter() loading ButtonHook.dll succeeded", MethodBase.GetCurrentMethod().Name)); + else + Log.Error(string.Format("{0}() - BHInteracter() loading ButtonHook.dll failed!", MethodBase.GetCurrentMethod().Name)); + + // StartButtonHook + procaddr = Win32.Win32Functions.GetProcAddress(ButtonHook, "_StartButtonHook@0"); + if(procaddr != null) + _MyStartButtonHook = (MyStartButtonHook)Marshal.GetDelegateForFunctionPointer(procaddr, typeof(MyStartButtonHook)); + else + Log.Info(string.Format("{0}() - BHInteracter() GetProcAddress for StartButtonHook Failed", MethodBase.GetCurrentMethod().Name)); + + // StopButtonHook + procaddr = Win32.Win32Functions.GetProcAddress(ButtonHook, "_StopButtonHook@0"); + if (procaddr != null) + _MyStopButtonHook = (MyStopButtonHook)Marshal.GetDelegateForFunctionPointer(procaddr, typeof(MyStopButtonHook)); + else + Log.Info(string.Format("{0}() - BHInteracter() GetProcAddress for StopButtonHook Failed", MethodBase.GetCurrentMethod().Name)); + + // IsButtonHookSet + procaddr = Win32.Win32Functions.GetProcAddress(ButtonHook, "_IsButtonHookSet@0"); + if (procaddr != null) + _MyIsButtonHookSet = (MyIsButtonHookSet)Marshal.GetDelegateForFunctionPointer(procaddr, typeof(MyIsButtonHookSet)); + else + Log.Info(string.Format("{0}() - BHInteracter() GetProcAddress for IsButtonHookSet Failed", MethodBase.GetCurrentMethod().Name)); + + // GetAllHookedWindowHandles + procaddr = Win32.Win32Functions.GetProcAddress(ButtonHook, "_GetAllHookedWindowHandles@4"); + if (procaddr != null) + _MyGetAllHookedWindowHandles = (MyGetAllHookedWindowHandles)Marshal.GetDelegateForFunctionPointer(procaddr, typeof(MyGetAllHookedWindowHandles)); + else + Log.Info(string.Format("{0}() - BHInteracter() GetProcAddress for GetAllHookedWindowHandles Failed", MethodBase.GetCurrentMethod().Name)); + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - BHInteracter() Construction Failed", MethodBase.GetCurrentMethod().Name), e); + } + } + + /// + /// Use this function wrapper to call the StartButtonHook DLLEntry Point + /// + public static void StartButtonHookDLLEntryW() + { + Log.Info(string.Format("{0}() - CaptionButton - About to call StartButtonHook()", MethodBase.GetCurrentMethod().Name)); + if (_MyStartButtonHook()) + Log.Info(string.Format("{0}() - StartButtonHook() Succeeded", MethodBase.GetCurrentMethod().Name)); + else + Log.Error(string.Format("{0}() - StartButtonHook() Failed", MethodBase.GetCurrentMethod().Name)); + } + + /// + /// Use this function wrapper to call the StopButtonHook DLLEntry Point + /// + public static void StopButtonHookDLLEntryW() + { + Log.Info(string.Format("{0}() - CaptionButton - About to call StopButtonHook()", MethodBase.GetCurrentMethod().Name)); + if (_MyStopButtonHook()) + Log.Info(string.Format("{0}() - StopButtonHook() Succeeded", MethodBase.GetCurrentMethod().Name)); + else + Log.Error(string.Format("{0}() - StopButtonHook() Failed", MethodBase.GetCurrentMethod().Name)); + } + + /// + /// Use this function wrapper to call the IsButtonHookSet DLLEntry Point + /// + public static bool IsButtonHookSetDLLEntryW() + { + return _MyIsButtonHookSet(); + } + + /// + /// Use this function wrapper to call the GetAllHookedWindowHandles DLLEntry Point + /// + public static void GetAllHookedWindowHandlesDLLEntryW(ref List handleList) + { + // Temporary ar buffer + int[] ar = new int[Win32.Win32_Constants.MAX_PATH]; + + // allocate and reset an new unmanaged buffer + IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(ar)); + Marshal.Copy(ar, 0, p, ar.Length); + + // get the size + int nsize = _MyGetAllHookedWindowHandles(p); + + // copy data back as needed *delete unmanaged buffer* + Marshal.Copy(p,ar,0,nsize); + Marshal.FreeHGlobal(p); + + // Make sure the passed in list is empty * and pass out the handle list* + handleList.Clear(); + for (int i = 0; i < nsize; ++i) + handleList.Add((IntPtr)ar[i]); + } + + /// + /// CaptionButton exe is the external process that hosts ButtonHook.dll + /// + /// true if the CaptionButtion exe is running, false otherwise + public static bool IsCaptionButtonRunning() + { + Process[] processes = Process.GetProcessesByName(CAPTIONBUTTON_PROCESSNAME); + return (processes.Length == 1); + } + + /// + /// Start CaptionButton exe which can host the ButtonHook.dll + /// + public static void StartCaptionButton() + { + try + { + if (!IsCaptionButtonRunning()) + { + TemporaryVal.DeleteVal(); + ProcessStartInfo startInfo = new ProcessStartInfo(CAPTIONBUTTON_EXE_FULLPATH, CAPTIONBUTTON_CMDLINE); + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.WorkingDirectory = InstallationSpec.InstallPath; + Process p = Process.Start(startInfo); + Log.Info(string.Format("{0}() - Created a new Oogy CaptionButton Instance EXE with PID{1}", MethodBase.GetCurrentMethod().Name, p.Id.ToString())); + + // Wait a little before sending any messages + Thread.Sleep(3000); + + //// + // State Checking *IMP* .exe could have not shut down correctly, and buttonhook never got stopped + // so let's check to see what is going on + //// + bool bIsInvalidState = ((s_CaptionButtonState != CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_NONE) && + (s_CaptionButtonState != CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_STOPPEDSUCCESS)); + + // Let's get the window handle from the child process + s_CaptionButtonHandle = (IntPtr)TemporaryVal.GetValI(); + if (s_CaptionButtonHandle == IntPtr.Zero) + Log.Error(string.Format("{0}() - Child Handle is Zero! This means all functions below will return out and everything fails. Check into this.", MethodBase.GetCurrentMethod().Name)); + + TemporaryVal.DeleteVal(); + + // We somehow got into an invalid state, so let's send Stop Messages and see what happens, + // if those failed there is really not much more we can do except fail here + if (bIsInvalidState && !Helper_CaptionButtonMessageSender(s_CaptionButtonHandle, WM_CAPTIONBUTTON_STOP)) + Log.Info(string.Format("{0}() - Trying to StopButtonHook gracefully failed - ignoring and trying to StartButtonHook Anyways", MethodBase.GetCurrentMethod().Name, p.Id.ToString())); + + // Regular starting... + if (Helper_CaptionButtonMessageSender(s_CaptionButtonHandle, WM_CAPTIONBUTTON_START)) + { + s_CaptionButtonState = CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_CREATEDSUCCESS; + Log.Info(string.Format("{0}() - StartCaptionButton Succeeded - Started the ButtonHook Worked Successfully", MethodBase.GetCurrentMethod().Name, p.Id.ToString())); + } + else + { + s_CaptionButtonState = CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_CREATEDFAILED; + Log.Error(string.Format("{0}() - StartCaptionButton Failed - Started the ButtonHook Did not work - VALIDITY_CREATEDFAILED - forcefully Killing the Process", MethodBase.GetCurrentMethod().Name, p.Id.ToString())); + p.Kill(); + } + } + else + { + // Process is already running for some reason - this should never happen, but if it does, + // we'll handle it by doing an integrity check + Log.Info(string.Format("{0}() - StartCaptionButton - CaptionButton.exe already exists - performing Complete Integrity Check...", MethodBase.GetCurrentMethod().Name)); + bool bIntegrityIsGood = CompleteButtonHookIntegrityCheck(); + + if (bIntegrityIsGood) + s_CaptionButtonState = CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_CREATEDSUCCESS; + else + s_CaptionButtonState = CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_INTEGRITYCHECK_FAILED; + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - StartCaptionButton - Error occured", MethodBase.GetCurrentMethod().Name), e); + } + } + + /// + /// Stop CaptionButton exe which can host the ButtonHook.dll + /// + public static void StopCaptionButton() + { + Log.Info(string.Format("{0}() - StopCaptionButton Called", MethodBase.GetCurrentMethod().Name)); + if (IsCaptionButtonRunning()) + { + Process[] processes = Process.GetProcessesByName(CAPTIONBUTTON_PROCESSNAME); + foreach (Process p in processes) + { + Log.Info(string.Format("{0}() - Found OogyCaptionButton Pid {1}", MethodBase.GetCurrentMethod().Name, p.Id)); + + if (Helper_CaptionButtonMessageSender(s_CaptionButtonHandle, WM_CAPTIONBUTTON_STOP)) + { + s_CaptionButtonState = CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_STOPPEDSUCCESS; + Log.Info(string.Format("{0}() - StopCaptionButton Succeeded - Closing the ButtonHook Worked Successfully", MethodBase.GetCurrentMethod().Name, p.Id.ToString())); + } + else + { + s_CaptionButtonState = CAPTIONBUTTON_VALIDITY_STATE.VALIDITY_STOPPEDFAILED; + Log.Error(string.Format("{0}() - StopCaptionButton Failed - Closing the ButtonHook Did not work - forcefully Killing the Process", MethodBase.GetCurrentMethod().Name, p.Id.ToString())); + } + + Log.Info(string.Format("{0}() - Closing a Oogy CaptionButton Instance EXE of PID{1}", MethodBase.GetCurrentMethod().Name, p.Id.ToString())); + p.Kill(); + } + } + } + + /// + /// Use this to send the Start/Stop Messages to Oogy CaptionButton.exe. Small Helper + /// function allows us to do cleaner error handling for starting and stopping (above) + /// + /// WM_CAPTIONBUTTON_START or WM_CAPTIONBUTTON_STOP + /// returns true if successful, false otherwise + private static bool Helper_CaptionButtonMessageSender(IntPtr hWnd, int Message) + { + if((hWnd != IntPtr.Zero) && + (Message == WM_CAPTIONBUTTON_START || Message == WM_CAPTIONBUTTON_STOP)) + { + for (int i = 0; i < CAPTION_START_STOP_MAX_TRY_COUNT; ++i) + { + // Send the Stop ButonHook Message to the Hidden window of the Process + Win32.Win32Functions.SendMessage(hWnd, Message, IntPtr.Zero, IntPtr.Zero); + + // Wait a little second before querying for the state + Thread.Sleep(500); + + // If this is a start message we can stop once the button hook is started + if (Message == WM_CAPTIONBUTTON_START && + IsButtonHookSetDLLEntryW()) + return true; + + // If this is a stop message we can stop once the button hook no longer set + if (Message == WM_CAPTIONBUTTON_STOP && + !IsButtonHookSetDLLEntryW()) + return true; + } + } + return false; + } + + /// + /// Check to see if buttonhook is alive for the passed in window + /// + /// handle to a buttonHooked Parent Window + public static bool IsButtonHookAliveOnWindow(IntPtr hWnd) + { + if (hWnd != IntPtr.Zero) + { + int retVal = Win32.Win32Functions.SendMessage((IntPtr)hWnd, WM_W32PINGISALIVE, IntPtr.Zero, IntPtr.Zero); + if (retVal == 0) + { + Log.Error(string.Format("{0}() - IsButtonHookAlive Failed for Window {1}", MethodBase.GetCurrentMethod().Name, hWnd.ToString())); + return false; + } + else + { + return true; + } + } + return false; + } + + /// + /// Call this function to run a complete ButtonHook Integrity Check + /// + /// true if buttonhook passed all checks, false otherwise + public static bool CompleteButtonHookIntegrityCheck() + { + bool bSuccess = true; + Log.Info(string.Format("{0}() - CompleteButtonHookIntegrityCheck got called", MethodBase.GetCurrentMethod().Name)); + + // Make first sure that the Hook Is Set + if (!IsButtonHookSetDLLEntryW()) + bSuccess = false; + + // Now iterate through each hooked window pinging it + // for feedback + List handleList = new List(); + foreach (IntPtr hWnd in handleList) + { + if (!IsButtonHookAliveOnWindow(hWnd) && Win32.Win32Functions.IsWindow(hWnd)) + { + bSuccess = false; // buttonhook not responsive on an existing window + break; + } + } + + if(bSuccess) + Log.Info(string.Format("{0}() - CompleteButtonHookIntegrityCheck passed successfully", MethodBase.GetCurrentMethod().Name)); + else + Log.Error(string.Format("{0}() - CompleteButtonHookIntegrityCheck failed", MethodBase.GetCurrentMethod().Name)); + + return bSuccess; + } + + /// + /// Use this to set the Transparency on a Window that is running the ButtonHook. ~Will Only work + /// for those windows. + /// + /// handle to a buttonHooked Parent Window + /// 0-255 byte value indicating the Transparency + public static void SetWindowTransparency(IntPtr hWnd, byte alpha) + { + if (hWnd != IntPtr.Zero) + { + int retVal = Win32.Win32Functions.SendMessage((IntPtr)hWnd, WM_W32SETPARENTWINDOWTRANSPERANCY, IntPtr.Zero, (IntPtr)alpha); + if (retVal == 0) + Log.Error(string.Format("{0}() - SetWindowTransparency Failed for Window {1} with alpha {2}", MethodBase.GetCurrentMethod().Name, hWnd.ToString(), alpha.ToString())); + } + } + + /// + /// Use this to set the ActiveWindow on a Window that is running the ButtonHook. ~Will Only work + /// for those windows. + /// + /// handle to a buttonHooked Parent Window + public static void SetAsActiveWindow(IntPtr hWnd) + { + if (hWnd != IntPtr.Zero) + { + int retVal = Win32.Win32Functions.SendMessage((IntPtr)hWnd, WM_W32SETPARENTWINDOWACTIVE, IntPtr.Zero, IntPtr.Zero); + if (retVal == 0) + Log.Error(string.Format("{0}() - SetAsActiveWindow Failed for Window {1}", MethodBase.GetCurrentMethod().Name, hWnd.ToString())); + } + } + + /// + /// Use this to send a message to a window to send a message to itself + /// + /// + public static void PostMessageAsIfFromWindow(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam ) + { + if (hWnd != IntPtr.Zero) + { + StringBuilder strAtom = new StringBuilder(hWnd.ToString() + ";" + Msg.ToString() + ";" + wParam.ToString() + ";" + lParam.ToString()); + int nAtom = Win32.Win32Functions.GlobalAddAtom(strAtom); + + if (nAtom == 0) + Log.Error(string.Format("{0}() - SendMessageAsIfFromWindow GlobalAddAtom Failed for Window {1}", MethodBase.GetCurrentMethod().Name, hWnd.ToString())); + + int retVal = Win32.Win32Functions.SendMessage((IntPtr)hWnd, WM_W32POSTMESSAGETOPARENTWINDOW, IntPtr.Zero, (IntPtr)nAtom); + if (retVal == 0) + Log.Error(string.Format("{0}() - SendMessageAsIfFromWindow ButtonHook Failed to process the String for Window {1}", MethodBase.GetCurrentMethod().Name, hWnd.ToString())); + + Win32.Win32Functions.GlobalDeleteAtom(nAtom); + } + } + + /// + /// Use this to set a new ButtonState to a buttonhooked window + /// + /// handle to a buttonHooked Parent Window + /// a new button state + public static BUTTON_HOOK_STATE SetW32ButtonToNewState(IntPtr hWnd, BUTTON_HOOK_STATE buttonState) + { + if (hWnd != IntPtr.Zero) + { + int retVal = Platform.Win32.Win32Functions.SendMessage((IntPtr)hWnd, WM_W32SETBUTTONSTATE, IntPtr.Zero, (IntPtr)buttonState); + if (retVal == 0) + Log.Error(string.Format("{0}() - SetW32ButtonToNewState Failed for Window {1} ", MethodBase.GetCurrentMethod().Name, hWnd.ToString())); + } + return buttonState; + } + + /// + /// Use this to get a ButtonState from a buttonhooked window + /// + /// handle to a buttonHooked Parent Window + /// a new button state + public static BUTTON_HOOK_STATE GetW32ButtonState(IntPtr hWnd) + { + BUTTON_HOOK_STATE buttonState = BUTTON_HOOK_STATE.BUTTON_NONE; + if (hWnd != IntPtr.Zero) + { + int retVal = Platform.Win32.Win32Functions.SendMessage((IntPtr)hWnd, WM_W32GETBUTTONSTATE, IntPtr.Zero, IntPtr.Zero); + if (retVal == 0) + Log.Error(string.Format("{0}() - SetW32ButtonToNewState Failed for Window {1} ", MethodBase.GetCurrentMethod().Name, hWnd.ToString())); + + try + { + buttonState = (BUTTON_HOOK_STATE)retVal; + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - Error Thrown ", MethodBase.GetCurrentMethod().Name), e); + } + } + return buttonState; + } + + } +} diff --git a/Platform/Logger.cs b/Platform/Logger.cs new file mode 100644 index 0000000..4d1b906 --- /dev/null +++ b/Platform/Logger.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Text; +using log4net; +using log4net.Config; +using log4net.Core; +using log4net.Appender; +using log4net.Layout; +using log4net.Repository.Hierarchy; + +namespace Foo.Platform +{ + public class Logger + { + static Logger() + { + BasicConfigurator.Configure(CreateAndConfigureRollingFileAppender()); + } + + /// + /// Returns the Log4Net Interface + /// + /// Object Type to pass in to create Logger for + /// Log4Net Interface + public static ILog GetLog4NetInterface(Type type) + { + return LogManager.GetLogger(type); + } + + /// + /// Creates and Configures teh RollingFileAppender *Configuration goes on here * + /// + /// RollingFileAppender Class to be used in Configuring Log4Net + static private RollingFileAppender CreateAndConfigureRollingFileAppender() + { + RollingFileAppender fileAppender = new RollingFileAppender(); + fileAppender.Layout = new PatternLayout(PatternLayout.DetailConversionPattern); + + // Locking Minimal allows us to run Log4Net from multiple processes + fileAppender.LockingModel = new FileAppender.MinimalLock(); + + fileAppender.File = (Env.GetLogDirectory() + @"\LogServer.log"); + fileAppender.AppendToFile = true; + + #if DEBUG + fileAppender.Threshold = Level.All; + #else + fileAppender.Threshold = Level.Error; + #endif + + fileAppender.MaximumFileSize = "5MB"; + fileAppender.MaxSizeRollBackups = 3; + fileAppender.ActivateOptions(); + return fileAppender; + } + + } +} diff --git a/Platform/MyKeyFile.SNK b/Platform/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/Platform/OSWrapper.cs b/Platform/OSWrapper.cs new file mode 100644 index 0000000..e6bba38 --- /dev/null +++ b/Platform/OSWrapper.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Ooganizer.Platform +{ + class OSWrapper + { + + + void Lalelu() + { + using (OoganizerState oogyState = new OoganizerState()) + { + string curWorkspaceName = oogyState.GetCurrentWorkspace(); + + if (curWorkspaceName != null) + { + using (OoganizerAPIProxy proxy = oogyState.GetAPIProxy()) + { + Workspace curWorkspace = proxy.API.GetWorkspace(curWorkspaceName); + + foreach (OoganizerDAL.Artifact artifact in curWorkspace.Artifacts) + { + if (curArtifact.Location.ToUpper() == artifact.Location.ToUpper()) + { + bFound = true; + break; + } + } + } + } + } + } + + + + } +} diff --git a/Platform/ObjectPooling.txt b/Platform/ObjectPooling.txt new file mode 100644 index 0000000..d259d25 --- /dev/null +++ b/Platform/ObjectPooling.txt @@ -0,0 +1,3 @@ + +Enterprise Services (.NET 1.1) Performance Guidelines - Object Pooling +http://www.guidanceshare.com/wiki/Enterprise_Services_(.NET_1.1)_Performance_Guidelines_-_Object_Pooling \ No newline at end of file diff --git a/Platform/Platform.csproj b/Platform/Platform.csproj new file mode 100644 index 0000000..4842e92 --- /dev/null +++ b/Platform/Platform.csproj @@ -0,0 +1,99 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Library + Properties + Foo.Platform + Platform + v3.5 + 512 + + + + + + + + + + + true + MyKeyFile.SNK + + + true + full + false + ..\Target\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\Target\Release\ + TRACE + prompt + 4 + + + + False + ..\Components\log4net.dll + + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16} + Satellite + + + + + + $(FrameworkDir)\regasm.exe "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /unregister +$(FrameworkDir)\regasm.exe "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /tlb:$(TargetName).tlb /codebase +mkdir "$(SolutionDir)target\$(ConfigurationName)\Resources" +xcopy "$(ProjectDir)Resources" "$(SolutionDir)target\$(ConfigurationName)\Resources" /E /C /Y +copy "$(SolutionDir)Components\log4net.dll" "$(SolutionDir)target\$(ConfigurationName)\log4net.dll" /Y + + + + \ No newline at end of file diff --git a/Platform/Properties/AssemblyInfo.cs b/Platform/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..86debdf --- /dev/null +++ b/Platform/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Platform")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Platform")] +[assembly: AssemblyCopyright("Copyright © 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7401c7a2-13c4-4821-9b09-deb707d27b3a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Platform/Resources/Themes/AeroTheme/ButtonDown.ico b/Platform/Resources/Themes/AeroTheme/ButtonDown.ico new file mode 100644 index 0000000000000000000000000000000000000000..bfc3922ec3f24fed3f1a1e567b224c8112a04497 GIT binary patch literal 1790 zcmcIkF=*RR5LKZR4;?&|B0>fWIz-SRf(-qTC4vqXWQd?c1R09SU`&Q!JQ!gp!FVvD zLogkT$PjP`gFOV2A)pWlC_}*=3d&GWh7Rtg(c|mgm+d5WoI;^8&k|qy_wK!acZ%|i zeoI+}{&ULj7mD&)QIr+J5+O(6b-pg?-J;9c(D7gJp5o>On78oWfVb};y67SK5g_?~ zIs;xy5uJ5l=S^f^W{@E`nqaZ#yt(eY)?6 zV%!7g@9tPAkbm)c2ZJvq3=S6~XcVMRtV2IakjW^}mb2_TtTip&%Q0pUpZjpPO{s@@ z!q0^#;qTkf-)O0pYDfC_4x5hl~^$2=pVVdNesFkvQ)dJ zqY!pKfwfzP)#yQ^vr(Qa&^IZMyag?%!8lG}?|U+rsL%WTISi?<>U)knpXBF2_K)l# zs*lpP1(ot-=s8vPq|**1ms4%QskNjwu`bfOpnei-I)Y;lF?ln*xv?PI>nMbS!uy$E{e}{B<8tNAuX#qRMKL;GZ1!tjBbJyq`|9|Q#}iK zn2&qYDVAYyt_`X+>K%S&9?m0~#GAW^#6uvS*1=zRXm3ojm~-S@**ErRGN)O~H19<` Pq=9)Z$&62gf4%+yL9Qym literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/AeroTheme/ButtonUp.ico b/Platform/Resources/Themes/AeroTheme/ButtonUp.ico new file mode 100644 index 0000000000000000000000000000000000000000..eae74726b6b82ff4787f859b77a571a44e0a547a GIT binary patch literal 1790 zcmbVMF=*pR6xG3TsMtcqafoG$2(E}A#R|5FV4D@BIKdSWY!Sg0!K7GBiXdDBV>p6I zVayf5xCkOez$pw)5wMGZ%tAmZ0!p#q6al43p@S<_Y~f;yckhp!P4>9GgHw1JOEdqy z|NhJ$P5X|2&kc?Lm$W~A(6pa4Oo@fxc>z5 z&bh8&muT2%ZxdTKnwvJ_mW!nCAw3Kry22m-9wD3bP~Hwu-p801MA-vAwSl<{e6|3X z$nOk<8yXCwLikQYS(;p9VgAWwOq;RfxhHPOaot8f43&pLzlqst6ItIUT+EJ$p^JP% zT(~GM9Te9N(uobz)ZjOK1XLBcYZe9vwpu6aB~IeA0~cw>QM~zCi14+E?6iwypC0Ky z-6!9HgY1ZFhQ!1{J|!+}xUX~sdts%)(OtI@?)Y$74_PPcv*RjWc!Y0u5}}w>ezIW` z=mQZIgMfdsC_m6ur}$Cf1x3K=}`@(=qzi<=xy}gpcbLD zOeA|m=Mmja1NO3kI`>52tXhcHjjz_I^^6BUZ8w=Lx)DT?CU6g6Wv&k3I2T_LY0Wev(o4xzghqle*E5|Jvf29r3J03fXbQ-q6v! zOc0eN!d8UZ*$DQ}CbaK0xSKWj>mDq=hn%k+wAI|~tjRtgI7*KwkTbtzKXQM9H#Ykz zL4MvGfs=rNdeYuW(6EhV&y^@}6G|RQ=nH8t(+T zlUPfBPlj!BEcnC&?}Kpt+d85r^$|beU5@a4jGFl2Z_!E5dYIpiF~6zske?c#>d5`} qFFJF2lJg=tnlE_XHv+}4KhqiKA!lv=OGj#zpN9CrV*Ez@-{&u=F%$Iw literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/AeroTheme/ToggleUp.ico b/Platform/Resources/Themes/AeroTheme/ToggleUp.ico new file mode 100644 index 0000000000000000000000000000000000000000..95056b1dee7de92918be648397ab1c55c3d9ce58 GIT binary patch literal 1790 zcmcIkJ!sod5LTC>p@W7{MCf2a2MaRPkfDMu7G$WQLj)Nj@DPlrM~5OZ1Q94kWH65m zMsx_FL!lW8^-%CqXb1$-En`Qo?&eYB^}e&^KDkx@pfaDIEWdZ(ec#>5vhMI_)3Nxw zVST-8S@$i=YBDw%4F;a$y5j%puB;o-{{(n-H>AlZq1nfCqR;14T=QxGze`NVn&O>+ zoO`w)ej3pHGN%IPYViIj5)GfuGAgiloKo>FVJHLmy}*}IkK7HL5Ia3i1>qx)Cdbig zPq}xsa@>+Y_ayJ~xM>$11ElQsE1pWg@@~QQ(hG+JM>+RT-4>QWyBemb5lwy|y9UsU}su8lsx9Gg92++zki+n(srCmALEi1f*VGhk0KL+JJRSs+}f+1tbA++rsG zfamr!miX`v`6FijDyM9aiALm)*+mT%`^@Pg~c^Qnhg?!kM*ddr+-Ej5^{;ai;^ koSkvL@CLcUH^j#~C+2qz{#)^wvCaD>&lQ{TlJT$CH+QZq@c;k- literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/ClassicTheme/ButtonDown.ico b/Platform/Resources/Themes/ClassicTheme/ButtonDown.ico new file mode 100644 index 0000000000000000000000000000000000000000..e944d27a5bd43168126bd452184ec6260b7a2bcc GIT binary patch literal 1790 zcmb8wdr(wW0LSt5F;37w3?lW0HB zS+oV;S5Xl*L&cKWp8Q#N4(&`AcB~1bS$CR8SIc>D<-AbLgNAM;qHfSsoW~;n>5McQ zj?u881P9EZ<5D3H#aw%7EahRBl$8s~-S9CxW0%sQJ4)NJE$H*UK!13H5Rd+dB;lD0 z+gD;{G8|1%I5x+Sxw^ZP6BkNLUSf~@BwD(3R2}C_Z2;>6J!mdJ$+g1?G#*&fWvwWM ztR7dyIS&U*G@+~I@ugDz-ZbV1FJZF1C5;Ey8yt$IQD{08C%aXiM^d;S%Vw!)E&Gnk z`=Y4Zy~1FRDEF-FrDUrXqoHrg8IIYV40&S^b{3}e@81tUH(UAI`phWmGgostGumK( zH0>oh#4q+GR6OVQvV3aOBB)7SN==$X)L)RZb^%J;@p8_T_-`>c8P?~T+MUa})NNNJ zmog%0J@*Z!rRKx^L>2qy$Y6R6{j(<1IomlE1bN%CT{qXWo~nJ@ao*!Ag5ob0UG`18N0vTos+eHV+-BiSkX zrSp;sF~^D>+8(J|uAkY*x`kfy`_U$zRh3vTN!d0nA56Am_>jRkDJO`vn!t#mgIP7t z12a=&5^~Pt?dylvrUKMoUBJrBl-!sgs?wKHow1@1y;!&PV%?pwzGSMOs*VH z!*qlZkvWwtD7eR*<#EjZx&XTg)(jjt0H**g{{DX0SX<$icaOkzDLC6&arN|W+Rh)K zt@wFa+-WFdb5w|&^RV?7ZtL=8?WMV_3Ym+g`Dn(Pk3wlZh7m@?SaPr$8<7=~u#1qS zy_kqs~bk-I2s2BAvC-!W@ zf0_sOwl)MGZ6SC=IuW_GD92l(R@vk2H&4#;3y;E6CNW3|}vIDo$ka__|K^^si>pH?IBPocm2>*xQUFB=R%V zSvT<6dKS+@Nt7_XaQY(qwc=&wM^*_|9K-XCXPbwAP=H){&<@pNU3 q#XC&(4`iaNyJ4T6JCpY6(>#`PWFn*aB{^cPGLqwX@&D*`+y4PAwlwDe literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/ClassicTheme/ButtonUp.ico b/Platform/Resources/Themes/ClassicTheme/ButtonUp.ico new file mode 100644 index 0000000000000000000000000000000000000000..516f4e822e48ecd16588515cf4d6cc291ee6ec9e GIT binary patch literal 1790 zcmb7_2~1R16oyAdtt%i3GL)@?4CAm{5y9dHnz|ucmqD>g>%Jk%xB;n4QE@?*N?mXx zA|PN{grR^E7LkG|3JPj5sE7#SlByw1zTTNcjZI9``|`h+^UitSf6smQ_+Mazu4jkO< zMC3L{4uv=n73N6v4m+ZEzL$b15l4nPaA2D~`#0OOccTO0s}*ctsvvZ+E%704sAIe+ zj+;S8X*i1~TNA%Oh|26(+8Pq*co5I)Cr5bGc8GT`cku45JDr_YbpAb<`;7xo`srX` zAVE*B3-cHBPd)*OURPUl8SxL;=u_VTZQJ1=zikNSy zh#k$1cn@mNxl^CxL1WQKn#x>xchCN6Mm{sXpPt&17e4FFH|Q=t#q5 zdpt(;#b?KSE#GH{AD%NEPzFxH&AA`7Sx(d>J5hPkg)7lcToxP+@A}zwJj|NU6lYy3 zlf$^EvLSnuHF;q+6z-8z7Nelzr2K=_(KhJy@2>Tj_53k?dUeId{0q8vl`zRo_d{K& zc<$0}xt5cy8cOA<6*T8Az)R7KYbh$y)<{WTXF`_Bg4|F`;q?_I(H|ABGGUm)Nb55* zH4f>(?w{n}*B0)zA}7>>Ou^Cct{nS;r+NNN7}k?2(Ob%LJyKTn9WSMv`8aa)$AkbI;lNwFEdb=rEo5Y+2Cw1i@%8vTen(xnec@HWQR+G4- zFGo}lNnI-?Ey$FVATzuj`_sQqckFBjV=JWBryEPW z4H<0Ei}2iB#!h$RyXgF~-dv7dI!AiSa1K zJZA0O!nRd&v>Xkuy`g}XyoD&Ijp9YqRi0EO&~h!2XV(*HyOF~4TPc*L9Yj9NngxRE z;yxUmZr$)de2|SI9wFlT;?vwMOrMj|cMiK2&MnsfYF z;4}KOKJ7KB$gRy;9K4#j_v-OeXRt_k%)MW)^)1VY;pLqyUfs^%MQsKhH`8dZO`)wO z=@Xx(%=!5HdVbdD#jSK2%Mutn$`La&DPHq@a2e%-ZvQ^a^BG5D`Pu*U(X7?|G(Z0R IKl;D%KSUZLCjbBd literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/ClassicTheme/ToggleUp.ico b/Platform/Resources/Themes/ClassicTheme/ToggleUp.ico new file mode 100644 index 0000000000000000000000000000000000000000..6b801ae1b8786c5e3353bbd174b1e614eaf960dc GIT binary patch literal 1790 zcmb7_SxggA6o$t=C|I-ziUMuiSjA{k6_;v7+zp_BOQ9@oELxO;RBJ@h0*V+wtiei5 zToCJm#;A!z5i}Sd)c9y(ToMzFnkclEx8HN`bV{l6V4J_^&UU`}&p9&{ghBKT_7~_^ zA$%Dw2!Vnigp-0v3KHATKJ9eO`_tWe2;E)Hcyc@w)`I0QYZtgxpGURBC2$YaksVvpB|h=@3SU2I~vi;)G5l@c@C1^Ua!K>-_i^M$|fNNiaV zhwp7?;CyQJ(s|luvcguHh==A(v^AE&`KS(#o278H?1AH|o}#2e*jq%ssm(-4fFIIV zEr7{n;?m5ThC2s0pvSfsJ=gZQ#Ma{W@5iS($C8_XFKy@GxUo;n@5OMq7~QmAGb0RJ zljC`Q7FWkbV`s{8ERG3v<)z%VB5}v1FO#J5u}JNHpYehT}prDN}{ zxsZ?c5q*>v!_Q|pVwHgyGI$Wu7DjmFX89#CP6PQ#0_(N2)9R`Xplw zCnA({3_G+?1j+gxcb{uBcyNkboJ1Fg{E!c+4^nhrOMY%0NamcHni?>%zSM1x|C`0V z^sz)g#G#pW(p*WorTFdAE_9tp$LrcGp6h;DD&nG*Xl-r9L1PI_RJ*AY<+yh!r9X@N z@#aw7Xy*IsRtT0~r-{Z`KOdf#)oPqq*vb_V62R}r?foy# z8L>Ye9Cq&K3;782ABFnLGStnuH*uN_WG0O26He@g~8V%<}DS}XDGQyCPirG`f z! zM#;7`oH}MgB=P5lPsEz}GdN4PR*j{zr(;U69L>dvBI|nbKRA@%gTXj2PU;Xlc>?k_ zuEK;dzC33`Lj%go%OR)!y{gN>5_)!75A~TFU^3|GIbMb%TNa^*7)+v{WbUVz-b0cH z&-lDLgZnU>%}|AhU?}xxcX}c$77OM@De<;(C*E1}aFl8?kGzEi%6R=cj%WNA=O?}E zSbcKSR>HWq0EX>aR9057w3?lW0HB zS+oV;S5Xl*L&cKWp8Q#N4(&`AcB~1bS$CR8SIc>D<-AbLgNAM;qHfSsoW~;n>5McQ zj?u881P9EZ<5D3H#aw%7EahRBl$8s~-S9CxW0%sQJ4)NJE$H*UK!13H5Rd+dB;lD0 z+gD;{G8|1%I5x+Sxw^ZP6BkNLUSf~@BwD(3R2}C_Z2;>6J!mdJ$+g1?G#*&fWvwWM ztR7dyIS&U*G@+~I@ugDz-ZbV1FJZF1C5;Ey8yt$IQD{08C%aXiM^d;S%Vw!)E&Gnk z`=Y4Zy~1FRDEF-FrDUrXqoHrg8IIYV40&S^b{3}e@81tUH(UAI`phWmGgostGumK( zH0>oh#4q+GR6OVQvV3aOBB)7SN==$X)L)RZb^%J;@p8_T_-`>c8P?~T+MUa})NNNJ zmog%0J@*Z!rRKx^L>2qy$Y6R6{j(<1IomlE1bN%CT{qXWo~nJ@ao*!Ag5ob0UG`18N0vTos+eHV+-BiSkX zrSp;sF~^D>+8(J|uAkY*x`kfy`_U$zRh3vTN!d0nA56Am_>jRkDJO`vn!t#mgIP7t z12a=&5^~Pt?dylvrUKMoUBJrBl-!sgs?wKHow1@1y;!&PV%?pwzGSMOs*VH z!*qlZkvWwtD7eR*<#EjZx&XTg)(jjt0H**g{{DX0SX<$icaOkzDLC6&arN|W+Rh)K zt@wFa+-WFdb5w|&^RV?7ZtL=8?WMV_3Ym+g`Dn(Pk3wlZh7m@?SaPr$8<7=~u#1qS zy_kqs~bk-I2s2BAvC-!W@ zf0_sOwl)MGZ6SC=IuW_GD92l(R@vk2H&4#;3y;E6CNW3|}vIDo$ka__|K^^si>pH?IBPocm2>*xQUFB=R%V zSvT<6dKS+@Nt7_XaQY(qwc=&wM^*_|9K-XCXPbwAP=H){&<@pNU3 q#XC&(4`iaNyJ4T6JCpY6(>#`PWFn*aB{^cPGLqwX@&D*`+y4PAwlwDe literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/VistaNoAeroTheme/ButtonUp.ico b/Platform/Resources/Themes/VistaNoAeroTheme/ButtonUp.ico new file mode 100644 index 0000000000000000000000000000000000000000..516f4e822e48ecd16588515cf4d6cc291ee6ec9e GIT binary patch literal 1790 zcmb7_2~1R16oyAdtt%i3GL)@?4CAm{5y9dHnz|ucmqD>g>%Jk%xB;n4QE@?*N?mXx zA|PN{grR^E7LkG|3JPj5sE7#SlByw1zTTNcjZI9``|`h+^UitSf6smQ_+Mazu4jkO< zMC3L{4uv=n73N6v4m+ZEzL$b15l4nPaA2D~`#0OOccTO0s}*ctsvvZ+E%704sAIe+ zj+;S8X*i1~TNA%Oh|26(+8Pq*co5I)Cr5bGc8GT`cku45JDr_YbpAb<`;7xo`srX` zAVE*B3-cHBPd)*OURPUl8SxL;=u_VTZQJ1=zikNSy zh#k$1cn@mNxl^CxL1WQKn#x>xchCN6Mm{sXpPt&17e4FFH|Q=t#q5 zdpt(;#b?KSE#GH{AD%NEPzFxH&AA`7Sx(d>J5hPkg)7lcToxP+@A}zwJj|NU6lYy3 zlf$^EvLSnuHF;q+6z-8z7Nelzr2K=_(KhJy@2>Tj_53k?dUeId{0q8vl`zRo_d{K& zc<$0}xt5cy8cOA<6*T8Az)R7KYbh$y)<{WTXF`_Bg4|F`;q?_I(H|ABGGUm)Nb55* zH4f>(?w{n}*B0)zA}7>>Ou^Cct{nS;r+NNN7}k?2(Ob%LJyKTn9WSMv`8aa)$AkbI;lNwFEdb=rEo5Y+2Cw1i@%8vTen(xnec@HWQR+G4- zFGo}lNnI-?Ey$FVATzuj`_sQqckFBjV=JWBryEPW z4H<0Ei}2iB#!h$RyXgF~-dv7dI!AiSa1K zJZA0O!nRd&v>Xkuy`g}XyoD&Ijp9YqRi0EO&~h!2XV(*HyOF~4TPc*L9Yj9NngxRE z;yxUmZr$)de2|SI9wFlT;?vwMOrMj|cMiK2&MnsfYF z;4}KOKJ7KB$gRy;9K4#j_v-OeXRt_k%)MW)^)1VY;pLqyUfs^%MQsKhH`8dZO`)wO z=@Xx(%=!5HdVbdD#jSK2%Mutn$`La&DPHq@a2e%-ZvQ^a^BG5D`Pu*U(X7?|G(Z0R IKl;D%KSUZLCjbBd literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/VistaNoAeroTheme/ToggleUp.ico b/Platform/Resources/Themes/VistaNoAeroTheme/ToggleUp.ico new file mode 100644 index 0000000000000000000000000000000000000000..6b801ae1b8786c5e3353bbd174b1e614eaf960dc GIT binary patch literal 1790 zcmb7_SxggA6o$t=C|I-ziUMuiSjA{k6_;v7+zp_BOQ9@oELxO;RBJ@h0*V+wtiei5 zToCJm#;A!z5i}Sd)c9y(ToMzFnkclEx8HN`bV{l6V4J_^&UU`}&p9&{ghBKT_7~_^ zA$%Dw2!Vnigp-0v3KHATKJ9eO`_tWe2;E)Hcyc@w)`I0QYZtgxpGURBC2$YaksVvpB|h=@3SU2I~vi;)G5l@c@C1^Ua!K>-_i^M$|fNNiaV zhwp7?;CyQJ(s|luvcguHh==A(v^AE&`KS(#o278H?1AH|o}#2e*jq%ssm(-4fFIIV zEr7{n;?m5ThC2s0pvSfsJ=gZQ#Ma{W@5iS($C8_XFKy@GxUo;n@5OMq7~QmAGb0RJ zljC`Q7FWkbV`s{8ERG3v<)z%VB5}v1FO#J5u}JNHpYehT}prDN}{ zxsZ?c5q*>v!_Q|pVwHgyGI$Wu7DjmFX89#CP6PQ#0_(N2)9R`Xplw zCnA({3_G+?1j+gxcb{uBcyNkboJ1Fg{E!c+4^nhrOMY%0NamcHni?>%zSM1x|C`0V z^sz)g#G#pW(p*WorTFdAE_9tp$LrcGp6h;DD&nG*Xl-r9L1PI_RJ*AY<+yh!r9X@N z@#aw7Xy*IsRtT0~r-{Z`KOdf#)oPqq*vb_V62R}r?foy# z8L>Ye9Cq&K3;782ABFnLGStnuH*uN_WG0O26He@g~8V%<}DS}XDGQyCPirG`f z! zM#;7`oH}MgB=P5lPsEz}GdN4PR*j{zr(;U69L>dvBI|nbKRA@%gTXj2PU;Xlc>?k_ zuEK;dzC33`Lj%go%OR)!y{gN>5_)!75A~TFU^3|GIbMb%TNa^*7)+v{WbUVz-b0cH z&-lDLgZnU>%}|AhU?}xxcX}c$77OM@De<;(C*E1}aFl8?kGzEi%6R=cj%WNA=O?}E zSbcKSR>HWq0EX>aR9057w3?lW0HB zS+oV;S5Xl*L&cKWp8Q#N4(&`AcB~1bS$CR8SIc>D<-AbLgNAM;qHfSsoW~;n>5McQ zj?u881P9EZ<5D3H#aw%7EahRBl$8s~-S9CxW0%sQJ4)NJE$H*UK!13H5Rd+dB;lD0 z+gD;{G8|1%I5x+Sxw^ZP6BkNLUSf~@BwD(3R2}C_Z2;>6J!mdJ$+g1?G#*&fWvwWM ztR7dyIS&U*G@+~I@ugDz-ZbV1FJZF1C5;Ey8yt$IQD{08C%aXiM^d;S%Vw!)E&Gnk z`=Y4Zy~1FRDEF-FrDUrXqoHrg8IIYV40&S^b{3}e@81tUH(UAI`phWmGgostGumK( zH0>oh#4q+GR6OVQvV3aOBB)7SN==$X)L)RZb^%J;@p8_T_-`>c8P?~T+MUa})NNNJ zmog%0J@*Z!rRKx^L>2qy$Y6R6{j(<1IomlE1bN%CT{qXWo~nJ@ao*!Ag5ob0UG`18N0vTos+eHV+-BiSkX zrSp;sF~^D>+8(J|uAkY*x`kfy`_U$zRh3vTN!d0nA56Am_>jRkDJO`vn!t#mgIP7t z12a=&5^~Pt?dylvrUKMoUBJrBl-!sgs?wKHow1@1y;!&PV%?pwzGSMOs*VH z!*qlZkvWwtD7eR*<#EjZx&XTg)(jjt0H**g{{DX0SX<$icaOkzDLC6&arN|W+Rh)K zt@wFa+-WFdb5w|&^RV?7ZtL=8?WMV_3Ym+g`Dn(Pk3wlZh7m@?SaPr$8<7=~u#1qS zy_kqs~bk-I2s2BAvC-!W@ zf0_sOwl)MGZ6SC=IuW_GD92l(R@vk2H&4#;3y;E6CNW3|}vIDo$ka__|K^^si>pH?IBPocm2>*xQUFB=R%V zSvT<6dKS+@Nt7_XaQY(qwc=&wM^*_|9K-XCXPbwAP=H){&<@pNU3 q#XC&(4`iaNyJ4T6JCpY6(>#`PWFn*aB{^cPGLqwX@&D*`+y4PAwlwDe literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/XPTheme/ButtonUp.ico b/Platform/Resources/Themes/XPTheme/ButtonUp.ico new file mode 100644 index 0000000000000000000000000000000000000000..516f4e822e48ecd16588515cf4d6cc291ee6ec9e GIT binary patch literal 1790 zcmb7_2~1R16oyAdtt%i3GL)@?4CAm{5y9dHnz|ucmqD>g>%Jk%xB;n4QE@?*N?mXx zA|PN{grR^E7LkG|3JPj5sE7#SlByw1zTTNcjZI9``|`h+^UitSf6smQ_+Mazu4jkO< zMC3L{4uv=n73N6v4m+ZEzL$b15l4nPaA2D~`#0OOccTO0s}*ctsvvZ+E%704sAIe+ zj+;S8X*i1~TNA%Oh|26(+8Pq*co5I)Cr5bGc8GT`cku45JDr_YbpAb<`;7xo`srX` zAVE*B3-cHBPd)*OURPUl8SxL;=u_VTZQJ1=zikNSy zh#k$1cn@mNxl^CxL1WQKn#x>xchCN6Mm{sXpPt&17e4FFH|Q=t#q5 zdpt(;#b?KSE#GH{AD%NEPzFxH&AA`7Sx(d>J5hPkg)7lcToxP+@A}zwJj|NU6lYy3 zlf$^EvLSnuHF;q+6z-8z7Nelzr2K=_(KhJy@2>Tj_53k?dUeId{0q8vl`zRo_d{K& zc<$0}xt5cy8cOA<6*T8Az)R7KYbh$y)<{WTXF`_Bg4|F`;q?_I(H|ABGGUm)Nb55* zH4f>(?w{n}*B0)zA}7>>Ou^Cct{nS;r+NNN7}k?2(Ob%LJyKTn9WSMv`8aa)$AkbI;lNwFEdb=rEo5Y+2Cw1i@%8vTen(xnec@HWQR+G4- zFGo}lNnI-?Ey$FVATzuj`_sQqckFBjV=JWBryEPW z4H<0Ei}2iB#!h$RyXgF~-dv7dI!AiSa1K zJZA0O!nRd&v>Xkuy`g}XyoD&Ijp9YqRi0EO&~h!2XV(*HyOF~4TPc*L9Yj9NngxRE z;yxUmZr$)de2|SI9wFlT;?vwMOrMj|cMiK2&MnsfYF z;4}KOKJ7KB$gRy;9K4#j_v-OeXRt_k%)MW)^)1VY;pLqyUfs^%MQsKhH`8dZO`)wO z=@Xx(%=!5HdVbdD#jSK2%Mutn$`La&DPHq@a2e%-ZvQ^a^BG5D`Pu*U(X7?|G(Z0R IKl;D%KSUZLCjbBd literal 0 HcmV?d00001 diff --git a/Platform/Resources/Themes/XPTheme/ToggleUp.ico b/Platform/Resources/Themes/XPTheme/ToggleUp.ico new file mode 100644 index 0000000000000000000000000000000000000000..6b801ae1b8786c5e3353bbd174b1e614eaf960dc GIT binary patch literal 1790 zcmb7_SxggA6o$t=C|I-ziUMuiSjA{k6_;v7+zp_BOQ9@oELxO;RBJ@h0*V+wtiei5 zToCJm#;A!z5i}Sd)c9y(ToMzFnkclEx8HN`bV{l6V4J_^&UU`}&p9&{ghBKT_7~_^ zA$%Dw2!Vnigp-0v3KHATKJ9eO`_tWe2;E)Hcyc@w)`I0QYZtgxpGURBC2$YaksVvpB|h=@3SU2I~vi;)G5l@c@C1^Ua!K>-_i^M$|fNNiaV zhwp7?;CyQJ(s|luvcguHh==A(v^AE&`KS(#o278H?1AH|o}#2e*jq%ssm(-4fFIIV zEr7{n;?m5ThC2s0pvSfsJ=gZQ#Ma{W@5iS($C8_XFKy@GxUo;n@5OMq7~QmAGb0RJ zljC`Q7FWkbV`s{8ERG3v<)z%VB5}v1FO#J5u}JNHpYehT}prDN}{ zxsZ?c5q*>v!_Q|pVwHgyGI$Wu7DjmFX89#CP6PQ#0_(N2)9R`Xplw zCnA({3_G+?1j+gxcb{uBcyNkboJ1Fg{E!c+4^nhrOMY%0NamcHni?>%zSM1x|C`0V z^sz)g#G#pW(p*WorTFdAE_9tp$LrcGp6h;DD&nG*Xl-r9L1PI_RJ*AY<+yh!r9X@N z@#aw7Xy*IsRtT0~r-{Z`KOdf#)oPqq*vb_V62R}r?foy# z8L>Ye9Cq&K3;782ABFnLGStnuH*uN_WG0O26He@g~8V%<}DS}XDGQyCPirG`f z! zM#;7`oH}MgB=P5lPsEz}GdN4PR*j{zr(;U69L>dvBI|nbKRA@%gTXj2PU;Xlc>?k_ zuEK;dzC33`Lj%go%OR)!y{gN>5_)!75A~TFU^3|GIbMb%TNa^*7)+v{WbUVz-b0cH z&-lDLgZnU>%}|AhU?}xxcX}c$77OM@De<;(C*E1}aFl8?kGzEi%6R=cj%WNA=O?}E zSbcKSR>HWq0EX>aR905 + /// Quick N' Easy access to the Satellite GUI Assembly Resource + /// + public static class GUIResx + { + private static ResourceManager _ResourceManager = null; + private static Assembly _Assembly = null; + + /// + /// Construction + /// + static GUIResx() + { + try + { + if (_ResourceManager == null && _Assembly == null) + { + _Assembly = Assembly.LoadFile(InstallationSpec.InstallPath + "\\" + "Satellite.dll"); + _ResourceManager = new ResourceManager("Foo.Satellite.GUI", _Assembly); + + // * For Debugging * + //string[] resourceNames = _Assembly.GetManifestResourceNames(); + //foreach (string resourceName in resourceNames) + //{ + // string Doris = resourceName; + //} + } + } + catch (Exception e) + { + string message = e.Message; + } + } + + /// + /// Returns a Resource value as a string + /// + /// name of resource to get + /// the value of the resource + public static string GetString(string strName) + { + string retVal = string.Empty; + try + { + retVal = _ResourceManager.GetString(strName); + } + catch (Exception e) + { + string message = e.Message; + } + return retVal; + } + } +} diff --git a/Platform/Utilities/DebugLogger.cs b/Platform/Utilities/DebugLogger.cs new file mode 100644 index 0000000..f58e99b --- /dev/null +++ b/Platform/Utilities/DebugLogger.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using Microsoft.Win32; +using System.Reflection; +using System.Diagnostics; + +namespace Ooganizer.Platform.Utilities +{ + public class DebugLogger + { + private static string s_strFileNPath = ""; + private static FileM s_fileM = null; + private static LogInstantiator s_LogI = null; + private static int s_LoadTime = 0; + private static bool s_firstTime = true; + + /// + /// Use the Log(string line) method to quickly write to a temp log file in the current assembly directory + /// + static DebugLogger() + { + if (s_LogI == null) + { + int timebefore = System.Environment.TickCount; + s_LogI = new LogInstantiator(); + s_LoadTime = System.Environment.TickCount - timebefore; + } + + if (s_fileM == null) + s_fileM = new FileM(s_LogI.strFileName, "log", s_LogI.strDirectoryPath, true); + + if(s_strFileNPath == "") + s_strFileNPath = s_fileM.PathNFile; + } + + public static void Log(string line) + { + if (s_firstTime) + { + //s_fileM.WriteLineUTF8("EasyLogger's Logger.cs was loaded in " + s_LoadTime.ToString() + " miliseconds"); + s_firstTime = false; + } + s_fileM.WriteLineUTF8(line); + } + + /// + /// Small Helper class in order to get the location of the currently running assembly + /// + private class LogInstantiator + { + public string strFileName; + public string strDirectoryPath; + private static RegistryKey s_OogyRootKey; + + public LogInstantiator() + { + // For Random File names ~shouldn't be used anymore + //string strRandomFileName = Path.GetRandomFileName(); + //strRandomFileName = strRandomFileName.Substring(0, (strRandomFileName.Length - 4)); // stripe extension (.xyz) + //strFileName = strRandomFileName; + + // Find the Calling Assembly that is NOT this one + StackTrace stackTrace = new StackTrace(); + StackFrame stackFrame; + MethodBase stackFrameMethod; + string typeName; + + int framecount = 3; + stackFrame = stackTrace.GetFrame(framecount); + stackFrameMethod = stackFrame.GetMethod(); + typeName = stackFrameMethod.ReflectedType.FullName; + + // *IMP* Use the calling Assembly Type Name as the file name + strFileName = typeName; + + // *Work-Around*, we can't have a circular reference with InstallationSpec, so we just + // have to Query for the LogPath Directly instead of using Platform.InstallationSpec + s_OogyRootKey = Registry.LocalMachine.OpenSubKey("Software\\Ooganizer",false); + + if (s_OogyRootKey != null) + { + object keyvalue = s_OogyRootKey.GetValue("LogPath"); + if ((keyvalue != null) && (keyvalue.ToString() != "")) + strDirectoryPath = keyvalue.ToString(); + } + } + } + } +} diff --git a/Platform/Utilities/FileM.cs b/Platform/Utilities/FileM.cs new file mode 100644 index 0000000..7d08be7 --- /dev/null +++ b/Platform/Utilities/FileM.cs @@ -0,0 +1,154 @@ + +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; + +namespace Ooganizer.Platform.Utilities +{ + public class FileM + { + private string m_sFileName; + private string m_sFileType; + private string m_sFileDirPath; + + //Flags + private bool m_bIsFileCreated = false; + private bool m_bOverideExisting = true; + private bool m_bDeleteOnDestruct = false; + + // Creates Temporary File by Default + public FileM(string FileType) + { + m_sFileName = Path.GetRandomFileName(); + m_sFileType = FileType; + m_sFileDirPath = Path.GetTempPath(); + m_bDeleteOnDestruct = true; + } + + public FileM(string FileType, bool bDontDeleteOnDestruct) + { + m_sFileName = Path.GetRandomFileName(); + m_sFileType = FileType; + m_sFileDirPath = Path.GetTempPath(); + m_bDeleteOnDestruct = !bDontDeleteOnDestruct; + } + + public FileM(string FileName, string FileType, string DirectoryPath, bool OverideExisting) + { + m_sFileName = FileName; + m_sFileType = FileType; + if (!Directory.Exists(DirectoryPath)) + { + Directory.CreateDirectory(DirectoryPath); + } + m_sFileDirPath = DirectoryPath + "\\"; + m_bOverideExisting = OverideExisting; + } + + ~FileM() + { + if (m_bDeleteOnDestruct) + { + File.Delete(this.PathNFile); + } + } + + public void WriteLineA(string line) + { + FileStream fs = CreateFile(); + StreamWriter sw = new StreamWriter(fs, Encoding.ASCII); + sw.WriteLine(line); + sw.Flush(); + sw.Close(); + fs.Close(); + } + + public void WriteLineA(string[] lines) + { + FileStream fs = CreateFile(); + StreamWriter sw = new StreamWriter(fs, Encoding.ASCII); + + foreach (string line in lines) + { + sw.WriteLine(line); + } + + sw.Flush(); + sw.Close(); + fs.Close(); + } + + public void WriteLineUTF8(string line) + { + FileStream fs = CreateFile(); + StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); + sw.WriteLine(line); + sw.Flush(); + sw.Close(); + fs.Close(); + } + + public void WriteLineUTF8(string[] lines) + { + FileStream fs = CreateFile(); + StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); + + foreach (string line in lines) + { + sw.WriteLine(line); + } + + sw.Flush(); + sw.Close(); + fs.Close(); + } + + public void DeleteIfExists() + { + if (File.Exists(this.PathNFile)) + { + File.Delete(this.PathNFile); + } + } + + private FileStream CreateFile() + { + if (!m_bIsFileCreated && m_bOverideExisting) + { + m_bIsFileCreated = true; + return (new FileStream(this.PathNFile, FileMode.Create)); + } + else + { + return (new FileStream(this.PathNFile, FileMode.Append)); + } + } + + // public properties + public string FileName + { + get + { + return (this.FileName); + } + } + + public string DirectoryPath + { + get + { + return (this.m_sFileDirPath); + } + } + + public string PathNFile + { + get + { + return (m_sFileDirPath + m_sFileName + "." + m_sFileType); + } + } + + } +} diff --git a/Platform/Utilities/RegM.cs b/Platform/Utilities/RegM.cs new file mode 100644 index 0000000..122bb65 --- /dev/null +++ b/Platform/Utilities/RegM.cs @@ -0,0 +1,191 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Microsoft.Win32; + +namespace Foo.Platform.Utilities +{ + public enum HKEYRoot + { + ClassesRoot, + CurrentUser, + LocalMachine, + } + + public enum KeySub + { + Software, + Custom + } + + public class RegM + { + + private RegistryKey _RegKey; + + /// + /// Use this to Open/Automatically Create a Registry Key + /// + /// specify registry root + /// specify a sub or custom + /// key you want to open / create + /// true if you plan on writing to it + public RegM(HKEYRoot root, KeySub sub, string Key, bool bWrite) + { + string KeyToOpen = String.Empty; + if (sub == KeySub.Custom) + KeyToOpen = Key; + else + KeyToOpen = sub.ToString() + "\\" + Key; + + RegistryKeyPermissionCheck permission = RegistryKeyPermissionCheck.ReadSubTree; + if (bWrite) + permission = RegistryKeyPermissionCheck.ReadWriteSubTree; + + // Open/Create if it doesn't exist, the Proper Key + switch (root) + { + case HKEYRoot.ClassesRoot: + _RegKey = Registry.ClassesRoot.CreateSubKey(KeyToOpen, permission); + break; + + case HKEYRoot.CurrentUser: + _RegKey = Registry.CurrentUser.CreateSubKey(KeyToOpen, permission); + break; + + case HKEYRoot.LocalMachine: + _RegKey = Registry.LocalMachine.CreateSubKey(KeyToOpen, permission); + break; + } + } + + #region GetValue Registry Functions + + public bool GetVal_String(string strValKey, out string StringValue) + { + StringValue = String.Empty; + try + { + object keyvalue = null; + keyvalue = _RegKey.GetValue(strValKey); + if (isValidStr(keyvalue)) + StringValue = keyvalue.ToString(); + return true; + } + catch (Exception) { /* ignore */ } + return false; + } + + public bool GetVal_Bool(string strValKey, out bool BoolValue) + { + BoolValue = false; + try + { + string StringValue; + if (GetVal_String(strValKey, out StringValue) && + !String.IsNullOrEmpty(StringValue)) + BoolValue = Boolean.Parse(StringValue); + return true; + } + catch (Exception) { /* ignore */ } + return false; + } + + public bool GetVal_Int(string strValKey, out int IntValue) + { + IntValue = 0; + try + { + string StringValue; + if (GetVal_String(strValKey, out StringValue) && + !String.IsNullOrEmpty(StringValue)) + IntValue = int.Parse(StringValue); + return true; + } + catch (Exception) { /* ignore */ } + return false; + } + + public bool GetVal_Binary(string strValKey, out byte[] ByteValue) + { + ByteValue = null; + try + { + string StringValue; + if (GetVal_String(strValKey, out StringValue) && + !String.IsNullOrEmpty(StringValue)) + { + ByteValue = new Byte[StringValue.Length]; + for (int i = 0; i < ByteValue.Length; ++i) + { + string strByte = Convert.ToString(StringValue[i]); + ByteValue[i] = byte.Parse(strByte); + } + } + return true; + } + catch (Exception) { /* ignore */ } + return false; + } + + #endregion + + #region SetValue Registry Functions + + public bool SetVal_String(string strValKey, string StringValue) + { + try + { + _RegKey.SetValue(strValKey, StringValue, RegistryValueKind.String); + return true; + } + catch (Exception) { /* ignore */ } + return false; + } + + public bool SetVal_Bool(string strValKey, bool BoolValue) + { + try + { + _RegKey.SetValue(strValKey, BoolValue.ToString(), RegistryValueKind.String); + return true; + } + catch (Exception) { /* ignore */ } + return false; + } + + public bool SetVal_Int(string strValKey, int DwordValue) + { + try + { + _RegKey.SetValue(strValKey, DwordValue, RegistryValueKind.DWord); + return true; + } + catch (Exception) { /* ignore */ } + return false; + } + + public bool SetVal_Binary(string strValKey, byte[] ByteValue) + { + try + { + _RegKey.SetValue(strValKey, ByteValue, RegistryValueKind.Binary); + return true; + } + catch (Exception) { /* ignore */ } + return false; + } + + #endregion + + /// Returns true if passed in object is valid and not "" + private bool isValidStr(object oToValidate) + { + if ((oToValidate != null) && (oToValidate.ToString() != "")) + return true; + else + return false; + } + } + +} diff --git a/Platform/Win32.cs b/Platform/Win32.cs new file mode 100644 index 0000000..0fe3a71 --- /dev/null +++ b/Platform/Win32.cs @@ -0,0 +1,1362 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Diagnostics; +using System.Threading; +using System.Windows.Forms; +using System.Drawing; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.InteropServices.ComTypes; + +// TODO Move most of this to the Platform project +namespace Foo.Platform.Win32 +{ + public class MyWin32Wnd : IWin32Window + { + private IntPtr m_Handle = IntPtr.Zero; + public IntPtr Handle + { + get{return m_Handle;} + set{m_Handle = value;} + } + } + + //// + // Win32 Enums + //// + #region Win32 Enums + + public enum WindowAction : int + { + SW_HIDE = 0, + SW_SHOWNORMAL = 1, + SW_NORMAL = 1, + SW_SHOWMINIMIZED = 2, + SW_SHOWMAXIMIZED = 3, + SW_MAXIMIZE = 3, + SW_SHOWNOACTIVATE = 4, + SW_SHOW = 5, + SW_MINIMIZE = 6, + SW_SHOWMINNOACTIVE = 7, + SW_SHOWNA = 8, + SW_RESTORE = 9, + SW_SHOWDEFAULT = 10, + SW_FORCEMINIMIZE = 11, + SW_MAX = 11 + } + + public enum WindowLong : int + { + GWL_EXSTYLE = -20, + GWL_STYLE = -16, + GWL_WNDPROC = -4, + GWL_HINSTANCE = -6, + GWL_ID = -12, + GWL_USERDATA = -21, + DWL_DLGPROC = 4, + DWL_MSGRESULT = 0, + DWL_USER = 8 + } + + public enum WindowStyles : uint + { + WS_MAXIMIZE = 0x01000000, + WS_VISIBLE = 0x10000000, + WS_POPUP = 0x80000000, + WS_BORDER = 0x00800000, + WS_CAPTION = 0x00C00000, + WS_CHILD = 0x40000000, + WS_CHILDWINDOW = 0x40000000, + WS_CLIPCHILDREN = 0x02000000, + WS_CLIPSIBLINGS = 0x04000000, + WS_DISABLED = 0x08000000, + WS_DLGFRAME = 0x00400000, + WS_GROUP = 0x00020000 + } + + public enum WindowMessage : int + { + WM_NULL = 0x0000, + WM_CREATE = 0x0001, + WM_DESTROY = 0x0002, + WM_MOVE = 0x0003, + WM_SIZE = 0x0005, + WM_ACTIVATE = 0x0006, + WM_SETFOCUS = 0x0007, + WM_KILLFOCUS = 0x0008, + WM_ENABLE = 0x000A, + WM_SETREDRAW = 0x000B, + WM_SETTEXT = 0x000C, + WM_GETTEXT = 0x000D, + WM_GETTEXTLENGTH = 0x000E, + WM_PAINT = 0x000F, + WM_CLOSE = 0x0010, + WM_QUERYENDSESSION = 0x0011, + WM_QUIT = 0x0012, + WM_QUERYOPEN = 0x0013, + WM_ERASEBKGND = 0x0014, + WM_SYSCOLORCHANGE = 0x0015, + WM_ENDSESSION = 0x0016, + WM_SHOWWINDOW = 0x0018, + WM_CTLCOLOR = 0x0019, + WM_WININICHANGE = 0x001A, + WM_SETTINGCHANGE = 0x001A, + WM_DEVMODECHANGE = 0x001B, + WM_ACTIVATEAPP = 0x001C, + WM_FONTCHANGE = 0x001D, + WM_TIMECHANGE = 0x001E, + WM_CANCELMODE = 0x001F, + WM_SETCURSOR = 0x0020, + WM_MOUSEACTIVATE = 0x0021, + WM_CHILDACTIVATE = 0x0022, + WM_QUEUESYNC = 0x0023, + WM_GETMINMAXINFO = 0x0024, + WM_PAINTICON = 0x0026, + WM_ICONERASEBKGND = 0x0027, + WM_NEXTDLGCTL = 0x0028, + WM_SPOOLERSTATUS = 0x002A, + WM_DRAWITEM = 0x002B, + WM_MEASUREITEM = 0x002C, + WM_DELETEITEM = 0x002D, + WM_VKEYTOITEM = 0x002E, + WM_CHARTOITEM = 0x002F, + WM_SETFONT = 0x0030, + WM_GETFONT = 0x0031, + WM_SETHOTKEY = 0x0032, + WM_GETHOTKEY = 0x0033, + WM_QUERYDRAGICON = 0x0037, + WM_COMPAREITEM = 0x0039, + WM_GETOBJECT = 0x003D, + WM_COMPACTING = 0x0041, + WM_COMMNOTIFY = 0x0044, + WM_WINDOWPOSCHANGING = 0x0046, + WM_WINDOWPOSCHANGED = 0x0047, + WM_POWER = 0x0048, + WM_COPYDATA = 0x004A, + WM_CANCELJOURNAL = 0x004B, + WM_NOTIFY = 0x004E, + WM_INPUTLANGCHANGEREQUEST = 0x0050, + WM_INPUTLANGCHANGE = 0x0051, + WM_TCARD = 0x0052, + WM_HELP = 0x0053, + WM_USERCHANGED = 0x0054, + WM_NOTIFYFORMAT = 0x0055, + WM_CONTEXTMENU = 0x007B, + WM_STYLECHANGING = 0x007C, + WM_STYLECHANGED = 0x007D, + WM_DISPLAYCHANGE = 0x007E, + WM_GETICON = 0x007F, + WM_SETICON = 0x0080, + WM_NCCREATE = 0x0081, + WM_NCDESTROY = 0x0082, + WM_NCCALCSIZE = 0x0083, + WM_NCHITTEST = 0x0084, + WM_NCPAINT = 0x0085, + WM_NCACTIVATE = 0x0086, + WM_GETDLGCODE = 0x0087, + WM_SYNCPAINT = 0x0088, + WM_NCMOUSEMOVE = 0x00A0, + WM_NCLBUTTONDOWN = 0x00A1, + WM_NCLBUTTONUP = 0x00A2, + WM_NCLBUTTONDBLCLK = 0x00A3, + WM_NCRBUTTONDOWN = 0x00A4, + WM_NCRBUTTONUP = 0x00A5, + WM_NCRBUTTONDBLCLK = 0x00A6, + WM_NCMBUTTONDOWN = 0x00A7, + WM_NCMBUTTONUP = 0x00A8, + WM_NCMBUTTONDBLCLK = 0x00A9, + WM_KEYDOWN = 0x0100, + WM_KEYUP = 0x0101, + WM_CHAR = 0x0102, + WM_DEADCHAR = 0x0103, + WM_SYSKEYDOWN = 0x0104, + WM_SYSKEYUP = 0x0105, + WM_SYSCHAR = 0x0106, + WM_SYSDEADCHAR = 0x0107, + WM_KEYLAST = 0x0108, + WM_IME_STARTCOMPOSITION = 0x010D, + WM_IME_ENDCOMPOSITION = 0x010E, + WM_IME_COMPOSITION = 0x010F, + WM_IME_KEYLAST = 0x010F, + WM_INITDIALOG = 0x0110, + WM_COMMAND = 0x0111, + WM_SYSCOMMAND = 0x0112, + WM_TIMER = 0x0113, + WM_HSCROLL = 0x0114, + WM_VSCROLL = 0x0115, + WM_INITMENU = 0x0116, + WM_INITMENUPOPUP = 0x0117, + WM_MENUSELECT = 0x011F, + WM_MENUCHAR = 0x0120, + WM_ENTERIDLE = 0x0121, + WM_MENURBUTTONUP = 0x0122, + WM_MENUDRAG = 0x0123, + WM_MENUGETOBJECT = 0x0124, + WM_UNINITMENUPOPUP = 0x0125, + WM_MENUCOMMAND = 0x0126, + WM_CTLCOLORMSGBOX = 0x0132, + WM_CTLCOLOREDIT = 0x0133, + WM_CTLCOLORLISTBOX = 0x0134, + WM_CTLCOLORBTN = 0x0135, + WM_CTLCOLORDLG = 0x0136, + WM_CTLCOLORSCROLLBAR = 0x0137, + WM_CTLCOLORSTATIC = 0x0138, + WM_MOUSEMOVE = 0x0200, + WM_LBUTTONDOWN = 0x0201, + WM_LBUTTONUP = 0x0202, + WM_LBUTTONDBLCLK = 0x0203, + WM_RBUTTONDOWN = 0x0204, + WM_RBUTTONUP = 0x0205, + WM_RBUTTONDBLCLK = 0x0206, + WM_MBUTTONDOWN = 0x0207, + WM_MBUTTONUP = 0x0208, + WM_MBUTTONDBLCLK = 0x0209, + WM_MOUSEWHEEL = 0x020A, + WM_PARENTNOTIFY = 0x0210, + WM_ENTERMENULOOP = 0x0211, + WM_EXITMENULOOP = 0x0212, + WM_NEXTMENU = 0x0213, + WM_SIZING = 0x0214, + WM_CAPTURECHANGED = 0x0215, + WM_MOVING = 0x0216, + WM_DEVICECHANGE = 0x0219, + WM_MDICREATE = 0x0220, + WM_MDIDESTROY = 0x0221, + WM_MDIACTIVATE = 0x0222, + WM_MDIRESTORE = 0x0223, + WM_MDINEXT = 0x0224, + WM_MDIMAXIMIZE = 0x0225, + WM_MDITILE = 0x0226, + WM_MDICASCADE = 0x0227, + WM_MDIICONARRANGE = 0x0228, + WM_MDIGETACTIVE = 0x0229, + WM_MDISETMENU = 0x0230, + WM_ENTERSIZEMOVE = 0x0231, + WM_EXITSIZEMOVE = 0x0232, + WM_DROPFILES = 0x0233, + WM_MDIREFRESHMENU = 0x0234, + WM_IME_SETCONTEXT = 0x0281, + WM_IME_NOTIFY = 0x0282, + WM_IME_CONTROL = 0x0283, + WM_IME_COMPOSITIONFULL = 0x0284, + WM_IME_SELECT = 0x0285, + WM_IME_CHAR = 0x0286, + WM_IME_REQUEST = 0x0288, + WM_IME_KEYDOWN = 0x0290, + WM_IME_KEYUP = 0x0291, + WM_MOUSEHOVER = 0x02A1, + WM_MOUSELEAVE = 0x02A3, + WM_CUT = 0x0300, + WM_COPY = 0x0301, + WM_PASTE = 0x0302, + WM_CLEAR = 0x0303, + WM_UNDO = 0x0304, + WM_RENDERFORMAT = 0x0305, + WM_RENDERALLFORMATS = 0x0306, + WM_DESTROYCLIPBOARD = 0x0307, + WM_DRAWCLIPBOARD = 0x0308, + WM_PAINTCLIPBOARD = 0x0309, + WM_VSCROLLCLIPBOARD = 0x030A, + WM_SIZECLIPBOARD = 0x030B, + WM_ASKCBFORMATNAME = 0x030C, + WM_CHANGECBCHAIN = 0x030D, + WM_HSCROLLCLIPBOARD = 0x030E, + WM_QUERYNEWPALETTE = 0x030F, + WM_PALETTEISCHANGING = 0x0310, + WM_PALETTECHANGED = 0x0311, + WM_HOTKEY = 0x0312, + WM_PRINT = 0x0317, + WM_PRINTCLIENT = 0x0318, + WM_HANDHELDFIRST = 0x0358, + WM_HANDHELDLAST = 0x035F, + WM_AFXFIRST = 0x0360, + WM_AFXLAST = 0x037F, + WM_PENWINFIRST = 0x0380, + WM_PENWINLAST = 0x038F, + WM_APP = 0x8000, + WM_USER = 0x0400, + WM_REFLECT = WM_USER + 0x1c00, + WM_CHANGEUISTATE = 0x0127, + WM_UPDATEUISTATE = 0x0128, + WM_QUERYUISTATE = 0x0129 + } + + public enum WindowUIState : int + { + UIS_SET = 1, + UIS_CLEAR = 2, + UIS_INITIALIZE = 3 + } + + public enum CSIDL : int + { + CSIDL_DESKTOP = 0x0000, // + CSIDL_INTERNET = 0x0001, // Internet Explorer (icon on desktop) + CSIDL_PROGRAMS = 0x0002, // Start Menu\Programs + CSIDL_CONTROLS = 0x0003, // My Computer\Control Panel + CSIDL_PRINTERS = 0x0004, // My Computer\Printers + CSIDL_PERSONAL = 0x0005, // My Documents + CSIDL_FAVORITES = 0x0006, // \Favorites + CSIDL_STARTUP = 0x0007, // Start Menu\Programs\Startup + CSIDL_RECENT = 0x0008, // \Recent + CSIDL_SENDTO = 0x0009, // \SendTo + CSIDL_BITBUCKET = 0x000a, // \Recycle Bin + CSIDL_STARTMENU = 0x000b, // \Start Menu + CSIDL_MYDOCUMENTS = 0x000c, // logical "My Documents" desktop icon + CSIDL_MYMUSIC = 0x000d, // "My Music" folder + CSIDL_MYVIDEO = 0x000e, // "My Videos" folder + CSIDL_DESKTOPDIRECTORY = 0x0010, // \Desktop + CSIDL_DRIVES = 0x0011, // My Computer + CSIDL_NETWORK = 0x0012, // Network Neighborhood (My Network Places) + CSIDL_NETHOOD = 0x0013, // \nethood + CSIDL_FONTS = 0x0014, // windows\fonts + CSIDL_TEMPLATES = 0x0015, + CSIDL_COMMON_STARTMENU = 0x0016, // All Users\Start Menu + CSIDL_COMMON_PROGRAMS = 0X0017, // All Users\Start Menu\Programs + CSIDL_COMMON_STARTUP = 0x0018, // All Users\Startup + CSIDL_COMMON_DESKTOPDIRECTORY = 0x0019, // All Users\Desktop + CSIDL_APPDATA = 0x001a, // \Application Data + CSIDL_PRINTHOOD = 0x001b, // \PrintHood + CSIDL_LOCAL_APPDATA = 0x001c, // \Local Settings\Applicaiton Data (non roaming) + CSIDL_ALTSTARTUP = 0x001d, // non localized startup + CSIDL_COMMON_ALTSTARTUP = 0x001e, // non localized common startup + CSIDL_COMMON_FAVORITES = 0x001f, + CSIDL_INTERNET_CACHE = 0x0020, + CSIDL_COOKIES = 0x0021, + CSIDL_HISTORY = 0x0022, + CSIDL_COMMON_APPDATA = 0x0023, // All Users\Application Data + CSIDL_WINDOWS = 0x0024, // GetWindowsDirectory() + CSIDL_SYSTEM = 0x0025, // GetSystemDirectory() + CSIDL_PROGRAM_FILES = 0x0026, // C:\Program Files + CSIDL_MYPICTURES = 0x0027, // C:\Program Files\My Pictures + CSIDL_PROFILE = 0x0028, // USERPROFILE + CSIDL_SYSTEMX86 = 0x0029, // x86 system directory on RISC + CSIDL_PROGRAM_FILESX86 = 0x002a, // x86 C:\Program Files on RISC + CSIDL_PROGRAM_FILES_COMMON = 0x002b, // C:\Program Files\Common + CSIDL_PROGRAM_FILES_COMMONX86 = 0x002c, // x86 Program Files\Common on RISC + CSIDL_COMMON_TEMPLATES = 0x002d, // All Users\Templates + CSIDL_COMMON_DOCUMENTS = 0x002e, // All Users\Documents + CSIDL_COMMON_ADMINTOOLS = 0x002f, // All Users\Start Menu\Programs\Administrative Tools + CSIDL_ADMINTOOLS = 0x0030, // \Start Menu\Programs\Administrative Tools + CSIDL_CONNECTIONS = 0x0031, // Network and Dial-up Connections + CSIDL_COMMON_MUSIC = 0x0035, // All Users\My Music + CSIDL_COMMON_PICTURES = 0x0036, // All Users\My Pictures + CSIDL_COMMON_VIDEO = 0x0037, // All Users\My Video + CSIDL_CDBURN_AREA = 0x003b // USERPROFILE\Local + } + + public enum SHGFP_TYPE : int + { + SHGFP_TYPE_CURRENT = 0, + SHGFP_TYPE_DEFAULT = 1 + } + + public enum DesiredAccess : int + { + DELETE = 0x00010000, // Required to delete the object. + READ_CONTROL = 0x00020000, // Required to read information in the security descriptor for the object, not including the information in the SACL. To read or write the SACL, you must request the ACCESS_SYSTEM_SECURITY access right. For more information, see SACL Access Right. + SYNCHRONIZE = 0x00100000, // The right to use the object for synchronization. This enables a thread to wait until the object is in the signaled state. + WRITE_DAC = 0x00040000, // Required to modify the DACL in the security descriptor for the object. + WRITE_OWNER = 0x00080000 // Required to change the owner in the security descriptor for the object. + } + + public enum WaitTime : uint + { + IGNORE = 0, // Ignore signal + INFINITE = 0xFFFFFFFF // Infinite timeout + } + + public enum SystemMetric : int + { + SM_CXSCREEN = 0, + SM_CYSCREEN = 1, + SM_CXVSCROLL = 2, + SM_CYHSCROLL = 3, + SM_CYCAPTION = 4, + SM_CXBORDER = 5, + SM_CYBORDER = 6, + SM_CXDLGFRAME = 7, + SM_CYDLGFRAME = 8, + SM_CYVTHUMB = 9, + SM_CXHTHUMB = 10, + SM_CXICON = 11, + SM_CYICON = 12, + SM_CXCURSOR = 13, + SM_CYCURSOR = 14, + SM_CYMENU = 15, + SM_CXFULLSCREEN = 16, + SM_CYFULLSCREEN = 17, + SM_CYKANJIWINDOW = 18, + SM_MOUSEPRESENT = 19, + SM_CYVSCROLL = 20, + SM_CXHSCROLL = 21, + SM_DEBUG = 22, + SM_SWAPBUTTON = 23, + SM_RESERVED1 = 24, + SM_RESERVED2 = 25, + SM_RESERVED3 = 26, + SM_RESERVED4 = 27, + SM_CXMIN = 28, + SM_CYMIN = 29, + SM_CXSIZE = 30, + SM_CYSIZE = 31, + SM_CXFRAME = 32, + SM_CYFRAME = 33, + SM_CXMINTRACK = 34, + SM_CYMINTRACK = 35, + SM_CXDOUBLECLK = 36, + SM_CYDOUBLECLK = 37, + SM_CXICONSPACING = 38, + SM_CYICONSPACING = 39, + SM_MENUDROPALIGNMENT = 40, + SM_PENWINDOWS = 41, + SM_DBCSENABLED = 42, + SM_CMOUSEBUTTONS = 43 + } + + public enum SetWindowPosFlags : uint + { + SWP_NOSIZE = 0x0001, + SWP_NOMOVE = 0x0002, + SWP_NOZORDER = 0x0004, + SWP_NOREDRAW = 0x0008, + SWP_NOACTIVATE = 0x0010, + SWP_FRAMECHANGED = 0x0020, + SWP_SHOWWINDOW = 0x0040, + SWP_HIDEWINDOW = 0x0080, + SWP_NOCOPYBITS = 0x0100, + SWP_NOOWNERZORDER = 0x0200, + SWP_NOSENDCHANGING = 0x0400, + SWP_DRAWFRAME = SWP_FRAMECHANGED, + SWP_NOREPOSITION = SWP_NOOWNERZORDER + } + + public enum WindowLayerAttributes + { + LWA_COLORKEY = 0x00000001, + LWA_ALPHA = 0x00000002 + } + + public enum WindowPos : int + { + HWND_TOP = 0, + HWND_BOTTOM = 1, + HWND_TOPMOST = -1, + HWND_NOTOPMOST = -2 + } + + public enum VK : ushort + { + SHIFT = 0x10, + CONTROL = 0x11, + MENU = 0x12, + ESCAPE = 0x1B, + BACK = 0x08, + TAB = 0x09, + RETURN = 0x0D, + PRIOR = 0x21, + NEXT = 0x22, + END = 0x23, + HOME = 0x24, + LEFT = 0x25, + UP = 0x26, + RIGHT = 0x27, + DOWN = 0x28, + SELECT = 0x29, + PRINT = 0x2A, + EXECUTE = 0x2B, + SNAPSHOT = 0x2C, + INSERT = 0x2D, + DELETE = 0x2E, + HELP = 0x2F, + NUMPAD0 = 0x60, + NUMPAD1 = 0x61, + NUMPAD2 = 0x62, + NUMPAD3 = 0x63, + NUMPAD4 = 0x64, + NUMPAD5 = 0x65, + NUMPAD6 = 0x66, + NUMPAD7 = 0x67, + NUMPAD8 = 0x68, + NUMPAD9 = 0x69, + MULTIPLY = 0x6A, + ADD = 0x6B, + SEPARATOR = 0x6C, + SUBTRACT = 0x6D, + DECIMAL = 0x6E, + DIVIDE = 0x6F, + F1 = 0x70, + F2 = 0x71, + F3 = 0x72, + F4 = 0x73, + F5 = 0x74, + F6 = 0x75, + F7 = 0x76, + F8 = 0x77, + F9 = 0x78, + F10 = 0x79, + F11 = 0x7A, + F12 = 0x7B, + OEM_1 = 0xBA, // ',:' for US + OEM_PLUS = 0xBB, // '+' any country + OEM_COMMA = 0xBC, // ',' any country + OEM_MINUS = 0xBD, // '-' any country + OEM_PERIOD = 0xBE, // '.' any country + OEM_2 = 0xBF, // '/?' for US + OEM_3 = 0xC0, // '`~' for US + MEDIA_NEXT_TRACK = 0xB0, + MEDIA_PREV_TRACK = 0xB1, + MEDIA_STOP = 0xB2, + MEDIA_PLAY_PAUSE = 0xB3, + LWIN = 0x5B, + RWIN = 0x5C + } + + public enum AssocF : ushort + { + Init_NoRemapCLSID = 0x1, + Init_ByExeName = 0x2, + Open_ByExeName = 0x2, + Init_DefaultToStar = 0x4, + Init_DefaultToFolder = 0x8, + NoUserSettings = 0x10, + NoTruncate = 0x20, + Verify = 0x40, + RemapRunDll = 0x80, + NoFixUps = 0x100, + IgnoreBaseClass = 0x200 + } + + public enum AssocStr : ushort + { + Command = 1, + Executable, + FriendlyDocName, + FriendlyAppName, + NoOpen, + ShellNewValue, + DDECommand, + DDEIfExec, + DDEApplication, + DDETopic + } + + #endregion + + //// + // Win32 Structures + //// + #region Win32 Structures + + [StructLayout(LayoutKind.Sequential)] + public struct RECT + { + public int left; + public int top; + public int right; + public int bottom; + + public Rectangle AsRectangle + { + get + { + return new Rectangle(this.left, this.top, this.right - this.left, this.bottom - this.top); + } + } + + public static RECT FromXYWH(int x, int y, int width, int height) + { + RECT rect = new RECT(); + rect.left = x; + rect.top = y; + rect.right = x + width; + rect.bottom = y + height; + return rect; + } + + public static RECT FromRectangle(Rectangle rectangle) + { + RECT rect = new RECT(); + rect.left = rectangle.Left; + rect.top = rectangle.Top; + rect.right = rectangle.Right; + rect.bottom = rectangle.Bottom; + return rect; + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct SIZE + { + public int cx; + public int cy; + } + + [StructLayout(LayoutKind.Sequential)] + public struct ShellExecuteInfo + { + public int cbSize; + public uint fMask; + public IntPtr hwnd; + public string lpVerb; + public string lpFile; + public string lpParameters; + public string lpDirectory; + public uint nShow; + public IntPtr hInstApp; + public IntPtr lpIDList; + public string lpClass; + public IntPtr hkeyClass; + public uint dwHotKey; + public IntPtr hIcon_Monitor; // union DUMMYUNIONNAME + public IntPtr hProcess; + } + + [StructLayout(LayoutKind.Explicit, Size = 28)] + public struct INPUT + { + [FieldOffset(0)] + public uint type; + [FieldOffset(4)] + public KEYBDINPUT ki; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct KEYBDINPUT + { + public ushort wVk; + public ushort wScan; + public uint dwFlags; + public long time; + public uint dwExtraInfo; + }; + + [StructLayout(LayoutKind.Sequential)] + public struct MONITORINFOEX + { + public int cbSize; + public RECT rcMonitor; + public RECT rcWork; + public int dwFlags; + [MarshalAs(UnmanagedType.ByValTStr,SizeConst=32)] + public string szDeviceName; + } + + #endregion + + //// + // .Net Win32 Wrapper Functions + //// + public class Win32_WrapperFunc + { + /// + /// Get a windows client rectangle in a .NET structure + /// + /// The window handle to look up + /// The rectangle + public static Rectangle GetClientRect(IntPtr hwnd) + { + RECT rect = new RECT(); + Win32Functions.GetClientRect(hwnd, out rect); + return rect.AsRectangle; + } + + /// + /// Get a windows rectangle in a .NET structure + /// + /// The window handle to look up + /// The rectangle + public static Rectangle GetWindowRect(IntPtr hwnd) + { + RECT rect = new RECT(); + Win32Functions.GetWindowRect(hwnd, out rect); + return rect.AsRectangle; + } + + /// + /// Get's the System's registered file for the corresponding File + /// + /// full file name and path + /// Returns Registered exe for file in Uppercase + public static string GetRegisteredExeForFile(string fileNameAndPath) + { + if (!String.IsNullOrEmpty(fileNameAndPath)) + { + bool bIsValidExe = false; + string strExeOrDllPath = string.Empty; + bool bSuccess = Win32_WrapperFunc.FindExeOrDll(fileNameAndPath, out strExeOrDllPath, out bIsValidExe); + + if (bSuccess && bIsValidExe) + return Path.GetFileName(strExeOrDllPath).ToUpper(); + } + return string.Empty; + } + + /// + /// Useful for finding who is responsible by Shell32 to handle this file + /// + /// full qualifying path to File + /// will contain that path that is found in the registry + /// true if the return value is a valid exe, false if it is a Dll + /// true if a match was found, false otherwise + public static bool FindExeOrDll(string fileNameAndPath, out string strExeOrDllPath, out bool IsValidExe) + { + if (!String.IsNullOrEmpty(fileNameAndPath)) + { + // Try FindExecutable first + StringBuilder retStr = new StringBuilder(); + int ret = (int)Win32Functions.FindExecutable(fileNameAndPath, null, retStr); + strExeOrDllPath = retStr.ToString(); + + // If FindExe Failed, try AssocQueryString instead + if (String.IsNullOrEmpty(strExeOrDllPath)) + { + string Ext = Path.GetExtension(fileNameAndPath); + StringBuilder retStr2 = new StringBuilder(); + uint pcchOut = Win32_Constants.MAX_PATH; + Win32Functions.AssocQueryString(0, AssocStr.Executable, Ext, "open", retStr2, ref pcchOut); + + if (retStr2.Length > 0) + strExeOrDllPath = retStr2.ToString(); + } + + IsValidExe = false; + if (!String.IsNullOrEmpty(strExeOrDllPath)) + { + string Ext = Path.GetExtension(strExeOrDllPath); + IsValidExe = (Ext.ToUpper() == ".EXE"); + return true; + } + } + strExeOrDllPath = string.Empty; + IsValidExe = false; + return false; + } + + /// + /// Uses Shell32 to get the Windows location on this computer + /// + /// path to windows dir on this machine + public static string GetWindowsPath() + { + StringBuilder windowsPath = new StringBuilder(); + Win32Functions.SHGetFolderPath(IntPtr.Zero, (int)CSIDL.CSIDL_WINDOWS, IntPtr.Zero, (int)SHGFP_TYPE.SHGFP_TYPE_CURRENT, windowsPath); + return windowsPath.ToString(); + } + + /// + /// Use this function to set transparency of a layered top level window. + /// This will only work on Windows that are part of your own Process Space. calling this on external windows, + /// outside of your process SetLayeredWindowAttributes() will fail. + /// + /// the window to make or unmake transparent + /// 0 for transparent 255 for totally visible + public static void SetAlphaChannel(IntPtr hWnd, byte alpha) + { + long dwStyle = (long) Win32Functions.GetWindowLong(hWnd, (int) ((int) WindowLong.GWL_EXSTYLE | (int) Win32_Constants.WS_EX_LAYERED)); + long retVal = Win32Functions.SetWindowLong(hWnd, (int) WindowLong.GWL_EXSTYLE, (int) dwStyle); + + if (retVal == 0) + Trace.Write("SetAlphaChannel's SetWindowLong Failed"); + + bool bSuccess = Win32Functions.SetLayeredWindowAttributes(hWnd, (int)Win32Functions.RGB(0, 0, 0), alpha, (uint)(WindowLayerAttributes.LWA_ALPHA)); + if (!bSuccess) + Trace.Write("SetAlphaChannel's SetLayeredWindowAttributes Failed"); + } + + /// + /// Could be useful later - maybe + /// + /// + //public static Rectangle GetAbsoluteClientRect(IntPtr hWnd) + //{ + // //Rectangle windowRect = Win32Functions.GetWindowRect(hWnd); + // //Rectangle clientRect = Win32Functions.GetClientRect(hWnd); + + // //// This gives us the width of the left, right and bottom chrome - we can then determine the top height + // //int chromeWidth = (int)((windowRect.Width - clientRect.Width) / 2); + // //return new Rectangle(new Point(windowRect.X + chromeWidth, windowRect.Y + (windowRect.Height - clientRect.Height - chromeWidth)), clientRect.Size); + //} + + } + + //// + // Win32 Constants + //// + public class Win32_Constants + { + public const ushort KEYEVENTF_KEYUP = 0x0002; + public const int SRCCOPY = 0x00CC0020; + public const int CAPTUREBLT = 0x40000000; + public const int MONITOR_DEFAULTTONEAREST = 0x00000002; + public const int WM_USER = 0x0400; + public const int WS_EX_LAYERED = 0x00080000; + public const int MAX_PATH = 260; + } + + //// + // Win32 Functions + //// + public class Win32Functions + { + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + + public static int LOWORD(int n) + { + return (n & 0xffff); + } + public static int HIWORD(int n) + { + return ((n >> 16) & 0xffff); + } + public static int RGB(int r, int g, int b) + { + int rs = r & 0xffff; + int gs = (g << 8) & 0xffff; + int bs = (b << 16) & 0xffff; + return (rs | gs | bs); + } + + //// + // Shell32 + //// + #region Shell32 + + [DllImport("shell32.dll")] + public static extern IntPtr ShellExecute(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd); + + [DllImport("shell32.dll", SetLastError = true)] + extern public static bool ShellExecuteEx(ref ShellExecuteInfo lpExecInfo); + + [DllImport("shell32.dll")] + extern public static IntPtr FindExecutable(string lfFile, string lpDirectory, [Out] StringBuilder lpResult); + + [DllImport("shell32.dll")] + extern public static long SHGetFolderPath(IntPtr hwndOwner, int nFolder, IntPtr hToken, int dwFlags, [Out] StringBuilder pszPath); + + #endregion + + //// + // User32 + //// + #region User32 + + [DllImport("user32.dll")] + public static extern IntPtr SetFocus(IntPtr hwnd); + + [DllImport("user32.dll")] + public static extern IntPtr GetFocus(); + + [DllImport("user32.dll")] + public static extern IntPtr SetActiveWindow(IntPtr hWnd); + + [DllImport("user32.dll")] + extern public static IntPtr SetParent(IntPtr child, IntPtr newParent); + + [DllImport("user32.dll")] + extern public static long SetWindowLong(IntPtr hWnd, int nIndex, Int32 dwNewLong); + + [DllImport("user32.dll")] + extern public static long GetWindowLong(IntPtr hWnd, int nIndex); + + [DllImport("User32.dll")] + extern public static int SetForegroundWindow(IntPtr hWnd); + + [DllImport("user32.dll")] + extern public static bool SetLayeredWindowAttributes(IntPtr hwnd, Int32 crKey, byte bAlpha, uint dwFlags); + + [DllImport("User32.dll")] + extern public static IntPtr GetForegroundWindow(); + + [DllImport("User32.dll")] + extern public static bool IsWindow(IntPtr hwnd); + + [DllImport("user32.dll")] + extern public static int ShowWindow(IntPtr hwnd, int nCmdShow); + + [DllImport("user32.dll")] + extern public static int GetWindowText(IntPtr hWnd, StringBuilder text, int count); + + [DllImport("user32.dll")] + extern public static bool GetWindowRect(IntPtr hWnd, out RECT rect); + + [DllImport("user32.dll")] + extern public static bool GetClientRect(IntPtr hWnd, out RECT rect); + + [DllImport("User32.dll")] + extern public static bool EnumWindows(Delegate lpEnumFunc, IntPtr lParam); + + [DllImport("User32.dll")] + extern public static int GetWindowThreadProcessId(IntPtr hWnd, ref int lpdwProcessId); + + [DllImport("User32.dll")] + extern public static bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll")] + public static extern uint SendInput(uint nInputs, ref INPUT pInputs, int cbSize); + + [DllImport("User32.dll")] + extern public static int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); + + [DllImport("user32.dll")] + extern public static int GetSystemMetrics(int index); + + [DllImport("user32.dll")] + extern public static bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); + + [DllImport("user32.dll")] + public static extern IntPtr GetDesktopWindow(); + + [DllImport("user32.dll")] + public static extern IntPtr GetDC(IntPtr ptr); + + [DllImport("user32.dll")] + public static extern IntPtr GetWindowDC(IntPtr hWnd); + + [DllImport("user32.dll")] + public static extern IntPtr GetDCEx(IntPtr hWnd, IntPtr hrgnClip, int flags); + + [DllImport("user32.dll")] + public static extern IntPtr ReleaseDC(IntPtr hWnd, IntPtr hDc); + + [DllImport("user32.dll")] + public static extern bool EmptyClipboard(); + + [DllImport("user32.dll")] + public static extern int GetClipboardSequenceNumber(); + + [DllImport("user32.dll")] + public static extern bool GetMonitorInfo(IntPtr hMonitor, ref MONITORINFOEX monitorinfo); + + [DllImport("user32.dll")] + public static extern IntPtr MonitorFromRect(ref RECT rect, int dwFlags); + + #endregion + + //// + // Kernel32 + //// + #region Kernel32 + + [DllImport("kernel32.dll")] + internal static extern IntPtr LoadLibrary(String dllname); + + [DllImport("kernel32.dll")] + internal static extern IntPtr GetProcAddress(IntPtr hModule, String procname); + + [DllImport("kernel32.dll")] + extern public static int GetProcessId(IntPtr hProcess); + + [DllImport("kernel32.dll")] + extern public static IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); + + [DllImport("kernel32.dll")] + extern public static int WaitForSingleObject(IntPtr hHandle, uint dwMilliseconds); + + [DllImport("kernel32.dll")] + extern public static int GetLastError(); + + [DllImport("kernel32.dll")] + // lpEventAttributes should be a ref to a SECURITY_ATTRIBUTES struct, but we only pass in NULL so we can just make it an IntPtr + extern public static IntPtr CreateEvent(IntPtr lpEventAttributes, bool bManualReset, bool bInitialState, [In] StringBuilder lpName); + + [DllImport("kernel32.dll")] + extern public static IntPtr SetEvent(IntPtr hEvent); + + [DllImport("kernel32.dll")] + extern public static bool CloseHandle(IntPtr hHandle); + + [DllImport("kernel32.dll")] + extern public static int GlobalAddAtom([In] StringBuilder lpString); + + [DllImport("kernel32.dll")] + extern public static int GlobalDeleteAtom(int nAtom); + + #endregion + + //// + // Shlwapi + //// + [DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)] + public static extern uint AssocQueryString(AssocF flags, AssocStr str, string pszAssoc, string pszExtra, [Out] StringBuilder pszOut, [In][Out] ref uint pcchOut); + + //// + // Ole32 + //// + [DllImport("ole32.dll")] + public static extern int CreateBindCtx(int reserved, out IBindCtx ppbc); + + //// + // Uxtheme + //// + [DllImport("uxTheme.dll")] + extern public static bool IsAppThemed(); + + //// + // Dwmapi + //// + [DllImport("dwmapi.dll")] + extern public static long DwmIsCompositionEnabled(ref bool pfEnabled); + + //// + // GDI32 + //// + #region GDI32 + + [DllImport("gdi32.dll")] + public static extern IntPtr DeleteDC(IntPtr hDc); + + [DllImport("gdi32.dll")] + public static extern IntPtr DeleteObject(IntPtr hDc); + + [DllImport("gdi32.dll")] + public static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int wDest, int hDest, IntPtr hdcSource, int xSrc, int ySrc, int RasterOp); + + [DllImport("gdi32.dll")] + public static extern IntPtr CreateCompatibleBitmap(IntPtr hdc, int nWidth, int nHeight); + + [DllImport("gdi32.dll")] + public static extern IntPtr CreateCompatibleDC(IntPtr hdc); + + [DllImport("gdi32.dll")] + public static extern IntPtr SelectObject(IntPtr hdc, IntPtr bmp); + + [DllImport("gdi32.dll")] + public static extern IntPtr CreateDC(string lpszDriver, IntPtr passNULL, IntPtr passNULL2, IntPtr passNULL3); + + #endregion + + //// + // Helper .Net Functions + //// + // .net implementation of EnumWindowsProc Callback + public delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam); + + public interface IWindowHandleAccess + { + IntPtr hWnd + { + get; + set; + } + } + + public static IntPtr GetWindowHandle(EnumWindowsProc proc, Context context) where Context : IWindowHandleAccess + { + // Initialize unmanged memory to hold the struct. + IntPtr pContext = Marshal.AllocHGlobal(Marshal.SizeOf(context)); + + try + { + // Copy the struct to unmanaged memory. + Marshal.StructureToPtr(context, pContext, false); + + bool bFound = false; + int numTries = 5; + + while (!bFound && numTries != 0) + { + Win32Functions.EnumWindows(proc, pContext); + + // Marshall context back to managed + context = (Context)Marshal.PtrToStructure(pContext, typeof(Context)); + + if (context.hWnd != IntPtr.Zero) + { + bFound = true; + } + else + { + // Sleep a little and try again + Thread.Sleep(500); + --numTries; + } + } + } + finally + { + Log.ErrorFormat("{0}() - Unknown exception occured!", MethodBase.GetCurrentMethod().Name); + + // Free the unmanaged memory. + Marshal.FreeHGlobal(pContext); + } + + return context.hWnd; + } + + [StructLayout(LayoutKind.Sequential)] + public struct EnumWindowsContext_pid_filename : IWindowHandleAccess + { + public int targetPid; + public string filePath; + private IntPtr _hWnd; + + public IntPtr hWnd + { + get + { + return _hWnd; + } + + set + { + _hWnd = value; + } + } + } + + [StructLayout(LayoutKind.Sequential)] + public struct EnumWindowsContext_filePath : IWindowHandleAccess + { + public string filePath; + private IntPtr _hWnd; + + public IntPtr hWnd + { + get + { + return _hWnd; + } + + set + { + _hWnd = value; + } + } + } + + public static bool EnumWindowProcImpl_filePath(IntPtr hWnd, IntPtr pContext) + { + bool bContinueEnumerating = true; + + // Marshall context back to managed + EnumWindowsContext_filePath context = new EnumWindowsContext_filePath(); + context = (EnumWindowsContext_filePath)Marshal.PtrToStructure(pContext, typeof(EnumWindowsContext_filePath)); + + // Check if filePath is the text in the window title bar + if (IsTitleBar(hWnd, context.filePath)) + { + Log.InfoFormat("{0}() - found!", MethodBase.GetCurrentMethod().Name); + context.hWnd = hWnd; + + // Marshall changed data back to unmanaged + Marshal.StructureToPtr(context, pContext, false); + bContinueEnumerating = false; + } + + return bContinueEnumerating; + } + + public static bool EnumWindowProcImpl_pid_filename(IntPtr hWnd, IntPtr pContext) + { + bool bContinueEnumerating = true; + + int currentPid = 0; + GetWindowThreadProcessId(hWnd, ref currentPid); + + // Marshall context back to managed + EnumWindowsContext_pid_filename context = new EnumWindowsContext_pid_filename(); + context = (EnumWindowsContext_pid_filename)Marshal.PtrToStructure(pContext, typeof(EnumWindowsContext_pid_filename)); + + if (currentPid == context.targetPid) + { + Log.InfoFormat("{0}() - currentpid = {1} vs. targetPid = {2} hwnd = {3}", MethodBase.GetCurrentMethod().Name, currentPid, context.targetPid, hWnd.ToString("X")); + + // Check if fileName is in window title bar + if (IsFilenameInTitleBar(hWnd, context.filePath)) + { + Log.InfoFormat("{0}() - found!", MethodBase.GetCurrentMethod().Name); + context.hWnd = hWnd; + + // Marshall changed data back to unmanaged + Marshal.StructureToPtr(context, pContext, false); + bContinueEnumerating = false; + } + } + + return bContinueEnumerating; + } + + public static bool IsFilenameInTitleBar(IntPtr hWnd, string filePath) + { + bool bFound = false; + int maxTextSize = 256; + + StringBuilder titleBarText = new StringBuilder(maxTextSize); + + if (GetWindowText(hWnd, titleBarText, maxTextSize) > 0) + { + string fileName = Path.GetFileName(filePath); + + if (fileName.Length > 0) + { + if (titleBarText.ToString().ToLower().IndexOf(fileName.ToLower()) != -1) + { + bFound = true; + } + } + } + + return bFound; + } + + public static bool IsTitleBar(IntPtr hWnd, string filePath) + { + bool bFound = false; + int maxTextSize = 256; + + StringBuilder titleBarText = new StringBuilder(maxTextSize); + + if (GetWindowText(hWnd, titleBarText, maxTextSize) > 0) + { + if (filePath.Length > 0) + { + if (titleBarText.ToString().ToLower().CompareTo(filePath.ToLower()) == 0) + { + bFound = true; + } + } + } + + return bFound; + } + + public static string GetProcessName(IntPtr hWnd) + { + int currentPid = 0; + Win32Functions.GetWindowThreadProcessId(hWnd, ref currentPid); + + Process process; + try + { + process = Process.GetProcessById(currentPid); + } + catch (ArgumentException e) + { + // This is thrown when Process.GetProcessById cannot find the process + throw e; + } + + return process.ProcessName; + } + + /// + /// Returns the .Net Process Object that owns the passed in hWnd + /// + /// handle to a Window + /// a .Net Process or throws an error + public static Process GetProcessFromHandle(IntPtr hWnd) + { + try + { + int currentPid = 0; + Win32Functions.GetWindowThreadProcessId(hWnd, ref currentPid); + + Process process; + process = Process.GetProcessById(currentPid); + return process; + } + catch (ArgumentException e) + { + // This is thrown when Process.GetProcessById cannot find the process + throw e; + } + } + + /// + /// Attaches to instance of COM object matching progid + /// and returns an object. Client must cast and know + /// expected type. + /// + public static Object GetCOMObject(string progId) + { + Object app = null; + try + { + app = Marshal.GetActiveObject(progId); + } + catch (SystemException e) + { + string d = e.ToString(); + } + + return app; + } + + public struct RunningObject + { + public string name; + public object o; + } + + /// + /// Use this to Get All Running Objects in the ROT + /// + public static List GetRunningObjects() + { + // Get the table. + var res = new List(); + IBindCtx bc; + + CreateBindCtx(0, out bc); + IRunningObjectTable runningObjectTable; + + bc.GetRunningObjectTable(out runningObjectTable); + IEnumMoniker monikerEnumerator; + runningObjectTable.EnumRunning(out monikerEnumerator); + monikerEnumerator.Reset(); + + // Enumerate and fill our nice dictionary. + IMoniker[] monikers = new IMoniker[1]; + IntPtr numFetched = IntPtr.Zero; + + while (monikerEnumerator.Next(1, monikers, numFetched) == 0) + { + RunningObject running; + monikers[0].GetDisplayName(bc, null, out running.name); + runningObjectTable.GetObject(monikers[0], out running.o); + res.Add(running); + } + return res; + } + + /// + /// Use this to Get A specific type of Object from the ROT + /// + public static List GetRunningObjectsOfType() + { + // Get the table. + var res = new List(); + IBindCtx bc; + + CreateBindCtx(0, out bc); + IRunningObjectTable runningObjectTable; + + bc.GetRunningObjectTable(out runningObjectTable); + IEnumMoniker monikerEnumerator; + runningObjectTable.EnumRunning(out monikerEnumerator); + monikerEnumerator.Reset(); + + // Enumerate and fill our nice dictionary. + IMoniker[] monikers = new IMoniker[1]; + IntPtr numFetched = IntPtr.Zero; + + while (monikerEnumerator.Next(1, monikers, numFetched) == 0) + { + object o; + runningObjectTable.GetObject(monikers[0], out o); + + if (o is T) + { + res.Add((T) o); + } + o = null; + } + return res; + } + + } +} diff --git a/Platform/app.config b/Platform/app.config new file mode 100644 index 0000000..b7db281 --- /dev/null +++ b/Platform/app.config @@ -0,0 +1,3 @@ + + + diff --git a/Satellite/GUI.Designer.cs b/Satellite/GUI.Designer.cs new file mode 100644 index 0000000..290695e --- /dev/null +++ b/Satellite/GUI.Designer.cs @@ -0,0 +1,72 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.Satellite { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class GUI { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal GUI() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Foo.Satellite.GUI", typeof(GUI).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Hello, My Name is Doris - JAJAJA. + /// + internal static string TEST_STRING { + get { + return ResourceManager.GetString("TEST_STRING", resourceCulture); + } + } + } +} diff --git a/Satellite/GUI.de.resx b/Satellite/GUI.de.resx new file mode 100644 index 0000000..85c9090 --- /dev/null +++ b/Satellite/GUI.de.resx @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.3500.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/Satellite/GUI.en.resx b/Satellite/GUI.en.resx new file mode 100644 index 0000000..5117373 --- /dev/null +++ b/Satellite/GUI.en.resx @@ -0,0 +1,140 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Artifact Wall + Group Header in 'Settings' for Artifact Wall + + + Workspace Selector + Group Header in 'Settings' for Workspace Selector + + + About Us + Tab Header for 'About Us' Tab + + + Help + Tab Header for 'Help' Tab + + + Settings + Tab Header for 'Settings' Tab + + \ No newline at end of file diff --git a/Satellite/GUI.resx b/Satellite/GUI.resx new file mode 100644 index 0000000..0e0012c --- /dev/null +++ b/Satellite/GUI.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Hello, My Name is Doris - JAJAJA + What is going on? + + \ No newline at end of file diff --git a/Satellite/MyKeyFile.SNK b/Satellite/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/Satellite/Properties/AssemblyInfo.cs b/Satellite/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..a6fb99a --- /dev/null +++ b/Satellite/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Satellite")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Satellite")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b241af6c-dd72-4c16-b1e1-b009c61e7641")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Satellite/Satellite.csproj b/Satellite/Satellite.csproj new file mode 100644 index 0000000..0e396c8 --- /dev/null +++ b/Satellite/Satellite.csproj @@ -0,0 +1,69 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {6DC93F91-D6D4-4C35-8A83-C180E8E22E16} + Library + Properties + Foo.Satellite + Satellite + v3.5 + 512 + true + MyKeyFile.SNK + + + true + full + false + ..\Target\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\Target\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + + + + True + True + GUI.resx + + + + + + + + ResXFileCodeGenerator + GUI.Designer.cs + + + + + + + + \ No newline at end of file diff --git a/Settings/AppConfig.xml b/Settings/AppConfig.xml new file mode 100644 index 0000000..80a6979 --- /dev/null +++ b/Settings/AppConfig.xml @@ -0,0 +1,29 @@ + + + + + IEXPLORE.EXE + WINWORD.EXE + EXCEL.EXE + POWERPNT.EXE + MSPUB.EXE + VISIO.EXE + MSACCESS.EXE + ACROBAT.EXE + NOTEPAD.EXE + PAINT.EXE + WORDPAD.EXE + HH.EXE + + + + + + + + + 3 + + + + \ No newline at end of file diff --git a/Settings/ButtonThemeSetting.cs b/Settings/ButtonThemeSetting.cs new file mode 100644 index 0000000..3619852 --- /dev/null +++ b/Settings/ButtonThemeSetting.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.IO; +using System.Runtime.InteropServices; + +namespace Foo.Settings +{ + + /// + /// Use this to specificy the names of each themed button + /// + [ComVisible(false)] + public static class ButtonNames + { + public const string BUTTON_UP = "ButtonUp.ico"; + public const string BUTTON_DOWN = "ButtonDown.ico"; + public const string TOGGLE_UP = "ToggleUp.ico"; + } + /// + /// Button Location Interface for COM + /// + [Guid("CFE7FDB8-E3F0-45aa-9935-C9A8502FF7DF")] + [InterfaceType(ComInterfaceType.InterfaceIsDual)] + [ComVisible(true)] + public interface IButtonIconLocation + { + string GetBUTTON_UP(); + string GetBUTTON_DOWN(); + string GetTOGGLE_UP(); + } + /// + /// Button Theme Settings COM + /// + [Guid("F82358CD-8521-4d03-AFF9-352491E9A10E")] + [InterfaceType(ComInterfaceType.InterfaceIsDual)] + [ComVisible(true)] + public interface IButtonThemeSetting + { + int Top(); + int Right(); + int Height(); + int Width(); + } + /// + /// Parent Class for all the Button Shared Code - *MAIN class for everthing basically* + /// + [ComVisible(false)] + public class ButtonSharedCode : IButtonThemeSetting, IButtonIconLocation + { + private string m_RelativePath = ""; + private string m_AssemblyPath = ""; + private int m_nTop = 0; + private int m_nRight = 0; + private int m_nHeight = 0; + private int m_nWidth = 0; + + /// + /// Constructor for SharedButtonCode + /// + /// relative location (folder) inside running application directory + /// Theme specific Top location for Button + /// Theme specific Right location for Button + /// Theme specific Height of Button + /// Theme specific Width of Button + public ButtonSharedCode(string strRelativeLoc, int nTop, int nRight, int nHeight, int nWidth) + { + // Theme settings are stored in the Platform Path + //m_AssemblyPath = Platform.InstallationSpec.PlatformPath; + m_AssemblyPath = Platform.InstallationSpec.InstallPath; + + // Debug path + //m_AssemblyPath = @"C:\_ROOT_\Ooganizer\Ooganizer_1.0\Target\debug\Platform"; + + m_RelativePath = strRelativeLoc; + + m_nTop = nTop; + m_nRight = nRight; + m_nHeight = nHeight; + m_nWidth = nWidth; + } + + //// + // IButtonThemeSetting + //// + public int Top() { return m_nTop; } + public int Right() { return m_nRight; } + public int Height() { return m_nHeight; } + public int Width() { return m_nWidth; } + + //// + // IButtonLocation + //// + public string GetBUTTON_UP() { return (m_AssemblyPath + "\\" + m_RelativePath + "\\" + ButtonNames.BUTTON_UP); } + public string GetBUTTON_DOWN() { return (m_AssemblyPath + "\\" + m_RelativePath + "\\" + ButtonNames.BUTTON_DOWN); } + public string GetTOGGLE_UP() { return (m_AssemblyPath + "\\" + m_RelativePath + "\\" + ButtonNames.TOGGLE_UP); } + } + /// + /// Classic Button Theme Setting + /// + [ComVisible(false)] + public class ButtonClassicTheme : ButtonSharedCode + { + public ButtonClassicTheme() : base("Resources\\Themes\\ClassicTheme", 0, 0, 0, 0) { } + } + /// + /// XP Button Theme Setting + /// + [ComVisible(false)] + public class ButtonXPTheme : ButtonSharedCode + { + public ButtonXPTheme() : base("Resources\\Themes\\XPTheme", 1, 126, 16, 26) { } + } + /// + /// Aero Button Theme Setting + /// + [ComVisible(false)] + public class ButtonAeroTheme : ButtonSharedCode + { + //public ButtonAeroTheme() : base("Resources\\AeroTheme", 0, 129, 18, 26) { } + public ButtonAeroTheme() : base("Resources\\Themes\\AeroTheme", 1, 126, 16, 26) { } + } + /// + /// Vista No Aero Theme Setting + /// + [ComVisible(false)] + public class ButtonVistaNoAeroTheme : ButtonSharedCode + { + public ButtonVistaNoAeroTheme() : base("Resources\\Themes\\VistaNoAeroTheme", 0, 0, 15, 28) { } + } + /// + /// This class abstracts away all the settings we need for + /// ButtonHook to deal with themes and Buttons. (we may consider in the future + /// to use this class to retrieve custom settings) + /// ~this class is accessible via COM for the W32Button to work + /// + [Guid("9EEC54A0-77F3-4dcf-8C74-B6720437C59E")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ProgId("Ooganizer.ButtonThemeNIconSettingsCCW")] + [ComVisible(true)] + public class ButtonThemeNIconSettingsCCW + { + private object m_oButtonThemeObject = null; + + public ButtonThemeNIconSettingsCCW() + { + switch (Foo.Platform.Env.Theme) + { + case Foo.Platform.Env.Themes.Classic: + m_oButtonThemeObject = new ButtonClassicTheme(); + break; + case Foo.Platform.Env.Themes.AeroTheme: + m_oButtonThemeObject = new ButtonAeroTheme(); + break; + case Foo.Platform.Env.Themes.VistaNoAero: + m_oButtonThemeObject = new ButtonVistaNoAeroTheme(); + break; + case Foo.Platform.Env.Themes.XPtheme: + m_oButtonThemeObject = new ButtonXPTheme(); + break; + } + } + public IButtonThemeSetting GetIButtonThemeInterface() { return (IButtonThemeSetting)m_oButtonThemeObject; } + public IButtonIconLocation GetIButtonIconLocation() { return (IButtonIconLocation)m_oButtonThemeObject; } + } +} diff --git a/Settings/MyKeyFile.SNK b/Settings/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/Settings/Properties/AssemblyInfo.cs b/Settings/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..ac455b6 --- /dev/null +++ b/Settings/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Settings")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("Ooganizer")] +[assembly: AssemblyProduct("Settings")] +[assembly: AssemblyCopyright("Copyright © Ooganizer 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a28ce1f1-2b84-42ee-abd8-8230ae6a186c")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Settings/Properties/Resources.Designer.cs b/Settings/Properties/Resources.Designer.cs new file mode 100644 index 0000000..e3af3f2 --- /dev/null +++ b/Settings/Properties/Resources.Designer.cs @@ -0,0 +1,78 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.Platform.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Foo.Platform.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to <?xml version="1.0" encoding="utf-8"?> + ///<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.ooganizer.com"> + /// <ButtonHook> + /// <AllowedProcessNames> + /// <ProcessName strategy="BrowserResolve" prms="" wcinc="*" wtxtinc="*" versions="6.*;7.*;8.*" bhloc="normal">IEXPLORE.EXE</ProcessName> + /// <ProcessName strategy="FHWinResolve" prms="TopOnly" wcinc="*" wtxtinc="*" versions="11.*;12.*" bhloc="normal">WINWORD.EXE</ProcessName> + /// <P [rest of string was truncated]";. + /// + internal static string AppConfigXML { + get { + return ResourceManager.GetString("AppConfigXML", resourceCulture); + } + } + } +} diff --git a/Settings/Properties/Resources.resx b/Settings/Properties/Resources.resx new file mode 100644 index 0000000..7dbac60 --- /dev/null +++ b/Settings/Properties/Resources.resx @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + ..\AppConfig.xml;System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;Windows-1252 + + \ No newline at end of file diff --git a/Settings/Properties/Settings.Designer.cs b/Settings/Properties/Settings.Designer.cs new file mode 100644 index 0000000..fe8b1ba --- /dev/null +++ b/Settings/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.4200 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Foo.Platform.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/Settings/Properties/Settings.settings b/Settings/Properties/Settings.settings new file mode 100644 index 0000000..15034e7 --- /dev/null +++ b/Settings/Properties/Settings.settings @@ -0,0 +1,6 @@ + + + + + + diff --git a/Settings/RegPathsConfig.bat b/Settings/RegPathsConfig.bat new file mode 100644 index 0000000..02fe716 --- /dev/null +++ b/Settings/RegPathsConfig.bat @@ -0,0 +1,23 @@ +@rem //-- Author: Daniel Romischer (daniel@romischer.com) +@echo off + +goto :start + +:Usage +echo Use this File to Register Ooganizer Paths in the registry +echo. +echo Syntax: RegPathsConfig "[main ooganizer path]" +echo. +echo Example: RegPathsConfig "C:\Program Files\Ooganizer" +echo. +goto :Exit + +:start +if (%1)==() Goto :Usage + +REG ADD HKLM\Software\Ooganizer /v InstallPath /d %1\ /f +REG ADD HKLM\Software\Ooganizer /v LogPath /d %1\Platform\Logs\ /f +REG ADD HKLM\Software\Ooganizer /v PlatformPath /d %1\Platform\ /f +REG ADD HKLM\Software\Ooganizer /v ServerPath /d %1\Server\ /f + +:Exit \ No newline at end of file diff --git a/Settings/Settings.csproj b/Settings/Settings.csproj new file mode 100644 index 0000000..a716858 --- /dev/null +++ b/Settings/Settings.csproj @@ -0,0 +1,107 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {48D75C4F-2749-48BB-9386-721E0E94C144} + Library + Properties + Foo.Platform + Settings + v2.0 + 512 + + + + + + + + + true + MyKeyFile.SNK + + + + + true + full + false + ..\Target\Debug\ + DEBUG;TRACE + prompt + 4 + false + + + pdbonly + true + ..\Target\Release\ + TRACE + prompt + 4 + + + + False + ..\Components\log4net.dll + + + + + + + + + True + True + Resources.resx + + + True + True + Settings.settings + + + + + + + + + + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Platform + + + + + + $(FrameworkDir)\regasm.exe "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /unregister +$(FrameworkDir)\regasm.exe "$(SolutionDir)target\$(ConfigurationName)\$(TargetFileName)" /tlb:$(TargetName).tlb /codebase + "$(ProjectDir)RegPathsConfig.bat" "$(SolutionDir)target\$(ConfigurationName)" + + \ No newline at end of file diff --git a/Settings/SettingsAcc.cs b/Settings/SettingsAcc.cs new file mode 100644 index 0000000..8cbbc99 --- /dev/null +++ b/Settings/SettingsAcc.cs @@ -0,0 +1,459 @@ +using System; +using System.Collections; +using System.Runtime.InteropServices; +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using System.IO; +using System.Reflection; +using Foo.Platform; +using System.Diagnostics; + +namespace Foo.Settings +{ + [Guid("6FBB970D-0825-471e-9839-448FB2B6A842")] + [InterfaceType(ComInterfaceType.InterfaceIsDual)] + [ComVisible(true)] + public interface IOoganizerSettings + { + // reading in configuration data + configuration ReadConfigXMLFile(); + + // write custom configuration data to default location + void WriteConfigXMLFileDefaultLoc(configuration config); + } + + /// + /// Serializable Xml Object used to store all Configuration data - place any new class objects in here + /// + [Guid("EA2D77C2-AA17-4142-8FA7-7D6FA35316F4")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + [XmlRoot("configuration", Namespace = "http://www.ooganizer.com", IsNullable = false)] + public class configuration + { + // Member Tags <> + public ButtonHookSettings ButtonHook = null; + + /// + /// configuration - Constructor + /// + public configuration() + { + ButtonHook = new ButtonHookSettings(); + } + } + + /// + /// Serializable Xml Object used to store ButtonHookSettings + /// + [Guid("2C055265-715A-4d10-B744-ADCE796BED1C")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + [XmlRoot("ButtonHookSettings", Namespace = "http://www.ooganizer.com", IsNullable = false)] + public class ButtonHookSettings + { + // Member Tags <> + public AllowedProcessNamesW AllowedProcessNames = null; + public AllowedWindowTitlesW AllowedWindowTitles = null; + public AllowedWindowClassesW AllowedWindowClasses = null; + public LoggingSettings LogSettings = null; + + /// + /// AllowedProcessNames - (Wrapper) around ArrayList to work with COM and XML + /// + [Guid("06403D5A-E309-42d3-B639-1F9DB99880A4")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class AllowedProcessNamesW + { + private ArrayList m_ArrayList; + public AllowedProcessNamesW() + { + m_ArrayList = new ArrayList(); + } + + [XmlElement("ProcessName")] + public ProcessName[] ProcessNames + { + get + { + ProcessName[] processNames = new ProcessName[m_ArrayList.Count]; + m_ArrayList.CopyTo(processNames); + return processNames; + } + set + { + if (value == null) return; + ProcessName[] processNames = (ProcessName[])value; + m_ArrayList.Clear(); + foreach (ProcessName processName in processNames) + m_ArrayList.Add(processName); + } + } + + public int AddProcessName(ProcessName processName) + { + return m_ArrayList.Add(processName); + } + } + + [Guid("EC4E542F-2877-4bb4-8FEF-30F1A1C1B53B")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class ProcessName + { + public ProcessName() + { + this.CustomBHTop = 0; + this.CustomBHRight = 0; + } + + public ProcessName(string ProcessExe, string Resolver, string ResolverPrms, string Launcher, string Closer, string ShowHider, string Versions, int CustomBHTop, int CustomBHRight) + { + this._ProcessExe = ProcessExe; + this.Resolver = Resolver; + this.ResolverPrms = ResolverPrms; + this.Launcher = Launcher; + this.Closer = Closer; + this.ShowHider = ShowHider; + this.Versions = Versions; + this.CustomBHTop = CustomBHTop; + this.CustomBHRight = CustomBHRight; + } + + private string _ProcessExe; + [XmlText] + public string ProcessExe + { + get + { + if (!String.IsNullOrEmpty(_ProcessExe)) + return _ProcessExe.ToUpper(); + else + return String.Empty; + } + set + { + _ProcessExe = value; + } + } + + [XmlAttribute("Resolver")] + public string Resolver; + + [XmlAttribute("ResolverPrms")] + public string ResolverPrms; + + [XmlAttribute("Launcher")] + public string Launcher; + + [XmlAttribute("Closer")] + public string Closer; + + [XmlAttribute("ShowHider")] + public string ShowHider; + + [XmlAttribute("Versions")] + public string Versions; + + [XmlAttribute("CustomBHTop")] + public int CustomBHTop; + + [XmlAttribute("CustomBHRight")] + public int CustomBHRight; + } + + /// + /// AllowedWindowTitles - (Wrapper) around ArrayList to work with COM and XML + /// + [Guid("5B9CC560-9E53-4ae2-8701-E60F99A9A80D")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class AllowedWindowTitlesW + { + private ArrayList m_ArrayList; + public AllowedWindowTitlesW() + { + m_ArrayList = new ArrayList(); + m_ArrayList.Add(""); + } + [XmlElement("WindowTitle")] + public string[] WindowTitle + { + get + { + string[] windowTitles = new string[m_ArrayList.Count]; + m_ArrayList.CopyTo(windowTitles); + return windowTitles; + } + set + { + if (value == null) return; + string[] windowTitles = (string[])value; + m_ArrayList.Clear(); + foreach (string windowTitle in windowTitles) + m_ArrayList.Add(windowTitle); + } + } + } + + /// + /// AllowedWindowClasses - (Wrapper) around ArrayList to work with COM and XML + /// + [Guid("FE3ECBC4-9082-43b5-8274-7DC3A4FB4855")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class AllowedWindowClassesW + { + private ArrayList m_ArrayList; + public AllowedWindowClassesW() + { + m_ArrayList = new ArrayList(); + m_ArrayList.Add(""); + } + + [XmlElement("WindowClass")] + public string[] WindowClass + { + get + { + string[] windowClasses = new string[m_ArrayList.Count]; + m_ArrayList.CopyTo(windowClasses); + return windowClasses; + } + set + { + if (value == null) return; + string[] windowClasses = (string[])value; + m_ArrayList.Clear(); + foreach (string windowClass in windowClasses) + m_ArrayList.Add(windowClass); + } + } + } + + /// + /// LoggingSettings = Set Log Settings (Location & Detail) for ButtonHook + /// + [Guid("A5A6EBA5-DC51-4bba-B7DC-0202153F57DF")] + [ClassInterface(ClassInterfaceType.AutoDual)] + [ComVisible(true)] + public class LoggingSettings + { + public uint LoggingDetail; + + private string _LogPath; + public string LogPath + { + get + { + if (!String.IsNullOrEmpty(_LogPath)) + return Platform.Env.GetLogDirectory(); + else + return _LogPath; + } + set + { + try + { + if (Directory.Exists(value)) + _LogPath = value; + } + catch(Exception){} + } + } + + public LoggingSettings() + { + _LogPath = String.Empty; + LoggingDetail = (int)_LoggingDetail.LOGGING_NONE; + } + + // same enum Definition in ButtonHook + public enum _LoggingDetail { LOGGING_NONE = 0, LOGGING_LOW = 1, LOGGING_MEDIUM = 2, LOGGING_HIGH = 3}; + } + + /// + /// ButtonHookSettings - Constructor + /// + public ButtonHookSettings() + { + AllowedProcessNames = new AllowedProcessNamesW(); + AllowedWindowTitles = new AllowedWindowTitlesW(); + AllowedWindowClasses = new AllowedWindowClassesW(); + LogSettings = new LoggingSettings(); + } + } + + [Guid("80adff74-7124-42e6-ac2c-e19f51a47432")] + [ClassInterface(ClassInterfaceType.None)] + [ProgId("Ooganizer.SettingsAcc")] + [ComVisible(true)] + public class OoganizerSettingsAcc : IOoganizerSettings + { + private XmlSerializer m_ConfigSerializer = null; + public const string DEFAULT_CONFIG_XML_FILE_NAME = "AppConfig.xml"; + private string m_AssemblyLocation = "";// location of running assembly + private configuration m_Configuration; // holds the latest configuration read in or written out, + // for easy access to the configuration + + /// + /// Construcs the SettingsAccessor Object, Responsible for + /// interfacing with the App.Config file + /// + public OoganizerSettingsAcc() + { + m_ConfigSerializer = new XmlSerializer(typeof(configuration)); + + if (m_ConfigSerializer == null) + throw new OutOfMemoryException(); + + // The location of this assembly is in the Platform Directory + m_AssemblyLocation = Platform.InstallationSpec.InstallPath; + } + + #region IOoganizerSettings + + /// + /// Reads in the Config File from the Resource. + /// + /// the configuration object + public configuration ReadConfigXMLFile() + { + string strFileNameWithPath = m_AssemblyLocation + '\\' + DEFAULT_CONFIG_XML_FILE_NAME; + + // If a physical xml file exists in the current directory (allow it to overwrite our settings) + if (File.Exists(strFileNameWithPath + '\\' + DEFAULT_CONFIG_XML_FILE_NAME)) + { + return ReadConfigXMLFile(strFileNameWithPath, false); + } + else + { + // Else force reading of the Resource + return ReadConfigXMLFile(strFileNameWithPath, true); + } + } + + /// + /// Writes the specified configruation to the default location and configuration file + /// + /// configuration object to write out + public void WriteConfigXMLFileDefaultLoc(configuration config) + { + string strFileNameWithPath = m_AssemblyLocation + '\\' + DEFAULT_CONFIG_XML_FILE_NAME; + WriteConfigXMLFile(strFileNameWithPath, config); + } + + #endregion + + #region XML Writer Functions - useful for * Development and Debugging * + + /// + /// Writes the specified configuration to the specified configuration file + /// + /// absolute path to file + /// configuration object to write out + public void WriteConfigXMLFile(string strFileNameWithPath, configuration config) + { + try + { + if (!Directory.Exists(Path.GetDirectoryName(strFileNameWithPath))) + { + Log.Error(string.Format("{0}() - Directory for {1} does not exist", MethodBase.GetCurrentMethod().Name, strFileNameWithPath)); + return; + } + + TextWriter writer = new StreamWriter(strFileNameWithPath); + m_ConfigSerializer.Serialize(writer, config); + m_Configuration = config; + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + return; + } + } + + /// + /// Use this to write a blank xml config file that you can then use + /// to store your configuration + /// + /// absolute path to file + public void WriteBlankConfigXMLFile(string strFileNameWithPath) + { + try + { + if (!Directory.Exists(Path.GetDirectoryName(strFileNameWithPath))) + { + Log.Error(string.Format("{0}() - Directory for {1} does not exist", MethodBase.GetCurrentMethod().Name, strFileNameWithPath)); + return; + } + + TextWriter writer = new StreamWriter(strFileNameWithPath); + configuration settings = new configuration(); + m_ConfigSerializer.Serialize(writer, settings); + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + return; + } + } + + #endregion + + #region Main ReadConfig Function - Does most of the work + + /// + /// Reads in the config file from the passed in location or from the Resource + /// + /// absolute path to file (not used when bReadFromResource is true) + /// true to read Resource XML, false to read from passed in strFileNameWithPath + /// + private configuration ReadConfigXMLFile(string strFileNameWithPath, bool bReadFromResource) + { + const string SETTING_XML_RESOURCE_NAME = "Foo.Platform.AppConfig.xml"; + try + { + + if (bReadFromResource) + { + Assembly assembly = Assembly.GetExecutingAssembly(); + + // * Debugging Only * Make sure resource Name exists + #if DEBUG + string[] resourceNames = Assembly.GetExecutingAssembly().GetManifestResourceNames(); + bool bFound = false; + foreach (string resourceName in resourceNames) + { + if (resourceName == SETTING_XML_RESOURCE_NAME) + bFound = true; + } + Debug.Assert(bFound); + #endif + + TextReader reader = new StreamReader(assembly.GetManifestResourceStream(SETTING_XML_RESOURCE_NAME)); + m_Configuration = (configuration)m_ConfigSerializer.Deserialize(reader); + return m_Configuration; + } + else + { + TextReader reader = new StreamReader(strFileNameWithPath); + m_Configuration = (configuration)m_ConfigSerializer.Deserialize(reader); + return m_Configuration; + } + } + catch (Exception e) + { + Log.Error(string.Format("{0}() - error thrown", MethodBase.GetCurrentMethod().Name), e); + throw (new Exception(e.Message)); + } + } + + #endregion + + // Declare the Log4net Variable + private static log4net.ILog Log = Logger.GetLog4NetInterface(MethodBase.GetCurrentMethod().DeclaringType); + } +} diff --git a/Settings/app.config b/Settings/app.config new file mode 100644 index 0000000..b7db281 --- /dev/null +++ b/Settings/app.config @@ -0,0 +1,3 @@ + + + diff --git a/WorkspaceMgr/Closers/Closer_Generic.cs b/WorkspaceMgr/Closers/Closer_Generic.cs new file mode 100644 index 0000000..25c5a04 --- /dev/null +++ b/WorkspaceMgr/Closers/Closer_Generic.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.Platform.Win32; + +namespace Foo.WorkspaceMgr.Closers +{ + internal class Closer_Generic : IClose + { + #region IClose Members + + /// + /// Sends a WM_QUERYENDSESSION to the Window that the Artifact Belongs To + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IQueryClose(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + // To Do: Must get hWnd From RAT + IntPtr hWnd = IntPtr.Zero; + if (Win32Functions.SendMessage(hWnd, (int)WindowMessage.WM_QUERYENDSESSION, IntPtr.Zero, IntPtr.Zero) != 0) + { + return FuncDepBoolType.Success; + } + else + { + return FuncDepBoolType.Failed; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + /// + /// Sends a WM_Close to the Window that the Artifact Belongs To + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IClose(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + // To Do: Must get hWnd From RAT + IntPtr hWnd = IntPtr.Zero; + if (Win32Functions.SendMessage(hWnd, (int)WindowMessage.WM_CLOSE, IntPtr.Zero, IntPtr.Zero) == 0) + { + return FuncDepBoolType.Success; + } + else + { + return FuncDepBoolType.Failed; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + } +} diff --git a/WorkspaceMgr/Closers/Closer_IE.cs b/WorkspaceMgr/Closers/Closer_IE.cs new file mode 100644 index 0000000..28738d0 --- /dev/null +++ b/WorkspaceMgr/Closers/Closer_IE.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.Platform.Win32; + +namespace Foo.WorkspaceMgr.Closers +{ + internal class Closer_IE : IClose + { + #region IClose Members + + /// + /// + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IQueryClose(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + // To Do: Must get hWnd From RAT + //IntPtr hWnd = IntPtr.Zero; + //if (Win32Functions.SendMessage(hWnd, (int)WindowMessage.WM_QUERYENDSESSION, IntPtr.Zero, IntPtr.Zero) != 0) + //{ + // return FuncDepBoolType.Success; + //} + //else + //{ + // return FuncDepBoolType.Failed; + //} + } + return FuncDepBoolType.ParametersInvalid; + } + + /// + /// Sends a WM_Close to the Window that the Artifact Belongs To + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IClose(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + // To Do: Must get hWnd From RAT + //IntPtr hWnd = IntPtr.Zero; + //if (Win32Functions.SendMessage(hWnd, (int)WindowMessage.WM_CLOSE, IntPtr.Zero, IntPtr.Zero) == 0) + //{ + // return FuncDepBoolType.Success; + //} + //else + //{ + // return FuncDepBoolType.Failed; + //} + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + } +} diff --git a/WorkspaceMgr/Closers/Closer_Office.cs b/WorkspaceMgr/Closers/Closer_Office.cs new file mode 100644 index 0000000..a623af3 --- /dev/null +++ b/WorkspaceMgr/Closers/Closer_Office.cs @@ -0,0 +1,625 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; +using System.Reflection; + +using Foo.Platform; +using Foo.Platform.Win32; +using System.Diagnostics; +using System.Runtime.InteropServices; + +//// +// Ignore 'Ambiguity' warning message, seems like no way around those +//// +#pragma warning disable 0467 + +namespace Foo.WorkspaceMgr.Closers +{ + class Closer_Office : IClose + { + + #region IClose Members + + /// + /// Dispatches the QueryClose Request to the Proper Office Closer + /// + /// + /// + public FuncDepBoolType IQueryClose(string strArtifactLocation) + { + switch (Win32_WrapperFunc.GetRegisteredExeForFile(strArtifactLocation)) + { + case "WINWORD.EXE": + return QueryClose_MSWord(strArtifactLocation); + + case "EXCEL.EXE": + return QueryClose_MSExcel(strArtifactLocation); + + case "POWERPNT.EXE": + return QueryClose_MSPowerPoint(strArtifactLocation); + + case "MSPUB.EXE": + return QueryClose_MSPublisher(strArtifactLocation); + + case "VISIO.EXE": + return QueryClose_MSVisio(strArtifactLocation); + + case "MSACCESS.EXE": + return QueryClose_MSAccess(strArtifactLocation); + } + return FuncDepBoolType.FunctionallityNotSupported; + } + + /// + /// Dispatches the Close Request to the Proper Office Closer + /// + /// + /// + public FuncDepBoolType IClose(string strArtifactLocation) + { + switch (Win32_WrapperFunc.GetRegisteredExeForFile(strArtifactLocation)) + { + case "WINWORD.EXE": + return Close_MSWord(strArtifactLocation); + + case "EXCEL.EXE": + return Close_MSExcel(strArtifactLocation); + + case "POWERPNT.EXE": + return Close_MSPowerPoint(strArtifactLocation); + + case "MSPUB.EXE": + return Close_MSPublisher(strArtifactLocation); + + case "VISIO.EXE": + return Close_MSVisio(strArtifactLocation); + + case "MSACCESS.EXE": + return Close_MSAccess(strArtifactLocation); + } + return FuncDepBoolType.FunctionallityNotSupported; + } + + #endregion + + #region Microsoft Word IClose Members + + public const string Word_ProgId = "Word.Application"; + + /// + /// To Do : Test This - Let's us know if the user has unsaved data + /// + /// + /// + public FuncDepBoolType QueryClose_MSWord(string strArtifactLocation) + { + try + { + // Microsoft.Office.Interop.Word.Application app = null; + // app = Win32Functions.GetCOMObject(Word_ProgId) as Microsoft.Office.Interop.Word.Application; + var RunningWordDocuments = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (doc.Saved) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + } + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + + //**** Another Way Stored here for Later **** + // may be this is helpful.. + //using ComTypes = System.Runtime.InteropServices.ComTypes; + //ComTypes.IPersistFile persistFile = (ComTypes.IPersistFile)document; + //Checks an object for changes since it was last saved to its current file. + //if (persistFile.IsDirty) + //{ + //do your stuff + //} + return FuncDepBoolType.Failed; + } + + /// + /// *** Technically ** Here we want to close the Word Document (Not Prompt the user at all) + /// **** we could close it with a WM_CLOSE or WM_SCLOSE or with the DOM. ~for now it's the + /// DOM, however more testing to be done here + /// + /// + /// + public FuncDepBoolType Close_MSWord(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningWordDocuments = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Found the document to close * Close it Without Prompting * + object saveOption = Microsoft.Office.Interop.Word.WdSaveOptions.wdSaveChanges; + object originalFormat = Microsoft.Office.Interop.Word.WdOriginalFormat.wdOriginalDocumentFormat; + object routeDocument = false; + var app = doc.Application; + + // Let's get the Window that belongs to this document + Microsoft.Office.Interop.Word.Window docWindow = null; + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + { + docWindow = window; + } + } + + //Object missing = Missing.Value; + doc.Close(ref saveOption, ref originalFormat, ref routeDocument); + Marshal.FinalReleaseComObject(doc); // force clean-up + + // Close the Window + if (docWindow != null) + docWindow.Close(ref saveOption, ref routeDocument); + + // Close Word if this is the Last Document Instance + if (app.Documents.Count == 0) + { + app.Quit(ref saveOption, ref originalFormat, ref routeDocument); + Marshal.FinalReleaseComObject(app); // force clean-up, closes Process for sure + } + + return FuncDepBoolType.Success; + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + #region Microsoft Excel IClose Members + + public const string Excel_ProgId = "Excel.Application"; + + /// + /// To Do : Test This - Let's us know if the user has unsaved data + /// + /// + /// + public FuncDepBoolType QueryClose_MSExcel(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + var RunningExcelWorkbooks = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if(book.Saved) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + } + return FuncDepBoolType.ArtifactLocationUnavailable; + } + return FuncDepBoolType.ParametersInvalid; + } + + /// + /// *** Technically ** Here we want to close the Excel Workbook (Not Prompt the user at all) + /// **** we could close it with a WM_CLOSE or WM_SCLOSE or with the DOM. ~for now it's the + /// DOM, however more testing to be done here + /// + /// + /// + public FuncDepBoolType Close_MSExcel(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningExcelWorkbooks = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // In case there is a running rogue excel process left open, + // we can always force it to close by closing the process + // int hWnd = app.Hwnd; + // Process process = Win32Functions.GetProcessFromHandle((IntPtr) hWnd); + var app = book.Application; + + // Close the Workbook + book.Close(true, strArtifactLocation, false); + Marshal.FinalReleaseComObject(book); // force clean-up + + // Close Excel if this is the last Workbook + if (app.Workbooks.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up, should clean up excel process + //process.Close(); + } + return FuncDepBoolType.Success; + } + } + return FuncDepBoolType.ArtifactLocationUnavailable; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + #region Microsoft PowerPoint IClose Members + + public const string PowerPoint_ProgId = "PowerPoint.Application"; + + /// + /// To Do : Test This - Let's us know if the user has unsaved data + /// + /// + /// + public FuncDepBoolType QueryClose_MSPowerPoint(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + //Microsoft.Office.Interop.PowerPoint.Application app = null; + //app = Win32Functions.GetCOMObject(PowerPoint_ProgId) as Microsoft.Office.Interop.PowerPoint.Application; + //foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in app.Presentations) + + var RunningPowerPoints = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + switch (presentation.Saved) + { + case Microsoft.Office.Core.MsoTriState.msoTrue: + return FuncDepBoolType.Success; + + case Microsoft.Office.Core.MsoTriState.msoFalse: + return FuncDepBoolType.Failed; + } + } + } + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + /// + /// *** Technically ** Here we want to close the Word Document (Not Prompt the user at all) + /// **** we could close it with a WM_CLOSE or WM_SCLOSE or with the DOM. ~for now it's the + /// DOM, however more testing to be done here + /// + /// + /// + public FuncDepBoolType Close_MSPowerPoint(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + //Microsoft.Office.Interop.PowerPoint.Application app = null; + //app = Win32Functions.GetCOMObject(PowerPoint_ProgId) as Microsoft.Office.Interop.PowerPoint.Application; + //foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in app.Presentations) + + var RunningPowerPoints = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = presentation.Application; + + // Save this Presentation + presentation.Save(); + + // Close this Presentation + presentation.Close(); + + Marshal.FinalReleaseComObject(presentation); // force clean-up + + // Close PowerPoint if there are no more Presentations + if (app.Presentations.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up, kill application for sure + } + + return FuncDepBoolType.Success; + } + } + return FuncDepBoolType.Failed; + + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + #region Microsoft Publisher IClose Members + + public const string Publisher_ProgId = "Publisher.Application"; + + /// + /// To Do : Test This - Let's us know if the user has unsaved data + /// + /// + /// + public FuncDepBoolType QueryClose_MSPublisher(string strArtifactLocation) + { + var RunningPublisherApps = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + try + { + if (pubDoc.Saved) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + break; + } + } + } + return FuncDepBoolType.Success; + } + + /// + /// *** Technically ** Here we want to close the Word Document (Not Prompt the user at all) + /// **** we could close it with a WM_CLOSE or WM_SCLOSE or with the DOM. ~for now it's the + /// DOM, however more testing to be done here + /// + /// + /// + public FuncDepBoolType Close_MSPublisher(string strArtifactLocation) + { + + IntPtr hWnd = IntPtr.Zero; + try + { + var RunningPublisherApps = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Save the Document + pubDoc.Save(); + + // Get the Handle + hWnd = (IntPtr)pubDoc.ActiveWindow.Hwnd; + goto FOUND_DOCUMENT_HWND; + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + FOUND_DOCUMENT_HWND: + // Get the Process + Process process = Win32Functions.GetProcessFromHandle(hWnd); + + // Send Close Message + if (Win32Functions.SendMessage((IntPtr)hWnd, (int)WindowMessage.WM_CLOSE, IntPtr.Zero, IntPtr.Zero) == 0) + { + process.Kill(); + return FuncDepBoolType.Success; + } + else + { + return FuncDepBoolType.Failed; + } + } + + #endregion + + #region Microsoft Visio IClose Members + + public const string Visio_ProgId = "Visio.Application"; + + /// + /// To Do : Test This - Let's us know if the user has unsaved data + /// + /// + /// + public FuncDepBoolType QueryClose_MSVisio(string strArtifactLocation) + { + + var RunningVisioDocs = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + try + { + if (doc.Saved) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + break; + } + } + + return FuncDepBoolType.Success; + } + + /// + /// *** Technically ** Here we want to close the Word Document (Not Prompt the user at all) + /// **** we could close it with a WM_CLOSE or WM_SCLOSE or with the DOM. ~for now it's the + /// DOM, however more testing to be done here + /// + /// + /// + public FuncDepBoolType Close_MSVisio(string strArtifactLocation) + { + + var RunningVisioDocs = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + try + { + doc.Save(); + + var app = doc.Application; + + doc.Close(); + Marshal.FinalReleaseComObject(doc); // Force Clean-up + + if (app.Documents.Count == 0) + { + app.Quit(); + Marshal.FinalReleaseComObject(app); // force clean-up + } + + + return FuncDepBoolType.Success; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + } + } + + return FuncDepBoolType.Success; + } + + #endregion + + #region Microsoft Access IClose Members + + public const string Access_ProgId = "Access.Application"; + + /// + /// To Do : Test This - Let's us know if the user has unsaved data + /// + /// + /// + public FuncDepBoolType QueryClose_MSAccess(string strArtifactLocation) + { + + var RunningAccessApps = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Access.Application app in RunningAccessApps) + { + if (app.CurrentProject.FullName.ToLower() == strArtifactLocation.ToLower()) + { + return FuncDepBoolType.Success; + } + } + return FuncDepBoolType.Failed; + } + + /// + /// *** Technically ** Here we want to close the Word Document (Not Prompt the user at all) + /// **** we could close it with a WM_CLOSE or WM_SCLOSE or with the DOM. ~for now it's the + /// DOM, however more testing to be done here + /// + /// + /// + public FuncDepBoolType Close_MSAccess(string strArtifactLocation) + { + + var RunningAccessApps = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Access.Application app in RunningAccessApps) + { + if (app.CurrentProject.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Get Handle and Process + IntPtr hWnd = (IntPtr) app.hWndAccessApp(); + Process process = Win32Functions.GetProcessFromHandle((IntPtr)hWnd); + + // Close the database + //app.CloseCurrentDatabase(); + app.Quit(Microsoft.Office.Interop.Access.AcQuitOption.acQuitSaveAll); + Marshal.FinalReleaseComObject(app); // force clean-up + + // Kill the process + process.Kill(); + + return FuncDepBoolType.Success; + } + } + return FuncDepBoolType.Failed; + } + + #endregion + } +} diff --git a/WorkspaceMgr/Closers/IClose.cs b/WorkspaceMgr/Closers/IClose.cs new file mode 100644 index 0000000..d8c5eee --- /dev/null +++ b/WorkspaceMgr/Closers/IClose.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.WorkspaceMgr.Closers +{ + internal interface IClose + { + FuncDepBoolType IQueryClose(string strArtifactLocation); + FuncDepBoolType IClose(string strArtifactLocation); + } +} diff --git a/WorkspaceMgr/Configurations.cs b/WorkspaceMgr/Configurations.cs new file mode 100644 index 0000000..17e9823 --- /dev/null +++ b/WorkspaceMgr/Configurations.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.Platform.Utilities; + +namespace Foo.WorkspaceMgr +{ + public static class Configurations + { + #region Excel 2007 Configuration + + private static string EXCEL_OPTIONS_REGISTRY_LOCATION = "Microsoft\\Office\\12.0\\Excel\\Options"; + + static public void Configure_Excel2007() + { + RegM reg = new RegM(HKEYRoot.CurrentUser, KeySub.Software, EXCEL_OPTIONS_REGISTRY_LOCATION, true); + reg.SetVal_Int("ShowWindowsInTaskbar", 1); + } + + #endregion + + static Configurations() + { + } + + + + } + +} diff --git a/WorkspaceMgr/HelperFunc.cs b/WorkspaceMgr/HelperFunc.cs new file mode 100644 index 0000000..956b656 --- /dev/null +++ b/WorkspaceMgr/HelperFunc.cs @@ -0,0 +1,147 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.DataAccessLayer.DataTypes; + +namespace Foo.WorkspaceMgr +{ + internal static class HelperFunc + { + internal const int DEFAULT_SHOWNHIDE_SLEEP_TIME = 250; + internal const int DEFAULT_CLOSE_SLEEP_TIME = 500; + internal const int DEFAULT_LAUNCH_SLEEP_TIME = 1000; + + /// + /// Depending on the Quality of the Index Optimizations, + /// Return what the best type of action is afterward + /// + internal enum IndexOptimizationQuality + { + Good, + Average, + Poor + } + + // Helper Class for OptimalLaunchIndexesForFileArtifacts + internal class OptimalIndexes + { + public int Index; + public string FileName; + internal OptimalIndexes(int Index, string FileName) + { + this.Index = Index; + this.FileName = FileName; + } + } + + /// + /// + /// + /// + /// + internal static int GetSleepTimeForQuality(IndexOptimizationQuality quality) + { + int nSleepTime = 1350; + switch (quality) + { + case HelperFunc.IndexOptimizationQuality.Good: + nSleepTime = 1350; + break; + + case HelperFunc.IndexOptimizationQuality.Average: + nSleepTime = 1675; + break; + + case HelperFunc.IndexOptimizationQuality.Poor: + nSleepTime = 2000; + break; + } + return nSleepTime; + } + + /// + /// For Launching of File Artifacts we must make sure that artifacts are in an order that allows us + /// to properly resolve them dynamically. When files with the same name get launched too close together, + /// window resolution will become increasingly difficult. + /// + /// a group of artifacts (Only file Artifacts will be processed) + /// an array of indexes that specifies the launch order of all the files in this group + internal static IndexOptimizationQuality OptimalLaunchIndexesForFileArtifacts(ArtifactItem[] artifactItems, out int[] optimalIndexes) + { + + // Step One - If it is a file type, then we get the file name and it's index to put into a list + List optIndex = new List(); + for (int i = 0; i < artifactItems.Length; ++i) + { + if(artifactItems[i].IsFile) + optIndex.Add(new OptimalIndexes(i, artifactItems[i].FileName)); + } + + // Step Two - Sort the List by FileName + optIndex.Sort(delegate(OptimalIndexes o1, OptimalIndexes o2) { return o1.FileName.CompareTo(o2.FileName); }); + + // Step Three - Go thru sorted list and get out all the Singles + List singlesList = new List(); + for (int i = 0; i < optIndex.Count; ++i) + { + bool bIsSingle = true; + bool bCompareUp = ((i > 0) && (i < optIndex.Count)); + bool bCompareDown = (i < (optIndex.Count - 1)); + + if (bIsSingle && bCompareUp) + bIsSingle = (String.Compare(optIndex[i].FileName, optIndex[i - 1].FileName, true) != 0); + + if (bIsSingle && bCompareDown) + bIsSingle = (String.Compare(optIndex[i].FileName, optIndex[i + 1].FileName, true) != 0); + + // If Single - Add To Singles List + if (bIsSingle) + singlesList.Add(i); + } + + // If all items in the List were singles then we are really good to go + // and can exit out of here + if (singlesList.Count == optIndex.Count) + { + // Pass out the Indexes of the Array To The Caller + optimalIndexes = new int[optIndex.Count]; + for (int i = 0; i < optIndex.Count; ++i) + optimalIndexes[i] = optIndex[i].Index; + + // Since there are no doubles - this is a low risk / high quality optimization + return IndexOptimizationQuality.Good; + } + + // Step Four - There are doubles and/or no singles + // ~remove all singles from optIndex + foreach (int index in singlesList) + { + + } + + + + + + // 2) we make a list of all filenames in sorted order (with an index to which artifact it belongs) + + + // 3) we then generate the most optimal list of indexes that we pass out for the caller to use + + foreach (ArtifactItem artifact in artifactItems) + { + + + } + + optimalIndexes = new int[1]; + + return IndexOptimizationQuality.Average; + } + + + + } +} diff --git a/WorkspaceMgr/IWorkspaceMgr.cs b/WorkspaceMgr/IWorkspaceMgr.cs new file mode 100644 index 0000000..22cdf35 --- /dev/null +++ b/WorkspaceMgr/IWorkspaceMgr.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; + +namespace Foo.WorkspaceMgr +{ + public interface IWorkspaceMgr + { + // Artifact Related + bool LaunchArtifact(ArtifactItem artifactItem); + bool CloseArtifact(ArtifactItem artifactItem); + bool HideShowArtifact(ArtifactItem artifactItem, bool bShow); + + // Workspace Related + bool LaunchWorkspace(string WorkspaceName); + bool CloseWorkspace(string WorkspaceName); + bool HideShowWorkspace(string WorkspaceName, bool bShow); + } +} diff --git a/WorkspaceMgr/Launchers/ILaunch.cs b/WorkspaceMgr/Launchers/ILaunch.cs new file mode 100644 index 0000000..70b1b91 --- /dev/null +++ b/WorkspaceMgr/Launchers/ILaunch.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.WorkspaceMgr.Launchers +{ + internal interface ILaunch + { + FuncDepBoolType IQueryLaunch(string strArtifactLocation); + FuncDepBoolType ILaunch(string strArtifactLocation); + } +} diff --git a/WorkspaceMgr/Launchers/Launcher_Excel.cs b/WorkspaceMgr/Launchers/Launcher_Excel.cs new file mode 100644 index 0000000..3d52e87 --- /dev/null +++ b/WorkspaceMgr/Launchers/Launcher_Excel.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +using Foo.Platform.Win32; +using System.Runtime.InteropServices; +using System.Diagnostics; +using System.Reflection; + +namespace Foo.WorkspaceMgr.Launchers +{ + internal class Launcher_Excel : ILaunch + { + #region ILaunch Members + + /// + /// Checks to see if the file exists in the system i.e. can be reached over + /// the network. if FileExists fails, we shouldn't be able to launch it. + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IQueryLaunch(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + { + if (File.Exists(strArtifactLocation)) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.ArtifactLocationUnavailable; + } + else + { + return FuncDepBoolType.ParametersInvalid; + } + } + + public const string Excel_ProgId = "Excel.Application"; + + /// + /// Generic Launcher should be able to handle any file type. Launched the .Net Way. + /// ~this is the same as if the User clicks on the file. + /// + /// location of the path + file to launch + /// + public FuncDepBoolType ILaunch(string strArtifactLocation) + { + Microsoft.Office.Interop.Excel.Application app = null; + app = new Microsoft.Office.Interop.Excel.Application(); + + // Mark the Application as visible + app.Visible = true; + + app.Workbooks.Open(strArtifactLocation, Missing.Value, Missing.Value, Missing.Value, Missing.Value, + Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, + Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value ); + + // Keep Track of all our Excel Instances + ///WorkspaceState.Launched_ExcelInstances.Add(app); + + return FuncDepBoolType.Success; + + //if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + //{ + // Process.Start(strArtifactLocation); + //} + //return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + + + + + + ///// + ///// To Do : Test This - Let's us know if the user has unsaved data + ///// + ///// + ///// + //public FuncDepBoolType QueryClose_MSExcel(string strArtifactLocation) + //{ + // try + // { + + + // foreach (Microsoft.Office.Interop.Excel.Workbook book in app.Workbooks) + // { + // if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + // { + // if (book.Saved) + // return FuncDepBoolType.Success; + // else + // return FuncDepBoolType.Failed; + // } + // } + // } + // catch (Exception e) + // { + // string message = e.Message; + // message = message + ""; + // // TODO: Log Something here + // return FuncDepBoolType.ErrorThrown; + // } + + // return FuncDepBoolType.Failed; + //} + + ///// + ///// *** Technically ** Here we want to close the Excel Workbook (Not Prompt the user at all) + ///// **** we could close it with a WM_CLOSE or WM_SCLOSE or with the DOM. ~for now it's the + ///// DOM, however more testing to be done here + ///// + ///// + ///// + //public FuncDepBoolType Close_MSExcel(string strArtifactLocation) + //{ + // try + // { + // Microsoft.Office.Interop.Excel.Application app = null; + // app = Win32Functions.GetCOMObject(Excel_ProgId) as Microsoft.Office.Interop.Excel.Application; + + // // For Debugging + // //int nCount = app.Workbooks.Count; + + // foreach (Microsoft.Office.Interop.Excel.Workbook book in app.Workbooks) + // { + // if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + // { + // book.Close(true, strArtifactLocation, false); + + // // Close Excel if this is the last Workbook + // if (app.Workbooks.Count == 0) + // app.Quit(); + + // return FuncDepBoolType.Success; + // } + // } + // } + // catch (Exception e) + // { + // string message = e.Message; + // message = message + ""; + // // TODO: Log Something here + // return FuncDepBoolType.ErrorThrown; + // } + + // return FuncDepBoolType.Failed; + //} + + + } +} diff --git a/WorkspaceMgr/Launchers/Launcher_Generic.cs b/WorkspaceMgr/Launchers/Launcher_Generic.cs new file mode 100644 index 0000000..ed8d92f --- /dev/null +++ b/WorkspaceMgr/Launchers/Launcher_Generic.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +using Foo.Platform.Win32; +using System.Runtime.InteropServices; +using System.Diagnostics; + +namespace Foo.WorkspaceMgr.Launchers +{ + internal class Launcher_Generic : ILaunch + { + #region ILaunch Members + + /// + /// Checks to see if the file exists in the system i.e. can be reached over + /// the network. if FileExists fails, we shouldn't be able to launch it. + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IQueryLaunch(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + { + if (File.Exists(strArtifactLocation)) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.ArtifactLocationUnavailable; + } + else + { + return FuncDepBoolType.ParametersInvalid; + } + } + + /// + /// Generic Launcher should be able to handle any file type. Launched the .Net Way. + /// ~this is the same as if the User clicks on the file. + /// + /// location of the path + file to launch + /// + public FuncDepBoolType ILaunch(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + { + Process.Start(strArtifactLocation); + return FuncDepBoolType.Success; + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + } +} diff --git a/WorkspaceMgr/Launchers/Launcher_Shell.cs b/WorkspaceMgr/Launchers/Launcher_Shell.cs new file mode 100644 index 0000000..9807d24 --- /dev/null +++ b/WorkspaceMgr/Launchers/Launcher_Shell.cs @@ -0,0 +1,83 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +using Foo.Platform.Win32; +using System.Runtime.InteropServices; +using System.Diagnostics; + +namespace Foo.WorkspaceMgr.Launchers +{ + internal class Launcher_Shell : ILaunch + { + #region ILaunch Members + + /// + /// Checks to see if the file exists in the system i.e. can be reached over + /// the network. if FileExists fails, we shouldn't be able to launch it. + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IQueryLaunch(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + { + if (File.Exists(strArtifactLocation)) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.ArtifactLocationUnavailable; + } + else + { + return FuncDepBoolType.ParametersInvalid; + } + } + + /// + /// Generic Launcher should be able to handle any file type using Shell Execute + /// ~This is NOT the same as Process.start(). When using ShellExecute, Excel workbooks + /// launch in a different window (and for some reason Don't SHOW UP in the Excel DOM) + /// ~this is why this is broken out (more testing is needed) + /// + /// location of the path + file to launch + /// + public FuncDepBoolType ILaunch(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + { + // Shellexecute works almost just like process.start except for the limitation + // mentioned: + // We could do process start but doing so means all excel docs open in the same + // excel window (just like powerpoint does) ~this may or may not be desirable + // ~excel docs won't show in the DOM, after being launched this way ~ - very odd + bool bIsValidExe = false; + string strExeOrDllPath = string.Empty; + bool bFound = Win32_WrapperFunc.FindExeOrDll(strArtifactLocation, out strExeOrDllPath, out bIsValidExe); + + const int SEE_MASK_NOCLOSEPROCESS = 0x40; + ShellExecuteInfo sei = new ShellExecuteInfo(); + sei.cbSize = Marshal.SizeOf(sei); + sei.lpVerb = "open"; + sei.lpParameters = '\"' + strArtifactLocation + '\"'; + sei.nShow = (int)WindowAction.SW_SHOWNORMAL; + sei.fMask = SEE_MASK_NOCLOSEPROCESS; + + // Use Shell32 or Explorer to launch the artifact + if (bFound && bIsValidExe) + sei.lpFile = strExeOrDllPath; + else + sei.lpFile = '\"' + Win32_WrapperFunc.GetWindowsPath() + "\\explorer.exe" + '\"'; + + if (Win32Functions.ShellExecuteEx(ref sei)) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + } +} diff --git a/WorkspaceMgr/Launchers/Launcher_Visio.cs b/WorkspaceMgr/Launchers/Launcher_Visio.cs new file mode 100644 index 0000000..5aa7c57 --- /dev/null +++ b/WorkspaceMgr/Launchers/Launcher_Visio.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.IO; + +using Foo.Platform.Win32; +using System.Runtime.InteropServices; +using System.Diagnostics; +using System.Reflection; + +namespace Foo.WorkspaceMgr.Launchers +{ + internal class Launcher_Visio : ILaunch + { + #region ILaunch Members + + /// + /// Checks to see if the file exists in the system i.e. can be reached over + /// the network. if FileExists fails, we shouldn't be able to launch it. + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IQueryLaunch(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + { + if (File.Exists(strArtifactLocation)) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.ArtifactLocationUnavailable; + } + else + { + return FuncDepBoolType.ParametersInvalid; + } + } + + public const string Excel_ProgId = "Visio.Application"; + + /// + /// Generic Launcher should be able to handle any file type. Launched the .Net Way. + /// ~this is the same as if the User clicks on the file. + /// + /// location of the path + file to launch + /// + public FuncDepBoolType ILaunch(string strArtifactLocation) + { + Microsoft.Office.Interop.Visio.Application app = null; + app = new Microsoft.Office.Interop.Visio.Application(); + + // Mark the Application as visible + app.Visible = true; + + app.Documents.Open(strArtifactLocation); + + // Keep Track of all our Excel Instances + ///WorkspaceState.Launched_ExcelInstances.Add(app); + + return FuncDepBoolType.Success; + + //if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + //{ + // Process.Start(strArtifactLocation); + //} + //return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + } +} diff --git a/WorkspaceMgr/Launchers/Launcher_Web.cs b/WorkspaceMgr/Launchers/Launcher_Web.cs new file mode 100644 index 0000000..6099b19 --- /dev/null +++ b/WorkspaceMgr/Launchers/Launcher_Web.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Diagnostics; + +namespace Foo.WorkspaceMgr.Launchers +{ + class Launcher_Web : ILaunch + { + #region ILaunch Members + + /// + /// Checks to see if the url is valid + /// ~~( We could even check if the webpage is available here!!!) ~to do later? + /// + /// url to launch + /// + public FuncDepBoolType IQueryLaunch(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + { + if (Uri.IsWellFormedUriString(strArtifactLocation, UriKind.Absolute)) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + return FuncDepBoolType.ParametersInvalid; + } + + /// + /// Generic Launcher should be able to handle any url type + /// + /// url to launch + public FuncDepBoolType ILaunch(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation) && (strArtifactLocation.Length > 3)) + { + Process.Start(strArtifactLocation); + return FuncDepBoolType.Success; + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + } +} diff --git a/WorkspaceMgr/MyKeyFile.SNK b/WorkspaceMgr/MyKeyFile.SNK new file mode 100644 index 0000000000000000000000000000000000000000..8bc8162ed771987fa7b5558f77d9cd3e254d5028 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50096E3GJ!7f2^66!9{w>8JcQ7WRYiuS?8mn(C`Ew4*_pU1|adDpm zL{a6=hgOFu*wU!Byu?9Iw0%3 zht2pzsu(+XeskRKv~^u@*j>Y1hsij-bq!l4|`tnkSZrz#RCjLiHr4caoz z`Hl;Wy<1bg_l35~NfvNza&-_%CrSS&#qg2nM~P07X-(sKc61o(?mbSr1irN}`K0yd6OMe)c5;MbX8TZ-X-`6Dj(GWK~OJ@Myln#$}bVR$(gg i+PpEwdYrUGFL7fxG1qR?P1E1WcFdU@7zR=r-hVF9mLSyt literal 0 HcmV?d00001 diff --git a/WorkspaceMgr/Properties/AssemblyInfo.cs b/WorkspaceMgr/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..654523c --- /dev/null +++ b/WorkspaceMgr/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("WorkspaceMgr")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WorkspaceMgr")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5f6d39ae-f75e-447b-b3c0-e1abb34b4fc8")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/WorkspaceMgr/ShowNHide/IShowNHide.cs b/WorkspaceMgr/ShowNHide/IShowNHide.cs new file mode 100644 index 0000000..fbee3e5 --- /dev/null +++ b/WorkspaceMgr/ShowNHide/IShowNHide.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.WorkspaceMgr.Hiders +{ + internal interface IShowNHide + { + FuncDepBoolType IQueryShow(string strArtifactLocation); + FuncDepBoolType IShow(string strArtifactLocation); + + FuncDepBoolType IQueryHide(string strArtifactLocation); + FuncDepBoolType IHide(string strArtifactLocation); + } +} diff --git a/WorkspaceMgr/ShowNHide/ShowNHide_Generic.cs b/WorkspaceMgr/ShowNHide/ShowNHide_Generic.cs new file mode 100644 index 0000000..174ebf6 --- /dev/null +++ b/WorkspaceMgr/ShowNHide/ShowNHide_Generic.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.Platform.Win32; + +namespace Foo.WorkspaceMgr.Hiders +{ + internal class ShowNHide_Generic : IShowNHide + { + + #region IShowNHide Members + + /// + /// Default behavior is to just return success ** Should Check if Window is hidden?/shown??? + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IQueryShow(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + return FuncDepBoolType.Success; + + return FuncDepBoolType.ParametersInvalid; + } + + /// + /// Calls ShowWindow to Show the Window + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IShow(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + IntPtr hWnd = IntPtr.Zero; // ToDo : Implement RAT + Win32Functions.ShowWindow(hWnd, (int)WindowAction.SW_SHOW); + return FuncDepBoolType.Success; + } + return FuncDepBoolType.ParametersInvalid; + } + + /// + /// Default behavior is to just return success ** Should Check if Window is hidden?/shown??? + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IQueryHide(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + return FuncDepBoolType.Success; + + return FuncDepBoolType.ParametersInvalid; + } + + /// + /// Calls ShowWindow to Hide the Window + /// + /// location of the path + file to launch + /// + public FuncDepBoolType IHide(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + IntPtr hWnd = IntPtr.Zero; // ToDo : Implement RAT + Win32Functions.ShowWindow(hWnd, (int)WindowAction.SW_HIDE); + return FuncDepBoolType.Success; + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + } +} diff --git a/WorkspaceMgr/ShowNHide/ShowNHide_Office.cs b/WorkspaceMgr/ShowNHide/ShowNHide_Office.cs new file mode 100644 index 0000000..d1234d7 --- /dev/null +++ b/WorkspaceMgr/ShowNHide/ShowNHide_Office.cs @@ -0,0 +1,847 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.Platform.Win32; +using System.Runtime.InteropServices; + +namespace Foo.WorkspaceMgr.Hiders +{ + internal class ShowNHide_Office : IShowNHide + { + #region IShowNHide Members + + public FuncDepBoolType IQueryShow(string strArtifactLocation) + { + switch (Win32_WrapperFunc.GetRegisteredExeForFile(strArtifactLocation)) + { + case "WINWORD.EXE": + return QueryShow_MSWord(strArtifactLocation); + + case "EXCEL.EXE": + return QueryShow_MSExcel(strArtifactLocation); + + case "POWERPNT.EXE": + return QueryShow_MSPowerPoint(strArtifactLocation); + + case "MSPUB.EXE": + return QueryShow_MSPublisher(strArtifactLocation); + + case "VISIO.EXE": + return QueryShow_MSVisio(strArtifactLocation); + + //case "ACCESS.EXE": + // return QueryClose_MSAccess(strArtifactLocation); + } + return FuncDepBoolType.FunctionallityNotSupported; + } + + public FuncDepBoolType IShow(string strArtifactLocation) + { + switch (Win32_WrapperFunc.GetRegisteredExeForFile(strArtifactLocation)) + { + case "WINWORD.EXE": + return Show_MSWord(strArtifactLocation); + + case "EXCEL.EXE": + return Show_MSExcel(strArtifactLocation); + + case "POWERPNT.EXE": + return Show_MSPowerPoint(strArtifactLocation); + + case "MSPUB.EXE": + return Show_MSPublisher(strArtifactLocation); + + case "VISIO.EXE": + return Show_MSVisio(strArtifactLocation); + + //case "ACCESS.EXE": + // return QueryClose_MSAccess(strArtifactLocation); + } + return FuncDepBoolType.FunctionallityNotSupported; + } + + public FuncDepBoolType IQueryHide(string strArtifactLocation) + { + switch (Win32_WrapperFunc.GetRegisteredExeForFile(strArtifactLocation)) + { + case "WINWORD.EXE": + return QueryHide_MSWord(strArtifactLocation); + + case "EXCEL.EXE": + return QueryHide_MSExcel(strArtifactLocation); + + case "POWERPNT.EXE": + return QueryHide_MSPowerPoint(strArtifactLocation); + + case "MSPUB.EXE": + return QueryHide_MSPublisher(strArtifactLocation); + + case "VISIO.EXE": + return QueryHide_MSVisio(strArtifactLocation); + + //case "ACCESS.EXE": + // return QueryClose_MSAccess(strArtifactLocation); + } + return FuncDepBoolType.FunctionallityNotSupported; + } + + public FuncDepBoolType IHide(string strArtifactLocation) + { + switch (Win32_WrapperFunc.GetRegisteredExeForFile(strArtifactLocation)) + { + case "WINWORD.EXE": + return Hide_MSWord(strArtifactLocation); + + case "EXCEL.EXE": + return Hide_MSExcel(strArtifactLocation); + + case "POWERPNT.EXE": + return Hide_MSPowerPoint(strArtifactLocation); + + case "MSPUB.EXE": + return Hide_MSPublisher(strArtifactLocation); + + case "VISIO.EXE": + return Hide_MSVisio(strArtifactLocation); + + //case "ACCESS.EXE": + // return QueryClose_MSAccess(strArtifactLocation); + } + return FuncDepBoolType.FunctionallityNotSupported; + } + + #endregion + + #region Microsoft Word IShowNHide Members + + FuncDepBoolType QueryShow_MSWord(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningWordDocuments = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if(window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if(!window.Visible) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Show_MSWord(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningWordDocuments = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (!window.Visible) + { + window.Visible = true; + return FuncDepBoolType.Success; + } + else + { + return FuncDepBoolType.Failed; + } + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType QueryHide_MSWord(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningWordDocuments = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (window.Visible) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Hide_MSWord(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningWordDocuments = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Word.Document doc in RunningWordDocuments) + { + foreach (Microsoft.Office.Interop.Word.Window window in doc.Windows) + { + if (window.Document.FullName.ToLower() == strArtifactLocation.ToLower()) + { + if (window.Visible) + { + window.Visible = false; + return FuncDepBoolType.Success; + } + else + { + return FuncDepBoolType.Failed; + } + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + #region Microsoft Excel IShowNHide Members + + FuncDepBoolType QueryShow_MSExcel(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningExcelWorkbooks = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = book.Application; + + bool bIsTheOnlyDocumentInApp = (app.Workbooks.Count == 1); + if (!app.Visible && bIsTheOnlyDocumentInApp) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + } + return FuncDepBoolType.ArtifactLocationUnavailable; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Show_MSExcel(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningExcelWorkbooks = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = book.Application; + + bool bIsTheOnlyDocumentInApp = (app.Workbooks.Count == 1); + if (!app.Visible && bIsTheOnlyDocumentInApp) + { + app.Visible = true; + return FuncDepBoolType.Success; + } + else + return FuncDepBoolType.Failed; + } + } + return FuncDepBoolType.ArtifactLocationUnavailable; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType QueryHide_MSExcel(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningExcelWorkbooks = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = book.Application; + + bool bIsTheOnlyDocumentInApp = (app.Workbooks.Count == 1); + if (app.Visible && bIsTheOnlyDocumentInApp) + { + return FuncDepBoolType.Success; + } + else + return FuncDepBoolType.Failed; + } + } + return FuncDepBoolType.ArtifactLocationUnavailable; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Hide_MSExcel(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningExcelWorkbooks = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Excel.Workbook book in RunningExcelWorkbooks) + { + if (book.FullName.ToLower() == strArtifactLocation.ToLower()) + { + var app = book.Application; + + bool bIsTheOnlyDocumentInApp = (app.Workbooks.Count == 1); + + // We could potentially not hide the window but instead just minimize the selected workbook + // ~have to learn + //if (!bIsTheOnlyDocumentInApp) + //{ + // foreach (Microsoft.Office.Interop.Excel.Window window in book.Windows) + // { + // window.WindowState = Microsoft.Office.Interop.Excel.XlWindowState.xlMinimized; + // } + //} + + if (app.Visible && bIsTheOnlyDocumentInApp) + { + app.Visible = false; + return FuncDepBoolType.Success; + } + else + return FuncDepBoolType.Failed; + } + } + return FuncDepBoolType.ArtifactLocationUnavailable; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + #region Microsoft PowerPoint IShowNHide Members + + FuncDepBoolType QueryShow_MSPowerPoint(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningPowerPoints = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + switch (presentation.Application.Visible) + { + case Microsoft.Office.Core.MsoTriState.msoTrue: + return FuncDepBoolType.Failed; + + case Microsoft.Office.Core.MsoTriState.msoFalse: + return FuncDepBoolType.Success; + } + } + } + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Show_MSPowerPoint(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningPowerPoints = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + switch (presentation.Application.Visible) + { + case Microsoft.Office.Core.MsoTriState.msoTrue: + return FuncDepBoolType.Failed; + + case Microsoft.Office.Core.MsoTriState.msoFalse: + { + //presentation.Application.Visible = Microsoft.Office.Core.MsoTriState.msoTrue; + + Win32Functions.ShowWindow((IntPtr)presentation.Application.HWND, (int)WindowAction.SW_SHOW); + + return FuncDepBoolType.Success; + } + } + } + } + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType QueryHide_MSPowerPoint(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningPowerPoints = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + switch (presentation.Application.Visible) + { + case Microsoft.Office.Core.MsoTriState.msoTrue: + return FuncDepBoolType.Success; + + case Microsoft.Office.Core.MsoTriState.msoFalse: + return FuncDepBoolType.Failed; + } + } + } + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Hide_MSPowerPoint(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + try + { + var RunningPowerPoints = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.PowerPoint.Presentation presentation in RunningPowerPoints) + { + if (presentation.FullName.ToLower() == strArtifactLocation.ToLower()) + { + switch (presentation.Application.Visible) + { + case Microsoft.Office.Core.MsoTriState.msoTrue: + { + //presentation.Application.Visible = Microsoft.Office.Core.MsoTriState.msoFalse; + //foreach (Microsoft.Office.Interop.PowerPoint.DocumentWindow docWindow in presentation.Windows) + //{ + // //docWindow. + //} + + Win32Functions.ShowWindow((IntPtr) presentation.Application.HWND, (int)WindowAction.SW_HIDE); + return FuncDepBoolType.Success; + } + + case Microsoft.Office.Core.MsoTriState.msoFalse: + { + return FuncDepBoolType.Failed; + } + } + } + } + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + return FuncDepBoolType.ErrorThrown; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + #region Microsoft Publisher IShowNHide Members + + FuncDepBoolType QueryShow_MSPublisher(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + IntPtr hWnd = IntPtr.Zero; + try + { + var RunningPublisherApps = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Get the Handle + hWnd = (IntPtr)pubDoc.ActiveWindow.Hwnd; + goto FOUND_DOCUMENT_HWND; + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + FOUND_DOCUMENT_HWND: + return FuncDepBoolType.Success; // Check Window State... - TO DO Later + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Show_MSPublisher(string strArtifactLocation) + { + IntPtr hWnd = IntPtr.Zero; + try + { + var RunningPublisherApps = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Save the Document + pubDoc.Save(); + + // Get the Handle + hWnd = (IntPtr)pubDoc.ActiveWindow.Hwnd; + goto FOUND_DOCUMENT_HWND; + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + FOUND_DOCUMENT_HWND: + + // Send Show Message + Win32Functions.ShowWindow(hWnd, (int)WindowAction.SW_SHOW); + return FuncDepBoolType.Success; + } + + FuncDepBoolType QueryHide_MSPublisher(string strArtifactLocation) + { + if (!String.IsNullOrEmpty(strArtifactLocation)) + { + IntPtr hWnd = IntPtr.Zero; + try + { + var RunningPublisherApps = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Get the Handle + hWnd = (IntPtr)pubDoc.ActiveWindow.Hwnd; + goto FOUND_DOCUMENT_HWND; + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + FOUND_DOCUMENT_HWND: + return FuncDepBoolType.Success; // Check Window State... - TO DO Later + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Hide_MSPublisher(string strArtifactLocation) + { + IntPtr hWnd = IntPtr.Zero; + try + { + var RunningPublisherApps = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Publisher.Application app in RunningPublisherApps) + { + foreach (Microsoft.Office.Interop.Publisher.Document pubDoc in app.Documents) + { + if (pubDoc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + // Save the Document + pubDoc.Save(); + + // Get the Handle + hWnd = (IntPtr)pubDoc.ActiveWindow.Hwnd; + goto FOUND_DOCUMENT_HWND; + } + } + } + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + FOUND_DOCUMENT_HWND: + + // Send Show Message + Win32Functions.ShowWindow(hWnd, (int)WindowAction.SW_HIDE); + return FuncDepBoolType.Success; + } + + #endregion + + #region Microsoft Visio IShowNHide Members + + FuncDepBoolType QueryShow_MSVisio(string strArtifactLocation) + { + var RunningVisioDocs = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + try + { + bool bIsTheOnlyDocumentInApp = true; // TO DO: (doc.Application.Documents.Count == 1); not working + if (!doc.Application.Visible && bIsTheOnlyDocumentInApp) + return FuncDepBoolType.Success; + else + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + break; + } + } + + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Show_MSVisio(string strArtifactLocation) + { + var RunningVisioDocs = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + try + { + bool bIsTheOnlyDocumentInApp = true; // TO DO - (doc.Application.Documents.Count == 1); not working + if (!doc.Application.Visible && bIsTheOnlyDocumentInApp) + { + doc.Application.Visible = true; + return FuncDepBoolType.Success; + } + else + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + break; + } + } + + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType QueryHide_MSVisio(string strArtifactLocation) + { + var RunningVisioDocs = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + try + { + bool bIsTheOnlyDocumentInApp = true; // (doc.Application.Documents.Count == 1); // TO DO - not working + if (doc.Application.Visible && bIsTheOnlyDocumentInApp) + { + return FuncDepBoolType.Success; + } + else + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + break; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + FuncDepBoolType Hide_MSVisio(string strArtifactLocation) + { + var RunningVisioDocs = Win32Functions.GetRunningObjectsOfType(); + foreach (Microsoft.Office.Interop.Visio.Document doc in RunningVisioDocs) + { + if (doc.FullName.ToLower() == strArtifactLocation.ToLower()) + { + try + { + bool bIsTheOnlyDocumentInApp = true; // (doc.Application.Documents.Count == 1); // TO DO - not working + if (doc.Application.Visible && bIsTheOnlyDocumentInApp) + { + doc.Application.Visible = false; + return FuncDepBoolType.Success; + } + else + return FuncDepBoolType.Failed; + } + catch (Exception e) + { + string message = e.Message; + message = message + ""; + // TODO: Log Something here + } + + break; + } + } + return FuncDepBoolType.ParametersInvalid; + } + + #endregion + + + } +} diff --git a/WorkspaceMgr/WorkspaceMgr.cs b/WorkspaceMgr/WorkspaceMgr.cs new file mode 100644 index 0000000..6917725 --- /dev/null +++ b/WorkspaceMgr/WorkspaceMgr.cs @@ -0,0 +1,248 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; + +using Foo.WorkspaceMgr.Closers; +using Foo.WorkspaceMgr.Hiders; +using Foo.WorkspaceMgr.Launchers; +using System.Reflection; + +namespace Foo.WorkspaceMgr +{ + public class WorkspaceMgr : IWorkspaceMgr + { + #region IWorkspaceMgr Members + + /// + /// Responsible for Launching a single artifact // ToDo: - CHECK RAT if Artifact is already running + /// // ToDo: - Test IEXPLORER LAUNCHER + /// artifact to launch // ToDo: - Figgure out what to do in Error State + /// true if successful, false otherwise + public bool LaunchArtifact(ArtifactItem artifactItem) + { + + AssemblyName assemblyName = new AssemblyName("Microsoft.Office.Interop.Access, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"); + Assembly assembly = Assembly.Load(assemblyName); + + + //if (artifactItem.IsValid && artifactItem.IsValidFileIntegrity) + if (artifactItem.IsLocationValid) + { + // Step One - Create the Launcher Obj + ILaunch launcher = WorkspaceTypeHelpers.CreateLauncherObj(artifactItem); + if (launcher == null) + return false; + + // Step Two - Query if Launching for this Artifact is supported + FuncDepBoolType retVal = launcher.IQueryLaunch(artifactItem.Location); + + // Step Three - launch it if supported + if (retVal == FuncDepBoolType.Success) + { + retVal = launcher.ILaunch(artifactItem.Location); + } + else + { + // * Log error or something and return otherwise * To Do + return false; + } + + // Step Four - if success signal to the db the artifact was launched + if (retVal == FuncDepBoolType.Success) + { + Data.Artifacts.ArtifactWasLaunched(artifactItem); + } + + return (retVal == FuncDepBoolType.Success); + } + return false; + } + + /// + /// Responsible for Closing a single artifact // ToDo: - CHECK RAT if Artifact is running, if so Get Proccess that it is running in!!! ---- + /// // ToDo: - Test Office, Generic, Notepad, IExplore Closers + /// artifact to close // ToDo: - Figgure out what to do in Error State + /// true if successful, false otherwise + public bool CloseArtifact(ArtifactItem artifactItem) + { + if (artifactItem.IsValid && artifactItem.IsValidFileIntegrity) + { + // Step One - Create the Closer Obj + IClose closer = WorkspaceTypeHelpers.CreateCloserObj(artifactItem); + if (closer == null) + return false; + + // Step Two - Query if Closing for this Artifact is possible + FuncDepBoolType retVal = closer.IQueryClose(artifactItem.Location); + + // Step Three - close it if supported + if (retVal == FuncDepBoolType.Success) + { + retVal = closer.IClose(artifactItem.Location); + } + else + { + // * Log error or something and return otherwise * To Do + return false; + } + + return (retVal == FuncDepBoolType.Success); + } + return false; + } + + /// + /// Responsible for Hiding or showing a single artifact // ToDo: - CHECK RAT if Artifact is running, if so Get Proccess that it is running in!!! ---- + /// // ToDo: - Test Office, Generic, Notepad, IExplore Hiders + /// artifact to hide // ToDo: - Figgure out what to do in Error State + /// true to show, false to hide artifact + /// true if successful, false otherwise + public bool HideShowArtifact(ArtifactItem artifactItem, bool bShow) + { + if (artifactItem.IsValid && artifactItem.IsValidFileIntegrity) + { + // Step One - Create the ShowNHider Obj + IShowNHide ShowHider = WorkspaceTypeHelpers.CreateShowNHiderObj(artifactItem); + if (ShowHider == null) + return false; + + // Step Two - Query if Hiding or Showing is available for this Artifact + FuncDepBoolType retVal = FuncDepBoolType.Failed; + if (bShow) + retVal = ShowHider.IQueryShow(artifactItem.Location); + else + retVal = ShowHider.IQueryHide(artifactItem.Location); + + // Step Three - Show or Hide it if supported + if (retVal == FuncDepBoolType.Success) + { + if(bShow) + retVal = ShowHider.IShow(artifactItem.Location); + else + retVal = ShowHider.IHide(artifactItem.Location); + } + else + { + // * Log error or something and return otherwise * To Do + return false; + } + + return (retVal == FuncDepBoolType.Success); + } + return false; + } + + /// // ToDo: - + /// Launches a Workspace. When for some reason an artifact location + /// is not available to launch we keep track of it and display it to the + /// user - however, we don't stop. we try to launch as many artifacts as + /// we can. + /// --------------------------------------------------------------------- + /// There are a few steps we have to do in order to successfully launch: + /// 1) Make sure all files that have the same file name are not launched together + /// 2) we must wait a little after each file to make sure that they can be resolved + /// + /// + /// Name of Workspace to launch artifacts for + /// true if 1 or more artifacts were launched, false otherwise + public bool LaunchWorkspace(string WorkspaceName) + { + // Step One - First Get all the Artifacts by Name + ArtifactItem[] artifacts = Data.Artifacts.GetAllArtifactsForWorkspace(WorkspaceName, SortOrderForArtifacts.Descending); + if (!DataTypeValidation.IsEmptyArtifactItemGroup(artifacts)) + { + + // Let's get the optimal Indexes for all the file artifacts + int[] optimalIndexes; + HelperFunc.IndexOptimizationQuality quality; + quality = HelperFunc.OptimalLaunchIndexesForFileArtifacts(artifacts, out optimalIndexes); + + //// + // Launch the file Artifacts according to their optimal indexes + //// + foreach (int optIndex in optimalIndexes) + { + // Launch file artifact + LaunchArtifact(artifacts[optIndex]); + + // depending on the quality of indexes sleep accordingly + int nSleepTime = HelperFunc.GetSleepTimeForQuality(quality); + + // Sleep Now before launching again + System.Threading.Thread.Sleep(nSleepTime); + } + + //// + // Launch the url Artifacts according to their optimal indexes + //// + foreach (ArtifactItem artifact in artifacts) + { + if (artifact.IsUrl) + { + LaunchArtifact(artifact); + System.Threading.Thread.Sleep(HelperFunc.DEFAULT_LAUNCH_SLEEP_TIME); + } + } + + // Signal the Workspace as Launched + Data.Workspace.WorkspaceWasLaunched(WorkspaceName); + + // Set it to this Workspace 'State' + Data.State.SetCurrentWorkspaceName(WorkspaceName); + } + return false; + } + + /// + /// + /// + /// Name of Workspace to close artifacts for + /// + public bool CloseWorkspace(string WorkspaceName) + { + ArtifactItem[] artifacts = Data.Artifacts.GetAllArtifactsForWorkspace(WorkspaceName, SortOrderForArtifacts.Ascending); + if (!DataTypeValidation.IsEmptyArtifactItemGroup(artifacts)) + { + foreach (ArtifactItem artifact in artifacts) + { + CloseArtifact(artifact); + + // Sleep a little + System.Threading.Thread.Sleep(HelperFunc.DEFAULT_CLOSE_SLEEP_TIME); + } + + // Clear Workspace 'State' + Data.State.ClearCurrentWorkspaceName(); + } + return false; + } + + /// + /// + /// + /// + /// true to show, false to hide artifact + /// + public bool HideShowWorkspace(string WorkspaceName, bool bShow) + { + ArtifactItem[] artifacts = Data.Artifacts.GetAllArtifactsForWorkspace(WorkspaceName, SortOrderForArtifacts.Ascending); + + if (!DataTypeValidation.IsEmptyArtifactItemGroup(artifacts)) + { + foreach (ArtifactItem artifact in artifacts) + { + HideShowArtifact(artifact, bShow); + + // Sleep a little + System.Threading.Thread.Sleep(HelperFunc.DEFAULT_SHOWNHIDE_SLEEP_TIME); + } + } + return false; + } + + #endregion + } +} diff --git a/WorkspaceMgr/WorkspaceMgr.csproj b/WorkspaceMgr/WorkspaceMgr.csproj new file mode 100644 index 0000000..1d6c631 --- /dev/null +++ b/WorkspaceMgr/WorkspaceMgr.csproj @@ -0,0 +1,134 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35} + Library + Properties + Foo.WorkspaceMgr + WorkspaceMgr + v3.5 + 512 + true + MyKeyFile.SNK + + + true + full + false + ..\Target\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\Target\Release\ + TRACE + prompt + 4 + + + + False + False + + + False + False + + + False + False + + + False + False + + + False + False + + + False + False + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618} + DataAccessLayer + + + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Platform + + + {48D75C4F-2749-48BB-9386-721E0E94C144} + Settings + + + + + + + + {2DF8D04C-5BFA-101B-BDE5-00AA0044DE52} + 2 + 3 + 0 + primary + False + + + + + + + + + \ No newline at end of file diff --git a/WorkspaceMgr/WorkspaceState.cs b/WorkspaceMgr/WorkspaceState.cs new file mode 100644 index 0000000..c080442 --- /dev/null +++ b/WorkspaceMgr/WorkspaceState.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Foo.WorkspaceMgr +{ + static class WorkspaceState + { + static public List Launched_ExcelInstances = new List(); + static public List Launched_PowerPointInstances = new List(); + + static WorkspaceState() + { + } + + } +} diff --git a/WorkspaceMgr/WorkspaceTypes.cs b/WorkspaceMgr/WorkspaceTypes.cs new file mode 100644 index 0000000..2c08076 --- /dev/null +++ b/WorkspaceMgr/WorkspaceTypes.cs @@ -0,0 +1,291 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.Settings; +using Foo.Platform.Win32; +using Foo.DataAccessLayer.DataTypes; +using Foo.WorkspaceMgr.Hiders; +using Foo.WorkspaceMgr.Closers; +using Foo.WorkspaceMgr.Launchers; + +namespace Foo.WorkspaceMgr +{ + /// + /// Allows us to extend functionallity by creating our own + /// Custom Types to be used in certain scenarios + /// + internal enum CustomStateChangingTypes + { + LaunchGenericUrl + } + + /// + /// Useful for StateChanger Returns where we + /// need more information on failures + /// + public enum FuncDepBoolType + { + Success, + Failed, + ParametersInvalid, + ArtifactLocationUnavailable, + FunctionallityNotSupported, + ErrorThrown + } + + /// + /// Use this to request the proper state + /// Changing Object + /// + public enum StateChangerReqType + { + Launcher, + ShowNHider, + Closer + } + + /// + /// Class for useful Workspace Type Helpers + /// + internal static class WorkspaceTypeHelpers + { + private static configuration _configuration = null; + + static WorkspaceTypeHelpers() + { + OoganizerSettingsAcc accessor = new OoganizerSettingsAcc(); + _configuration = accessor.ReadConfigXMLFile(); + } + + #region Internal Object Creator Functions (Call these in this assembly) + + /// + /// Creates a Launcher Object from an artifact Item + /// + /// valid artifact to create a launcher for + /// object or null + internal static ILaunch CreateLauncherObj(ArtifactItem artifactItem) + { + if (artifactItem.IsUrl) + { + return CreateLauncherObj(CustomStateChangingTypes.LaunchGenericUrl.ToString()); + } + else if (artifactItem.IsFile) + { + string strRegisteredProcessExe = Win32_WrapperFunc.GetRegisteredExeForFile(artifactItem.Location); + if (!String.IsNullOrEmpty(strRegisteredProcessExe)) + return CreateLauncherObj(strRegisteredProcessExe); + //return CreateLauncherObj(LauncherGenericType.LaunchGenericFile); + } + return null; + } + + /// + /// Creates a Hider Object from an artifact Item + /// + /// name for process to create object for + /// object or null + internal static IShowNHide CreateShowNHiderObj(ArtifactItem artifactItem) // TO DO: We can check the RAT which Process the artifact was launched in!! + { + if (artifactItem.IsUrl) + { + // To Do: Query the RAT for the process this artifact is in, then call + // the object creator function for the correct process + return null; + } + else if (artifactItem.IsFile) + { + string strRegisteredProcessExe = Win32_WrapperFunc.GetRegisteredExeForFile(artifactItem.Location); + if (!String.IsNullOrEmpty(strRegisteredProcessExe)) + return CreateShowNHiderObj(strRegisteredProcessExe); + } + return null; + } + + /// + /// Creates a Closer Object from an artifact Item + /// + /// valid artifact to a closer for + /// object or null + internal static IClose CreateCloserObj(ArtifactItem artifactItem) // TO DO: We can check the RAT which Process the artifact was launched in!! + { + if (artifactItem.IsUrl) + { + // To Do: Query the RAT for the process this artifact is in, then call + // the object creator function for the correct process + return null; + } + else if (artifactItem.IsFile) + { + string strRegisteredProcessExe = Win32_WrapperFunc.GetRegisteredExeForFile(artifactItem.Location); + if (!String.IsNullOrEmpty(strRegisteredProcessExe)) + return CreateCloserObj(strRegisteredProcessExe); + } + return null; + } + + #endregion + + #region Private Object Creator Helper Functions + + /// + /// Creates a Closer Object + /// + /// name for process to create object for + /// object or null + private static IClose CreateCloserObj(string ProcessNameOrCustomType) + { + object o = CreateStateChangerObject(StateChangerReqType.Closer, ProcessNameOrCustomType); + if (IsObjectOfType(StateChangerReqType.Closer, o)) + return (o as IClose); + else + return null; + } + + /// + /// Creates a Hider Object + /// + /// name for process to create object for + /// object or null + private static IShowNHide CreateShowNHiderObj(string ProcessNameOrCustomType) + { + object o = CreateStateChangerObject(StateChangerReqType.ShowNHider, ProcessNameOrCustomType); + if (IsObjectOfType(StateChangerReqType.ShowNHider, o)) + return (o as IShowNHide); + else + return null; + } + + /// + /// Creates a Launcher Object + /// + /// type of Launcher you want to create + /// object or null + private static ILaunch CreateLauncherObj(string ProcessNameOrCustomType) + { + object o = CreateStateChangerObject(StateChangerReqType.Launcher, ProcessNameOrCustomType); + if (IsObjectOfType(StateChangerReqType.Launcher, o)) + return (o as ILaunch); + else + return null; + } + + /// + /// Useful for quick Interface Type checking of StateChangers + /// + /// A StateChangerRequestTyp + /// a stateChanger Object + /// true if object is of that Type + private static bool IsObjectOfType(StateChangerReqType reqType, object o) + { + if (o != null) + { + switch (reqType) + { + case StateChangerReqType.Launcher: + return (o is ILaunch); + + case StateChangerReqType.ShowNHider: + return (o is IShowNHide); + + case StateChangerReqType.Closer: + return (o is IClose); + } + } + return false; + } + + #endregion + + #region Main Object Factory Function (All calls ultimately end up here) + + /// + /// Function is responsible for create the StateChanging Objects that we + /// need for the system. It will either be hardcoded in or be reading from + /// the settings file to know what object to create + /// + /// A StateChangerRequestType + /// the name of the process to create it for + /// an object of the correct type, the caller must then cast it + private static object CreateStateChangerObject(StateChangerReqType reqType, string ProcessNameOrCustomType) + { + if (!String.IsNullOrEmpty(ProcessNameOrCustomType)) + { + //// + // First Step - Create any Custom Types + //// + switch (ProcessNameOrCustomType) + { + case "LaunchGenericUrl": + { + if (reqType == StateChangerReqType.Launcher) + return new Launchers.Launcher_Web(); + } + break; + } + + //// + // Second Step - Read thru the Configuration and create the corresponding + // object as the Configuration says we should use + //// + foreach (ButtonHookSettings.ProcessName processObj in _configuration.ButtonHook.AllowedProcessNames.ProcessNames) + { + + if (processObj.ProcessExe == ProcessNameOrCustomType.ToUpper()) + { + switch (reqType) + { + case StateChangerReqType.Launcher: + switch (processObj.Launcher.ToUpper()) + { + case "WEB": + return new Launcher_Web(); + + case "SHELL": + return new Launcher_Shell(); + + case "EXCEL": + return new Launcher_Excel(); + + case "VISIO": + return new Launcher_Visio(); + + default: + return new Launcher_Generic(); + } + + case StateChangerReqType.Closer: + switch (processObj.Closer.ToUpper()) + { + case "IE": + return new Closer_IE(); + + case "OFFICE": + return new Closer_Office(); + + default: + return new Closer_Generic(); + } + + case StateChangerReqType.ShowNHider: + switch (processObj.ShowHider.ToUpper()) + { + case "OFFICE": + return new ShowNHide_Office(); + + default: + return new ShowNHide_Generic(); + } + + } + } + } + } + return null; + } + + #endregion + } +} diff --git a/zEasyTest/Program.cs b/zEasyTest/Program.cs new file mode 100644 index 0000000..22ddfc9 --- /dev/null +++ b/zEasyTest/Program.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.Platform; +using Foo.Platform.Win32; +using Foo.Settings; +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; + + +namespace zEasyTest +{ + class Program + { + static void Main(string[] args) + { + foreach (Win32Functions.RunningObject running in Win32Functions.GetRunningObjects()) + { + if (running.name == "Doris") + { + int j = 5; + j = j + 5; + } + } + + + + + // DataAccessLayer + //DB.DeleteDefaultDB(); + //DataAccessLayer.TestData.TestData.FillDBWithTestData(); + + // Settings + //Settings_Test.MockAroundWithSettings(); + + // WorkspaceMgr + //WorkspaceMgr_Test.TestSingleArtifactLaunch(); + //WorkspaceMgr_Test.TestWorkspaceLaunch(); + //WorkspaceMgr_Test.TestConfiguration(); + + int i = 5; + i = i - 5; + } + } +} diff --git a/zEasyTest/Properties/AssemblyInfo.cs b/zEasyTest/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..2d03398 --- /dev/null +++ b/zEasyTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("zEasyTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("zEasyTest")] +[assembly: AssemblyCopyright("Copyright © 2010")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("9543b631-51de-4051-b115-ac39fd28e0cc")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/zEasyTest/Settings_Test.cs b/zEasyTest/Settings_Test.cs new file mode 100644 index 0000000..a2f01c4 --- /dev/null +++ b/zEasyTest/Settings_Test.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Foo.Settings; + +namespace zEasyTest +{ + static class Settings_Test + { + + public static void MockAroundWithSettings() + { + OoganizerSettingsAcc acc = new OoganizerSettingsAcc(); + + configuration conf = new configuration(); + conf.ButtonHook.AllowedProcessNames.AddProcessName(new ButtonHookSettings.ProcessName("Doris", "Doris1", "Doris3", "Doris4", "123", "dd", "vv", 0, 0)); + conf.ButtonHook.AllowedProcessNames.AddProcessName(new ButtonHookSettings.ProcessName("Voris", "Voris1", "Voris3", "Voris4", "123", "dd", "vv", 0, 0)); + conf.ButtonHook.AllowedProcessNames.AddProcessName(new ButtonHookSettings.ProcessName("Koris", "Koris1", "Koris3", "Koris4", "123", "dd", "vv", 0, 0)); + + //configuration config = acc.ReadConfigXMLFile(); + + //configuration config = acc.ReadConfigXMLFile(@"D:\Users\HPinvent\_ROOT_\TestANizer\DataAccessLayer\Doris.xml", false); + + acc.WriteConfigXMLFile(@"D:\Users\HPinvent\_ROOT_\TestANizer\DataAccessLayer\Doris.xml", conf); + + //acc.WriteBlankConfigXMLFile(@"D:\Users\HPinvent\_ROOT_\TestANizer\DataAccessLayer\Doris.xml"); + } + + + } +} diff --git a/zEasyTest/WorkspaceMgr_Test.cs b/zEasyTest/WorkspaceMgr_Test.cs new file mode 100644 index 0000000..85a7049 --- /dev/null +++ b/zEasyTest/WorkspaceMgr_Test.cs @@ -0,0 +1,46 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +using Foo.DataAccessLayer; +using Foo.DataAccessLayer.DataTypes; +using Foo.Platform; +using Foo.GUILib; +using Foo.WorkspaceMgr; + +namespace zEasyTest +{ + static class WorkspaceMgr_Test + { + + static public void TestConfiguration() + { + Configurations.Configure_Excel2007(); + } + + static public void TestSingleArtifactLaunch() + { + //WorkspaceMgr mgr = new WorkspaceMgr(); + //mgr.LaunchArtifact(DataTypeHelpers.CreateLocationOnlyArtifact(@"D:\Users\HPinvent\Documents\KeepFocusedTask.txt")); + //mgr.LaunchArtifact(DataTypeHelpers.CreateLocationOnlyArtifact(@"http://www.google.com/")); + } + + static public void TestWorkspaceLaunch() + { + WorkspaceMgr mgr = new WorkspaceMgr(); + + string strTestWorkspace = "Presentations"; + + mgr.LaunchWorkspace(strTestWorkspace); + + System.Threading.Thread.Sleep(30000); + + mgr.CloseWorkspace(strTestWorkspace); + + + //mgr.LaunchArtifact(DataTypeHelpers.CreateLocationOnlyArtifact(@"D:\Users\HPinvent\Documents\KeepFocusedTask.txt")); + } + + } +} diff --git a/zEasyTest/zEasyTest.csproj b/zEasyTest/zEasyTest.csproj new file mode 100644 index 0000000..469b304 --- /dev/null +++ b/zEasyTest/zEasyTest.csproj @@ -0,0 +1,83 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {6CDF553C-5060-4871-9CE8-63F66346716A} + Exe + Properties + zEasyTest + zEasyTest + v3.5 + 512 + + + true + full + false + ..\target\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\target\Release\ + TRACE + prompt + 4 + + + + + 3.5 + + + 3.5 + + + 3.5 + + + + + + + + + + + + + {C7E4B4C1-64D4-45FF-AAFD-C4B9AE216618} + DataAccessLayer + + + {C1282050-455B-44F4-8520-1C005E38EFB2} + GUILib + + + {F6929AFC-BF61-43A0-BABD-F807B65FFFA1} + Platform + + + {48D75C4F-2749-48BB-9386-721E0E94C144} + Settings + + + {09ED5DCC-9350-42E5-8E3A-4A3EA25BCD35} + WorkspaceMgr + + + + + \ No newline at end of file

zTuY=}^SKIB!RXyC?NxD-294&hz^Fj-Z`=Ld#s_N# z!det48?jumr-|;JJQ9g{tjojAeKmo{p$ecQ^&Bpqxa7%1E^A5aIU5yu+{klgzL7K7 zbL`*ghmx;1Kw{}9i7i3of2N;>v-7{~`_8-HE>xV7<}7wXu&Q>*%JHFaD3H8}i4zYg zdofGLcn6NU3Hvk=V;gSdeI)Og}My8t0$xRH#cKa+FVeScrY69Migtv;4t3&sa zrNwV0R5-IPAJXD<8>XAx9HR)P?AiP*sC6!4Gx0>GGOBvEEor#P!o0*OwNuU^98s8o zf>OX#$NSUpU(OlmL2B?0)0vh%Ud-(kB#wC3&YGKCc=BwnERzN8u53)7q*a{wS;!!g zUwIb|OO03>W^m8-am1LV$mo-2LIOKh|H&@wC+c3h>u?#2<#=R|jlV{AoII*6^>*-9H=N#x{=r zxz&3X=WNsOCsG)8IC-W8c-HuApX#SE1@SMtR%Zduo*I4vw3Gh;_<4pnYkF2${WOiG z{LhR3O|bs=C>U(x?f1X`XOtgm?JUY!aq{zBxM+Tf@UI6O8Ebn|DIg6)bX)A`91_A0rX(&e=Rme0|5UAAiz`} literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Book2.xls b/DataAccessLayer/TestData/Files/DupFiles1/Book2.xls new file mode 100644 index 0000000000000000000000000000000000000000..1d776a44500e4f20376a0cae7d77dd73a53bb986 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Book2.xlsx b/DataAccessLayer/TestData/Files/DupFiles1/Book2.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..715c15df8d16a4b50b49e3b43bc74c7aed4014a3 GIT binary patch literal 7832 zcmeHMXH-+^)=sDfMCsCd?@d4{f`CFu=paR;7a4pIoZ!TdH1vTe%`&+lrgbL0XTpw004jypsUmI$`}X$ zP+$W9B!CH^fgIf4#lqgjNXyf~!r73|!w$xfF#_ax1HeH4{-5iAY6m{VKvh}=2m=ok zCmFZNS?$9D2*DHBca)biXqv~OI||GU=xQo!tfKnCZwT`Pu#@B?Z*DXmStfgxl|ak= zpHGbYK`TJY&EVWh!yBuvdok1HSed0@3afNuT$$QQ2M!=F0gIF zJY{*{2na5_Dd;&#;(P50z<;S~A0(XFUG4o_WhXG$#H|%FZ8+9&tLDg-iy-AU@(DWU z1708$PMLgPrGkzYKsAr2wW36P_mhL^$PyHPY^R`i{4Gwn<~e0SD!dNyojcm zgD>!VB)i?M11$NAPp9P6S&?|07$rSJv*h9e6QK5&P^;1wVBSMNfuJJ^AJ7Xla^^96{%`EHmRWCAGWDfQN zF#W)0sDb^ZzB>lf>x+-I=xI#(Ra)yfWXpt2pN`si6s750e`CsI^_aAi>LrcIgQ;nl zkw;cclIiG4UU^s;Rb9*}v#AKJDk=Wfs#A8PfO@xy^*}Ubp2cL$f>h8uIyGL&VWiC! z+^4t&(#MiVY+GdrX>x$w{g3`fW~viYL-eA{X6eKe0xk}W57eKOa)>3!tu3tL65xEzVzx5=tcQ4 z8PpY2ya=k9>p2FIhLy#BO<^Tq7F-P*o?4H6!n{RPlVU|?$YX1*a7rH86Nl3pvSU7% zD>v~5n+A_=7zJl%Uf`$3bIi(p30PKNeAee}hFo9k5U?rQge?{5zg&8jz4 zCW)0qZl*I12p9>fL_>)~fc&lVVnJQ;#^uzl=E?%sM*~bKPsS>aUis{5oSxmBW37(& z8Db9^x>W+`TQTxNGve>LQ5&(!tHTS{PY-K z3(CbPv+EbZu>hNenhlpRqZrpV^ywmmQW>rFw*ZJCd6xHQ`(K5LWwG!b}QEt*@dNZ4{ZTk?e*4Z!? zQ15a-3`_9KJ8`25>Cy8Q(H`%VJeD>6(=)LrvBFBT`K~=_uhN z3Wi4{+yjpFql7CIMqHoB_?|bWD8p94;r=cBq7r6i&rB=sjE_@NpO8p|t!IeqbG_vf zEKth;i8fjey{9;jo5lZ?C%)#e*81T90Gia_1>p}*xL8}*S@8e33x1E=RXtTWN|f~7 z^)Yt_7q}gJH8rkl=vY}&5tO>kKA7(D>o{G_44FYCZ|aG;=fKuFlXzhLngEQuAEVwS zjm;pq2=kb1UlCkR(W5+wLp?GaEYI}J>*Dhqv+Lf3KO$X@iDkhNRcKiJ1kol0Nyv=Co5Xfhd& zMCyph-Cm1$kPAW&g(+?3Bf@e$CYT})k8R@7@M%N$$S~eCYUJ;eU*Aq z{UOHL9_wp^6qVcoutk|X!F%bE_)Y3zOYf&2k<=0GVsV>$y>2xqmrWe=t≷7vMrY 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/Book4.xls b/DataAccessLayer/TestData/Files/DupFiles1/Book4.xls new file mode 100644 index 0000000000000000000000000000000000000000..cfb112881826e995231443b1ee7f543ab2130908 GIT binary patch literal 16896 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 literal 0 HcmV?d00001 diff --git a/DataAccessLayer/TestData/Files/DupFiles1/DatabaseBills.accdb b/DataAccessLayer/TestData/Files/DupFiles1/DatabaseBills.accdb new file mode 100644 index 0000000000000000000000000000000000000000..90679ba880ff0c2e7043860b0fca6d0f36af101d GIT binary patch literal 335872 zcmeI531D1TdGF7i8EHl{(v0Ldj^ia6ykxO#BgwX6C$W*Nv1}_^EX#IqFt(PFY+0L; zWG99OiG;k@Kno^)(Ds$S0Dgs**TM@+>1&{bBxEBHS|D^`D_dzBD1Fe4wx0gKbMBeB zGo#J2A}{&h(bfItEZ_Og@1D8$p7kn6skYIM!DPp9GG1G^Bc9lEW_OzMIES^4?XfBfT$Pk;OQ-|qU0??3Ty{lCBM)6L1FFWvIlKY#Bp zRy}^x5C3t^+uHvy^rq@-e)8={-hJ$H?g{p5x2AE$y(*T4UsMa4h<+jX5^-B+m8#`P7j zgc}Kv011!)36KB@kN^pg011%5To4F2|Lju^Kd)2*j+2a`2|#Z?^=Rx=Y%WR_b&voF zkN^pg011!)36KB@kN^pg013P-1b+ITso88k=UWl6XGuV*gXnXQyT;izftp9#LXUl> zE!0+~BC1Re4Upjh3PBz0vc>g(^Uun~qN_;x;aUXE3$$-P{%enr)|2rN-;l%zpc%%* zxJukqScQy7L5{})cmyOyFs;hOSOOhk@d!ikCa%;uN5{~LwN)mDq#BVJB~a##5ym&| zQ3_>V57D4KV#wlz9#NQ=zmUG}y zB}Qsh5mk`oA!+y}4SzZfqe@OgRMn{=HHc5Q>QbYsR3%ggjvcBK`v_bYx-Q)aIgIb( z>vi3)PN<~o8dmkHAM#PeTm*SY$LPiPLDdZR0mKZb-3T90jp`Iqm;XD|JQUHJr7%FVTsuvYFsjy0gu@n`pU|DmBk0`j)g8*Aba!`dM|L>fQC*1^1=}@SH9_lybYu^s zl|tGv+-_vs`@A-l3Z+s@Q>jy_lq(0oycoDbYfmkGi$?D~X=ujC>PB9X*A|kWGvJ0! zKX$fWWXdun5+DH*AOR8}0TLhq5+DH*xZ()-oG(ayQmw;KeQ#CL)Z?X6XsU&%{}-VC zF9Z5z$B1I(=!OINGW9m;xB%@TYfpHq|1un3dt_?)cC@-%{g(y;6T{ThY9oC8|EJAgQ)qQ6OXn>e=7NEbL;+5&REOo5bhEql5odi=y$ zZ#nVKhxN=UA_v?^fCNZ@1W14cNPq-LfCNb3@+IInKer>^F-u?8|Er9>6#Y=NGrBzb z=Ow>Z(p*wh@?`N?@vX)G6#2iAzQ_$Zo&J|^&S^ObkN^pg011!)36KB@OijS{iA^19 zYTxmxz3F?Q1mYK}K;qAdlDRO1I<8~_x?l4`Gk9T20?tRmlWV|=We$2@(PJAIDTKo~ z?8SFn3u_>mUy3NuJ+@jCymXJPEO(~+dgBoE;%DL`U$DbN{AEo6BbpvxIB}ax0%Pxl zwy~Cmfrf^rrq;f`o`(IceR3Yk7G%5{8~R*F$2hhnd)rN@tBgZ?vSsM78)l(#>TNyT zFmN#0*>~r`9uwAQJ$jP81IFoUVpPt$u-7hprO$wp~S@*YwtVN zXUy&!NcO^V9ejz`)3vD}XFhvMG6ZsJ+uz5z6x&IMvfy?r#_vXlS~#y|r^d zD=wQPSW9cu!S)7YYiyD*`-cw75*n&3I!S2P>H(Sl_|U{cf=0NrD|t zcJ9}DB9jE@yA$U?hX_v+VxaY;2~avofT7O5gZn#MTN+Od7@LbS0XrMs(9_V_y1zF$ z)YH^3(7Hd_d(b@#@Dqrxg}(IULfOpu*E33F5~Zw7RWds8){A4 zQR zzIHBuz0^elBtQZrKmsH{0wh2Jb4vj0jmy;k2{&ILR2r`t$6Dx<3lm19<0V62%vgfj zJ_J-y%B~UtXS{5o2$;)JcC`p-ekofd0^S`^c8v&FnxSm52$%>^cJ0`>i4_n*VikxW zu?j_ySV0jm^P(&y!Zi?zL_me8EG)uO2oVvMLns#EdI%*Vyb3~8gq09tBCLi`D#DEr z%0##s!V(cGAS@MOBZOrlY=N*`gl!P66QLG@uE|N3b!&oTS+{P8@xHM$O13h5;YI=^ zKmsH{0wh2JBtQZrKmxA}0*