8

我一直在努力解决这个问题的时间比我想承认的要长一点。

我正在尝试以编程方式执行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

任何想法/替代方案?


EDIT1:在“这本书”中挖掘了一下之后,我想我比以前更接近了(但仍然不完全在那里)。引用书中的一段话:

Java GUI 组件通常使用 anActionMap来存储Actions由侦听器在鼠标、键盘、属性或容器事件上调用的可运行对象。与对象方法不同,ActionsMATLAB 不能直接调用。

然后解释了一种解决方法,大致涉及:获取某种Action对象;创建一个ActionEvent并调用Action'sactionPerformed 作为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与这个问题完全无关)。actionPerformedActionManager


附言

我知道有一个热键可以做到这一点(Ctrl+ =),但这不是我想要的(除非有一个命令来模拟热键按下:))。

4

2 回答 2

3

经过无数次的挖掘、试验和太多的错误——我做到了!

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()));

请注意,这适用于当前在编辑器中打开的脚本。

于 2014-10-07T22:42:37.537 回答
1

这不是一个完美的解决方案,但可以模拟默认的热键按下java.awt.robot

...找到一种直接触发 Action 的方法会更好...

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
于 2014-09-23T16:52:54.903 回答