Mercurial > projects > dwt-addons
diff dwtx/ui/internal/forms/widgets/Paragraph.d @ 75:5d489b9f966c
Fix continue porting
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 24 May 2008 05:11:16 +0200 |
parents | |
children | 26c6c9dfd13c |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dwtx/ui/internal/forms/widgets/Paragraph.d Sat May 24 05:11:16 2008 +0200 @@ -0,0 +1,234 @@ +/******************************************************************************* + * Copyright (c) 2000, 2007 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 + * Port to the D programming language: + * Frank Benoit <benoit@tionex.de> + *******************************************************************************/ +module dwtx.ui.internal.forms.widgets.Paragraph; + +import dwtx.ui.internal.forms.widgets.ParagraphSegment; +import dwtx.ui.internal.forms.widgets.Locator; +import dwtx.ui.internal.forms.widgets.IHyperlinkSegment; +import dwtx.ui.internal.forms.widgets.SelectionData; + +import dwt.graphics.GC; +import dwt.graphics.Rectangle; +import dwtx.ui.forms.HyperlinkSettings; + +import dwt.dwthelper.utils; +import tango.util.collection.ArraySeq; +import tango.util.collection.HashMap; + +/** + * @version 1.0 + * @author + */ +public class Paragraph { + public static const String HTTP = "http://"; //$NON-NLS-1$ + + alias ArraySeq!(ParagraphSegment) TArraySeqParagraphSegment; + alias HashMap!(String,Object) Hashtable; + + private TArraySeqParagraphSegment segments; + + private bool addVerticalSpace = true; + + public this(bool addVerticalSpace) { + this.addVerticalSpace = addVerticalSpace; + } + + public int getIndent() { + return 0; + } + + public bool getAddVerticalSpace() { + return addVerticalSpace; + } + + /* + * @see IParagraph#getSegments() + */ + public ParagraphSegment[] getSegments() { + if (segments is null) + return new TArraySeqParagraphSegment; + return segments + .toArray(); + } + + public void addSegment(ParagraphSegment segment) { + if (segments is null) + segments = new TArraySeqParagraphSegment; + segments.append(segment); + } + + public void parseRegularText(String text, bool expandURLs, bool wrapAllowed, + HyperlinkSettings settings, String fontId) { + parseRegularText(text, expandURLs, wrapAllowed, settings, fontId, null); + } + + public void parseRegularText(String text, bool expandURLs, bool wrapAllowed, + HyperlinkSettings settings, String fontId, String colorId) { + if (text.length() is 0) + return; + if (expandURLs) { + int loc = text.indexOf(HTTP); + + if (loc is -1) + addSegment(new TextSegment(text, fontId, colorId, wrapAllowed)); + else { + int textLoc = 0; + while (loc !is -1) { + addSegment(new TextSegment(text.substring(textLoc, loc), + fontId, colorId, wrapAllowed)); + bool 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, + colorId, wrapAllowed)); + } + } + } else { + addSegment(new TextSegment(text, fontId, colorId, wrapAllowed)); + } + } + + private void addHyperlinkSegment(String text, HyperlinkSettings settings, + String fontId) { + TextHyperlinkSegment hs = new TextHyperlinkSegment(text, settings, + fontId); + hs.setWordWrapAllowed(false); + hs.setHref(text); + addSegment(hs); + } + + protected void computeRowHeights(GC gc, int width, Locator loc, + int lineHeight, Hashtable resourceTable) { + ParagraphSegment[] segments = getSegments(); + // compute heights + Locator hloc = loc.create(); + ArrayList heights = new ArrayList(); + hloc.heights = heights; + hloc.rowCounter = 0; + int innerWidth = width - loc.marginWidth*2; + for (int j = 0; j < segments.length; j++) { + ParagraphSegment segment = segments[j]; + segment.advanceLocator(gc, innerWidth, hloc, resourceTable, true); + } + hloc.collectHeights(); + loc.heights = heights; + loc.rowCounter = 0; + } + + public void layout(GC gc, int width, Locator loc, int lineHeight, + Hashtable resourceTable, IHyperlinkSegment selectedLink) { + ParagraphSegment[] segments = getSegments(); + //int height; + if (segments.length > 0) { + /* + if (segments[0] instanceof TextSegment + && ((TextSegment) segments[0]).isSelectable()) + loc.x += 1; + */ + // compute heights + if (loc.heights is null) + computeRowHeights(gc, width, loc, lineHeight, resourceTable); + for (int j = 0; j < segments.length; j++) { + ParagraphSegment segment = segments[j]; + bool doSelect = false; + if (selectedLink !is null && segment.equals(selectedLink)) + doSelect = true; + segment.layout(gc, width, loc, resourceTable, doSelect); + } + loc.heights = null; + loc.y += loc.rowHeight; + } else { + loc.y += lineHeight; + } + } + + public void paint(GC gc, Rectangle repaintRegion, + Hashtable resourceTable, IHyperlinkSegment selectedLink, + SelectionData selData) { + ParagraphSegment[] segments = getSegments(); + + for (int i = 0; i < segments.length; i++) { + ParagraphSegment segment = segments[i]; + if (!segment.intersects(repaintRegion)) + continue; + bool doSelect = false; + if (selectedLink !is null && segment.equals(selectedLink)) + doSelect = true; + segment.paint(gc, false, resourceTable, doSelect, selData, repaintRegion); + } + } + + public void computeSelection(GC gc, Hashtable resourceTable, IHyperlinkSegment selectedLink, + SelectionData selData) { + ParagraphSegment[] segments = getSegments(); + + for (int i = 0; i < segments.length; i++) { + ParagraphSegment segment = segments[i]; + //bool doSelect = false; + //if (selectedLink !is null && segment.equals(selectedLink)) + //doSelect = true; + segment.computeSelection(gc, resourceTable, selData); + } + } + + public String getAccessibleText() { + ParagraphSegment[] segments = getSegments(); + StringWriter swriter = new StringWriter(); + PrintWriter writer = new PrintWriter(swriter); + for (int i = 0; i < segments.length; i++) { + ParagraphSegment segment = segments[i]; + if ( auto ts = cast(TextSegment)segment ) { + String text = ts.getText(); + writer.print(text); + } + } + writer.println(); + swriter.flush(); + return swriter.toString(); + } + + public ParagraphSegment findSegmentAt(int x, int y) { + if (segments !is null) { + for (int i = 0; i < segments.size(); i++) { + ParagraphSegment segment = cast(ParagraphSegment) segments.get(i); + if (segment.contains(x, y)) + return segment; + } + } + return null; + } + public void clearCache(String fontId) { + if (segments !is null) { + for (int i = 0; i < segments.size(); i++) { + ParagraphSegment segment = cast(ParagraphSegment) segments.get(i); + segment.clearCache(fontId); + } + } + } +}