/************************************************************************* * * $RCSfile: border.cxx,v $ * * $Revision: 1.3 $ * * last change: $Author: pb $ $Date: 2000-10-23 09:31:05 $ * * The Contents of this file are made available subject to the terms of * either of the following licenses * * - GNU Lesser General Public License Version 2.1 * - Sun Industry Standards Source License Version 1.1 * * Sun Microsystems Inc., October, 2000 * * GNU Lesser General Public License Version 2.1 * ============================================= * Copyright 2000 by Sun Microsystems, Inc. * 901 San Antonio Road, Palo Alto, CA 94303, USA * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License version 2.1, as published by the Free Software Foundation. * * This library 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 for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA * * * Sun Industry Standards Source License Version 1.1 * ================================================= * The contents of this file are subject to the Sun Industry Standards * Source License Version 1.1 (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.openoffice.org/license.html. * * Software provided under this License is provided on an "AS IS" basis, * WITHOUT WARRUNTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, * WITHOUT LIMITATION, WARRUNTIES THAT THE SOFTWARE IS FREE OF DEFECTS, * MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING. * See the License for the specific provisions governing your rights and * obligations concerning the Software. * * The Initial Developer of the Original Code is: Sun Microsystems, Inc.. * * Copyright: 2000 by Sun Microsystems, Inc. * * All Rights Reserved. * * Contributor(s): _______________________________________ * * ************************************************************************/ // include --------------------------------------------------------------- #ifndef _SFXAPP_HXX #include #endif #ifndef _SFX_OBJSH_HXX #include #endif #ifndef _SFXMODULE_HXX #include #endif #pragma hdrstop #define _SVX_BORDER_CXX #include "dialogs.hrc" #include "svxitems.hrc" #include "border.hrc" #include "helpid.hrc" #define ITEMID_COLOR_TABLE 0 #define ITEMID_BOX SID_ATTR_BORDER_OUTER #define ITEMID_BOXINFO SID_ATTR_BORDER_INNER #define ITEMID_SHADOW SID_ATTR_BORDER_SHADOW #define LINESTYLE_HTML_MAX 5 #include "xtable.hxx" // XColorTable #include "drawitem.hxx" #include "boxitem.hxx" #include "shaditem.hxx" #include "border.hxx" #include "linelink.hxx" #include "dlgutil.hxx" #include "dialmgr.hxx" #include "htmlmode.hxx" #ifndef _SV_MSGBOX_HXX //autogen #include #endif /* -----------------01.06.99 08:23------------------- * * --------------------------------------------------*/ class BorderDistanceExample_Impl : public Window { long nLeft; long nRight; long nTop; long nBottom; USHORT nValid; //mit VALID_TOP, ... public: BorderDistanceExample_Impl(Window* pParent, const ResId& rResId) : Window(pParent, rResId), nLeft(0), nRight(0), nTop(0), nBottom(0), nValid(VALID_TOP|VALID_BOTTOM|VALID_LEFT|VALID_RIGHT) {} virtual void Paint( const Rectangle& rRect ); void SetDistances(long nL, long nR, long nT, long nB) {nLeft = nL; nRight = nR; nTop = nT; nBottom = nB;} void SetValid(USHORT nSet) {nValid = nSet;} }; void BorderDistanceExample_Impl::Paint( const Rectangle& rRect ) { // Pen aSolidPen(PEN_SOLID); Size aLogSize(PixelToLogic(GetOutputSizePixel())); Point aTL( 0, 0 ); Rectangle aRect(aTL, aLogSize); SetFillColor( Color( COL_WHITE ) ); SetLineColor( Color( COL_BLACK ) ); DrawRect(aRect); SetFillColor( Color( COL_GRAY ) ); SetLineColor( Color( COL_BLACK ) ); aTL = Point( aLogSize.Width() / 10, aLogSize.Height() / 10 ); Rectangle aBorderRect(aTL, Size(aLogSize.Width() * 8 / 10, aLogSize.Height() * 8 /10)); if(VALID_LEFT&nValid) DrawLine(aBorderRect.TopLeft(), aBorderRect.BottomLeft()); if(VALID_RIGHT&nValid) DrawLine(aBorderRect.TopRight(), aBorderRect.BottomRight()); if(VALID_TOP&nValid) DrawLine(aBorderRect.TopLeft(), aBorderRect.TopRight()); if(VALID_BOTTOM&nValid) DrawLine(aBorderRect.BottomLeft(), aBorderRect.BottomRight()); Rectangle aContentRect(aBorderRect); long nL = nLeft / 10; long nR = nRight/ 10; long nT = nTop / 10; long nB = nBottom / 10; if((nL + nR) > aContentRect.GetWidth()) { nL = aContentRect.GetWidth() * 100 / (nL + nR) * nL / 100; nR = aContentRect.GetWidth() - nL; } aContentRect.Left() += nL; aContentRect.Right()-= nR; if((nT + nB) > aContentRect.GetHeight()) { nT = aContentRect.GetHeight() * 100 / (nT + nB) * nT / 100; nB = aContentRect.GetHeight() - nT; } aContentRect.Top() += nT; aContentRect.Bottom()-= nB; DrawRect(aContentRect); } class SvxDistanceDlg_Impl : public ModalDialog { friend class SvxBorderTabPage; GroupBox aDistanceGB; FixedText aLeftFT; MetricField aLeftMF; FixedText aRightFT; MetricField aRightMF; FixedText aTopFT; MetricField aTopMF; FixedText aBottomFT; MetricField aBottomMF; CheckBox aSynchronizeCB; BorderDistanceExample_Impl aExampleWIN; OKButton aOK; CancelButton aCancel; HelpButton aHelp; USHORT nValid; static BOOL bSync; DECL_LINK(ModifyHdl, MetricField*); DECL_LINK(SyncHdl, CheckBox*); public: SvxDistanceDlg_Impl(Window* pParent, const ResId& rResId); virtual short Execute(); void SetFldUnit(FieldUnit eUnit) { SetFieldUnit(aLeftMF, eUnit); SetFieldUnit(aRightMF, eUnit); SetFieldUnit(aTopMF, eUnit); SetFieldUnit(aBottomMF, eUnit); if(eUnit == FUNIT_MM) { aLeftMF.SetDecimalDigits(1); aRightMF.SetDecimalDigits(1); aTopMF.SetDecimalDigits(1); aBottomMF.SetDecimalDigits(1); } } void UpdateExample(); void SetValid(USHORT nSet) { nValid = nSet; aExampleWIN.SetValid(nValid); aLeftFT.Enable(0 != (nValid&VALID_LEFT)); aRightFT.Enable(0 != (nValid&VALID_RIGHT)); aTopFT.Enable(0 != (nValid&VALID_TOP)); aBottomFT.Enable(0 != (nValid&VALID_BOTTOM)); aLeftMF.Enable(0 != (nValid&VALID_LEFT)); aRightMF.Enable(0 != (nValid&VALID_RIGHT)); aTopMF.Enable(0 != (nValid&VALID_TOP)); aBottomMF.Enable(0 != (nValid&VALID_BOTTOM)); } }; /* -----------------01.06.99 08:28------------------- * * --------------------------------------------------*/ BOOL SvxDistanceDlg_Impl::bSync = TRUE; SvxDistanceDlg_Impl::SvxDistanceDlg_Impl(Window* pParent, const ResId& rResId) : ModalDialog(pParent, rResId), aOK( this, ResId(PB_OK)), aCancel( this, ResId(PB_CANCEL)), aHelp( this, ResId(PB_HELP)), aDistanceGB( this, ResId(GB_DISTANCE)), aLeftFT( this, ResId(FT_LEFT)), aLeftMF( this, ResId(MF_LEFT)), aRightFT( this, ResId(FT_RIGHT)), aRightMF( this, ResId(MF_RIGHT)), aTopFT( this, ResId(FT_TOP)), aTopMF( this, ResId(MF_TOP)), aBottomFT( this, ResId(FT_BOTTOM)), aBottomMF( this, ResId(MF_BOTTOM)), aSynchronizeCB( this, ResId(CB_SYNC )), aExampleWIN( this, ResId(WIN_EXAMPLE )), nValid(VALID_TOP|VALID_BOTTOM|VALID_LEFT|VALID_RIGHT) { FreeResource(); aSynchronizeCB.Check(bSync); aSynchronizeCB.SetClickHdl(LINK(this, SvxDistanceDlg_Impl, SyncHdl)); aLeftMF.SetModifyHdl(LINK(this, SvxDistanceDlg_Impl, ModifyHdl)); aRightMF.SetModifyHdl(LINK(this, SvxDistanceDlg_Impl, ModifyHdl)); aTopMF.SetModifyHdl(LINK(this, SvxDistanceDlg_Impl, ModifyHdl)); aBottomMF.SetModifyHdl(LINK(this, SvxDistanceDlg_Impl, ModifyHdl)); aHelp .SetHelpId(HID_BORDER_DISTANCE_DLG_HELP_PB); aLeftMF .SetHelpId(HID_BORDER_DISTANCE_DLG_LEFT); aRightMF .SetHelpId(HID_BORDER_DISTANCE_DLG_RIGHT ); aTopMF .SetHelpId(HID_BORDER_DISTANCE_DLG_TOP ); aBottomMF .SetHelpId(HID_BORDER_DISTANCE_DLG_BOTTOM ); aSynchronizeCB .SetHelpId(HID_BORDER_DISTANCE_DLG_SYNC_CB); aExampleWIN .SetHelpId(HID_BORDER_DISTANCE_DLG_EXAMPLE); } /* -----------------01.07.99 15:03------------------- --------------------------------------------------*/ short SvxDistanceDlg_Impl::Execute() { long nLeft = aLeftMF.GetValue(); long nRight = aRightMF.GetValue(); long nTop = aTopMF.GetValue(); long nBottom = aBottomMF.GetValue(); // save all values short nRet = ModalDialog::Execute(); if(RET_CANCEL == nRet) { //restore values aLeftMF.SetValue( nLeft ); aRightMF.SetValue( nRight ); aTopMF.SetValue( nTop ); aBottomMF.SetValue( nBottom); UpdateExample(); } return nRet; } /* -----------------07.06.99 15:58------------------- * * --------------------------------------------------*/ IMPL_LINK(SvxDistanceDlg_Impl, ModifyHdl, MetricField*, pField) { if(bSync) { long nVal = pField->GetValue(); aLeftMF.SetValue(nVal); aRightMF.SetValue(nVal); aTopMF.SetValue(nVal); aBottomMF.SetValue(nVal); } UpdateExample(); return 0; } /* -----------------07.06.99 15:58------------------- * * --------------------------------------------------*/ IMPL_LINK(SvxDistanceDlg_Impl, SyncHdl, CheckBox*, pBox) { bSync = pBox->IsChecked(); return 0; } /* -----------------07.06.99 15:58------------------- * * --------------------------------------------------*/ void SvxDistanceDlg_Impl::UpdateExample() { aExampleWIN.SetDistances( aLeftMF.GetValue(), aRightMF.GetValue(), aTopMF.GetValue(), aBottomMF.GetValue()); aExampleWIN.Invalidate(); } // ----------------------------------------------------------------------- /* * [Beschreibung:] * TabPage zum Einstellen der Rahmen-Attribute. * Benoetigt * ein SvxShadowItem: Schatten * ein SvxBoxItem: Linien links,rechts,oben,unten ), * ein SvxBoxInfo: Linien vertikal,horizontal, Abstaende, Flags ) * * Linien koennen drei Zustaende haben. * 1. Show ( -> gueltige Werte ) * 2. Hide ( -> NULL-Pointer ) * 3. DontCare ( -> gesonderte Valid-Flags im InfoItem ) */ // static ---------------------------------------------------------------- static USHORT pRanges[] = { SID_ATTR_BORDER_INNER, SID_ATTR_BORDER_SHADOW, 0 }; //------------------------------------------------------------------------ #define LINE_WIDTH0 (DEF_LINE_WIDTH_0 *100) #define LINE_WIDTH1 (DEF_LINE_WIDTH_1 *100) #define LINE_WIDTH2 (DEF_LINE_WIDTH_2 *100) #define LINE_WIDTH3 (DEF_LINE_WIDTH_3 *100) #define LINE_WIDTH4 (DEF_LINE_WIDTH_4 *100) #define DLINE0_OUT (DEF_DOUBLE_LINE0_OUT *100) #define DLINE0_IN (DEF_DOUBLE_LINE0_IN *100) #define DLINE0_DIST (DEF_DOUBLE_LINE0_DIST *100) #define DLINE1_OUT (DEF_DOUBLE_LINE1_OUT *100) #define DLINE1_IN (DEF_DOUBLE_LINE1_IN *100) #define DLINE1_DIST (DEF_DOUBLE_LINE1_DIST *100) #define DLINE2_OUT (DEF_DOUBLE_LINE2_OUT *100) #define DLINE2_IN (DEF_DOUBLE_LINE2_IN *100) #define DLINE2_DIST (DEF_DOUBLE_LINE2_DIST *100) #define DLINE3_OUT (DEF_DOUBLE_LINE3_OUT *100) #define DLINE3_IN (DEF_DOUBLE_LINE3_IN *100) #define DLINE3_DIST (DEF_DOUBLE_LINE3_DIST *100) #define DLINE4_OUT (DEF_DOUBLE_LINE4_OUT *100) #define DLINE4_IN (DEF_DOUBLE_LINE4_IN *100) #define DLINE4_DIST (DEF_DOUBLE_LINE4_DIST *100) #define DLINE5_OUT (DEF_DOUBLE_LINE5_OUT *100) #define DLINE5_IN (DEF_DOUBLE_LINE5_IN *100) #define DLINE5_DIST (DEF_DOUBLE_LINE5_DIST *100) #define DLINE6_OUT (DEF_DOUBLE_LINE6_OUT *100) #define DLINE6_IN (DEF_DOUBLE_LINE6_IN *100) #define DLINE6_DIST (DEF_DOUBLE_LINE6_DIST *100) #define DLINE7_OUT (DEF_DOUBLE_LINE7_OUT *100) #define DLINE7_IN (DEF_DOUBLE_LINE7_IN *100) #define DLINE7_DIST (DEF_DOUBLE_LINE7_DIST *100) #define DLINE8_OUT (DEF_DOUBLE_LINE8_OUT *100) #define DLINE8_IN (DEF_DOUBLE_LINE8_IN *100) #define DLINE8_DIST (DEF_DOUBLE_LINE8_DIST *100) #define DLINE9_OUT (DEF_DOUBLE_LINE9_OUT *100) #define DLINE9_IN (DEF_DOUBLE_LINE9_IN *100) #define DLINE9_DIST (DEF_DOUBLE_LINE9_DIST *100) #define DLINE10_OUT (DEF_DOUBLE_LINE10_OUT *100) #define DLINE10_IN (DEF_DOUBLE_LINE10_IN *100) #define DLINE10_DIST (DEF_DOUBLE_LINE10_DIST*100) #define EQSTYLE(s1,s2) \ ( (s1).nLeft == (s2).nLeft \ && (s1).nMiddle == (s2).nMiddle \ && (s1).nRight == (s2).nRight \ ) #define SET_STYLE(s,l,m,r) \ ((s).nLeft = l), \ ((s).nMiddle = m), \ ((s).nRight = r) #define RGBCOL(eColorName) (TpBorderRGBColor(eColorName)) // LOKALE FUNKTION // Konvertiert in echte RGB-Farben, damit in den Listboxen // endlich mal richtig selektiert werden kann. Color TpBorderRGBColor( ColorData aColorData ) { Color aRGBColor( aColorData ); return( aRGBColor ); } // ----------------------------------------------------------------------- Color TpBorderRGBColor( const Color& rColor ) { Color aRGBColor( rColor.GetRed(), rColor.GetGreen(), rColor.GetBlue() ); return( aRGBColor ); } // ----------------------------------------------------------------------- SvxBorderTabPage::SvxBorderTabPage( Window* pParent, const SfxItemSet& rCoreAttrs ) : SfxTabPage( pParent, ResId( RID_SVXPAGE_BORDER, DIALOG_MGR() ), rCoreAttrs ), aWndPresets ( this, ResId( WIN_PRESETS ) ), aGbPresets ( this, ResId( GB_PRESETS ) ), aWndFrameSel ( this, ResId( WIN_FRAMESEL ) ), aDistancePB ( this, ResId( PB_DISTANCE ) ), aGbBorder ( this, ResId( GB_BORDER ) ), aFtLineStyle ( this, ResId( FT_LINESTYLE ) ), aLbLineStyle ( this, ResId( LB_LINESTYLE ) ), aFtLineColor ( this, ResId( FT_LINECOLOR ) ), aLbLineColor ( this, ResId( LB_LINECOLOR ) ), aGbLine ( this, ResId( GB_LINE ) ), aFtShadowPos ( this, ResId( FT_SHADOWPOS ) ), aWndShadows ( this, ResId( WIN_SHADOWS ) ), aFtShadowSize ( this, ResId( FT_SHADOWSIZE ) ), aEdShadowSize ( this, ResId( ED_SHADOWSIZE ) ), aFtShadowColor ( this, ResId( FT_SHADOWCOLOR ) ), aLbShadowColor ( this, ResId( LB_SHADOWCOLOR ) ), aGbShadow ( this, ResId( GB_SHADOW ) ), pDistDlg(0), nMinValue(0), bIsTableBorder ( FALSE ), nSWMode(0) { // diese Page braucht ExchangeSupport SetExchangeSupport(); // Metrik einstellen FieldUnit eFUnit = GetModuleFieldUnit( &rCoreAttrs ); switch ( eFUnit ) { case FUNIT_M: case FUNIT_KM: eFUnit = FUNIT_MM; break; } SetFieldUnit( aEdShadowSize, eFUnit ); USHORT nWhich = GetWhich( SID_ATTR_BORDER_INNER ); BOOL bIsDontCare = TRUE; if ( rCoreAttrs.GetItemState( nWhich, TRUE ) >= SFX_ITEM_AVAILABLE ) { // Absatz oder Tabelle const SvxBoxInfoItem* pBoxInfo = (const SvxBoxInfoItem*)&( rCoreAttrs.Get( nWhich ) ); bIsTableBorder = pBoxInfo->IsTable(); if(pBoxInfo->IsDist()) { aDistancePB.Show(); pDistDlg = new SvxDistanceDlg_Impl(this, ResId(DLG_DISTANCE)); SetFieldUnit(pDistDlg->aLeftMF , eFUnit); SetFieldUnit(pDistDlg->aRightMF , eFUnit); SetFieldUnit(pDistDlg->aTopMF , eFUnit); SetFieldUnit(pDistDlg->aBottomMF , eFUnit); pDistDlg->UpdateExample(); } bIsDontCare = !pBoxInfo->IsValid( VALID_DISABLE ); } if(eFUnit == FUNIT_MM && SFX_MAPUNIT_TWIP == rCoreAttrs.GetPool()->GetMetric( GetWhich( SID_ATTR_BORDER_INNER ) )) { if(pDistDlg) { pDistDlg->aLeftMF.SetDecimalDigits(1); pDistDlg->aRightMF.SetDecimalDigits(1); pDistDlg->aTopMF.SetDecimalDigits(1); pDistDlg->aBottomMF.SetDecimalDigits(1); } aEdShadowSize.SetDecimalDigits(1); } pFrameSel = new SvxFrameSelector( &aWndFrameSel, bIsTableBorder ? SVX_FRMSELTYPE_TABLE : SVX_FRMSELTYPE_PARAGRAPH, bIsDontCare ); pFrameSel->SetSelectLink(LINK(this, SvxBorderTabPage, LinesChanged_Impl)); if ( bIsTableBorder || !pDistDlg) { long nDeltaY = 0; if(pDistDlg) nDeltaY = aGbBorder.GetPosPixel().Y() + aGbBorder.GetSizePixel().Height() - aDistancePB.GetPosPixel().Y() - 6/*GroupBox-Offset*/; // Anpassung des FrameSelectors an StarCalc: long nXdiff = ( aGbBorder.GetSizePixel().Width() - aWndFrameSel.GetSizePixel().Width()) / 2; long nYdiff = ( aGbBorder.GetSizePixel().Height() - nDeltaY - aWndFrameSel.GetSizePixel().Height()) / 2; aWndFrameSel.SetPosPixel( aGbBorder.GetPosPixel() + Point( nXdiff, nYdiff ) ); } aLbLineStyle.SetSelectHdl( LINK( this, SvxBorderTabPage, SelStyleHdl_Impl ) ); aLbLineColor.SetSelectHdl( LINK( this, SvxBorderTabPage, SelColHdl_Impl ) ); aLbShadowColor.SetSelectHdl( LINK( this, SvxBorderTabPage, SelColHdl_Impl ) ); aWndPresets.SetSelectHdl( LINK( this, SvxBorderTabPage, SelPreHdl_Impl ) ); aWndShadows.SetSelectHdl( LINK( this, SvxBorderTabPage, SelSdwHdl_Impl ) ); aDistancePB.SetClickHdl( LINK( this, SvxBorderTabPage, DistanceHdl_Impl ) ); FillValueSets_Impl(); FillLineListBox_Impl(); // ColorBox aus der XColorTable fuellen. SfxObjectShell* pDocSh = SfxObjectShell::Current(); const SfxPoolItem* pItem = NULL; XColorTable* pColorTable = NULL; DBG_ASSERT( pDocSh, "DocShell not found!" ); if ( pDocSh && ( pItem = pDocSh->GetItem( SID_COLOR_TABLE ) ) ) pColorTable = ( (SvxColorTableItem*)pItem )->GetColorTable(); DBG_ASSERT( pColorTable, "ColorTable not found!" ); if ( pColorTable ) { // fuellen der Linienfarben-Box aLbLineColor.SetUpdateMode( FALSE ); for ( long i = 0; i < pColorTable->Count(); ++i ) { XColorEntry* pEntry = pColorTable->Get(i); aLbLineColor.InsertEntry( pEntry->GetColor(), pEntry->GetName() ); } aLbLineColor.SetUpdateMode( TRUE ); // dann nur noch in die Schattenfarben-Box kopieren aLbShadowColor.CopyEntries( aLbLineColor ); } FreeResource(); } // ----------------------------------------------------------------------- SvxBorderTabPage::~SvxBorderTabPage() { delete pFrameSel, pFrameSel=NULL; delete pDistDlg; } // ----------------------------------------------------------------------- USHORT* SvxBorderTabPage::GetRanges() { return pRanges; } // ----------------------------------------------------------------------- SfxTabPage* SvxBorderTabPage::Create( Window* pParent, const SfxItemSet& rAttrSet ) { return ( new SvxBorderTabPage( pParent, rAttrSet ) ); } // ----------------------------------------------------------------------- void SvxBorderTabPage::ResetFrameLine_Impl( const SvxBorderLine* pCoreLine, SvxFrameLine& rFrameLine ) { SvxLineStruct newLineStyle = { 0,0,0 }; if ( !pCoreLine ) // == Linie nicht darstellen { rFrameLine.SetStyle( newLineStyle ); rFrameLine.SetColor( RGBCOL(COL_BLACK) ); } else { newLineStyle.nLeft = pCoreLine->GetOutWidth()*100; newLineStyle.nMiddle = pCoreLine->GetDistance()*100; newLineStyle.nRight = pCoreLine->GetInWidth() *100; rFrameLine.SetStyle( newLineStyle ); rFrameLine.SetColor( pCoreLine->GetColor() ); } } // ----------------------------------------------------------------------- void SvxBorderTabPage::Reset( const SfxItemSet& rSet ) { const SvxBoxItem* pBoxItem; const SvxBoxInfoItem* pBoxInfoItem; const SvxShadowItem* pShadowItem; USHORT nWhichBox = GetWhich(SID_ATTR_BORDER_OUTER); USHORT nWhichShadow = GetWhich(SID_ATTR_BORDER_SHADOW); SfxMapUnit eCoreUnit; const Color aColBlack = RGBCOL(COL_BLACK); pBoxItem = (const SvxBoxItem*)GetItem( rSet, SID_ATTR_BORDER_OUTER ); pBoxInfoItem = (const SvxBoxInfoItem*)GetItem( rSet, SID_ATTR_BORDER_INNER ); pShadowItem = (const SvxShadowItem*)GetItem( rSet, SID_ATTR_BORDER_SHADOW ); eCoreUnit = rSet.GetPool()->GetMetric( nWhichBox ); if ( pBoxItem && pBoxInfoItem ) // -> Don't Care { //----------------- // Umrandung links: //----------------- if ( pBoxInfoItem->IsValid( VALID_LEFT ) ) ResetFrameLine_Impl( pBoxItem->GetLeft(), pFrameSel->GetLeft() ); else pFrameSel->GetLeft().SetState( SVX_FRMLINESTATE_DONT_CARE ); //------------------ // Umrandung rechts: //------------------ if ( pBoxInfoItem->IsValid( VALID_RIGHT ) ) ResetFrameLine_Impl( pBoxItem->GetRight(), pFrameSel->GetRight() ); else pFrameSel->GetRight().SetState( SVX_FRMLINESTATE_DONT_CARE ); //---------------- // Umrandung oben: //---------------- if ( pBoxInfoItem->IsValid( VALID_TOP ) ) ResetFrameLine_Impl( pBoxItem->GetTop(), pFrameSel->GetTop() ); else pFrameSel->GetTop().SetState( SVX_FRMLINESTATE_DONT_CARE ); //----------------- // Umrandung unten: //----------------- if ( pBoxInfoItem->IsValid( VALID_BOTTOM ) ) ResetFrameLine_Impl( pBoxItem->GetBottom(), pFrameSel->GetBottom() ); else pFrameSel->GetBottom().SetState( SVX_FRMLINESTATE_DONT_CARE ); //------------------- // Abstand nach innen //------------------- if(pDistDlg) { SetMetricValue( pDistDlg->aLeftMF, pBoxInfoItem->GetDefDist(), eCoreUnit ); SetMetricValue( pDistDlg->aRightMF, pBoxInfoItem->GetDefDist(), eCoreUnit ); SetMetricValue( pDistDlg->aTopMF, pBoxInfoItem->GetDefDist(), eCoreUnit ); SetMetricValue( pDistDlg->aBottomMF, pBoxInfoItem->GetDefDist(), eCoreUnit ); nMinValue = pDistDlg->aLeftMF.GetValue(); if ( pBoxInfoItem->IsMinDist() ) { pDistDlg->aLeftMF.SetMin ( nMinValue ); pDistDlg->aLeftMF.SetFirst( nMinValue ); pDistDlg->aRightMF.SetMin ( nMinValue ); pDistDlg->aRightMF.SetFirst( nMinValue ); pDistDlg->aTopMF.SetMin ( nMinValue ); pDistDlg->aTopMF.SetFirst( nMinValue ); pDistDlg->aBottomMF.SetMin ( nMinValue ); pDistDlg->aBottomMF.SetFirst( nMinValue ); } if ( pBoxInfoItem->IsDist() ) { if ( SFX_ITEM_SET == rSet.GetItemState( nWhichBox, FALSE ) && pBoxInfoItem->IsValid( VALID_DISTANCE ) ) { if( !pFrameSel->IsAnyLineSet() ) { pDistDlg->aLeftMF.SetMin( 0 ); pDistDlg->aLeftMF.SetFirst( 0 ); pDistDlg->aRightMF.SetMin( 0 ); pDistDlg->aRightMF.SetFirst( 0 ); pDistDlg->aTopMF.SetMin( 0 ); pDistDlg->aTopMF.SetFirst( 0 ); pDistDlg->aBottomMF.SetMin( 0 ); pDistDlg->aBottomMF.SetFirst( 0 ); } long nLeftDist = pBoxItem->GetDistance( BOX_LINE_LEFT); SetMetricValue( pDistDlg->aLeftMF, nLeftDist, eCoreUnit ); long nRightDist = pBoxItem->GetDistance( BOX_LINE_RIGHT); SetMetricValue( pDistDlg->aRightMF, nRightDist, eCoreUnit ); long nTopDist = pBoxItem->GetDistance( BOX_LINE_TOP); SetMetricValue( pDistDlg->aTopMF, nTopDist, eCoreUnit ); long nBottomDist = pBoxItem->GetDistance( BOX_LINE_BOTTOM); SetMetricValue( pDistDlg->aBottomMF, nBottomDist, eCoreUnit ); // ist der Abstand auf nicht-default gesetzt, // dann soll der Wert auch nicht // mehr autom. veraendert werden const long nDefDist = pBoxInfoItem->GetDefDist(); if((pBoxItem->GetDistance() || (nSWMode & SW_BORDER_MODE_FRAME)&& pFrameSel->IsAnyLineSet()) && (nDefDist != nLeftDist || nDefDist != nRightDist || nDefDist != nTopDist || nDefDist != nBottomDist) ) { pDistDlg->aLeftMF.SetModifyFlag(); pDistDlg->aRightMF.SetModifyFlag(); pDistDlg->aTopMF.SetModifyFlag(); pDistDlg->aBottomMF.SetModifyFlag(); } } else { SetMetricValue( pDistDlg->aLeftMF, pBoxInfoItem->GetDefDist(), eCoreUnit ); SetMetricValue( pDistDlg->aRightMF, pBoxInfoItem->GetDefDist(), eCoreUnit ); SetMetricValue( pDistDlg->aTopMF, pBoxInfoItem->GetDefDist(), eCoreUnit ); SetMetricValue( pDistDlg->aBottomMF, pBoxInfoItem->GetDefDist(), eCoreUnit ); } } pDistDlg->aLeftMF.SaveValue(); pDistDlg->aRightMF.SaveValue(); pDistDlg->aTopMF.SaveValue(); pDistDlg->aBottomMF.SaveValue(); pDistDlg->UpdateExample(); } //---------------- // innen vertikal: //---------------- if ( pBoxInfoItem->IsValid( VALID_VERT ) ) ResetFrameLine_Impl( pBoxInfoItem->GetVert(), pFrameSel->GetVer() ); else pFrameSel->GetVer().SetState( SVX_FRMLINESTATE_DONT_CARE ); //------------------ // innen horizontal: //------------------ if ( pBoxInfoItem->IsValid( VALID_HORI ) ) ResetFrameLine_Impl( pBoxInfoItem->GetHori(), pFrameSel->GetHor() ); else pFrameSel->GetHor().SetState( SVX_FRMLINESTATE_DONT_CARE ); } else { // ResetFrameLine-Aufrufe einsparen: Color aColBlack = RGBCOL(COL_BLACK); SvxLineStruct aNullLine = { 0,0,0 }; SvxFrameLine& rLeft = pFrameSel->GetLeft(); SvxFrameLine& rRight = pFrameSel->GetRight(); SvxFrameLine& rTop = pFrameSel->GetTop(); SvxFrameLine& rBottom = pFrameSel->GetBottom(); SvxFrameLine& rHor = pFrameSel->GetVer(); SvxFrameLine& rVer = pFrameSel->GetHor(); rLeft .SetStyle( aNullLine ); rLeft .SetColor( aColBlack ); rRight .SetStyle( aNullLine ); rRight .SetColor( aColBlack ); rTop .SetStyle( aNullLine ); rTop .SetColor( aColBlack ); rBottom .SetStyle( aNullLine ); rBottom .SetColor( aColBlack ); rHor .SetStyle( aNullLine ); rHor .SetColor( aColBlack ); rVer .SetStyle( aNullLine ); rVer .SetColor( aColBlack ); } //------------------------------- // Linien im Selektor darstellen: //------------------------------- pFrameSel->ShowLines(); //------------------------------------------------------------- // Linie/Linienfarbe in Controllern darstellen, wenn eindeutig: //------------------------------------------------------------- { SvxLineStruct aDefStyle; List aList; if ( pFrameSel->GetTop().GetState() == SVX_FRMLINESTATE_SHOW ) { aList.Insert( &(pFrameSel->GetTop()) ); pFrameSel->SelectLine( SVX_FRMSELLINE_TOP ); } else pFrameSel->SelectLine( SVX_FRMSELLINE_TOP, FALSE ); if ( pFrameSel->GetBottom().GetState() == SVX_FRMLINESTATE_SHOW ) { aList.Insert( &(pFrameSel->GetBottom()) ); pFrameSel->SelectLine( SVX_FRMSELLINE_BOTTOM ); } else pFrameSel->SelectLine( SVX_FRMSELLINE_BOTTOM, FALSE ); if ( pFrameSel->GetLeft().GetState() == SVX_FRMLINESTATE_SHOW ) { aList.Insert( &(pFrameSel->GetLeft()) ); pFrameSel->SelectLine( SVX_FRMSELLINE_LEFT ); } else pFrameSel->SelectLine( SVX_FRMSELLINE_LEFT, FALSE ); if ( pFrameSel->GetRight().GetState() == SVX_FRMLINESTATE_SHOW ) { aList.Insert( &(pFrameSel->GetRight()) ); pFrameSel->SelectLine( SVX_FRMSELLINE_RIGHT ); } else pFrameSel->SelectLine( SVX_FRMSELLINE_RIGHT, FALSE ); if ( pFrameSel->GetHor().GetState() == SVX_FRMLINESTATE_SHOW ) { aList.Insert( &(pFrameSel->GetHor()) ); pFrameSel->SelectLine( SVX_FRMSELLINE_HOR ); } else pFrameSel->SelectLine( SVX_FRMSELLINE_HOR, FALSE ); if ( pFrameSel->GetVer().GetState() == SVX_FRMLINESTATE_SHOW ) { aList.Insert( &(pFrameSel->GetVer()) ); pFrameSel->SelectLine( SVX_FRMSELLINE_VER ); } else pFrameSel->SelectLine( SVX_FRMSELLINE_VER, FALSE ); if ( aList.Count() > 0 ) { SvxFrameLine* pLine = (SvxFrameLine*)aList.First(); Color aColor( pLine->GetColor() ); SvxLineStruct aStyle = pLine->GetStyle(); BOOL bEqual = TRUE; // Linienfarbe ------------------------------------- while ( pLine && bEqual ) { bEqual = (aColor == pLine->GetColor()); pLine = (SvxFrameLine*)aList.Next(); } if ( !bEqual ) aColor = aColBlack; USHORT nSelPos = aLbLineColor.GetEntryPos( aColor ); if ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) aLbLineColor.SelectEntryPos( nSelPos ); else { nSelPos = aLbLineColor.GetEntryPos( aColor ); if ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) { aLbLineColor.SelectEntryPos( nSelPos ); } else aLbLineColor.SelectEntryPos( aLbLineColor.InsertEntry( aColor, SVX_RESSTR( RID_SVXSTR_COLOR_USER ) ) ); } aLbLineStyle.SetColor( aColor ); if ( bEqual ) pFrameSel->SetCurLineColor( aColor ); // Linienstil -------------------------------------- pLine = (SvxFrameLine*)aList.First(); bEqual = TRUE; while ( pLine && bEqual ) { bEqual = EQSTYLE( pLine->GetStyle(), aStyle ); pLine = (SvxFrameLine*)aList.Next(); } if ( bEqual ) { aLbLineStyle.SelectEntry( aStyle.nLeft, aStyle.nRight, aStyle.nMiddle ); pFrameSel->SetCurLineStyle( aStyle ); } else { SET_STYLE( aDefStyle, LINE_WIDTH0, 0, 0 ); aLbLineStyle.SelectEntry( LINE_WIDTH0 ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); pFrameSel->SetCurLineStyle( aDefStyle ); } } else { aLbLineColor.SelectEntry( aColBlack, TRUE ); aLbLineStyle.SetColor( aColBlack ); pFrameSel->SetCurLineColor( aColBlack ); SET_STYLE( aDefStyle, 0, 0, 0 ); aLbLineStyle.SelectEntryPos( 0 ); pFrameSel->SetCurLineStyle( aDefStyle ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); } } //---------- // Schatten: //---------- if ( pShadowItem ) { Color aColor( pShadowItem->GetColor() ); USHORT nSelPos = aLbShadowColor.GetEntryPos( aColor ); if ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) aLbShadowColor.SelectEntryPos( nSelPos ); else { nSelPos = aLbShadowColor.GetEntryPos( aColor ); if ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) { aLbShadowColor.SelectEntryPos( nSelPos ); } else aLbShadowColor.SelectEntryPos( aLbShadowColor.InsertEntry( aColor, SVX_RESSTR( RID_SVXSTR_COLOR_USER ) ) ); } pFrameSel->SetShadowColor( aColor ); // Shadow-Attribut auslesen SetMetricValue( aEdShadowSize, pShadowItem->GetWidth(), eCoreUnit ); USHORT nItem = 1; SvxFrameShadow ePos = SVX_FRMSHADOW_NONE; switch ( pShadowItem->GetLocation() ) { case SVX_SHADOW_NONE: break; case SVX_SHADOW_BOTTOMRIGHT: nItem = 2; ePos = SVX_FRMSHADOW_BOT_RIGHT; break; case SVX_SHADOW_TOPRIGHT: nItem = 3; ePos = SVX_FRMSHADOW_TOP_RIGHT; break; case SVX_SHADOW_BOTTOMLEFT: nItem = 4; ePos = SVX_FRMSHADOW_BOT_LEFT; break; case SVX_SHADOW_TOPLEFT: nItem = 5; ePos = SVX_FRMSHADOW_TOP_LEFT; break; } aWndShadows.SelectItem( nItem ); pFrameSel->SetShadowPos( ePos ); } else // Don't Care { // diese Bedingung erfordert noch eine geeignete // Schatten-TriState-Darstellung aWndShadows.SelectItem( 1 ); pFrameSel->SetShadowPos( SVX_FRMSHADOW_NONE ); Color aColor( aColBlack ); USHORT nSelPos = aLbShadowColor.GetEntryPos( aColor ); if ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) aLbShadowColor.SelectEntryPos( nSelPos ); else { nSelPos = aLbShadowColor.GetEntryPos( aColor ); if ( LISTBOX_ENTRY_NOTFOUND != nSelPos ) { aLbShadowColor.SelectEntryPos( nSelPos ); } else aLbShadowColor.SelectEntryPos( aLbShadowColor.InsertEntry( aColor, SVX_RESSTR( RID_SVXSTR_COLOR_USER ) ) ); } pFrameSel->SetShadowColor( aColor ); // Default-Schattenbreite vom Pool abholen SetMetricValue( aEdShadowSize, ((const SvxShadowItem&)rSet.GetPool()-> GetDefaultItem( nWhichShadow )).GetWidth(), eCoreUnit ); } BOOL bEnable = aWndShadows.GetSelectItemId() > 1 ; aFtShadowSize.Enable(bEnable); aEdShadowSize.Enable(bEnable); //--------------------------------- // Schatten im Selektor darstellen: //--------------------------------- pFrameSel->ShowShadow(); aWndPresets.SetNoSelection(); // - keine Line - sollte nicht selektiert sein if ( aLbLineStyle.GetSelectEntryPos() == 0 ) { aLbLineStyle.SelectEntryPos( 1 ); SelStyleHdl_Impl( &aLbLineStyle ); } const SfxPoolItem* pItem; SfxObjectShell* pShell; if(SFX_ITEM_SET == rSet.GetItemState(SID_HTML_MODE, FALSE, &pItem) || ( 0 != (pShell = SfxObjectShell::Current()) && 0 != (pItem = pShell->GetItem(SID_HTML_MODE)))) { USHORT nHtmlMode = ((SfxUInt16Item*)pItem)->GetValue(); if(nHtmlMode & HTMLMODE_ON) { //Im Html-Mode gibt es keinen Schatten und nur komplette Umrandungen aFtShadowPos .Enable(FALSE); aWndShadows .Enable(FALSE); aFtShadowSize .Enable(FALSE); aEdShadowSize .Enable(FALSE); aFtShadowColor.Enable(FALSE); aLbShadowColor.Enable(FALSE); aGbShadow .Enable(FALSE); USHORT nLBCount = aLbLineStyle.GetEntryCount(); // ist es ein Absatzdialog, dann alle Linien fuer // Sw-Export, sonst ist die Page nicht da if(!bIsTableBorder && 0 == (nHtmlMode & HTMLMODE_FULL_ABS_POS) && SFX_ITEM_AVAILABLE > rSet.GetItemState(GetWhich( SID_ATTR_PARA_LINESPACE ))) { for( USHORT i = nLBCount - 1; i > LINESTYLE_HTML_MAX; i--) aLbLineStyle.RemoveEntry(i); } if(!bIsTableBorder) { aGbBorder .Enable(FALSE); aWndFrameSel.Enable(FALSE); aWndPresets.RemoveItem(3); aWndPresets.RemoveItem(4); aWndPresets.RemoveItem(5); } } } } // ----------------------------------------------------------------------- int SvxBorderTabPage::DeactivatePage( SfxItemSet* pSet ) { if ( pSet ) FillItemSet( *pSet ); return LEAVE_PAGE; } // ----------------------------------------------------------------------- void SvxBorderTabPage::SetCoreLine_Impl( const SvxFrameLine* pFrameLine, SvxBorderLine*& rpCoreLine ) { if ( !pFrameLine ) rpCoreLine = NULL; else if ( pFrameLine->GetState() == SVX_FRMLINESTATE_HIDE ) rpCoreLine = NULL; else if ( pFrameLine->GetState() == SVX_FRMLINESTATE_SHOW ) { const USHORT nOut = (USHORT)pFrameLine->GetStyle().nLeft; const USHORT nDist = (USHORT)pFrameLine->GetStyle().nMiddle; const USHORT nIn = (USHORT)pFrameLine->GetStyle().nRight; if ( 0 == nOut && 0 == nDist && 0 == nIn ) rpCoreLine = NULL; else { rpCoreLine->SetColor ( pFrameLine->GetColor() ); rpCoreLine->SetOutWidth ( nOut ? (nOut / 100) : 0 ); rpCoreLine->SetDistance ( nDist ? (nDist / 100) : 0 ); rpCoreLine->SetInWidth ( nDist ? (nIn / 100) : 0 ); } } } // ----------------------------------------------------------------------- #define IS_DONT_CARE(a) ((a).GetState() == SVX_FRMLINESTATE_DONT_CARE ) BOOL SvxBorderTabPage::FillItemSet( SfxItemSet& rCoreAttrs ) { BOOL bAttrsChanged = FALSE; BOOL bPut = TRUE; USHORT nBoxWhich = GetWhich( SID_ATTR_BORDER_OUTER ); USHORT nBoxInfoWhich = GetWhich( SID_ATTR_BORDER_INNER ); USHORT nShadowWhich = GetWhich( SID_ATTR_BORDER_SHADOW ); const SfxItemSet& rOldSet = GetItemSet(); SvxBoxItem aBoxItem ( nBoxWhich ); SvxBoxInfoItem aBoxInfoItem ( nBoxInfoWhich ); SvxShadowItem aShadowItem ( nShadowWhich ); SvxBorderLine aCoreLine; SvxBorderLine* pCoreLine; SvxBoxItem* pOldBoxItem = (SvxBoxItem*)GetOldItem( rCoreAttrs, SID_ATTR_BORDER_OUTER ); SfxMapUnit eCoreUnit = rOldSet.GetPool()->GetMetric( nBoxWhich ); const SfxPoolItem* pOld = 0; //------------------ // Umrandung aussen: //------------------ pCoreLine = &aCoreLine; SetCoreLine_Impl( &pFrameSel->GetLeft(), pCoreLine ); aBoxItem.SetLine( pCoreLine, BOX_LINE_LEFT ); pCoreLine = &aCoreLine; SetCoreLine_Impl( &pFrameSel->GetRight(), pCoreLine ); aBoxItem.SetLine( pCoreLine, BOX_LINE_RIGHT ); pCoreLine = &aCoreLine; SetCoreLine_Impl( &pFrameSel->GetTop(), pCoreLine ); aBoxItem.SetLine( pCoreLine, BOX_LINE_TOP ); pCoreLine = &aCoreLine; SetCoreLine_Impl( &pFrameSel->GetBottom(), pCoreLine ); aBoxItem.SetLine( pCoreLine, BOX_LINE_BOTTOM ); //-------------------------------- // Umrandung hor/ver und TableFlag //-------------------------------- pCoreLine = &aCoreLine; SetCoreLine_Impl( &pFrameSel->GetHor(), pCoreLine ); aBoxInfoItem.SetLine( pCoreLine, BOXINFO_LINE_HORI ); pCoreLine = &aCoreLine; SetCoreLine_Impl( &pFrameSel->GetVer(), pCoreLine ); aBoxInfoItem.SetLine( pCoreLine, BOXINFO_LINE_VERT ); aBoxInfoItem.SetTable( bIsTableBorder ); //------------------- // Abstand nach Innen //------------------- if( pDistDlg ) { aBoxInfoItem.SetDist( TRUE ); if ( ((bIsTableBorder || (nSWMode & SW_BORDER_MODE_TABLE)) && (pDistDlg->aLeftMF.IsModified()||pDistDlg->aRightMF.IsModified()|| pDistDlg->aTopMF.IsModified()||pDistDlg->aBottomMF.IsModified()) )|| pFrameSel->GetTop() .GetState() != SVX_FRMLINESTATE_HIDE || pFrameSel->GetBottom().GetState() != SVX_FRMLINESTATE_HIDE || pFrameSel->GetLeft() .GetState() != SVX_FRMLINESTATE_HIDE || pFrameSel->GetRight() .GetState() != SVX_FRMLINESTATE_HIDE ) { SvxBoxInfoItem* pOldBoxInfoItem = (SvxBoxInfoItem*)GetOldItem( rCoreAttrs, SID_ATTR_BORDER_INNER ); if(!pOldBoxItem || pDistDlg->aLeftMF .GetText() != pDistDlg->aLeftMF .GetSavedValue() || pDistDlg->aRightMF .GetText() != pDistDlg->aRightMF .GetSavedValue() || pDistDlg->aTopMF .GetText() != pDistDlg->aTopMF .GetSavedValue() || pDistDlg->aBottomMF.GetText() != pDistDlg->aBottomMF.GetSavedValue() || nMinValue == pDistDlg->aLeftMF .GetValue() || nMinValue == pDistDlg->aRightMF .GetValue() || nMinValue == pDistDlg->aTopMF .GetValue() || nMinValue == pDistDlg->aBottomMF.GetValue() || pOldBoxInfoItem && !pOldBoxInfoItem->IsValid(VALID_DISTANCE)) { aBoxItem.SetDistance( (USHORT)GetCoreValue( pDistDlg->aLeftMF , eCoreUnit ), BOX_LINE_LEFT ); aBoxItem.SetDistance( (USHORT)GetCoreValue( pDistDlg->aRightMF , eCoreUnit ), BOX_LINE_RIGHT ); aBoxItem.SetDistance( (USHORT)GetCoreValue( pDistDlg->aTopMF , eCoreUnit ), BOX_LINE_TOP ); aBoxItem.SetDistance( (USHORT)GetCoreValue( pDistDlg->aBottomMF , eCoreUnit ), BOX_LINE_BOTTOM); } else { // aBoxItem.SetDistance(pOldBoxItem->GetDistance()); aBoxItem.SetDistance(pOldBoxItem->GetDistance(BOX_LINE_LEFT ), BOX_LINE_LEFT); aBoxItem.SetDistance(pOldBoxItem->GetDistance(BOX_LINE_RIGHT), BOX_LINE_RIGHT); aBoxItem.SetDistance(pOldBoxItem->GetDistance(BOX_LINE_TOP ), BOX_LINE_TOP); aBoxItem.SetDistance(pOldBoxItem->GetDistance(BOX_LINE_BOTTOM), BOX_LINE_BOTTOM); } aBoxInfoItem.SetValid( VALID_DISTANCE, TRUE ); } else aBoxInfoItem.SetValid( VALID_DISTANCE, FALSE ); } //------------------------------------------ // Don't Care Status im Info-Item vermerken: //------------------------------------------ aBoxInfoItem.SetValid( VALID_TOP, !IS_DONT_CARE( pFrameSel->GetTop() ) ); aBoxInfoItem.SetValid( VALID_BOTTOM, !IS_DONT_CARE( pFrameSel->GetBottom() ) ); aBoxInfoItem.SetValid( VALID_LEFT, !IS_DONT_CARE( pFrameSel->GetLeft() ) ); aBoxInfoItem.SetValid( VALID_RIGHT, !IS_DONT_CARE( pFrameSel->GetRight() ) ); aBoxInfoItem.SetValid( VALID_HORI, !IS_DONT_CARE( pFrameSel->GetHor() ) ); aBoxInfoItem.SetValid( VALID_VERT, !IS_DONT_CARE( pFrameSel->GetVer() ) ); // // Put oder Clear der Umrandung? // bPut = TRUE; if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nBoxWhich, FALSE ) || SFX_ITEM_DEFAULT == rOldSet.GetItemState( nBoxInfoWhich, FALSE ) ) { const SvxBoxInfoItem& rOldBoxInfo = (const SvxBoxInfoItem&) rOldSet.Get(nBoxInfoWhich); aBoxInfoItem.SetMinDist( rOldBoxInfo.IsMinDist() ); aBoxInfoItem.SetDefDist( rOldBoxInfo.GetDefDist() ); bPut = ( (aBoxItem != (const SvxBoxItem&)(rOldSet.Get(nBoxWhich))) || (aBoxInfoItem != rOldBoxInfo ) ); } if ( bPut ) { if ( !pOldBoxItem || !( *pOldBoxItem == aBoxItem ) ) { rCoreAttrs.Put( aBoxItem ); bAttrsChanged |= TRUE; } pOld = GetOldItem( rCoreAttrs, SID_ATTR_BORDER_INNER ); if ( !pOld || !( *(const SvxBoxInfoItem*)pOld == aBoxInfoItem ) ) { rCoreAttrs.Put( aBoxInfoItem ); bAttrsChanged |= TRUE; } } else { rCoreAttrs.ClearItem( nBoxWhich ); rCoreAttrs.ClearItem( nBoxInfoWhich ); } //--------- // Schatten //--------- aShadowItem.SetColor( TpBorderRGBColor( pFrameSel->GetShadowColor() ) ); aShadowItem.SetWidth( (USHORT)GetCoreValue( aEdShadowSize, eCoreUnit ) ); SvxShadowLocation eLoc = SVX_SHADOW_NONE; switch ( pFrameSel->GetShadowPos() ) { case SVX_FRMSHADOW_BOT_RIGHT: eLoc = SVX_SHADOW_BOTTOMRIGHT; break; case SVX_FRMSHADOW_TOP_RIGHT: eLoc = SVX_SHADOW_TOPRIGHT; break; case SVX_FRMSHADOW_BOT_LEFT: eLoc = SVX_SHADOW_BOTTOMLEFT; break; case SVX_FRMSHADOW_TOP_LEFT: eLoc = SVX_SHADOW_TOPLEFT; break; } aShadowItem.SetLocation( eLoc ); // // Put oder Clear des Schattens? // bPut = TRUE; if ( SFX_ITEM_DEFAULT == rOldSet.GetItemState( nShadowWhich, FALSE ) ) { const SvxShadowItem& rOldShadowItem = (const SvxShadowItem&)(rOldSet.Get( nShadowWhich )); // der Vergleich von Brushes haut nicht hin, deshalb einzeln: if ( ( aShadowItem.GetWidth() == rOldShadowItem.GetWidth() ) && ( aShadowItem.GetLocation() == rOldShadowItem.GetLocation() ) ) { Color aCol = aShadowItem.GetColor(); Color aOldCol = rOldShadowItem.GetColor(); bPut = ( aCol.GetRed() != aOldCol.GetRed() || aCol.GetGreen() != aOldCol.GetGreen() || aCol.GetBlue() != aOldCol.GetBlue() ); } } if ( bPut ) { if ( aShadowItem.GetLocation() == SVX_SHADOW_NONE ) { // wenn kein Schatten ausgewaehlt wurde, wird das // Default-Item genommen: const SfxItemPool* pPool = rCoreAttrs.GetPool(); if ( pPool->IsInRange( nShadowWhich ) ) aShadowItem = (const SvxShadowItem&)pPool->GetDefaultItem( nShadowWhich ); } pOld = GetOldItem( rCoreAttrs, SID_ATTR_BORDER_SHADOW ); if ( !pOld || !( *(const SvxShadowItem*)pOld == aShadowItem ) ) { rCoreAttrs.Put( aShadowItem ); bAttrsChanged |= TRUE; } } else rCoreAttrs.ClearItem( nShadowWhich ); return bAttrsChanged; } #undef IS_DONT_CARE // ----------------------------------------------------------------------- void SvxBorderTabPage::HideShadowControls() { aFtShadowPos.Hide(); aWndShadows.Hide(); aFtShadowSize.Hide(); aEdShadowSize.Hide(); aFtShadowColor.Hide(); aLbShadowColor.Hide(); aGbShadow.Hide(); } // ----------------------------------------------------------------------- IMPL_LINK( SvxBorderTabPage, SelPreHdl_Impl, void *, EMPTYARG ) { USHORT nSelId = aWndPresets.GetSelectItemId(); SvxLineStruct theNewStyle; if ( nSelId > 1 ) if ( aLbLineStyle.GetSelectEntryPos() == 0 || aLbLineStyle.GetSelectEntryPos() == LISTBOX_ENTRY_NOTFOUND ) aLbLineStyle.SelectEntryPos( 1 ); theNewStyle.nLeft = (short)aLbLineStyle.GetSelectEntryLine1(); theNewStyle.nMiddle = (short)aLbLineStyle.GetSelectEntryDistance(); theNewStyle.nRight = (short)aLbLineStyle.GetSelectEntryLine2(); switch ( nSelId ) { case 1: // keine Linien { pFrameSel->ShowShadow(); pFrameSel->HideLines(); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); } break; case 2: // aussen { pFrameSel->HideLines(); pFrameSel->GetLeft() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetRight() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetTop() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetBottom().SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); pFrameSel->SelectLine( SVX_FRMSELLINE_LEFT ); pFrameSel->SelectLine( SVX_FRMSELLINE_RIGHT ); pFrameSel->SelectLine( SVX_FRMSELLINE_TOP ); pFrameSel->SelectLine( SVX_FRMSELLINE_BOTTOM ); } break; case 3: { if ( bIsTableBorder ) // aussen/horizontal { pFrameSel->HideLines(); pFrameSel->GetLeft() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetRight() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetTop() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetBottom().SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetHor() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); pFrameSel->SelectLine( SVX_FRMSELLINE_LEFT ); pFrameSel->SelectLine( SVX_FRMSELLINE_RIGHT ); pFrameSel->SelectLine( SVX_FRMSELLINE_TOP ); pFrameSel->SelectLine( SVX_FRMSELLINE_BOTTOM ); pFrameSel->SelectLine( SVX_FRMSELLINE_HOR ); } else // links/rechts { pFrameSel->HideLines(); pFrameSel->GetLeft() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetRight().SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); pFrameSel->SelectLine( SVX_FRMSELLINE_LEFT ); pFrameSel->SelectLine( SVX_FRMSELLINE_RIGHT ); } } break; case 4: { if ( bIsTableBorder ) // aussen/hor./ver. { pFrameSel->HideLines(); pFrameSel->GetLeft() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetRight() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetTop() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetBottom().SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetHor() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetVer() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); pFrameSel->SelectLine( SVX_FRMSELLINE_LEFT ); pFrameSel->SelectLine( SVX_FRMSELLINE_RIGHT ); pFrameSel->SelectLine( SVX_FRMSELLINE_TOP ); pFrameSel->SelectLine( SVX_FRMSELLINE_BOTTOM ); pFrameSel->SelectLine( SVX_FRMSELLINE_HOR ); pFrameSel->SelectLine( SVX_FRMSELLINE_VER ); } else // oben/unten { pFrameSel->HideLines(); pFrameSel->GetTop() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetBottom().SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); pFrameSel->SelectLine( SVX_FRMSELLINE_TOP ); pFrameSel->SelectLine( SVX_FRMSELLINE_BOTTOM ); } } break; case 5: { if ( bIsTableBorder ) // Aussen setzen, innen Don't Care { pFrameSel->HideLines(); pFrameSel->GetLeft() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetRight() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetTop() .SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetBottom().SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->GetHor() .SetState( SVX_FRMLINESTATE_DONT_CARE ); pFrameSel->GetVer() .SetState( SVX_FRMLINESTATE_DONT_CARE ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); pFrameSel->SelectLine( SVX_FRMSELLINE_LEFT ); pFrameSel->SelectLine( SVX_FRMSELLINE_RIGHT ); pFrameSel->SelectLine( SVX_FRMSELLINE_TOP ); pFrameSel->SelectLine( SVX_FRMSELLINE_BOTTOM ); } else // links (Absatz-Markierung) { pFrameSel->HideLines(); pFrameSel->GetLeft().SetState( SVX_FRMLINESTATE_SHOW ); pFrameSel->SelectLine( SVX_FRMSELLINE_NONE ); pFrameSel->SelectLine( SVX_FRMSELLINE_LEFT ); } } break; } pFrameSel->SetCurLineStyle( theNewStyle ); pFrameSel->SetCurLineColor( aLbLineColor.GetSelectEntryColor() ); pFrameSel->SetShadowColor( aLbShadowColor.GetSelectEntryColor() ); pFrameSel->ShowLines(); pFrameSel->ShowShadow(); aWndPresets.SetNoSelection(); // Nur Auswahl, kein Status LinesChanged_Impl(0); return 0; } // ----------------------------------------------------------------------- IMPL_LINK( SvxBorderTabPage, SelSdwHdl_Impl, void *, EMPTYARG ) { BOOL bEnable = aWndShadows.GetSelectItemId() > 1; aFtShadowSize.Enable(bEnable); aEdShadowSize.Enable(bEnable); SvxFrameShadow ePos = SVX_FRMSHADOW_NONE; // case 1 switch ( aWndShadows.GetSelectItemId() ) { case 2: ePos = SVX_FRMSHADOW_BOT_RIGHT; break; case 3: ePos = SVX_FRMSHADOW_TOP_RIGHT; break; case 4: ePos = SVX_FRMSHADOW_BOT_LEFT; break; case 5: ePos = SVX_FRMSHADOW_TOP_LEFT; break; } pFrameSel->SetShadowPos( ePos ); pFrameSel->ShowShadow(); return 0; } // ----------------------------------------------------------------------- IMPL_LINK( SvxBorderTabPage, SelColHdl_Impl, ListBox *, pLb ) { ColorListBox* pColLb = (ColorListBox*)pLb; if ( pLb == &aLbLineColor ) { pFrameSel->SetCurLineColor( pColLb->GetSelectEntryColor() ); aLbLineStyle.SetColor( pColLb->GetSelectEntryColor() ); pFrameSel->ShowLines(); } else if ( pLb == &aLbShadowColor ) { pFrameSel->SetShadowColor( pColLb->GetSelectEntryColor() ); pFrameSel->ShowShadow(); } return 0; } // ----------------------------------------------------------------------- IMPL_LINK( SvxBorderTabPage, SelStyleHdl_Impl, ListBox *, pLb ) { if ( pLb == &aLbLineStyle ) { SvxLineStruct theNewStyle; theNewStyle.nLeft = (short)aLbLineStyle.GetSelectEntryLine1(); theNewStyle.nMiddle = (short)aLbLineStyle.GetSelectEntryDistance(); theNewStyle.nRight = (short)aLbLineStyle.GetSelectEntryLine2(); pFrameSel->SetCurLineStyle( theNewStyle ); pFrameSel->ShowLines(); } return 0; } // ----------------------------------------------------------------------- void SvxBorderTabPage::FillValueSets_Impl() { ImageList aIlPre( ResId( IL_PRE_BITMAPS ) ); ImageList aIlSdw( ResId( IL_SDW_BITMAPS ) ); Size aItemSize = aIlPre.GetImage(IID_PRENONE).GetSizePixel(); Size aGbSize( aGbPresets.GetSizePixel() ); Size aSize; long nXpos = aGbPresets.GetPosPixel().X(); long nYpos = aGbPresets.GetPosPixel().Y(); // Presets: aGbSize.Height() -= 12; aWndPresets.SetColCount( 5 ); aWndPresets.SetStyle( aWndPresets.GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER ); aSize = aWndPresets.CalcWindowSizePixel( aItemSize ); nXpos += ( aGbSize.Width() > aSize.Width()+4 ) ? ((aGbSize.Width()-aSize.Width())/2) : 2; nYpos += ( aGbSize.Height() > aSize.Height()+4 ) ? ((aGbSize.Height()-aSize.Height())/2) : 2; aWndPresets.SetPosSizePixel( Point( nXpos, nYpos+12 ), aSize ); aWndPresets.InsertItem( 1, aIlPre.GetImage(IID_PRENONE) ); if ( bIsTableBorder ) { aWndPresets.InsertItem( 2, aIlPre.GetImage(IID_TABLE_PRE1) ); aWndPresets.InsertItem( 3, aIlPre.GetImage(IID_TABLE_PRE2) ); aWndPresets.InsertItem( 4, aIlPre.GetImage(IID_TABLE_PRE3) ); aWndPresets.InsertItem( 5, aIlPre.GetImage(IID_TABLE_PRE4) ); } else { aWndPresets.InsertItem( 2, aIlPre.GetImage(IID_PARAGRAPH_PRE1) ); aWndPresets.InsertItem( 3, aIlPre.GetImage(IID_PARAGRAPH_PRE2) ); aWndPresets.InsertItem( 4, aIlPre.GetImage(IID_PARAGRAPH_PRE3) ); aWndPresets.InsertItem( 5, aIlPre.GetImage(IID_PARAGRAPH_PRE4) ); } aWndPresets.SetNoSelection(); aWndPresets.Show(); // Schatten: --------------------------------------------------------- aWndShadows.SetColCount( 5 ); aWndShadows.SetStyle( aWndShadows.GetStyle() | WB_ITEMBORDER | WB_DOUBLEBORDER ); aSize = aWndShadows.CalcWindowSizePixel( aItemSize ); nXpos = aFtShadowPos.GetPosPixel().X(); nYpos = aFtShadowPos.GetPosPixel().Y() + aFtShadowPos.GetSizePixel().Height() + 3; aWndShadows.SetPosSizePixel( Point( nXpos, nYpos ), aSize ); aWndShadows.SetColCount( 5 ); aWndShadows.InsertItem( 1, aIlSdw.GetImage(IID_SHADOWNONE) ); aWndShadows.InsertItem( 2, aIlSdw.GetImage(IID_SHADOW_BOT_RIGHT) ); aWndShadows.InsertItem( 3, aIlSdw.GetImage(IID_SHADOW_TOP_RIGHT) ); aWndShadows.InsertItem( 4, aIlSdw.GetImage(IID_SHADOW_BOT_LEFT) ); aWndShadows.InsertItem( 5, aIlSdw.GetImage(IID_SHADOW_TOP_LEFT) ); aWndShadows.SelectItem( 1 ); aWndShadows.Show(); } // ----------------------------------------------------------------------- void SvxBorderTabPage::FillLineListBox_Impl() { aLbLineStyle.SetUnit( FUNIT_POINT ); aLbLineStyle.SetSourceUnit( FUNIT_TWIP ); // Writer 2.0 Defaults: aLbLineStyle.InsertEntry( SVX_RESSTR( STR_NONE ) ); aLbLineStyle.InsertEntry( LINE_WIDTH0 ); aLbLineStyle.InsertEntry( LINE_WIDTH1 ); aLbLineStyle.InsertEntry( LINE_WIDTH2 ); aLbLineStyle.InsertEntry( LINE_WIDTH3 ); aLbLineStyle.InsertEntry( LINE_WIDTH4 ); // OS: wenn hier neue Linienstaerken zugfuegt werden, dann // LINESTYLE_HTML_MAX anpassen aLbLineStyle.InsertEntry( DLINE0_OUT, DLINE0_IN, DLINE0_DIST ); aLbLineStyle.InsertEntry( DLINE7_OUT, DLINE7_IN, DLINE7_DIST ); aLbLineStyle.InsertEntry( DLINE1_OUT, DLINE1_IN, DLINE1_DIST ); aLbLineStyle.InsertEntry( DLINE2_OUT, DLINE2_IN, DLINE2_DIST ); aLbLineStyle.InsertEntry( DLINE8_OUT, DLINE8_IN, DLINE8_DIST ); aLbLineStyle.InsertEntry( DLINE9_OUT, DLINE9_IN, DLINE9_DIST ); aLbLineStyle.InsertEntry( DLINE10_OUT,DLINE10_IN,DLINE10_DIST); aLbLineStyle.InsertEntry( DLINE3_OUT, DLINE3_IN, DLINE3_DIST ); aLbLineStyle.InsertEntry( DLINE4_OUT, DLINE4_IN, DLINE4_DIST ); aLbLineStyle.InsertEntry( DLINE5_OUT, DLINE5_IN, DLINE5_DIST ); aLbLineStyle.InsertEntry( DLINE6_OUT, DLINE6_IN, DLINE6_DIST ); } // ----------------------------------------------------------------------- IMPL_LINK( SvxBorderTabPage, LinesChanged_Impl, void*, EMPTYARG ) { if(pDistDlg) { BOOL bLineSet = pFrameSel->IsAnyLineSet(); BOOL bMinAllowed = nSWMode & SW_BORDER_MODE_FRAME; BOOL bSpaceModified = pDistDlg->aLeftMF .IsModified()|| pDistDlg->aRightMF .IsModified()|| pDistDlg->aTopMF .IsModified()|| pDistDlg->aBottomMF.IsModified(); if(bLineSet) { if(bMinAllowed) { if(!bSpaceModified) { pDistDlg->aLeftMF .SetValue(nMinValue); pDistDlg->aRightMF .SetValue(nMinValue); pDistDlg->aTopMF .SetValue(nMinValue); pDistDlg->aBottomMF.SetValue(nMinValue); } } else { pDistDlg->aLeftMF .SetMin(nMinValue); pDistDlg->aRightMF .SetMin(nMinValue); pDistDlg->aTopMF .SetMin(nMinValue); pDistDlg->aBottomMF.SetMin(nMinValue); pDistDlg->aLeftMF .SetFirst(nMinValue); pDistDlg->aRightMF .SetFirst(nMinValue); pDistDlg->aTopMF .SetFirst(nMinValue); pDistDlg->aBottomMF.SetFirst(nMinValue); } } else { pDistDlg->aLeftMF .SetMin(0); pDistDlg->aRightMF .SetMin(0); pDistDlg->aTopMF .SetMin(0); pDistDlg->aBottomMF.SetMin(0); pDistDlg->aLeftMF .SetFirst(0); pDistDlg->aRightMF .SetFirst(0); pDistDlg->aTopMF .SetFirst(0); pDistDlg->aBottomMF.SetFirst(0); if(!bSpaceModified) { pDistDlg->aLeftMF .SetValue(0); pDistDlg->aRightMF .SetValue(0); pDistDlg->aTopMF .SetValue(0); pDistDlg->aBottomMF.SetValue(0); } } //fuer Tabellen ist alles erlaubt USHORT nValid = VALID_TOP|VALID_BOTTOM|VALID_LEFT|VALID_RIGHT; //fuer Rahmen und Absatz wird das Edit disabled, wenn keine Border gesetzt ist if(nSWMode & (SW_BORDER_MODE_FRAME|SW_BORDER_MODE_PARA)) { aDistancePB.Enable(bLineSet); nValid = pFrameSel->GetTop().GetState() == SVX_FRMLINESTATE_SHOW ? VALID_TOP : 0; nValid |= pFrameSel->GetBottom().GetState() == SVX_FRMLINESTATE_SHOW ? VALID_BOTTOM : 0; nValid |= pFrameSel->GetLeft().GetState() == SVX_FRMLINESTATE_SHOW ? VALID_LEFT : 0; nValid |= pFrameSel->GetRight().GetState() == SVX_FRMLINESTATE_SHOW ? VALID_RIGHT : 0; } pDistDlg->SetValid(nValid); } return 0; } // ----------------------------------------------------------------------- IMPL_LINK( SvxBorderTabPage, DistanceHdl_Impl, PushButton*, pBtn ) { pDistDlg->Execute(); return 0; } // ----------------------------------------------------------------------- void SvxBorderTabPage::SetSWMode(BYTE nSet) { //#define SW_BORDER_MODE_PARA 0x01 //#define SW_BORDER_MODE_TABLE 0x02 //#define SW_BORDER_MODE_FRAME 0x04 nSWMode = nSet; } #undef EQSTYLE #undef SET_STYLE