﻿$engine JScript
$uname editor_colors
$dname Настройка профилей цветов редактора
$addin global
$addin stdlib
$addin stdcommands

/*
 * (c) Сосна Евгений <shenja@sosna.zp.ua>
 *  По мотивам http://infostart.ru/public/122391/
 * Есть 3 схемы по умолчанию : типовая, темная, светлая. 
 */

stdlib.require('SettingsManagement.js', SelfScript);

global.connectGlobals(SelfScript);

var settings; // Хранит настройки скрипта (экземпляр SettingsManager'а).


function SetColorCategory(ColorTable) {

    for(var rows = new Enumerator(ColorTable); !rows.atEnd(); rows.moveNext())
    {
        var row = rows.item()
        profileRoot.setValue("ModuleColorCategory/" + row.Категория, row.Цвет)
    }

}

// Метод для обновления цветовой схемы в уже открытых окнах
// Для этого переберем все окна, и если окно обрабатывает команду "Список расширений", и активен
// пункт (подкоманда) "Встроенный язык" - переключим на другое расширения, а потом обратно.
function updateOpenedWindows(childs)
{
    // При посылке команды окно стает активным, чтобы не нарушить порядок окон, переберем их
    // в обратном порядке
    for(var i = childs.count; i-- ; )
    {
        var view = childs.item(i)
        if(view.isContainer != vctNo)
            updateOpenedWindows(view.enumChilds())
        else
        {
            // Возможно, это окно формы, но не открыто на вкладке модуля
            if(view.mdObj && view.mdProp && view.mdObj.isPropModule(view.mdProp.id))
                view.mdObj.openModule(view.mdProp.id)  // переключим на вкладку модуля
            var state = stdcommands.TextEdit.ExtendersList.getState(view)
            if(state)
            {
                state = stdcommands.TextEdit.ExtendersList
                for(var k in state.subStates)
                {
                    var ss = state.subStates[k]
                    if(ss.checked)
                    {
                        if(ss.text == "Встроенный язык")
                            stdcommands.TextEdit.ExtendersList.sendToView(view, k) // Пошлем опять эту команду
                        break
                    }
                }
            }
        }
    }
}

SelfScript.Self['macrosПрименить цветовую схему'] = function () {
    
    var form = {"ListForProfileColors":v8New("ValueList")};
    settings.ApplyToForm(form);
    if (form["ListForProfileColors"].Count() > 0) {
        choice = form["ListForProfileColors"].ChooseItem("Выберете цветовую схему ");
        if (choice!=undefined) {
            SetColorCategory(choice.value);
            updateOpenedWindows(windows.mdiView.enumChilds())
        }
    }
}

SelfScript.Self['macrosСохранить текущую цветовую схему'] = function () {
    
    var form = {"ListForProfileColors":v8New("ValueList")};
    settings.ApplyToForm(form);

    var nameProfile = '';
    var vbs = addins.byUniqueName("vbs").object
    vbs.var0 = "Текущая схема"; vbs.var1 = "Введите новое имя схемы"; vbs.var2 = 0, vbs.var3 = false;
    if (vbs.DoEval("InputString(var0, var1, var2, var3)")) {
            nameProfile  = vbs.var0;
    }
    if (nameProfile.length>0){
        var ValueTable = v8New("ValueTable");
        //По умолчанию типовая схема. 
        ValueTable.Колонки.Добавить("Категория");
        ValueTable.Колонки.Добавить("Цвет");
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Keywords"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Numerics"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Strings"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Dates"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Identifiers"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Operators"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Comments"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Preprocessor"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Others"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Background"; НоваяСтрока.Цвет = profileRoot.getValue("ModuleColorCategory/" + НоваяСтрока.Категория);
        form["ListForProfileColors"].add(ValueTable, nameProfile);
        
        settings.ReadFromForm(form);
        settings.SaveSettings();
    }
}

SelfScript.Self['macrosРедактировать цветовую схему'] = function () {
    
    var form = {"ListForProfileColors":v8New("ValueList")};
    settings.ApplyToForm(form);
    if (form["ListForProfileColors"].Count() > 0) {
        choice = form["ListForProfileColors"].ChooseItem("Выберете цветовую схему ");
        if (choice!=undefined) {
            var dsForm = new ColorEditorForm(choice.value);
            choice.value = dsForm.ShowDialog();
            settings.ReadFromForm(form);
            settings.SaveSettings();
            
        }
    }
}

