# encoding: ascii
# api: powershell
# title: Format-PoshTable
# description: Format-PoshTable puts the output in a WPF DataGrid (inline in PoshConsole, popup otherwise)
# version: 0.1
# type: function
# author: Joel Bennett
# license: CC0
# function: Format-PoshTable
# x-poshcode-id: 1699
# x-archived: 2011-11-16T10:09:36
# x-published: 2011-03-13T12:02:00
#
#
function Format-PoshTable {
#.Synopsis
#  Format-PoshTable puts the output in a WPF DataGrid (inline in PoshConsole)
#.Description 
#  Outputs a WPF datagrid of the objects (and properties) specified. 
#  This grid can be sorted, rearranged, etc
	[CmdletBinding()]
	param(
      [parameter(ValueFromPipeline=$true)]
      [Array]$InputObject
   ,
      [Parameter(Position=1)]
      [String[]]$Property = "*"
   ,
      [Parameter(Position=2)][Alias("Type")]
      [Type]$BaseType # a type to use as the generic in the collection
   ,
      [Parameter()]
      [Switch]$Popup = (![bool]$Host.PrivateData.WpfConsole)
	)
	Begin
	{
      $global:theFormatPoshTableDataGrid = $null
		if (!(Get-Command datagrid) )
		{
			Import-Module PowerBoots
         Add-BootsFunction 'C:\Program Files (x86)\WPF Toolkit\*\WPFToolkit.dll'
		}
	}
	Process
	{
      # Create the window here instead of in BEGIN because we need to know the TYPE for the datagrid
		if(!$global:theFormatPoshTableDataGrid) {
         if(!$BaseType) { $BaseType = $InputObject[0].GetType().FullName }
         # We're going to create a special collection ... 
			$global:ObservableCollection = new-object System.Collections.ObjectModel.ObservableCollection[$BaseType]
         foreach($i in $InputObject) { $ObservableCollection.Add($i) > $null }
         boots {
            Param($ItemCollection, $Property)
				datagrid -RowBackground "AliceBlue" -AlternatingRowBackground "LightBlue" -On_AutoGeneratingColumn {
               Param($Source,$SourceEventArgs) 
               $header = $SourceEventArgs.Column.Header.ToString()
               $Cancel = $true
               # If it matches any of the properties, don't cancel it.
               foreach($h in $Source.Tag) {  if($header -like $h) {  $Cancel = $false } }
               $SourceEventArgs.Cancel = $Cancel
            }  -ColumnHeaderStyle {
					Style -Setters {
						Setter -Property ([System.Windows.Controls.ListView]::FontWeightProperty) -Value ([System.Windows.FontWeights]::ExtraBold)
					}
				} -ItemsSource $ItemCollection -ov global:theFormatPoshTableDataGrid -tag $Property
         } $ObservableCollection $Property -Inline:(!$Popup) -Popup:$Popup
		} else {
         @($global:theFormatPoshTableDataGrid)[0].Dispatcher.Invoke( "Normal", ([Action]{  foreach($i in @($InputObject)) { $global:ObservableCollection.Add($i) > $null } }) )  
		}
	}
}
