我想在 SWT(实际上是 Eclipse RCP)应用程序中显示 RTF 文档。

我知道有一个用于显示和编辑 RTF 文本的 Swing 小部件,但它是 Swing,并且在其他平台中使用时在外观和感觉上非常陌生(更不用说据我所知,它不显示图像,并且只具有对格式化的支持有限)

其他选项是在 Windows 上使用 COM 接口,但这仅适用于 Windows 平台,并且需要在客户计算机上安装 ActiveX RichEdit 控件...这会使应用程序的部署变得非常可怕......

在 Eclipse/SWT 应用程序中显示丰富文档的其他选项有哪些?

有帮助吗?

解决方案 5

事实上,我刚刚发现了另一个很有前途的 atm 小部件:

http://onpositive.com/richtext

其他提示

您可以使用 swt.custom.StyledText。它有很多功能可以改变文本的外观。但我认为它现在无法加载或保存 RTF。

我曾经用它编写过一个 HTML 编辑器,但这相当困难,因为与 HTML/RTF 的工作方式相比,向部分文本添加样式的 StyledText 模型是如此陌生。

AFAIK 您可以直接从此控件进行打印,该控件在内部创建内容的 RTF 表示形式。但这并不完全是您所要求的。

为什么不首先使用 RTFEditorKit 将 RTF 文本读入 StyledDocument,然后使用 HTMLEditorKit 将 StyledDocument 写入 StringWriter?

String rtf = "whatever";
BufferedReader input = new BufferedReader(new StringReader(rtf));

RTFEditorKit rtfKit = new RTFEditorKit();
StyledDocument doc = (StyledDocument) rtfKit.createDefaultDocument();
rtfEdtrKt.read( input, doc, 0 );
input.close();

HTMLEditorKit htmlKit = new HTMLEditorKit();       
StringWriter output = new StringWriter();
htmlKit.write( output, doc, 0, doc.getLength());

String html = output.toString();

然后显示HTML?

您可能希望将 Swing 控件与 AWT/SWT 桥. 。我用它来将 OpenOffice 嵌入到 SWT 应用程序中:

package ooswtviewer;

import java.awt.Panel;

import com.sun.star.awt.XView;
import com.sun.star.beans.Property;
import com.sun.star.beans.UnknownPropertyException;
import com.sun.star.beans.XPropertySet;
import com.sun.star.comp.beans.Frame;
import com.sun.star.comp.beans.NoConnectionException;
import com.sun.star.comp.beans.OOoBean;
import com.sun.star.comp.beans.OfficeDocument;
import com.sun.star.drawing.XDrawView;
import com.sun.star.frame.XController;
import com.sun.star.frame.XDesktop;
import com.sun.star.frame.XFrame;
import com.sun.star.frame.XFramesSupplier;
import com.sun.star.frame.XLayoutManager;
import com.sun.star.frame.XModel;
import com.sun.star.lang.WrappedTargetException;
import com.sun.star.ui.XUIElement;
import com.sun.star.uno.Any;
import com.sun.star.uno.UnoRuntime;
import com.sun.star.uno.XInterface;
import com.sun.star.view.XViewSettingsSupplier;

/**
 * Code based on example from http://www.eclipsezone.com/eclipse/forums/t48966.html
 * 
 * @author Aaron digulla
 */
public class OOoSwtViewer extends Panel
{
    private static final String RESOURCE_TOOLBAR_TEXTOBJECTBAR = "private:resource/toolbar/textobjectbar";
    private static final String RESOURCE_TOOLBAR_STANDARDBAR = "private:resource/toolbar/standardbar";
    private static final String RESOURCE_MENUBAR = "private:resource/menubar/menubar";

    private static final long serialVersionUID = -1408623115735065822L;

    private OOoBean aBean;

    public OOoSwtViewer()
    {
        super();
        aBean = new OOoBean();
        setLayout(new java.awt.BorderLayout());
        add(aBean, java.awt.BorderLayout.CENTER);

        aBean.setAllBarsVisible (false);
    }

    public XPropertySet getXPropertySet ()
    {
        return getXPropertySet (getFrame ());
    }

    public XPropertySet getXPropertySet (Object o)
    {
        return (XPropertySet)UnoRuntime.queryInterface (XPropertySet.class, o);
    }

    public Frame getFrame ()
    {
        try
        {
            return aBean.getFrame ();
        }
        catch (NoConnectionException e)
        {
            throw new OOException ("Error getting frame from bean", e);
        }
    }

    public XLayoutManager getXLayoutManager ()
    {
        try
        {
            return (XLayoutManager)UnoRuntime.queryInterface (XLayoutManager.class, getXPropertySet ().getPropertyValue ("LayoutManager"));
        }
        catch (Exception e)
        {
            throw new OOException ("Error getting LayoutManager from bean's properties", e);
        }        
    }

    public void setMenuBarVisible (boolean visible)
    {
        if (visible)
            getXLayoutManager ().showElement (RESOURCE_MENUBAR);
        else
            getXLayoutManager ().hideElement (RESOURCE_MENUBAR);
    }

    public void setStandardBarVisible (boolean visible)
    {
        if (visible)
            getXLayoutManager ().showElement (RESOURCE_TOOLBAR_STANDARDBAR);
        else
            getXLayoutManager ().hideElement (RESOURCE_TOOLBAR_STANDARDBAR);
    }

    public void setTextObjectBarVisible (boolean visible)
    {
        if (visible)
            getXLayoutManager ().showElement (RESOURCE_TOOLBAR_TEXTOBJECTBAR);
        else
            getXLayoutManager ().hideElement (RESOURCE_TOOLBAR_TEXTOBJECTBAR);
    }


    private Thread loadThread;
    private Exception loadException;

    public void setDocument(final String url)
    {
        loadThread = new Thread () {
            public void run() {
                try
                {
                    aBean.loadFromURL(url, null);
                    aBean.aquireSystemWindow();

                    setTextObjectBarVisible (false);

//                    for (XUIElement e: getXLayoutManager ().getElements ())
//                    {
//                        XInterface i = (XInterface)e.getRealInterface ();
//                        System.out.println (e);
//                        System.out.println (i);
//                        printProperties (getXPropertySet (e));
//                    }

                    /*
                    System.out.println ("frame:");
                    printProperties (getXPropertySet ());

frame:
Title=test - OpenOffice.org Writer 
IndicatorInterception=Any[Type[com.sun.star.task.XStatusIndicator], null]
LayoutManager=Any[Type[com.sun.star.frame.XLayoutManager], [Proxy:26506390,717ea70;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.frame.XLayoutManager]]]
DispatchRecorderSupplier=Any[Type[com.sun.star.frame.XDispatchRecorderSupplier], null]
IsHidden=false
                    */

                    XController controller = aBean.getDocument ().getCurrentController ();
                    /*
                    System.out.println ("controller:");
                    printProperties (getXPropertySet (controller));

controller:
IsConstantSpellcheck=true
IsHideSpellMarks=false
LineCount=1
PageCount=1
                    */

                    /*
                    System.out.println ("layoutManager:");
                    printProperties (getXPropertySet (getXLayoutManager ()));

layoutManager:
AutomaticToolbars=true
HideCurrentUI=false
LockCount=0
MenuBarCloser=true
RefreshContextToolbarVisibility=false
                    */

                    /*
                    System.out.println ("document:");
                    printProperties (getXPropertySet (aBean.getDocument ()));
                    OfficeDocument doc = aBean.getDocument ();
ApplyFormDesignMode=false
ApplyWorkaroundForB6375613=false
AutomaticControlFocus=false
BasicLibraries=Any[Type[com.sun.star.script.XLibraryContainer], [Proxy:14806696,73ca178;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.script.XLibraryContainer]]]
BuildId=680$9310
CharFontCharSet=1
CharFontCharSetAsian=1
CharFontCharSetComplex=1
CharFontFamily=3
CharFontFamilyAsian=6
CharFontFamilyComplex=6
CharFontName=Times New Roman
CharFontNameAsian=Arial Unicode MS
CharFontNameComplex=Tahoma
CharFontPitch=2
CharFontPitchAsian=2
CharFontPitchComplex=2
CharFontStyleName=
CharFontStyleNameAsian=
CharFontStyleNameComplex=
CharLocale=com.sun.star.lang.Locale@fb6354
CharacterCount=20
DialogLibraries=Any[Type[com.sun.star.script.XLibraryContainer], [Proxy:3556929,73a39c0;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.script.XLibraryContainer]]]
ForbiddenCharacters=Any[Type[com.sun.star.i18n.XForbiddenCharacters], [Proxy:11544872,7669148;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.i18n.XForbiddenCharacters]]]
HasValidSignatures=false
HideFieldTips=false
IndexAutoMarkFileURL=
LockUpdates=false
ParagraphCount=1
RecordChanges=false
RedlineDisplayType=2
RedlineProtectionKey=[B@f593af
RuntimeUID=10
ShowChanges=true
TwoDigitYear=1930
WordCount=5
WordSeparator=()        
                    */

//                    System.out.println ("viewData:");
//                    printProperties (getXPropertySet (controller.getFrame ().getContainerWindow ()));

                    XViewSettingsSupplier settingsSupplier = (XViewSettingsSupplier)UnoRuntime.queryInterface (XViewSettingsSupplier.class, controller);
//                    System.out.println ("settingsSupplier:");
//                    printProperties (settingsSupplier.getViewSettings ());
                    settingsSupplier.getViewSettings ().setPropertyValue ("ShowVertRuler", Boolean.FALSE);
                    settingsSupplier.getViewSettings ().setPropertyValue ("ShowHoriRuler", Boolean.FALSE);
                    // Switch to Web Layout. This layout mode comes without gray border and the page borders automatically adujst to the frame
                    settingsSupplier.getViewSettings ().setPropertyValue ("ShowOnlineLayout", Boolean.TRUE);
//                    settingsSupplier.getViewSettings ().setPropertyValue ("ShowTextBoundaries", Boolean.TRUE);

//                    XView view = (XView)UnoRuntime.queryInterface (XView.class, getFrame ());
//                    System.out.println ("drawView="+view);
//                    printProperties (getXPropertySet (view));

                    /*
                    XModel model = (XModel)UnoRuntime.queryInterface (XModel.class, doc);
                    printProperties ("model", model);

                    Same as getDocument()
                    */

                    /*
                    System.out.println ("Interfaces implemented by aBean.getDocument():");
                    for (Class c: OOoInspector.queryInterface (aBean.getDocument ()))
                        System.out.println ("    "+c.getName ());
    com.sun.star.datatransfer.XTransferable
    com.sun.star.document.XDocumentInfoSupplier
    com.sun.star.document.XDocumentLanguages
    com.sun.star.document.XDocumentSubStorageSupplier
    com.sun.star.document.XEmbeddedScripts
    com.sun.star.document.XEventBroadcaster
    com.sun.star.document.XEventsSupplier
    com.sun.star.document.XLinkTargetSupplier
    com.sun.star.document.XRedlinesSupplier
    com.sun.star.document.XStorageBasedDocument
    com.sun.star.document.XViewDataSupplier
    com.sun.star.drawing.XDrawPageSupplier
    com.sun.star.embed.XVisualObject
    com.sun.star.frame.XLoadable
    com.sun.star.frame.XModel
    com.sun.star.frame.XModel2
    com.sun.star.frame.XModule
    com.sun.star.frame.XStorable
    com.sun.star.frame.XStorable2
    com.sun.star.script.provider.XScriptProviderSupplier
    com.sun.star.style.XAutoStylesSupplier
    com.sun.star.style.XStyleFamiliesSupplier
    com.sun.star.text.XBookmarksSupplier
    com.sun.star.text.XChapterNumberingSupplier
    com.sun.star.text.XDocumentIndexesSupplier
    com.sun.star.text.XEndnotesSupplier
    com.sun.star.text.XFootnotesSupplier
    com.sun.star.text.XLineNumberingProperties
    com.sun.star.text.XNumberingRulesSupplier
    com.sun.star.text.XPagePrintable
    com.sun.star.text.XReferenceMarksSupplier
    com.sun.star.text.XTextDocument
    com.sun.star.text.XTextEmbeddedObjectsSupplier
    com.sun.star.text.XTextFieldsSupplier
    com.sun.star.text.XTextFramesSupplier
    com.sun.star.text.XTextGraphicObjectsSupplier
    com.sun.star.text.XTextSectionsSupplier
    com.sun.star.text.XTextTablesSupplier
    com.sun.star.ui.XUIConfigurationManagerSupplier
    com.sun.star.util.XCloseable
    com.sun.star.util.XCloseBroadcaster
    com.sun.star.util.XLinkUpdate
    com.sun.star.util.XModifiable
    com.sun.star.util.XModifiable2
    com.sun.star.util.XModifyBroadcaster
    com.sun.star.util.XNumberFormatsSupplier
    com.sun.star.util.XRefreshable
    com.sun.star.util.XReplaceable
    com.sun.star.util.XSearchable
    com.sun.star.view.XPrintable
    com.sun.star.view.XPrintJobBroadcaster
    com.sun.star.view.XRenderable
    com.sun.star.xforms.XFormsSupplier
                    */

                    /*
                    System.out.println ("Interfaces implemented by controller:");
                    for (Class c: OOoInspector.queryInterface (controller))
                        System.out.println ("    "+c.getName ());

    com.sun.star.awt.XUserInputInterception
    com.sun.star.datatransfer.XTransferableSupplier
    com.sun.star.frame.XController
    com.sun.star.frame.XControllerBorder
    com.sun.star.frame.XDispatchInformationProvider
    com.sun.star.frame.XDispatchProvider
    com.sun.star.task.XStatusIndicatorSupplier
    com.sun.star.text.XRubySelection
    com.sun.star.text.XTextViewCursorSupplier
    com.sun.star.ui.XContextMenuInterception
    com.sun.star.view.XControlAccess
    com.sun.star.view.XFormLayerAccess
    com.sun.star.view.XSelectionSupplier
    com.sun.star.view.XViewSettingsSupplier
                    */

                    /*
                    System.out.println ("Interfaces implemented by frame:");
                    for (Class c: OOoInspector.queryInterface (getFrame ()))
                        System.out.println ("    "+c.getName ());

    com.sun.star.awt.XFocusListener
    com.sun.star.awt.XTopWindowListener
    com.sun.star.awt.XWindowListener
    com.sun.star.document.XActionLockable
    com.sun.star.frame.XComponentLoader
    com.sun.star.frame.XDispatchInformationProvider
    com.sun.star.frame.XDispatchProvider
    com.sun.star.frame.XDispatchProviderInterception
    com.sun.star.frame.XFrame
    com.sun.star.frame.XFramesSupplier
    com.sun.star.task.XStatusIndicatorFactory
    com.sun.star.util.XCloseable
    com.sun.star.util.XCloseBroadcaster
                    */

                    /*
                    XFramesSupplier frames = OOoInspector.queryInterface (XFramesSupplier.class, getFrame ());
                    printProperties ("frames", frames);

                    for (int i=0; i<frames.getFrames ().getCount (); i++)
                    {
                        XFrame frame = (XFrame)frames.getFrames ().getByIndex (i);
                        printProperties ("Frame "+i, frame);
                    }

frames=[Proxy:16382237,6ace84c;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.frame.XFramesSupplier]]
Title=test - OpenOffice.org Writer 
IndicatorInterception=Any[Type[com.sun.star.task.XStatusIndicator], null]
LayoutManager=Any[Type[com.sun.star.frame.XLayoutManager], [Proxy:22149392,76bd794;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.frame.XLayoutManager]]]
DispatchRecorderSupplier=Any[Type[com.sun.star.frame.XDispatchRecorderSupplier], null]
IsHidden=false
                    */
                    XPropertySet p = getXPropertySet (getFrame ());
                    Any any = (Any)p.getPropertyValue ("LayoutManager");
                    System.out.println (any);
                    System.out.println (any.getClass ().getName ());
                    XLayoutManager layoutManager = (XLayoutManager)any.getObject ();
                    printProperties ("layoutManager", layoutManager);


                    /*
                    printProperties ("containerWindow", getFrame ().getContainerWindow ());

containerWindow=[Proxy:11970262,6d33e60;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.awt.XWindow]]
null
                    */

                    /*
                    printProperties ("componentWindow", getFrame ().getComponentWindow ());

componentWindow=[Proxy:25380515,8657cc4;msci[0];342169f1a1164ee688893a857f65b3e1,Type[com.sun.star.awt.XWindow]]
null
                    */
                }
                catch (Exception e)
                {
                    e.printStackTrace ();
                }
            }
        };
        if (1 == 1)
            loadThread.start ();
        else
            loadThread.run ();
    }

    /** closes the bean viewer and tries to terminate OOo.
     */
    public void terminate() throws NoConnectionException {
        setVisible(false);
        XDesktop xDesktop = null;
        xDesktop = aBean.getOOoDesktop();
        aBean.stopOOoConnection();
        if (xDesktop != null)
            xDesktop.terminate();
    }

    /** closes the bean viewer, leaves OOo running.
     */
    public void close() {
        setVisible(false);
        aBean.stopOOoConnection();
    }

    public void printProperties (String name, Object obj)
    {
        System.out.println (name+"="+obj);
        if (obj != null)
            printProperties (getXPropertySet (obj));
    }

    public void printProperties (XPropertySet set)
    {
        if (set == null)
        {
            System.out.println ("null");
            return;
        }

        for (Property p: set.getPropertySetInfo ().getProperties ())
        {
            try
            {
                System.out.println (p.Name+"="+set.getPropertyValue (p.Name));
            }
            catch (Exception e)
            {
                throw new OOException ("Error getting value of property "+p.Name, e);
            }
        }
    }

}

您可以像这样使用该控件:

package ooswtviewer;

import java.awt.BorderLayout;
import java.awt.Frame;
import java.awt.Panel;
import java.io.File;

import javax.swing.JRootPane;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.events.DisposeEvent;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * Code based on example from http://www.eclipsezone.com/eclipse/forums/t48966.html
 * 
 * @author Aaron Digulla
 */
public class OOoSwtSnippet {
    public static void main(String[] args) {
        OOoSwtSnippet obj = new OOoSwtSnippet ();
        try
        {
            obj.run (args);
        }
        catch (Exception e)
        {
            e.printStackTrace ();
        }
    }

    public void run (String[] args) throws Exception
    {
        final Display display = new Display();
        final Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());

        Composite composite = new Composite(shell, SWT.NO_BACKGROUND
                | SWT.EMBEDDED);

        System.setProperty("sun.awt.noerasebackground", "true");

        /* Create and setting up frame */
        Frame frame = SWT_AWT.new_Frame(composite);
        Panel panel = new Panel(new BorderLayout()) {
            public void update(java.awt.Graphics g) {
                paint(g);
            }
        };
        frame.add(panel);
        JRootPane root = new JRootPane();
        panel.add(root);
        java.awt.Container contentPane = root.getContentPane();

        shell.setSize(800, 600);
        final OOoSwtViewer viewer = new OOoSwtViewer();
        contentPane.add(viewer);

        // viewer.setDocument(NEW_WRITTER_DOCUMENT);
        File document = new File ("test.odt");
        String url = document.getAbsoluteFile ().toURL ().toString ();
        url = "file:///" + url.substring (6);
        System.out.println ("Loading "+url);
        viewer.setDocument(url);

        shell.setText ("OOoSwtSnippet");
        shell.open();
        shell.addDisposeListener(new DisposeListener() {
            public void widgetDisposed(DisposeEvent e) {
                try {
                    viewer.close();
                } catch (RuntimeException exception) {
                    exception.printStackTrace();
                }
            }

        });
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }
        display.dispose();
    }

}

OOException 是一个运行时异常:

package ooswtviewer;

/**
 * Wrapper for all OO exceptions to keep throws clauses in check
 * 
 * @author Aaron Digulla
 */
public class OOException extends RuntimeException
{

    public OOException ()
    {
        super ();
    }

    public OOException (String message, Throwable cause)
    {
        super (message, cause);
    }

    public OOException (String message)
    {
        super (message);
    }

    public OOException (Throwable cause)
    {
        super (cause);
    }

}

我不知道有什么方法可以在不使用 ActiveX 的情况下做到这一点。如果你确实朝这个方向发展,你可能想研究一下 IBM ActiveX 文档容器, ,这应该可以更好地集成文档。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top