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); } } }