Changes On Branch orefkov-develop Вы: nobody
Вход

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch orefkov-develop Excluding Merge-Ins

This is equivalent to a diff from 25bbbf6a80 to 3a0874858c

2011-12-09
09:54
Перенос разработок в основную ветку check-in: 3cef153517 user: orefkov tags: trunk
09:33
Начата разработка окружения для кодогенераторов Leaf check-in: 3a0874858c user: orefkov tags: orefkov-develop
2011-12-07
13:13
Начат скрипт по кодогенерации для будущей версии спта check-in: 0a9a17f581 user: orefkov tags: orefkov-develop
08:07
Скрываю сообщения типа 'Объект Роль.Менеджер заблокирован.' check-in: 25bbbf6a80 user: artbear tags: trunk
2011-12-06
11:08
Исправлена ошибка определения координат курсора в случае, когда альтернативный маркер позиции курсора находится ниже стандартного маркера (Попытка <?> Исключение <|> КонецПопытки). check-in: 1faf3daa2c user: kuntashov tags: trunk

Added code_gen/create_doc.js.

            1  +$engine JScript
            2  +$uname codegen_create_doc
            3  +$dname Генератор Документов
            4  +$addin codegen_manager
            5  +$addin stdlib
            6  +$addin vbs
            7  +
            8  +// (c) Александр Орефков orefkov at gmail.com
            9  +// Скрипт - генератор кода создания нового документа
           10  +//
           11  +
           12  +var attrTypeCategory        = "{30E571BC-A897-4A78-B2E5-1EA6D48B5742}"
           13  +
           14  +codegen_manager.registerCodeGen("Документы/Новый/С заполнением всех реквизитов", genarateNewDoc)
           15  +
           16  +function genarateNewDoc(param)
           17  +{
           18  +    // Для начала выберем вид документа
           19  +    var docKind = snegopat.parseTemplateString('<?"Выберите вид документа", Документ>')
           20  +    if(!docKind.length)
           21  +        return false
           22  +    vbs.result = "док" + docKind
           23  +    var varName = vbs.DoExecute('InputString result, "Укажите название группы"')
           24  +    
           25  +    // Получим список возможных типов
           26  +    var tf = new codegen_manager.TypeFinder()
           27  +        
           28  +    var mdObj = param.mdCont.rootObject.childObject("Документы", docKind)
           29  +    
           30  +    var defLangID = stdlib.getUuidFomMDRef(param.mdCont.rootObject.property("ОсновнойЯзык"))
           31  +    //var defLangMD = metadata.current.rootObject.childObject("Языки", defLangID)
           32  +    var defLangMD = param.mdCont.findByUUID(defLangID)
           33  +    var syn = mdObj.synonym(defLangMD.property("КодЯзыка"))
           34  +    if(!syn.length)
           35  +        syn = docKind
           36  +    
           37  +    var text = '//{ Создание документа "' + syn + '" в ' + varName +'\n' + varName + ' = Документы.' + docKind + '.СоздатьДокумент();\n'
           38  +    // Обработаем реквизиты документа
           39  +    text += processAttribs(" Заполнение реквизитов", "", "", varName, mdObj, tf)
           40  +    // Обработаем табличные части
           41  +    var tabPartsCount = mdObj.childObjectsCount("ТабличныеЧасти")
           42  +    if(tabPartsCount)
           43  +    {
           44  +        var lineVarName = varName + "Строка",
           45  +            indent = profileRoot.getValue("ModuleTextEditor/ReplaceTabOnInput") ? codegen_manager.fillLine(" ", profileRoot.getValue("ModuleTextEditor/TabSize")) : "\t"
           46  +        if(tabPartsCount > 1)
           47  +            text += "//{  Заполнение табличных частей\n"
           48  +        for(var i = 0; i < tabPartsCount; i++)
           49  +        {
           50  +            var tp = mdObj.childObject("ТабличныеЧасти", i)
           51  +            text += processAttribs("  Заполнение табличной части " + tp.name,
           52  +                "Для Каждого Из Цикл\n\t" + lineVarName + " = " + varName + "." + tp.name + ".Добавить();\n" , "КонецЦикла;\n",
           53  +                indent + lineVarName, tp, tf)
           54  +        }
           55  +        if(tabPartsCount > 1)
           56  +            text += "//}  Заполнение табличных частей\n"
           57  +    }
           58  +    text += "//} Создание документа " + docKind + " в " + varName
           59  +    param.text = text
           60  +    return true
           61  +}
           62  +
           63  +function processAttribs(comment, header, footer, line, obj, tf)
           64  +{
           65  +    var lines = []
           66  +    for(var i = 0, cnt = obj.childObjectsCount("Реквизиты"); i < cnt; i++)
           67  +    {
           68  +        var attr = obj.childObject("Реквизиты", i)
           69  +        var l = line + "." + attr.name + " = ; // " + tf.getTypeString(attr)
           70  +        var c = attr.comment
           71  +        if(c.length)
           72  +            l += " / " + c
           73  +        lines.push(l)
           74  +    }
           75  +    if(lines.length)
           76  +        return "//{ " + comment + "\n" + header + codegen_manager.formatAssign(lines) + footer + "//} " + comment + "\n"
           77  +    else
           78  +        return ""
           79  +}
           80  +

