blob: 0e8b34006fab58b40ac5d0fee9a134bda5adf157 [file] [log] [blame]
/**************************************************************
*
* 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_sw.hxx"
#include "cmdid.h"
#include "hintids.hxx"
#include <algorithm>
#include <svl/eitem.hxx>
#include <editeng/lrspitem.hxx>
#include <editeng/ulspitem.hxx>
#include <editeng/sizeitem.hxx>
#include <svx/pageitem.hxx>
#include <editeng/brshitem.hxx>
#include <editeng/frmdiritem.hxx>
#include <vcl/bitmap.hxx>
#include <vcl/graph.hxx>
#include <tgrditem.hxx>
#include <viewopt.hxx>
#include "colex.hxx"
#include "colmgr.hxx"
/*-----------------------------------------------------------------------
Beschreibung: Uebernahme der aktualisierten Werte aus dem Set
-----------------------------------------------------------------------*/
void SwPageExample::UpdateExample( const SfxItemSet& rSet )
{
const SvxPageItem* pPage = 0;
SfxItemPool* pPool = rSet.GetPool();
sal_uInt16 nWhich = pPool->GetWhich( SID_ATTR_PAGE );
if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET )
{
// Ausrichtung
pPage = (const SvxPageItem*)&rSet.Get( nWhich );
if ( pPage )
SetUsage( pPage->GetPageUsage() );
}
nWhich = pPool->GetWhich( SID_ATTR_PAGE_SIZE );
if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET )
{
// Orientation und Size aus dem PageItem
const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get( nWhich );
SetSize( rSize.GetSize() );
}
nWhich = RES_LR_SPACE;
if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET )
{
// linken und rechten Rand einstellen
const SvxLRSpaceItem& rLRSpace = (const SvxLRSpaceItem&)rSet.Get( nWhich );
SetLeft( rLRSpace.GetLeft() );
SetRight( rLRSpace.GetRight() );
}
else
{
SetLeft( 0 );
SetRight( 0 );
}
nWhich = RES_UL_SPACE;
if ( rSet.GetItemState( nWhich, sal_False ) == SFX_ITEM_SET )
{
// oberen und unteren Rand einstellen
const SvxULSpaceItem& rULSpace = (const SvxULSpaceItem&)rSet.Get( nWhich );
SetTop( rULSpace.GetUpper() );
SetBottom( rULSpace.GetLower() );
}
else
{
SetTop( 0 );
SetBottom( 0 );
}
// Kopfzeilen-Attribute auswerten
const SfxPoolItem* pItem;
if( SFX_ITEM_SET == rSet.GetItemState( pPool->GetWhich( SID_ATTR_PAGE_HEADERSET),
sal_False, &pItem ) )
{
const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet();
const SfxBoolItem& rHeaderOn =
(const SfxBoolItem&)rHeaderSet.Get( pPool->GetWhich( SID_ATTR_PAGE_ON ) );
if ( rHeaderOn.GetValue() )
{
const SvxSizeItem& rSize =
(const SvxSizeItem&)rHeaderSet.Get(pPool->GetWhich(SID_ATTR_PAGE_SIZE));
const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)rHeaderSet.Get(
pPool->GetWhich(SID_ATTR_ULSPACE));
const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)rHeaderSet.Get(
pPool->GetWhich(SID_ATTR_LRSPACE));
SetHdHeight( rSize.GetSize().Height() - rUL.GetLower());
SetHdDist( rUL.GetLower() );
SetHdLeft( rLR.GetLeft() );
SetHdRight( rLR.GetRight() );
SetHeader( sal_True );
if ( rHeaderSet.GetItemState( RES_BACKGROUND ) == SFX_ITEM_SET )
{
const SvxBrushItem& rItem =
(const SvxBrushItem&)rHeaderSet.Get( RES_BACKGROUND );
SetHdColor( rItem.GetColor() );
}
if ( rHeaderSet.GetItemState( RES_BOX ) == SFX_ITEM_SET )
{
const SvxBoxItem& rItem =
(const SvxBoxItem&)rHeaderSet.Get( RES_BOX );
SetHdBorder( rItem );
}
}
else
SetHeader( sal_False );
}
if( SFX_ITEM_SET == rSet.GetItemState( pPool->GetWhich( SID_ATTR_PAGE_FOOTERSET),
sal_False, &pItem ) )
{
const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet();
const SfxBoolItem& rFooterOn =
(const SfxBoolItem&)rFooterSet.Get( SID_ATTR_PAGE_ON );
if ( rFooterOn.GetValue() )
{
const SvxSizeItem& rSize =
(const SvxSizeItem&)rFooterSet.Get( pPool->GetWhich( SID_ATTR_PAGE_SIZE ) );
const SvxULSpaceItem& rUL = (const SvxULSpaceItem&)rFooterSet.Get(
pPool->GetWhich( SID_ATTR_ULSPACE ) );
const SvxLRSpaceItem& rLR = (const SvxLRSpaceItem&)rFooterSet.Get(
pPool->GetWhich( SID_ATTR_LRSPACE ) );
SetFtHeight( rSize.GetSize().Height() - rUL.GetUpper());
SetFtDist( rUL.GetUpper() );
SetFtLeft( rLR.GetLeft() );
SetFtRight( rLR.GetRight() );
SetFooter( sal_True );
if( rFooterSet.GetItemState( RES_BACKGROUND ) == SFX_ITEM_SET )
{
const SvxBrushItem& rItem =
(const SvxBrushItem&)rFooterSet.Get( RES_BACKGROUND );
SetFtColor( rItem.GetColor() );
}
if( rFooterSet.GetItemState( RES_BOX ) == SFX_ITEM_SET )
{
const SvxBoxItem& rItem =
(const SvxBoxItem&)rFooterSet.Get( RES_BOX );
SetFtBorder( rItem );
}
}
else
SetFooter( sal_False );
}
if( SFX_ITEM_SET == rSet.GetItemState( RES_BACKGROUND,
sal_False, &pItem ) )
{
SetColor( ( (const SvxBrushItem*)pItem )->GetColor() );
const Graphic* pGrf = ( (const SvxBrushItem*)pItem )->GetGraphic();
if ( pGrf )
{
Bitmap aBitmap = pGrf->GetBitmap();
SetBitmap( &aBitmap );
}
else
SetBitmap( NULL );
}
Invalidate();
}
/*-----------------------------------------------------------------------
Beschreibung:
-----------------------------------------------------------------------*/
void SwColExample::DrawPage( const Point& rOrg,
const sal_Bool bSecond,
const sal_Bool bEnabled )
{
SwPageExample::DrawPage( rOrg, bSecond, bEnabled );
sal_uInt16 nColumnCount;
if( pColMgr && 0 != (nColumnCount = pColMgr->GetCount()))
{
long nL = GetLeft();
long nR = GetRight();
if ( GetUsage() == SVX_PAGE_MIRROR && !bSecond )
{
// fuer gespiegelt drehen
nL = GetRight();
nR = GetLeft();
}
SetFillColor( Color( COL_LIGHTGRAY ) );
Rectangle aRect;
aRect.Right() = rOrg.X() + GetSize().Width() - nR;
aRect.Left() = rOrg.X() + nL;
aRect.Top() = rOrg.Y() + GetTop()
+ GetHdHeight() + GetHdDist();
aRect.Bottom()= rOrg.Y() + GetSize().Height() - GetBottom()
- GetFtHeight() - GetFtDist();
DrawRect(aRect);
if(GetColor() == Color(COL_TRANSPARENT))
{
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
const Color& rFieldColor = rStyleSettings.GetFieldColor();
SetFillColor( rFieldColor );
}
else
SetFillColor( GetColor() );
// #97495# make sure that the automatic column widht's are always equal
sal_Bool bAutoWidth = pColMgr->IsAutoWidth();
sal_Int32 nAutoColWidth = 0;
if(bAutoWidth)
{
sal_Int32 nColumnWidthSum = 0;
sal_uInt16 i;
for(i = 0; i < nColumnCount; ++i)
nColumnWidthSum += pColMgr->GetColWidth( i );
nAutoColWidth = nColumnWidthSum / nColumnCount;
}
sal_uInt16 i;
for( i = 0; i < nColumnCount; i++)
{
if(!bAutoWidth)
nAutoColWidth = pColMgr->GetColWidth( i );
aRect.Right() = aRect.Left() + nAutoColWidth;
DrawRect(aRect);
if(i < nColumnCount - 1)
aRect.Left() = aRect.Right() + pColMgr->GetGutterWidth(i);
}
if(pColMgr->HasLine())
{
Point aUp( rOrg.X() + nL, rOrg.Y() + GetTop() );
Point aDown( rOrg.X() + nL, rOrg.Y() + GetSize().Height()
- GetBottom() - GetFtHeight() - GetFtDist() );
if( pColMgr->GetLineHeightPercent() != 100 )
{
long nLength = aDown.Y() - aUp.Y();
nLength -= nLength * pColMgr->GetLineHeightPercent() / 100;
switch(pColMgr->GetAdjust())
{
case COLADJ_BOTTOM: aUp.Y() += nLength; break;
case COLADJ_TOP: aDown.Y() -= nLength; break;
case COLADJ_CENTER:
aUp.Y() += nLength / 2;
aDown.Y() -= nLength / 2;
break;
default:; // prevent warning
}
}
int nDist;
for( i = 0; i < nColumnCount - 1; i++)
{
int nGutter = pColMgr->GetGutterWidth(i);
nDist = pColMgr->GetColWidth( i ) + nGutter;
nDist -= (i == 0) ?
nGutter/2 :
0;
aUp.X() += nDist;
aDown.X() += nDist;
DrawLine( aUp, aDown );
}
}
}
}
/*-----------------25.10.96 09.15-------------------
--------------------------------------------------*/
SwColumnOnlyExample::SwColumnOnlyExample( Window* pParent, const ResId& rResId) :
Window(pParent, rResId),
m_aFrmSize(1,1)
{
SetMapMode( MapMode( MAP_TWIP ) );
m_aWinSize = GetOutputSizePixel();
m_aWinSize.Height() -= 4;
m_aWinSize.Width() -= 4;
m_aWinSize = PixelToLogic( m_aWinSize );
SetBorderStyle( WINDOW_BORDER_MONO );
m_aFrmSize = SvxPaperInfo::GetPaperSize(PAPER_A4);// DIN A4
::FitToActualSize(m_aCols, (sal_uInt16)m_aFrmSize.Width());
long nHeight = m_aFrmSize.Height();
Fraction aScale( m_aWinSize.Height(), nHeight );
MapMode aMapMode( GetMapMode() );
aMapMode.SetScaleX( aScale );
aMapMode.SetScaleY( aScale );
SetMapMode( aMapMode );
}
/*-----------------25.10.96 09.16-------------------
--------------------------------------------------*/
void SwColumnOnlyExample::Paint( const Rectangle& /*rRect*/ )
{
const StyleSettings& rStyleSettings = GetSettings().GetStyleSettings();
const Color& rFieldColor = rStyleSettings.GetFieldColor();
const Color& rDlgColor = rStyleSettings.GetDialogColor();
const Color& rFieldTextColor = SwViewOption::GetFontColor();
Color aGrayColor(COL_LIGHTGRAY);
if(rFieldColor == aGrayColor)
aGrayColor.Invert();
Size aLogSize(PixelToLogic(GetOutputSizePixel()));
Rectangle aCompleteRect(Point(0,0), aLogSize);
SetLineColor(rDlgColor);
SetFillColor(rDlgColor);
DrawRect(aCompleteRect);
SetLineColor( rFieldTextColor );
Point aTL( (aLogSize.Width() - m_aFrmSize.Width()) / 2,
(aLogSize.Height() - m_aFrmSize.Height()) / 2);
Rectangle aRect(aTL, m_aFrmSize);
//draw a shadow rectangle
SetFillColor( Color(COL_GRAY) );
Rectangle aShadowRect(aRect);
aShadowRect.Move(aTL.Y(), aTL.Y());
DrawRect(aShadowRect);
SetFillColor( rFieldColor );
DrawRect(aRect);
SetFillColor( aGrayColor );
//Spaltentrenner?
long nLength = aLogSize.Height() - 2 * aTL.Y();
Point aUp( aTL );
Point aDown( aTL.X(), nLength );
sal_Bool bLines = sal_False;
if(m_aCols.GetLineAdj() != COLADJ_NONE)
{
bLines = sal_True;
sal_uInt16 nPercent = m_aCols.GetLineHeight();
if( nPercent != 100 )
{
nLength -= nLength * nPercent / 100;
switch(m_aCols.GetLineAdj())
{
case COLADJ_BOTTOM: aUp.Y() += nLength; break;
case COLADJ_TOP: aDown.Y() -= nLength; break;
case COLADJ_CENTER:
aUp.Y() += nLength / 2;
aDown.Y() -= nLength / 2;
break;
default:; //prevent warning
}
}
}
const SwColumns& rCols = m_aCols.GetColumns();
sal_uInt16 nColCount = rCols.Count();
if( nColCount )
{
DrawRect(aRect);
SetFillColor( rFieldColor );
Rectangle aFrmRect(aTL, m_aFrmSize);
long nSum = aTL.X();
for(sal_uInt16 i = 0; i < nColCount; i++)
{
SwColumn* pCol = rCols[i];
aFrmRect.Left() = nSum + pCol->GetLeft();//nSum + pCol->GetLeft() + aTL.X();
nSum += pCol->GetWishWidth();
aFrmRect.Right() = nSum - pCol->GetRight();
DrawRect(aFrmRect);
}
if(bLines )
{
nSum = aTL.X();
for(sal_uInt16 i = 0; i < nColCount - 1; i++)
{
nSum += rCols[i]->GetWishWidth();
aUp.X() = nSum;
aDown.X() = nSum;
DrawLine(aUp, aDown);
}
}
}
}
/*-----------------25.10.96 12.05-------------------
--------------------------------------------------*/
void SwColumnOnlyExample::SetColumns(const SwFmtCol& rCol)
{
m_aCols = rCol;
sal_uInt16 nWishSum = m_aCols.GetWishWidth();
long nFrmWidth = m_aFrmSize.Width();
SwColumns& rCols = m_aCols.GetColumns();
sal_uInt16 nColCount = rCols.Count();
for(sal_uInt16 i = 0; i < nColCount; i++)
{
SwColumn* pCol = rCols[i];
long nWish = pCol->GetWishWidth();
nWish *= nFrmWidth;
nWish /= nWishSum;
pCol->SetWishWidth((sal_uInt16)nWish);
long nLeft = pCol->GetLeft();
nLeft *= nFrmWidth;
nLeft /= nWishSum;
pCol->SetLeft((sal_uInt16)nLeft);
long nRight = pCol->GetRight();
nRight *= nFrmWidth;
nRight /= nWishSum;
pCol->SetRight((sal_uInt16)nRight);
}
// #97495# make sure that the automatic column width's are always equal
if(nColCount && m_aCols.IsOrtho())
{
sal_Int32 nColumnWidthSum = 0;
sal_uInt16 i;
for(i = 0; i < nColCount; ++i)
{
SwColumn* pCol = rCols[i];
nColumnWidthSum += pCol->GetWishWidth();
nColumnWidthSum -= (pCol->GetRight() + pCol->GetLeft());
}
nColumnWidthSum /= nColCount;
for(i = 0; i < nColCount; ++i)
{
SwColumn* pCol = rCols[i];
pCol->SetWishWidth( static_cast< sal_uInt16 >(nColumnWidthSum + pCol->GetRight() + pCol->GetLeft()));
}
}
}
/* -----------------------------08.02.2002 11:44------------------------------
---------------------------------------------------------------------------*/
SwPageGridExample::~SwPageGridExample()
{
delete pGridItem;
}
/* -----------------------------08.02.2002 11:48------------------------------
---------------------------------------------------------------------------*/
#define MAX_ROWS 10
#define MAX_LINES 15
void SwPageGridExample::DrawPage( const Point& rOrg,
const sal_Bool bSecond,
const sal_Bool bEnabled )
{
SwPageExample::DrawPage(rOrg, bSecond, bEnabled);
if(pGridItem && pGridItem->GetGridType())
{
//paint the grid now
Color aLineColor = pGridItem->GetColor();
if(aLineColor.GetColor() == COL_AUTO)
{
aLineColor = GetFillColor();
aLineColor.Invert();
}
SetLineColor(aLineColor);
long nL = GetLeft();
long nR = GetRight();
if ( GetUsage() == SVX_PAGE_MIRROR && !bSecond )
{
// fuer gespiegelt drehen
nL = GetRight();
nR = GetLeft();
}
Rectangle aRect;
aRect.Right() = rOrg.X() + GetSize().Width() - nR;
aRect.Left() = rOrg.X() + nL;
aRect.Top() = rOrg.Y() + GetTop()
+ GetHdHeight() + GetHdDist();
aRect.Bottom()= rOrg.Y() + GetSize().Height() - GetBottom()
- GetFtHeight() - GetFtDist();
//increase the values to get a 'viewable' preview
sal_Int32 nBaseHeight = pGridItem->GetBaseHeight() * 3;
sal_Int32 nRubyHeight = pGridItem->GetRubyHeight() * 3;
//detect height of rectangles
Rectangle aRubyRect(aRect.TopLeft(),
m_bVertical ?
Size(nRubyHeight, aRect.GetHeight()) :
Size(aRect.GetWidth(), nRubyHeight));
Rectangle aCharRect(aRect.TopLeft(),
m_bVertical ?
Size(nBaseHeight, aRect.GetHeight()) :
Size(aRect.GetWidth(), nBaseHeight));
sal_Int32 nLineHeight = nBaseHeight + nRubyHeight;
//detect count of rectangles
sal_Int32 nLines = (m_bVertical ? aRect.GetWidth(): aRect.GetHeight()) / nLineHeight;
if(nLines > pGridItem->GetLines())
nLines = pGridItem->GetLines();
// determine start position
if(m_bVertical)
{
sal_Int16 nXStart = static_cast< sal_Int16 >(aRect.GetWidth() / 2 - nLineHeight * nLines /2);
aRubyRect.Move(nXStart, 0);
aCharRect.Move(nXStart, 0);
}
else
{
sal_Int16 nYStart = static_cast< sal_Int16 >(aRect.GetHeight() / 2 - nLineHeight * nLines /2);
aRubyRect.Move(0, nYStart);
aCharRect.Move(0, nYStart);
}
if(pGridItem->IsRubyTextBelow())
m_bVertical ? aRubyRect.Move(nBaseHeight, 0) : aRubyRect.Move(0, nBaseHeight);
else
m_bVertical ? aCharRect.Move(nRubyHeight, 0) : aCharRect.Move(0, nRubyHeight);
//vertical lines
sal_Bool bBothLines = pGridItem->GetGridType() == GRID_LINES_CHARS;
SetFillColor( Color( COL_TRANSPARENT ) );
sal_Int32 nXMove = m_bVertical ? nLineHeight : 0;
sal_Int32 nYMove = m_bVertical ? 0 : nLineHeight;
for(sal_Int32 nLine = 0; nLine < nLines; nLine++)
{
DrawRect(aRubyRect);
DrawRect(aCharRect);
if(bBothLines)
{
Point aStart = aCharRect.TopLeft();
Point aEnd = m_bVertical ? aCharRect.TopRight() : aCharRect.BottomLeft();
while(m_bVertical ? aStart.Y() < aRect.Bottom(): aStart.X() < aRect.Right())
{
DrawLine(aStart, aEnd);
if(m_bVertical)
aStart.Y() = aEnd.Y() += nBaseHeight;
else
aStart.X() = aEnd.X() += nBaseHeight;
}
}
aRubyRect.Move(nXMove, nYMove);
aCharRect.Move(nXMove, nYMove);
}
}
}
/* -----------------------------08.02.2002 11:48------------------------------
---------------------------------------------------------------------------*/
void SwPageGridExample::UpdateExample( const SfxItemSet& rSet )
{
DELETEZ(pGridItem);
//get the grid information
if(SFX_ITEM_AVAILABLE <= rSet.GetItemState(RES_TEXTGRID, sal_True))
pGridItem = (SwTextGridItem*)((const SwTextGridItem&)rSet.Get(RES_TEXTGRID)).Clone();
if( SFX_ITEM_AVAILABLE <= rSet.GetItemState( RES_FRAMEDIR, sal_True ))
{
const SvxFrameDirectionItem& rDirItem =
(const SvxFrameDirectionItem&)rSet.Get(RES_FRAMEDIR);
m_bVertical = rDirItem.GetValue() == FRMDIR_VERT_TOP_RIGHT||
rDirItem.GetValue() == FRMDIR_VERT_TOP_LEFT;
}
SwPageExample::UpdateExample(rSet);
}