blob: 2d411dcda61e466545fbda556679b7031963fa9b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2004 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ui.forms.widgets;
import java.io.InputStream;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.widgets.*;
/**
* ScrolledFormText is a control that is capable of scrolling an instance of
* the FormText class. It should be created in a parent that will allow it to
* use all the available area (for example, a shell, a view or an editor). The
* form text can be created by the class itself, or set from outside. In the
* later case, the form text instance must be a direct child of the
* ScrolledFormText instance.
* <p>
* The class assumes that text to be rendered contains formatting tags. In case
* of a string, it will enclose the text in 'form' root element if missing from
* the text as a convinience. For example:
*
* <pre>
* ftext.setText(&quot;&lt;p&gt;Some text here&lt;/&gt;&quot;);
* </pre>
*
* will not cause an error. The same behavior does not exist for content from
* the input stream, however - it must be well formed in that case.
* </p>
* @since 3.0
* @see FormText
*/
public class ScrolledFormText extends SharedScrolledComposite {
private FormText content;
private String text;
/**
* Creates the new scrolled text instance in the provided parent
*
* @param parent
* the parent composite
* @param createFormText
* if <code>true</code>, enclosing form text instance will be
* created in this constructor.
*/
public ScrolledFormText(Composite parent, boolean createFormText) {
this(parent, SWT.V_SCROLL | SWT.H_SCROLL, createFormText);
}
/**
* Creates the new scrolled text instance in the provided parent
*
* @param parent
* the parent composite
* @param style
* the style to pass to the scrolled composite
* @param createFormText
* if <code>true</code>, enclosing form text instance will be
* created in this constructor.
*/
public ScrolledFormText(Composite parent, int style, boolean createFormText) {
super(parent, style);
if (createFormText)
setFormText(new FormText(this, SWT.NULL));
}
/**
* Sets the form text to be managed by this scrolled form text. The
* instance must be a direct child of this class. If this method is used,
* <code>false</code> must be passed in either of the constructors to
* avoid creating form text instance.
*
* @param formText
* the form text instance to use.
*/
public void setFormText(FormText formText) {
this.content = formText;
super.setContent(content);
content.setMenu(getMenu());
if (text != null)
loadText(text);
}
/**
* Sets the foreground color of the scrolled form text.
*
* @param fg
* the foreground color
*/
public void setForeground(Color fg) {
super.setForeground(fg);
if (content != null)
content.setForeground(fg);
}
/**
* Sets the background color of the scrolled form text.
*
* @param bg
* the background color
*/
public void setBackground(Color bg) {
super.setBackground(bg);
if (content != null)
content.setBackground(bg);
}
/**
* The class sets the content widget. This method should not be called by
* classes that instantiate this widget.
*
* @param c
* content control
*/
public final void setContent(Control c) {
}
/**
* Sets the text to be rendered in the scrolled form text. The text must
* contain formatting tags.
*
* @param text
* the text to be rendered
*/
public void setText(String text) {
this.text = text;
loadText(text);
reflow(true);
}
/**
* Sets the contents to rendered in the scrolled form text. The stream must
* contain formatting tags. The caller is responsible for closing the input
* stream. The call may be long running. For best results, call this method
* from another thread and call 'reflow' when done (but make both calls
* using 'Display.asyncExec' because these calls must be made in the event
* dispatching thread).
*
* @param is
* content input stream
*/
public void setContents(InputStream is) {
loadContents(is);
}
/**
* Returns the instance of the form text.
*
* @return the form text instance
*/
public FormText getFormText() {
return content;
}
private void loadText(String text) {
if (content != null) {
String markup = text;
if (!markup.startsWith("<form>")) //$NON-NLS-1$
markup = "<form>" + text + "</form>"; //$NON-NLS-1$//$NON-NLS-2$
content.setText(markup, true, false);
}
}
private void loadContents(InputStream is) {
if (content != null) {
content.setContents(is, false);
}
}
}