AutoHotkey: TC Fav Menu

From TotalcmdWiki
Revision as of 09:49, 14 June 2006 by Majkinetor (talk | contribs)
Jump to: navigation, search

TC FavMenu 1.0 beta07
  for Windows XP & 2K

This is Total Commander utility.
It will make TC favorites available in the system.
It will also make TC Favorites to become Open/Save dialog enhancer (for standard dialogs)


TCFAVMENU: Features and Installation

Screenshot


Go back: AutoHotkey


g_title = TC FavMenu 1.0b7
;*************************************************************************
;	TC FavMenu
;
;
;	Created by majkinetor !							Jun 2006
;
;	code.r-moth.com		www.r-moth.com	     r-moth.deviantart.com
;*************************************************************************
#NoEnv

TC_FAVMENU_Init()
return

;==========================================================================

TC_FAVMENU_Init()
{
global

DetectHiddenWindows, on
#SingleInstance force
SetKeyDelay, -1


OnMessage(0x18,  "MessageMonitor")  ;wm_show
OnMessage(0x100, "MessageMonitor")  ;wm_key
cm_editpath			= 2912
cm_CopySrcPathToClip	= 2029
cm_CopyTrgPathToClip	= 2030
cm_FocusLeft			= 4001
cm_FocusRight		= 4002
cm_OpenNewTab		= 3001


if ( ! GetConfigData() )
Setup_Create()
else
CheckConfigData()

SetTrayMenu()
}

;--------------------------------------------------------------------------

MenuHotKey:
CreateFullMenu()
ShowMenu()
DeleteMenu()
return

;--------------------------------------------------------------------------

ShowMenu()
{
global  tcPos

if (tcPos = 2)
{
posX := A_CaretX
posY := A_CaretY
}

if (tcPos = 3)
{
h := WinExist("A")
WinGetPos, , , win_w, win_h, ahk_id %h%

posX := win_w /2
posY := win_h /2
}

Menu, sub1, show, %posX%, %posY%
}

;---------------------------------------------------------------------------

CreateMenu()
{
global
local separator, cmd_cnt, submenu_id, sub_num, mnu, cmd, ico, delta, name


cmd_cnt		= 0
g_sub_cnt	+= 1

if (g_sub_cnt = 1)
delta := g_dynamic

sub_num		= %g_sub_cnt%
submenu_id	= sub%sub_num%

Loop
{
;read next menu item
g_mnu_cnt += 1
IniRead, mnu, %tcIni%, DirMenu, menu%g_mnu_cnt%, &
IniRead, cmd, %tcIni%, DirMenu, cmd%g_mnu_cnt%, &
IniRead, ico, %tcIni%, DirMenu, icon%g_mnu_cnt%, &

if (mnu = "&")
break

menuproc:
;is it separator ?
if (mnu = "-")
{
Menu, %submenu_id%, add
cmd_cnt += 1
continue
}

; "--" exit condition (end of submenu), return this menu to the caller
if (mnu = "--")
return %submenu_id%


; if "-....." submenu, create it (recursion step)
StringMid, c1, mnu, 1, 1
if (c1 = "-")
{

StringMid, name, mnu, 2, 100
Menu, %submenu_id%, add, %name%, % ":" . CreateMenu()
cmd_cnt += 1

if FileExist(ico)
Menu_AssignBitmap( submenu_id, cmd_cnt + delta, ico )

continue
}

Menu, %submenu_id%, add, %mnu%, MenuHandler
cmd_cnt += 1
command%sub_num%_%cmd_cnt% := cmd
menu_order%sub_num%_%cmd_cnt% := g_mnu_cnt

if FileExist(ico)
Menu_AssignBitmap( submenu_id, cmd_cnt + delta, ico )
}

return true
}

;--------------------------------------------------------------------------

