01.12.2006, 18:03 | #1 |
Участник
|
EditorScripts - addIns_OpenInAOT
Вот, попросили написать скрипт для открытия выделенного в редакторе объекта в АОТ.
Описание возможностей + код можно скачать здесь: http://www.axaptapedia.com/Editor_scripts_OpenInAOT |
|
|
За это сообщение автора поблагодарили: konfet (1), belugin (10), zemlyn (1), sukhanchik (2), Alex_KD (1). |
03.12.2006, 01:37 | #2 |
Участник
|
Супер. Как раз тем же занимаюсь =)
|
|
04.12.2006, 09:57 | #3 |
Участник
|
Наверное, моё первое расширение для аксапты
Недостатки по сравнению с кодом Ивана:
Достоинства:
|
|
04.12.2006, 10:37 | #4 |
Участник
|
Украл
1. теперь переходит по идентификатору на котором находится курсор в редакторе
2. теперь если есть исходник, то открывает его в редакторе а не в АОТ 3. Кусок для AutoHotKey Ctrl+Enter - вызов из редактора Win+X - вызов из GlobalToolsMenu (если туда запихать форму) Код: #IfWinActive, ahk_class AxaptaClientClassName #x:: WinMenuSelectItem,,,Сервис,Go component Exit #IfWinActive, ahk_class AxaptaClientClassName ~^Enter:: toEnglish() SendInput,{APPSKEY}sg Exit |
|
07.12.2006, 17:41 | #5 |
Участник
|
Импортировал себе вчера GoComponent - и честно говоря, что удивило, не особо понравилось.
То есть мой скриптик мне более удобно оказалось использовать. Так что, качаем, сравниваем, выбираем. Заодно пишем, чего кому и почему больше нравится. З.Ы. И еще, чего не хватает той или иной утилитке Последний раз редактировалось kashperuk; 07.12.2006 в 17:44. |
|
08.12.2006, 11:05 | #6 |
Administrator
|
Когда-то писал подобное... Так что голосую за kashperuk
Что хочется отметить: 1. Не хвататет для полного счастья макросов и методов класса Global: X++: if (selectedLine) { //The main elementTypes - can be extended add2Set(#ExtendedDataTypesPath); add2Set(#BaseEnumsPath); add2Set(#TablesPath); add2Set(#ClassesPath); add2Set(#FormsPath); add2Set(#ReportsPath); add2Set(#MacrosPath); // Macros //if nothing was found in the AOT, we'll try searching in systemDocumentation if (selectedNodesSet.elements() == 0) { add2Set(#SystemFunctionsPath); add2Set(#SystemTablesPath); add2Set(#SystemTypesPath); add2Set(#SystemEnumsPath); add2Set(#SystemClassesPath); add2Set(#ClassesPath + #AOTRootPath + classstr(Global)); // Global } 3. Открываются сразу 2 окна (в случае системной доки) - одно окно узла и другое - окно редактора. Окно узла - лишнее - его вполне можно убрать - сделав в коде анализ типа узла. Также вылезает окно свойств - что как мне кажется только мешает. Хотя как говорится на вкус и цвет товарищей нет. В общем - это пока только те вещи, которые можно убрать из кода (если конечно доберусь - то исправлю - а если нет (что скорее всего) - то пусть останутся просто моим мнением) 4. Что еще можно сделать (автор идеи - db) - это построить по узлу, который открыт в редакторе перекрестные ссылки (табл TmpxRefReferences и класс xRefCreate) и делать тоже самое - только выделяя переменные, а не сами названия узлов АОТ 5. Ну и в заключение - можно еще искать контролы на форме/отчете с AutoDeclaration=Yes. Для этого нужно убедиться, что редактор открыт у формы/отчета и путем перебора дерева контролов можно найти сей контрол. Код у меня он оформлен как 2 вспомогательных метода, что с ходу не впишется в представленный скрипт. Однако идею можно переработать. X++: // _sourceNode = '\\Forms\\Address' (к примеру), получается через TreeNode::findNode(e.path()).AOTParent().TreeNodePath() // _declaration - тоже самое что и selectedLine public TreeNode findControlNode(TreeNode _sourceNode, str _declaration) { TreeNode declTreeNode; TreeNode ret; int i; str s; #AOT ; i = strfind(_sourceNode.treeNodePath(), '\\', strlen(#AOTRootPath) + 1, strlen(_sourceNode.treeNodePath())); if (i < 1) { return ret; } s = substr(_sourceNode.treeNodePath(), 1, i - 1); i = strfind(_sourceNode.treeNodePath(), '\\', strlen(s) + 2, strlen(_sourceNode.treeNodePath())); switch (s) { case #FormsPath, #ReportsPath: s = substr(_sourceNode.treeNodePath() + '\\Designs', 1, i - 1); ret = this.findSubNode(TreeNode::findNode(s), _declaration); break; default: } return ret; } X++: private TreeNode findSubNode(TreeNode _startNode, TreeNodeName _nodeName, TreeNode _parentNode = null) { int i; TreeNode curNode, subNode; TreeNodeIterator it; TreeNodePath subNodePath; ; curNode = _parentNode ? _parentNode : _startNode; it = curNode.AOTiterator(); subNode = it.next(); while (subNode) { subNodePath = subNode.treeNodePath(); if (this.isNodeOk(subNode, _nodeName)) { break; } if (subNode.AOTchildNodeCount() > 0) { subNode = this.findSubNode(_startNode, _nodeName, subNode); subNodePath = ''; if (subNode) { subNodePath = subNode.treeNodePath(); } } if (this.isNodeOk(subNode, _nodeName)) { break; } else { subNode = it.next(); subNodePath = ''; } } return subNode; }
__________________
Возможно сделать все. Вопрос времени Последний раз редактировалось sukhanchik; 08.12.2006 в 11:08. |
|
|
За это сообщение автора поблагодарили: kashperuk (3). |
08.12.2006, 11:12 | #7 |
Участник
|
Слегка поменял EditorScript - теперь в случае только одного варианта окно не мигает
X++: // util, bmi, 23.06.04 void go(Editor e) { boolean activate; boolean hasSelection() { return e.selectionStartCol()!=e.selectionEndCol(); } str selection() { ; return subStr(e.currentLine(), e.selectionStartCol(), e.selectionEndCol()-e.selectionStartCol()); } boolean isIdentifier(str _char) { return match('[a-z0-9_]', _char); } str currentIdentifier() { str line = e.currentLine(); int pos; int idStart; ; for(pos = e.selectionStartCol(); pos >= 0 && isIdentifier(subStr(line, pos, 1)); pos--) pos=pos; idStart = pos + 1; for(pos = e.selectionStartCol()+1; pos <= strLen(line) && isIdentifier(subStr(line, pos, 1)); pos++) pos=pos; return subStr(line, idStart, pos - idStart); } str currentText() { return hasSelection() ? selection() : currentIdentifier(); } void goComponent(str _componentName="") { FormRun r; Object o; SysGlobalCache cache=infolog.globalCache(); boolean go; ; if(cache.isSet(formStr(Dev_GoComponent), 'running')) { r=cache.get(formStr(Dev_GoComponent), 'running'); activate = true; } else { r=new FormRun(new Args(formStr(Dev_GoComponent))); r.init(); } o=r; o.componentName(_componentName); if (o.isSingle()) { go = o.go(); } if(go) { r.close(); } else { if (activate) infolog.activateWindow(r.hWnd()); else r.run(); r.detach(); } } ; goComponent(currentText()); } |
|
Теги |
открыть переменную |
|
|