#Region converted Directives from C:\Program Files\IMPOMEZIA\itotalcmd\tools\impomezia\colors.au3.ini
#AutoIt3Wrapper_icon=share\images\colors-exe.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=0
#AutoIt3Wrapper_Res_Comment=IMPOMEZIA TC Color Presets
#AutoIt3Wrapper_Res_Description=IMPOMEZIA TC Color Presets
#AutoIt3Wrapper_Res_Fileversion=0.1.1.5
#AutoIt3Wrapper_Res_LegalCopyright=Copyright © 2007 - 2009 IMPOMEZIA
#AutoIt3Wrapper_Res_Field1Name=OriginalFilename
#AutoIt3Wrapper_Res_Field1Value=colors.exe
#EndRegion converted Directives from C:\Program Files\IMPOMEZIA\itotalcmd\tools\impomezia\colors.au3.ini

#cs
----------------------
 $Id: colors.au3 20 2009-07-06 20:43:23Z IMPOMEZIA $
 AutoIt Version: 3.2.10.0
 Language:       Russian (UTF-8)
 Platform:       Win9x/NT
 Author:         Alexander Sedov aka IMPOMEZIA <support@impomezia.com>
 Script Name:    IMPOMEZIA TC Color Presets
----------------------
#ce

#include <File.au3>
#include <GUIConstantsEx.au3>
#include <GUIDefaultConstants.au3>
#include <Memory.au3>
#include <GuiListView.au3>

#cs --------
 Константны
#ce
Global Const $app_name = "IMPOMEZIA TC Color Presets"
Global Const $app_ver  =  "0.1.1.5"

#cs --------
 предотвращение возможности множественного запуска скрипта
 Если приложение уже запущено, передаём ему фокус
#ce
If WinExists(@ScriptName) Then
  WinActivate($app_name)
  Exit
EndIf
AutoItWinSetTitle(@ScriptName)

Global $language = GetLang()
Global $ftypes_window = 0
Global $ftypes_window_show = 0

#cs --------
 Переопределяем глобальные опции
#ce
Opt("ColorMode", 1)                ; 0=RRGGBB color, 1=BBGGRR color
Opt("RunErrorsFatal", 0)           ; 1=fatal, 0=silent set @error
Opt("TrayIconHide", 1)             ; скрыть в системной панели индикатор AutoIt

