1 /*******************************************************************************
2  * Copyright (c) 2000, 2008 IBM Corporation and others.
3  * All rights reserved. This program and the accompanying materials
4  * are made available under the terms of the Eclipse Public License v1.0
5  * which accompanies this distribution, and is available at
6  * http://www.eclipse.org/legal/epl-v10.html
7  *
8  * Contributors:
9  *     IBM Corporation - initial API and implementation
10  * Port to the D programming language:
11  *     Frank Benoit <benoit@tionex.de>
12  *******************************************************************************/
13 module org.eclipse.swt.custom.StyledTextContent;
14 
15 import java.lang.all;
16 
17 import org.eclipse.swt.custom.TextChangeListener;
18 /**
19  * Clients may implement the StyledTextContent interface to provide a
20  * custom store for the StyledText widget content. The StyledText widget
21  * interacts with its StyledTextContent in order to access and update
22  * the text that is being displayed and edited in the widget.
23  * A custom content implementation can be set in the widget using the
24  * StyledText.setContent API.
25  */
26 public interface StyledTextContent {
27 
28 /**
29  * Called by StyledText to add itself as an Observer to content changes.
30  * See TextChangeListener for a description of the listener methods that
31  * are called when text changes occur.
32  * <p>
33  *
34  * @param listener the listener
35  * @exception IllegalArgumentException <ul>
36  *    <li>ERROR_NULL_ARGUMENT when listener is null</li>
37  * </ul>
38  */
39 public void addTextChangeListener(TextChangeListener listener);
40 
41 /**
42  * Return the number of characters in the content.
43  * <p>
44  *
45  * @return the number of characters in the content.
46  */
47 public int getCharCount();
48 
49 /**
50  * Return the line at the given line index without delimiters.
51  * <p>
52  *
53  * @param lineIndex index of the line to return. Does not include
54  *  delimiters of preceding lines. Index 0 is the first line of the
55  *  content.
56  * @return the line text without delimiters
57  */
58 public String getLine(int lineIndex);
59 
60 /**
61  * Return the line index at the given character offset.
62  * <p>
63  *
64  * @param offset offset of the line to return. The first character of the
65  *  document is at offset 0.  An offset of getLength() is valid and should
66  *  answer the number of lines.
67  * @return the line index. The first line is at index 0.  If the character
68  *  at offset is a delimiter character, answer the line index of the line
69  *  that is delimited.
70  *  For example, if text = "\r\n\r\n", and delimiter = "\r\n", then:
71  * <ul>
72  * <li>getLineAtOffset(0) is 0
73  * <li>getLineAtOffset(1) is 0
74  * <li>getLineAtOffset(2) is 1
75  * <li>getLineAtOffset(3) is 1
76  * <li>getLineAtOffset(4) is 2
77  * </ul>
78  */
79 public int getLineAtOffset(int offset);
80 
81 /**
82  * Return the number of lines.  Should answer 1 when no text is specified.
83  * The  StyledText widget relies on this behavior for drawing the cursor.
84  * <p>
85  *
86  * @return the number of lines.  For example:
87  * <ul>
88  * <li> text value is> getLineCount
89  * <li> null is> 1
90  * <li> "" is> 1
91  * <li> "a\n" is> 2
92  * <li> "\n\n" is> 3
93  * </ul>
94  */
95 public int getLineCount();
96 
97 /**
98  * Return the line delimiter that should be used by the StyledText
99  * widget when inserting new lines. New lines entered using key strokes
100  * and paste operations use this line delimiter.
101  * Implementors may use System.getProperty("line.separator") to return
102  * the platform line delimiter.
103  * <p>
104  *
105  * @return the line delimiter that should be used by the StyledText widget
106  *  when inserting new lines.
107  */
108 public String getLineDelimiter();
109 
110 /**
111  * Return the character offset of the first character of the given line.
112  * <p>
113  * <b>NOTE:</b> When there is no text (i.e., no lines), getOffsetAtLine(0)
114  * is a valid call that should return 0.
115  * </p>
116  *
117  * @param lineIndex index of the line. The first line is at index 0.
118  * @return offset offset of the first character of the line. The first
119  *  character of the document is at offset 0.  The return value should
120  *  include line delimiters.
121  *  For example, if text = "\r\ntest\r\n" and delimiter = "\r\n", then:
122  * <ul>
123  * <li>getOffsetAtLine(0) is 0
124  * <li>getOffsetAtLine(1) is 2
125  * <li>getOffsetAtLine(2) is 8
126  * </ul>
127  */
128 public int getOffsetAtLine(int lineIndex);
129 
130 /**
131  * Returns a string representing the content at the given range.
132  * <p>
133  *
134  * @param start the start offset of the text to return. Offset 0 is the
135  *  first character of the document.
136  * @param length the length of the text to return
137  * @return the text at the given range
138  */
139 public String getTextRange(int start, int length);
140 
141 /**
142  * Remove the specified text changed listener.
143  * <p>
144  *
145  * @param listener the listener which should no longer be notified
146  *
147  * @exception IllegalArgumentException <ul>
148  *    <li>ERROR_NULL_ARGUMENT when listener is null</li>
149  * </ul>
150  */
151 public void removeTextChangeListener(TextChangeListener listener);
152 
153 /**
154  * Replace the text with "newText" starting at position "start"
155  * for a length of "replaceLength".
156  * <p>
157  * Implementors have to notify the TextChangeListeners that were added
158  * using <code>addTextChangeListener</code> before and after the content
159  * is changed. A <code>TextChangingEvent</code> has to be sent to the
160  * textChanging method before the content is changed and a
161  * <code>TextChangedEvent</code> has to be sent to the textChanged method
162  * after the content has changed.
163  * The text change that occurs after the <code>TextChangingEvent</code>
164  * has been sent has to be consistent with the data provided in the
165  * <code>TextChangingEvent</code>.
166  * This data will be cached by the widget and will be used when the
167  * <code>TextChangedEvent</code> is received.
168  * <p>
169  * The <code>TextChangingEvent</code> should be set as follows:
170  * <ul>
171  * <li>event.start = start of the replaced text
172  * <li>event.newText = text that is going to be inserted or empty String
173  *  if no text will be inserted
174  * <li>event.replaceCharCount = length of text that is going to be replaced
175  * <li>event.newCharCount = length of text that is going to be inserted
176  * <li>event.replaceLineCount = number of lines that are going to be replaced
177  * <li>event.newLineCount = number of new lines that are going to be inserted
178  * </ul>
179  * <b>NOTE:</b> newLineCount is the number of inserted lines and replaceLineCount
180  * is the number of deleted lines based on the change that occurs visually.
181  * For example:
182  * <ul>
183  * <li>(replaceText, newText) is> (replaceLineCount, newLineCount)
184  * <li>("", "\n") is> (0, 1)
185  * <li>("\n\n", "a") is> (2, 0)
186  * <li>("a", "\n\n") is> (0, 2)
187  * <li>("\n", "") is> (1, 0)
188  * </ul>
189  * </p>
190  *
191  * @param start start offset of text to replace, none of the offsets include
192  *  delimiters of preceding lines, offset 0 is the first character of the
193  *  document
194  * @param replaceLength length of text to replace
195  * @param text text to replace
196  * @see TextChangeListener
197  */
198 public void replaceTextRange(int start, int replaceLength, String text);
199 
200 /**
201  * Set text to "text".
202  * Implementors have to send a <code>TextChangedEvent</code> to the
203  * textSet method of the TextChangeListeners that were added using
204  * <code>addTextChangeListener</code>.
205  * <p>
206  *
207  * @param text the new text
208  * @see TextChangeListener
209  */
210 public void setText(String text);
211 
212 }