Как программно выполнить "свертывание всех сгибов" в редакторе MATLAB?
Я боролся с проблемой в теме немного дольше, чем я хотел бы признать.
Я пытаюсь программно выполнить то же самое Action
что происходит, когда пользователь нажимает на View
> Collapse All
кнопка или щелчок правой кнопкой мыши в окне редактора, а затем Code Folding
> Fold All
,
Что я пытался \ нашел до сих пор:
-
String
что соответствуетAction
можно найти вenum
com.mathworks.mde.editor.ActionID
и является:'collapse-all-folds'
, - Когда
Action
активируется, кажется, выполняется следующий метод:org.netbeans.api.editor.fold.FoldUtilities.collapseAll(...)
(отсюда тэг netbeans). - Этот код позволяет мне получить экземпляры
EditorAction
,ActionManager
,MatlabEditor
:
jEd = com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor;
jAm = com.mathworks.mde.editor.ActionManager(jEd);
jAc = com.mathworks.mde.editor.EditorAction('collapse-all-folds');
Моя проблема в том, что я не могу найти способ активировать Action
,
Есть идеи / альтернативы?
РЕДАКТИРОВАТЬ1: После того, как я немного покопался в "книге", думаю, я подошел еще ближе, чем раньше (но все еще не совсем там). Цитата из книги:
Компоненты Java GUI часто используют
ActionMap
хранить работоспособнымActions
которые вызываются слушателями при событиях мыши, клавиатуры, свойства или контейнера. В отличие от методов объекта,Actions
не может быть напрямую вызвано MATLAB.
А затем объясняется обходной путь, который включает в себя примерно: получение какого-то Action
объект; создавая ActionEvent
и ссылаясь Action
"s actionPerformed
с ActionEvent
в качестве аргумента, как реализовано ниже:
import java.awt.event.*;
jEd = com.mathworks.mlservices.MLEditorServices.getEditorApplication.getActiveEditor;
jAm = com.mathworks.mde.editor.ActionManager(jEd);
jAc = jAm.getAction(com.mathworks.mde.editor.EditorAction('collapse-all-folds'));
jAe = ActionEvent(jAm, ActionEvent.ACTION_PERFORMED, '');
jAc.actionPerformed(jAe);
Этот код работает без ошибок, но ничего не делает. Я подозреваю, что я звоню ActionEvent
а также actionPerformed
на неправильных объектах (ActionManager
возможно, не имеет ничего общего с этой проблемой).
PS
Я знаю, что есть горячая клавиша, которая делает это (Ctrl
+ =
), но это не то, что я ищу (если нет команды для имитации нажатия горячей клавиши:)).
2 ответа
После неизмеримой копки, проб и слишком большого количества ошибок - я сделал это!
function FullyCollapseCurrentScript()
%// Get the relevant javax.swing.text.JTextComponent:
jTc = com.mathworks.mlservices.MLEditorServices ...
.getEditorApplication.getActiveEditor.getTextComponent();
%// Get the FoldHierarchy for the JTextComponent:
jFh = org.netbeans.api.editor.fold.FoldHierarchy.get(jTc);
%// Finally, collapse every possible fold:
org.netbeans.api.editor.fold.FoldUtilities.collapseAll(jFh);
end
или если сжато в одну грязную команду:
org.netbeans.api.editor.fold.FoldUtilities.collapseAll(...
org.netbeans.api.editor.fold.FoldHierarchy.get(com.mathworks. ...
mlservices.MLEditorServices.getEditorApplication.getActiveEditor. ...
getTextComponent()));
Обратите внимание, что это работает со скриптом, открытым в данный момент в редакторе.
Не идеальное решение, но имитация нажатия клавиш по умолчанию с java.awt.robot
возможно.
... было бы лучше найти способ запустить Действие напрямую...
import java.awt.Robot;
import java.awt.event.*;
RoboKey = Robot;
jTextComp = com.mathworks.mlservices.MLEditorServices. ...
getEditorApplication.getActiveEditor.getTextComponent;
jTextComp.grabFocus()
drawnow; %// give time for focus
if jTextComp.hasFocus()
RoboKey.keyPress(KeyEvent.VK_CONTROL);
RoboKey.keyPress(KeyEvent.VK_EQUALS);
RoboKey.keyRelease(KeyEvent.VK_CONTROL);
RoboKey.keyRelease(KeyEvent.VK_EQUALS);
com.mathworks.mde.cmdwin.CmdWin.getInstance.grabFocus; %// focus back to cmdwin
else
warning('Failed to collapse folds: Editor could not take focus')
end