#######################################################################################################################
# File:             Add-on.InstallPortable.psm1                                                                       #
# Author:           Adam Driscoll                                                                                     #
# Publisher:        Quest Software                                                                                    #
# Copyright:        © 2011 Quest Software. All rights reserved.                                                       #
# Usage:            To load this module in your Script Editor:                                                        #
#                   1. Open the Script Editor.                                                                        #
#                   2. Select "PowerShell Libraries" from the File menu.                                              #
#                   3. Check the Add-on.InstallPortable module.                                                       #
#                   4. Click on OK to close the "PowerShell Libraries" dialog.                                        #
#                   Alternatively you can load the module from the embedded console by invoking this:                 #
#                       Import-Module -Name Add-on.InstallPortable                                                    #
#                   Please provide feedback on the PowerGUI Forums.                                                   #
#######################################################################################################################

Set-StrictMode -Version 2

#region Define the Win32WindowClass

if (-not ('PowerShellTypeExtensions.Win32Window' -as [System.Type])) {
	$cSharpCode = @'
using System;

namespace PowerShellTypeExtensions {
	public class Win32Window : System.Windows.Forms.IWin32Window
	{
		public static Win32Window CurrentWindow {
			get {
				return new Win32Window(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle);
			}
		}

		public Win32Window(IntPtr handle) {
			_hwnd = handle;
		}

		public IntPtr Handle {
			get {
				return _hwnd;
			}
		}

		private IntPtr _hwnd;
	}
}
'@

	Add-Type -ReferencedAssemblies System.Windows.Forms -TypeDefinition $cSharpCode
}

#endregion

#region Initialize the Script Editor Add-on.

$minimumSdkVersion = [System.Version]'1.0'

if ($Host.Name –ne 'PowerGUIScriptEditorHost') {
	return
}