SelfScript.Self['macrosДобавить цветовую схему'] = function () {
    
    var nameProfile = '';
    var form = {"ListForProfileColors":v8New("ValueList")};
    settings.ApplyToForm(form);
    var vbs = addins.byUniqueName("vbs").object
    vbs.var0 = ""; vbs.var1 = "Введите новое имя схемы"; vbs.var2 = 0, vbs.var3 = false;
    if (vbs.DoEval("InputString(var0, var1, var2, var3)")) {
            nameProfile  = vbs.var0;
    }
    
    if (nameProfile.length > 0 ) {
        var ValueTable = v8New("ValueTable");
        //По умолчанию типовая схема. 
        ValueTable.Колонки.Добавить("Категория");
        ValueTable.Колонки.Добавить("Цвет");
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Keywords"; НоваяСтрока.Цвет = v8New("Цвет", 255, 0, 0);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Numerics"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 0);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Strings"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 0);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Dates"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 0);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Identifiers"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 255);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Operators"; НоваяСтрока.Цвет = v8New("Цвет", 255, 0, 0);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Comments"; НоваяСтрока.Цвет = v8New("Цвет", 0, 128, 0);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Preprocessor"; НоваяСтрока.Цвет = v8New("Цвет", 150, 50, 0);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Others"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 0);
        НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Background"; НоваяСтрока.Цвет = v8New("Цвет", 255, 255, 255);
        form["ListForProfileColors"].add(ValueTable, nameProfile);
        
        settings.ReadFromForm(form);
        settings.SaveSettings();
    }
}

SelfScript.Self['macrosУдалить цветовую схему'] = function () {
    
    var form = {"ListForProfileColors":v8New("ValueList")};
    settings.ApplyToForm(form);
    if (form["ListForProfileColors"].Count() > 0) {
        choice = form["ListForProfileColors"].ChooseItem("Выберете цветовую схему для удаления");
        if (choice!=undefined) {
            form["ListForProfileColors"].Delete(choice);
            settings.ReadFromForm(form);
            settings.SaveSettings();
            
        }
    }
}

SelfScript.Self['macrosВернуть стандартные настройки макроса'] = function () {
    
    var form = {"ListForProfileColors":getDefaultThemeSettings()};
    settings.ReadFromForm(form);
    settings.SaveSettings();

    
}


/* Возвращает название макроса по умолчанию - вызывается, когда пользователь 
дважды щелкает мышью по названию скрипта в окне Снегопата. */
function getDefaultMacros() {
    return 'Применить цветовую схему';
}

////////////////////////////////////////////////////////////////////////////////////////
////{ Форма редактирования цветов схемы
////

function ColorEditorForm(settings) {
    this.settings = settings;
    this.form = loadScriptForm("scripts\\editor_colors.ssf", this);
    
}

ColorEditorForm.prototype.ShowDialog = function() {
    return this.form.DoModal();
}

ColorEditorForm.prototype["ПриОткрытии"] = function() {
    var qec = this.settings;
    for(var i = 0; i<qec.Количество(); i++)
    {
        
        var row = this.form.Категории.Добавить();
        row.Категория = qec.Получить(i).Категория;
        row.Цвет = qec.Получить(i).Цвет;
    }
}

ColorEditorForm.prototype.Save = function () {
    this.settings.Clear();
    for(var rows = new Enumerator(this.form.Категории); !rows.atEnd(); rows.moveNext())
    {
        
        
        var row = rows.item()
        var newrow = this.settings.Add();
        newrow.Категория = row.Категория; newrow.Цвет = row.Цвет;
    }

}

ColorEditorForm.prototype["Записать"] = function(Кнопка) {
    return this.Save();
    // MessageBox("Для вступления изменений в силу перезапустите Конфигуратор", mbOk | mbIconInformation, "Снегопат")
}

ColorEditorForm.prototype["ЗаписатьИЗакрыть"] = function(Кнопка) {
    this.Save();
    this.form.Close(this.settings);
    // MessageBox("Для вступления изменений в силу перезапустите Конфигуратор", mbOk | mbIconInformation, "Снегопат")
}

