# encoding: ascii
# api: powershell
# title: PSISELibrary
# description: I’ve been doing some work lately with PowerShell Add-ons and figured I’d add a couple that I’ve been working on.
# version: 0.1
# type: function
# author: Jeff Patton
# license: CC0
# function: Replace-TabsWithSpace
# x-poshcode-id: 2953
# x-archived: 2012-01-14T07:03:10
# x-published: 2012-09-13T14:42:00
#
#
Function Replace-TabsWithSpace
{
    <#
        .SYNOPSIS
            Replaces a tab character with 4 spaces
        .DESCRIPTION
            This function examines the selected text in the PSIE SelectedText property and every tab
            character that is found is replaced with 4 spaces.
        .PARAMETER SelectedText
            The current contents of the SelectedText property
        .PARAMETER InstallMenu
            Specifies if you want to install this as a PSIE add-on menu
        .EXAMPLE
            Replace-TabsWithSpace -InstallMenu $true
            
            Description
            -----------
            Installs the function as a menu item.
        .NOTES
            This was written specifically for me, I had some code originally created in Notepad++ that
            used actual tabs, later I changed that to spaces, but on occasion I come accross something
            that doesn't tab shift like it should. Since I've been doing some PowerShell ISE stuff lately
            I decided to write a little function that works as an Add-On menu.
        .LINK
    #>
    Param
    (
        $SelectedText = $psISE.CurrentFile.Editor.SelectedText,
        $InstallMenu
    )
    Begin
    {
        if ($InstallMenu)
        {
            Write-Verbose "Try to install the menu item, and error out if there's an issue."
            try
            {
                $psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("Replace Tabs with Space",{Replace-TabsWithSpace},"Ctrl+Alt+R") | Out-Null
                }
            catch
            {
                Return $Error[0].Exception
                }
            }
        }
    Process
    {
        Write-Verbose "Try and find the tab character in the selected PSISE text, return an error if there's an issue."
        try
        {
            $psISE.CurrentFile.Editor.InsertText($SelectedText.Replace("`t","    "))
            }
        catch
        {
            Return $Error[0].Exception
            }
        }
    End
    {
        }
    }

Function New-CommentBlock
{
    <#
        .SYNOPSIS
            Inserts a full comment block
        .DESCRIPTION
            This function inserts a full comment block that is formatted the
            way I format all my comment blocks.
        .PARAMETER InstallMenu
            Specifies if you want to install this as a PSIE add-on menu
        .EXAMPLE
            New-CommentBlock -InstallMenu $true
            
            Description
            -----------
            Installs the function as a menu item.
        .NOTES
            FunctionName : New-CommentBlock
            Created by   : Jeff Patton
            Date Coded   : 09/13/2011 12:28:10
        .LINK
     #>
    Param
    (
        $InstallMenu
    )
    Begin
    {
        $CommentBlock = @(
            "    <#`n"
            "       .SYNOPSIS`n"
            "       .DESCRIPTION`n"
            "       .PARAMETER`n"
            "       .EXAMPLE`n"
            "       .NOTES`n"
            "           FunctionName : `n"
            "           Created by   : $($env:username)`n"
            "           Date Coded   : $(Get-Date)`n"
            "       .LINK`n"
            "    #>`n")
        if ($InstallMenu)
        {
            Write-Verbose "Try to install the menu item, and error out if there's an issue."
            try
            {
                $psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("Insert comment block",{New-CommentBlock},"Ctrl+Alt+C") | Out-Null
                }
            catch
            {
                Return $Error[0].Exception
                }
            }
        }
    Process
    {
        if (!$InstallMenu)
        {
            Write-Verbose "Don't insert a comment if we're installing the menu"
            try
            {
                Write-Verbose "Create a new comment block, return an error if there's an issue."
                $psISE.CurrentFile.Editor.InsertText($CommentBlock)
                }
            catch
            {
                Return $Error[0].Exception
                }
            }
        }
    End
    {
        }
    }

