001    // This file is part of the Attempto Java Packages.
002    // Copyright 2008, Attempto Group, University of Zurich (see http://attempto.ifi.uzh.ch).
003    //
004    // The Attempto Java Packages is free software: you can redistribute it and/or modify it under the
005    // terms of the GNU Lesser General Public License as published by the Free Software Foundation,
006    // either version 3 of the License, or (at your option) any later version.
007    //
008    // The Attempto Java Packages is distributed in the hope that it will be useful, but WITHOUT ANY
009    // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
010    // PURPOSE. See the GNU Lesser General Public License for more details.
011    //
012    // You should have received a copy of the GNU Lesser General Public License along with the Attempto
013    // Java Packages. If not, see http://www.gnu.org/licenses/.
014    
015    package ch.uzh.ifi.attempto.preditor.text;
016    
017    import java.util.ArrayList;
018    import java.util.List;
019    
020    /**
021     * This class represents a text container that stores a sequence of text elements that represent a
022     * (partial) text or sentence.
023     * 
024     * @author Tobias Kuhn
025     */
026    public class TextContainer {
027            
028            private ArrayList<TextElement> elements = new ArrayList<TextElement>();
029            
030            /**
031             * Creates a new text container.
032             */
033            public TextContainer() {
034            }
035            
036            /**
037             * Returns the sequence of text elements.
038             * 
039             * @return A list containing the text elements.
040             */
041            public ArrayList<TextElement> getTextElements() {
042                    return new ArrayList<TextElement>(elements);
043            }
044            
045            /**
046             * Sets the text elements.
047             * @param elements A list of text elements.
048             */
049            public void setTextElements(List<TextElement> elements) {
050                    this.elements = new ArrayList<TextElement>(elements);
051                    updateConnections();
052            }
053            
054            /**
055             * Adds the text element to the end of the sequence.
056             * 
057             * @param el The text element to be added.
058             */
059            public void addElement(TextElement el) {
060                    elements.add(el);
061                    updateConnections();
062            }
063            
064            /**
065             * Removes all text elements.
066             */
067            public void removeAllElements() {
068                    elements.clear();
069            }
070            
071            /**
072             * Removes the last text element of the sequence if it is not empty.
073             */
074            public void removeLastElement() {
075                    if (elements.size() > 0) {
076                            elements.remove(elements.size() - 1);
077                            updateConnections();
078                    }
079            }
080            
081            /**
082             * Returns the text that is represented by the sequence of text element as a string.
083             * 
084             * @return The text.
085             */
086            public String getText() {
087                    String text = "";
088                    for (TextElement e : elements) {
089                            if (e.getText().matches("[.?!]")) {
090                                    text += e.getText();
091                            } else {
092                                    text += " " + e.getText();
093                            }
094                    }
095                    if (text.startsWith(" ")) {
096                            text = text.substring(1);
097                    }
098                    return text;
099            }
100            
101            private void updateConnections() {
102                    for (int i = 1; i < elements.size()-1; i++) {
103                            elements.get(i).checkNeighborTextElements(elements.get(i-1), elements.get(i+1));
104                    }
105                    if (elements.size() > 1) {
106                            elements.get(0).checkNeighborTextElements(null, elements.get(1));
107                            elements.get(elements.size()-1).checkNeighborTextElements(elements.get(elements.size()-2), null);
108                    }
109                    if (elements.size() == 1) {
110                            elements.get(0).checkNeighborTextElements(null, null);
111                    }
112            }
113    
114    }