WindowsExplorerSync.psm1

$script:thisDir = Split-Path $MyInvocation.MyCommand.Path -Parent

function LoadShellHook() {
    if (!$global:ShellHook) {
        Add-Type -Path "$script:thisDir\ShellHook.dll"
        $global:ShellHook = New-Object Mastersign.WindowsShell.ShellHook
    }
}

function GetPathFromUrl([System.Uri]$url)
{
    if ($url.Scheme -eq "file")
    {
        return $url.LocalPath
    }
    throw "The given URL is no filesystem path: $url"
}

function Get-UrlFromWindowsExplorer()
{
    LoadShellHook
    return $global:ShellHook.GetCurrentLocation()
}

function Get-LocationFromWindowsExplorer()
{
    return (GetPathFromUrl (Get-UrlFromWindowsExplorer))
}

function Set-LocationFromWindowsExplorer()
{
    Set-Location (Get-LocationFromWindowsExplorer)
}

function Push-LocationFromWindowsExplorer()
{
    PushHelper
}

function Get-SelectedItemsFromWindowsExplorer()
{
    LoadShellHook
    return $global:ShellHook.GetCurrentSelection()
}

Set-Alias we Set-LocationFromWindowsExplorer
Set-Alias wep Push-LocationFromWindowsExplorer
Set-Alias wel Get-LocationFromWindowsExplorer
Set-Alias wes Get-SelectedItemsFromWindowsExplorer

Set-PSReadlineKeyHandler "Ctrl+Shift+E" { Set-LocationFromWindowsExplorer; [Microsoft.PowerShell.PSConsoleReadLine]::ValidateAndAcceptLine() } `
    -BriefDescription "Set-LocationFromWindowsExplorer" `
    -Description "Set location to that of the last focused open Explorer window."

Set-PSReadlineKeyHandler "Ctrl+Alt+Shift+E" { Push-LocationFromWindowsExplorer; [Microsoft.PowerShell.PSConsoleReadLine]::ValidateAndAcceptLine() } `
    -BriefDescription "Push-LocationFromWindowsExplorer" `
    -Description "Push location to that of the last focused open Explorer window."