Artifact 7b9facd7ab75f1c01bd7c4630a2dffa1adf4aa7d:
- File debugHelpers.js — part of check-in [232b2c2705] at 2012-11-30 23:00:36 on branch trunk — Рефакторинг в связи с появлением метода stdlib.setTimeout() (user: kuntashov size: 9530) [more...]
$engine JScript $uname debugHelpers $dname Отладчик:Вспомогательные команды $addin stdcommands $addin stdlib $addin global //////////////////////////////////////////////////////////////////////////////////////// ////{ Cкрипт "Отладчик: вспомогательные команды" (debugHelpers.js) для проекта "Снегопат" //// //// Описание: Добавляет возможность вызова консоли запросов для отладки запроса и //// некоторые другие макросы, повышающие удобство использования штатного отладчика. //// //// Автор: Александр Кунташов <kuntashov@gmail.com>, http://compaud.ru/blog ////} stdlib.require('SettingsManagement.js', SelfScript); global.connectGlobals(SelfScript); var settings; // Хранит настройки скрипта (экземпляр SettingsManager'а). //////////////////////////////////////////////////////////////////////////////////////// ////{ Макросы //// /* Открыть запрос в переменной под курсором в консоли запросов из отладчика. */ SelfScript.Self['macrosОтладить запрос модально'] = function () { openQueryConsole(true); } /* Открыть запрос в переменной под курсором в консоли запросов из отладчика. */ SelfScript.Self['macrosОтладить запрос не модально'] = function () { openQueryConsole(false); } /* Позволяет включать/выключать режим остановки по ошибке в отладчике по горячей клавише. */ SelfScript.Self['macrosВключить/выключить остановку по ошибке'] = function () { SelfScript.Self['StopOnErrorOpenedByMacros'] = true; stdcommands.CDebug.BreakOnError.send(); } /* Установить точку останова, предварительно удалив все другие. */ SelfScript.Self['macrosУстановить точку останова и удалить все другие'] = function () { stdcommands.CDebug.BrkptDel.send(); stdcommands.CDebug.Brkpt.send(); } SelfScript.Self['macrosНастройка'] = function () { var dsForm = new DebugHelperSettingsForm(settings); dsForm.ShowDialog(); } function getDefaultMacros() { return "Настройка"; } ////} Макросы // Обработчик показа модальных окон. function onDoModal(dlgInfo) { if (dlgInfo.caption == "Остановка по ошибке" && dlgInfo.stage == openModalWnd) { if (SelfScript.Self['StopOnErrorOpenedByMacros']) { dlgInfo.form.getControl("CheckBox_StopOnError").Value = !dlgInfo.form.getControl("CheckBox_StopOnError").Value; dlgInfo.result = 1; // Нажимаем "Ок". dlgInfo.cancel = true; // Окно показывать не надо. SelfScript.Self['StopOnErrorOpenedByMacros'] = undefined; } } else if (dlgInfo.caption == "Выражение" && dlgInfo.stage == openModalWnd) { if (SelfScript.Self['RunQueryConsoleCommand']) { var params = SelfScript.Self['RunQueryConsoleCommand']; delete SelfScript.Self['RunQueryConsoleCommand']; var exprCtrl = dlgInfo.form.getControl('Expression'); if (!exprCtrl.value.match(/^\s*$/)) { if (!params.commandCheck) { exprCtrl.value = 'ВнешниеОбработки.Создать("' + params.path + '").Отладить(' + exprCtrl.value + ', ' + (params.doModal ? 'Истина' : 'Ложь') + ')'; } else { exprCtrl.value = ''+ params.command + '(' + exprCtrl.value + ', ' + (params.doModal ? 'Истина' : 'Ложь') + ')'; } var wsh = new ActiveXObject("WScript.Shell"); // Посылаем нажатие Enter, чтобы отработало событие "ПриИзменении" поля ввода выражения. stdlib.setTimeout(function () { wsh.SendKeys("{END} {ENTER}"); if (!params.doModal) wsh.SendKeys("%{F4}{F5}"); }, 1000); } } } } function fileExists(path) { if (path) { var f = v8New('File', path); return f.IsFile() && f.Exist(); } return false; } function getAbsolutePath(path) { // Путь относительный? if (path.match(/^\.{1,2}[\/\\]/)) { // Относительные пути должны задаваться относительно главного каталога Снегопата. var mainFolder = profileRoot.getValue("Snegopat/MainFolder"); return mainFolder + path; } return path; } function openQueryConsole(doModal) { var path = getAbsolutePath(settings.current.QueryConsolePath); var query = settings.current.QueryCommand; if (!settings.current.UseCommand) { if (!fileExists(path)) { DoMessageBox('Путь к обработке КонсольЗапросов не задан. Укажите путь в диалоге настроек скрипта.'); var dsForm = new DebugHelperSettingsForm(settings); if (!dsForm.ShowDialog()) { Message('Консоль не будет открыта, т.к. путь к консоли не задан, либо файла по указанному пути не существует!'); return; } } } SelfScript.Self['RunQueryConsoleCommand'] = { 'path': path, 'doModal': doModal, "command": query, "commandCheck":settings.current.UseCommand}; stdcommands.CDebug.EvalExpr.send(); } //////////////////////////////////////////////////////////////////////////////////////// ////{ Форма настройки скрипта - DebugHelperSettingsForm //// function DebugHelperSettingsForm(settings) { this.settings = settings; this.form = loadScriptForm("scripts\\debugHelpers.settings.ssf", this); } DebugHelperSettingsForm.prototype.ShowDialog = function () { return this.form.DoModal(); } DebugHelperSettingsForm.prototype.saveSettings = function () { if (!this.form.UseCommand) { var path = getAbsolutePath(this.form.QueryConsolePath); Message("path: " + path); //Уберем проверку, а вдруг снегопат перенесли и случайно открыли настройку. /* if (!fileExists(path)) { DoMessageBox('Указанный файл не существует! Настройки не могут быть сохранены.'); return; } */ } this.settings.ReadFromForm(this.form); this.settings.SaveSettings(); } DebugHelperSettingsForm.prototype.QueryConsolePathStartChoice = function (Элемент, СтандартнаяОбработка) { // Вставить содержимое обработчика. } DebugHelperSettingsForm.prototype.CmdBarOK = function (Кнопка) { if (this.saveSettings()) this.form.Close(true); } DebugHelperSettingsForm.prototype.CmdBarSave = function (Кнопка) { this.saveSettings(); } DebugHelperSettingsForm.prototype.OnOpen = function () { this.settings.ApplyToForm(this.form); } DebugHelperSettingsForm.prototype.BeforeClose = function (Cancel, DefaultHandler) { if (this.form.Modified) { var answer = DoQueryBox("Настройки были изменены! Сохранить настройки?", QuestionDialogMode.YesNoCancel); switch (answer) { case DialogReturnCode.Yes: DefaultHandler.val = false; if (this.saveSettings()) this.form.Close(true); break; case DialogReturnCode.No: DefaultHandler.val = false; this.form.Close(false); break; case DialogReturnCode.Cancel: Cancel.val = true; break; } } } //// ////} Форма настройки скрипта - DebugHelperSettingsForm //////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////// ////{ Start up //// settings = SettingsManagement.CreateManager('debugHelpers', { 'QueryConsolePath': '' , 'QueryCommand': '', 'UseCommand':'false'}) settings.LoadSettings(); events.connect(windows, "onDoModal", SelfScript.Self) //// ////} Start up ////////////////////////////////////////////////////////////////////////////////////////