/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/



// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_svx.hxx"

// include ---------------------------------------------------------------

#include <svx/paraprev.hxx>

// STATIC DATA -----------------------------------------------------------

#define FOUR_POINTS	80

// class SvxParaPrevWindow -----------------------------------------------

SvxParaPrevWindow::SvxParaPrevWindow( Window* pParent, const ResId& rId ) :

	Window( pParent, rId ),

    nLeftMargin     ( 0 ),
	nRightMargin	( 0 ),
    nFirstLineOfst  ( 0 ),
    nUpper          ( 0 ),
	nLower			( 0 ),
	eAdjust			( SVX_ADJUST_LEFT ),
	eLastLine       ( SVX_ADJUST_LEFT ),
	eLine			( SVX_PREV_LINESPACE_1 ),
	nLineVal		( 0 )

{
	// defaultmaessing in Twips rechnen
	SetMapMode( MapMode( MAP_TWIP ) );
	aWinSize = GetOutputSizePixel();
	aWinSize = PixelToLogic( aWinSize );
    Size aTmp(1, 1);
    aTmp = PixelToLogic(aTmp);
    aWinSize.Width() -= aTmp.Width() /2;
    aWinSize.Height() -= aTmp.Height() /2;

	aSize = Size( 11905, 16837 );

    SetBorderStyle( WINDOW_BORDER_MONO );
}

// -----------------------------------------------------------------------

void SvxParaPrevWindow::Paint( const Rectangle& )
{
	DrawParagraph( sal_True );
}

// -----------------------------------------------------------------------

#define DEF_MARGIN	120

void SvxParaPrevWindow::DrawParagraph( sal_Bool bAll )
{
    const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
    const Color& rWinColor = rStyleSettings.GetWindowColor();
    Color aGrayColor(COL_LIGHTGRAY);

    SetFillColor( Color( rWinColor ) );
    if( bAll )
        DrawRect( Rectangle( Point(), aWinSize ) );

    SetLineColor();

	long nH = aWinSize.Height() / 19;
	Size aLineSiz( aWinSize.Width() - DEF_MARGIN, nH ),
		 aSiz = aLineSiz;
	Point aPnt;
	aPnt.X() = DEF_MARGIN / 2;
    SetFillColor( aGrayColor );

	for ( sal_uInt16 i = 0; i < 9; ++i )
	{
		if ( 3 == i )
		{
            SetFillColor( Color( COL_GRAY ) );
            long nTop = nUpper * aLineSiz.Height() / aSize.Height();
			aPnt.Y() += nTop * 2;
		}

		if ( 6 == i )
            SetFillColor( aGrayColor );

		if ( 3 <= i && 6 > i )
		{
			long nLeft = nLeftMargin * aLineSiz.Width() / aSize.Width();
			long nFirst = nFirstLineOfst * aLineSiz.Width() / aSize.Width();
			long nTmp = nLeft + nFirst;

			if ( 3 == i )
			{
				aPnt.X() += nTmp;
				aSiz.Width() -= nTmp;
			}
			else
			{
				aPnt.X() += nLeft;
				aSiz.Width() -= nLeft;
			}
            long nRight = nRightMargin * aLineSiz.Width() / aSize.Width();
            aSiz.Width() -= nRight;
		}

		if ( 4 == i || 5 == i || 6 == i )
		{
			switch ( eLine )
			{
				case SVX_PREV_LINESPACE_1:						break;
				case SVX_PREV_LINESPACE_15:	aPnt.Y() += nH / 2;	break;
				case SVX_PREV_LINESPACE_2:	aPnt.Y() += nH;		break;

				case SVX_PREV_LINESPACE_PROP:
				case SVX_PREV_LINESPACE_MIN:
				case SVX_PREV_LINESPACE_DURCH:					break;
			}
		}

		aPnt.Y() += nH;

        if ( (3 <= i) && (5 >= i) )
		{
            long nLW;
            switch( i )
            {
				default:
                case 3: nLW = aLineSiz.Width() * 8 / 10;    break;
                case 4: nLW = aLineSiz.Width() * 9 / 10;    break;
                case 5: nLW = aLineSiz.Width() / 2;         break;
            }

			if ( nLW > aSiz.Width() )
				nLW = aSiz.Width();

			switch ( eAdjust )
			{
				case SVX_ADJUST_LEFT:
					break;
				case SVX_ADJUST_RIGHT:
					aPnt.X() += ( aSiz.Width() - nLW );
					break;
				case SVX_ADJUST_CENTER:
					aPnt.X() += ( aSiz.Width() - nLW ) / 2;
					break;
                default: ; //prevent warning
            }
            if( SVX_ADJUST_BLOCK == eAdjust )
            {
                if( 5 == i )
                {
                    switch( eLastLine )
                    {
                        case SVX_ADJUST_LEFT:
                            break;
                        case SVX_ADJUST_RIGHT:
                            aPnt.X() += ( aSiz.Width() - nLW );
                            break;
                        case SVX_ADJUST_CENTER:
                            aPnt.X() += ( aSiz.Width() - nLW ) / 2;
                            break;
                        case SVX_ADJUST_BLOCK:
                            nLW = aSiz.Width();
                            break;
                        default: ; //prevent warning
                    }
                }
                else
                    nLW = aSiz.Width();
			}
            aSiz.Width() = nLW;
		}

        Rectangle aRect( aPnt, aSiz );

		if ( Lines[i] != aRect || bAll )
		{
			if ( !bAll )
			{
				Color aFillCol = GetFillColor();
                SetFillColor( rWinColor );
                DrawRect( Lines[i] );
				SetFillColor( aFillCol );
			}
			DrawRect( aRect );
			Lines[i] = aRect;
		}

		if ( 5 == i )
		{
			long nBottom = nLower * aLineSiz.Height() / aSize.Height();
			aPnt.Y() += nBottom * 2;
		}

		aPnt.Y() += nH;
		// wieder zuruecksetzen, fuer jede Linie neu berechnen
		aPnt.X() = DEF_MARGIN / 2;
		aSiz = aLineSiz;
	}
}

#undef DEF_MARGIN

// -----------------------------------------------------------------------

void SvxParaPrevWindow::OutputSizeChanged()
{
	aWinSize = GetOutputSizePixel();
	aWinSize = PixelToLogic( aWinSize );
	Invalidate();
}

