#ifndef _COLORER_LINEREGION_H_
#define _COLORER_LINEREGION_H_

#include<colorer/handlers/RegionDefine.h>
#include<colorer/handlers/StyledRegion.h>
#include<colorer/handlers/TextRegion.h>
#include<colorer/Scheme.h>

/** Defines region position properties.
    These properties are created dynamically during text parsing
    and stores region's position on line and mapping
    of region into the RegionDefine instance.
    @ingroup colorer_handlers
*/
class LineRegion{
public:
  /** Reference to HRC region, which identifies type of this range */
  const Region *region;
  /** Reference to RegionDefine class (it's subclass).
      This reference can contain concrete information about region
      extended properties.
      Can be null, if no region mapping were defined.
  */
  RegionDefine *rdef;
  /** Start and End position of region in line */
  int start, end;
  /** Reference to region's HRC scheme */
  const Scheme *scheme;
  /** Previous and next links to ranged region in this line.
      First region of each line contains reference to it's last
      region in prev field.
      If @c next field is null, this is a last region in line.
  */
  LineRegion *next, *prev;
  /** Special meaning marker. Generally this is used to inform
      application about paired regions, which are invisible during
      ordinary text drawing.
  */
  bool special;

  /** Transforms this region's reference into styled region define
      and returns new pointer.
  */
  const StyledRegion *styled(){
    return StyledRegion::cast(rdef);
  };
  /** Transforms this region's reference into text region define
      and returns new pointer.
  */
  const TextRegion *texted(){
    return TextRegion::cast(rdef);
  };
  /** Copy operator */
  LineRegion& operator=(const LineRegion&lr){
    start = lr.start;
    end   = lr.end;
    scheme = lr.scheme;
    region = lr.region;
    special = lr.special;
    rdef = null;
    if (lr.rdef != null) rdef = lr.rdef->clone();
    return *this;
  };
  /** Clears all fields */
  LineRegion::LineRegion(){
    next = prev = null;
    start = end = 0;
    scheme = null;
    region = null;
    rdef = null;
    special = false;
  };
  /** Copy constructor.
      Do not copies next and prev pointers.
  */
  LineRegion::LineRegion(const LineRegion &lr){
    //_next = lr._next;
    //_prev = lr._prev;
    operator=(lr);
  };
  LineRegion::~LineRegion(){
    delete rdef;
  };
private:
};

#endif

/* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (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.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is the Colorer Library.
 *
 * The Initial Developer of the Original Code is
 * Cail Lomecb <cail@nm.ru>.
 * Portions created by the Initial Developer are Copyright (C) 1999-2003
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 *
 * Alternatively, the contents of this file may be used under the terms of
 * either the GNU General Public License Version 2 or later (the "GPL"), or
 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
 * in which case the provisions of the GPL or the LGPL are applicable instead
 * of those above. If you wish to allow use of your version of this file only
 * under the terms of either the GPL or the LGPL, and not to allow others to
 * use your version of this file under the terms of the MPL, indicate your
 * decision by deleting the provisions above and replace them with the notice
 * and other provisions required by the GPL or the LGPL. If you do not delete
 * the provisions above, a recipient may use your version of this file under
 * the terms of any one of the MPL, the GPL or the LGPL.
 *
 * ***** END LICENSE BLOCK ***** */
