Artifact 50f7fb37b44420567242f6cbc14a9d321271da75:
- File jump2refs.js — part of check-in [f92f2aca3e] at 2013-03-05 08:27:52 on branch trunk — jump2refs - Добавлены макросы для обязательного показа списка ссылок перед переходом (user: orefkov size: 4094) [more...]
$engine JScript $uname jump2refs $dname Переход к ссылкам метаданных $addin stdlib $addin stdcommands stdlib.require("SelectValueDialog.js", SelfScript); var refs, lastObjects = []; SelfScript.self['macrosПерейти к ссылке ИЗ'] = function () { return doJump(stdcommands.Frntend.FindRefsFrom, false); } SelfScript.self['macrosПерейти к ссылке НА'] = function () { return doJump(stdcommands.Frntend.MDSearchRefs, false); } SelfScript.self['macrosПросмотр ссылок ИЗ'] = function () { return doJump(stdcommands.Frntend.FindRefsFrom, true); } SelfScript.self['macrosПросмотр ссылок НА'] = function () { return doJump(stdcommands.Frntend.MDSearchRefs, true); } SelfScript.self['macrosПерейти обратно'] = function () { if(!lastObjects.length) return false lastObjects.pop().activateInTree() return true } // Перехват вывода в окно сообщений function onMessage(params) { refs.push(params.text) // Запомним, что выводилось params.cancel = true // Не будем реально выводить } // Перехват появления модального диалога function onDoModal(dlgInfo) { dlgInfo.cancel = true // Просто сразу скажем, что в нем нажали OK dlgInfo.result = mbaOK } // Функция ищет объект метаданных в контейнере по его имени function findObject(root, name) { //Message(name) var names = name.split(".") // Разобъем имя на части for(var idx = 0; idx < names.length - 1; idx += 2) { var mdc = root.mdclass for(var i = 0, c = mdc.childsClassesCount; i < c; i++) { var cc = mdc.childClassAt(i) if(cc.name(1, false) == names[idx]){ root = root.childObject(i, names[idx + 1]) break } } } return root } function doJump(command, forceShow) { if(windows.modalMode != msNone) return false // Для начала проверим, что мы в окне метаданных var view = windows.getFocusedView()//windows.getActiveView() if(!view) return false var state = command.getState(view) if(!state || !state.enabled) return false refs = [] // Ставим перехват на вывод в окно сообщений events.connect(Designer, "onMessage", SelfScript.self) // Подавляем показ диалога events.connect(windows, "onDoModal", SelfScript.self) // Посылаем команду поиска ссылок command.sendToView(view) // Убираем перехваты events.disconnect(Designer, "onMessage", SelfScript.self) events.disconnect(windows, "onDoModal", SelfScript.self) //Message(refs[0]); if(refs.length < 2) return false var rootObject = view.mdObj.container.rootObject var currentObject = findObject(rootObject, refs[0].match(/"(.+)"/)[1]) var choice if(refs.length == 2 && !forceShow) choice = refs[1] else { refs.splice(0, 1) var dlg = new SelectValueDialog("Выберите объект для перехода!", refs); if (dlg.selectValue()) choice = dlg.selectedValue; else return false } var mdObj = findObject(rootObject, choice) mdObj.activateInTree() lastObjects.push(currentObject) return true } //{ Горячие клавиши по умолчанию. function getPredefinedHotkeys(predef) { predef.setVersion(1); predef.add('Перейти к ссылке ИЗ', "Ctrl + Enter"); predef.add('Перейти обратно', "Ctrl + Shift + Enter"); } //} Горячие клавиши по умолчанию.