diff dwtx/jface/text/Document.d @ 129:eb30df5ca28b

Added JFace Text sources
author Frank Benoit <benoit@tionex.de>
date Sat, 23 Aug 2008 19:10:48 +0200
parents
children c4fb132a086c
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dwtx/jface/text/Document.d	Sat Aug 23 19:10:48 2008 +0200
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * 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.jface.text.Document;
+
+import dwt.dwthelper.utils;
+
+
+/**
+ * Default document implementation. Uses a {@link dwtx.jface.text.GapTextStore} wrapped
+ * inside a {@link dwtx.jface.text.CopyOnWriteTextStore} as text store.
+ * <p>
+ * The used line tracker considers the following strings as line delimiters: "\n", "\r", "\r\n".
+ * </p>
+ * <p>
+ * The document is ready to use. It has a default position category for which a default position
+ * updater is installed.
+ * </p>
+ * <p>
+ * <strong>Performance:</strong> The implementation should perform reasonably well for typical
+ * source code documents. It is not designed for very large documents of a size of several
+ * megabytes. Space-saving implementations are initially used for both the text store and the line
+ * tracker; the first modification after a {@link #set(String) set} incurs the cost to transform the
+ * document structures to efficiently handle updates.
+ * </p>
+ * <p>
+ * See {@link GapTextStore} and <code>TreeLineTracker</code> for algorithmic behavior of the used
+ * document structures.
+ * </p>
+ * 
+ * @see dwtx.jface.text.GapTextStore
+ * @see dwtx.jface.text.CopyOnWriteTextStore
+ */
+public class Document : AbstractDocument {
+    /**
+     * Creates a new empty document.
+     */
+    public Document() {
+        super();
+        setTextStore(new CopyOnWriteTextStore(new GapTextStore()));
+        setLineTracker(new DefaultLineTracker());
+        completeInitialization();
+    }
+
+    /**
+     * Creates a new document with the given initial content.
+     *
+     * @param initialContent the document's initial content
+     */
+    public Document(String initialContent) {
+        super();
+        setTextStore(new CopyOnWriteTextStore(new GapTextStore()));
+        setLineTracker(new DefaultLineTracker());
+        getStore().set(initialContent);
+        getTracker().set(initialContent);
+        completeInitialization();
+    }
+
+    /*
+     * @see dwtx.jface.text.IRepairableDocumentExtension#isLineInformationRepairNeeded(int, int, java.lang.String)
+     * @since 3.4
+     */
+    public bool isLineInformationRepairNeeded(int offset, int length, String text) throws BadLocationException {
+        if ((0 > offset) || (0 > length) || (offset + length > getLength()))
+            throw new BadLocationException();
+
+        return isLineInformationRepairNeeded(text) || isLineInformationRepairNeeded(get(offset, length));
+    }
+
+    /**
+     * Checks whether the line information needs to be repaired.
+     * 
+     * @param text the text to check
+     * @return <code>true</code> if the line information must be repaired
+     * @since 3.4
+     */
+    private bool isLineInformationRepairNeeded(String text) {
+        if (text is null)
+            return false;
+
+        int length= text.length();
+        if (length is 0)
+            return false;
+
+        int rIndex= text.indexOf('\r');
+        int nIndex= text.indexOf('\n');
+        if (rIndex is -1 && nIndex is -1)
+            return false;
+
+        if (rIndex > 0 && rIndex < length-1 && nIndex > 1 && rIndex < length-2)
+            return false;
+
+        String defaultLD= null;
+        try {
+            defaultLD= getLineDelimiter(0);
+        } catch (BadLocationException x) {
+            return true;
+        }
+
+        if (defaultLD is null)
+            return false;
+        
+        defaultLD= getDefaultLineDelimiter();
+
+        if (defaultLD.length() is 1) {
+            if (rIndex !is -1 && !"\r".equals(defaultLD)) //$NON-NLS-1$
+                return true;
+            if (nIndex !is -1 && !"\n".equals(defaultLD)) //$NON-NLS-1$
+                return true;
+        } else if (defaultLD.length() is 2)
+            return rIndex is -1 || nIndex - rIndex !is 1;
+        
+        return false;
+    }
+    
+}