Code:
/ DotNET / DotNET / 8.0 / untmp / whidbey / REDBITS / ndp / fx / src / WinForms / Managed / System / WinForms / WebBrowserContainer.cs / 1 / WebBrowserContainer.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //----------------------------------------------------------------------------- using System.Runtime.InteropServices; using System.ComponentModel; using System.Diagnostics; using System; using System.Reflection; using System.Globalization; using System.Security.Permissions; using System.Collections; using System.Drawing; using System.Windows.Forms.Design; using System.ComponentModel.Design; using System.Security; namespace System.Windows.Forms { internal class WebBrowserContainer : UnsafeNativeMethods.IOleContainer, UnsafeNativeMethods.IOleInPlaceFrame { // // Private fields: // private WebBrowserBase parent; private IContainer assocContainer; // associated IContainer... // the assocContainer may be null, in which case all this container does is // forward [de]activation messages to the requisite container... private WebBrowserBase siteUIActive; private WebBrowserBase siteActive; private Hashtable containerCache = new Hashtable(); // name -> Control private Hashtable components = null; // Control -> any private WebBrowserBase ctlInEditMode = null; internal WebBrowserContainer(WebBrowserBase parent) { this.parent = parent; } // // IOleContainer methods: // int UnsafeNativeMethods.IOleContainer.ParseDisplayName(Object pbc, string pszDisplayName, int[] pchEaten, Object[] ppmkOut) { if (ppmkOut != null) ppmkOut[0] = null; return NativeMethods.E_NOTIMPL; } int UnsafeNativeMethods.IOleContainer.EnumObjects(int grfFlags, out UnsafeNativeMethods.IEnumUnknown ppenum) { ppenum = null; if ((grfFlags & 1) != 0) { // 1 == OLECONTF_EMBEDDINGS Debug.Assert(parent != null, "gotta have it..."); ArrayList list = new ArrayList(); ListAXControls(list, true); if (list.Count > 0) { Object[] temp = new Object[list.Count]; list.CopyTo(temp, 0); ppenum = new AxHost.EnumUnknown(temp); return NativeMethods.S_OK; } } ppenum = new AxHost.EnumUnknown(null); return NativeMethods.S_OK; } int UnsafeNativeMethods.IOleContainer.LockContainer(bool fLock) { return NativeMethods.E_NOTIMPL; } // // IOleInPlaceFrame methods: // IntPtr UnsafeNativeMethods.IOleInPlaceFrame.GetWindow() { return parent.Handle; } int UnsafeNativeMethods.IOleInPlaceFrame.ContextSensitiveHelp(int fEnterMode) { return NativeMethods.S_OK; } int UnsafeNativeMethods.IOleInPlaceFrame.GetBorder(NativeMethods.COMRECT lprectBorder) { return NativeMethods.E_NOTIMPL; } int UnsafeNativeMethods.IOleInPlaceFrame.RequestBorderSpace(NativeMethods.COMRECT pborderwidths) { return NativeMethods.E_NOTIMPL; } int UnsafeNativeMethods.IOleInPlaceFrame.SetBorderSpace(NativeMethods.COMRECT pborderwidths) { return NativeMethods.E_NOTIMPL; } int UnsafeNativeMethods.IOleInPlaceFrame.SetActiveObject(UnsafeNativeMethods.IOleInPlaceActiveObject pActiveObject, string pszObjName) { if (pActiveObject == null) { if (ctlInEditMode != null) { ctlInEditMode.SetEditMode(WebBrowserHelper.AXEditMode.None); ctlInEditMode = null; } return NativeMethods.S_OK; } WebBrowserBase ctl = null; UnsafeNativeMethods.IOleObject oleObject = pActiveObject as UnsafeNativeMethods.IOleObject; if (oleObject != null) { UnsafeNativeMethods.IOleClientSite clientSite = null; try { clientSite = oleObject.GetClientSite(); WebBrowserSiteBase webBrowserSiteBase = clientSite as WebBrowserSiteBase; if (webBrowserSiteBase != null) { ctl = webBrowserSiteBase.GetAXHost(); } } catch (COMException t) { Debug.Fail(t.ToString()); } if (ctlInEditMode != null) { Debug.Fail("control " + ctlInEditMode.ToString() + " did not reset its edit mode to null"); ctlInEditMode.SetSelectionStyle(WebBrowserHelper.SelectionStyle.Selected); ctlInEditMode.SetEditMode(WebBrowserHelper.AXEditMode.None); } if (ctl == null) { ctlInEditMode = null; } else { if (!ctl.IsUserMode) { ctlInEditMode = ctl; ctl.SetEditMode(WebBrowserHelper.AXEditMode.Object); ctl.AddSelectionHandler(); ctl.SetSelectionStyle(WebBrowserHelper.SelectionStyle.Active); } } } return NativeMethods.S_OK; } int UnsafeNativeMethods.IOleInPlaceFrame.InsertMenus(IntPtr hmenuShared, NativeMethods.tagOleMenuGroupWidths lpMenuWidths) { return NativeMethods.S_OK; } int UnsafeNativeMethods.IOleInPlaceFrame.SetMenu(IntPtr hmenuShared, IntPtr holemenu, IntPtr hwndActiveObject) { return NativeMethods.E_NOTIMPL; } int UnsafeNativeMethods.IOleInPlaceFrame.RemoveMenus(IntPtr hmenuShared) { return NativeMethods.E_NOTIMPL; } int UnsafeNativeMethods.IOleInPlaceFrame.SetStatusText(string pszStatusText) { return NativeMethods.E_NOTIMPL; } int UnsafeNativeMethods.IOleInPlaceFrame.EnableModeless(bool fEnable) { return NativeMethods.E_NOTIMPL; } int UnsafeNativeMethods.IOleInPlaceFrame.TranslateAccelerator(ref NativeMethods.MSG lpmsg, short wID) { return NativeMethods.S_FALSE; } // // Private helper methods: // private void ListAXControls(ArrayList list, bool fuseOcx) { Hashtable components = GetComponents(); if (components == null) { return; } Control[] ctls = new Control[components.Keys.Count]; components.Keys.CopyTo(ctls, 0); if (ctls != null) { for (int i = 0; i < ctls.Length; i++) { Control ctl = ctls[i]; WebBrowserBase webBrowserBase = ctl as WebBrowserBase; if (webBrowserBase != null) { if (fuseOcx) { object ax = webBrowserBase.activeXInstance; if (ax != null) { list.Add(ax); } } else { list.Add(ctl); } } } } } private Hashtable GetComponents() { return GetComponents(GetParentsContainer()); } private IContainer GetParentsContainer() { // IContainer rval = GetParentIContainer(); Debug.Assert(rval == null || assocContainer == null || rval == assocContainer, "mismatch between getIPD & aContainer"); return rval == null ? assocContainer : rval; } private IContainer GetParentIContainer() { ISite site = parent.Site; if (site != null && site.DesignMode) return site.Container; return null; } private Hashtable GetComponents(IContainer cont) { FillComponentsTable(cont); return components; } private void FillComponentsTable(IContainer container) { if (container != null) { ComponentCollection comps = container.Components; if (comps != null) { components = new Hashtable(); foreach (IComponent comp in comps) { if (comp is Control && comp != parent && comp.Site != null) { components.Add(comp, comp); } } return; } } Debug.Assert(parent.Site == null, "Parent is sited but we could not find IContainer!!!"); bool checkHashTable = true; Control[] ctls = new Control[containerCache.Values.Count]; containerCache.Values.CopyTo(ctls, 0); if (ctls != null) { if (ctls.Length > 0 && components == null) { components = new Hashtable(); checkHashTable = false; } for (int i = 0; i < ctls.Length; i ++) { if (checkHashTable && !components.Contains(ctls[i])) { components.Add(ctls[i], ctls[i]); } } } GetAllChildren(this.parent); } private void GetAllChildren(Control ctl) { if (ctl == null) return; if (components == null) { components = new Hashtable(); } if (ctl != this.parent && !components.Contains(ctl)) components.Add(ctl, ctl); foreach(Control c in ctl.Controls) { GetAllChildren(c); } } private bool RegisterControl(WebBrowserBase ctl) { ISite site = ctl.Site; if (site != null) { IContainer cont = site.Container; if (cont != null) { if (assocContainer != null) { return cont == assocContainer; } else { assocContainer = cont; IComponentChangeService ccs = (IComponentChangeService)site.GetService(typeof(IComponentChangeService)); if (ccs != null) { ccs.ComponentRemoved += new ComponentEventHandler(this.OnComponentRemoved); } return true; } } } return false; } private void OnComponentRemoved(object sender, ComponentEventArgs e) { Control c = e.Component as Control; if (sender == assocContainer && c != null) { RemoveControl(c); } } // // Internal helper methods: // internal void AddControl(Control ctl) { if (containerCache.Contains(ctl)) throw new ArgumentException(SR.GetString(SR.AXDuplicateControl, GetNameForControl(ctl)), "ctl"); containerCache.Add(ctl, ctl); if (assocContainer == null) { ISite site = ctl.Site; if (site != null) { assocContainer = site.Container; IComponentChangeService ccs = (IComponentChangeService)site.GetService(typeof(IComponentChangeService)); if (ccs != null) { ccs.ComponentRemoved += new ComponentEventHandler(this.OnComponentRemoved); } } } } internal void RemoveControl(Control ctl) { //ctl may not be in containerCache: Remove is a no-op if it's not there. containerCache.Remove(ctl); } internal static WebBrowserContainer FindContainerForControl(WebBrowserBase ctl) { if (ctl != null) { if (ctl.container != null) { return ctl.container; } ScrollableControl f = ctl.ContainingControl; if (f != null) { WebBrowserContainer container = ctl.CreateWebBrowserContainer(); if (container.RegisterControl(ctl)) { container.AddControl(ctl); return container; } } } return null; } internal string GetNameForControl(Control ctl) { string name = (ctl.Site != null) ? ctl.Site.Name : ctl.Name; return name ?? ""; } internal void OnUIActivate(WebBrowserBase site) { // The ShDocVw control repeatedly calls OnUIActivate() with the same // site. This causes the assert below to fire. // if (siteUIActive == site) return; if (siteUIActive != null && siteUIActive != site) { WebBrowserBase tempSite = siteUIActive; tempSite.AXInPlaceObject.UIDeactivate(); } site.AddSelectionHandler(); Debug.Assert(siteUIActive == null, "Object did not call OnUIDeactivate"); siteUIActive = site; ContainerControl f = site.ContainingControl; if (f != null && f.Contains(site)) { f.SetActiveControlInternal(site); } } internal void OnUIDeactivate(WebBrowserBase site) { #if DEBUG if (siteUIActive != null) { Debug.Assert(siteUIActive == site, "deactivating when not active..."); } #endif // DEBUG siteUIActive = null; site.RemoveSelectionHandler(); site.SetSelectionStyle(WebBrowserHelper.SelectionStyle.Selected); site.SetEditMode(WebBrowserHelper.AXEditMode.None); } internal void OnInPlaceDeactivate(WebBrowserBase site) { if (siteActive == site) { siteActive = null; ContainerControl parentContainer = parent.FindContainerControlInternal(); if (parentContainer != null) { parentContainer.SetActiveControlInternal(null); } } } internal void OnExitEditMode(WebBrowserBase ctl) { Debug.Assert(ctlInEditMode == null || ctlInEditMode == ctl, "who is exiting edit mode?"); if (ctlInEditMode == ctl) { ctlInEditMode = null; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EncodingDataItem.cs
- PropertySegmentSerializationProvider.cs
- QueryOutputWriterV1.cs
- ClientUtils.cs
- NamespaceDecl.cs
- CodeNamespaceImportCollection.cs
- ExtendedPropertyInfo.cs
- UriSection.cs
- FrameDimension.cs
- SqlUdtInfo.cs
- DBSqlParserTable.cs
- WindowsUpDown.cs
- ArgIterator.cs
- SplitterDesigner.cs
- PasswordBox.cs
- ClientSideQueueItem.cs
- SendMessageChannelCache.cs
- CodeChecksumPragma.cs
- MaskDescriptors.cs
- InputLanguage.cs
- x509store.cs
- SchemaTableColumn.cs
- GeneralTransform3DTo2D.cs
- TransformPattern.cs
- WebRequestModuleElementCollection.cs
- FusionWrap.cs
- FlatButtonAppearance.cs
- XpsPackagingPolicy.cs
- OrderedEnumerableRowCollection.cs
- GPPOINT.cs
- NamedPipeActivation.cs
- HtmlControl.cs
- PropertyEntry.cs
- InputScope.cs
- EnumDataContract.cs
- ToolBarOverflowPanel.cs
- reliableinputsessionchannel.cs
- BoundColumn.cs
- ReceiveSecurityHeader.cs
- HasCopySemanticsAttribute.cs
- SelectionItemPattern.cs
- DataGridViewSelectedCellCollection.cs
- EntityContainerEmitter.cs
- MetaModel.cs
- IfAction.cs
- SimpleWorkerRequest.cs
- StateRuntime.cs
- EventLogEntryCollection.cs
- ResXDataNode.cs
- FontSource.cs
- TableSectionStyle.cs
- SchemaImporterExtensionsSection.cs
- CurrentTimeZone.cs
- InputLanguageEventArgs.cs
- MultiBinding.cs
- Drawing.cs
- MetadataFile.cs
- NotificationContext.cs
- Function.cs
- SingleAnimation.cs
- EntitySetBaseCollection.cs
- TemplateKeyConverter.cs
- RegexEditorDialog.cs
- SqlCacheDependency.cs
- UnmanagedMemoryAccessor.cs
- Component.cs
- Image.cs
- ActiveDocumentEvent.cs
- ComponentCodeDomSerializer.cs
- Cloud.cs
- BamlTreeMap.cs
- EventProviderWriter.cs
- ButtonBase.cs
- MLangCodePageEncoding.cs
- figurelength.cs
- ExtensionQuery.cs
- X509UI.cs
- HashMembershipCondition.cs
- CodeAttributeDeclaration.cs
- PropertiesTab.cs
- DataGridColumnHeaderCollection.cs
- metadatamappinghashervisitor.hashsourcebuilder.cs
- WpfSharedXamlSchemaContext.cs
- Point3DAnimationUsingKeyFrames.cs
- Query.cs
- SoapServerMessage.cs
- Int16Converter.cs
- SortQuery.cs
- Utils.cs
- BitmapSource.cs
- PiiTraceSource.cs
- PKCS1MaskGenerationMethod.cs
- DummyDataSource.cs
- DataGridViewButtonCell.cs
- MessageQueueInstaller.cs
- UseLicense.cs
- PieceDirectory.cs
- FixedBufferAttribute.cs
- CacheRequest.cs
- FacetChecker.cs