/* ====================================================================
   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.ooxml.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();

    /**
     * Returns the paragraph corresponding to the provided {@link CTP}.
     *
     * @param p is instance of CTP and is searching for an XWPFParagraph
     * @return The paragraph corresponding to the {@link CTP}, or {@code null} if there is no corresponding paragraph in
     * this body.
     */
    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();
}
