Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / wpf / src / UIAutomation / Win32Providers / MS / Internal / AutomationProxies / WindowsListViewSubItem.cs / 1305600 / WindowsListViewSubItem.cs
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: Win32 ListViewSubItem proxy
//
// History:
// Jean-Francois Peyroux, alexsn - Created (in DotNet)
// 2003/08/12 - alexsn Updated for WCP
//
//---------------------------------------------------------------------------
using System;
using System.ComponentModel;
using System.Windows.Automation;
using System.Windows.Automation.Provider;
using System.Windows;
using MS.Win32;
using Accessibility;
namespace MS.Internal.AutomationProxies
{
internal class ListViewSubItem: ProxySimple, IGridItemProvider, ITableItemProvider, IValueProvider
{
// -----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
internal ListViewSubItem (IntPtr hwnd, ProxyFragment parent, int item, int itemParent)
: base (hwnd, parent, item)
{
// Is used to discriminate between items in a collection.
_itemParent = itemParent;
_cControlType = WindowsListView.ListViewEditable(hwnd) ? ControlType.Edit : ControlType.Text;
}
#endregion Constructos
//------------------------------------------------------
//
// Patterns Implementation
//
//-----------------------------------------------------
#region ProxySimple Interface
// Returns a pattern interface if supported.
internal override object GetPatternProvider (AutomationPattern iid)
{
if (iid == GridItemPattern.Pattern)
{
return this;
}
// Only the first element is editable
if (iid == ValuePattern.Pattern && _item == 0 && WindowsListView.ListViewEditable (_hwnd))
{
return this;
}
if (iid == TableItemPattern.Pattern)
{
return this;
}
return null;
}
// Gets the bounding rectangle for this element
internal override Rect BoundingRectangle
{
get
{
NativeMethods.Win32Rect itemRectangle;
// NOTE: 1st(column 0) subitem is a special one, since it is fake, Win32's LV does not
// have a subitem 0 in report mode
int lvir = (_item == 0) ? NativeMethods.LVIR_SELECTBOUNDS : NativeMethods.LVIR_BOUNDS;
if (!WindowsListView.GetSubItemRect (_hwnd, _itemParent, _item, lvir, out itemRectangle))
{
return Rect.Empty;
}
// Special case: LV is full row select, with more than 1 column and we are looking at the first item.
// Only IconViews and DetailViews are processed here. TileViews will be processed as a
// ListViewItem. The DetailView is the only view that is in a row/column layout with its data.
if (WindowsListView.FullRowSelect(_hwnd) && !WindowsListView.HasJustifyColumnsExStyle(_hwnd) &&
!WindowsListView.IsIconView(_hwnd) && _item == 0 && 1 < ListViewItem.GetSubItemCount(_hwnd))
{
NativeMethods.Win32Rect itemRectangle1;
if (!WindowsListView.GetSubItemRect(_hwnd, _itemParent, 1, NativeMethods.LVIR_BOUNDS, out itemRectangle1))
{
return Rect.Empty;
}
// Derived values from the adjacent subitems are conditional based on RTL
if (Misc.IsControlRTL(_hwnd))
{
itemRectangle.left = itemRectangle1.right;
}
else
{
itemRectangle.right = itemRectangle1.left;
}
// take checkbox into account
if (ListViewItem.IsItemWithCheckbox (_hwnd, _itemParent))
{
NativeMethods.Win32Rect checkboxRectangle = ListViewItemCheckbox.ListViewCheckBoxRect (_hwnd, _itemParent);
// Derived values from the adjacent subitems are conditional based on RTL
if (Misc.IsControlRTL(_hwnd))
{
itemRectangle.right -= (checkboxRectangle.right - checkboxRectangle.left);
}
else
{
itemRectangle.left += (checkboxRectangle.right - checkboxRectangle.left);
}
}
}
// Don't need to normalize, GetSubItemRect returns absolute coordinates.
return itemRectangle.ToRect(false);
}
}
// Process all the Logical and Raw Element Properties
internal override object GetElementProperty(AutomationProperty idProp)
{
if (idProp == AutomationElement.IsOffscreenProperty)
{
Rect parentRect = GetParent().GetParent().BoundingRectangle;
Rect itemRect = BoundingRectangle;
if (itemRect.IsEmpty || parentRect.IsEmpty)
{
return true;
}
// Need to check if this item is visible on the whole control not just its immediate parent.
if (!Misc.IsItemVisible(ref parentRect, ref itemRect))
{
return true;
}
}
else if (idProp == AutomationElement.HasKeyboardFocusProperty)
{
IAccessible acc = AccessibleObject;
// The items are zero based, i.e. the first listview item is item 0. The
// zero item in MSAA is self, so need to add one to the item to get the
// correct Accessible child.
AccessibleRole role = Accessible.GetRole(acc, _itemParent + 1);
// ListView Iaccessible knows when its really a menu item
if (role == AccessibleRole.MenuItem)
{
// Use the IsFocused of the Subitem instead the the one in ProxySimple
// When ListViews are used for menus they don't get focus
// so the check for "does this hwnd have focus" fails
return IsFocused ();
}
// If we are in a SysListView32 and that list view is in the Start Menu search column
// real focus can stay on the edit box, while a virtual focus navigates the list
// If this is the case, only check IsFocused, don't do the GetGUIThreadInfo check.
IntPtr ancestor = _hwnd;
IntPtr desktop = UnsafeNativeMethods.GetDesktopWindow();
while (ancestor != IntPtr.Zero && ancestor != desktop)
{
if (Misc.GetClassName(ancestor) == "Desktop Search Open View")
{
return IsFocused();
}
ancestor = Misc.GetParent(ancestor);
}
}
return base.GetElementProperty(idProp);
}
//Gets the controls help text
internal override string HelpText
{
get
{
return WindowsListView.GetItemToolTipText(_hwnd);
}
}
//Gets the localized name
internal override string LocalizedName
{
get
{
string name = ListViewItem.GetText(_hwnd, _itemParent, _item);
return name.Length < Misc.MaxLengthNameProperty ? name : name.Substring(0, Misc.MaxLengthNameProperty);
}
}
// Sets the focus to this item.
internal override bool SetFocus()
{
// Set the item's state to focused.
return WindowsListView.SetItemFocused (_hwnd, this._itemParent);
}
#endregion ProxySimple Interface
#region Value Pattern
void IValueProvider.SetValue (string val)
{
// Make sure that the control is enabled
if (!SafeNativeMethods.IsWindowEnabled(_hwnd))
{
throw new ElementNotEnabledException();
}
ListViewItem.SetValue (val, _hwnd, _itemParent);
}
// Request to get the value that this UI element is representing as a string
string IValueProvider.Value
{
get
{
return ListViewItem.GetText (_hwnd, _itemParent, _item);
}
}
bool IValueProvider.IsReadOnly
{
get
{
return !WindowsListView.ListViewEditable (_hwnd);
}
}
#endregion ValuePattern
#region GridItemPattern
int IGridItemProvider.Row
{
get
{
if (!WindowsListView.IsGroupViewEnabled (_hwnd))
{
return _itemParent;
}
// we're in the group mode:
// In order to detect the item's row...find the location
// of this item in the array of group items, location will indicate the raw
int groupID = ListViewItem.GetGroupID (_hwnd, _itemParent);
if (groupID != -1)
{
GroupManager.GroupInfo groupInfo = WindowsListViewGroup.GetGroupInfo (_hwnd, groupID);
if (groupInfo)
{
int row = groupInfo.IndexOf (_itemParent);
if (row >= 0)
{
return row;
}
}
}
return -1;
}
}
int IGridItemProvider.Column
{
get
{
return _item;
}
}
int IGridItemProvider.RowSpan
{
get
{
return 1;
}
}
int IGridItemProvider.ColumnSpan
{
get
{
return 1;
}
}
IRawElementProviderSimple IGridItemProvider.ContainingGrid
{
get
{
// ContainingGrid would be either Group or the ListView
// For both cases we need to skip our immediate parent
// which is ListViewItem => meaning ContainingGrid is defined as parent of the parent
return _parent._parent;
}
}
#endregion GridItemPattern
#region TableItemPattern
IRawElementProviderSimple [] ITableItemProvider.GetRowHeaderItems ()
{
return null;
}
IRawElementProviderSimple [] ITableItemProvider.GetColumnHeaderItems ()
{
IntPtr hwndHeader = WindowsListView.ListViewGetHeader (_hwnd);
if (SafeNativeMethods.IsWindowVisible (hwndHeader))
{
WindowsSysHeader header = (WindowsSysHeader) WindowsSysHeader.Create (hwndHeader, 0);
return new IRawElementProviderSimple [] { new WindowsSysHeader.HeaderItem (hwndHeader, header, _item) };
}
return null;
}
#endregion TableItemPattern
//------------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
internal static ProxySimple ElementProviderFromPoint (IntPtr hwnd, ProxyFragment parent, int item, int x, int y)
{
NativeMethods.LVHITTESTINFO_INTERNAL hitTest = WindowsListView.SubitemHitTest (hwnd, item, new NativeMethods.Win32Point (x, y));
if (hitTest.iSubItem >= 0)
{
return new ListViewSubItem (hwnd, parent, hitTest.iSubItem, item);
}
// subitems do not exist
return parent;
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
#region Protected Methods
// This routine is only called on elements belonging to an hwnd that has the focus.
protected override bool IsFocused()
{
if (Misc.IsComctrlV6OnOsVerV6orHigher(_hwnd))
{
int column = (int)Misc.ProxySendMessage(_hwnd, NativeMethods.LVM_GETFOCUSEDCOLUMN, IntPtr.Zero, IntPtr.Zero);
return column == _item;
}
return WindowsListView.IsItemFocused (_hwnd, _itemParent);
}
#endregion
//-----------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
#region Private Fields
// The item in the listview. _item is the SubItem
private int _itemParent;
#endregion Private Fields
}
}
// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
// Copyright (c) Microsoft Corporation. All rights reserved.
//----------------------------------------------------------------------------
//
//
// Copyright (C) Microsoft Corporation. All rights reserved.
//
//
//
// Description: Win32 ListViewSubItem proxy
//
// History:
// Jean-Francois Peyroux, alexsn - Created (in DotNet)
// 2003/08/12 - alexsn Updated for WCP
//
//---------------------------------------------------------------------------
using System;
using System.ComponentModel;
using System.Windows.Automation;
using System.Windows.Automation.Provider;
using System.Windows;
using MS.Win32;
using Accessibility;
namespace MS.Internal.AutomationProxies
{
internal class ListViewSubItem: ProxySimple, IGridItemProvider, ITableItemProvider, IValueProvider
{
// -----------------------------------------------------
//
// Constructors
//
//-----------------------------------------------------
#region Constructors
internal ListViewSubItem (IntPtr hwnd, ProxyFragment parent, int item, int itemParent)
: base (hwnd, parent, item)
{
// Is used to discriminate between items in a collection.
_itemParent = itemParent;
_cControlType = WindowsListView.ListViewEditable(hwnd) ? ControlType.Edit : ControlType.Text;
}
#endregion Constructos
//------------------------------------------------------
//
// Patterns Implementation
//
//-----------------------------------------------------
#region ProxySimple Interface
// Returns a pattern interface if supported.
internal override object GetPatternProvider (AutomationPattern iid)
{
if (iid == GridItemPattern.Pattern)
{
return this;
}
// Only the first element is editable
if (iid == ValuePattern.Pattern && _item == 0 && WindowsListView.ListViewEditable (_hwnd))
{
return this;
}
if (iid == TableItemPattern.Pattern)
{
return this;
}
return null;
}
// Gets the bounding rectangle for this element
internal override Rect BoundingRectangle
{
get
{
NativeMethods.Win32Rect itemRectangle;
// NOTE: 1st(column 0) subitem is a special one, since it is fake, Win32's LV does not
// have a subitem 0 in report mode
int lvir = (_item == 0) ? NativeMethods.LVIR_SELECTBOUNDS : NativeMethods.LVIR_BOUNDS;
if (!WindowsListView.GetSubItemRect (_hwnd, _itemParent, _item, lvir, out itemRectangle))
{
return Rect.Empty;
}
// Special case: LV is full row select, with more than 1 column and we are looking at the first item.
// Only IconViews and DetailViews are processed here. TileViews will be processed as a
// ListViewItem. The DetailView is the only view that is in a row/column layout with its data.
if (WindowsListView.FullRowSelect(_hwnd) && !WindowsListView.HasJustifyColumnsExStyle(_hwnd) &&
!WindowsListView.IsIconView(_hwnd) && _item == 0 && 1 < ListViewItem.GetSubItemCount(_hwnd))
{
NativeMethods.Win32Rect itemRectangle1;
if (!WindowsListView.GetSubItemRect(_hwnd, _itemParent, 1, NativeMethods.LVIR_BOUNDS, out itemRectangle1))
{
return Rect.Empty;
}
// Derived values from the adjacent subitems are conditional based on RTL
if (Misc.IsControlRTL(_hwnd))
{
itemRectangle.left = itemRectangle1.right;
}
else
{
itemRectangle.right = itemRectangle1.left;
}
// take checkbox into account
if (ListViewItem.IsItemWithCheckbox (_hwnd, _itemParent))
{
NativeMethods.Win32Rect checkboxRectangle = ListViewItemCheckbox.ListViewCheckBoxRect (_hwnd, _itemParent);
// Derived values from the adjacent subitems are conditional based on RTL
if (Misc.IsControlRTL(_hwnd))
{
itemRectangle.right -= (checkboxRectangle.right - checkboxRectangle.left);
}
else
{
itemRectangle.left += (checkboxRectangle.right - checkboxRectangle.left);
}
}
}
// Don't need to normalize, GetSubItemRect returns absolute coordinates.
return itemRectangle.ToRect(false);
}
}
// Process all the Logical and Raw Element Properties
internal override object GetElementProperty(AutomationProperty idProp)
{
if (idProp == AutomationElement.IsOffscreenProperty)
{
Rect parentRect = GetParent().GetParent().BoundingRectangle;
Rect itemRect = BoundingRectangle;
if (itemRect.IsEmpty || parentRect.IsEmpty)
{
return true;
}
// Need to check if this item is visible on the whole control not just its immediate parent.
if (!Misc.IsItemVisible(ref parentRect, ref itemRect))
{
return true;
}
}
else if (idProp == AutomationElement.HasKeyboardFocusProperty)
{
IAccessible acc = AccessibleObject;
// The items are zero based, i.e. the first listview item is item 0. The
// zero item in MSAA is self, so need to add one to the item to get the
// correct Accessible child.
AccessibleRole role = Accessible.GetRole(acc, _itemParent + 1);
// ListView Iaccessible knows when its really a menu item
if (role == AccessibleRole.MenuItem)
{
// Use the IsFocused of the Subitem instead the the one in ProxySimple
// When ListViews are used for menus they don't get focus
// so the check for "does this hwnd have focus" fails
return IsFocused ();
}
// If we are in a SysListView32 and that list view is in the Start Menu search column
// real focus can stay on the edit box, while a virtual focus navigates the list
// If this is the case, only check IsFocused, don't do the GetGUIThreadInfo check.
IntPtr ancestor = _hwnd;
IntPtr desktop = UnsafeNativeMethods.GetDesktopWindow();
while (ancestor != IntPtr.Zero && ancestor != desktop)
{
if (Misc.GetClassName(ancestor) == "Desktop Search Open View")
{
return IsFocused();
}
ancestor = Misc.GetParent(ancestor);
}
}
return base.GetElementProperty(idProp);
}
//Gets the controls help text
internal override string HelpText
{
get
{
return WindowsListView.GetItemToolTipText(_hwnd);
}
}
//Gets the localized name
internal override string LocalizedName
{
get
{
string name = ListViewItem.GetText(_hwnd, _itemParent, _item);
return name.Length < Misc.MaxLengthNameProperty ? name : name.Substring(0, Misc.MaxLengthNameProperty);
}
}
// Sets the focus to this item.
internal override bool SetFocus()
{
// Set the item's state to focused.
return WindowsListView.SetItemFocused (_hwnd, this._itemParent);
}
#endregion ProxySimple Interface
#region Value Pattern
void IValueProvider.SetValue (string val)
{
// Make sure that the control is enabled
if (!SafeNativeMethods.IsWindowEnabled(_hwnd))
{
throw new ElementNotEnabledException();
}
ListViewItem.SetValue (val, _hwnd, _itemParent);
}
// Request to get the value that this UI element is representing as a string
string IValueProvider.Value
{
get
{
return ListViewItem.GetText (_hwnd, _itemParent, _item);
}
}
bool IValueProvider.IsReadOnly
{
get
{
return !WindowsListView.ListViewEditable (_hwnd);
}
}
#endregion ValuePattern
#region GridItemPattern
int IGridItemProvider.Row
{
get
{
if (!WindowsListView.IsGroupViewEnabled (_hwnd))
{
return _itemParent;
}
// we're in the group mode:
// In order to detect the item's row...find the location
// of this item in the array of group items, location will indicate the raw
int groupID = ListViewItem.GetGroupID (_hwnd, _itemParent);
if (groupID != -1)
{
GroupManager.GroupInfo groupInfo = WindowsListViewGroup.GetGroupInfo (_hwnd, groupID);
if (groupInfo)
{
int row = groupInfo.IndexOf (_itemParent);
if (row >= 0)
{
return row;
}
}
}
return -1;
}
}
int IGridItemProvider.Column
{
get
{
return _item;
}
}
int IGridItemProvider.RowSpan
{
get
{
return 1;
}
}
int IGridItemProvider.ColumnSpan
{
get
{
return 1;
}
}
IRawElementProviderSimple IGridItemProvider.ContainingGrid
{
get
{
// ContainingGrid would be either Group or the ListView
// For both cases we need to skip our immediate parent
// which is ListViewItem => meaning ContainingGrid is defined as parent of the parent
return _parent._parent;
}
}
#endregion GridItemPattern
#region TableItemPattern
IRawElementProviderSimple [] ITableItemProvider.GetRowHeaderItems ()
{
return null;
}
IRawElementProviderSimple [] ITableItemProvider.GetColumnHeaderItems ()
{
IntPtr hwndHeader = WindowsListView.ListViewGetHeader (_hwnd);
if (SafeNativeMethods.IsWindowVisible (hwndHeader))
{
WindowsSysHeader header = (WindowsSysHeader) WindowsSysHeader.Create (hwndHeader, 0);
return new IRawElementProviderSimple [] { new WindowsSysHeader.HeaderItem (hwndHeader, header, _item) };
}
return null;
}
#endregion TableItemPattern
//------------------------------------------------------
//
// Internal Methods
//
//------------------------------------------------------
#region Internal Methods
internal static ProxySimple ElementProviderFromPoint (IntPtr hwnd, ProxyFragment parent, int item, int x, int y)
{
NativeMethods.LVHITTESTINFO_INTERNAL hitTest = WindowsListView.SubitemHitTest (hwnd, item, new NativeMethods.Win32Point (x, y));
if (hitTest.iSubItem >= 0)
{
return new ListViewSubItem (hwnd, parent, hitTest.iSubItem, item);
}
// subitems do not exist
return parent;
}
#endregion Internal Methods
//-----------------------------------------------------
//
// Protected Methods
//
//------------------------------------------------------
#region Protected Methods
// This routine is only called on elements belonging to an hwnd that has the focus.
protected override bool IsFocused()
{
if (Misc.IsComctrlV6OnOsVerV6orHigher(_hwnd))
{
int column = (int)Misc.ProxySendMessage(_hwnd, NativeMethods.LVM_GETFOCUSEDCOLUMN, IntPtr.Zero, IntPtr.Zero);
return column == _item;
}
return WindowsListView.IsItemFocused (_hwnd, _itemParent);
}
#endregion
//-----------------------------------------------------
//
// Private Fields
//
//-----------------------------------------------------
#region Private Fields
// The item in the listview. _item is the SubItem
private int _itemParent;
#endregion Private Fields
}
}
// 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
- HttpCachePolicyWrapper.cs
- Comparer.cs
- UserNamePasswordValidator.cs
- PermissionToken.cs
- TypeListConverter.cs
- SubqueryRules.cs
- PolicyVersionConverter.cs
- TraceShell.cs
- ClientProxyGenerator.cs
- SerialReceived.cs
- ColumnResizeUndoUnit.cs
- ContourSegment.cs
- HitTestDrawingContextWalker.cs
- QilStrConcat.cs
- OleDbException.cs
- HttpDebugHandler.cs
- SmiRequestExecutor.cs
- listitem.cs
- SimpleTypeResolver.cs
- ImmutableObjectAttribute.cs
- XmlTextReaderImplHelpers.cs
- QueryUtil.cs
- CodeDOMUtility.cs
- xsdvalidator.cs
- EtwTrace.cs
- InfoCardRequestException.cs
- ChangeBlockUndoRecord.cs
- PreviewPageInfo.cs
- ManagedWndProcTracker.cs
- Pair.cs
- ScalarConstant.cs
- SqlGenerator.cs
- oledbmetadatacollectionnames.cs
- LoginView.cs
- TextServicesContext.cs
- BidPrivateBase.cs
- TypeGeneratedEventArgs.cs
- QilGeneratorEnv.cs
- ObjectView.cs
- DefaultBinder.cs
- GeneralTransform.cs
- diagnosticsswitches.cs
- UpWmlMobileTextWriter.cs
- DesignerOptions.cs
- PropertyIDSet.cs
- UnionCodeGroup.cs
- ColorMap.cs
- LongPath.cs
- XmlExtensionFunction.cs
- SequenceDesigner.xaml.cs
- ShaperBuffers.cs
- ResourcePool.cs
- StreamUpdate.cs
- RootBuilder.cs
- Point3DCollectionValueSerializer.cs
- ScaleTransform3D.cs
- StylusTip.cs
- StreamWriter.cs
- FrameworkObject.cs
- ColorTranslator.cs
- ObjectSet.cs
- IISUnsafeMethods.cs
- CustomErrorCollection.cs
- ResourcesBuildProvider.cs
- CheckBoxField.cs
- ValidationPropertyAttribute.cs
- SHA512Managed.cs
- Trigger.cs
- LogicalExpr.cs
- NameValuePermission.cs
- Dictionary.cs
- DateTimeConverter2.cs
- FormsAuthenticationCredentials.cs
- OleDbConnectionPoolGroupProviderInfo.cs
- ListControlDataBindingHandler.cs
- VirtualPath.cs
- FixedPageAutomationPeer.cs
- CodeDomConfigurationHandler.cs
- Camera.cs
- ObjectItemCollection.cs
- DSACryptoServiceProvider.cs
- RootBuilder.cs
- EventDescriptorCollection.cs
- RootAction.cs
- Viewport2DVisual3D.cs
- NodeInfo.cs
- WebServiceEnumData.cs
- FrameworkTemplate.cs
- XmlAttribute.cs
- Cursor.cs
- COM2Enum.cs
- WebPartEventArgs.cs
- PrincipalPermission.cs
- ChannelServices.cs
- ConfigXmlCDataSection.cs
- SqlInternalConnectionSmi.cs
- ControlBuilder.cs
- DesignerHost.cs
- GridViewRowCollection.cs
- PageCodeDomTreeGenerator.cs