ColorEditorForm.prototype["ПриВыводеСтроки"] = function(Элемент, ОформлениеСтроки, ДанныеСтроки) {
    
    ОформлениеСтроки.val.Ячейки.Показ.ЦветФона = ДанныеСтроки.val.Цвет
    
    // MessageBox("Для вступления изменений в силу перезапустите Конфигуратор", mbOk | mbIconInformation, "Снегопат")
}

////
////} Форма редактирования цветов схемы
////////////////////////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////////////////////////
////{ Start up
////

function getDefaultThemeSettings(){

    var СписокТем = v8New("ValueList");

    //Светлая схема.
    var ValueTable = v8New("ValueTable");
    ValueTable.Колонки.Добавить("Категория"); ValueTable.Колонки.Добавить("Цвет");
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Keywords"; НоваяСтрока.Цвет = v8New("Цвет", 210, 76, 21);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Numerics"; НоваяСтрока.Цвет = v8New("Цвет", 182, 137, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Strings"; НоваяСтрока.Цвет = v8New("Цвет", 76, 164, 156);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Dates"; НоваяСтрока.Цвет = v8New("Цвет", 133, 153, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Identifiers"; НоваяСтрока.Цвет = v8New("Цвет", 37, 139, 211);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Operators"; НоваяСтрока.Цвет = v8New("Цвет", 212, 47, 51);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Comments"; НоваяСтрока.Цвет = v8New("Цвет", 147, 161, 161);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Preprocessor"; НоваяСтрока.Цвет = v8New("Цвет", 213, 53, 132);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Others"; НоваяСтрока.Цвет = v8New("Цвет", 137, 154, 51);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Background"; НоваяСтрока.Цвет = v8New("Цвет", 255, 251, 240);

    СписокТем.add(ValueTable, "Светлая цветовая схема");

    //Темная цветовая схема.
    var ValueTable = v8New("ValueTable");
    ValueTable.Колонки.Добавить("Категория"); ValueTable.Колонки.Добавить("Цвет");
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Keywords"; НоваяСтрока.Цвет = v8New("Цвет", 210, 76, 21);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Numerics"; НоваяСтрока.Цвет = v8New("Цвет", 182, 137, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Strings"; НоваяСтрока.Цвет = v8New("Цвет", 76, 164, 156);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Dates"; НоваяСтрока.Цвет = v8New("Цвет", 133, 153, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Identifiers"; НоваяСтрока.Цвет = v8New("Цвет", 37, 139, 211);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Operators"; НоваяСтрока.Цвет = v8New("Цвет", 212, 47, 51);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Comments"; НоваяСтрока.Цвет = v8New("Цвет", 147, 161, 161);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Preprocessor"; НоваяСтрока.Цвет = v8New("Цвет", 213, 53, 132);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Others"; НоваяСтрока.Цвет = v8New("Цвет", 137, 154, 51);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Background"; НоваяСтрока.Цвет = v8New("Цвет", 0, 43, 54);
    СписокТем.add(ValueTable, "Темная цветовая схема");

    var ValueTable = v8New("ValueTable");
    ValueTable.Колонки.Добавить("Категория"); ValueTable.Колонки.Добавить("Цвет");
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Keywords"; НоваяСтрока.Цвет = v8New("Цвет", 255, 0, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Numerics"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Strings"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Dates"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Identifiers"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 255);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Operators"; НоваяСтрока.Цвет = v8New("Цвет", 255, 0, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Comments"; НоваяСтрока.Цвет = v8New("Цвет", 0, 128, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Preprocessor"; НоваяСтрока.Цвет = v8New("Цвет", 150, 50, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Others"; НоваяСтрока.Цвет = v8New("Цвет", 0, 0, 0);
    НоваяСтрока = ValueTable.Add(); НоваяСтрока.Категория = "Background"; НоваяСтрока.Цвет = v8New("Цвет", 255, 255, 255);
    СписокТем.add(ValueTable, "Настройкам по умолчанию от 1С");

    return СписокТем;
} 

settings = SettingsManagement.CreateManager('ProfileEditorColors', { 'ListForProfileColors': getDefaultThemeSettings() })
settings.LoadSettings();

////
////} Start up
////////////////////////////////////////////////////////////////////////////////////////

