/* ====================================================================
 * Copyright (c) 2003-2006, Martin Hauner
 *                          http://subcommander.tigris.org
 *
 * Subcommander is licensed as described in the file doc/COPYING, which
 * you should have received as part of this distribution.
 * ====================================================================
 */

// sc
#include "config.h"
#include "SingleTextWidget.h"
#include "sublib/TextModel.h"
#include "sublib/NullTextModel.h"
#include "util/String.h"

// sc gui
#include "TextWidget.h"
#include "TextLineNrWidget.h"

// qt
#include <qgrid.h>
#include <qhbox.h>
#include <qvbox.h>
#include <qlayout.h>
#include <qscrollbar.h>
#include <qsplitter.h>
#include <qmultilineedit.h>
#include <qpushbutton.h>
#include <qlineedit.h>
#include <qlabel.h>
#include <qtooltip.h>

// sys
#include <stdio.h>
#include <algorithm>
#include <assert.h>



static NullTextModel NullText;

SingleTextWidget::SingleTextWidget( QWidget *parent, const char *name )
: super( parent, name )
{
  // base class layout
  QGridLayout* gl = (QGridLayout*)layout();
  {
    QWidget*     iw  = new QWidget(this);
    QGridLayout* mgl = new QGridLayout( iw, 3, 1 );
    mgl->setMargin( 2 );
    mgl->setSpacing( 2 );
    gl->addWidget( iw, 0, 0 );
    {
      // first row
      _label = new QLineEdit(iw);
      _label->setText( _q("empty...") );
      _label->setFrameStyle( QFrame::Panel | QFrame::Sunken );
      _label->setLineWidth( 1 );
      _label->setReadOnly(true);
      _label->setMargin(1);
      _label->setBackgroundMode( Qt::PaletteButton );
      _label->setSizePolicy( QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Fixed) );
      mgl->addWidget( _label, 0, 0 );

      // second
      QFrame* f = new QFrame(iw);
      f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
      f->setLineWidth(1);
      mgl->addWidget( f, 1, 0 );

      // third
      QHBox* mltb = new QHBox(iw);
      mltb->setBackgroundMode( Qt::NoBackground );
      mltb->setSizePolicy( QSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding) );
      mltb->setMargin(0);
      mltb->setSpacing(0);
      mgl->addWidget( mltb, 2, 0 );
      {
        _line = new TextLineNrWidget(mltb);
        _text = new TextWidget(mltb);
      }
    }
  }
  connect( _text, SIGNAL(xChanged(int)), SLOT(xChange(int)) );
  connect( _text, SIGNAL(yChanged(int)), SLOT(yChange(int)) );
  connect( _text, SIGNAL(sizeChanged()), SLOT(sizeChanged()) );
}

SingleTextWidget::~SingleTextWidget()
{
}

void SingleTextWidget::setModel( TextModel* model )
{
  _text->setModel( model, &NullText );
  _line->setModel( model );
  _label->setText( model->getSourceName().getStr() );
  QToolTip::add( _label, model->getSourceName().getStr() );
}

void SingleTextWidget::setModel( DiffInfoModel* info )
{
  assert(false);
}

void SingleTextWidget::setLabel( const sc::String& l )
{
  if( l.getCharCnt() > 0 )
  {
    _label->setText( (const char*)l );
  }
}

void SingleTextWidget::enableSelection( bool enable )
{
  _text->enableSelection(enable);
}

void SingleTextWidget::setEditable( bool editable )
{
  _text->setEditable(editable);
}

void SingleTextWidget::vsbChange(int y)
{
  _text->setScrollPosY(y);
  _line->setScrollPosY(y);
}

void SingleTextWidget::hsbChange(int x)
{
  _text->setScrollPosX(x);
}

void SingleTextWidget::xChange(int x)
{
  if( _hsb->value() == x )
  {
    return;
  }

  _hsb->setValue(x);
}

void SingleTextWidget::yChange(int y)
{
  if( _vsb->value() == y )
  {
    return;
  }

  _vsb->setValue(y);
}

void SingleTextWidget::sizeChanged()
{
  _line->update();
}

QSize SingleTextWidget::getScrollSizeHint()
{
  return _text->sizeHint();
}

QSize SingleTextWidget::getScrollSizeCurr()
{
  return _text->size();
}

TextWidget* SingleTextWidget::getText() const
{
  return _text;
}

void SingleTextWidget::jumpToLine( int line )
{
  int ypos = _text->calcLineY(line,true);

  if( _vsb->value() == ypos )
  {
    return;
  }

  _vsb->setValue(ypos);
}

void SingleTextWidget::jumpToBlock( int block )
{
  BlockInfo bi = _text->getModel()->getBlockInfo( block );

  if( bi.isEmpty() )
  {
    return;
  }

  jumpToLine( bi.getStart() );
}

void SingleTextWidget::update()
{
  _text->update();
  _line->update();
  super::update();
}

void SingleTextWidget::setAcceptDrops(bool on)
{
  _text->setAcceptDrops(true);
}


syntax highlighted by Code2HTML, v. 0.9.1