Function New-Script
{
    <#
        .SYNOPSIS
            Create a new blank script
        .DESCRIPTION
            This function creates a new blank script based on my original template.ps1
        .PARAMETER InstallMenu
            Specifies if you want to install this as a PSIE add-on menu
        .PARAMETER ScriptName
            This is the name of the new script.
        .EXAMPLE
            New-Script -ScriptName "New-ImprovedScript"
            
            Description
            -----------
            This example shows calling the function with the ScriptName parameter
        .EXAMPLE
            New-Script -InstallMenu $true
            
            Description
            -----------
            Installs the function as a menu item.
        .NOTES
            FunctionName : New-Script
            Created by   : Jeff Patton
            Date Coded   : 09/13/2011 13:37:24
        .LINK
     #>
    Param
    (
        $InstallMenu,
        $ScriptName
    )
    Begin
    {
        $TemplateScript = @(
        "<#`n"
        "   .SYNOPSIS`n"
        "       Template script`n"
        "   .DESCRIPTION`n"
        "       This script sets up the basic framework that I use for all my scripts.`n"
        "   .PARAMETER`n"
        "   .EXAMPLE`n"
        "   .NOTES`n"
        "       ScriptName : $($ScriptName)`n"
        "       Created By : $($env:Username)`n"
        "       Date Coded : $(Get-Date)`n"
        "       ScriptName is used to register events for this script`n"
        "       LogName is used to determine which classic log to write to`n"
        "`n"        
        "       ErrorCodes`n"
        "           100 = Success`n"
        "           101 = Error`n"
        "           102 = Warning`n"
        "           104 = Information`n"
        "   .LINK`n"
        "#>`n"
        "Param`n"
        "   (`n"
        "`n"    
        "   )`n"
        "Begin`n"
        "   {`n"
        "       `$ScriptName = `$MyInvocation.MyCommand.ToString()`n"
        "       `$LogName = `"Application`"`n"
        "       `$ScriptPath = `$MyInvocation.MyCommand.Path`n"
        "       `$Username = `$env:USERDOMAIN + `"\`" + `$env:USERNAME`n"
        "`n"
        "       New-EventLog -Source `$ScriptName -LogName `$LogName -ErrorAction SilentlyContinue`n"
        "`n"
        "       `$Message = `"Script: `" + `$ScriptPath + `"``nScript User: `" + `$Username + `"``nStarted: `" + (Get-Date).toString()`n"
        "       Write-EventLog -LogName `$LogName -Source `$ScriptName -EventID `"104`" -EntryType `"Information`" -Message `$Message`n"
        "`n"
        "       #	Dotsource in the functions you need.`n"
        "       }`n"
        "Process`n"
        "   {`n"
        "       }`n"
        "End`n"
        "   {`n"
        "       `$Message = `"Script: `" + `$ScriptPath + `"``nScript User: `" + `$Username + `"``nFinished: `" + (Get-Date).toString()`n"
        "       Write-EventLog -LogName `$LogName -Source `$ScriptName -EventID `"104`" -EntryType `"Information`" -Message `$Message	`n"
        "       }`n")
        if ($InstallMenu)
        {
            Write-Verbose "Try to install the menu item, and error out if there's an issue."
            try
            {
                $psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("New blank script",{New-Script},"Ctrl+Alt+S") | Out-Null
                }
            catch
            {
                Return $Error[0].Exception
                }
            }

        }
    Process
    {
        if (!$InstallMenu)
        {
            Write-Verbose "Don't create a script if we're installing the menu"
            try
            {
                Write-Verbose "Create a new blank tab for the script"
                $NewScript = $psISE.CurrentPowerShellTab.Files.Add()
                Write-Verbose "Create a new empty script, return an error if there's an issue."
                $NewScript.Editor.InsertText($TemplateScript)
                $NewScript.Editor.InsertText(($NewScript.Editor.Select(22,1,22,2) -replace " ",""))
                $NewScript.Editor.InsertText(($NewScript.Editor.Select(26,1,26,2) -replace " ",""))
                $NewScript.Editor.InsertText(($NewScript.Editor.Select(40,1,40,2) -replace " ",""))
                $NewScript.Editor.InsertText(($NewScript.Editor.Select(43,1,43,2) -replace " ",""))
                $NewScript.Editor.Select(1,1,1,1)
                $NewScript.SaveAs("$((Get-Location).Path)\$($ScriptName)")
                }
            catch
            {
                Return $Error[0].Exception
                }
            }
        }
    End
    {
        Return $NewScript
        }
    }

Function New-Function
{
    <#
        .SYNOPSIS
            Create a new function
        .DESCRIPTION
            This function creates a new function that wraps the selected text inside
            the Process section of the body of the function.
        .PARAMETER SelectedText
            Currently selected code that will become a function
        .PARAMETER InstallMenu
            Specifies if you want to install this as a PSIE add-on menu
        .PARAMETER FunctionName
            This is the name of the new function.
        .EXAMPLE
            New-Function -FunctionName "New-ImprovedFunction"
            
            Description
            -----------
            This example shows calling the function with the FunctionName parameter
        .EXAMPLE
            New-Function -InstallMenu $true
            
            Description
            -----------
            Installs the function as a menu item.
        .NOTES
            FunctionName : New-Function
            Created by   : Jeff Patton
            Date Coded   : 09/13/2011 13:37:24
        .LINK
     #>
    Param
    (
        $SelectedText = $psISE.CurrentFile.Editor.SelectedText,
        $InstallMenu,
        $FunctionName
    )
    Begin
    {
        $TemplateFunction = @(
        "Function $FunctionName`n"
        "   <#`n"
        "       .SYNOPSIS`n"
        "       .DESCRIPTION`n"
        "       .PARAMETER`n"
        "       .EXAMPLE`n"
        "       .NOTES`n"
        "           FunctionName : $FunctionName`n"
        "           Created by   : $($env:username)`n"
        "           Date Coded   : $(Get-Date)`n"
        "       .LINK`n"
        "   #>`n"
        "Param`n"
        "    (`n"
        "    )`n"
        "Begin`n"
        "{`n"
        "    }`n"
        "Process`n"
        "{`n"
        "$($SelectedText)`n"
        "    }`n"
        "End`n"
        "{`n"
        "    }`n")
        if ($InstallMenu)
        {
            Write-Verbose "Try to install the menu item, and error out if there's an issue."
            try
            {
                $psISE.CurrentPowerShellTab.AddOnsMenu.SubMenus.Add("New function",{New-Function},"Ctrl+Alt+S") | Out-Null
                }
            catch
            {
                Return $Error[0].Exception
                }
            }

        }
    Process
    {
        if (!$InstallMenu)
        {
            Write-Verbose "Don't create a function if we're installing the menu"
            try
            {
                Write-Verbose "Create a new empty function, return an error if there's an issue."
                $psISE.CurrentFile.Editor.InsertText($TemplateFunction)
                }
            catch
            {
                Return $Error[0].Exception
                }
            }
        }
    End
    {
        }
    }
