blob: a9a43525a393c9845a0e17f55889a04c00eca8b0 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Common Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/cpl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.update.ui.forms.internal.engine;
import java.io.*;
import java.util.*;
import org.eclipse.swt.graphics.GC;
import org.eclipse.update.ui.forms.internal.HyperlinkSettings;
/**
* @version 1.0
* @author
*/
public class Paragraph implements IParagraph {
public static final String HTTP = "http://";
private Vector segments;
private boolean addVerticalSpace = true;
public Paragraph(boolean addVerticalSpace) {
this.addVerticalSpace = addVerticalSpace;
}
public int getIndent() {
return 0;
}
public boolean getAddVerticalSpace() {
return addVerticalSpace;
}
/*
* @see IParagraph#getSegments()
*/
public IParagraphSegment[] getSegments() {
if (segments == null)
return new IParagraphSegment[0];
return (IParagraphSegment[]) segments.toArray(
new IParagraphSegment[segments.size()]);
}
public void addSegment(IParagraphSegment segment) {
if (segments == null)
segments = new Vector();
segments.add(segment);
}
public void parseRegularText(
String text,
boolean expandURLs,
HyperlinkSettings settings,
String fontId) {
if (text.length() == 0)
return;
if (expandURLs) {
int loc = text.indexOf(HTTP);
if (loc == -1)
addSegment(new TextSegment(text, fontId));
else {
int textLoc = 0;
while (loc != -1) {
addSegment(new TextSegment(text.substring(textLoc, loc), fontId));
boolean added = false;
for (textLoc = loc; textLoc < text.length(); textLoc++) {
char c = text.charAt(textLoc);
if (Character.isSpaceChar(c)) {
addHyperlinkSegment(text.substring(loc, textLoc), settings, fontId);
added = true;
break;
}
}
if (!added) {
// there was no space - just end of text
addHyperlinkSegment(text.substring(loc), settings, fontId);
break;
}
loc = text.indexOf(HTTP, textLoc);
}
if (textLoc < text.length()) {
addSegment(new TextSegment(text.substring(textLoc), fontId));
}
}
} else {
addSegment(new TextSegment(text, fontId));
}
}
private void addHyperlinkSegment(
String text,
HyperlinkSettings settings,
String fontId) {
HyperlinkSegment hs = new HyperlinkSegment(text, settings, fontId);
hs.setWordWrapAllowed(false);
hs.setActionId(FormEngine.URL_HANDLER_ID);
addSegment(hs);
}
public void paint(
GC gc,
int width,
Locator loc,
int lineHeight,
Hashtable objectTable,
IHyperlinkSegment selectedLink) {
IParagraphSegment [] segments = getSegments();
if (segments.length > 0) {
if (segments[0] instanceof ITextSegment
&& ((ITextSegment) segments[0]).isSelectable())
loc.x += 1;
for (int j = 0; j < segments.length; j++) {
IParagraphSegment segment = segments[j];
boolean doSelect = false;
if (selectedLink != null && segment.equals(selectedLink))
doSelect = true;
segment.paint(gc, width, loc, objectTable, doSelect);
}
loc.y += loc.rowHeight;
} else {
loc.y += lineHeight;
}
}
public String getAccessibleText() {
IParagraphSegment [] segments = getSegments();
StringWriter swriter = new StringWriter();
PrintWriter writer = new PrintWriter(swriter);
for (int i = 0; i < segments.length; i++) {
IParagraphSegment segment = segments[i];
if (segment instanceof ITextSegment) {
String text = ((ITextSegment)segment).getText();
writer.print(text);
}
}
writer.println();
swriter.flush();
return swriter.toString();
}
public ITextSegment findSegmentAt(int x, int y) {
if (segments!=null) {
for (int i=0; i<segments.size(); i++) {
IParagraphSegment segment = (IParagraphSegment)segments.get(i);
if (segment instanceof ITextSegment) {
ITextSegment textSegment = (ITextSegment)segment;
if (textSegment.contains(x, y))
return textSegment;
}
}
}
return null;
}
}