﻿$engine JScript
$uname formAutoVersion
$dname Авто-простановка версии на форме
$addin stdcommands
$addin global
$addin stdlib

stdlib.require('ScriptForm.js', SelfScript);
global.connectGlobals(SelfScript);

// Александр Орефков
// Сосна Евгений <shenja@sosna.zp.ua>

var re = new RegExp('Функция\\s+Версия\\(\\)\\s+Экспорт', 'ig');
var rereplace3 = new RegExp('(Функция\\s+Версия\\(\\)\\s+Экспорт\\n\\s*Возврат\\s*")(\\d+.\\d+.)(\\d+)(")', 'im');
var rereplace4 = new RegExp('(Функция\\s+Версия\\(\\)\\s+Экспорт\\n\\s*Возврат\\s*")(\\d+.\\d+.\\d+.)(\\d+)(")', 'im');

SelfScript.self['macrosОткрыть окно настройки'] = function() {
    GetAutoVersion().show();
}

/* Реализует диалог настройки параметров поиска.*/
AutoVersionDialog = ScriptForm.extend({

    settingsRootPath : SelfScript.uniqueName,
    
    settings : {
        pflSnegopat : {
            'useFormAutoVersion'   : false, // Устанавливать версию на форме. 
            'useModuleAutoVersion' : false // Устанавливать версию в модуле формы в экспортной функции Версия.
        }
    },

    construct : function (query, initSearchArea) {  
        this._instance = null;
        this._super("scripts\\formAutoVersion.ssf");                
        this.form.КлючСохраненияПоложенияОкна = "formAutoVersion.js"
        this.loadSettings();
            
        AutoVersionDialog._instance = this;
    },

    loadSettings : function(){
        this._super();

        if (this.form.useFormAutoVersion || this.form.useModuleAutoVersion) {
            // Добавим обработчик команды сохранения файла
            stdcommands.Frame.FileSave.addHandler(this, "onFileSave");
        }
    },
    
    Form_OnClose : function () {
        this.saveSettings();
        this.loadSettings();
    },
    
    btOk_Click: function (btn) {
        this.close(true);
    },
    
    btCancel_Click: function (btn) {
        this.close(false);
    }, 

    rreplacer3: function (str, p1, p2, p3, p4, offset, s, ss, sss) {
        var i = parseInt(p3)+1;
        return p1+p2+''+i+p4;
    },

    onFileSave : function(cmd){

        if (!this.form.useFormAutoVersion && !this.form.useModuleAutoVersion){
            return;
        }


        if(cmd.isBefore)    // Обработчик вызван перед выполнением команды
        {
            // Получим объект метаданных текущего окна
            var mdObj, av = windows.getActiveView()
            if(!av || !(mdObj = av.mdObj))
                return
            // Посмотрим, не внешний ли отчет/обработка сохраняется.
            if(mdObj.container != mdObj.container.masterContainer)
            {
                // Тут надо перебрать все формы.
                mdObj = mdObj.container.rootObject
                var dateStr = new Date().toLocaleString() 
                var needAsk = -1

                if (this.form.useFormAutoVersion){
                    for(var i = 0, formsCount = mdObj.childObjectsCount("Формы"); i < formsCount; i++)
                    {
                        var formMDObj = mdObj.childObject("Формы", i)
                        //MessageBox(formMDObj.name)
                        var form = formMDObj.getExtProp("Форма").getForm()
                        if(form)
                        {
                            var label = form.Controls.Find("ВерсияНадпись")
                            if(!label)
                            {
                                if(needAsk == -1)
                                    needAsk = MessageBox("Добавить на формы надпись с версией?", mbYesNo | mbIconQuestion | mbDefButton1) == mbaYes ? 1 : 0
                                if(needAsk == 1)
                                {
                                    // Надо добавить надпись
                                    label = form.Controls.Add(v8New("ОписаниеТипов", "Надпись").Типы().Получить(0), "ВерсияНадпись", true)
                                    label.Заголовок = "Версия 0"
                                    form.Высота += 20
                                    label.Лево = 0
                                    label.Верх = form.Высота - 20
                                    label.Высота = 20
                                    label.Ширина = form.Ширина
                                }
                            }
                            if(label)
                            {
                                // Надпись найдена. Надо увеличить номер версии
                                var currentVersion = parseInt(label.Заголовок.match(/\d+/)[0])
                                label.Заголовок = "Версия " + (currentVersion + 1) + " (" + dateStr + ")"
                            }
                        }
                    }    
                } else {

                    mdObj = mdObj.container.rootObject;
                    var mdc = mdObj.mdclass;
                     for(var i = 0, c = mdc.propertiesCount; i < c; i++){
                        var mdProp = mdc.propertyAt(i);
                        var mdPropName = mdc.propertyAt(i).name(1);

                        if (mdObj.isPropModule(mdProp.id)){
                            var text = mdObj.getModuleText(mdProp.id);
                            var Mathes = re.exec(text)
                            if (Mathes !=null){
                                text = text.replace(rereplace3, this.rreplacer3);
                                text = text.replace(rereplace4, this.rreplacer3);
                                mdObj.setModuleText(mdProp.id, text);
                            }
                        }
                    }
                }
                
            }
        }       

    }
    
}); // end of AutoVersionDialog


function GetAutoVersion() {
    if (!AutoVersionDialog._instance)
        new AutoVersionDialog();
    
    return AutoVersionDialog._instance;
}

var auto = GetAutoVersion();

function onFileSave(cmd)
{
    if(cmd.isBefore)    // Обработчик вызван перед выполнением команды
    {
        // Получим объект метаданных текущего окна
        var mdObj, av = windows.getActiveView()
        if(!av || !(mdObj = av.mdObj))
            return
        // Посмотрим, не внешний ли отчет/обработка сохраняется.
        if(mdObj.container != mdObj.container.masterContainer)
        {
            // Тут надо перебрать все формы.
            mdObj = mdObj.container.rootObject
            var dateStr = new Date().toLocaleString() 
            var needAsk = -1
            for(var i = 0, formsCount = mdObj.childObjectsCount("Формы"); i < formsCount; i++)
            {
                var formMDObj = mdObj.childObject("Формы", i)
                //MessageBox(formMDObj.name)
                var form = formMDObj.getExtProp("Форма").getForm()
                if(form)
                {
                    var label = form.Controls.Find("ВерсияНадпись")
                    if(!label)
                    {
                        if(needAsk == -1)
                            needAsk = MessageBox("Добавить на формы надпись с версией?", mbYesNo | mbIconQuestion | mbDefButton1) == mbaYes ? 1 : 0
                        if(needAsk == 1)
                        {
                            // Надо добавить надпись
                            label = form.Controls.Add(v8New("ОписаниеТипов", "Надпись").Типы().Получить(0), "ВерсияНадпись", true)
                            label.Заголовок = "Версия 0"
                            form.Высота += 20
                            label.Лево = 0
                            label.Верх = form.Высота - 20
                            label.Высота = 20
                            label.Ширина = form.Ширина
                        }
                    }
                    if(label)
                    {
                        // Надпись найдена. Надо увеличить номер версии
                        var currentVersion = parseInt(label.Заголовок.match(/\d+/)[0])
                        label.Заголовок = "Версия " + (currentVersion + 1) + " (" + dateStr + ")"
                    }
                }
            }
        }
    }
}