Added code_gen/gen_mgr.js.

            1  +$engine JScript
            2  +$uname codegen_manager
            3  +$dname Менеджер генераторов кода
            4  +$addin stdlib
            5  +
            6  +// (c) Александр Орефков orefkov at gmail.com
            7  +// Скрипт - для запуска различных генераторов кода
            8  +// Данный скрипт должен быть загружен в addins.ini РАНЕЕ других скриптов - генераторов кода
            9  +var attrTypeCategory        = "{30E571BC-A897-4A78-B2E5-1EA6D48B5742}"
           10  +
           11  +// Сразу загрузим форму, т.к. ее дерево будет использоваться для хранения функций-кодогенераторов
           12  +var codeGens = [], form
           13  +form = loadScriptForm(SelfScript.fullPath.replace(/js$/, 'ssf'), SelfScript.self)
           14  +form.ИспользоватьМетаданные = 1
           15  +form.Дерево.Колонки.Добавить("caller")
           16  +
           17  +// Регистрация функции кодогенератора.
           18  +function registerCodeGen(description, caller)
           19  +{
           20  +    var descr = description.split("/")
           21  +    var root = form.Дерево.Строки
           22  +    for(var i = 0; i < descr.length - 1; i++)
           23  +    {
           24  +        var row = root.Найти(descr[i], "Генератор")
           25  +        if(!row)
           26  +        {
           27  +            row = root.Добавить()
           28  +            row.Генератор = descr[i]
           29  +            row.Картинка = 0
           30  +        }
           31  +        root = row.Строки
           32  +    }
           33  +    // Сначала попробуем найти, может такая запись уже есть.
           34  +    // Это позволит перезагружать скрипты-кодогенераторы
           35  +    row = root.Найти(descr[i])
           36  +    if(!row)
           37  +    {
           38  +        row = root.Добавить()
           39  +        row.Генератор = descr[i]
           40  +    }
           41  +    row.Картинка = 1
           42  +    row.caller = caller
           43  +}
           44  +
           45  +// Собственно, выбор и запуск генерации
           46  +SelfScript.Self["macrosХочу Кода!!!"] = function()
           47  +{
           48  +    var pathToForm = SelfScript.fullPath.replace(/js$/, 'ssf')
           49  +    // Обработку событий формы привяжем к самому скрипту
           50  +    if(form.ОткрытьМодально())
           51  +    {
           52  +        var mdCont = form.ИспользоватьМетаданные == 1 ? metadata.ib : metadata.current
           53  +        var caller = form.ЭлементыФормы.Дерево.ТекущиеДанные.caller
           54  +        var param = {mdCont:mdCont, text:"", caretToBegin:true}
           55  +        if(!caller(param))
           56  +            return
           57  +        var text = param.text
           58  +        var txtWnd = snegopat.activeTextWindow()
           59  +        if(!txtWnd || txtWnd.readOnly)
           60  +            Message(text)
           61  +        else
           62  +        {
           63  +            // Надо получить отступ
           64  +            var sel = txtWnd.getSelection()
           65  +            var textLine = txtWnd.line(sel.beginRow)
           66  +            // Курсор может быть за концом строки
           67  +            while(textLine.length < sel.beginCol - 1)	
           68  +                textLine += ' '
           69  +            // Оставим только часть строки перед курсором
           70  +            textLine = textLine.substr(0, sel.beginCol - 1)
           71  +            var m = textLine.match(/^\s+/)
           72  +            if(m)	// Есть пробельные символы в начале строки
           73  +                text = text.replace(/\n/g, '\n' + m[0])	// Заменим переводы строк на перевод строк + отступ
           74  +            text = text.replace(/\s+$/m, '')			// СокрП
           75  +            // Вставим текст
           76  +            txtWnd.selectedText = text
           77  +            if(param.caretToBegin)
           78  +                txtWnd.setCaretPos(sel.beginRow, sel.beginCol)
           79  +        }
           80  +    }
           81  +}
           82  +
           83  +// Обработчики событий формы
           84  +function ПриОткрытии()
           85  +{
           86  +    // Если текущая конфа не открыта или не отличается от конфы ИБ,
           87  +    // то нет смысла выбирать метаданные
           88  +    if(!stdlib.isConfigOpen() || !stdlib.isConfigsDifferent())
           89  +    {
           90  +        form.ИспользоватьМетаданные = 1
           91  +        form.ЭлементыФормы.ОткрытаяКонфигурация.Доступность = false
           92  +    }
           93  +    else
           94  +        form.ЭлементыФормы.ОткрытаяКонфигурация.Доступность = true
           95  +}
           96  +function КоманднаяПанель1ОК(Кнопка)
           97  +{
           98  +    form.Закрыть(true)
           99  +}
          100  +
          101  +function ДеревоПриАктивизацииСтроки(Элемент)
          102  +{
          103  +    form.ЭлементыФормы.КоманднаяПанель1.Кнопки.Ок.Доступность = !!Элемент.val.ТекущиеДанные.caller
          104  +}
          105  +function ДеревоВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
          106  +{
          107  +    if(Элемент.val.ТекущиеДанные.caller)
          108  +        form.Закрыть(true)
          109  +}
          110  +/////////////////////////////////////////////////////////
          111  +// Разные полезняшки для кодогенераторов
          112  +
          113  +// Класс для получения названий типов объекта матаданных, т.к. штатный объект ОписаниеТипов в
          114  +// режиме Конфигуратора не выдает типы, основанные на метаданных.
          115  +function TypeFinder()
          116  +{
          117  +    var types = new VBArray(metadata.current.typeList(attrTypeCategory, 1)).toArray()
          118  +    for(var i in types)
          119  +    {
          120  +        var t = types[i].split(",")
          121  +        this[t[1]] = t[0]
          122  +    }
          123  +}
          124  +
          125  +TypeFinder.prototype.getTypeString = function(mdObj)
          126  +{
          127  +    var text = []
          128  +    var types = new VBArray(mdObj.types()).toArray()
          129  +    for(var i in types)
          130  +        text.push(this[types[i]]);
          131  +    return text.join(", ")
          132  +}
          133  +
          134  +// Функция, обрабатывает переданный массив строк, выравнивая в них знаки "="
          135  +function formatAssign(lines)
          136  +{
          137  +    var tabSize = profileRoot.getValue("ModuleTextEditor/TabSize")
          138  +    var ll = []
          139  +    maxEqualPos = -1
          140  +    for(var l in lines)
          141  +    {
          142  +        var line = {text: lines[l]}
          143  +        line.eqRealPos = line.text.indexOf("=")
          144  +        if(line.eqRealPos >= 0)
          145  +        {
          146  +            line.eqPosInSpaces = 0
          147  +            for(var k = 0; k < line.eqRealPos; k++)
          148  +            {
          149  +                if(line.text.charAt(k) == "\t")
          150  +                    line.eqPosInSpaces += tabSize - (line.eqPosInSpaces % tabSize)
          151  +                else
          152  +                    line.eqPosInSpaces++
          153  +            }
          154  +            if(line.eqPosInSpaces > maxEqualPos)
          155  +                maxEqualPos = line.eqPosInSpaces
          156  +        }
          157  +        ll.push(line)
          158  +    }
          159  +    var text = ""
          160  +    for(var l in ll)
          161  +    {
          162  +        var line = ll[l]
          163  +        if(line.eqRealPos < 0)
          164  +            text += line.text + "\n"
          165  +        else
          166  +            text += line.text.substr(0, line.eqRealPos) + fillLine(" ", maxEqualPos - line.eqPosInSpaces) + line.text.substr(line.eqRealPos) + "\n"
          167  +    }
          168  +    return text
          169  +}
          170  +
          171  +// Получить строку одинаковых символов указанной длины
          172  +function fillLine(symbol, count)
          173  +{
          174  +    var text = ""
          175  +    while(count--)
          176  +        text += symbol
          177  +    return text
          178  +}

