# encoding: ascii
# api: powershell
# title: Snippet Compiler
# description: Fixed bug with output textbox (other improvements are in progress).
# version: 3.5
# type: script
# author: greg zakharov
# license: CC0
# function: Invoke-Atom
# x-poshcode-id: 4079
# x-archived: 2013-04-10T00:24:18
# x-published: 2013-04-06T12:20:00
#
#
#Required 2.0
$def = $(if ((gi .).FullName -eq (gi .).Root) {
          ([string](gi .).Root).TrimEnd("\")
         }
         else { (gi .).FullName }
       )

##################################################################################################

$mnuOpen_Click= {
  (New-Object Windows.Forms.OpenFileDialog) | % {
    $_.FileName = "source"
    $_.Filter = "C# (*.cs)|*.cs"
    $_.InitialDirectory = $def

    if ($_.ShowDialog() -eq [Windows.Forms.DialogResult]::OK) {
      $sr = New-Object IO.StreamReader $_.FileName
      $txtEdit.Text = $sr.ReadToEnd()
      $sr.Close()
    }
  }
}

$mnuFont_Click= {
  (New-Object Windows.Forms.FontDialog) | % {
    $_.Font = "Lucida Console"
    $_.MinSize = 10
    $_.MaxSize = 12
    $_.ShowEffects = $false

    if ($_.ShowDialog() -eq [Windows.Forms.DialogResult]::OK) {
      $txtEdit.Font = $_.Font
    }
  }
}

$mnuOpaF_Click= {
  $frmMain.Opacity = 1
  $cur.Checked = $false
  $mnuOpaF.Checked = $true
  $cur = $mnuOpaF
}

$mnuWrap_Click= {
  $toggle =! $mnuWrap.Checked
  $mnuWrap.Checked = $toggle
  $txtEdit.WordWrap = $toggle
}

$tbTools_ButtonClick= {
  switch ($_.Button.Tag) {
    "Atom"     { Invoke-Atom; break }
    "Progress" { Show-Panel $mnuToS1 $scSplt1; break }
    "Params"   { Show-Panel $mnuToS2 $scSplt2; break }
    "Build"    { Invoke-Builder; break }
    "BuildEx"  { Start-AfterBuilding; break }
    "Exit"     { $frmMain.Close(); break }
  }
}

$cboPlat_SelectedIndexChanged= {
  switch ($cboPlat.SelectedIndex) {
    "0" { $lboRefs.Items.Remove("`"System.Core.dll`""); break }
    "1" { $lboRefs.Items.Add("`"System.Core.dll`""); break }
  }
}

$chkExec_Click= {
  switch ($chkExec.Checked) {
    $true  {
      $txtIOut.Text = $def + '\app.exe'
      $chkWApp.Enabled = $true
      $chkIMem.Enabled = $false
      $mnuBnRA.Enabled = $true
      $btnBnRA.Enabled = $true
      break
    }
    $false {
      $txtIOut.Text = $def + '\lib.dll'
      $chkWApp.Enabled = $false
      $chkIMem.Enabled = $true
      $mnuBnRA.Enabled = $false
      $btnBnRA.Enabled = $false
      break
    }
  }
}

$chkWApp_Click= {
  switch ($chkWApp.Checked) {
    $true  {
      $lboRefs.Items.AddRange(@("`"System.Drawing.dll`"", "`"System.Windows.Forms.dll`""))
      break
    }
    $false {
      $lboRefs.Items.Remove("`"System.Windows.Forms.dll`"")
      $lboRefs.Items.Remove("`"System.Drawing.dll`"")
      break
    }
  }
}

$mnuICnM_Click= {
  $script:buff = $lboRefs.SelectedItem
  $lboRefs.Items.Remove($lboRefs.SelectedItem)
}

$mnuIIns_Click= {
  (New-Object Windows.Forms.OpenFileDialog) | % {
    $_.Filter = "PE File (*.dll)|*.dll"
    $_.InitialDirectory = [Runtime.InteropServices.RuntimeEnvironment]::GetRuntimeDirectory()

    if ($_.ShowDialog() -eq [Windows.Forms.DialogResult]::OK) {
      $lboRefs.Items.Add('"' + (Split-Path -leaf $_.FileName) + '"')
    }
  }
}

$frmMain_Load= {
  $txtIOut.Text = $def + '\app.exe'
  $sbPnl_2.Text = "Str: 1, Col: 0"
  $lboRefs.Items.Add("`"System.dll`"")
}

##################################################################################################

function frmMain_Show {
  Add-Type -AssemblyName System.Windows.Forms
  [Windows.Forms.Application]::EnableVisualStyles()

  $ico = [Drawing.Icon]::ExtractAssociatedIcon($($PSHome + '\powershell_ise.exe'))

  $cdcp = New-Object CodeDom.Compiler.CompilerParameters
  $dict = New-Object "Collections.Generic.Dictionary[String, String]"
  $dict.Add("CompilerVersion", "v3.5")

  $frmMain = New-Object Windows.Forms.Form
  $mnuMain = New-Object Windows.Forms.MainMenu
  $mnuFile = New-Object Windows.Forms.MenuItem
  $mnuAtom = New-Object Windows.Forms.MenuItem
  $mnuOpen = New-Object Windows.Forms.MenuItem
  $mnuEmp1 = New-Object Windows.Forms.MenuItem
  $mnuExit = New-Object Windows.Forms.MenuItem
  $mnuEdit = New-Object Windows.Forms.MenuItem
  $mnuUndo = New-Object Windows.Forms.MenuItem
  $mnuEmp2 = New-Object Windows.Forms.MenuItem
  $mnuCopy = New-Object Windows.Forms.MenuItem
  $mnuPast = New-Object Windows.Forms.MenuItem
  $mnuICut = New-Object Windows.Forms.MenuItem
  $mnuEmp3 = New-Object Windows.Forms.MenuItem
  $mnuSAll = New-Object Windows.Forms.MenuItem
  $mnuView = New-Object Windows.Forms.MenuItem
  $mnuFont = New-Object Windows.Forms.MenuItem
  $mnuEmp4 = New-Object Windows.Forms.MenuItem
  $mnuOpac = New-Object Windows.Forms.MenuItem
  $mnuOp50 = New-Object Windows.Forms.MenuItem
  $mnuOp60 = New-Object Windows.Forms.MenuItem
  $mnuOp70 = New-Object Windows.Forms.MenuItem
  $mnuOp80 = New-Object Windows.Forms.MenuItem
  $mnuOp90 = New-Object Windows.Forms.MenuItem
  $mnuOpaF = New-Object Windows.Forms.MenuItem
  $mnuTgls = New-Object Windows.Forms.MenuItem
  $mnuWrap = New-Object Windows.Forms.MenuItem
  $mnuToS1 = New-Object Windows.Forms.MenuItem
  $mnuToS2 = New-Object Windows.Forms.MenuItem
  $mnuMake = New-Object Windows.Forms.MenuItem
  $mnuBAsm = New-Object Windows.Forms.MenuItem
  $mnuBnRA = New-Object Windows.Forms.MenuItem
  $mnuHelp = New-Object Windows.Forms.MenuItem
  $mnuInfo = New-Object Windows.Forms.MenuItem
  $tbTools = New-Object Windows.Forms.ToolBar
  $btnAtom = New-Object Windows.Forms.ToolBarButton
  $btnToS1 = New-Object Windows.Forms.ToolBarButton
  $btnMake = New-Object Windows.Forms.ToolBarButton
  $btnBAsm = New-Object Windows.Forms.ToolBarButton
  $btnBnRA = New-Object Windows.Forms.ToolBarButton
  $btnExit = New-Object Windows.Forms.ToolBarButton
  $scSplt1 = New-Object Windows.Forms.SplitContainer
  $scSplt2 = New-Object Windows.Forms.SplitContainer
  $lstView = New-Object Windows.Forms.ListView
  $chPoint = New-Object Windows.Forms.ColumnHeader
  $chError = New-Object Windows.Forms.ColumnHeader
  $chCause = New-Object Windows.Forms.ColumnHeader
  $txtEdit = New-Object Windows.Forms.RichTextBox
  $gboMake = New-Object Windows.Forms.GroupBox
  $lblLab1 = New-Object Windows.Forms.Label
  $cboPlat = New-Object Windows.Forms.ComboBox
  $chkExec = New-Object Windows.Forms.CheckBox
  $chkWApp = New-Object Windows.Forms.CheckBox
  $chkIDbg = New-Object Windows.Forms.CheckBox
  $chkIMem = New-Object Windows.Forms.CheckBox
  $lblLab2 = New-Object Windows.Forms.Label
  $txtIOut = New-Object Windows.Forms.TextBox
  $lblLab3 = New-Object Windows.Forms.Label
  $lboRefs = New-Object Windows.Forms.ListBox
  $sbPanel = New-Object Windows.Forms.StatusBar
  $sbPnl_1 = New-Object Windows.Forms.StatusBarPanel
  $sbPnl_2 = New-Object Windows.Forms.StatusBarPanel
  $imgList = New-Object Windows.Forms.ImageList
  $mnuRefs = New-Object Windows.Forms.ContextMenu
  $mnuIMov = New-Object Windows.Forms.MenuItem
  $mnuICnM = New-Object Windows.Forms.MenuItem
  $mnuIBuf = New-Object Windows.Forms.MenuItem
  $mnuIIns = New-Object Windows.Forms.MenuItem
  #
  #mnuMain
  #
  $mnuMain.MenuItems.AddRange(@($mnuFile, $mnuEdit, $mnuView, $mnuMake, $mnuHelp))
  #
  #mnuFile
  #
  $mnuFile.MenuItems.AddRange(@($mnuAtom, $mnuOpen, $mnuEmp1, $mnuExit))
  $mnuFile.Text = "&File"
  #
  #mnuAtom
  #
  $mnuAtom.Shortcut = "F3"
  $mnuAtom.Text = "Nu&Clear..."
  $mnuAtom.Add_Click({Invoke-Atom})
  #
  #mnuOpen
  #
  $mnuOpen.Shortcut = "CtrlO"
  $mnuOpen.Text = "&Open"
  $mnuOpen.Add_Click($mnuOpen_Click)
  #
  #mnuEmp1
  #
  $mnuEmp1.Text = "-"
  #
  #mnuExit
  #
  $mnuExit.Shortcut = "CtrlX"
  $mnuExit.Text = "E&xit"
  $mnuExit.Add_Click({$frmMain.Close()})
  #
  #mnuEdit
  #
  $mnuEdit.menuItems.AddRange(@($mnuUndo, $mnuEmp2, $mnuCopy, $mnuPast, $mnuICut, `
                                                               $mnuEmp3, $mnuSAll))
  $mnuEdit.Text = "&Edit"
  #
  #mnuUndo
  #
  $mnuUndo.Shortcut = "CtrlZ"
  $mnuUndo.Text = "&Undo"
  $mnuUndo.Add_Click({$txtEdit.Undo()})
  #
  #mnuEmp2
  #
  $mnuEmp2.Text = "-"
  #
  #mnuCopy
  #
  $mnuCopy.Shortcut = "CtrlC"
  $mnuCopy.Text = "&Copy"
  $mnuCopy.Add_Click({if ($txtEdit.SelectionLength -ge 0) {$txtEdit.Copy()}})
  #
  #mnuPast
  #
  $mnuPast.Shortcut = "CtrlV"
  $mnuPast.Text = "&Paste"
  $mnuPast.Add_Click({$txtEdit.Paste()})
  #
  #mnuICut
  #
  $mnuICut.Shortcut = "Del"
  $mnuICut.Text = "Cut &Item"
  $mnuICut.Add_Click({if ($txtEdit.SelectionLength -ge 0) {$txtEdit.Cut()}})
  #
  #mnuEmp3
  #
  $mnuEmp3.Text = "-"
  #
  #mnuSAll
  #
  $mnuSAll.Shortcut = "CtrlA"
  $mnuSAll.Text = "Select &All"
  $mnuSAll.Add_Click({$txtEdit.SelectAll()})
  #
  #mnuView
  #
  $mnuView.MenuItems.AddRange(@($mnuFont, $mnuEmp4, $mnuOpac, $mnuTgls))
  $mnuView.Text = "&View"
  #
  #mnuFont
  #
  $mnuFont.Text = "&Font..."
  $mnuFont.Add_Click($mnuFont_Click)
  #
  #mnuEmp4
  #
  $mnuEmp4.Text = "-"
  #
  #mnuOpac
  #
  $mnuOpac.MenuItems.AddRange(@($mnuOp50, $mnuOp60, $mnuOp70, $mnuOp80, $mnuOp90, $mnuOpaF))
  $mnuOpac.Text = "&Opacity"
  #
  #mnuOp50
  #
  $mnuOp50.Text = "50%"
  $mnuOp50.Add_Click({Set-Opacity $mnuOp50; $cur = $mnuOp50})
  #
  #mnuOp60
  #
  $mnuOp60.Text = "60%"
  $mnuOp60.Add_Click({Set-Opacity $mnuOp60; $cur = $mnuOp60})
  #
  #mnuOp70
  #
  $mnuOp70.Text = "70%"
  $mnuOp70.Add_Click({Set-Opacity $mnuOp70; $cur = $mnuOp70})
  #
  #mnuOp80
  #
  $mnuOp80.Text = "80%"
  $mnuOp80.Add_Click({Set-Opacity $mnuOp80; $cur = $mnuOp80})
  #
  #mnuOp90
  #
  $mnuOp90.Text = "90%"
  $mnuOp90.Add_Click({Set-Opacity $mnuOp90; $cur = $mnuOp90})
  #
  #mnuOpaF
  #
  $cur = $mnuOpaF #checked item by default
  $mnuOpaF.Checked = $true
  $mnuOpaF.Text = "Opaque"
  $mnuOpaF.Add_Click($mnuOpaF_Click)
  #
  #mnuTgls
  #
  $mnuTgls.MenuItems.AddRange(@($mnuWrap, $mnuToS1, $mnuToS2))
  $mnuTgls.Text = "&Toggles"
  #
  #mnuWrap
  #
  $mnuWrap.Checked = $true
  $mnuWrap.Shortcut = "CtrlW"
  $mnuWrap.Text = "&Wrap Mode"
  $mnuWrap.Add_Click($mnuWrap_Click)
  #
  #mnuToS1
  #
  $mnuToS1.Checked = $true
  $mnuToS1.Text = "Building &Progress"
  $mnuToS1.Add_Click({Show-Panel $mnuToS1 $scSplt1})
  #
  #mnuToS2
  #
  $mnuToS2.Checked = $true
  $mnuToS2.Shortcut = "F12"
  $mnuToS2.Text = "Building P&roperties"
  $mnuToS2.Add_Click({Show-Panel $mnuToS2 $scSplt2})
  #
  #mnuMake
  #
  $mnuMake.MenuItems.AddRange(@($mnuBAsm, $mnuBnRA))
  $mnuMake.Text = "&Build"
  #
  #mnuBAsm
  #
  $mnuBAsm.Shortcut = "F5"
  $mnuBAsm.Text = "&Compile"
  $mnuBAsm.Add_Click({Invoke-Builder})
  #
  #mnuBnRA
  #
  $mnuBnRA.Shortcut = "F9"
  $mnuBnRA.Text = "Compile And &Run"
  $mnuBnRA.Add_Click({Start-AfterBuilding})
  #
  #mnuHelp
  #
  $mnuHelp.MenuItems.AddRange(@($mnuInfo))
  $mnuHelp.Text = "&Help"
  #
  #mnuInfo
  #
  $mnuInfo.Text = "About..."
  $mnuInfo.Add_Click({frmInfo_Show})
  #
  #tbTools
  #
  $tbTools.Buttons.AddRange(@($btnAtom, $btnToS1, $btnMake, $btnBAsm, $btnBnRA, $btnExit))
  $tbTools.ImageList = $imgList
  $tbTools.Add_ButtonClick($tbTools_ButtonClick)
  #
  #btnAtom
  #
  $btnAtom.ImageIndex = 0
  $btnAtom.Tag = "Atom"
  $btnAtom.ToolTipText = "NuClear (F3)"
  #
  #btnToS1
  #
  $btnToS1.ImageIndex = 1
  $btnToS1.Tag = "Progress"
  $btnToS1.ToolTipText = "Building Progress Panel"
  #
  #btnMake
  #
  $btnMake.ImageIndex = 2
  $btnMake.Tag = "Params"
  $btnMake.ToolTipText = "Building Properties (F12)"
  #
  #btnBAsm
  #
  $btnBAsm.ImageIndex = 3
  $btnBAsm.Tag = "Build"
  $btnBAsm.ToolTipText = "Compile (F5)"
  #
  #btnBnRA
  #
  $btnBnRA.ImageIndex = 4
  $btnBnRA.Tag = "BuildEx"
  $btnBnRA.ToolTipText = "Compile And Run (F9)"
  #
  #btnExit
  #
  $btnExit.ImageIndex = 5
  $btnExit.Tag = "Exit"
  $btnExit.ToolTipText = "Exit (Ctrl+X)"
  #
  #scSplt1
  #
  $scSplt1.Anchor = "Left, Top, Right, Bottom"
  $scSplt1.Location = New-Object Drawing.Point(0, 28)
  $scSplt1.Orientation = "Horizontal"
  $scSplt1.Panel1.Controls.Add($scSplt2)
  $scSplt1.Panel2.Controls.Add($lstView)
  $scSplt1.Size = New-Object Drawing.Size(790, 500)
  $scSplt1.SplitterDistance = 410
  $scSplt1.SplitterWidth = 1
  #
  #scSplt2
  #
  $scSplt2.Dock = "Fill"
  $scSplt2.Panel1.Controls.Add($txtEdit)
  $scSplt2.Panel2.Controls.Add($gboMake)
  $scSplt2.SplitterDistance = 510
  $scSplt2.SplitterWidth = 1
  #
  #lstView
  #
  $lstView.Columns.AddRange(@($chPoint, $chError, $chCause))
  $lstView.Dock = "Fill"
  $lstView.FullRowSelect = $true
  $lstView.GridLines = $true
  $lstView.MultiSelect = $false
  $lstView.ShowItemToolTips = $true
  $lstView.SmallImageList = $imgList
  $lstView.View = "Details"
  #
  #chPoint
  #
  $chPoint.Text = "Line"
  $chPoint.Width = 50
  #
  #chError
  #
  $chError.Text = "Error"
  $chError.TextAlign = "Right"
  $chError.Width = 65
  #
  #chCause
  #
  $chCause.Text = "Description"
  $chCause.Width = 650
  #
  #txtEdit
  #
  $txtEdit.AcceptsTab = $true
  $txtEdit.Dock = "Fill"
  $txtEdit.Font = New-Object Drawing.Font("Courier New", 10)
  $txtEdit.ScrollBars = "Both"
  $txtEdit.Add_Click({Write-CursorPoint})
  $txtEdit.Add_KeyUp({Write-CursorPoint})
  $txtEdit.Add_TextChanged({Write-CursorPoint})
  #
  #gboMake
  #
  $gboMake.Controls.AddRange(@($lblLab1, $cboPlat, $chkExec, $chkWApp, $chkIDbg, `
    $chkIMem, $lblLab2, $txtIOut, $lblLab3, $lboRefs))
  $gboMake.Dock = "Fill"
  $gboMake.Text = "Building Parameters"
  #
  #lblLab1
  #
  $lblLab1.Location = New-Object Drawing.Point(21, 33)
  $lblLab1.Text = "Platform:"
  $lblLab1.Width = 50
  #
  #cboPlat
  #
  $cboPlat.Anchor = "Left, Top, Right"
  $cboPlat.Items.AddRange(@(".NET Framework 2.0", ".NET Framework 3.5"))
  $cboPlat.Location = New-Object Drawing.Point(71, 30)
  $cboPlat.SelectedItem = ".NET Framework 2.0"
  $cboPlat.Width = 180
  $cboPlat.Add_SelectedIndexChanged($cboPlat_SelectedIndexChanged)
  #
  #chkExec
  #
  $chkExec.Checked = $true
  $chkExec.Location = New-Object Drawing.Point(23, 63)
  $chkExec.Text = "Create Executable"
  $chkExec.Width = 120
  $chkExec.Add_Click($chkExec_Click)
  #
  #chkWApp
  #
  $chkWApp.Location = New-Object Drawing.Point(43, 83)
  $chkWApp.Text = "Windows Application"
  $chkWApp.Width = 130
  $chkWApp.Add_Click($chkWApp_Click)
  #
  #chkIDbg
  #
  $chkIDbg.Checked = $true
  $chkIDbg.Location = New-Object Drawing.Point(23, 103)
  $chkIDbg.Text = "Include Debug Information"
  $chkIDbg.Width = 157
  #
  #chkIMem
  #
  $chkIMem.Enabled = $false
  $chkIMem.Location = New-Object Drawing.Point(23, 123)
  $chkIMem.Text = "Building In Memory"
  $chkIMem.Width = 130
  #
  #lblLab2
  #
  $lblLab2.Location = New-Object Drawing.Point(23, 163)
  $lblLab2.Text = "Output:"
  $lblLab2.Width = 45
  #
  #txtIOut
  #
  $txtIOut.Anchor = "Left, Top, Right"
  $txtIOut.Location = New-Object Drawing.Point(71, 160)
  $txtIOut.Width = 180
  #
  #lblLab3
  #
  $lblLab3.Location = New-Object Drawing.Point(23, 203)
  $lblLab3.Size = New-Object Drawing.Size(70, 17)
  $lblLab3.Text = "References:"
  #
  #lboRefs
  #
  $lboRefs.Anchor = "Left, Top, Right, Bottom"
  $lboRefs.ContextMenu = $mnuRefs
  $lboRefs.Location = New-Object Drawing.Point(23, 223)
  $lboRefs.SelectionMode = "One"
  $lboRefs.Size = New-Object Drawing.Size(229, 157)
  #
  #sbPanle
  #
  $sbPanel.Panels.AddRange(@($sbPnl_1, $sbPnl_2))
  $sbPanel.ShowPanels = $true
  $sbPanel.SizingGrip = $false
  #
  #sbPnl_1
  #
  $sbPnl_1.AutoSize = "Spring"
  #
  #sbPnl_2
  #
  $sbPnl_2.Alignment = "Center"
  $sbPnl_2.AutoSize = "Contents"
  #
  #imgList
  #
  $i_1, $i_2, $i_3, $i_4, $i_5, $i_6, $i_7, $i_8 | % { $imgList.Images.Add((Get-Image $_)) }
  #
  #mnuRefs
  #
  $mnuRefs.MenuItems.AddRange(@($mnuIMov, $mnuICnM, $mnuIBuf, $mnuIIns))
  #
  #mnuIMov
  #
  $mnuIMov.Shortcut = "Del"
  $mnuIMov.Text = "Remove Item"
  $mnuIMov.Add_Click({$lboRefs.Items.Remove($lboRefs.SelectedItem)})
  #
  #mnuICnM
  #
  $mnuICnM.Shortcut = "CtrlM"
  $mnuICnM.Text = "Copy And Remove"
  $mnuICnM.Add_Click($mnuICnM_Click)
  #
  #mnuIBuf
  #
  $mnuIBuf.Text = "Insert Copied..."
  $mnuIBuf.Add_Click({if ($script:buff -ne $null) {$lboRefs.Items.Add($script:buff)}})
  #
  #mnuIIns
  #
  $mnuIIns.Shortcut = "CtrlR"
  $mnuIIns.Text = "Add Reference"
  $mnuIIns.Add_Click($mnuIIns_Click)
  #
  #frmMain
  #
  $frmMain.ClientSize = New-Object Drawing.Size(790, 550)
  $frmMain.Controls.AddRange(@($tbTools, $scSplt1, $sbPanel))
  $frmMain.FormBorderStyle = "FixedSingle"
  $frmMain.Icon = $ico
  $frmMain.Menu = $mnuMain
  $frmMain.StartPosition = "CenterScreen"
  $frmMain.Text = "Snippet Compiler"
  $frmMain.Add_Load($frmMain_Load)

  [void]$frmMain.ShowDialog()
}

##################################################################################################

function frmInfo_Show {
  $frmInfo = New-Object Windows.Forms.Form
  $pbImage = New-Object Windows.Forms.PictureBox
  $lblName = New-Object Windows.Forms.Label
  $lblCopy = New-Object Windows.Forms.Label
  $btnExit = New-Object Windows.Forms.Button
  #
  #pbImage
  #
  $pbImage.Location = New-Object Drawing.Point(16, 16)
  $pbImage.Size = New-Object Drawing.Size(32, 32)
  $pbImage.SizeMode = "StretchImage"
  #
  #lblName
  #
  $lblName.Font = New-Object Drawing.Font("Microsoft Sans Serif", 8, [Drawing.FontStyle]::Bold)
  $lblName.Location = New-Object Drawing.Point(53, 19)
  $lblName.Size = New-Object Drawing.Size(360, 18)
  $lblName.Text = "Snippet Compiler v2.54"
  #
  #lblCopy
  #
  $lblCopy.Location = New-Object Drawing.Point(67, 37)
  $lblCopy.Size = New-Object Drawing.Size(360, 23)
  $lblCopy.Text = "(C) 2012-2013 greg zakharov gregzakh@gmail.com"
  #
  #btnExit
  #
  $btnExit.Location = New-Object Drawing.Point(135, 67)
  $btnExit.Text = "OK"
  #
  #frmInfo
  #
  $frmInfo.AcceptButton = $btnExit
  $frmInfo.CancelButton = $btnExit
  $frmInfo.ClientSize = New-Object Drawing.Size(350, 110)
  $frmInfo.ControlBox = $false
  $frmInfo.Controls.AddRange(@($pbImage, $lblName, $lblCopy, $btnExit))
  $frmInfo.ShowInTaskBar = $false
  $frmInfo.StartPosition = "CenterScreen"
  $frmInfo.Text = "About..."
  $frmInfo.Add_Load({$pbImage.Image = $ico.ToBitmap()})

  [void]$frmInfo.ShowDialog()
}

##################################################################################################

function Invoke-Atom {
  if ($txtEdit.Text -ne "") {
    $res = [Windows.Forms.MessageBox]::Show("Do you want to save data before?", `
                 $frmMain.Text, [Windows.Forms.MessageBoxButtons]::YesNoCancel, `
                                        [Windows.Forms.MessageBoxIcon]::Question)

    switch ($res) {
      'Yes'    {
        (New-Object Windows.Forms.SaveFileDialog) | % {
          $_.FileName = "source"
          $_.Filter = "C# (*.cs)|*.cs"
          $_.InitialDirectory = $def

          if ($_.ShowDialog() -eq [Windows.Forms.DialogResult]::OK) {
            Out-File $_.FileName -enc UTF8 -input $txtEdit.Text
          }
        }
        break
      }
      'No'     { $txtEdit.Clear(); break }
      'Cancel' { return }
    }
  }#if
}

function Set-Opacity($obj) {
  $cur.Checked = $false
  $frmMain.Opacity = [float]('.' + $($obj.Text)[0])
  $obj.Checked = $true
}

function Show-Panel($obj1, $obj2) {
  switch ($obj1.Checked) {
    $true  {$obj1.Checked = $false; $obj2.Panel2Collapsed = $true; break }
    $false {$obj1.Checked = $true; $obj2.Panel2Collapsed = $false; break }
  }
}

function Get-CursorPoint {
  $z = $txtEdit.SelectionStart
  $y = $txtEdit.GetLineFromCharIndex($z) + 1
  $x = $z - $txtEdit.GetFirstCharIndexOfCurrentLine()

  return (New-Object Drawing.Point($x, $y))
}

function Write-CursorPoint {
  $sbPnl_2.Text = 'Str: ' + (Get-CursorPoint).Y.ToString() + ', Col: ' + `
                                            (Get-CursorPoint).X.ToString()
}

function Invoke-Builder {
  $lstView.Items.Clear()

  if ($txtEdit.Text -ne "") {
    switch ($cboPlat.SelectedIndex) {
      "0" { $cscp = New-Object Microsoft.CSharp.CSharpCodeProvider; break }
      "1" { $cscp = New-Object Microsoft.CSharp.CSharpCodeProvider($dict); break}
    }

    $cdcp.GenerateExecutable = $chkExec.Checked

    if ($chkWApp.Checked) { $cdcp.CompilerOptions = "/t:winexe" }

    $cdcp.IncludeDebugInformation = $chkIDbg.Checked
    $cdcp.GenerateInMemory = $chkIMem.Checked

    if ($lboRefs.Items.Count -ne 0) {
      for ($i = 0; $i -lt $lboRefs.Items.Count; $i++) {
        $cdcp.ReferencedAssemblies.Add($lboRefs.Items[$i].ToString())
      }
    }

    $cdcp.WarningLevel = 3
    $cdcp.OutputAssembly = $txtIOut.Text

    $script:make = $cscp.CompileAssemblyFromSource($cdcp, $txtEdit.Text)
    $make.Errors | % {
      if ($_.Line -ne 0 -and $_.Column -ne 0) {
        $err = $_.Line.ToString() + ', ' + ($_.Column - 1).ToString()
      }
      elseif ($_.Line -ne 0 -and $_.Column -eq 0) {
        $err = $_.Line.ToString() + ', 0'
      }
      elseif ($_.Line -eq 0 -and $_.Column -eq 0) {
        $err = '*'
      }

      if (!($_.IsWarning)) {
        $lstView.ForeColor = [Drawing.Color]::Crimson
        $itm = $lstView.Items.Add($err, 6)
      }
      else {
        $lstView.ForeColor = [Drawing.Color]::Gray
        $itm = $lstView.Items.Add($err, 7)
      }

      $itm.SubItems.Add($_.ErrorNumber)
      $itm.SubItems.Add($_.ErrorText)
    }
  }#if
}

function Start-AfterBuilding {
  Invoke-Builder
  if ($script:make.Errors.Count -eq 0) { Invoke-Item $txtIOut.Text }
}

function Get-Image($img) {
  [Drawing.Image]::FromStream((New-Object IO.MemoryStream(($$ = `
              [Convert]::FromBase64String($img)), 0, $$.Length)))
}

##################################################################################################

#
#do not modify or remove this because these are images for toolbar and lower panel
#
$i_1 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAARCAIAAACNaGH2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAA" + `
       "AAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAVFJREFUOE91kTGOgzAQRc2ZOA" + `
       "s9lU+Uxj1lak7hMtJKVCjalSIZkpiEVbSN980Y2GijjEaDgTff3+PiNs/GmJQKKk+txuhboR9TsX7kCd22rXP" + `
       "eeU/d7/eydr5pGuput6NO8yx5n810/4Z7vMT1kUjrCJod9G2h3XvaOp8ScqW1St8iTt5qW1dVVV3XpXXxHoVm" + `
       "r3+0ejCDhveiTYPQcYqcbKN/wof+ddCkXyLhJE5XodFGjAaffIaeE21aVjqODCvTWYzd+75nXcqroATu4zSaG" + `
       "Ee0IWjw3mbHzEE75UtusJwS+hIHxgkkB1KIPBwOyHddt/aIk8s1LDQc9KtpvWIJJij0+XzievOkqHi11ujdO7" + `
       "Q336J9PgnNfW2j5ffz4NYJim+hx/EL7U0Dx8veG7hOcBw+heaU2GIvar7kvNYqiTATFDqE418Ox6A55AySz8A" + `
       "v1EEhBG84RKcAAAAASUVORK5CYII="

$i_2 = "iVBORw0KGgoAAAANSUhEUgAAABIAAAARCAIAAABfOGuuAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAA" + `
       "AAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAOVJREFUOE+VkUEOgyAQRfFMnM" + `
       "NrzJ3Yu3TtKTiEaVOTFgICXXQ3nQG1xjapkOEzII8vQ5OeSQiB1IVoysBZGZY5Yp4vi7QNBWFKoVJ6U8g5Kaw" + `
       "qQUuFrMCaUlwxjeoQfBbBHFtCZxEWV0wDMd8mbMj71iiGGYvRE/A63SRAiI6xYRiIwnNNyoxRL27nKPpPCCFj" + `
       "1W6MzabOTcIcDGN93+dX+h9aa7obY94/6iopwfs7Y13XVZRkwdxUdzcA527Cu6nWjTFrr3VuEqy9MEZuVB96R" + `
       "9ZfSdu2n3XImDHjFtaM+9h/OuRvranSBDuoeeYAAAAASUVORK5CYII="

$i_3 = "iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAIAAACUZLgLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAA" + `
       "AAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAWJJREFUOE+FkTFywjAQRcUROI" + `
       "sqWnpKeirVHIFD0OwdqDnFnsANZiZFEguwncad8tYCm2Bmovksa3nffq08a38aN13psTXLyeM5/7MJ9kdtoyK" + `
       "qBFbY7/fE3W4nIRyPR1EJGsxpiqUk2+02pWDSe1QNEjwtIA1r2muvS1ZZljQGoGJgLFGP2PTiKTPMOgiFmg9H" + `
       "UWYWi0UPBFWv4pO4EaubyCyiSTUxTeL0wXOkzWaD53K5BOjlcPJIPIjjhw8M09MYhi5E8tVqxcG8d/P5nLher" + `
       "/vXhri6/sKk67oYIzdBJKcNRZgAYEtBXX8iEh8MGTGqn9fhcOBURVHQCNuMAWS52816vDA81l0C0GQz40zZs0" + `
       "bMvqYoQE6Yl0gO7EN4xa7Xj6lbtjI3bjglDkmZ6XKXG7DBLZsMhpBvsBjPb93G2Xq3SzyjGEtTdXZg3DsvmJv" + `
       "4nOTHvF6xqjr9r+9TlfUo/gXNq15sSG6qYQAAAABJRU5ErkJggg=="

$i_4 = "iVBORw0KGgoAAAANSUhEUgAAABQAAAARCAIAAABSJhvpAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAA" + `
       "AAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAARRJREFUOE9tklFuxCAMROH+J9" + `
       "jTNU1VabUQAmT/qc3AwNJYoyQEPzwYbH5fthRTo1iLN4a26LD0oYyRhFkNga8rQ/JdlR8PUzSMfEA1M6kkrUt" + `
       "+yaDRzKuw8sDmGJWuPGBWa1uoldXmPwvNpsL5zDmIWA01p2ezQF8pB2jAUmR2C8NYAlMIkgqndMQURFgY+8ST" + `
       "/LLtqMghYINnz51p3eIW2PkBx+hifLFb7DDOic7nY0vpJRLKANavGkhiKrq92B7weT6p5WB6WWXZsI98Dmbny" + `
       "zktV20UC+H3rGLP6B+GedXYf0EgQ1j4eW+8WMuGSSrs/c/h90W3Bb3fq7679ntY1loKyp8b2LltkXfbrGn2y7" + `
       "lZ2x9XMW8UGH69+AAAAABJRU5ErkJggg=="

$i_5 = "iVBORw0KGgoAAAANSUhEUgAAABIAAAAQCAIAAACUZLgLAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAA" + `
       "AAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAhNJREFUOE9jfPPyBgMZAKgNju" + `
       "o2nlWtXqVVtQpOAhnIKGDqbohiBmQ9fXuv77rzbsOdtxC08dY7NLTu0tvgaXtQtOk3rQcq7Tv5BEheePFx4rm" + `
       "X7SefQ1DrcRC7+9TLxVdfuEzdiaIN6IAZpx/V7r0F1Pbr77/7H382HH9eeugpEBXvA6GmA89699/OX3ISRVve" + `
       "irNAPambrhXvubPzwXugznOvvmYffJq0/SEQxa+/V7ntYeHasyh+q1x3unLzhYTV53wWnw1afSVpx929jz8Bd" + `
       "a66+8Fu8W3TKZd0u85FzbvqO20fijagC4Ha3OccNZ9+zGTOOasll6P2PHjx9fenn39MZ1xTaTqjUnEideYls9" + `
       "aNKNqAoQx0pFbHTo2+Q0BtufsfPv3yC+i92A13gfYA9egWHMxfchFdm23Xlri5B4DarOadAAYX0HnAgHFdegP" + `
       "oPL3mM5oVx8zKjhStuARUg2Jb1Kx9QTP3WE/bBwx6oMMaD98LX3sdEmnAuAIit8ZjQOd0br+I0Na27ULB4iPu" + `
       "E7YA42T5hYdBi0+Y9O/3n3fmwL13Jx992nH9HRAFdZ0On30YnjZAqQRodeXyg5b1yzTKFwERMHEBkXbtLuPmg" + `
       "0BkUHkE6DFgeAA9gqINmF6m7blQtfJQ/sL9+YsPAW0GxikYXYSg0mVXJ+6+DQw2FG1ADlAnWqpF40KSIro2ZC" + `
       "Fi2ACR3EDpQ7cspgAAAABJRU5ErkJggg=="

$i_6 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAANCAIAAAD5fKMWAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAA" + `
       "AAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAJxJREFUKFONjEEOwyAMBMn/P5" + `
       "lD1FSCENt5QLpgcA1tpaI52LtjFrk42LvvMi59r9uwwn4jJOAqwAS2llAoMCegHUsq9LWFVVAG22odADm12hS" + `
       "JGyb1s8ioICgcBxudP8A620RPz/T91IZPG4m/8UI4z92AVOcH8AeaoPppfzvYQ86bgs/ysQ3U0ED1l91+hJ3i" + `
       "mlLjiCsoidJzG15Z2J4gUYDWoQAAAABJRU5ErkJggg=="

$i_7 = "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAIAAACQkWg2AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAA" + `
       "AAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAsZJREFUOE9FkmtIk1EYx9/nvH" + `
       "u3V+dUyltIIaI5DAsiyy5SlphmCprpirnp8MWaoEikXwzayrQgzTLtQ0hN0UIssyQv1AcnQnMaXlIzTDOsvG7" + `
       "OnG7qTmdq+vBwLpzf/znP4fwBY0z9D6O+k6qpdlha5lOwsri4zDI2eSqz/4DQyWmLoYiAhNlg+JsQjzkOFxXh" + `
       "ykpcUYELCnBGBo6Onj1xfH5iYgOzV9+gLafDcGoqVqlwYSHOzcUKBU5JsWd8PA4NnQvY211fty2Yi47CERE2i" + `
       "eRDerotONjm7W1xdV11d1/192+NicFBQSaxWO/jM/Fz3H7DtE5nDgzEISHNKtXIzExTVtYUwC+A3wBPpFL96K" + `
       "g2O9vg5TXg6VkadtIuGEpKMPj62vz8Rjhu1mIxLi015+aOATy7cvWP0UiIaaXyh0jU6eKicXXt7+ulevcFjnl" + `
       "4kBqTLNsnkxms1sWVlX6t1mQ2E3qc477weH1CYZujY4ODw7VMJdW+c0ePs/N3F5dhgaAfoFuWvGyzEXQN428K" + `
       "hQ5AzzA6gaCVz28QCKRxsVSrl6eWZT+zbA+f3wVQl5NjXSMwJqI2tbodoJ2mP/J4r2i6imEuno+img4famSYN" + `
       "ob5hFCJXD41P0/oSY1mBeMFq/VldnYLQANCGoTu03RSQhzVVVJcw+O9BXisVE6uv7KP494BdHCcaXXVZLHU5+" + `
       "VVkVOaTqbp/PyblMlorBYKNQCNEgmp2p2W9hrgDUJkbJHLib41MfEBwD2EgtzchgYH7D/dUV5WjlAZQK1Y/By" + `
       "gmiRClQBPAaoCAu4C5CMUSdPy5Eub1iDTe7W6mHQJUAJQShoAeAhAtvkAKoBYhI4dPTK/3vCm+ciq/lHJDZHo" + `
       "DkK3AW6tcyQzETrIspFnw41Gw7aXtpw4/HXwuuyyNFB8YZfXOU+PkD27w8+cqq19sbBg2mL+AY/qjcgixtNMA" + `
       "AAAAElFTkSuQmCC"

$i_8 = "iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAIAAAC0tAIdAAAABGdBTUEAALGPC/xhBQAAAglJREFUKFN1jktoE" + `
       "1EUhufMTCbJNNNFS01xZ9GFCCIYhBYUF1XR7nygSxvRVSS6kbQoEoklYggUiuJj300NkRpsXdqNZhHRpp1ETW" + `
       "LSdJJ08piZmFGbx3EmDdoUvfxc/vvf/3wcArtPsXir2bBUq+bZ2Vc7vrQnsT1S1ZKYB0Rbq8F5vSM8n9wx0NU" + `
       "uCK6axCCy2ByURMbhmPlvW1XLxQy5keu96aAWFqxYZ+65j6XT69sH/rILmQlVNLjdrBn2HRiyYbO/+M3k8wX+" + `
       "0VZrlQ2exp/c00cMRx4ZGz6E2NeSmTuu0UpF+TPQYeeTt6spAypsOgZDg+efePejQuMPq7DM+v3BrrZak3IRQ" + `
       "73QgwKJMowcvLwU6kcBUB1orFOuGyclqYPX2YWEW4pSKFowDViGC2eGy3FK9zlTq9SXCfdMT7/cwhP6xmFjY4" + `
       "3DFI0JwAyEnlkxC7r/Cvh9dzNJTzpPyW08kefvKhEasxzGAD+DEqPck8Z3QbNejQOmTCjuyi6x/jaeyL811WM" + `
       "s8hSuAPLwYIKxGPeeOHwa10BPooD5gUaUctrHZFkhsm/gV4Ta/EBqqn8kl+eNo7aj4cDVehQ64Se69p5afL5n" + `
       "5vFr4st878ocuToHW4oHQFiERBBWX3QSLcyESNe142fPTRGKrDiv++zjnivj93XZNeNp35pvJ7o8Fy89LJWk3" + `
       "9PM0i5eafwSAAAAAElFTkSuQmCC"

##################################################################################################

frmMain_Show
