【问题标题】:How to programmatically call the `Refresh` functionality on a node in Custom Navigator?如何以编程方式调用自定义导航器中节点上的“刷新”功能?
【发布时间】:2020-03-09 10:58:51
【问题描述】:

这与一个工具(Software AG Web Designer)有关,该工具在 Eclipse IDE 之上作为插件添加了功能。

如下所示,自定义导航器称为Package Navigator。 还可以看到顶部节点上选择的Refresh 按钮(在本例中为Default 名称)。

有没有办法从我正在开发的自定义插件中以编程方式调用Refresh 功能?


更新

我能找到的只有以下-

<extension
         point="org.eclipse.ui.popupMenus">
      <objectContribution
            adaptable="false"
            id="com.softwareag.is.ui.navigator.actions.refresh"
            objectClass="com.softwareag.is.ui.navigator.model.ISLazyTreeParent">
         <action
               class="com.softwareag.is.ui.navigator.actions.RefreshFromServerAction"
               definitionId="org.eclipse.ui.file.refresh"
               enablesFor="1"
               helpContextId="org.eclipse.ui.edit.delete"
               icon="icons/tree/refresh.gif"
               id="com.softwareag.is.ui.navigator.actions.refresh"
               label="%refresh_label"
               menubarPath="group.edit"
               tooltip="%refresh_tooltip">
          </action>
          <enablement>
            <or>
                <test property="com.softwareag.is.navigator.property.vcsEnabled"
                    value="true" forcePluginActivation="true"/>
                <test property="com.softwareag.is.navigator.property.vcsNotEnabled"
                    value="true" forcePluginActivation="true"/>
            </or>
          </enablement>
      </objectContribution> 

班级是RefreshFromServerAction-

public class RefreshFromServerAction extends Action implements IActionDelegate {
    private IStructuredSelection selection;

    public RefreshFromServerAction() {
        this.selection = StructuredSelection.EMPTY;
        this.setId(ActionFactory.REFRESH.getId());
        this.setActionDefinitionId("org.eclipse.ui.file.refresh");
    }

    public void selectionChanged(IAction action, ISelection sel) {
        if (sel instanceof IStructuredSelection) {
            this.selection = (IStructuredSelection) sel;
        } else {
            this.selection = StructuredSelection.EMPTY;
        }

    }

    public void run() {
        this.run((IAction) null);
    }

    public void run(IAction action) {
        ISServerNode[] servers = AssetUtils.getSelectedServersFromSelection(this.selection);
        if (servers != null) {
            NavigatorHelper.getInstance().setExpandAllPath((ISServerObjectBase) null, (ISServerNode) null);
            List<ISServerNode> refreshedServers = new ArrayList();

            for (int i = 0; i < servers.length; ++i) {
                if (!refreshedServers.contains(servers[i])) {
                    ServerConnection serverConnection = servers[i].getServerConnection();
                    if (serverConnection != null && !serverConnection.isConnected()) {
                        return;
                    }

                    ISTreeParent[] selectedAssetsFromSelection = AssetUtils
                            .getSelectedAssetsFromSelection(this.selection);
                    ISTreeParent[] var7 = selectedAssetsFromSelection;
                    int var8 = selectedAssetsFromSelection.length;

                    for (int var9 = 0; var9 < var8; ++var9) {
                        ISTreeParent isTreeParent = var7[var9];
                        ServerElementsCache.getInstance().clearCache(serverConnection, isTreeParent);
                    }

                    if ((new ISAssetSaver()).askAndSaveDirtyEditors(servers[i].getServerConnection())) {
                        ISNavigatorPlugin.getDefault().notifyListeners(new NavigatorEvent(5, servers[i], this));
                        refreshedServers.add(servers[i]);
                    }
                }
            }

        }
    }
}

您是否需要先创建它的对象,然后再做必要的事情。或者有什么标准的调用命令的方式吗?

【问题讨论】:

  • 您需要知道该菜单项绑定到什么。使用插件 spy 找出它使用的操作/命令。
  • @greg-449:很快就会检查和更新。
  • @greg-449:你能就更新的部分提出建议吗?

标签: java eclipse eclipse-plugin swt


【解决方案1】:

此操作似乎正在实现org.eclipse.ui.file.refresh 命令的处理程序。所以你应该可以使用IHandlerService 来执行该命令。

您需要为该视图调用处理程序服务,因为其他视图/编辑器对此命令有不同的处理程序。

IViewPart view = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView("view id"); 

IHandlerService handlerService = view.getSite().getService(IHandlerService.class);

handlerService.executeCommand("org.eclipse.ui.file.refresh", null);

【讨论】:

  • 完美无瑕。它能够刷新。我还想展开树的节点(节点在 Package Navigator 的 Default 父节点中称为包,参考上图)。有什么建议吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 2016-08-17
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多