Added code_gen/gen_mgr.ssf.

cannot compute difference between binary files

Changes to snippets.js.

   153    153           Message("Не удалось создать объект 'Svcsvc.Service'. Зарегистрируйте svcsvc.dll");
   154    154           return false;
   155    155       }
   156    156       //debugger;
   157    157      return sel.FilterValue(values.join("\r\n"), 1 | 4, '', 0, 0, 350, 250);    
   158    158   }
   159    159   
          160  +SnippetsManager.prototype.onProcessTemplate = function(params)
          161  +{
          162  +    //Message("Вставляется текст из шаблона '" + params.name + "':\n" + params.text + "\nОтступ '" + params.indent + "'")
          163  +}
   160    164   ////} SnippetsManager
   161    165   
   162    166   ////////////////////////////////////////////////////////////////////////////////////////
   163    167   ////{ SnippetParametersManager
   164    168   ////
   165    169   
   166    170   function SnippetParametersManager() {
................................................................................
   523    527   function GetSnippetsManager() {
   524    528       if (!SnippetsManager._instance)
   525    529           new SnippetsManager();
   526    530           
   527    531       return SnippetsManager._instance;
   528    532   }
   529    533   
   530         -GetSnippetsManager();
          534  +events.connect(snegopat, "onProcessTemplate", GetSnippetsManager());
          535  +
   531    536   ////} Startup