if (-not (Get-Variable -Name PGVersionTable -ErrorAction SilentlyContinue)) {
	[System.Windows.Forms.MessageBox]::Show([PowerShellTypeExtensions.Win32Window]::CurrentWindow,"The ""$(Split-Path -Path $PSScriptRoot -Leaf)"" Add-on module requires PowerGUI 3.0 or later. The current PowerGUI version is $($Host.Version).$([System.Environment]::NewLine * 2)Please upgrade to the latest version of PowerGUI and try again.",'PowerGUI 3.0 or later is required',[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Information) | Out-Null
	return
} elseif ($PGVersionTable.SDKVersion -lt $minimumSdkVersion) {
	[System.Windows.Forms.MessageBox]::Show([PowerShellTypeExtensions.Win32Window]::CurrentWindow,"The ""$(Split-Path -Path $PSScriptRoot -Leaf)"" Add-on module requires version $minimumSdkVersion or later of the PowerGUI Script Editor SDK. The current SDK version is $($PGVersionTable.SDKVersion).$([System.Environment]::NewLine * 2)Please upgrade to the latest version of PowerGUI and try again.","Version $minimumSdkVersion or later of the SDK is required",[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Information) | Out-Null
	return
}

#endregion

#region Load resources from disk.

$iconLibrary = @{
	InstallPortableIcon16 = New-Object System.Drawing.Icon -ArgumentList "$PSScriptRoot\usb.ico",16,16
	InstallPortableIcon32 = New-Object System.Drawing.Icon -ArgumentList "$PSScriptRoot\usb.ico",32,32
}
$imageLibrary = @{
	InstallPortable16 = $iconLibrary['InstallPortableIcon16'].ToBitmap()
}

#endregion

if (-not ($clearConsoleCommand = $PGSE.Commands['ToolsCommand.InstallPortableCommand'])) {
	$InstallPortableCommand = New-Object -TypeName Quest.PowerGUI.SDK.ItemCommand -ArgumentList 'ToolsCommand','InstallPortableCommand'
	$InstallPortableCommand.Text = '&Install Portable'
	$InstallPortableCommand.Image = $imageLibrary['InstallPortable16']
	$InstallPortableCommand.ScriptBlock = {
	
		#
		#	Open a FolderBrowserDialog to navigate to the folder to place PowerGUI in.
		#
		$dialog = New-Object System.Windows.Forms.FolderBrowserDialog
		$dialog.ShowDialog()
		
		$destination = $dialog.SelectedPath
		
		if ($destination -ne $null -and $destination.LastIndexOf([system.IO.Path]::DirectorySeparatorChar) -lt 0)
		{
			$destination = "$destination$([system.IO.Path]::DirectorySeparatorChar)"
		}
		
		if (-not [String]::IsNullOrEmpty($destination))
		{
			$i = 0
			
			#
			#	Progress bar that doesn't actually report actual progress....makes you feel better about it though...
			#
			Write-Progress -Activity "Installing PowerGUI to USB Key..." -Status  "Processing..." -PercentComplete $i
			
			Start-Job -Name "InstallPortable"  -FilePath "$PSScriptRoot\InstallPortable.ps1" -ArgumentList $destination,$PGHome,"PowerGUI"
			
			#
			#	Hack because the Job returned by Start-Job always returns completed...even when it has not...
			#
			while(-not (Test-Path -Path (Join-Path $destination "PowerGUI ScriptEditor_x86.exe")))
			{
				Write-Progress -Activity "Installing PowerGUI to USB Key..." -Status  "Processing..." -PercentComplete $i
				
				#
				#	In case it takes longer than 25 seconds...
				#
				$i++
				if ($i -gt 100)
				{
					$i = 0
				}
				
				Start-Sleep -Milliseconds 250
			}
			Write-Progress -Activity "Installing PowerGUI to USB Key..." -Status "Processing..." -Completed
			
			#
			#	In case there was an error
			#
			$jobResult = Receive-Job -Name "InstallPortable" 
			
			if ($jobResult -ne $null)
			{
				throw $jobResult
			}
		}
	}

	$PGSE.Commands.Add($InstallPortableCommand)
	
	$ToolBar = $PGSE.Toolbars | Where { $_.Title -eq "Standard" } 
	$ToolBar.Items.Add($InstallPortableCommand)
}

#region Clean-up the Add-on when it is removed.

$ExecutionContext.SessionState.Module.OnRemove = {
	#region Remove the install portable toolbar button from the Standard toolbar.

	$standardToolbar = $null
	foreach ($item in $pgse.Toolbars) {
		if ($item.Title -eq 'Standard') {
			$standardToolbar = $item
			break
		}
	}
	if (($standardToolbar) -and
	    ($newAddonToolbarButton = $standardToolbar.Items['ToolsCommand.InstallPortableCommand'])) {
		$standardToolbar.Items.Remove($newAddonToolbarButton) | Out-Null
	}

	#endregion
if (($viewMenu = $PGSE.Menus['MenuBar.View']) -and
    ($installPortableCommand = $viewMenu.Items['ToolsCommand.InstallPortableCommand'])) {
	$viewMenu.Items.Remove($installPortableCommand) | Out-Null
	}
	
	if ($installPortableCommand =
		$PGSE.Commands['ToolsCommand.InstallPortableCommand']) {
		$PGSE.Commands.Remove($installPortableCommand) | Out-Null
	}
}

#endregion

# SIG # Begin signature block
# MIIPIgYJKoZIhvcNAQcCoIIPEzCCDw8CAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQU5AxIA2EVAIt/MCwdiKxi3AzO
# EFWgggz6MIIEDTCCAvWgAwIBAgILBAAAAAABI54PrLMwDQYJKoZIhvcNAQEFBQAw
# VzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNV
# BAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw05OTAx
# MjgxMzAwMDBaFw0xNzAxMjcxMjAwMDBaMIGBMQswCQYDVQQGEwJCRTEZMBcGA1UE
# ChMQR2xvYmFsU2lnbiBudi1zYTElMCMGA1UECxMcUHJpbWFyeSBPYmplY3QgUHVi
# bGlzaGluZyBDQTEwMC4GA1UEAxMnR2xvYmFsU2lnbiBQcmltYXJ5IE9iamVjdCBQ
# dWJsaXNoaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAopt1
# KqcTuglxJBjfoQZiKRKe3J51c+jfVldplhNWT/LIvAFY7SaGcgtg9RnFVQNXm7kQ
# yaHUdED/bADo5lM3/rfaeT64UjjpgSyfDjNSps1wzkpdYvTRZ168l0oHyrzdjUex
# zfFlW4UBsEtr3s2OLvVQ6KOcnSaYazZjQQNwRPBf4iV1eVB9X6EGokYMVZVHFNOR
# RoZomecn9JTsmkFR95bUeozhRJdocQPYWG+9tBBC7g1mdUaLRJbSMAASB2P3RJsB
# cMpWb5xYlyonF4sucVJtRqunKw9/FkhkyFL6BhcAB3TXRbMM9XiVc+gK7sTgcowe
# Eaoeu17O+bQA7nO9zQIDAQABo4GuMIGrMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMB
# Af8EBTADAQH/MB0GA1UdDgQWBBQVUXkafAxZ+drN2MQ6E5rJeC1/TTAzBgNVHR8E
# LDAqMCigJqAkhiJodHRwOi8vY3JsLmdsb2JhbHNpZ24ubmV0L1Jvb3QuY3JsMBMG
# A1UdJQQMMAoGCCsGAQUFBwMDMB8GA1UdIwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj/
# /P1LMA0GCSqGSIb3DQEBBQUAA4IBAQC1eKaifAS3f8l/fWq8cfopMGDC9GIe/n9D
# Hptu4rIfcwuFdlt99U5JBi/U+reRQO/tb42OE4NUxSoCPQqk3JkLer13L8xAwY/z
# xIxOcroQfOb/ZCvHzmyn/NeafI5GjQGDTUI725w/nzJhV9cXsLM2ZvCz/URvgTex
# lE6nViWJ9YrWbRFiYnlcQpACGNOcI/wI6GRFuS1+gFtOr8OKKZKDeB+RQTSvhcX9
# B5lOLFz+x/0XuyUlMU1ytbUpS0iaN28TxxFOSkUefi8xnKvoUq/WZ5c0iF8OJ2pm
# UtFax6wwLCA43Sv/OuvOEEWConsboSBzVpsqk+YEUQZsG9wviZSTMIIEDjCCAvag
# AwIBAgILAQAAAAABHfPLkTMwDQYJKoZIhvcNAQEFBQAwYzELMAkGA1UEBhMCQkUx
# GTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExFjAUBgNVBAsTDU9iamVjdFNpZ24g
# Q0ExITAfBgNVBAMTGEdsb2JhbFNpZ24gT2JqZWN0U2lnbiBDQTAeFw0wODEyMDEx
# NzIyMTZaFw0xMTEyMDExNzIyMTZaMGgxCzAJBgNVBAYTAlVTMRcwFQYDVQQKEw5R
# dWVzdCBTb2Z0d2FyZTEXMBUGA1UEAxMOUXVlc3QgU29mdHdhcmUxJzAlBgkqhkiG
# 9w0BCQEWGGVpbmFyLm15a2xldHVuQHF1ZXN0LmNvbTCBnzANBgkqhkiG9w0BAQEF
# AAOBjQAwgYkCgYEAo8H3TLiL3ZuyDnISttAV2LQBnEVPzsYBTKRTzYzc/F7mJEIk
# AP3obTb310inr0QQoeOMLBw8PqzhkYtGI/iTyGgDEjXHRUlJrjXJkqPVzwER+y8n
# ErZDfNlAhICZMfVQ0woKubOlzFdyRZddSS2yCNkHvt1hE4eQpf/2km6xgwECAwEA
# AaOCAUAwggE8MB8GA1UdIwQYMBaAFNJb80smS6Ww5139Vn/28S44TlOgME4GCCsG
# AQUFBwEBBEIwQDA+BggrBgEFBQcwAoYyaHR0cDovL3NlY3VyZS5nbG9iYWxzaWdu
# Lm5ldC9jYWNlcnQvT2JqZWN0U2lnbi5jcnQwOQYDVR0fBDIwMDAuoCygKoYoaHR0
# cDovL2NybC5nbG9iYWxzaWduLm5ldC9PYmplY3RTaWduLmNybDAJBgNVHRMEAjAA
# MA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzBLBgNVHSAERDBC
# MEAGCSsGAQQBoDIBMjAzMDEGCCsGAQUFBwIBFiVodHRwOi8vd3d3Lmdsb2JhbHNp
# Z24ubmV0L3JlcG9zaXRvcnkvMBEGCWCGSAGG+EIBAQQEAwIEEDANBgkqhkiG9w0B
# AQUFAAOCAQEADEv3HbOXij3ilFpZ7zaa3FPCKPx+6G9uS0D57wOb4JfGazsDzd5p
# ClujkMtSppWrKgacKZSphZDlxlfJjOjOtzuIr87qrFyzIPo0y42bYQiKzxcy7Ofv
# t9ET+LYDAV87JaindZr7lvjK3CpVZ8YRSLy0M8vF3vlaOTMbX/L79+MXwxvETloG
# mN0lz7E+24JpzdAiryyn7oY2KvS+Rsw+s0blzeeej7HOgb0HqWNcBRth2xWgcOuN
# M7II1o4/24VvMKNDh7/SaH8/E2ps51tZXIHEB3QVIA+0zJu5kouW+d3WoD8yjysA
# irVeWiRAHWhrcP0iiBUxtBieZQBU2F879DCCBNMwggO7oAMCAQICCwQAAAAAASOe
# D68kMA0GCSqGSIb3DQEBBQUAMIGBMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xv
# YmFsU2lnbiBudi1zYTElMCMGA1UECxMcUHJpbWFyeSBPYmplY3QgUHVibGlzaGlu
# ZyBDQTEwMC4GA1UEAxMnR2xvYmFsU2lnbiBQcmltYXJ5IE9iamVjdCBQdWJsaXNo
# aW5nIENBMB4XDTA0MDEyMjEwMDAwMFoXDTE3MDEyNzEwMDAwMFowYzELMAkGA1UE
# BhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExFjAUBgNVBAsTDU9iamVj
# dFNpZ24gQ0ExITAfBgNVBAMTGEdsb2JhbFNpZ24gT2JqZWN0U2lnbiBDQTCCASIw
# DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALCx8oAAcM7sw4y0l+3GCYwmb4nf
# Z1mBz94UE0zCsUXiU3VB+gc2b7oRcCiUfG1yvQcVJWU6Cf+F3Pp7XjeHOOTHSwiA
# mJ6KzVgJAsDDAUmWWIiJJln1bca5wfsYJe3YYk7KCmxdcO/O05spCwnG9u62FtQ8
# VI7MXeCv290jCTJ7MoEWYgoGy3rPNCG2bza2sc7Lmik1QD6dWHz/rYKY+rjVico1
# 3cvNVwbLm+S/lKiAmF93lvC256t0eUAhpmPp0AeRvYU4tK6WrKH/FHPapUW4TYbO
# Kjzv1N8oDnWpqIgTwuR8YJPyJcwDhJfmTrafLda1izQ8q9U4Osg9xLH5lM0CAwEA
# AaOCAWcwggFjMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgEAMB0G
# A1UdDgQWBBTSW/NLJkulsOdd/VZ/9vEuOE5ToDBKBgNVHSAEQzBBMD8GCSsGAQQB
# oDIBMjAyMDAGCCsGAQUFBwIBFiRodHRwOi8vd3d3Lmdsb2JhbHNpZ24ubmV0L3Jl
# cG9zaXRvcnkwOQYDVR0fBDIwMDAuoCygKoYoaHR0cDovL2NybC5nbG9iYWxzaWdu
# Lm5ldC9wcmltb2JqZWN0LmNybDBOBggrBgEFBQcBAQRCMEAwPgYIKwYBBQUHMAKG
# Mmh0dHA6Ly9zZWN1cmUuZ2xvYmFsc2lnbi5uZXQvY2FjZXJ0L1ByaW1PYmplY3Qu
# Y3J0MBEGCWCGSAGG+EIBAQQEAwIAATATBgNVHSUEDDAKBggrBgEFBQcDAzAfBgNV
# HSMEGDAWgBQVUXkafAxZ+drN2MQ6E5rJeC1/TTANBgkqhkiG9w0BAQUFAAOCAQEA
# HmrzbfSOqSL+cAhlLqFdqzMw3Wx4+kvqrcWN7BB6asVYlzlrkvOR4gynKBzRXXaO
# iwd8E2+txDZDs8G8MVnPGDjYozvO/8pnWL/g8axhPqI7HrwCW0GsRGv1JvPtXqhl
# 9splpj/K9XfrpYYqWClW+L4WEEDp0vxXLGNhN2YlOSAuBwOgNgMllL18637To8LF
# dhZ1MJK5/3ZBNSFo0Q5eXI7DA2DmgED8wF2iVG5ukmengRKHoqMr27dN/+TVx+UF
# 5tXxrvzNZhgh8z5HyeWVQmEsnSaAsg+oPQ7Jp3jfbnSMLEb2cuk8ZGsoVcRLZDPL
# eFQTOPDVcQbUPg0KNQ7gszGCAZIwggGOAgEBMHIwYzELMAkGA1UEBhMCQkUxGTAX
# BgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExFjAUBgNVBAsTDU9iamVjdFNpZ24gQ0Ex
# ITAfBgNVBAMTGEdsb2JhbFNpZ24gT2JqZWN0U2lnbiBDQQILAQAAAAABHfPLkTMw
# CQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAIoAKAAKECgAAwGQYJKoZIhvcN
# AQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIBCzEOMAwGCisGAQQBgjcCARUw
# IwYJKoZIhvcNAQkEMRYEFAAngIKxiKiRcDBlvxXVCRrl83n3MA0GCSqGSIb3DQEB
# AQUABIGAFQZHwXudbwjk3ywBexoUftg4adLhoKXgXQDptwJBOFKy30NlNtQJNVil
# OpDmaIeWmRxKZ6UuY8iUREUuZu/Eg0TFstWhR3XOjWt65kcT2qGNVW9JEyePIVie
# ynVftC9o3jIwM8axRx5iSEZT8SdfZkXpTz1o943hF1KVWRdH8zU=
# SIG # End signature block
