/* ====================================================================
   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.hwpf.usermodel;

import org.apache.poi.ddf.EscherContainerRecord;

/**
 * User-friendly interface to office drawing objects.
 * <p>
 * Some properties and enumeration constants description are quotes from the
 * following sources:
 * <ul>
 * <li>[MS-ODRAW] -- v20110608; Office Drawing Binary File Format; Copyright (c)
 * 2011 Microsoft Corporation.
 * </ul>
 * 
 * @author Sergey Vladimirov (vlsergey {at} gmail {dot} com)
 */
public interface OfficeDrawing
{

    public enum HorizontalPositioning {

        /**
         * The shape is horizontally offset by an absolute distance from the
         * page element.
         */
        ABSOLUTE,

        /**
         * The shape is horizontally positioned at the center of the page
         * element.
         */
        CENTER,

        /**
         * The shape is horizontally positioned like {@link #LEFT} on
         * odd-numbered pages and like {@link #RIGHT} on even-numbered pages.
         */
        INSIDE,

        /**
         * The shape is horizontally positioned at the left side of the page
         * element.
         */
        LEFT,

        /**
         * The shape is horizontally positioned like {@link #RIGHT} on
         * odd-numbered pages and like {@link #LEFT} on even-numbered pages.
         */
        OUTSIDE,

        /**
         * The shape is horizontally positioned at the right side of the page
         * element.
         */
        RIGHT
    }

    public enum HorizontalRelativeElement {
        CHAR, MARGIN, PAGE, TEXT
    }

    public enum VerticalPositioning {

        /**
         * The shape is vertically offset by an absolute distance from the page
         * element
         */
        ABSOLUTE,

        /**
         * The shape is vertically positioned at the bottom of the page element
         */
        BOTTOM,

        /**
         * The shape is vertically positioned in the center of the page element
         */
        CENTER,

        /**
         * The shape is vertically positioned like msopvTop on odd-numbered
         * pages and like msopvBottom on even-numbered pages
         */
        INSIDE,

        /**
         * The shape is vertically positioned like {@link #BOTTOM} on
         * odd-numbered pages and like {@link #TOP} on even-numbered pages
         */
        OUTSIDE,

        /**
         * The shape is vertically positioned at the top of the page element
         */
        TOP
    }

    public enum VerticalRelativeElement {
        LINE, MARGIN, PAGE, TEXT
    }

    /**
     * Returns the type of horizontal positioning to use for a shape
     * 
     * @return the type of horizontal positioning to use for a shape
     */
    public HorizontalPositioning getHorizontalPositioning();

    /**
     * Specifies a page element relative to which a shape is horizontally
     * positioned
     * 
     * @return a page element relative to which a shape is horizontally
     *         positioned
     */
    public HorizontalRelativeElement getHorizontalRelative();

    /**
     * Returns escher record that represent shape container (record type is
     * <tt>0xF004</tt>). Returned record has a child with record type
     * <tt>0xF00A</tt> and value of shape id equals to {@link #getShapeId()}.
     * 
     * @return Returns office art shape container or <tt>null</tt> if not found
     */
    public EscherContainerRecord getOfficeArtSpContainer();

    /**
     * Returns picture data if this shape has (single?) associated picture data
     */
    byte[] getPictureData();

    /**
     * Bottom of the rectangle enclosing shape relative to the origin of the
     * shape
     */
    int getRectangleBottom();

    /**
     * Left of rectangle enclosing shape relative to the origin of the shape
     */
    int getRectangleLeft();

    /**
     * Right of rectangle enclosing shape relative to the origin of the shape
     */
    int getRectangleRight();

    /**
     * Top of rectangle enclosing shape relative to the origin of the shape
     */
    int getRectangleTop();

    /**
     * Shape Identifier
     */
    int getShapeId();

    /**
     * Specifies the type of vertical positioning to use for a shape
     * 
     * @return return the type of vertical positioning to use for a shape
     */
    public VerticalPositioning getVerticalPositioning();

    /**
     * Specifies a page element relative to which a shape is vertically
     * positioned
     * 
     * @return a page element relative to which a shape is vertically positioned
     */
    public VerticalRelativeElement getVerticalRelativeElement();

}
