|
Lines 17-23
Link Here
|
| 17 |
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
17 |
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| 18 |
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
18 |
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
| 19 |
// |
19 |
// |
| 20 |
// Copyright (c) 2008 Novell, Inc. (http://www.novell.com) |
20 |
// Copyright (c) 2008,2009 Novell, Inc. (http://www.novell.com) |
| 21 |
// |
21 |
// |
| 22 |
// Authors: |
22 |
// Authors: |
| 23 |
// Mario Carrion <mcarrion@novell.com> |
23 |
// Mario Carrion <mcarrion@novell.com> |
|
Lines 48-56
namespace Mono.UIAutomation.Winforms
Link Here
|
| 48 |
public ListViewProvider (SWF.ListView listView) : base (listView) |
48 |
public ListViewProvider (SWF.ListView listView) : base (listView) |
| 49 |
{ |
49 |
{ |
| 50 |
this.listView = listView; |
50 |
this.listView = listView; |
| 51 |
|
51 |
|
| 52 |
lastView = listView.View; |
52 |
lastView = listView.InvokeSync (c => c.View); |
| 53 |
showGroups = listView.ShowGroups; |
53 |
showGroups = listView.InvokeSync (c => c.ShowGroups); |
| 54 |
groups = new Dictionary<SWF.ListViewGroup, ListViewGroupProvider> (); |
54 |
groups = new Dictionary<SWF.ListViewGroup, ListViewGroupProvider> (); |
| 55 |
} |
55 |
} |
| 56 |
|
56 |
|
|
Lines 70-81
namespace Mono.UIAutomation.Winforms
Link Here
|
| 70 |
protected override object GetProviderPropertyValue (int propertyId) |
70 |
protected override object GetProviderPropertyValue (int propertyId) |
| 71 |
{ |
71 |
{ |
| 72 |
if (propertyId == AutomationElementIdentifiers.ControlTypeProperty.Id) { |
72 |
if (propertyId == AutomationElementIdentifiers.ControlTypeProperty.Id) { |
| 73 |
if (listView.View == SWF.View.Details) |
73 |
if (listView.InvokeSync (c => c.View == SWF.View.Details)) |
| 74 |
return ControlType.DataGrid.Id; |
74 |
return ControlType.DataGrid.Id; |
| 75 |
else |
75 |
else |
| 76 |
return ControlType.List.Id; |
76 |
return ControlType.List.Id; |
| 77 |
} else if (propertyId == AutomationElementIdentifiers.LocalizedControlTypeProperty.Id) { |
77 |
} else if (propertyId == AutomationElementIdentifiers.LocalizedControlTypeProperty.Id) { |
| 78 |
if (listView.View == SWF.View.Details) |
78 |
if (listView.InvokeSync (c => c.View == SWF.View.Details)) |
| 79 |
return Catalog.GetString ("data grid"); |
79 |
return Catalog.GetString ("data grid"); |
| 80 |
else |
80 |
else |
| 81 |
return Catalog.GetString ("list"); |
81 |
return Catalog.GetString ("list"); |
|
Lines 99-111
namespace Mono.UIAutomation.Winforms
Link Here
|
| 99 |
else if (behavior == SelectionPatternIdentifiers.Pattern) |
99 |
else if (behavior == SelectionPatternIdentifiers.Pattern) |
| 100 |
return new SelectionProviderBehavior (this); |
100 |
return new SelectionProviderBehavior (this); |
| 101 |
else if (behavior == GridPatternIdentifiers.Pattern) { |
101 |
else if (behavior == GridPatternIdentifiers.Pattern) { |
| 102 |
if (listView.ShowGroups == false || SWF.Application.VisualStylesEnabled == false |
102 |
if (listView.InvokeSync (c => !c.ShowGroups |
| 103 |
|| listView.View == SWF.View.List || listView.View == SWF.View.Details) |
103 |
|| !SWF.Application.VisualStylesEnabled |
|
|
104 |
|| c.View == SWF.View.List |
| 105 |
|| c.View == SWF.View.Details)) |
| 104 |
return new GridProviderBehavior (this); |
106 |
return new GridProviderBehavior (this); |
| 105 |
else |
107 |
else |
| 106 |
return null; |
108 |
return null; |
| 107 |
} else if (behavior == TablePatternIdentifiers.Pattern) { |
109 |
} else if (behavior == TablePatternIdentifiers.Pattern) { |
| 108 |
if (listView.View == SWF.View.Details) |
110 |
if (listView.InvokeSync (c => c.View == SWF.View.Details)) |
| 109 |
return new TableProviderBehavior (this); |
111 |
return new TableProviderBehavior (this); |
| 110 |
else |
112 |
else |
| 111 |
return null; |
113 |
return null; |
|
Lines 122-146
namespace Mono.UIAutomation.Winforms
Link Here
|
| 122 |
return new ListItemSelectionItemProviderBehavior (listItem); |
124 |
return new ListItemSelectionItemProviderBehavior (listItem); |
| 123 |
else if (behavior == GridItemPatternIdentifiers.Pattern) { |
125 |
else if (behavior == GridItemPatternIdentifiers.Pattern) { |
| 124 |
// LAMESPEC: GridItem implemented *only* when: listView.View != SWF.View.Details |
126 |
// LAMESPEC: GridItem implemented *only* when: listView.View != SWF.View.Details |
| 125 |
if (listView.View != SWF.View.Details |
127 |
if (listView.InvokeSync (c => c.View != SWF.View.Details) |
| 126 |
|| IsBehaviorEnabled (GridPatternIdentifiers.Pattern)) |
128 |
|| IsBehaviorEnabled (GridPatternIdentifiers.Pattern)) |
| 127 |
return new ListItemGridItemProviderBehavior (listItem); |
129 |
return new ListItemGridItemProviderBehavior (listItem); |
| 128 |
else |
130 |
else |
| 129 |
return null; |
131 |
return null; |
| 130 |
} else if (behavior == InvokePatternIdentifiers.Pattern && Control is SWF.MWFFileView) { |
|
|
| 131 |
return new ListItemInvokeProviderBehavior (listItem); |
| 132 |
} else if (behavior == ValuePatternIdentifiers.Pattern) { |
132 |
} else if (behavior == ValuePatternIdentifiers.Pattern) { |
| 133 |
if (listView.LabelEdit == true) |
133 |
if (listView.InvokeSync (c => c.LabelEdit)) |
| 134 |
return new ListItemValueProviderBehavior (listItem); |
134 |
return new ListItemValueProviderBehavior (listItem); |
| 135 |
else |
135 |
else |
| 136 |
return null; |
136 |
return null; |
| 137 |
} else if (behavior == TogglePatternIdentifiers.Pattern) { |
137 |
} else if (behavior == TogglePatternIdentifiers.Pattern) { |
| 138 |
if (listView.CheckBoxes == true) |
138 |
if (listView.InvokeSync (c => c.CheckBoxes)) |
| 139 |
return new ListItemToggleProviderBehavior (listItem); |
139 |
return new ListItemToggleProviderBehavior (listItem); |
| 140 |
else |
140 |
else |
| 141 |
return null; |
141 |
return null; |
| 142 |
} else if (behavior == TableItemPatternIdentifiers.Pattern) { |
142 |
} else if (behavior == TableItemPatternIdentifiers.Pattern) { |
| 143 |
if (listView.View == SWF.View.Details) |
143 |
if (listView.InvokeSync (c => c.View == SWF.View.Details)) |
| 144 |
return new ListItemTableItemProviderBehavior (listItem); |
144 |
return new ListItemTableItemProviderBehavior (listItem); |
| 145 |
else |
145 |
else |
| 146 |
return null; |
146 |
return null; |
|
Lines 162-187
namespace Mono.UIAutomation.Winforms
Link Here
|
| 162 |
if (propertyId == AutomationElementIdentifiers.NameProperty.Id) |
162 |
if (propertyId == AutomationElementIdentifiers.NameProperty.Id) |
| 163 |
return ((SWF.ListViewItem) item.ObjectItem).Text; |
163 |
return ((SWF.ListViewItem) item.ObjectItem).Text; |
| 164 |
else if (propertyId == AutomationElementIdentifiers.HasKeyboardFocusProperty.Id) |
164 |
else if (propertyId == AutomationElementIdentifiers.HasKeyboardFocusProperty.Id) |
| 165 |
return listView.Focused && ((SWF.ListViewItem)item.ObjectItem).Focused; |
165 |
return listView.InvokeSync (c => c.Focused |
|
|
166 |
&& ((SWF.ListViewItem) item.ObjectItem).Focused); |
| 166 |
else if (propertyId == AutomationElementIdentifiers.BoundingRectangleProperty.Id) { |
167 |
else if (propertyId == AutomationElementIdentifiers.BoundingRectangleProperty.Id) { |
| 167 |
int index = item.Index; |
168 |
int index = item.Index; |
| 168 |
if (index == -1 || index >= listView.UIAItemsLocationLength) |
169 |
|
|
|
170 |
if (index == -1 |
| 171 |
|| listView.InvokeSync (l => index >= l.UIAItemsLocationLength)) |
| 169 |
return Helper.RectangleToRect (SD.Rectangle.Empty); |
172 |
return Helper.RectangleToRect (SD.Rectangle.Empty); |
| 170 |
|
173 |
|
| 171 |
SD.Rectangle itemRec = listView.GetItemRect (index); |
174 |
SD.Rectangle itemRec |
| 172 |
SD.Rectangle rectangle = listView.Bounds; |
175 |
= listView.InvokeSync (c => c.GetItemRect (index)); |
|
|
176 |
SD.Rectangle rectangle |
| 177 |
= listView.InvokeSync (c => c.Bounds); |
| 173 |
|
178 |
|
| 174 |
itemRec.X += rectangle.X; |
179 |
itemRec.X += rectangle.X; |
| 175 |
itemRec.Y += rectangle.Y; |
180 |
itemRec.Y += rectangle.Y; |
| 176 |
|
181 |
|
| 177 |
itemRec = listView.Parent.RectangleToScreen (itemRec); |
182 |
itemRec = listView.InvokeSync (c => c.Parent.RectangleToScreen (itemRec)); |
| 178 |
|
183 |
|
| 179 |
return Helper.RectangleToRect (itemRec); |
184 |
return Helper.RectangleToRect (itemRec); |
| 180 |
} else if (propertyId == AutomationElementIdentifiers.IsOffscreenProperty.Id) |
185 |
} else if (propertyId == AutomationElementIdentifiers.IsOffscreenProperty.Id) |
| 181 |
return Helper.IsListItemOffScreen ((Rect) item.GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id), |
186 |
return Helper.IsListItemOffScreen ((Rect) item.GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id), |
| 182 |
listView, |
187 |
listView, |
| 183 |
HeaderProvider != null, |
188 |
HeaderProvider != null, |
| 184 |
listView.UIAHeaderControl, |
189 |
listView.InvokeSync (c => c.UIAHeaderControl), |
| 185 |
ScrollBehaviorObserver); |
190 |
ScrollBehaviorObserver); |
| 186 |
else if (propertyId == AutomationElementIdentifiers.IsKeyboardFocusableProperty.Id) |
191 |
else if (propertyId == AutomationElementIdentifiers.IsKeyboardFocusableProperty.Id) |
| 187 |
return true; |
192 |
return true; |
|
Lines 221-237
namespace Mono.UIAutomation.Winforms
Link Here
|
| 221 |
} |
226 |
} |
| 222 |
|
227 |
|
| 223 |
public override int ItemsCount { |
228 |
public override int ItemsCount { |
| 224 |
get { return listView.Items.Count; } |
229 |
get { return listView.InvokeSync (c => c.Items.Count); } |
| 225 |
} |
230 |
} |
| 226 |
|
231 |
|
| 227 |
public override int IndexOfObjectItem (object objectItem) |
232 |
public override int IndexOfObjectItem (object objectItem) |
| 228 |
{ |
233 |
{ |
| 229 |
return listView.Items.IndexOf (objectItem as SWF.ListViewItem); |
234 |
return listView.InvokeSync (c => c.Items.IndexOf (objectItem as SWF.ListViewItem)); |
| 230 |
} |
235 |
} |
| 231 |
|
236 |
|
| 232 |
public override void FocusItem (object objectItem) |
237 |
public override void FocusItem (object objectItem) |
| 233 |
{ |
238 |
{ |
| 234 |
((SWF.ListViewItem)objectItem).Focused = true; |
239 |
listView.InvokeSync (delegate { |
|
|
240 |
((SWF.ListViewItem) objectItem).Focused = true; |
| 241 |
}); |
| 235 |
} |
242 |
} |
| 236 |
|
243 |
|
| 237 |
#endregion |
244 |
#endregion |
|
Lines 239-276
namespace Mono.UIAutomation.Winforms
Link Here
|
| 239 |
#region ListItem: Selection Methods and Properties |
246 |
#region ListItem: Selection Methods and Properties |
| 240 |
|
247 |
|
| 241 |
public override int SelectedItemsCount { |
248 |
public override int SelectedItemsCount { |
| 242 |
get { return listView.SelectedItems.Count; } |
249 |
get { return listView.InvokeSync (c => c.SelectedIndices.Count); } |
| 243 |
} |
250 |
} |
| 244 |
|
251 |
|
| 245 |
public override bool IsItemSelected (ListItemProvider item) |
252 |
public override bool IsItemSelected (ListItemProvider item) |
| 246 |
{ |
253 |
{ |
| 247 |
return listView.SelectedIndices.Contains (item.Index); |
254 |
return listView.InvokeSync (c => c.SelectedIndices.Contains (item.Index)); |
| 248 |
} |
255 |
} |
| 249 |
|
256 |
|
| 250 |
public override IRawElementProviderSimple[] GetSelectedItems () |
257 |
public override IRawElementProviderSimple[] GetSelectedItems () |
| 251 |
{ |
258 |
{ |
| 252 |
if (listView.SelectedIndices.Count == 0) |
259 |
if (listView == null) |
| 253 |
return new ListItemProvider [0]; |
260 |
return new ListItemProvider [0]; |
| 254 |
else { |
|
|
| 255 |
ListItemProvider []providers = new ListItemProvider [listView.SelectedItems.Count]; |
| 256 |
|
| 257 |
for (int index = 0; index < listView.SelectedItems.Count; index++) |
| 258 |
providers [index] = GetItemProviderFrom (this, listView.SelectedItems [index], false); |
| 259 |
|
261 |
|
| 260 |
return providers; |
262 |
if (listView.InvokeSync (c => c.SelectedIndices.Count == 0)) |
|
|
263 |
return new ListItemProvider [0]; |
| 264 |
else { |
| 265 |
return listView.InvokeSync (c => { |
| 266 |
ListItemProvider []providers = new ListItemProvider [c.SelectedItems.Count]; |
| 267 |
|
| 268 |
for (int index = 0; index < c.SelectedItems.Count; index++) |
| 269 |
providers [index] = GetItemProviderFrom (this, c.SelectedItems [index], false); |
| 270 |
|
| 271 |
return providers; |
| 272 |
}); |
| 261 |
} |
273 |
} |
| 262 |
} |
274 |
} |
| 263 |
|
275 |
|
| 264 |
public override void SelectItem (ListItemProvider item) |
276 |
public override void SelectItem (ListItemProvider item) |
| 265 |
{ |
277 |
{ |
| 266 |
if (ContainsItem (item) == true) |
278 |
if (ContainsItem (item) == true) |
| 267 |
listView.Items [item.Index].Selected = true; |
279 |
listView.InvokeSync (delegate { |
|
|
280 |
listView.Items [item.Index].Selected = true; |
| 281 |
}); |
| 268 |
} |
282 |
} |
| 269 |
|
283 |
|
| 270 |
public override void UnselectItem (ListItemProvider item) |
284 |
public override void UnselectItem (ListItemProvider item) |
| 271 |
{ |
285 |
{ |
| 272 |
if (ContainsItem (item) == true) |
286 |
if (ContainsItem (item) == true) |
| 273 |
listView.Items [item.Index].Selected = false; |
287 |
listView.InvokeSync (delegate { |
|
|
288 |
listView.Items [item.Index].Selected = false; |
| 289 |
}); |
| 274 |
} |
290 |
} |
| 275 |
|
291 |
|
| 276 |
#endregion |
292 |
#endregion |
|
Lines 279-300
namespace Mono.UIAutomation.Winforms
Link Here
|
| 279 |
|
295 |
|
| 280 |
public override ToggleState GetItemToggleState (ListItemProvider item) |
296 |
public override ToggleState GetItemToggleState (ListItemProvider item) |
| 281 |
{ |
297 |
{ |
| 282 |
if (listView.CheckBoxes == false || item.Index == -1) |
298 |
if (listView.InvokeSync (c => !c.CheckBoxes) |
|
|
299 |
|| item.Index == -1) |
| 283 |
return ToggleState.Indeterminate; |
300 |
return ToggleState.Indeterminate; |
| 284 |
|
301 |
|
| 285 |
if (ContainsItem (item) == true) |
302 |
if (ContainsItem (item) == true) |
| 286 |
return listView.Items [item.Index].Checked ? ToggleState.On : ToggleState.Off; |
303 |
return listView.InvokeSync (c => c.Items [item.Index].Checked) |
|
|
304 |
? ToggleState.On : ToggleState.Off; |
| 287 |
else |
305 |
else |
| 288 |
return ToggleState.Indeterminate; |
306 |
return ToggleState.Indeterminate; |
| 289 |
} |
307 |
} |
| 290 |
|
308 |
|
| 291 |
public override void ToggleItem (ListItemProvider item) |
309 |
public override void ToggleItem (ListItemProvider item) |
| 292 |
{ |
310 |
{ |
| 293 |
if (listView.CheckBoxes == false) |
311 |
if (listView.InvokeSync (c => !c.CheckBoxes)) |
| 294 |
return; |
312 |
return; |
| 295 |
|
313 |
|
| 296 |
if (ContainsItem (item) == true) |
314 |
if (ContainsItem (item) == true) |
| 297 |
listView.Items [item.Index].Checked = !listView.Items [item.Index].Checked; |
315 |
listView.InvokeSync (delegate { |
|
|
316 |
listView.Items [item.Index].Checked = !listView.Items [item.Index].Checked; |
| 317 |
}); |
| 298 |
} |
318 |
} |
| 299 |
|
319 |
|
| 300 |
#endregion |
320 |
#endregion |
|
Lines 319-331
namespace Mono.UIAutomation.Winforms
Link Here
|
| 319 |
if (ContainsItem (item) == false) |
339 |
if (ContainsItem (item) == false) |
| 320 |
return; |
340 |
return; |
| 321 |
|
341 |
|
| 322 |
// According to http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.topitem.aspx |
342 |
listView.InvokeSync(delegate { |
| 323 |
if (listView.View == SWF.View.LargeIcon |
343 |
// According to http://msdn.microsoft.com/en-us/library/system.windows.forms.listview.topitem.aspx |
| 324 |
|| listView.View == SWF.View.SmallIcon |
344 |
if (listView.View == SWF.View.LargeIcon |
| 325 |
|| listView.View == SWF.View.Tile) |
345 |
|| listView.View == SWF.View.SmallIcon |
| 326 |
return; |
346 |
|| listView.View == SWF.View.Tile) |
| 327 |
|
347 |
return; |
| 328 |
listView.TopItem = listView.Items [item.Index]; |
348 |
|
|
|
349 |
listView.TopItem = listView.Items [item.Index]; |
| 350 |
}); |
| 329 |
} |
351 |
} |
| 330 |
|
352 |
|
| 331 |
#endregion |
353 |
#endregion |
|
Lines 359-369
namespace Mono.UIAutomation.Winforms
Link Here
|
| 359 |
#region Scroll Methods and Properties |
381 |
#region Scroll Methods and Properties |
| 360 |
|
382 |
|
| 361 |
protected override SWF.ScrollBar HorizontalScrollBar { |
383 |
protected override SWF.ScrollBar HorizontalScrollBar { |
| 362 |
get { return listView.UIAHScrollBar; } |
384 |
get { return listView.InvokeSync (c => c.UIAHScrollBar); } |
| 363 |
} |
385 |
} |
| 364 |
|
386 |
|
| 365 |
protected override SWF.ScrollBar VerticalScrollBar { |
387 |
protected override SWF.ScrollBar VerticalScrollBar { |
| 366 |
get { return listView.UIAVScrollBar; } |
388 |
get { return listView.InvokeSync (c => c.UIAVScrollBar); } |
| 367 |
} |
389 |
} |
| 368 |
|
390 |
|
| 369 |
#endregion |
391 |
#endregion |
|
Lines 382-388
namespace Mono.UIAutomation.Winforms
Link Here
|
| 382 |
public SWF.ListViewGroup GetDefaultGroup () |
404 |
public SWF.ListViewGroup GetDefaultGroup () |
| 383 |
{ |
405 |
{ |
| 384 |
if (listViewNullGroup == null) |
406 |
if (listViewNullGroup == null) |
| 385 |
listViewNullGroup = listView.UIADefaultListViewGroup; |
407 |
listViewNullGroup = listView.InvokeSync (c => c.UIADefaultListViewGroup); |
| 386 |
|
408 |
|
| 387 |
return listViewNullGroup; |
409 |
return listViewNullGroup; |
| 388 |
} |
410 |
} |
|
Lines 413-419
namespace Mono.UIAutomation.Winforms
Link Here
|
| 413 |
// no Groups are added. |
435 |
// no Groups are added. |
| 414 |
|
436 |
|
| 415 |
// Using groups |
437 |
// Using groups |
| 416 |
if (showGroups == true && listView.View != SWF.View.List |
438 |
if (showGroups == true |
|
|
439 |
&& listView.InvokeSync (c => c.View != SWF.View.List) |
| 417 |
&& SWF.Application.VisualStylesEnabled == true) { |
440 |
&& SWF.Application.VisualStylesEnabled == true) { |
| 418 |
|
441 |
|
| 419 |
SWF.ListViewItem listViewItem = (SWF.ListViewItem) objectItem; |
442 |
SWF.ListViewItem listViewItem = (SWF.ListViewItem) objectItem; |
|
Lines 456-462
namespace Mono.UIAutomation.Winforms
Link Here
|
| 456 |
private void FinalizeProviderFrom (object objectItem) |
479 |
private void FinalizeProviderFrom (object objectItem) |
| 457 |
{ |
480 |
{ |
| 458 |
// Using groups |
481 |
// Using groups |
| 459 |
if (showGroups == true && listView.View != SWF.View.List |
482 |
if (showGroups == true |
|
|
483 |
&& listView.InvokeSync (c => c.View != SWF.View.List) |
| 460 |
&& SWF.Application.VisualStylesEnabled == true) { |
484 |
&& SWF.Application.VisualStylesEnabled == true) { |
| 461 |
|
485 |
|
| 462 |
SWF.ListViewItem listViewItem = (SWF.ListViewItem) objectItem; |
486 |
SWF.ListViewItem listViewItem = (SWF.ListViewItem) objectItem; |
|
Lines 485-491
namespace Mono.UIAutomation.Winforms
Link Here
|
| 485 |
|
509 |
|
| 486 |
private void UpdateChildrenStructure (bool forceUpdate) |
510 |
private void UpdateChildrenStructure (bool forceUpdate) |
| 487 |
{ |
511 |
{ |
| 488 |
bool updateView = lastView != listView.View; |
512 |
bool updateView = listView.InvokeSync (c => lastView != c.View); |
| 489 |
|
513 |
|
| 490 |
if (updateView == true || forceUpdate == true) { |
514 |
if (updateView == true || forceUpdate == true) { |
| 491 |
foreach (ListViewGroupProvider groupProvider in groups.Values) { |
515 |
foreach (ListViewGroupProvider groupProvider in groups.Values) { |
|
Lines 505-512
namespace Mono.UIAutomation.Winforms
Link Here
|
| 505 |
|
529 |
|
| 506 |
ClearItemsList (); |
530 |
ClearItemsList (); |
| 507 |
} |
531 |
} |
| 508 |
|
532 |
|
| 509 |
if (listView.View == SWF.View.Details) { |
533 |
if (listView.InvokeSync (c => c.View == SWF.View.Details)) { |
| 510 |
if (header == null) { |
534 |
if (header == null) { |
| 511 |
header = new ListViewHeaderProvider (listView); |
535 |
header = new ListViewHeaderProvider (listView); |
| 512 |
header.Initialize (); |
536 |
header.Initialize (); |
|
Lines 514-520
namespace Mono.UIAutomation.Winforms
Link Here
|
| 514 |
} |
538 |
} |
| 515 |
} |
539 |
} |
| 516 |
|
540 |
|
| 517 |
foreach (object objectItem in listView.Items) |
541 |
foreach (object objectItem |
|
|
542 |
in listView.InvokeSync (c => c.Items)) |
| 518 |
InitializeProviderFrom (objectItem); |
543 |
InitializeProviderFrom (objectItem); |
| 519 |
} |
544 |
} |
| 520 |
|
545 |
|
|
Lines 533-548
namespace Mono.UIAutomation.Winforms
Link Here
|
| 533 |
|
558 |
|
| 534 |
UpdateChildrenStructure (false); |
559 |
UpdateChildrenStructure (false); |
| 535 |
|
560 |
|
| 536 |
lastView = listView.View; |
561 |
lastView = listView.InvokeSync (c => c.View); |
| 537 |
} |
562 |
} |
| 538 |
|
563 |
|
| 539 |
private void OnUIAShowGroupsChanged (object sender, EventArgs args) |
564 |
private void OnUIAShowGroupsChanged (object sender, EventArgs args) |
| 540 |
{ |
565 |
{ |
| 541 |
bool oldValue = showGroups; |
566 |
bool oldValue = showGroups; |
| 542 |
showGroups = listView.ShowGroups; |
567 |
showGroups = listView.InvokeSync (c => c.ShowGroups); |
| 543 |
|
568 |
|
| 544 |
//We will have to regenerate children |
569 |
//We will have to regenerate children |
| 545 |
if (listView.ShowGroups != oldValue && listView.View != SWF.View.List) { |
570 |
if (listView.InvokeSync (c => c.ShowGroups != oldValue |
|
|
571 |
&& c.View != SWF.View.List)) { |
| 546 |
UpdateChildrenStructure (true); |
572 |
UpdateChildrenStructure (true); |
| 547 |
if (SWF.Application.VisualStylesEnabled == true) |
573 |
if (SWF.Application.VisualStylesEnabled == true) |
| 548 |
SetBehavior (GridPatternIdentifiers.Pattern, |
574 |
SetBehavior (GridPatternIdentifiers.Pattern, |
|
Lines 664-682
namespace Mono.UIAutomation.Winforms
Link Here
|
| 664 |
|
690 |
|
| 665 |
private Rect HeaderRectangle { |
691 |
private Rect HeaderRectangle { |
| 666 |
get { |
692 |
get { |
| 667 |
// Lets Union the Header Bounds |
693 |
return listView.InvokeSync (c => { |
| 668 |
SD.Rectangle headerRec = listView.UIAGetHeaderBounds (group); |
694 |
// Lets Union the Header Bounds |
| 669 |
SD.Rectangle rectangle = listView.Bounds; |
695 |
SD.Rectangle headerRec = c.UIAGetHeaderBounds (group); |
| 670 |
|
696 |
SD.Rectangle rectangle = c.Bounds; |
| 671 |
headerRec.X += rectangle.X; |
697 |
|
| 672 |
headerRec.Y += rectangle.Y; |
698 |
headerRec.X += rectangle.X; |
| 673 |
|
699 |
headerRec.Y += rectangle.Y; |
| 674 |
if (listView.FindForm () == listView.Parent) |
700 |
|
| 675 |
headerRec = listView.TopLevelControl.RectangleToScreen (headerRec); |
701 |
if (c.FindForm () == c.Parent) |
| 676 |
else |
702 |
headerRec = c.TopLevelControl.RectangleToScreen (headerRec); |
| 677 |
headerRec = listView.Parent.RectangleToScreen (headerRec); |
703 |
else |
| 678 |
|
704 |
headerRec = c.Parent.RectangleToScreen (headerRec); |
| 679 |
return Helper.RectangleToRect (headerRec); |
705 |
|
|
|
706 |
return Helper.RectangleToRect (headerRec); |
| 707 |
}); |
| 680 |
} |
708 |
} |
| 681 |
} |
709 |
} |
| 682 |
|
710 |
|
|
Lines 780-806
namespace Mono.UIAutomation.Winforms
Link Here
|
| 780 |
public override void InitializeChildControlStructure () |
808 |
public override void InitializeChildControlStructure () |
| 781 |
{ |
809 |
{ |
| 782 |
base.InitializeChildControlStructure (); |
810 |
base.InitializeChildControlStructure (); |
| 783 |
|
811 |
|
| 784 |
//Event used to update columns in ListItem when View.Details |
812 |
listView.InvokeSync (delegate { |
| 785 |
listView.Columns.UIACollectionChanged += OnUIAColumnsCollectionChanged; |
813 |
//Event used to update columns in ListItem when View.Details |
| 786 |
|
814 |
listView.Columns.UIACollectionChanged += OnUIAColumnsCollectionChanged; |
| 787 |
foreach (SWF.ColumnHeader column in listView.Columns) { |
815 |
|
| 788 |
ListViewHeaderItemProvider item |
816 |
foreach (SWF.ColumnHeader column in listView.Columns) { |
| 789 |
= new ListViewHeaderItemProvider (this, column); |
817 |
ListViewHeaderItemProvider item |
| 790 |
item.Initialize (); |
818 |
= new ListViewHeaderItemProvider (this, column); |
| 791 |
AddChildProvider (item); |
819 |
item.Initialize (); |
| 792 |
headerItems [column] = item; |
820 |
AddChildProvider (item); |
| 793 |
} |
821 |
headerItems [column] = item; |
|
|
822 |
} |
| 823 |
}); |
| 794 |
} |
824 |
} |
| 795 |
|
825 |
|
| 796 |
public override void FinalizeChildControlStructure () |
826 |
public override void FinalizeChildControlStructure () |
| 797 |
{ |
827 |
{ |
| 798 |
base.FinalizeChildControlStructure (); |
828 |
base.FinalizeChildControlStructure (); |
|
|
829 |
|
| 830 |
listView.InvokeSync (delegate { |
| 831 |
//Event used to update columns in ListItem when View.Details |
| 832 |
listView.Columns.UIACollectionChanged -= OnUIAColumnsCollectionChanged; |
| 833 |
}); |
| 799 |
|
834 |
|
| 800 |
//Event used to update columns in ListItem when View.Details |
835 |
foreach (ListViewHeaderItemProvider item in headerItems.Values) |
| 801 |
listView.Columns.UIACollectionChanged -= OnUIAColumnsCollectionChanged; |
|
|
| 802 |
|
| 803 |
foreach (ListViewHeaderItemProvider item in headerItems .Values) |
| 804 |
item.Terminate (); |
836 |
item.Terminate (); |
| 805 |
} |
837 |
} |
| 806 |
|
838 |
|
|
Lines 899-916
namespace Mono.UIAutomation.Winforms
Link Here
|
| 899 |
else if (propertyId == AutomationElementIdentifiers.IsEnabledProperty.Id) |
931 |
else if (propertyId == AutomationElementIdentifiers.IsEnabledProperty.Id) |
| 900 |
return true; |
932 |
return true; |
| 901 |
else if (propertyId == AutomationElementIdentifiers.BoundingRectangleProperty.Id) { |
933 |
else if (propertyId == AutomationElementIdentifiers.BoundingRectangleProperty.Id) { |
| 902 |
int indexOf = headerProvider.ListView.Columns.IndexOf (columnHeader); |
934 |
return headerProvider.ListView.InvokeSync (c => { |
| 903 |
Rect headerBounds |
935 |
int indexOf = c.Columns.IndexOf (columnHeader); |
| 904 |
= (Rect) headerProvider.GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id); |
936 |
Rect headerBounds |
| 905 |
if (headerBounds.IsEmpty) |
937 |
= (Rect) headerProvider.GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id); |
|
|
938 |
if (headerBounds.IsEmpty) |
| 939 |
return headerBounds; |
| 940 |
|
| 941 |
for (int index = 0; index < indexOf; index++) |
| 942 |
headerBounds.X += c.Columns [index].Width; |
| 943 |
|
| 944 |
headerBounds.Width = c.Columns [indexOf].Width; |
| 945 |
|
| 906 |
return headerBounds; |
946 |
return headerBounds; |
| 907 |
|
947 |
}); |
| 908 |
for (int index = 0; index < indexOf; index++) |
|
|
| 909 |
headerBounds.X += headerProvider.ListView.Columns [index].Width; |
| 910 |
|
| 911 |
headerBounds.Width = headerProvider.ListView.Columns [indexOf].Width; |
| 912 |
|
| 913 |
return headerBounds; |
| 914 |
} else if (propertyId == AutomationElementIdentifiers.IsOffscreenProperty.Id) { |
948 |
} else if (propertyId == AutomationElementIdentifiers.IsOffscreenProperty.Id) { |
| 915 |
Rect bounds |
949 |
Rect bounds |
| 916 |
= (Rect) GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id); |
950 |
= (Rect) GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id); |
|
Lines 960-970
namespace Mono.UIAutomation.Winforms
Link Here
|
| 960 |
|
994 |
|
| 961 |
public ListViewListItemEditProvider GetEditProviderAtColumn (int column) |
995 |
public ListViewListItemEditProvider GetEditProviderAtColumn (int column) |
| 962 |
{ |
996 |
{ |
| 963 |
if (column < 0 || column >= listView.Columns.Count) |
997 |
if (column < 0 |
|
|
998 |
|| listView.InvokeSync (c => column >= c.Columns.Count)) |
| 964 |
return null; |
999 |
return null; |
| 965 |
|
1000 |
|
| 966 |
ListViewListItemEditProvider editProvider = null; |
1001 |
ListViewListItemEditProvider editProvider = null; |
| 967 |
providers.TryGetValue (listView.Columns [column], out editProvider); |
1002 |
providers.TryGetValue (listView.InvokeSync (c => c.Columns [column]), |
|
|
1003 |
out editProvider); |
| 968 |
|
1004 |
|
| 969 |
return editProvider; |
1005 |
return editProvider; |
| 970 |
} |
1006 |
} |
|
Lines 975-981
namespace Mono.UIAutomation.Winforms
Link Here
|
| 975 |
|
1011 |
|
| 976 |
protected override object GetProviderPropertyValue (int propertyId) |
1012 |
protected override object GetProviderPropertyValue (int propertyId) |
| 977 |
{ |
1013 |
{ |
| 978 |
if (ListView.View == SWF.View.Details) { |
1014 |
if (ListView.InvokeSync (c => c.View == SWF.View.Details)) { |
| 979 |
//According to: http://msdn.microsoft.com/en-us/library/ms742561.aspx |
1015 |
//According to: http://msdn.microsoft.com/en-us/library/ms742561.aspx |
| 980 |
if (propertyId == AutomationElementIdentifiers.ControlTypeProperty.Id) |
1016 |
if (propertyId == AutomationElementIdentifiers.ControlTypeProperty.Id) |
| 981 |
return ControlType.DataItem.Id; |
1017 |
return ControlType.DataItem.Id; |
|
Lines 1013-1019
namespace Mono.UIAutomation.Winforms
Link Here
|
| 1013 |
if (lastView == SWF.View.Details) |
1049 |
if (lastView == SWF.View.Details) |
| 1014 |
AddEditChildren (); |
1050 |
AddEditChildren (); |
| 1015 |
|
1051 |
|
| 1016 |
if (listView.CheckBoxes == true) { |
1052 |
if (listView.InvokeSync (c => c.CheckBoxes)) { |
| 1017 |
checkboxProvider = new ListViewListItemCheckBoxProvider (this); |
1053 |
checkboxProvider = new ListViewListItemCheckBoxProvider (this); |
| 1018 |
checkboxProvider.Initialize (); |
1054 |
checkboxProvider.Initialize (); |
| 1019 |
AddChildProvider (checkboxProvider); |
1055 |
AddChildProvider (checkboxProvider); |
|
Lines 1036-1042
namespace Mono.UIAutomation.Winforms
Link Here
|
| 1036 |
|
1072 |
|
| 1037 |
private void AddEditChildren () |
1073 |
private void AddEditChildren () |
| 1038 |
{ |
1074 |
{ |
| 1039 |
foreach (SWF.ColumnHeader column in listView.Columns) { |
1075 |
foreach (SWF.ColumnHeader column |
|
|
1076 |
in listView.InvokeSync (c => c.Columns)) { |
| 1040 |
ListViewListItemEditProvider editProvider |
1077 |
ListViewListItemEditProvider editProvider |
| 1041 |
= new ListViewListItemEditProvider (column, this); |
1078 |
= new ListViewListItemEditProvider (column, this); |
| 1042 |
editProvider.Initialize (); |
1079 |
editProvider.Initialize (); |
|
Lines 1072-1087
namespace Mono.UIAutomation.Winforms
Link Here
|
| 1072 |
if (lastView == SWF.View.Details) { |
1109 |
if (lastView == SWF.View.Details) { |
| 1073 |
providers.Clear (); |
1110 |
providers.Clear (); |
| 1074 |
OnNavigationChildrenCleared (); |
1111 |
OnNavigationChildrenCleared (); |
| 1075 |
} else if (listView.View == SWF.View.Details) |
1112 |
} else if (listView.InvokeSync (c => c.View == SWF.View.Details)) |
| 1076 |
AddEditChildren (); |
1113 |
AddEditChildren (); |
| 1077 |
|
1114 |
|
| 1078 |
lastView = listView.View; |
1115 |
lastView = listView.InvokeSync (c => c.View); |
| 1079 |
} |
1116 |
} |
| 1080 |
|
1117 |
|
| 1081 |
private void OnUIAColumnsCollectionChanged (object sender, |
1118 |
private void OnUIAColumnsCollectionChanged (object sender, |
| 1082 |
CollectionChangeEventArgs args) |
1119 |
CollectionChangeEventArgs args) |
| 1083 |
{ |
1120 |
{ |
| 1084 |
if (listView.View != SWF.View.Details) |
1121 |
if (listView.InvokeSync (c => c.View != SWF.View.Details)) |
| 1085 |
return; |
1122 |
return; |
| 1086 |
|
1123 |
|
| 1087 |
SWF.ColumnHeader column = (SWF.ColumnHeader) args.Element; |
1124 |
SWF.ColumnHeader column = (SWF.ColumnHeader) args.Element; |
|
Lines 1188-1194
namespace Mono.UIAutomation.Winforms
Link Here
|
| 1188 |
IValueProvider valueProvider = (IValueProvider) GetBehavior (ValuePatternIdentifiers.Pattern); |
1225 |
IValueProvider valueProvider = (IValueProvider) GetBehavior (ValuePatternIdentifiers.Pattern); |
| 1189 |
return valueProvider.Value; |
1226 |
return valueProvider.Value; |
| 1190 |
} else if (propertyId == AutomationElementIdentifiers.IsKeyboardFocusableProperty.Id) |
1227 |
} else if (propertyId == AutomationElementIdentifiers.IsKeyboardFocusableProperty.Id) |
| 1191 |
return IsFirstColumn || itemProvider.ListView.FullRowSelect; |
1228 |
return IsFirstColumn || itemProvider.ListView.InvokeSync (c => c.FullRowSelect); |
| 1192 |
else if (propertyId == AutomationElementIdentifiers.HasKeyboardFocusProperty.Id) { |
1229 |
else if (propertyId == AutomationElementIdentifiers.HasKeyboardFocusProperty.Id) { |
| 1193 |
if (IsFirstColumn) |
1230 |
if (IsFirstColumn) |
| 1194 |
return itemProvider.GetPropertyValue (propertyId); |
1231 |
return itemProvider.GetPropertyValue (propertyId); |
|
Lines 1199-1221
namespace Mono.UIAutomation.Winforms
Link Here
|
| 1199 |
else if (propertyId == AutomationElementIdentifiers.LabeledByProperty.Id) |
1236 |
else if (propertyId == AutomationElementIdentifiers.LabeledByProperty.Id) |
| 1200 |
return null; |
1237 |
return null; |
| 1201 |
else if (propertyId == AutomationElementIdentifiers.HelpTextProperty.Id) { |
1238 |
else if (propertyId == AutomationElementIdentifiers.HelpTextProperty.Id) { |
| 1202 |
if (ItemProvider.ListView.Columns.Count == 0 || ItemProvider.ListView.Columns [0] == header) |
1239 |
if (itemProvider.ListView.InvokeSync (c => c.Columns.Count == 0 |
|
|
1240 |
|| c.Columns [0] == header)) |
| 1203 |
return string.Empty; |
1241 |
return string.Empty; |
| 1204 |
else |
1242 |
else |
| 1205 |
return itemProvider.ListViewItem.ToolTipText; |
1243 |
return itemProvider.ListViewItem.ToolTipText; |
| 1206 |
} else if (propertyId == AutomationElementIdentifiers.BoundingRectangleProperty.Id) { |
1244 |
} else if (propertyId == AutomationElementIdentifiers.BoundingRectangleProperty.Id) { |
| 1207 |
int indexOf = itemProvider.ListView.Columns.IndexOf (header); |
1245 |
return itemProvider.ListView.InvokeSync (c => { |
| 1208 |
Rect itemBounds |
1246 |
int indexOf = c.Columns.IndexOf (header); |
| 1209 |
= (Rect) itemProvider.GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id); |
1247 |
Rect itemBounds |
| 1210 |
if (itemBounds.IsEmpty) |
1248 |
= (Rect) itemProvider.GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id); |
|
|
1249 |
if (itemBounds.IsEmpty) |
| 1250 |
return itemBounds; |
| 1251 |
|
| 1252 |
for (int index = 0; index < indexOf; index++) |
| 1253 |
itemBounds.X += c.Columns [index].Width; |
| 1254 |
|
| 1255 |
itemBounds.Width = c.Columns [indexOf].Width; |
| 1256 |
|
| 1211 |
return itemBounds; |
1257 |
return itemBounds; |
| 1212 |
|
1258 |
}); |
| 1213 |
for (int index = 0; index < indexOf; index++) |
|
|
| 1214 |
itemBounds.X += itemProvider.ListView.Columns [index].Width; |
| 1215 |
|
| 1216 |
itemBounds.Width = itemProvider.ListView.Columns [indexOf].Width; |
| 1217 |
|
| 1218 |
return itemBounds; |
| 1219 |
} else if (propertyId == AutomationElementIdentifiers.IsOffscreenProperty.Id) |
1259 |
} else if (propertyId == AutomationElementIdentifiers.IsOffscreenProperty.Id) |
| 1220 |
return Helper.IsListItemOffScreen ((Rect) GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id), |
1260 |
return Helper.IsListItemOffScreen ((Rect) GetPropertyValue (AutomationElementIdentifiers.BoundingRectangleProperty.Id), |
| 1221 |
ItemProvider.ListView, |
1261 |
ItemProvider.ListView, |