diff options
Diffstat (limited to 'sw/source/ui/misc/pgfnote.cxx')
-rw-r--r-- | sw/source/ui/misc/pgfnote.cxx | 348 |
1 files changed, 348 insertions, 0 deletions
diff --git a/sw/source/ui/misc/pgfnote.cxx b/sw/source/ui/misc/pgfnote.cxx new file mode 100644 index 000000000000..018047d651fc --- /dev/null +++ b/sw/source/ui/misc/pgfnote.cxx @@ -0,0 +1,348 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_sw.hxx" + +#ifdef SW_DLLIMPLEMENTATION +#undef SW_DLLIMPLEMENTATION +#endif + + + +#include <cmdid.h> +#include <hintids.hxx> +#include <tools/ref.hxx> +#include <svx/dialogs.hrc> +#include <sal/macros.h> +#include <vcl/field.hxx> +#include <vcl/svapp.hxx> +#include <unotools/localedatawrapper.hxx> +#include <unotools/syslocale.hxx> +#include <editeng/sizeitem.hxx> +#include <svx/pageitem.hxx> +#include <svl/eitem.hxx> +#include <editeng/ulspitem.hxx> +#include <uitool.hxx> +#include <pagedesc.hxx> +#include <pgfnote.hxx> +#include <uiitems.hxx> + +#include <globals.hrc> +#include <misc.hrc> +#include <pgfnote.hrc> + +#define TWIP_TO_LBOX 5 + +/*-----------------------------------------------------#--------------- + Beschreibung: vordefinierte Linien in Point + --------------------------------------------------------------------*/ +static const USHORT __FAR_DATA nLines[] = { + 0, + 50, + 100, + 150, + 200, + 500 +}; + +static const USHORT nLineCount = SAL_N_ELEMENTS(nLines); + +static USHORT __FAR_DATA aPageRg[] = { + FN_PARAM_FTN_INFO, FN_PARAM_FTN_INFO, + 0 +}; + +/*------------------------------------------------------------------------ + Beschreibung: liefert zurueck, ob die Linienbreite nWidth bereits + in der Listbox enthalten ist. +------------------------------------------------------------------------*/ +BOOL lcl_HasLineWidth(USHORT nWidth) +{ + for(USHORT i = 0; i < nLineCount; ++i) { + if(nLines[i] == nWidth) + return TRUE; + } + return FALSE; +} + +/*------------------------------------------------------------------------ + Beschreibung: Handler fuer umschalten zwischen den unterschiedlichen + Arten, wie die Hoehe des Fussnotenbereiches angegeben + werden kann. +------------------------------------------------------------------------*/ +IMPL_LINK_INLINE_START( SwFootNotePage, HeightPage, Button *, EMPTYARG ) +{ + aMaxHeightEdit.Enable(FALSE); + return 0; +} +IMPL_LINK_INLINE_END( SwFootNotePage, HeightPage, Button *, EMPTYARG ) + + +IMPL_LINK_INLINE_START( SwFootNotePage, HeightMetric, Button *, EMPTYARG ) +{ + aMaxHeightEdit.Enable(); + aMaxHeightEdit.GrabFocus(); + return 0; +} +IMPL_LINK_INLINE_END( SwFootNotePage, HeightMetric, Button *, EMPTYARG ) + +/*------------------------------------------------------------------------ + Beschreibung: Handler Grenzwerte +------------------------------------------------------------------------*/ +IMPL_LINK( SwFootNotePage, HeightModify, MetricField *, EMPTYARG ) +{ + aMaxHeightEdit.SetMax(aMaxHeightEdit.Normalize(lMaxHeight - + (aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)) + + aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))), + FUNIT_TWIP); + if(aMaxHeightEdit.GetValue() < 0) + aMaxHeightEdit.SetValue(0); + aDistEdit.SetMax(aDistEdit.Normalize(lMaxHeight - + (aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)) + + aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))), + FUNIT_TWIP); + if(aDistEdit.GetValue() < 0) + aDistEdit.SetValue(0); + aLineDistEdit.SetMax(aLineDistEdit.Normalize(lMaxHeight - + (aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)) + + aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)))), + FUNIT_TWIP); + return 0; +} + +// CTOR / DTOR ----------------------------------------------------------- + +SwFootNotePage::SwFootNotePage(Window *pParent, const SfxItemSet &rSet) : + + SfxTabPage(pParent, SW_RES(TP_FOOTNOTE_PAGE), rSet), + + aMaxHeightPageBtn(this, SW_RES(RB_MAXHEIGHT_PAGE)), + aMaxHeightBtn(this, SW_RES(RB_MAXHEIGHT)), + aMaxHeightEdit(this, SW_RES(ED_MAXHEIGHT)), + aDistLbl(this, SW_RES(FT_DIST)), + aDistEdit(this, SW_RES(ED_DIST)), + aPosHeader(this, SW_RES(FL_FOOTNOTE_SIZE)), + + aLinePosLbl(this, SW_RES(FT_LINEPOS)), + aLinePosBox(this, SW_RES(DLB_LINEPOS)), + aLineTypeLbl(this, SW_RES(FT_LINETYPE)), + aLineTypeBox(this, SW_RES(DLB_LINETYPE)), + aLineWidthLbl(this, SW_RES(FT_LINEWIDTH)), + aLineWidthEdit(this, SW_RES(ED_LINEWIDTH)), + aLineDistLbl(this, SW_RES(FT_LINEDIST)), + aLineDistEdit(this, SW_RES(ED_LINEDIST)), + aLineHeader(this, SW_RES(FL_LINE)) +{ + FreeResource(); + + SetExchangeSupport(); + FieldUnit aMetric = ::GetDfltMetric(FALSE); + SetMetric( aMaxHeightEdit, aMetric ); + SetMetric( aDistEdit, aMetric ); + SetMetric( aLineDistEdit, aMetric ); + MeasurementSystem eSys = SvtSysLocale().GetLocaleData().getMeasurementSystemEnum(); + long nHeightValue = MEASURE_METRIC != eSys ? 1440 : 1134; + aMaxHeightEdit.SetValue(aMaxHeightEdit.Normalize(nHeightValue),FUNIT_TWIP);; +} + +SwFootNotePage::~SwFootNotePage() +{ +} + +SfxTabPage* SwFootNotePage::Create(Window *pParent, const SfxItemSet &rSet) +{ + return new SwFootNotePage(pParent, rSet); +} + +void SwFootNotePage::Reset(const SfxItemSet &rSet) +{ + // Falls noch kein Bsp vorhanden Init hier sonst im Activate + // + SwPageFtnInfo* pDefFtnInfo = 0; + const SwPageFtnInfo* pFtnInfo; + const SfxPoolItem* pItem = SfxTabPage::GetItem(rSet, FN_PARAM_FTN_INFO); + if( pItem ) + { + pFtnInfo = &((const SwPageFtnInfoItem*)pItem)->GetPageFtnInfo(); + } + else + { + // wenn "Standard" betaetigt wird, wird das Fussnotenitem geloescht, + // deswegen muss hier eine Fussnotenstruktur erzeugt werden + pDefFtnInfo = new SwPageFtnInfo(); + pFtnInfo = pDefFtnInfo; + } + // Hoehe Fussnotenbereich + SwTwips lHeight = pFtnInfo->GetHeight(); + if(lHeight) + { + aMaxHeightEdit.SetValue(aMaxHeightEdit.Normalize(lHeight),FUNIT_TWIP); + aMaxHeightBtn.Check(TRUE); + } + else + { + aMaxHeightPageBtn.Check(TRUE); + aMaxHeightEdit.Enable(FALSE); + } + aMaxHeightPageBtn.SetClickHdl(LINK(this,SwFootNotePage,HeightPage)); + aMaxHeightBtn.SetClickHdl(LINK(this,SwFootNotePage,HeightMetric)); + Link aLk = LINK(this, SwFootNotePage, HeightModify); + aMaxHeightEdit.SetLoseFocusHdl( aLk ); + aDistEdit.SetLoseFocusHdl( aLk ); + aLineDistEdit.SetLoseFocusHdl( aLk ); + + // Trennlinie + for(USHORT i = 0; i < nLineCount; ++i) + aLineTypeBox.InsertEntry(nLines[i]); + + const USHORT nWidth = (USHORT)pFtnInfo->GetLineWidth() * TWIP_TO_LBOX; + if ( !lcl_HasLineWidth(nWidth) ) + aLineTypeBox.InsertEntry(nWidth); + aLineTypeBox.SelectEntry(nWidth); + + // Position + aLinePosBox.SelectEntryPos( static_cast< USHORT >(pFtnInfo->GetAdj()) ); + + // Breite + Fraction aTmp( 100, 1 ); + aTmp *= pFtnInfo->GetWidth(); + aLineWidthEdit.SetValue( static_cast<long>(aTmp) ); + + // Abstand Fussnotenbereich + aDistEdit.SetValue(aDistEdit.Normalize(pFtnInfo->GetTopDist()),FUNIT_TWIP); + aLineDistEdit.SetValue( + aLineDistEdit.Normalize(pFtnInfo->GetBottomDist()), FUNIT_TWIP); + ActivatePage( rSet ); + delete pDefFtnInfo; +} + +/*-------------------------------------------------------------------- + Beschreibung: Attribute in den Set stopfen bei OK + --------------------------------------------------------------------*/ +BOOL SwFootNotePage::FillItemSet(SfxItemSet &rSet) +{ + SwPageFtnInfoItem aItem((const SwPageFtnInfoItem&)GetItemSet().Get(FN_PARAM_FTN_INFO)); + + // Das ist das Original + SwPageFtnInfo &rFtnInfo = aItem.GetPageFtnInfo(); + + // Hoehe Fussnotenbereich + if(aMaxHeightBtn.IsChecked()) + rFtnInfo.SetHeight( static_cast< SwTwips >( + aMaxHeightEdit.Denormalize(aMaxHeightEdit.GetValue(FUNIT_TWIP)))); + else + rFtnInfo.SetHeight(0); + + // Abstand Fussnotenbereich + rFtnInfo.SetTopDist( static_cast< SwTwips >( + aDistEdit.Denormalize(aDistEdit.GetValue(FUNIT_TWIP)))); + rFtnInfo.SetBottomDist( static_cast< SwTwips >( + aLineDistEdit.Denormalize(aLineDistEdit.GetValue(FUNIT_TWIP)))); + + // Trennlinie + const USHORT nPos = aLineTypeBox.GetSelectEntryPos(); + if( LISTBOX_ENTRY_NOTFOUND != nPos ) + rFtnInfo.SetLineWidth(nLines[nPos] / TWIP_TO_LBOX); + + // Position + rFtnInfo.SetAdj((SwFtnAdj)aLinePosBox.GetSelectEntryPos()); + + // Breite + rFtnInfo.SetWidth(Fraction( static_cast< long >(aLineWidthEdit.GetValue()), 100)); + + const SfxPoolItem* pOldItem; + if(0 == (pOldItem = GetOldItem( rSet, FN_PARAM_FTN_INFO )) || + aItem != *pOldItem ) + rSet.Put(aItem); + + return TRUE; +} + +void SwFootNotePage::ActivatePage(const SfxItemSet& rSet) +{ + const SvxSizeItem& rSize = (const SvxSizeItem&)rSet.Get( RES_FRM_SIZE ); + lMaxHeight = rSize.GetSize().Height(); + + const SfxPoolItem* pItem; + if( SFX_ITEM_SET == rSet.GetItemState( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_HEADERSET), FALSE, &pItem ) ) + { + const SfxItemSet& rHeaderSet = ((SvxSetItem*)pItem)->GetItemSet(); + const SfxBoolItem& rHeaderOn = + (const SfxBoolItem&)rHeaderSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_ON ) ); + + if ( rHeaderOn.GetValue() ) + { + const SvxSizeItem& rSizeItem = + (const SvxSizeItem&)rHeaderSet.Get(rSet.GetPool()->GetWhich(SID_ATTR_PAGE_SIZE)); + lMaxHeight -= rSizeItem.GetSize().Height(); + } + } + + if( SFX_ITEM_SET == rSet.GetItemState( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_FOOTERSET), + FALSE, &pItem ) ) + { + const SfxItemSet& rFooterSet = ((SvxSetItem*)pItem)->GetItemSet(); + const SfxBoolItem& rFooterOn = + (const SfxBoolItem&)rFooterSet.Get( SID_ATTR_PAGE_ON ); + + if ( rFooterOn.GetValue() ) + { + const SvxSizeItem& rSizeItem = + (const SvxSizeItem&)rFooterSet.Get( rSet.GetPool()->GetWhich( SID_ATTR_PAGE_SIZE ) ); + lMaxHeight -= rSizeItem.GetSize().Height(); + } + } + + if ( rSet.GetItemState( RES_UL_SPACE , FALSE ) == SFX_ITEM_SET ) + { + const SvxULSpaceItem &rUL = (const SvxULSpaceItem&)rSet.Get( RES_UL_SPACE ); + lMaxHeight -= rUL.GetUpper() + rUL.GetLower(); + } + + lMaxHeight *= 8; + lMaxHeight /= 10; + + // Maximalwerte setzen + HeightModify(0); +} + +int SwFootNotePage::DeactivatePage( SfxItemSet* _pSet) +{ + if(_pSet) + FillItemSet(*_pSet); + + return TRUE; +} + +USHORT* SwFootNotePage::GetRanges() +{ + return aPageRg; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |