Java SWT中是否有RTF显示小部件
我想在SWT(实际上是EclipseRCP)应用程序中显示一个RTF文档 我知道有一个Swing小部件用于显示和编辑RTF文本,但它是Swing的,在otherwise平台中使用时,在外观和感觉上非常陌生(更不用说,据我所知,它没有显示图像,对格式的支持也很有限) 其他选项是在windows上使用COM接口,但这仅适用于windows平台,并且要求在客户计算机上安装ActiveX RichEdit控件。。。这会使应用程序的部署变得非常可怕Java SWT中是否有RTF显示小部件,java,eclipse,swt,rtf,Java,Eclipse,Swt,Rtf,我想在SWT(实际上是EclipseRCP)应用程序中显示一个RTF文档 我知道有一个Swing小部件用于显示和编辑RTF文本,但它是Swing的,在otherwise平台中使用时,在外观和感觉上非常陌生(更不用说,据我所知,它没有显示图像,对格式的支持也很有限) 其他选项是在windows上使用COM接口,但这仅适用于windows平台,并且要求在客户计算机上安装ActiveX RichEdit控件。。。这会使应用程序的部署变得非常可怕 在Eclipse/SWT应用程序中显示富文档的其他选项有
在Eclipse/SWT应用程序中显示富文档的其他选项有哪些?您可以使用SWT.custom.StyledText。它有许多功能可以更改文本的外观。但我认为它现在无法加载或保存RTF 我曾经用它编写了一个HTML编辑器,但这相当困难,因为与HTML/RTF的工作方式相比,向文本的一部分添加样式的StyledText模型非常陌生
AFAIK您可以直接从该控件打印,该控件在内部创建内容的RTF表示。但这并不是你想要的。如果不使用ActiveX,我不知道有什么方法可以做到这一点。如果您确实朝这个方向走,您可能会想查看,这应该允许更好地集成文档。为什么不先使用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控件与一起使用。我用它将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);
}
}
}
}
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);
}
}
事实上,我刚刚发现了另一个非常有前途的小部件:
StyledText将在复制时将RTF保存到剪贴板。获取RTF值的一种总的黑客方法是选择全部、复制并从剪贴板中提取RTF值。是的,你说得对,这不是我所要求的。StyledText只能将文本作为RTF复制到剪贴板,根本不能将RTF作为输入处理。。。使用StyledText作为RTF查看器/编辑器的基础可能是一种开始,但作为一个小部件本身,它不是我想要的…我们现在得到的只是我想要的一半。基本上,我们使用JNI来调用本机Windows RTF控件(WodPad使用的控件)——这样我们就不必担心讨厌的ActiveX部署问题,但它仍然是一个不错的黑客。。。虽然我有点担心这种转换如何与我们目前在RTF文档中使用的各种制表位选项一起发挥作用。不是真的-我不能强迫每个人在我的应用程序中安装OOo,我也不能期望人们在每个桌面上都安装OOo(见鬼,甚至MS Office在每个目标桌面上都不可用)我不确定你需要“安装”多少。在应用程序目录中安装JAR和OO的所有DLL就足够了,正确地设置-Djava.library.path,它应该可以工作。你可以做一些事情并不意味着你应该这样做。我给你选择;你必须决定哪个选项适合那些你没有提到的琐碎细节,因为你不想在这个问题上花三天时间:)
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);
}
}