Index: SciColorerV8/SciColorerV8Manager.js ================================================================== --- SciColorerV8/SciColorerV8Manager.js +++ SciColorerV8/SciColorerV8Manager.js @@ -1,13 +1,35 @@ $engine JScript $uname SciColorerV8Manager $dname SciColorerV8 Manager +$addin stdlib ReadScintillaMessageDefs() +stdlib.require('TextWindow.js', SelfScript); function macros_ПриКликеПоГиперссылке(){ //предопределенная, вызывается при Ctrl+Click на любом идентификаторе в тексте модуля addins.byUniqueName("SnegopatMainScript").invokeMacros("ПерейтиКОпределению") + stdlib.setTimeout(function(){ + + var twnd = new TextWindow(); + if (twnd.IsActive()){ + //Message('dddd'); + var pos = twnd.GetSelection(); + var view = windows.getActiveView(); + if (!view){ + } else { + if (view.mdObj && view.mdProp) { + view.mdObj.openModule(view.mdProp.id); + twnd = new TextWindow(); + twnd.SetCaretPos(5, 5); + twnd.SetSelection(pos.beginRow, pos.beginCol, pos.endRow, pos.endCol); + } + + } + } + }, 3000); + } function macros_ПриКонтекстномМенюНаНомерахСтрок(){ //предопределенная, вызывается при правом клике на номерах строк //addins.byUniqueName("SciColorerV8").invokeMacros("_РазвернутьВсе"); // например addins.byUniqueName("SciColorerV8").invokeMacros("_ПоказатьМеню"); ADDED epf/ExtendedSearchРасширенныйОтбор.epf Index: epf/ExtendedSearchРасширенныйОтбор.epf ================================================================== --- epf/ExtendedSearchРасширенныйОтбор.epf +++ epf/ExtendedSearchРасширенныйОтбор.epf cannot compute difference between binary files Index: epf/epfloader.js ================================================================== --- epf/epfloader.js +++ epf/epfloader.js @@ -50,10 +50,11 @@ } })(this, this.getEpfRootPath()); }, loadEpf: function(path) { + Message(path); this.macroses = new Array(); var epf = this.v8.LoadEpf(path); if (epf) { var epfName = epf.Metadata().Name; var macroses = this.v8.GetMacroses(epf); Index: epf/ib/1Cv8.1CD ================================================================== --- epf/ib/1Cv8.1CD +++ epf/ib/1Cv8.1CD cannot compute difference between binary files ADDED extSyntaxCheck.js Index: extSyntaxCheck.js ================================================================== --- extSyntaxCheck.js +++ extSyntaxCheck.js @@ -0,0 +1,184 @@ +$engine JScript +$uname extSyntaxCheck +$dname Расширенние сообщений об ошибках . +$addin stdlib +$addin stdcommands + +// (c) Сосна Евгений + +stdlib.require('TextWindow.js', SelfScript); +stdlib.require('ScriptForm.js', SelfScript); +stdlib.require('log4js.js', SelfScript); + +var logger = Log4js.getLogger(SelfScript.uniqueName); +var appender = new Log4js.BrowserConsoleAppender(); +appender.setLayout(new Log4js.PatternLayout(Log4js.PatternLayout.TTCC_CONVERSION_PATTERN)); +logger.addAppender(appender); +logger.setLevel(Log4js.Level.ERROR); + +SelfScript.self['macrosНастройка'] = function() { + extSyntaxCheck = GetExtSyntaxCheck(); + extSyntaxCheck.show(); +} + + +function syntaxAndSpellCheck() { + if(stdcommands.Frntend.SyntaxCheck.getState().enabled) + stdcommands.Frntend.SyntaxCheck.send(); + + var wnd = GetTextWindow(); + + var text = ""; + if (wnd){ + text = wnd.GetText(); + spellChecker = spell.GetSpellChecker(); + spellChecker.SpellModule(text, wnd); + } +} + +ExtSyntaxCheck = ScriptForm.extend({ + + settingsRootPath : SelfScript.uniqueName, + + settings : { + pflSnegopat : { + 'cathSyntaxCheck': false // Перехватывать комманду синтаксической проверки. + } + }, + + construct : function () { + + this._super(SelfScript.fullPath.replace(/.js$/, '.ssf')); //Загрузим форму с настройками, форма должна называться так же как и скрипт, только с расширением ssf + this.RE = new RegExp("^(\\{.{1,}\\}\:.{1,}\)$", "mig"); + this.re_column = new RegExp("\\(\(\\d{1,})\,(\\d{1,})\\)\\}\:", "i"); + this.RE_ERROR_TEXT = new RegExp("\\s\\((Проверка\\:\\s.{1,})\\)$", "gim"); + this.errors = {}; + this.loadSettings(); //Загрузим сохраненные настройки. + + ExtSyntaxCheck._instance = this; + }, + + loadSettings: function(){ + this._super(); + + if (this.form.cathSyntaxCheck) { + //Подключаемся к команде проверки текста + logger.debug('loadSettings addHandler') + stdcommands.Frntend.SyntaxCheck.addHandler(this, "onSyntaxCheck"); + + } else { + logger.debug('loadSettings delHandler') + try { + stdcommands.Frntend.SyntaxCheck.delHandler(this, "onSyntaxCheck"); + } catch(e) { + logger.debug(e.description); + } + + } + + }, + + onSyntaxCheck : function (cmd){ + logger.debug('onSyntaxCheck ') + if (cmd.isBefore){ + this.wnd = new TextWindow(); + } + if(!cmd.isBefore) + { + logger.debug('onSyntaxCheck disconnect') + try { + events.disconnect(Designer, "onMessage", this); + + } catch (e) { } + + hasErrors = false; + + for (var k in this.errors){ + hasErrors = true; + text = this.errors[k]; + var Matches = this.re_column.exec(text); + if (Matches != null){ + + + var param = {} + param['wnd'] = this.wnd; + param['line'] = Matches[1]; + param['column'] = Matches[2]; + logger.debug('onSyntaxCheck вывод сообщения по регулярному выражению.'); + Message(text, mExc3, (function(param){ + logger.debug('on Message Обработчик событий.'); + if (!param['wnd']) { + return + } + if (!param['wnd'].IsActive()) { + return + } + param['wnd'].SetCaretPos(param['line'], param['column']); + view = param['wnd'].GetView(); + if (!view){ + + } else { + logger.debug('view activate '); + view.activate(); + } + + param = null + + + }), param); + } else { + logger.debug('onSyntaxCheck вывод сообщения - не смогли определить.'); + Message(''+text); + } + } + this.errors = {}; + } else { + logger.debug('onSyntaxCheck connect') + events.connect(Designer, "onMessage", this); + } + logger.debug('onSyntaxCheck end') + }, + + onMessage:function(param){ + text = param.text; + if (!text.length) + return + + this.RE = new RegExp("^(\\{.{1,}\\}\:.{1,}\)$", "mig"); + if ((Matches = this.RE.exec(text)) != null){ + param.cancel = true; + str = Matches[1]; + if (!this.errors[str]){ + this.errors[str] = text; + } else { + this.RE_ERROR_TEXT = new RegExp("\\s\\((Проверка\\:\\s.{1,})\\)$", "gim"); + param.cancel = true; + if ((Matches_error = this.RE_ERROR_TEXT.exec(text)) != null){ + str_error = Matches_error[0]; + this.errors[str] = this.errors[str]+' '+str_error; + } + } + } + }, + + Ok_Click:function(Button){ + this.saveSettings(); + this.loadSettings(); + this.form.Close(); + }, + + Close_Click:function(Button){ + this.form.Close(); + } + +}) + + +function GetExtSyntaxCheck() { + if (!ExtSyntaxCheck._instance) + new ExtSyntaxCheck(); + + return ExtSyntaxCheck._instance; +} + +GetExtSyntaxCheck(); ADDED extSyntaxCheck.ssf Index: extSyntaxCheck.ssf ================================================================== --- extSyntaxCheck.ssf +++ extSyntaxCheck.ssf cannot compute difference between binary files Index: wndpanel.js ================================================================== --- wndpanel.js +++ wndpanel.js @@ -18,10 +18,11 @@ var form var needActivate, needHide var api = stdlib.require('winapi.js') +var diff; function getFullMDName(mdObj, mdProp) { var names = [] while(true) @@ -552,10 +553,59 @@ { var pathToForm=SelfScript.fullPath.replace(/.js$/, 'param.ssf') мФормаНастройки=loadScriptForm(pathToForm, SelfScript.self) // Обработку событий формы привяжем к самому скрипту мФормаНастройки.ОткрытьМодально() } + +function КонтекстноеМенюДобавитьКСравнениюА(Кнопка) { + if(form.Controls.WndList.ТекущаяСтрока) { + var obj = getWindowObject(form.Controls.WndList.ТекущаяСтрока.Окно.view); + if (!obj) + return + diff.addA(obj); + + } +} + +function КонтекстноеМенюДобавитьКСравнениюВ(Кнопка) { + if(form.Controls.WndList.ТекущаяСтрока) { + var obj = getWindowObject(form.Controls.WndList.ТекущаяСтрока.Окно.view); + if (!obj) + return + diff.addB(obj); + + } +} + +function КонтекстноеМенюДобавитьКСравнениюС(Кнопка) { + if(form.Controls.WndList.ТекущаяСтрока) { + var obj = getWindowObject(form.Controls.WndList.ТекущаяСтрока.Окно.view); + if (!obj) + return + diff.addC(obj); + + } +} + +function КоманднаяПанельСравненияДействиеОчиститьБуфер(Кнопка) { + diff.clearCache(); +} + +function getWindowObject (view) { + + if (view.mdObj && view.mdProp) + return new MdObject(view.mdObj, view.mdProp, view.title); + + var obj = view.getObject(); + if (obj && toV8Value(obj).typeName(0) == 'TextDocument') + return new TextDocObject(obj, view.title); + + if (obj) Message('Неподдерживаемый тип объекта для сравнения: ' + toV8Value(obj).typeName(0)); + + return null; +} + function мЗаписатьНастройки() { мДляВнешнихФайловОтображатьТолькоИмяФайла=мФормаНастройки.ДляВнешнихФайловОтображатьТолькоИмяФайла мИспользоватьСессии = мФормаНастройки.ИспользоватьСессии; activateSearchElement = мФормаНастройки.ПриОткрытииФормыАктивизироватьСтрокуПоиска; @@ -594,10 +644,197 @@ function WndListПередУдалением(Элемент, Отказ) { Отказ.val = true closeSelected() } + +//////////////////////////////////////////////////////////////////////////////////////// +////{ Вспомогательные объекты. +//// + +MdObject = stdlib.Class.extend({ + construct: function (obj, prop, title) { + this.obj = obj; + this.prop = prop; + this.title = null; + this.md = obj.container; + this.isForm = (prop.name(1) == "Форма"); + }, + getText: function() { + return this.obj.getModuleText(this.prop.id); + }, + + saveTextToTempFile: function(path){ + if (!path) path = GetTempFileName('txt'); + + text = this.getText(); + var file = v8New("textDocument"); + file.setText(text); + try{ + file.Write(path); + } catch (e) { + return null; + } + + return path; + + }, + + activate: function() { + this.obj.openModule(this.prop.id); + return GetTextWindow(); + }, + getTitle: function() { + if (!this.title) + { + function getMdName(mdObj) { + if (mdObj.parent && mdObj.parent.mdClass.name(1) != 'Конфигурация') + return getMdName(mdObj.parent) + '.' + mdObj.mdClass.name(1) + '.' + mdObj.name; + var cname = mdObj.mdClass.name(1); + return (cname ? cname +'.':'') + mdObj.name; + } + this.title = getMdName(this.obj) + '.' + this.prop.name(1); + } + return this.title; + }, + + getForm: function(){ + if (!this.isForm) { + return null + } + + var tempPath = GetTempFileName('ssf'); + + var ep = this.obj.getExtProp("Форма"); + var file = ep.saveToFile(); + try{ + // создадим хранилище на базе файла. Для управляемых форм тут вывалится в catch + var stg = v8Files.attachStorage(file); + // Получим из хранилища содержимое под-файла form + var form = ep.getForm(); + var file1 = v8New("textDocument"); + file1.setText(' '); + file1.Write(tempPath); + file1=null; + + var file = ep.saveToFile(v8files.open("file://"+tempPath, fomIn | fomOut | fomTruncate)); + file.close(); + isManagmendForm = false + } catch(e) { + //logger.error(e.description); + //isManagmendForm = true; + file.seek(0, fsBegin) + var text = file.getString(dsUtf8); + var file = v8New("textDocument"); + + file.setText(text); + var tempPath = GetTempFileName('txt'); + file.Write(tempPath); + newPath = GetTempFileName('ssf'); + MoveFile(tempPath, newPath); + tempPath = newPath; + } + + return tempPath; + } +}); + +TextDocObject = stdlib.Class.extend({ + construct: function (txtDoc, title) { + this.obj = txtDoc; + this.title = title; + }, + getText: function() { + return this.obj.GetText(); + }, + activate: function() { + this.obj.Show(); + return GetTextWindow(); + }, + getTitle: function() { + if (!this.title) + this.title = this.obj.UsedFileName; + return this.title; + } +}); + +diffObject = stdlib.Class.extend({ + construct: function (bla) { + this.kdiffpath = "d:\\WORK\\snegopat\\local\\KDiff3\\kdiff3.exe"; + this.A = null; + this.B = null; + this.C = null; + }, + + addA : function(obj){ + this.A = obj; + }, + + addB : function(obj){ + this.B = obj; + this.diffObjects(); + }, + + addC : function(obj){ + this.C = obj; + }, + + diffObjects: function(){ + //debugger; + if (!this.A || !this.B) { + Message("Не заполенны А или В"); + return; + } + + + if (this.A.isForm = this.B.isForm) { + //diff form... + + //diff files... + pathA = this.A.getForm(); + if (!pathA) return; + + pathB = this.B.getForm(); + if (!pathB) return + + v8reader = stdlib.require(stdlib.getSnegopatMainFolder() + "scripts\\dvcs\\diff-v8Reader.js").GetBackend(); + v8reader(pathA, pathB); + + } else { + //diff files... + pathA = this.A.saveTextToTempFile(); + if (!pathA) return; + + pathB = this.B.saveTextToTempFile(); + if (!pathB) return + + if (this.C) { + pathC = +this.C.saveTextToTempFile(); + if (!pathC) return + + pathC = ' '+pathC; + } else { + pathC = '' + } + + + var cmd = this.kdiffpath +' "'+pathA+'" "'+ pathB +'" '+ pathC + ' -o '+ '"d:\\work\\temp\\'+this.A.getTitle()+'.txt"'; + Message(""+cmd); + ЗапуститьПриложение(cmd, "", true); + + } + + + }, + + clearCache: function () { + this.A = null; + this.B = null; + this.C = null; + } + +}); (function(){ // Инициализация скрипта WndList.One = new WndList form = loadScriptForm(SelfScript.fullPath.replace(/js$/, 'ssf'), SelfScript.self) @@ -637,5 +874,6 @@ if (мИспользоватьСессии){ loadSessionManager(); } мФормаНастройки=null +diff = new diffObject(); Index: wndpanel.ssf ================================================================== --- wndpanel.ssf +++ wndpanel.ssf cannot compute difference between binary files