【问题标题】:How to save a document opened within an SWT OleClientSite in an eclipse EditorPart?如何在 Eclipse EditorPart 中保存在 SWT OleClientSite 中打开的文档?
【发布时间】:2013-06-11 09:09:58
【问题描述】:

我开始使用 SWT OLE api 在 Eclipse RCP 中编辑 Word 文档。我创建了一个自定义编辑器,它扩展了org.eclipse.ui.part.EditorPart 并包含一个OleClientSite 对象。 问题是保存图标是灰色的。是否有启用该图标的解决方案?

我还尝试将KeyListener 添加到我的OleClientSite 以捕获 Ctrl+s 事件,但它似乎不起作用。在调试模式下,永远不会到达keyPressed 方法中的断点...

我以为我可以在我的编辑器中添加一个 keylistener,但我没有找到方法。

【问题讨论】:

    标签: java swt eclipse-rcp ole


    【解决方案1】:

    这是 OLE 对象。在 OLE 中,保存菜单被禁用,但是可以通过 save() 方法保存对象,如下所示:

    oleClientSite.save(new File(fileName), true);
    

    如果对象被修改,还有 isDirty() 方法返回 true 您需要添加自己的菜单才能让用户保存文件。

    private void addMenu(OleFrame frame, String menuName) {
        final Shell shell = frame.getShell();
        Menu menuBar = shell.getMenuBar();
        if (menuBar == null) {
            menuBar = new Menu(shell, SWT.BAR);
            shell.setMenuBar(menuBar);
        }
        MenuItem fileMenu = new MenuItem(menuBar, SWT.CASCADE);
        fileMenu.setText(menuName);
        Menu menuFile = new Menu(fileMenu);
        fileMenu.setMenu(menuFile);
        frame.setFileMenus(new MenuItem[]{fileMenu});
    
        MenuItem menuFileOpen = new MenuItem(menuFile, SWT.CASCADE);
        menuFileOpen.setText("Save ...");
        menuFileOpen.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
            oleClientSite.save(new File(fileName), true);
    
            }
        });
        MenuItem menuFileExit = new MenuItem(menuFile, SWT.CASCADE);
        menuFileExit.setText("Quit");
        menuFileExit.addSelectionListener(new SelectionAdapter() {
            shell.dispose();
            }
        });
    }
    
    .....
    display = new Display();
    shell = new Shell(display);
    shell.setSize(1000, 700);
    shell.setLayout(new FillLayout());
    
    oleFrame = new OleFrame(shell, SWT.NONE);
    oleClientSite = new OleClientSite(oleFrame, SWT.NONE, new File(fileName));
    oleClientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
    
    addMenu(oleFrame);
    

    更多细节在这里-http://git.eclipse.org/c/platform/eclipse.platform.swt.git/tree/examples/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet262.java

    这里是http://www.eclipse.org/swt/snippets/

    【讨论】:

    • 感谢您提供示例代码。我的应用程序已经有了自己的菜单。因此,使用此示例代码,文件菜单被添加到菜单栏并替换现有的菜单条目。但是当我点击它时,什么也没有发生。看起来“文件”菜单并没有真正激活,但我不知道为什么。有什么想法吗?
    • 另外,我的应用程序实现了IApplication,菜单由扩展ActionBarAdvisor的类管理。
    • 值得注意的是,使用 oleClientSite.save(new File(fileName), true); 保存会保存文档,但 OpenOffice / Libre Office 无法打开它,我最近遇到了这个问题。我找到的解决方案是解压缩odt文件(它只是zip)并将其打包回来。在此之后,文档被正确打开......奇怪,我花了一些时间才弄清楚。
    • 关于信息,我解决了我的问题,使用ActionBarAdvisor 类和ActionFactory.SAVE.create 方法将永久保存操作添加到我的应用程序工具栏:) 单击时,此操作将保存激活的编辑器并显示为灰色当没有编辑器脏时:) 我还在操作中添加了一个加速器以使用 Ctrl+s 快捷方式,但是当编辑器具有焦点时它不起作用:/ 不过,总比没有好:) 我添加了所有应用程序菜单项到OleClientSite的文件菜单。
    • @norbi771 嗨,Excel 文件打开并正常保存工作,但第二次无法保存现有的 excel 文件,任何想法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多