#cs --------
 Временный файл, для хранения таблицы преобразования "имя темы" <=> "имя файла темы"
 Ничего лучше временного файла для этих целей не придумал :(
#ce
Global Const $themes_cache = _TempFile(@TempDir, "~", ".ini", 7)

#cs --------
 Получаем значение %COMMANDER_PATH% и %COMMANDER_INI%
 В случае если переменные не заданы (т.е. программа запущена не из TC) показываем MsgBox и выходим
#ce
Global Const $commander_path = EnvGet("COMMANDER_PATH")
Global Const $commander_ini =  EnvGet("COMMANDER_INI")

If $commander_path == "" Or $commander_ini == "" Then
  MsgBox(16, $app_name, LangString("error_msg1"))
  Exit
EndIf

#cs --------
 Читаем/задаём настройки...
 Собственно чтение настроек из конфигурационного файла пока не реализовано
#ce
Global $set_themes_path    = @ScriptDir & "\colors"
Global $set_default_theme  = ""


#cs =====================================================
    СОЗДАНИЕ GUI
#ce =====================================================

#cs --------
 Создаём окно
 Создаём заголовок с именем версий программы и строкой копирайта
#ce
$main_window = GUICreate($app_name, 400, 232)
GuiSetIcon(@ScriptDir & "\share\images\colors.ico", 1)

GUICtrlCreateLabel("", 0, 0, 400, 38)
GUICtrlSetBkColor(-1, 0x745018) 

GUICtrlCreateLabel($app_name & " " & $app_ver, 4, 4, 300, 14)
GUICtrlSetBkColor(-1, 0x745018)
GUICtrlSetColor(-1, 0xffffff)
GUICtrlSetFont(-1, 9, 700)

GUICtrlCreateLabel("Copyright © 2007-2009 IMPOMEZIA <colors@impomezia.com>, BSD License", 8, 20, 340, 14)
GUICtrlSetBkColor(-1, 0x745018)
GUICtrlSetColor(-1, 0xffc4c4)

#cs --------
 Создаём элементы, отвечающие за предварительный просмотр цветовой схемы
 За "раскраску" этих элементов отвечает функция "PreviewRefresh"
#ce
GUICtrlCreateGroup (LangString("theme_group3"), 276, 44, 120, 154)
  $preview_background   = GUICtrlCreateLabel("",            286,  62, 100, 116)
  $preview_mark1_b      = GUICtrlCreateLabel("",            286,  67, 100,  16) ; Эмуляция рамки в 1px
  $preview_mark1        = GUICtrlCreateLabel("Mark",        287,  68,  98,  14, $SS_CENTER)
  $preview_mark2_b      = GUICtrlCreateLabel("",            286,  85, 100,  16)
  $preview_mark2        = GUICtrlCreateLabel("Mark",        287,  86,  98,  14, $SS_CENTER)
  $preview_text1_b      = GUICtrlCreateLabel("",            286, 103, 100,  16)
  $preview_text1        = GUICtrlCreateLabel("Text",        287, 104,  98,  14, $SS_CENTER)
  $preview_text2_b      = GUICtrlCreateLabel("",            286, 121, 100,  16)
  $preview_text2        = GUICtrlCreateLabel("Text",        287, 122,  98,  14, $SS_CENTER)
  $preview_cursor_b     = GUICtrlCreateLabel("",            286, 139, 100,  16)
  $preview_cursor       = GUICtrlCreateLabel("Cursor",      287, 140,  98,  14, $SS_CENTER)
  $preview_mcursor_b    = GUICtrlCreateLabel("",            286, 157, 100,  16)
  $preview_mcursor      = GUICtrlCreateLabel("Mark+Cursor", 287, 158,  98,  14, $SS_CENTER)

#cs --------
 Создаём "ссылку" для открытия окна $label_ftypes 
#ce
$label_ftypes = GUICtrlCreateLabel(LangString("ftype_link"), 278, 180, 116, 14, $SS_NOTIFY+$SS_CENTER)
GUICtrlSetCursor(-1, 0)
GUICtrlSetColor(-1, 0xaff0000)
GUICtrlSetTip(-1, LangString("ftype_header"))

#cs --------
 Создаём элементы, отвечающие за просмотр информации о цветовой схеме
 За "наполнение" информацией отвечает функция "InfoRefresh"
#ce
GUICtrlCreateGroup(LangString("theme_group1"), 4, 100, 268, 98)
  GUICtrlCreateLabel(LangString("theme_author"),      14, 117, 60, 14)
  GUICtrlCreateLabel(LangString("theme_feedback"),    14, 135, 60, 14)
  GUICtrlCreateLabel(LangString("theme_description"), 14, 153, 60, 14)
  
  $info_author = GUICtrlCreateLabel("", 76, 117, 190, 14)
  $info_site   = GUICtrlCreateLabel("", 76, 135, 190, 14)
  $info_desc   = GUICtrlCreateLabel("", 76, 153, 190, 40)

#cs --------
; Создаём ComboBox с выбором схемы
#ce
GUICtrlCreateGroup (LangString("theme_group2"), 4, 44, 268, 50)  
  $theme_combo = GUICtrlCreateCombo("", 10, 62, 256, 512, $CBS_DROPDOWNLIST+$CBS_AUTOHSCROLL+$WS_VSCROLL+$WS_TABSTOP+$CBS_SORT)  
  ;  DefaultTheme()
  CreateThemesList()
  DefaultTheme()

#cs --------
 Создаём кнопки
#ce
$btn_ok     = GUICtrlCreateButton(LangString("btn_ok"),      64, 204, 80, 24)
$btn_cancel = GUICtrlCreateButton(LangString("btn_cancel"), 148, 204, 80, 24)
$btn_help   = GUICtrlCreateButton(LangString("btn_help"),   232, 204, 80, 24)
$btn_apply  = GUICtrlCreateButton(LangString("btn_apply"),  316, 204, 80, 24)

GUICtrlSetState($btn_apply, $GUI_DISABLE) ; Отключаем кнопку "Применить"

#cs --------
 Показываем окно
#ce
GUISetState()

#cs --------
 Создаём окно $ftypes_window
#ce
$ftypes_window = GUICreate(LangString("ftype_header"), 320, 338, -1, -1, $WS_MINIMIZEBOX+$WS_CAPTION+$WS_POPUP+$WS_SYSMENU)
GuiSetIcon(@ScriptDir & "\share\images\colors.ico", 0)
$listView = 0
$btn_close  = GUICtrlCreateButton(LangString("ftype_close"),  236, 310, 80, 24)

#cs =====================================================
    GUI: ОБРАБОТКА СООБЩЕНИЙ
#ce =====================================================
While 1
  $msg = GUIGetMsg(1)
  
  Select
  
    ; Выбрана новая тема
    ; 1. Обновляем предварительный просмотр
    ; 2. Обновляем информацию о теме
    ; 3. Обновляем предварительный просмотр в окне $ftypes_window (если оно не скрыто)
    ; 4. Разрешаем кнопку "Применить"
    Case $msg[0] = $theme_combo
      PreviewRefresh($set_themes_path & "\" & IniRead($themes_cache, "ThemesCache", GUICtrlRead($theme_combo), "-1"))
      InfoRefresh($set_themes_path & "\" & IniRead($themes_cache, "ThemesCache", GUICtrlRead($theme_combo), "-1"))
    
      If $ftypes_window_show = 1 Then
        FileTypesPreview($set_themes_path & "\" & IniRead($themes_cache, "ThemesCache", GUICtrlRead($theme_combo), "-1"))
      EndIf
    
      GUICtrlSetState($btn_apply, $GUI_ENABLE)
  
    ; Нажата кнопка "Применить"
    ; 1. Отключаем кнопку "Применить"
    ; 2. Устанавливаем схему и перезапускаем ТС
    ; 3. Ждём пока появится TC и делаем себя активным окном
    Case $msg[0] = $btn_apply
      GUICtrlSetState($btn_apply, $GUI_DISABLE)
      ApplyTheme(IniRead($themes_cache, "ThemesCache", GUICtrlRead($theme_combo), "-1"))
      WinWaitActive("Total Commander", "", 2)
      WinActivate($app_name)
  
    ; Нажата кнопка "ОК"
    ; 1. Проверяем: если кнопка "Применить" отключена, то ничего не делаем и выходим из программы
    ; иначе устанавливаем схему и перезапускаем ТС
    Case $msg[0] = $btn_ok
    
      ; Если кнопка "Применить" отключена, то ничего не делаем и выходим из программы
      If GUICtrlGetState($btn_apply) <> 144 Then 
        ApplyTheme(IniRead($themes_cache, "ThemesCache", GUICtrlRead($theme_combo), "-1"))
      EndIf
      Exit
  
    ; Нажата кнопка "Справка"
    ; Если что не так винда ругнётся по своему.
    Case $msg[0] = $btn_help
      ShellExecute(@ScriptDir & "\share\docs\colors.html")
    
    ; Показываем и обновляем предварительный просмотр в окне $ftypes_window
    Case $msg[0] = $label_ftypes
      GUISetState(@SW_HIDE, $ftypes_window)
      FileTypesPreview($set_themes_path & "\" & IniRead($themes_cache, "ThemesCache", GUICtrlRead($theme_combo), "-1"))
      GUISetState(@SW_SHOW, $ftypes_window)
      GUISetState(@SW_RESTORE, $ftypes_window)
      $ftypes_window_show = 1
    
    ; Обрабатываем выход из программы
    Case $msg[0] = $GUI_EVENT_CLOSE Or $msg[0] = $btn_cancel Or $msg[0] = $btn_close
      
      If $msg[1] = $main_window Then
        If GUISwitch($ftypes_window) Then
          GUIDelete()
        EndIf
        GUISwitch($main_window)
        GUIDelete()
        FileDelete($themes_cache) ; Удаляем временный файл
        Exit
      ElseIf $msg[1] = $ftypes_window Then
        GUISetState(@SW_HIDE, $ftypes_window)
        $ftypes_window_show = 0
      EndIf
    
    ; При сворачивании главного окна, также сворачиваем $ftypes_window
    Case $msg[0] = $GUI_EVENT_MINIMIZE
      If $msg[1] = $main_window And $ftypes_window_show = 1 Then
        GUISetState(@SW_MINIMIZE, $ftypes_window)
      EndIf
    
    ; При восстановлении любого – окна восстанавливаем все
    Case $msg[0] = $GUI_EVENT_RESTORE
      If $msg[1] = $main_window And $ftypes_window_show = 1 Then
        GUISetState(@SW_RESTORE, $ftypes_window)
		GUISetState(@SW_RESTORE, $main_window)
      ElseIf $msg[1] = $ftypes_window Then
        GUISetState(@SW_RESTORE, $main_window)
		GUISetState(@SW_RESTORE, $ftypes_window)
      EndIf
  EndSelect
  
WEnd

#cs =====================================================
    ФУНКЦИИ
#ce =====================================================

#cs --------
 Функция создаёт список схем с добавлением их в $theme_combo
 Создаёт кэш схем во временном файле ($themes_cache)
#ce
Func CreateThemesList()
  
  MakeThemes()
  
  Local $search = FileFindFirstFile($set_themes_path & "\*.ini")  

  While 1
  Local $file = FileFindNextFile($search) 
    If @error Then ExitLoop
  
  Local $theme_name = IniReadI18N($set_themes_path & "\" & $file, "ColorTheme", "Name",   "-1")
  Local $theme_ver  = IniRead($set_themes_path & "\" & $file, "ColorTheme", "Version",   "-1")
  
  If $theme_name <> -1 And $theme_ver = "1.0"  Then
      ; Если будут найдены темы с одинаковыми именами, то будет добавлена только одна, последняя найденная.
      GUICtrlSetData($theme_combo, $theme_name)
    IniWrite($themes_cache, "ThemesCache", $theme_name, $file)
  EndIf    
    
  WEnd

  FileClose($search)
EndFunc

#cs --------
 Function Name:    DefaultTheme()
 Description:      Определяет какая схема выбрана, и устанавливает её по умолчанию в $theme_combo
                   В случае если это первый запуск (в секции [Colors] нет ключа RedirectSection), то производится экспорт пользовательской темы в файл user(0).ini
           В случае если это первый запуск, но обнаружен файл с именем user(0).ini (или user(1).ini, user(2).ini и т.д.), то производится экспорт пользовательской темы в файл со следующим номером.
           При этом автоматически фильтруется появление дубликатов (если предыдущая схема полностью соответствует, текущей в $commander_ini, то по умолчанию будет установлена предыдущая пользовательская схема)
 Parameter(s):     нет
 Return Value(s):  нет
 Remarks:          Разрослась что-то функция...
#ce
Func DefaultTheme()
  Opt("ExpandEnvStrings", 1)
  Local $theme_ini1 = IniRead($commander_ini, "Colors", "RedirectSection", "-1")
  Local $theme_name = IniReadI18N($theme_ini1, "ColorTheme", "Name",  "-1")
  Local $theme_ini2 = IniRead($themes_cache, "ThemesCache", $theme_name, "-1")

  ; Если это чудовищное условие выполнится :) то совершено точно будет ясно что в wincmd.ini, прописана правильная схема и из правильного места
  If $theme_ini1 <> "-1" And $theme_name <> "-1" And $theme_ini1 = $set_themes_path & "\" & $theme_ini2 Then
    GUICtrlSetData($theme_combo, $theme_name)
 
 ; Если в секции [Colors] нет ключа RedirectSection, то, возможно это первый запуск программы.
 ; 1. Определяем номер для файла вида user(номер).ini
 ; 2. Экспортируем пользовательскую схему, не допускаем дубликатов
  ElseIf $theme_ini1 = "-1" Then
  Local $u_count = 0
  
    While FileExists($set_themes_path & "\user(" & $u_count & ").ini")
      $u_count = $u_count + 1
    WEnd

    ; Читаем из $commander_ini секции [Colors] [Searches]
  Local $colors_section   = IniReadSection($commander_ini, "Colors")
  Local $searches_section = IniReadSection($commander_ini, "Searches")
  
  ; 1. Если $u_count > 0 (что означает, что это уже не первый запуск экспорта, и файл (как минимум) user(0).ini уже существует)
  ; 2. Сравниваем секции $colors_section и $searches_section с секциями из предыдущей пользовательской схемой, если они равны, то устанавливаем по умолчанию предыдущую схему.
  $theme_ini1 = $set_themes_path & "\user(" & $u_count - 1 & ").ini"
  $theme_name = IniReadI18N($theme_ini1, "ColorTheme", "Name",  "-1")
    If $u_count > 0 Then
    
      If IniCompareSections($colors_section, IniReadSection($theme_ini1, "Colors")) And IniCompareSections($searches_section, IniReadSection($theme_ini1, "Searches")) Then
      GUICtrlSetData($theme_combo, $theme_name)
    IniWrite($themes_cache, "ThemesCache", $theme_name, "user(" & $u_count - 1 & ").ini")
    $u_count = -1
    EndIf
  EndIf 
    
  ; Экспортируем пользовательскую схему
  If $u_count <> -1 Then
      $theme_ini1 = $set_themes_path & "\user(" & $u_count & ").ini"
      $theme_name = LangString("theme_user", 0409) & " (" & $u_count & ")"
  
      Local $ColorTheme[4][2] = [ ["Version", "1.0"], ["Name", $theme_name], ["EnableColorFilters", IniRead($commander_ini, "Configuration", "ColorFilters", "1")], ["Description", LangString("theme_user_desc", 0409)] ]
    IniWriteSection($theme_ini1, "ColorTheme", $ColorTheme, 0)
    
    If $language <> 0409 Then
      IniWrite($theme_ini1, "ColorTheme", "Name." & $language, LangString("theme_user") & " (" & $u_count & ")")
    IniWrite($theme_ini1, "ColorTheme", "Description." & $language, LangString("theme_user_desc"))
    $theme_name = LangString("theme_user") & " (" & $u_count & ")"
    EndIf
    
      IniWriteSection($theme_ini1, "Colors", $colors_section)
      IniWriteSection($theme_ini1, "Searches", $searches_section)
      GUICtrlSetData($theme_combo, $theme_name, $theme_name)
    IniWrite($themes_cache, "ThemesCache", $theme_name, "user(" & $u_count & ").ini")
  EndIf
  EndIf

  PreviewRefresh($theme_ini1)
  InfoRefresh($theme_ini1)
  Opt("ExpandEnvStrings", 0)
EndFunc

#cs --------
 Function Name:    IniCompareSections($array1, $array2)
 Description:      Сравнивает секции INI-файла. Наверное не быстро этот поиск работает, но другого не придумал :(
 Parameter(s):     $array1, $array2 - массивы возвращенные функцией "IniReadSection"
 Return Value(s):  1 - секции равны, 0 - секции не равны. 
#ce
Func IniCompareSections($array1, $array2)

  ; Если оба массива "равны" 1, то считаем, что у пользователя просто нет соответствующей секции, и считаем их равными
  ; Если один из массивов "равен" 1, то массивы точно не равны.
  If $array1 = 1 And $array2 = 1 Then
    Return 1
  ElseIf $array1 = 1 Or $array2 = 1 Then
  Return 0
  EndIf

  ; Сравниваем массивы
  ; Если число ключей в секциях различно, цикл завершится на первом шаге, т.е. массивы не равны
  For $i = 0 To $array1[0][0]
  if $array1[$i][0] <> $array2[$i][0] Or $array1[$i][1] <> $array2[$i][1] Then
    Return 0
  EndIf
  Next

  Return 1
  
EndFunc

#cs --------
 Function Name:    RestartTC()
 Description:      Перезапускает Total Commander, после установки схемы. Используется Tinny TC Restarter (restarttc.exe в папке с программой)
 Parameter(s):     нет
 Return Value(s):  нет
#ce
Func RestartTC()
  
  If IniRead($commander_ini, "Configuration", "Onlyonce", "0") = "1" Then
    RunWait(@ScriptDir & "\restarttc.exe 1000")
  Else
  RunWait(@ScriptDir & "\restarttc.exe 0")
  EndIf
EndFunc

#cs --------
 Function Name:    ApplyTheme($inifile)
 Description:      Записывает в $commander_ini путь к выбранной теме, если программа находится в папке с ТС, то вместо абсолютного пути будет, подставляется %COMMANDER_PATH%
 Parameter(s):     имя INI-файла с темой (только имя без пути)
 Return Value(s):  нет
#ce
Func ApplyTheme($inifile)
  IniWrite($commander_ini, "Configuration", "ColorFilters", IniRead($inifile, "ColorTheme", "EnableColorFilters", "1"))
  
  Local $redirect[1][2] = [ ["RedirectSection", StringReplace($set_themes_path, $commander_path, "%COMMANDER_PATH%") & "\" & $inifile] ]
  
  IniWriteSection($commander_ini, "Colors", $redirect, 0)
  IniWriteSection($commander_ini, "Searches", $redirect, 0)
  
  RestartTC()
EndFunc

#cs --------
 Function Name:    InfoRefresh($inifile)
 Description:      Обновляет просмотр информации о схеме
 Parameter(s):     Полное имя INI-файла с темой (путь + имя)
 Return Value(s):  нет
#ce
Func InfoRefresh($inifile)
  
  Local $string = IniRead($inifile, "ColorTheme", "Аuthor." & $language, "-1")
  If $string = "-1" Then
  GUICtrlSetData($info_author, IniRead($inifile, "ColorTheme", "Аuthor", LangString("theme_not_specified")))
  Else
  GUICtrlSetData($info_author, $string)
  EndIf

  $string = IniRead($inifile, "ColorTheme", "Feedback." & $language, "-1")
  If $string = "-1" Then
  GUICtrlSetData($info_site, IniRead($inifile, "ColorTheme", "Feedback", LangString("theme_not_specified")))
  Else
  GUICtrlSetData($info_site, $string)
  EndIf

  $string = IniRead($inifile, "ColorTheme", "Description." & $language, "-1")
  If $string = "-1" Then
  GUICtrlSetData($info_desc, IniRead($inifile, "ColorTheme", "Description", LangString("theme_not_specified")))
  Else
  GUICtrlSetData($info_desc, $string)
  EndIf

EndFunc

#cs --------
 Function Name:    PreviewRefresh($inifile)
 Description:      Обновляет предварительный просмотр цветовой схемы
 Parameter(s):     Полное имя INI-файла с темой (путь + имя)
 Return Value(s):  нет
#ce
Func PreviewRefresh($inifile)
  
  ; Получаем значения цветов
  Local $BackColor   = GetColor(IniRead($inifile, "Colors", "BackColor",   "-1"), 0xffffff)   ; Цвет фона
  Local $BackColor2  = GetColor(IniRead($inifile, "Colors", "BackColor2",  "-1"), $BackColor) ; Цвет фона всех чётных строк в файловой панели и текущего каталога в отдельной панели дерева.
  Local $ForeColor   = GetColor(IniRead($inifile, "Colors", "ForeColor",   "-1"), 0x000000)   ; Цвет символов.
  Local $MarkColor   = GetColor(IniRead($inifile, "Colors", "MarkColor",   "-1"), 0x0000ff)   ; Цвет выделения.
  Local $CursorColor = GetColor(IniRead($inifile, "Colors", "CursorColor", "-1"), 0x000000)   ; Цвет курсора.
  Local $CursorText  = GetColor(IniRead($inifile, "Colors", "CursorText",  "-1"), 0x000000)   ; Цвет текста под курсором (только для инверсного курсора).
  
  Local $InverseCursor     = IniRead($inifile, "Colors", "InverseCursor",     "0")
  Local $InverseSelection  = IniRead($inifile, "Colors", "InverseSelection",  "0")
  
  If $InverseSelection = 1 Then
  GUICtrlSetColor($preview_mark1,      $CursorText)
    GUICtrlSetColor($preview_mark2,      $CursorText)
  
    GUICtrlSetBkColor($preview_mark1,    $MarkColor)	
    GUICtrlSetBkColor($preview_mark1_b,  $MarkColor)
    GUICtrlSetBkColor($preview_mark2,    $MarkColor)	
    GUICtrlSetBkColor($preview_mark2_b,  $MarkColor)
  Else
  GUICtrlSetColor($preview_mark1,      $MarkColor)
    GUICtrlSetColor($preview_mark2,      $MarkColor)
  
    GUICtrlSetBkColor($preview_mark1,    $BackColor)	
    GUICtrlSetBkColor($preview_mark1_b,  $BackColor)
    GUICtrlSetBkColor($preview_mark2,    $BackColor2)	
    GUICtrlSetBkColor($preview_mark2_b,  $BackColor2)
  EndIf

  If $InverseCursor = 1 Then
  GUICtrlSetColor($preview_cursor,     $CursorText)
    GUICtrlSetColor($preview_mcursor,    $MarkColor)
  
    GUICtrlSetBkColor($preview_cursor,   $CursorColor)
    GUICtrlSetBkColor($preview_mcursor,  $CursorColor)
  ElseIf $InverseSelection = 1 Then
  GUICtrlSetColor($preview_cursor,     $ForeColor)
    GUICtrlSetColor($preview_mcursor,    $CursorText)
  
    GUICtrlSetBkColor($preview_cursor,   $BackColor)
    GUICtrlSetBkColor($preview_mcursor,  $MarkColor)
  Else
  GUICtrlSetColor($preview_cursor,     $ForeColor)
    GUICtrlSetColor($preview_mcursor,    $MarkColor)
  
    GUICtrlSetBkColor($preview_cursor,   $BackColor)
    GUICtrlSetBkColor($preview_mcursor,  $BackColor)
  EndIf
  
  GUICtrlSetColor($preview_text1,        $ForeColor)
  GUICtrlSetColor($preview_text2,        $ForeColor)	  
  
  GUICtrlSetBkColor($preview_text1,      $BackColor)	
  GUICtrlSetBkColor($preview_text1_b,    $BackColor)
  GUICtrlSetBkColor($preview_text2,      $BackColor2)	
  GUICtrlSetBkColor($preview_text2_b,    $BackColor2)
  
  GUICtrlSetBkColor($preview_background, $BackColor)

  GUICtrlSetBkColor($preview_cursor_b,   $CursorColor)
  GUICtrlSetBkColor($preview_mcursor_b,  $CursorColor)
EndFunc

#cs --------
 Function Name:    GetColor($value, $default)
 Description:      Получение из INI-файла TC цвета (распознаётся стандартный десятичный формат, шестнадцатеричный $BBGGRR и цвет по умолчанию -1)
 Parameter(s):     $value - значение цвета прочитанное из INI-файла, $default - значение цвета по умолчанию (например 0x000000)
 Return Value(s):  цвет, шестнадцатеричное число (BBGGRR)
#ce
Func GetColor($value, $default)
  
  If $value = -1 Then
    Return $default
  EndIf

  If StringRegExp($value, '^[0-9]{1,8}$', 0) Then
    If $value >= 0 And $value <= 16777215 Then
    Return "0x" & Hex($value, 6)
    EndIf
  EndIf
  
  Local $array = StringRegExp($value, '^[$]([0-9a-fA-F]{6})$', 1)
  If @error Then
  Return $default
  Else
    Return "0x" & $array[0]
  EndIf
  
EndFunc

#cs --------
 Function Name:    MakeThemes()
 Description:      Переименовывает файлы схем из дистибутивных названий (name.ini.dist) в рабочие (name.ini), кроме случае если размер рабочего файла не совпадает с дистрибутивным
 Parameter(s):     нет
 Return Value(s):  нет
#ce
Func MakeThemes()
  Local $search = FileFindFirstFile($set_themes_path & "\*.ini.dist")  
 
  If $search = -1 Then
  Return
  EndIf

  While 1
  $file = FileFindNextFile($search)
    If @error Then ExitLoop
  
  $array = StringRegExp($file, '(^[^*]*.ini).dist$', 1)
  If @error Then ExitLoop
  
  If Not FileExists($set_themes_path & "\" & $array[0]) Then
    FileMove($set_themes_path & "\" & $file, $set_themes_path & "\" & $array[0], 1)
    ElseIf FileGetSize($set_themes_path & "\" & $array[0]) = FileGetSize($set_themes_path & "\" & $file) Then
    FileDelete($set_themes_path & "\" & $file)
  EndIf
  WEnd

  FileClose($search)
EndFunc

#cs --------
 Function Name:    LangString($name, $f_language = -1)
 Description:      Получение локализованной строки по псевдониму
 Parameter(s):     $name: строка - псевдоним строки
           $f_language: (не обязательно) форсированный выбор языка, значение по умолчанию -1 (использовать глобальные установки языка)
 Return Value(s):  строка
#ce
Func LangString($name, $f_language = -1)
  If $f_language = -1 Then
    Local $l_language = $language
  Else
    Local $l_language = $f_language
  EndIf
  
  If $l_language = 0409 Then
    Local $out = IniRead(@ScriptDir & "\share\lang\colors\0409.lang", "0409", $name, "-1")
  Else
    Local $out = IniRead(@ScriptDir & "\share\lang\colors\" & $l_language & ".lang", $l_language, $name, IniRead(@ScriptDir & "\share\lang\colors\0409.lang", "0409", $name, "-1"))
  EndIf
  
  If $out = "-1" Then
    Return LangStringDefault($name)
  Else
    Return $out
  EndIf
EndFunc

#cs --------
 Function Name:    IniReadI18N($filename, $section, $key, $default)
 Description:      Обвёртка вокруг функции IniRead, автоматически читает локализованную версию ключа (ключ.код языка).
 Parameter(s):     Аналогичны функции IniRead
 Return Value(s):  строка
#ce
Func IniReadI18N($filename, $section, $key, $default)
  If $language = 0409 Then
    Local $out = IniRead($filename, $section, $key, "-1")
  Else
  Local $out = IniRead($filename, $section, $key & "." & $language, IniRead($filename, $section, $key, "-1"))
  EndIf
  
  If $out = "-1" Then
    Return $default
  Else
  Return $out
  EndIf

EndFunc

#cs --------
 Function Name:    LangStringDefault($name)
 Description:      Таблица языковых строк (используется если не удаться загрузить строку из внешнего файла)
 Parameter(s):     строка - псевдоним строки
 Return Value(s):  строка
#ce
Func LangStringDefault($name)
  Select
  Case $name = "btn_ok"
    Return "OK"
  Case $name = "btn_cancel"
    Return "Cancel"
  Case $name = "btn_help"
    Return "Help"
  Case $name = "btn_apply"
    Return "Apply"
  Case $name = "theme_group1"
    Return "Information on the scheme:"
  Case $name = "theme_group2"
    Return "Color scheme:"
  Case $name = "theme_group3"
    Return "Example:"
  Case $name = "theme_author" 
    Return "Author:"
  Case $name = "theme_feedback"
    Return "Feedback:"
  Case $name = "theme_description"
    Return "Description:"
  Case $name = "theme_not_specified"
    Return "Not specified"
  Case $name = "theme_user"
    Return "User scheme"
  Case $name = "theme_user_desc"
    Return "Автоматически создана из пользовательских настроек"
  Case $name = "error_msg1"
    Return "Данное приложение может быть запущено только из Total Commander (версии 7.0 или выше)"
  Case $name = "ftype_link"
    Return "Color groups"
  Case $name = "ftype_header"
    Return "Color groups (types of files)"
  Case $name = "ftype_close"
    Return "Close"
  Case $name = "ftype_invalid"
    Return "In the chosen scheme there are no color groups"
  Case Else
    Return "empty"
  EndSelect	
EndFunc

#cs --------
 Function Name:    GetLang()
 Description:      Получение значения языка (значение @OSLang, или псевдоним из colors.ini)
 Parameter(s):     нет
 Return Value(s):  число, определяющее язык (например, 0419)
#ce
Func GetLang()
  Local $array = StringRegExp(IniRead(@ScriptDir & "\share\lang\colors\colors.ini", "language", @OSLang, @OSLang), '^[0-9a-fA-F]{4}$', 1)
  if @error Then
    Return @OSLang
  Else
  Return $array[0]
  EndIf
EndFunc


Func FileTypesPreview($inifile)
  Local $i_index, $control_ID
  Local $BackColor   = GetColor(IniRead($inifile, "Colors", "BackColor",   "-1"), 0xffffff)
  Local $BackColor2  = GetColor(IniRead($inifile, "Colors", "BackColor2",  "-1"), $BackColor)
  Local $ForeColor   = GetColor(IniRead($inifile, "Colors", "ForeColor",   "-1"), 0x000000)
    
  GUISwitch($ftypes_window)
        
  For $i_index = GUICtrlSendMsg($listView, $LVM_GETITEMCOUNT, 0, 0) - 1 To 0 Step - 1
    _GUICtrlListView_SetItemSelected($listView, $i_index, 1)
    $control_ID = GUICtrlRead($listView)
    If $control_ID Then GUICtrlDelete($control_ID)
  Next
  
  GUICtrlDelete($listView)
  $listView = GuiCtrlCreateListView("2", 4, 4, 312, 302, $LVS_NOCOLUMNHEADER+$LVS_SINGLESEL)
  GUICtrlSetState (-1, $GUI_HIDE)
  GUICtrlSetBkColor (-1, $BackColor)
  GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)
  
  Local $i = 1
  
  If IniRead($inifile, "Colors", "ColorFilter" & $i, "-1") = "-1" Then
    GuiCtrlCreateListViewItem(LangString("ftype_invalid"), $listView)
    GUICtrlSetBkColor(-1, $BackColor2)
    GUICtrlSetColor(-1, $ForeColor)
  Else  
    While 1
      Local $filter = IniRead($inifile, "Colors", "ColorFilter" & $i, "-1")
      If $filter = "-1" Then ExitLoop
      GuiCtrlCreateListViewItem($filter, $listView)
      GUICtrlSetBkColor(-1, $BackColor2)
      GUICtrlSetColor(-1, GetColor(IniRead($inifile, "Colors", "ColorFilter" & $i & "Color", "-1"), $ForeColor))
      $i = $i + 1
    WEnd
  EndIf
  
  GUICtrlSendMsg($listView, $LVM_SETCOLUMNWIDTH, 0, $LVSCW_AUTOSIZE)
  GUICtrlSetState ($listView, $GUI_SHOW)
EndFunc




