Как программно выполнить "свертывание всех сгибов" в редакторе MATLAB?

Я боролся с проблемой в теме немного дольше, чем я хотел бы признать.

Я пытаюсь программно выполнить то же самое Action что происходит, когда пользователь нажимает на View > Collapse All кнопка или щелчок правой кнопкой мыши в окне редактора, а затем Code Folding > Fold All,

Что я пытался \ нашел до сих пор:

  • String что соответствует Action можно найти в enumcom.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
Другие вопросы по тегам