/************************************************************** * * 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" #ifdef SW_DLLIMPLEMENTATION #undef SW_DLLIMPLEMENTATION #endif #include #include #define _SVSTDARR_LONGSSORT #define _SVSTDARR_LONGS #include #include #ifndef _SVX_TSTPITEM_HXX //autogen #include #endif #include #include #ifndef _MSGBOX_HXX //autogen #include #endif #ifndef _MENU_HXX //autogen #include #endif #ifndef _CMDID_H #include #endif #include #include #include #ifndef _VIEW_HXX #include #endif #ifndef _BASESH_HXX #include #endif #include #include #include #ifndef _PARDLG_HXX #include "swuipardlg.hxx" #endif #include #include #include #include #ifndef _ENVFMT_HRC #include #endif #include "swabstdlg.hxx" #include "chrdlg.hrc" namespace swui { SwAbstractDialogFactory * GetFactory(); } static PopupMenu *pMenu; static long lUserW = 5669; // 10 cm static long lUserH = 5669; // 10 cm // -------------------------------------------------------------------------- SwEnvFmtPage::SwEnvFmtPage(Window* pParent, const SfxItemSet& rSet) : SfxTabPage(pParent, SW_RES(TP_ENV_FMT), rSet), aAddrFL (this, SW_RES( FL_ADDRESSEE )), aAddrPosInfo (this, SW_RES( TXT_ADDR_POS )), aAddrLeftText (this, SW_RES( TXT_ADDR_LEFT )), aAddrLeftField (this, SW_RES( FLD_ADDR_LEFT )), aAddrTopText (this, SW_RES( TXT_ADDR_TOP )), aAddrTopField (this, SW_RES( FLD_ADDR_TOP )), aAddrFormatInfo (this, SW_RES( TXT_ADDR_FORMAT )), aAddrEditButton (this, SW_RES( BTN_ADDR_EDIT )), aSendFL (this, SW_RES( FL_SENDER )), aSendPosInfo (this, SW_RES( TXT_SEND_POS )), aSendLeftText (this, SW_RES( TXT_SEND_LEFT )), aSendLeftField (this, SW_RES( FLD_SEND_LEFT )), aSendTopText (this, SW_RES( TXT_SEND_TOP )), aSendTopField (this, SW_RES( FLD_SEND_TOP )), aSendFormatInfo (this, SW_RES( TXT_SEND_FORMAT )), aSendEditButton (this, SW_RES( BTN_SEND_EDIT )), aSizeFL (this, SW_RES( FL_SIZE )), aSizeFormatText (this, SW_RES( TXT_SIZE_FORMAT )), aSizeFormatBox (this, SW_RES( BOX_SIZE_FORMAT )), aSizeWidthText (this, SW_RES( TXT_SIZE_WIDTH )), aSizeWidthField (this, SW_RES( FLD_SIZE_WIDTH )), aSizeHeightText (this, SW_RES( TXT_SIZE_HEIGHT )), aSizeHeightField (this, SW_RES( FLD_SIZE_HEIGHT )), aPreview (this, SW_RES( WIN_PREVIEW )) { FreeResource(); SetExchangeSupport(); // Metriken FieldUnit aMetric = ::GetDfltMetric(sal_False); SetMetric(aAddrLeftField, aMetric); SetMetric(aAddrTopField, aMetric); SetMetric(aSendLeftField, aMetric); SetMetric(aSendTopField, aMetric); SetMetric(aSizeWidthField, aMetric); SetMetric(aSizeHeightField, aMetric); // Menues einhaengen ::pMenu = new PopupMenu(SW_RES(MNU_EDIT)); aAddrEditButton.SetPopupMenu(::pMenu); aSendEditButton.SetPopupMenu(::pMenu); // Handler installieren Link aLk = LINK(this, SwEnvFmtPage, ModifyHdl); aAddrLeftField .SetUpHdl( aLk ); aAddrTopField .SetUpHdl( aLk ); aSendLeftField .SetUpHdl( aLk ); aSendTopField .SetUpHdl( aLk ); aSizeWidthField .SetUpHdl( aLk ); aSizeHeightField.SetUpHdl( aLk ); aAddrLeftField .SetDownHdl( aLk ); aAddrTopField .SetDownHdl( aLk ); aSendLeftField .SetDownHdl( aLk ); aSendTopField .SetDownHdl( aLk ); aSizeWidthField .SetDownHdl( aLk ); aSizeHeightField.SetDownHdl( aLk ); aAddrLeftField .SetLoseFocusHdl( aLk ); aAddrTopField .SetLoseFocusHdl( aLk ); aSendLeftField .SetLoseFocusHdl( aLk ); aSendTopField .SetLoseFocusHdl( aLk ); aSizeWidthField .SetLoseFocusHdl( aLk ); aSizeHeightField.SetLoseFocusHdl( aLk ); aLk = LINK(this, SwEnvFmtPage, EditHdl ); aAddrEditButton.SetSelectHdl( aLk ); aSendEditButton.SetSelectHdl( aLk ); aPreview.SetBorderStyle( WINDOW_BORDER_MONO ); aSizeFormatBox .SetSelectHdl(LINK(this, SwEnvFmtPage, FormatHdl)); // aSizeFormatBox for (sal_uInt16 i = PAPER_A3; i <= PAPER_KAI32BIG; i++) { if (i != PAPER_USER) { String aPaperName = SvxPaperInfo::GetName((Paper) i), aEntryName; sal_uInt16 nPos = 0; sal_Bool bFound = sal_False; while (nPos < aSizeFormatBox.GetEntryCount() && !bFound) { aEntryName = aSizeFormatBox.GetEntry(i); if (aEntryName < aPaperName) nPos++; else bFound = sal_True; } aSizeFormatBox.InsertEntry(aPaperName, nPos); aIDs.Insert((sal_uInt16) i, nPos); } } aSizeFormatBox.InsertEntry(SvxPaperInfo::GetName(PAPER_USER)); aIDs.Insert((sal_uInt16) PAPER_USER, aIDs.Count()); } // -------------------------------------------------------------------------- __EXPORT SwEnvFmtPage::~SwEnvFmtPage() { aAddrEditButton.SetPopupMenu(0); aSendEditButton.SetPopupMenu(0); delete ::pMenu; } // -------------------------------------------------------------------------- IMPL_LINK_INLINE_START( SwEnvFmtPage, ModifyHdl, Edit *, pEdit ) { long lWVal = static_cast< long >(GetFldVal(aSizeWidthField )); long lHVal = static_cast< long >(GetFldVal(aSizeHeightField)); long lWidth = Max(lWVal, lHVal); long lHeight = Min(lWVal, lHVal); if (pEdit == &aSizeWidthField || pEdit == &aSizeHeightField) { Paper ePaper = SvxPaperInfo::GetSvxPaper( Size(lHeight, lWidth), MAP_TWIP, sal_True); for (sal_uInt16 i = 0; i < aIDs.Count(); i++) if (aIDs[i] == (sal_uInt16)ePaper) aSizeFormatBox.SelectEntryPos(i); // Benutzergroesse merken if (aIDs[aSizeFormatBox.GetSelectEntryPos()] == (sal_uInt16)PAPER_USER) { lUserW = lWidth ; lUserH = lHeight; } aSizeFormatBox.GetSelectHdl().Call(&aSizeFormatBox); } else { FillItem(GetParent()->aEnvItem); SetMinMax(); aPreview.Invalidate(); } return 0; } IMPL_LINK_INLINE_END( SwEnvFmtPage, ModifyHdl, Edit *, pEdit ) // -------------------------------------------------------------------------- IMPL_LINK( SwEnvFmtPage, EditHdl, MenuButton *, pButton ) { SwWrtShell* pSh = GetParent()->pSh; ASSERT(pSh, "Shell fehlt"); // Collection-Ptr ermitteln sal_Bool bSender = pButton != &aAddrEditButton; SwTxtFmtColl* pColl = pSh->GetTxtCollFromPool( static_cast< sal_uInt16 >( bSender ? RES_POOLCOLL_SENDADRESS : RES_POOLCOLL_JAKETADRESS)); ASSERT(pColl, "Text-Collection fehlt"); switch (pButton->GetCurItemId()) { case MID_CHAR: { SfxItemSet *pCollSet = GetCollItemSet(pColl, bSender); // Damit die Hintergrundfarbe nicht uebergebuegelt wird: SfxAllItemSet aTmpSet(*pCollSet); // Das CHRATR_BACKGROUND-Attribut wird fuer den Dialog in // ein RES_BACKGROUND verwandelt und wieder zurueck ... const SfxPoolItem *pTmpBrush; if( SFX_ITEM_SET == aTmpSet.GetItemState( RES_CHRATR_BACKGROUND, sal_True, &pTmpBrush ) ) { SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) ); aTmpBrush.SetWhich( RES_BACKGROUND ); aTmpSet.Put( aTmpBrush ); } else aTmpSet.ClearItem( RES_BACKGROUND ); SwAbstractDialogFactory* pFact = swui::GetFactory(); DBG_ASSERT(pFact, "SwAbstractDialogFactory fail!"); SfxAbstractTabDialog* pDlg = pFact->CreateSwCharDlg( GetParent(), pSh->GetView(), aTmpSet, DLG_CHAR ,&pColl->GetName() ); DBG_ASSERT(pDlg, "Dialogdiet fail!"); if (pDlg->Execute() == RET_OK) { SfxItemSet aOutputSet( *pDlg->GetOutputItemSet() ); if( SFX_ITEM_SET == aOutputSet.GetItemState( RES_BACKGROUND, sal_False, &pTmpBrush ) ) { SvxBrushItem aTmpBrush( *((SvxBrushItem*)pTmpBrush) ); aTmpBrush.SetWhich( RES_CHRATR_BACKGROUND ); pCollSet->Put( aTmpBrush ); } aOutputSet.ClearItem( RES_BACKGROUND ); pCollSet->Put(aOutputSet); } delete pDlg; } break; case MID_PARA: { SfxItemSet *pCollSet = GetCollItemSet(pColl, bSender); // Damit die Tabulatoren nicht uebergebuegelt werden: SfxAllItemSet aTmpSet(*pCollSet); // Tabulatoren, DefaultTabs ins ItemSet Stecken const SvxTabStopItem& rDefTabs = (const SvxTabStopItem&) pSh->GetView().GetCurShell()->GetPool().GetDefaultItem(RES_PARATR_TABSTOP); sal_uInt16 nDefDist = ::GetTabDist( rDefTabs ); SfxUInt16Item aDefDistItem( SID_ATTR_TABSTOP_DEFAULTS, nDefDist ); aTmpSet.Put( aDefDistItem ); // Aktueller Tab SfxUInt16Item aTabPos( SID_ATTR_TABSTOP_POS, 0 ); aTmpSet.Put( aTabPos ); // linker Rand als Offset const long nOff = ((SvxLRSpaceItem&)aTmpSet.Get( RES_LR_SPACE )). GetTxtLeft(); SfxInt32Item aOff( SID_ATTR_TABSTOP_OFFSET, nOff ); aTmpSet.Put( aOff ); // BoxInfo setzen ::PrepareBoxInfo( aTmpSet, *pSh ); SwParaDlg *pDlg = new SwParaDlg(GetParent(), pSh->GetView(), aTmpSet, DLG_ENVELOP, &pColl->GetName()); if ( pDlg->Execute() == RET_OK ) { // Defaults evtl umsetzen const SfxPoolItem* pItem = 0; SfxItemSet* pOutputSet = (SfxItemSet*)pDlg->GetOutputItemSet(); sal_uInt16 nNewDist; if( SFX_ITEM_SET == pOutputSet->GetItemState( SID_ATTR_TABSTOP_DEFAULTS, sal_False, &pItem ) && nDefDist != (nNewDist = ((SfxUInt16Item*)pItem)->GetValue()) ) { SvxTabStopItem aDefTabs( 0, 0, SVX_TAB_ADJUST_DEFAULT, RES_PARATR_TABSTOP ); MakeDefTabs( nNewDist, aDefTabs ); pSh->SetDefault( aDefTabs ); pOutputSet->ClearItem( SID_ATTR_TABSTOP_DEFAULTS ); } if( pOutputSet->Count() ) { pCollSet->Put(*pOutputSet); } } delete pDlg; } break; } return 0; } /*------------------------------------------------------------------------ Beschreibung: Ein temporaeres Itemset, das bei Abbruch verworfen wird ------------------------------------------------------------------------*/ SfxItemSet *SwEnvFmtPage::GetCollItemSet(SwTxtFmtColl* pColl, sal_Bool bSender) { SfxItemSet *&pAddrSet = bSender ? GetParent()->pSenderSet : GetParent()->pAddresseeSet; if (!pAddrSet) { // Range ermitteln (Ranges beider Itemsets mergen) const sal_uInt16 *pRanges = pColl->GetAttrSet().GetRanges(); static sal_uInt16 __READONLY_DATA aRanges[] = { RES_PARATR_BEGIN, RES_PARATR_ADJUST, RES_PARATR_TABSTOP, RES_PARATR_END-1, RES_LR_SPACE, RES_UL_SPACE, RES_BACKGROUND, RES_SHADOW, SID_ATTR_TABSTOP_POS, SID_ATTR_TABSTOP_POS, SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_DEFAULTS, SID_ATTR_TABSTOP_OFFSET, SID_ATTR_TABSTOP_OFFSET, SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_INNER, 0, 0 }; // BruteForce-Merge, weil MergeRange in SvTools buggy ist: sal_uInt16 i = 0; SvLongsSort aMergedRanges( 0, 10 ); while (pRanges[i]) { for (sal_uInt16 nPos = pRanges[i]; nPos <= pRanges[i+1]; nPos++) aMergedRanges.Insert(nPos); i += 2; } i = 0; while (aRanges[i]) { for (sal_uInt16 nPos = aRanges[i]; nPos <= aRanges[i+1]; nPos++) aMergedRanges.Insert(nPos); i += 2; } // Ranges kompaktieren SvLongs aCompactedRanges( 0, 10 ); aCompactedRanges.Insert(aMergedRanges[0], aCompactedRanges.Count()); for (i = 0; i < aMergedRanges.Count(); i++) { while (i + 1 < aMergedRanges.Count() && aMergedRanges[i+1] - aMergedRanges[i] == 1) { i++; } long nEnd = aMergedRanges[i]; aCompactedRanges.Insert(nEnd, aCompactedRanges.Count()); if (i + 1 < aMergedRanges.Count()) { long nStart = aMergedRanges[i+1]; aCompactedRanges.Insert(nStart, aCompactedRanges.Count()); } } // Neue Ranges erzeugen sal_uInt16 *pNewRanges = new sal_uInt16[aCompactedRanges.Count() + 1]; for (i = 0; i < aCompactedRanges.Count(); i++) pNewRanges[i] = (sal_uInt16)aCompactedRanges[i]; pNewRanges[i] = 0; pAddrSet = new SfxItemSet(GetParent()->pSh->GetView().GetCurShell()->GetPool(), pNewRanges); pAddrSet->Put(pColl->GetAttrSet()); delete[] pNewRanges; } return pAddrSet; } // -------------------------------------------------------------------------- IMPL_LINK( SwEnvFmtPage, FormatHdl, ListBox *, EMPTYARG ) { long lWidth; long lHeight; long lSendFromLeft; long lSendFromTop; long lAddrFromLeft; long lAddrFromTop; sal_uInt16 nPaper = aIDs[aSizeFormatBox.GetSelectEntryPos()]; if (nPaper != (sal_uInt16)PAPER_USER) { Size aSz = SvxPaperInfo::GetPaperSize((Paper)nPaper); lWidth = Max(aSz.Width(), aSz.Height()); lHeight = Min(aSz.Width(), aSz.Height()); } else { lWidth = lUserW; lHeight = lUserH; } lSendFromLeft = 566; // 1cm lSendFromTop = 566; // 1cm lAddrFromLeft = lWidth / 2; lAddrFromTop = lHeight / 2; SetFldVal(aAddrLeftField, lAddrFromLeft); SetFldVal(aAddrTopField , lAddrFromTop ); SetFldVal(aSendLeftField, lSendFromLeft); SetFldVal(aSendTopField , lSendFromTop ); SetFldVal(aSizeWidthField , lWidth ); SetFldVal(aSizeHeightField, lHeight); SetMinMax(); FillItem(GetParent()->aEnvItem); aPreview.Invalidate(); return 0; } // -------------------------------------------------------------------------- void SwEnvFmtPage::SetMinMax() { long lWVal = static_cast< long >(GetFldVal(aSizeWidthField )); long lHVal = static_cast< long >(GetFldVal(aSizeHeightField)); long lWidth = Max(lWVal, lHVal), lHeight = Min(lWVal, lHVal); // Min und Max aAddrLeftField.SetMin((long) 100 * (GetFldVal(aSendLeftField) + 566), FUNIT_TWIP); aAddrLeftField.SetMax((long) 100 * (lWidth - 2 * 566), FUNIT_TWIP); aAddrTopField .SetMin((long) 100 * (GetFldVal(aSendTopField ) + 2 * 566), FUNIT_TWIP); aAddrTopField .SetMax((long) 100 * (lHeight - 2 * 566), FUNIT_TWIP); aSendLeftField.SetMin((long) 100 * (566), FUNIT_TWIP); aSendLeftField.SetMax((long) 100 * (GetFldVal(aAddrLeftField) - 566), FUNIT_TWIP); aSendTopField .SetMin((long) 100 * (566), FUNIT_TWIP); aSendTopField .SetMax((long) 100 * (GetFldVal(aAddrTopField ) - 2 * 566), FUNIT_TWIP); // First und Last aAddrLeftField.SetFirst(aAddrLeftField.GetMin()); aAddrLeftField.SetLast (aAddrLeftField.GetMax()); aAddrTopField .SetFirst(aAddrTopField .GetMin()); aAddrTopField .SetLast (aAddrTopField .GetMax()); aSendLeftField.SetFirst(aSendLeftField.GetMin()); aSendLeftField.SetLast (aSendLeftField.GetMax()); aSendTopField .SetFirst(aSendTopField .GetMin()); aSendTopField .SetLast (aSendTopField .GetMax()); // Fields neu formatieren aAddrLeftField .Reformat(); aAddrTopField .Reformat(); aSendLeftField .Reformat(); aSendTopField .Reformat(); aSizeWidthField .Reformat(); aSizeHeightField.Reformat(); } // -------------------------------------------------------------------------- SfxTabPage* __EXPORT SwEnvFmtPage::Create(Window* pParent, const SfxItemSet& rSet) { return new SwEnvFmtPage(pParent, rSet); } // ---------------------------------------------------------------------------- void __EXPORT SwEnvFmtPage::ActivatePage(const SfxItemSet& rSet) { SfxItemSet aSet(rSet); aSet.Put(GetParent()->aEnvItem); Reset(aSet); } // ---------------------------------------------------------------------------- int __EXPORT SwEnvFmtPage::DeactivatePage(SfxItemSet* _pSet) { if( _pSet ) FillItemSet(*_pSet); return SfxTabPage::LEAVE_PAGE; } // -------------------------------------------------------------------------- void SwEnvFmtPage::FillItem(SwEnvItem& rItem) { rItem.lAddrFromLeft = static_cast< sal_Int32 >(GetFldVal(aAddrLeftField)); rItem.lAddrFromTop = static_cast< sal_Int32 >(GetFldVal(aAddrTopField )); rItem.lSendFromLeft = static_cast< sal_Int32 >(GetFldVal(aSendLeftField)); rItem.lSendFromTop = static_cast< sal_Int32 >(GetFldVal(aSendTopField )); sal_uInt16 nPaper = aIDs[aSizeFormatBox.GetSelectEntryPos()]; if (nPaper == (sal_uInt16)PAPER_USER) { long lWVal = static_cast< long >(GetFldVal(aSizeWidthField )); long lHVal = static_cast< long >(GetFldVal(aSizeHeightField)); rItem.lWidth = Max(lWVal, lHVal); rItem.lHeight = Min(lWVal, lHVal); } else { long lWVal = SvxPaperInfo::GetPaperSize((Paper)nPaper).Width (); long lHVal = SvxPaperInfo::GetPaperSize((Paper)nPaper).Height(); rItem.lWidth = Max(lWVal, lHVal); rItem.lHeight = Min(lWVal, lHVal); } } // -------------------------------------------------------------------------- sal_Bool __EXPORT SwEnvFmtPage::FillItemSet(SfxItemSet& rSet) { FillItem(GetParent()->aEnvItem); rSet.Put(GetParent()->aEnvItem); return sal_True; } // -------------------------------------------------------------------------- void __EXPORT SwEnvFmtPage::Reset(const SfxItemSet& rSet) { const SwEnvItem& rItem = (const SwEnvItem&) rSet.Get(FN_ENVELOP); Paper ePaper = SvxPaperInfo::GetSvxPaper( Size( Min(rItem.lWidth, rItem.lHeight), Max(rItem.lWidth, rItem.lHeight)), MAP_TWIP, sal_True); for (sal_uInt16 i = 0; i < (sal_uInt16) aIDs.Count(); i++) if (aIDs[i] == (sal_uInt16)ePaper) aSizeFormatBox.SelectEntryPos(i); // Die MetricFields SetFldVal(aAddrLeftField, rItem.lAddrFromLeft); SetFldVal(aAddrTopField , rItem.lAddrFromTop ); SetFldVal(aSendLeftField, rItem.lSendFromLeft); SetFldVal(aSendTopField , rItem.lSendFromTop ); SetFldVal(aSizeWidthField , Max(rItem.lWidth, rItem.lHeight)); SetFldVal(aSizeHeightField , Min(rItem.lWidth, rItem.lHeight)); SetMinMax(); DELETEZ(GetParent()->pSenderSet); DELETEZ(GetParent()->pAddresseeSet); }