/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

package org.apache.poi.xwpf.usermodel;

import java.util.List;

import org.apache.poi.POIXMLDocumentPart;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTbl;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTc;

/**
 * <p>An IBody represents the different parts of the document which
 * can contain collections of Paragraphs and Tables. It provides a
 * common way to work with these and their contents.</p>
 * <p>Typically, this is something like a XWPFDocument, or one of
 *  the parts in it like XWPFHeader, XWPFFooter, XWPFTableCell
 * </p>
 */
public interface IBody {
    /**
     * returns the Part, to which the body belongs, which you need for adding relationship to other parts
     * Actually it is needed of the class XWPFTableCell. Because you have to know to which part the tableCell
     * belongs.
     * @return the Part, to which the body belongs
     */
    public POIXMLDocumentPart getPart();

    /**
     * get the PartType of the body, for example
     * DOCUMENT, HEADER, FOOTER, FOOTNOTE, 
     * @return the PartType of the body
     */
    public BodyType getPartType();

    /**
     * Returns an Iterator with paragraphs and tables, 
     *  in the order that they occur in the text.
     */
    public List<IBodyElement> getBodyElements();

    /**
     * Returns the paragraph(s) that holds
     *  the text of the header or footer.
     */
    public List<XWPFParagraph> getParagraphs();

    /**
     * Return the table(s) that holds the text
     *  of the IBodyPart, for complex cases
     *  where a paragraph isn't used.
     */
    public List<XWPFTable> getTables();

    /**
     * if there is a corresponding {@link XWPFParagraph} of the parameter ctTable in the paragraphList of this header or footer
     * the method will return this paragraph
     * if there is no corresponding {@link XWPFParagraph} the method will return null 
     * @param p is instance of CTP and is searching for an XWPFParagraph
     * @return null if there is no XWPFParagraph with an corresponding CTPparagraph in the paragraphList of this header or footer
     * 		   XWPFParagraph with the correspondig CTP p
     */
    public XWPFParagraph getParagraph(CTP p);

    /**
     * if there is a corresponding {@link XWPFTable} of the parameter ctTable in the tableList of this header
     * the method will return this table
     * if there is no corresponding {@link XWPFTable} the method will return null 
     * @param ctTable
     */
    public XWPFTable getTable(CTTbl ctTable);

    /**
     * Returns the paragraph that of position pos
     */
    public XWPFParagraph getParagraphArray(int pos);

    /**
     * Returns the table at position pos
     */
    public XWPFTable getTableArray(int pos);

    /**
     *inserts a new paragraph at position of the cursor
     * @param cursor
     */
    public XWPFParagraph insertNewParagraph(XmlCursor cursor);

    /**
     * inserts a new Table at the cursor position.
     * @param cursor
     */
    public XWPFTable insertNewTbl(XmlCursor cursor);

    /**
     * inserts a new Table at position pos
     * @param pos
     * @param table
     */
    void insertTable(int pos, XWPFTable table);

    /**
     * returns the TableCell to which the Table belongs
     * @param cell
     */
    public XWPFTableCell getTableCell(CTTc cell);

    /**
     * Return XWPFDocument
     */
    public XWPFDocument getXWPFDocument();
}
