diff dwtx/draw2d/text/FlowFigure.d @ 98:95307ad235d9

Added Draw2d code, still work in progress
author Frank Benoit <benoit@tionex.de>
date Sun, 03 Aug 2008 00:52:14 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtx/draw2d/text/FlowFigure.d	Sun Aug 03 00:52:14 2008 +0200
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2005 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.draw2d.text.FlowFigure;
+
+import dwt.dwthelper.utils;
+import dwtx.dwtxhelper.Collection;
+
+import dwtx.draw2d.Figure;
+import dwtx.draw2d.IFigure;
+import dwtx.draw2d.geometry.Rectangle;
+import dwtx.draw2d.text.BidiProcessor;
+import dwtx.draw2d.text.FlowFigureLayout;
+import dwtx.draw2d.text.BidiInfo;
+import dwtx.draw2d.text.FlowContext;
+
+/**
+ * The base implementation for text flow figures. A flow figure is used to render a
+ * document in which elements are laid out horizontally within a "line" until that line is
+ * filled. Layout continues on the next line.
+ *
+ * <p>WARNING: This class is not intended to be subclassed by clients. Future versions may
+ * contain additional abstract methods.
+ *
+ * @author hudsonr
+ * @since 2.1
+ */
+public abstract class FlowFigure
+    : Figure
+{
+    alias Figure.add add;
+
+/**
+ * integer indicating whether selection should be displayed.
+ */
+protected int selectionStart = -1;
+
+/**
+ * Constructs a new FlowFigure.
+ */
+public this() {
+    setLayoutManager(createDefaultFlowLayout());
+}
+
+/**
+ * If the child is a <code>FlowFigure</code>, its FlowContext is passed to it.
+ * @see dwtx.draw2d.IFigure#add(IFigure, Object, int)
+ */
+public void add(IFigure child, Object constraint, int index) {
+    super.add(child, constraint, index);
+    //If this layout manager is a FlowContext, then the child *must* be a FlowFigure
+    if (null !is cast(FlowContext)getLayoutManager() )
+        (cast(FlowFigure)child).setFlowContext(cast(FlowContext)getLayoutManager());
+    revalidateBidi(this);
+}
+
+/**
+ * Calculates the width of text before the next line-break is encountered.
+ * <p>
+ * Default implementation treats each FlowFigure as a line-break.  It adds no width and
+ * returns <code>true</code>.  Sub-classes should override as needed.
+ *
+ * @param width the width before the next line-break (if one's found; all the width,
+ * otherwise) will be added on to the first int in the given array
+ * @return bool indicating whether or not a line-break was found
+ * @since 3.1
+ */
+public bool addLeadingWordRequirements(int[] width) {
+    return true;
+}
+
+/**
+ * FlowFigures can contribute text for their block to the given {@link BidiProcessor},
+ * which will process the contributions to determine Bidi levels and shaping requirements.
+ * <p>
+ * This method is invoked as part of validating Bidi.
+ * <p>
+ * Sub-classes that cache the BidiInfo and/or the bidi level in ContentBoxes should clear
+ * the cached values when this method is invoked.
+ *
+ * @param proc the BidiProcessor to which contributions should be made
+ * @see BidiProcessor#add(FlowFigure, String)
+ * @since 3.1
+ */
+protected void contributeBidi(BidiProcessor proc) {
+    for (Iterator iter = getChildren().iterator(); iter.hasNext();)
+        (cast(FlowFigure)iter.next()).contributeBidi(proc);
+}
+
+/**
+ * Creates the default layout manager
+ * @return The default layout
+ */
+protected abstract FlowFigureLayout createDefaultFlowLayout();
+
+/**
+ * Called after validate has occurred. This is used to update the bounds of the FlowFigure
+ * to encompass its new flow boxed created during validate.
+ */
+public abstract void postValidate();
+
+/**
+ * Overridden to revalidateBidi when fragments are removed.
+ * @see dwtx.draw2d.IFigure#remove(dwtx.draw2d.IFigure)
+ */
+public void remove(IFigure figure) {
+    super.remove(figure);
+    revalidateBidi(this);
+}
+
+/**
+ * This method should be invoked whenever a change that can potentially affect the
+ * Bidi evaluation is made (eg., adding or removing children, changing text, etc.).
+ * <p>
+ * The default implementation delegates the revalidation task to the parent.  Only
+ * {@link BlockFlow#revalidateBidi(IFigure) blocks} perform the actual revalidation.
+ * <p>
+ * The given IFigure is the one that triggered the revalidation.  This can be used to
+ * optimize bidi evaluation.
+ *
+ * @param origin the figure that was revalidated
+ * @since 3.1
+ */
+protected void revalidateBidi(IFigure origin) {
+    if (getParent() !is null)
+        (cast(FlowFigure)getParent()).revalidateBidi(origin);
+}
+
+/**
+ * Sets the bidi information for this figure.  A flow figure contributes bidi text in
+ * {@link #contributeBidi(BidiProcessor)}.  If the figure contributes text associated with
+ * it, this method is called back to indicate the bidi properties for that text within its
+ * block.
+ *
+ * @param info the BidiInfo for this figure
+ * @since 3.1
+ */
+public void setBidiInfo(BidiInfo info) { }
+
+/**
+ * FlowFigures override setBounds() to prevent translation of children. "bounds" is a
+ * derived property for FlowFigures, calculated from the fragments that make up the
+ * FlowFigure.
+ * @see Figure#setBounds(Rectangle)
+ */
+public void setBounds(Rectangle r) {
+    if (bounds.opEquals(r))
+        return;
+    if (!r.contains(bounds))
+        erase();
+    bounds.x = r.x;
+    bounds.y = r.y;
+    bounds.width = r.width;
+    bounds.height = r.height;
+    fireFigureMoved();
+    if (isCoordinateSystem())
+        fireCoordinateSystemChanged();
+    repaint();
+}
+
+/**
+ * Sets the flow context.
+ * @param flowContext the flow context for this flow figure
+ */
+public void setFlowContext(FlowContext flowContext) {
+    (cast(FlowFigureLayout)getLayoutManager()).setFlowContext(flowContext);
+}
+
+/**
+ * Sets the selection or a range of selection.  A start value of -1 is used to indicate no
+ * selection.  A start value >=0 indicates show selection.  A start and end value can be
+ * used to represent a range of offsets which should render selection.
+ * @param start the start offset
+ * @param end the end offset
+ * @since 3.1
+ */
+public void setSelection(int start, int end) {
+    if (selectionStart is start)
+        return;
+    selectionStart = start;
+    repaint();
+}
+
+}