CreateFullMenu()
{
global g_dynamic, command0_2, command0_1


ifWinExist ahk_class TTOTAL_CMD
{
hwnd := WinExist()
if (hwnd = WinActive())
goto skipdyn

GetTCPanels(tc_left, tc_right)
command0_1 := tc_left
command0_2 := tc_right

g_dynamic := AddTcPanels(tc_left, tc_right)
}

skipdyn:
if (! CreateMenu() )
{
MsgBox, ,TC Fav Menu, Can not create menu, unable to read wincmd.ini.`nApplication will exit now.
ExitApp
}
}

;---------------------------------------------------------------------------

DeleteMenu()
{
global

if (g_sub_cnt = 0 )
return

loop
{
if (g_sub_cnt = 0)
break

Menu, sub%g_sub_cnt%, Delete
g_sub_cnt -= 1
}

g_mnu_cnt = 0
g_dynamic = 0
}

;---------------------------------------------------------------------------

FullMenuHandler:
if ( DialogWindowActive() )
{
tmp := command0_%A_ThisMenuItemPos%
StringGetPos idx, tmp,\\\
if (idx = -1)
{
SetDialogPath(tmp)
return
}
}

; if dialog is not active, just activate TC & panel
if (A_ThisMenuItemPos = 1)
SendTCCommand(cm_FocusLeft, false )
else
SendTCCommand(cm_FocusRight, false )

WinActivate ahk_class TTOTAL_CMD

return

;--------------------------------------------------------------------------

MenuHandler:
;-- calculate position of selected item in commands array
j := A_ThisMenuItemPos
if (A_ThisMenu = "sub1")
j -= g_dynamic


StringReplace i, A_ThisMenu, sub,
keys := % command%i%_%j%
g_mnu_cnt := % menu_order%i%_%j%

;-- check modifiers
GetKeyState, stateC, Control
GetKeyState, stateS, Shift
if (stateC = "D")
{
if (properties_visible)
return
properties_mnu_cnt := g_mnu_cnt
Properties_Create()
return
}

if (stateS = "D")
bOpenTab := true
else
bOpenTab := false

;-- is it file ?
StringLeft, tmp, keys, 3
if (tmp != "cd ")
{
ShellExecute(keys)
return
}

;-- remove "cd " (all other commands start with this word)
StringMid keys, keys, 4


;-- \\\plugin - call total commander unconditionaly
;-- path      - send keys if dialog else call TC
StringGetPos tmp, keys, \\\
if (tmp != -1)
goto open_tc

if ( DialogWindowActive() )
{
if (IsPseudoVar(keys))
keys := ConvertPseudoPath(keys)
SetDialogPath(keys)
return
}

;-- not the property, not the dialog, let the TC handle it

open_tc:
if (bOpenTab)
SendTCCommand(cm_OpenNewTab)
openTc(keys)
return

;---------------------------------------------------------------------------

ShellExecute(ppath)
{
global g_title

if (IsPseudoVar(ppath))
ppath := ConvertPseudoPath(ppath)

expath := ExpandEnvVars(ppath)

Run %expath%, ,UseErrorLevel
if (ErrorLevel = "ERROR")
MsgBox, 64, %g_title%, Invalid menu item. Command can not be executed:`n%ppath%`n`nExpanded to:`n%expath%

return
}

;---------------------------------------------------------------------------

ExpandEnvVars(ppath)
{
VarSetCapacity(dest, 2000)
DllCall("ExpandEnvironmentStrings", "str", ppath, "str", dest, int, 1999, "Cdecl int")
return dest
}

;---------------------------------------------------------------------------

IsQuoted(str)
{
StringLeft  sl, str, 1
StringRight sr, str, 1
if (sr = """") && (sl = sr)
return true
else
return false
}

;====================== INCLUDES ===========================================

; ######################################################################
; ## ExpandIncludes: 1. occurance of "GUI_Properties.ahk"
; -- #include GUI_Properties.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "GUI_Properties.ahk"
; ######################################################################
Properties_Create()
{
global
;title
Gui, Add, Text, x16 y5 w80 h16, Title
Gui, Add, Edit, veTitle x16 y22 w200 h18

;nav buttons
Gui, Add, Button, gProperties_OnNavClick x255 y23 w15 h15, <
Gui, Add, Button, vbtnUp gProperties_OnNavClick x270 y23 w15 h15, >

;path
Gui, Add, Text, x16 y55 w80 h16, Command
Gui, Add, Edit, veCommand x16 y72 w270 h20,

;icon
Gui, Add, Text, x16 y102 w80 h16, Icon
Gui, Add, Picture, BackgroundTrans AltSubmit vpicIcon x46 y102 w16 h16
Gui, Add, Edit, veIcon x17 y119 w248 h20,
Gui, Add, Button, gProperties_OnBrowseClick x267 y121 w18 h17, ..

Gui, Add, Button, gProperties_OnSaveClick x16 y155 w104 h19, &Save


Gui, Show, x370 y313 h185 w299, Properties
properties_visible := true
}

;-----------------------------------------------------------------------------------

Properties_OnSaveClick:
Gui, Submit, NoHide

IniWrite, %eTitle%, %tcIni%, DirMenu, menu%properties_mnu_cnt%

if !IsQuoted(eCommand)
IniWrite, %eCommand%, %tcIni%, DirMenu, cmd%properties_mnu_cnt%
else
IniWrite, "%eCommand%", %tcIni%, DirMenu, cmd%properties_mnu_cnt%

IniWrite, %eIcon%, %tcIni%, DirMenu, icon%properties_mnu_cnt%
return

;-----------------------------------------------------------------------------------

Properties_OnKeyDown(wparam, lparam)
{
if (wparam = "27")
Properties_Close()
}

;-----------------------------------------------------------------------------------

Properties_OnBrowseClick:
FileSelectFile, picIcon, 3, , Select Icon, Icons (*.ico)
if Errorlevel = 1
return
GuiControl, Text, picIcon, %picIcon%
GuiControl, Text, eIcon, %picIcon%
return

;-----------------------------------------------------------------------------------

Properties_OnShowWindow(wparam, lparam)
{
global
if (! wparam)
return

IniRead, mnu, %tcIni%, DirMenu, menu%properties_mnu_cnt%, &
IniRead, cmd, %tcIni%, DirMenu, cmd%properties_mnu_cnt%, &
IniRead, ico, %tcIni%, DirMenu, icon%properties_mnu_cnt%, &
if (ico = "&")
ico := ""

GuiControl, Text, eTitle, %mnu%
GuiControl, Text, eCommand, %cmd%
GuiControl, Text, eIcon, %ico%
GuiControl, Text, picIcon, %ico%
}

;-----------------------------------------------------------------------------------

Properties_OnNavClick:
tmp := properties_mnu_cnt
if (A_GuiControl = "btnUp")
tmp += 1
else
tmp -= 1

IniRead, mnu, %tcIni%, DirMenu, menu%tmp%, &

if (mnu = "&")
return
properties_mnu_cnt := tmp

if (mnu = "-") or (mnu = "--")
goto Properties_OnNavClick

Properties_OnShowWindow(true, 0)
return

;-----------------------------------------------------------------------------------

Properties_Close()
{
global

Gui, Destroy
properties_visible := false
}


GuiClose:
Properties_Close()
return
; ######################################################################
; ########## END   pasting of "GUI_Properties.ahk"
; ######################################################################
; ######################################################################
; ######################################################################
; ## ExpandIncludes: 1. occurance of "GUI_Setup.ahk"
; -- #include GUI_Setup.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "GUI_Setup.ahk"
; ######################################################################
Setup_Create()
{
global

Gui, 2:-sysmenu
Gui, 2:Add, Text, x75 y10 w156 h17, Total Commander Exe && Ini
Gui, 2:Add, Edit, vSetup_eTcExe x23 y32 w260 h20
Gui, 2:Add, Edit, vSetup_eTcIni x23 y62 w260 h20

Gui, 2:Font, bold
Gui, 2:Add, Text, gSetup_OnBrowseClick vSetup_bExe x286 y35 w13 h14, >>
Gui, 2:Add, Text, gSetup_OnBrowseClick x286 y65 w13 h14, >>
Gui, 2:Font, norm

Gui, 2:Add, Text, x133 y94 w41 h17, Hotkey
Gui, 2:Add, Hotkey, vSetup_Hotkey x103 y112 w100 h30, !w


Gui, 2:Add, GroupBox, x16 y172 w270 h70, Display menu at
Gui, 2:Add, Radio, vSetup_rTcPos x26 y192 w60 h40, mouse position
Gui, 2:Add, Radio, Checked x106 y192 w70 h40, cursor position
Gui, 2:Add, Radio, x176 y192 w100 h40, center of active window

Gui, 2:Add, Button, gSetup_OnSaveClick x106 y262 w90 h25, &Save
Gui, 2:Add, StatusBar

setup_visible := true
Gui, 2:Show, x487 y302 h320 w315, Setup
}

Setup_OnBrowseClick:
if (A_GuiControl = "Setup_bExe")
FileSelectFile, tmp, 3, , Select TotalCmd.exe, TotalCmd.exe
else
FileSelectFile, tmp, 3, , Select wincmd.ini, wincmd.ini

if Errorlevel = 1
return

if (A_GuiControl = "Setup_bExe")
GuiControl, Text, Setup_eTcExe, %tmp%
else
GuiControl, Text, Setup_eTcIni, %tmp%
return

;-----------------------------------------------------------------------------------

Setup_Close()
{
global setup_visible
Gui, 2:Destroy
setup_visible := false
}

;-----------------------------------------------------------------------------------

Setup_OnSaveClick:
msg =
Gui 2:Submit, NoHide

tcExe := Setup_eTcExe
tcIni := Setup_eTcIni

if ( !FileExist(tcExe) )
msg = EXE doesn't exist.`n

if ( !FileExist(tcIni) )
msg = %msg% INI doesn't exist.`n

if ( Setup_HotKey = "")
msg = %msg% You must choose a hot key.`n

if (msg != "")
{
MsgBox %msg%
return
}

;remove previous hotkey (it will not exist on first run, so use errorlevel to avoid error)
Hotkey, %tcKey%,,UseErrorLevel Off

tcKey := Setup_HotKey
Hotkey %tcKey%, MenuHotKey, On

;everything is valid, save the data and quit the window
tcPos := Setup_rTcPos
SaveConfigData()
Setup_Close()

return

;-----------------------------------------------------------------------------------

Setup_OnKeyDown(wparam, lparam)
{
if (wparam = "27")
if ( ! GetConfigData() )
{
MsgBox No configuration. Program will exit.
ExitApp
}
else
Setup_Close()

}

;-----------------------------------------------------------------------------------

Setup_OnShowWindow(wparam, lparam)
{
global
if (! wparam)
return

; change existing configuration
if ( GetConfigData() )
{
GuiControl, Text, Setup_eTcExe, %tcExe%
GuiControl, Text, Setup_eTcIni, %tcIni%
GuiControl, Text, Setup_HotKey, %tcKey%
GuiControl, ,% "Button" . (tcPos+1), 1


SB_SetText("Change existing configuration")
return
}

;running for the first time
; no config -> try to find commander first
if (! FindCommander() )
{
SB_SetText("First run: Total Commander NOT found!")
return
}

; commander found, initialise controls with found data
GuiControl, Text, Setup_eTcExe, %tcExe%
GuiControl, Text, Setup_eTcIni, %tcIni%
SB_SetText("First run: Total Commander found !")
}

;-----------------------------------------------------------------------------------

2GuiClose:
{
Setup_Close()
}
; ######################################################################
; ########## END   pasting of "GUI_Setup.ahk"
; ######################################################################
; ######################################################################

; ######################################################################
; ## ExpandIncludes: 1. occurance of "msg_dispatch.ahk"
; -- #include msg_dispatch.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "msg_dispatch.ahk"
; ######################################################################
MessageMonitor(wparam, lparam, msg, hwnd)
{
h := DllCall("GetAncestor", "uint", hwnd, "uint", 2)
WinGetTitle title, ahk_id %h%


if title = Properties
Properties_Monitor(wparam, lparam, msg)

if (title = "Setup") || (title = "")
Setup_Monitor(wparam, lparam, msg)

}

;-----------------------------------------------------------------------------------

Properties_Monitor(wparam, lparam, msg)
{
if (msg = 0x100)
Properties_OnKeyDown(wparam, lparam)

if (msg = 0x18)
Properties_OnShowWindow(wparam, lparam)
}

;-----------------------------------------------------------------------------------

Setup_Monitor(wparam, lparam, msg)
{

if (msg = 0x100)
Setup_OnKeyDown(wparam, lparam)

if (msg = 0x18)
Setup_OnShowWindow(wparam, lparam)
}
; ######################################################################
; ########## END   pasting of "msg_dispatch.ahk"
; ######################################################################
; ######################################################################
; ######################################################################
; ## ExpandIncludes: 1. occurance of "menuIcons.ahk"
; -- #include menuIcons.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "menuIcons.ahk"
; ######################################################################
/* p_menu            = "MenuName" (e.g., Tray, etc.)
p_item            = 1, ...
p_bm_unchecked,
*/
Menu_AssignBitmap( p_menu, p_item, p_bm_unchecked)
{
static   h_menuDummy

if h_menuDummy=
{
Menu, menuDummy, Add
Menu, menuDummy, DeleteAll

Gui, 99:Menu, menuDummy
Gui, 99:Show, Hide, guiDummy

old_DetectHiddenWindows := A_DetectHiddenWindows
DetectHiddenWindows, on

Process, Exist
h_menuDummy := DllCall( "GetMenu", "uint", WinExist( "guiDummy ahk_class AutoHotkeyGUI ahk_pid " ErrorLevel ) )
if ReportError( ErrorLevel or h_menuDummy = 0, "Menu_AssignBitmap: GetMenu", "h_menuDummy = " h_menuDummy )
return, false

DetectHiddenWindows, %old_DetectHiddenWindows%

Gui, 99:Menu
Gui, 99:Destroy
}

Menu, menuDummy, Add, :%p_menu%

h_menu := DllCall( "GetSubMenu", "uint", h_menuDummy, "int", 0 )
if ReportError( ErrorLevel or h_menu = 0, "Menu_AssignBitmap: GetSubMenu", "h_menu = " h_menu )
return, false

success := DllCall( "RemoveMenu", "uint", h_menuDummy, "uint", 0, "uint", 0x400 )
if ReportError( ErrorLevel or ! success,  "Menu_AssignBitmap: RemoveMenu", "success = " success )
return, false
Menu, menuDummy, Delete, :%p_menu%

if ( p_bm_unchecked )
{
hbm_unchecked := DllCall( "LoadImage"
, "uint", 0
, "str", p_bm_unchecked
, "uint", 2                           ; IMAGE_ICON
, "int", 0
, "int", 0
, "uint", 0x10 | 0x20 )   ; LR_LOADFROMFILE|LR_LOADTRANSPARENT
if ReportError( ErrorLevel or ! hbm_unchecked, "Menu_AssignBitmap: LoadImage: unchecked", "hbm_unchecked = " hbm_unchecked )
return, false


VarSetCapacity(sICONINFO, 20, 0) 	;4 + 2*4+ 2*4 = 20
InsertInteger(1, sICONINFO, 0)


res := DllCall( "GetIconInfo", "Uint", hbm_unchecked, "str", sICONINFO)
if ReportError( ErrorLevel or ! res, "Menu_AssignBitmap: GetIconInfo: ", "res = " res )
return, false

hbm_unchecked := ExtractInteger(sICONINFO, 16, true)

}


success := DllCall( "SetMenuItemBitmaps"
, "uint", h_menu
, "uint", p_item-1
, "uint", 0x400                              ; MF_BYPOSITION
, "uint", hbm_unchecked
, "uint", 0 )
if ReportError( ErrorLevel or ! success, "Menu_AssignBitmap: SetMenuItemBitmaps", "success = " success )
return, false

return, true
}

ReportError( p_condition, p_title, p_extra )
{
if p_condition
MsgBox,
( LTrim
[Error] %p_title%
EL = %ErrorLevel%, LE = %A_LastError%

%p_extra%
)

return, p_condition
}
; ######################################################################
; ########## END   pasting of "menuIcons.ahk"
; ######################################################################
; ######################################################################
; ######################################################################
; ## ExpandIncludes: 1. occurance of "structs.ahk"
; -- #include structs.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "structs.ahk"
; ######################################################################
ExtractInteger(ByRef pSource, pOffset = 0, pIsSigned = false, pSize = 4)
{
Loop %pSize%  ; Build the integer by adding up its bytes.
result += *(&pSource + pOffset + A_Index-1) << 8*(A_Index-1)
if (!pIsSigned OR pSize > 4 OR result < 0x80000000)
return result  ; Signed vs. unsigned doesn't matter in these cases.
; Otherwise, convert the value (now known to be 32-bit) to its signed counterpart:
return -(0xFFFFFFFF - result + 1)
}

InsertInteger(pInteger, ByRef pDest, pOffset = 0, pSize = 4)
{
Loop %pSize%  ; Copy each byte in the integer into the structure as raw binary data.
DllCall("RtlFillMemory", "UInt", &pDest + pOffset + A_Index-1, "UInt", 1, "UChar", pInteger >> 8*(A_Index-1) & 0xFF)
}
; ######################################################################
; ########## END   pasting of "structs.ahk"
; ######################################################################
; ######################################################################
; ######################################################################
; ## ExpandIncludes: 1. occurance of "dialogs.ahk"
; -- #include dialogs.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "dialogs.ahk"
; ######################################################################
DialogWindowActive()
{
WinGet, active_hwnd, ID, A
{
if ( IsDialog( active_hwnd ) )
return 1
else
return 0
}

return 0
}

;------------------------------------------------------------------------------------------------

IsDialog(dlg)
{
global d_input


toolbar := FindWindowExID(dlg, "ToolbarWindow32", "0x440")   ;windows XP
if (toolbar = "0")
toolbar := FindWindowExID(dlg, "ToolbarWindow32", "0x001")  ;windows 2k

combo  := FindWindowExID(dlg, "ComboBoxEx32", "0x47C") ; comboboxex field
button := FindWindowExID(dlg, "Button", "0x001")  ; second button

edit := FindWindowExID(dlg, "Edit", "0x480")  ; edit field

d_input := combo + edit
if (toolbar && (combo || edit) && button)
return 1

return 0
}

;------------------------------------------------------------------------------------------------
; Iterate through controls with the same class, find the one with ctrlID and return its handle
; Used for finding a specific control on a dialog

FindWindowExID(dlg, className, ctrlId)
{
local ctrl, id

ctrl = 0
Loop
{
ctrl := DllCall("FindWindowEx", "uint", dlg, "uint", ctrl, "str", className, "uint", 0 )
if (ctrlId = "0")
{
return ctrl
}

if (ctrl != "0")
{
id := DllCall( "GetDlgCtrlID", "uint", ctrl )
if (id = ctrlId)
return ctrl
}
else
return 0
}
}

;--------------------------------------------------------------------------

SetDialogPath(path)
{
global d_input

ControlGetText d_text, ,ahk_id %d_input%
Sleep 100

ControlFocus, , ahk_id %d_input%
Sleep 100

SendRaw %path%
Send {ENTER}

Sleep 300
ControlSetText, ,%d_text%, ahk_id %d_input%
}
; ######################################################################
; ########## END   pasting of "dialogs.ahk"
; ######################################################################
; ######################################################################
; ######################################################################
; ## ExpandIncludes: 1. occurance of "pseudo.ahk"
; -- #include pseudo.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "pseudo.ahk"
; ######################################################################
ConvertPseudoPath(ppath)
{
StringGetPos idx, ppath, `%\
if (idx != -1)
{
StringMid part1, ppath, 3, idx-2
StringMid part2, ppath, % idx + 2, 256
}
else
StringMid part1, ppath, 3, % StrLen(ppath) - 3

return % GetCommonPath(part1) . part2
}

;-----------------------------------------------------------------------------------

GetCommonPath( csidl )
{
CSIDL_APPDATA=0x001A			; Application Data, new for NT4
CSIDL_COMMON_APPDATA=0x0023		; All Users\Application Data
CSIDL_COMMON_DOCUMENTS=0x002e	; All Users\Documents
CSIDL_DESKTOP=0x0010			; C:\Documents and Settings\username\Desktop
CSIDL_FONTS=0x0014				; C:\Windows\Fonts
CSIDL_LOCAL_APPDATA=0x001C		; non roaming, user\Local Settings\Application Data
CSIDL_MYMUSIC=0x000d			; "My Music" folder
CSIDL_MYPICTURES=0x0027			; My Pictures, new for Win2K
CSIDL_PERSONAL=0x0005			; My Documents
CSIDL_PROGRAM_FILES_COMMON=0x002b	; C:\Program Files\Common
CSIDL_PROGRAM_FILES=0x0026		; C:\Program Files
CSIDL_PROGRAMS=0x0002			; C:\Documents and Settings\username\Start Menu\Programs
CSIDL_RESOURCES=0x0038			; %windir%\Resources\, For theme and other windows resources.
CSIDL_STARTMENU=0x000b			; C:\Documents and Settings\username\Start Menu
CSIDL_STARTUP=0x0007			; C:\Documents and Settings\username\Start Menu\Programs\Startup.
CSIDL_SYSTEM=0x0025				; GetSystemDirectory()
CSIDL_WINDOWS=0x0024			; GetWindowsDirectory()
;================================================================================================

val = % CSIDL_%csidl%
VarSetCapacity(fpath, 256)
DllCall( "shell32\SHGetFolderPathA", "uint", 0, "int", val, "uint", 0, "int", 0, "str", fpath)
return %fpath%
}

;-----------------------------------------------------------------------------------

IsPseudoVar( ppath )
{
StringGetPos idx, ppath, `%$
if (idx != -1)
return true
else
return false
}
; ######################################################################
; ########## END   pasting of "pseudo.ahk"
; ######################################################################
; ######################################################################
; ######################################################################
; ## ExpandIncludes: 1. occurance of "config.ahk"
; -- #include config.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "config.ahk"
; ######################################################################
SetTrayMenu()
{
Menu, tray, icon, shell32.dll, 44
Menu, tray, NoStandard
Menu, tray, tip, TC Fav Menu

Menu, tray, add, Setup, tray_Handler
Menu, tray, add, Delete Config, tray_Handler
Menu, tray, add, Disable, tray_Handler
Menu, tray, add
Menu, tray, add, About, tray_Handler
Menu, tray, add, Reload, tray_Handler
Menu, tray, add, Exit, tray_Handler

}

tray_Handler:
if ( A_ThisMenuItem = "Disable" )
{
HotKey, %tcKey%,,Off
Menu, tray, Rename, Disable, Enable
}

if ( A_ThisMenuItem = "Enable" )
{
HotKey, %tcKey%,,On
Menu, tray, Rename, Enable, Disable
}


if ( A_ThisMenuItem = "Setup" ) && (!setup_visible)
Setup_Create()

if ( A_ThisMenuItem = "Reload" )
Reload

if ( A_ThisMenuItem = "Delete Config" )
{
DeleteConfigData()
Reload
}

if ( A_ThisMenuItem = "About" )
{
msg :=
msg := msg . g_title . "`n`n`n"
msg := msg . "Created by:`t`t Miodrag Milic`n"

msg := msg . "e-mail:`t`t miodrag.milic@gmail.com`n`n`n"

msg := msg . "www.r-moth.com`n"
msg := msg . "Jun 2006`n"
MsgBox 48, About, %msg%
}

if ( A_ThisMenuItem = "Exit" )
ExitApp
return

FindCommander()
{
global tcIni, tcExe

RegRead tcExe, HKEY_CURRENT_USER, Software\Ghisler\Total Commander, InstallDir
RegRead tcIni, HKEY_CURRENT_USER, Software\Ghisler\Total Commander, IniFileName

tcExe = %tcExe%\TotalCmd.exe

if (FileExist(tcExe)) && (FileExist(tcIni))
return true


EnvGet COMMANDER_PATH, COMMANDER_PATH
if (COMMANDER_PATH != "")
{
tcExe = %COMMANDER_PATH%\TotalCmd.exe
tcIni = %COMMANDER_PATH%\wincmd.ini

if (FileExist(tcExe)) && (FileExist(tcIni))
return true
}

return false
}

;-----------------------------------------------------------------------------------

GetConfigData()
{
global

RegRead tcExe, HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcExe
RegRead tcIni, HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcIni
RegRead tcKey, HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcKey
RegRead tcPos, HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcPos

if (tcExe = "") || (tcIni = "") || (tcKey = "")
return false

if (tcPos = "")
tcPos := 3

Hotkey %tcKey%, MenuHotKey,On
return true
}

;-----------------------------------------------------------------------------------

SaveConfigData()
{
global
RegWrite REG_SZ, HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcExe, %tcExe%
RegWrite REG_SZ, HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcIni, %tcIni%
RegWrite REG_SZ, HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcKey, %tcKey%
RegWrite REG_SZ, HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcPos, %tcPos%
}

;-----------------------------------------------------------------------------------

DeleteConfigData()
{
RegDelete HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcExe
RegDelete HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcIni
RegDelete HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcKey
RegDelete HKEY_CURRENT_USER, Software\Miodrag Milic\TcFavMenu, tcPos
}

CheckConfigData()
{
global

if (! FileExist(tcExe) )
{
MsgBox Total Commander not found.`nInvalid config deleted.
reset := true
}

if (! FileExist(tcIni) )
{
MsgBox INI not found.`nInvalid config deleted.
reset := true
}



if (reset)
{
DeleteConfigData()
Reload
}
}
; ######################################################################
; ########## END   pasting of "config.ahk"
; ######################################################################
; ######################################################################
; ######################################################################
; ## ExpandIncludes: 1. occurance of "tc_functions.ahk"
; -- #include tc_functions.ahk --
; ######################################################################
; ######################################################################
; ########## BEGIN pasting of "tc_functions.ahk"
; ######################################################################
OpenTc(keys)
{
global

if not WinExist("ahk_class TTOTAL_CMD")
{
Run %tcExe%
WinWait, ahk_class TTOTAL_CMD
}

WinActivate ahk_class TTOTAL_CMD

SendTCCommand(cm_editpath)
SendRaw, %keys%
Send, {ENTER}
}

;--------------------------------------------------------------------------

GetTCPanels( ByRef pLeft, ByRef pRight)
{
global
local saveClip, tc_left

; do things with the clipboard
saveClip := clipboardAll
SendTCCommand(cm_CopySrcPathToClip)
pLeft := clipboard
SendTCCommand(cm_CopyTrgPathToClip)
pRight := clipboard

SendTCCommand(cm_FocusLeft)
SendTCCommand(cm_CopySrcPathToClip)
tc_left := clipboard
clipboard := saveClip
SaveClip =

; determine what is left what is right panel
if (pLeft != tc_left)
{
SendTCCommand(cm_FocusRight)
pRight := pLeft
pLeft := tc_left
}
}

;---------------------------------------------------------------------------

AddTCPanels( ByRef pLeft, ByRef pRight)
{
cnt := 0
b_same := % pLeft = pRight

; add left panel dir to the menu
StringGetPos idx, pLeft, \, R
if (idx != -1) and (idx != 2)
StringMid pLeft, pLeft, idx+2, 256
Menu sub1, add,   &1   %pLeft% , FullMenuHandler
cnt += 1

; If they are not the same, add right panel
if (! b_same)
{
StringGetPos idx, pRight, \, R
if (idx != -1) and (idx != 2)
StringMid pRight, pRight, idx+2, 256
Menu sub1, add,   &2   %pRight% , FullMenuHandler
cnt += 1
}

; add separator
Menu sub1, add

return cnt + 1
}

;---------------------------------------------------------------------------

SendTCCommand(cmd, wait=1)
{
if (wait)
SendMessage 1075, cmd, 0, , ahk_class TTOTAL_CMD
else
PostMessage 1075, cmd, 0, , ahk_class TTOTAL_CMD
}
; ######################################################################
; ########## END   pasting of "tc_functions.ahk"
; ######################################################################
; ######################################################################