/* -*- 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include // for RID_SVXPAGE_GRFCROP #define CM_1_TO_TWIP 567 inline long lcl_GetValue( MetricField& rMetric, FieldUnit eUnit ) { return static_cast(rMetric.Denormalize( rMetric.GetValue( eUnit ))); } /*-------------------------------------------------------------------- Beschreibung: Grafik zuschneiden --------------------------------------------------------------------*/ SvxGrfCropPage::SvxGrfCropPage ( Window *pParent, const SfxItemSet &rSet ) : SfxTabPage( pParent, CUI_RES( RID_SVXPAGE_GRFCROP ), rSet ), aCropFL( this, CUI_RES( FL_CROP )), aZoomConstRB( this, CUI_RES( RB_ZOOMCONST)), aSizeConstRB( this, CUI_RES( RB_SIZECONST)), aLeftFT( this, CUI_RES( FT_LEFT )), aLeftMF( this, CUI_RES( MF_LEFT )), aRightFT( this, CUI_RES( FT_RIGHT )), aRightMF( this, CUI_RES( MF_RIGHT )), aTopFT( this, CUI_RES( FT_TOP )), aTopMF( this, CUI_RES( MF_TOP )), aBottomFT( this, CUI_RES( FT_BOTTOM )), aBottomMF( this, CUI_RES( MF_BOTTOM )), aZoomFL( this, CUI_RES( FL_ZOOM )), aWidthZoomFT( this, CUI_RES( FT_WIDTHZOOM )), aWidthZoomMF( this, CUI_RES( MF_WIDTHZOOM )), aHeightZoomFT( this, CUI_RES( FT_HEIGHTZOOM)), aHeightZoomMF( this, CUI_RES( MF_HEIGHTZOOM)), aSizeFL( this, CUI_RES( FL_SIZE )), aWidthFT( this, CUI_RES( FT_WIDTH )), aWidthMF( this, CUI_RES( MF_WIDTH )), aHeightFT( this, CUI_RES( FT_HEIGHT )), aHeightMF( this, CUI_RES( MF_HEIGHT )), aOrigSizeFT( this, CUI_RES(FT_ORIG_SIZE)), aOrigSizePB( this, CUI_RES( PB_ORGSIZE )), aExampleWN( this, CUI_RES( WN_BSP )), pLastCropField(0), bInitialized(sal_False), bSetOrigSize(sal_False) { FreeResource(); SetExchangeSupport(); // set the correct metric const FieldUnit eMetric = GetModuleFieldUnit( rSet ); SetFieldUnit( aWidthMF, eMetric ); SetFieldUnit( aHeightMF, eMetric ); SetFieldUnit( aLeftMF, eMetric ); SetFieldUnit( aRightMF, eMetric ); SetFieldUnit( aTopMF , eMetric ); SetFieldUnit( aBottomMF, eMetric ); Link aLk = LINK(this, SvxGrfCropPage, SizeHdl); aWidthMF.SetModifyHdl( aLk ); aHeightMF.SetModifyHdl( aLk ); aLk = LINK(this, SvxGrfCropPage, ZoomHdl); aWidthZoomMF.SetModifyHdl( aLk ); aHeightZoomMF.SetModifyHdl( aLk ); aLk = LINK(this, SvxGrfCropPage, CropHdl); aLeftMF.SetDownHdl( aLk ); aRightMF.SetDownHdl( aLk ); aTopMF.SetDownHdl( aLk ); aBottomMF.SetDownHdl( aLk ); aLeftMF.SetUpHdl( aLk ); aRightMF.SetUpHdl( aLk ); aTopMF.SetUpHdl( aLk ); aBottomMF.SetUpHdl( aLk ); aLk = LINK(this, SvxGrfCropPage, CropModifyHdl); aLeftMF.SetModifyHdl( aLk ); aRightMF.SetModifyHdl( aLk ); aTopMF.SetModifyHdl( aLk ); aBottomMF.SetModifyHdl( aLk ); aLk = LINK(this, SvxGrfCropPage, CropLoseFocusHdl); aLeftMF.SetLoseFocusHdl( aLk ); aRightMF.SetLoseFocusHdl( aLk ); aTopMF.SetLoseFocusHdl( aLk ); aBottomMF.SetLoseFocusHdl( aLk ); aLk = LINK(this, SvxGrfCropPage, OrigSizeHdl); aOrigSizePB.SetClickHdl( aLk ); aTimer.SetTimeoutHdl(LINK(this, SvxGrfCropPage, Timeout)); aTimer.SetTimeout( 1500 ); aOrigSizePB.SetAccessibleRelationLabeledBy( &aOrigSizeFT ); } SvxGrfCropPage::~SvxGrfCropPage() { aTimer.Stop(); } SfxTabPage* SvxGrfCropPage::Create(Window *pParent, const SfxItemSet &rSet) { return new SvxGrfCropPage( pParent, rSet ); } void SvxGrfCropPage::Reset( const SfxItemSet &rSet ) { const SfxPoolItem* pItem; const SfxItemPool& rPool = *rSet.GetPool(); if(SFX_ITEM_SET == rSet.GetItemState( rPool.GetWhich( SID_ATTR_GRAF_KEEP_ZOOM ), sal_True, &pItem )) { if( ((const SfxBoolItem*)pItem)->GetValue() ) aZoomConstRB.Check(); else aSizeConstRB.Check(); aZoomConstRB.SaveValue(); } sal_uInt16 nW = rPool.GetWhich( SID_ATTR_GRAF_CROP ); if( SFX_ITEM_SET == rSet.GetItemState( nW, sal_True, &pItem)) { FieldUnit eUnit = MapToFieldUnit( rSet.GetPool()->GetMetric( nW )); SvxGrfCrop* pCrop = (SvxGrfCrop*)pItem; aExampleWN.SetLeft( pCrop->GetLeft()); aExampleWN.SetRight( pCrop->GetRight()); aExampleWN.SetTop( pCrop->GetTop()); aExampleWN.SetBottom( pCrop->GetBottom()); aLeftMF.SetValue( aLeftMF.Normalize( pCrop->GetLeft()), eUnit ); aRightMF.SetValue( aRightMF.Normalize( pCrop->GetRight()), eUnit ); aTopMF.SetValue( aTopMF.Normalize( pCrop->GetTop()), eUnit ); aBottomMF.SetValue( aBottomMF.Normalize( pCrop->GetBottom()), eUnit ); } else { aLeftMF.SetValue( 0 ); aRightMF.SetValue( 0 ); aTopMF.SetValue( 0 ); aBottomMF.SetValue( 0 ); } nW = rPool.GetWhich( SID_ATTR_PAGE_SIZE ); if ( SFX_ITEM_SET == rSet.GetItemState( nW, sal_False, &pItem ) ) { // Orientation und Size aus dem PageItem FieldUnit eUnit = MapToFieldUnit( rSet.GetPool()->GetMetric( nW )); aPageSize = ((const SvxSizeItem*)pItem)->GetSize(); sal_Int64 nTmp = aHeightMF.Normalize(aPageSize.Height()); aHeightMF.SetMax( nTmp, eUnit ); nTmp = aWidthMF.Normalize(aPageSize.Width()); aWidthMF.SetMax( nTmp, eUnit ); nTmp = aWidthMF.Normalize( 23 ); aHeightMF.SetMin( nTmp, eUnit ); aWidthMF.SetMin( nTmp, eUnit ); } else { aPageSize = OutputDevice::LogicToLogic( Size( CM_1_TO_TWIP, CM_1_TO_TWIP ), MapMode( MAP_TWIP ), MapMode( (MapUnit)rSet.GetPool()->GetMetric( nW ) ) ); } sal_Bool bFound = sal_False; if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_GRAF_GRAPHIC, sal_False, &pItem ) ) { const Graphic* pGrf = ((SvxBrushItem*)pItem)->GetGraphic(); if( pGrf ) aOrigSize = GetGrfOrigSize( *pGrf ); if( aOrigSize.Width() && aOrigSize.Height() ) { CalcMinMaxBorder(); aExampleWN.SetGraphic( *pGrf ); aExampleWN.SetFrameSize( aOrigSize ); bFound = sal_True; if( ((SvxBrushItem*)pItem)->GetGraphicLink() ) aGraphicName = *((SvxBrushItem*)pItem)->GetGraphicLink(); } } GraphicHasChanged( bFound ); bReset = sal_True; ActivatePage( rSet ); bReset = sal_False; } sal_Bool SvxGrfCropPage::FillItemSet(SfxItemSet &rSet) { const SfxItemPool& rPool = *rSet.GetPool(); sal_Bool bModified = sal_False; if( aWidthMF.GetSavedValue() != aWidthMF.GetText() || aHeightMF.GetSavedValue() != aHeightMF.GetText() ) { sal_uInt16 nW = rPool.GetWhich( SID_ATTR_GRAF_FRMSIZE ); FieldUnit eUnit = MapToFieldUnit( rSet.GetPool()->GetMetric( nW )); SvxSizeItem aSz( nW ); // die Groesse koennte schon von einer anderen Page gesetzt worden sein // #44204# const SfxItemSet* pExSet = GetTabDialog() ? GetTabDialog()->GetExampleSet() : NULL; const SfxPoolItem* pItem = 0; if( pExSet && SFX_ITEM_SET == pExSet->GetItemState( nW, sal_False, &pItem ) ) aSz = *(const SvxSizeItem*)pItem; else aSz = (const SvxSizeItem&)GetItemSet().Get( nW ); Size aTmpSz( aSz.GetSize() ); if( aWidthMF.GetText() != aWidthMF.GetSavedValue() ) aTmpSz.Width() = lcl_GetValue( aWidthMF, eUnit ); if( aHeightMF.GetText() != aHeightMF.GetSavedValue() ) aTmpSz.Height() = lcl_GetValue( aHeightMF, eUnit ); aSz.SetSize( aTmpSz ); aWidthMF.SaveValue(); aHeightMF.SaveValue(); bModified |= 0 != rSet.Put( aSz ); if( bSetOrigSize ) { bModified |= 0 != rSet.Put( SvxSizeItem( rPool.GetWhich( SID_ATTR_GRAF_FRMSIZE_PERCENT ), Size( 0, 0 )) ); } } if( aLeftMF.IsModified() || aRightMF.IsModified() || aTopMF.IsModified() || aBottomMF.IsModified() ) { sal_uInt16 nW = rPool.GetWhich( SID_ATTR_GRAF_CROP ); FieldUnit eUnit = MapToFieldUnit( rSet.GetPool()->GetMetric( nW )); SvxGrfCrop* pNew = (SvxGrfCrop*)rSet.Get( nW ).Clone(); pNew->SetLeft( lcl_GetValue( aLeftMF, eUnit ) ); pNew->SetRight( lcl_GetValue( aRightMF, eUnit ) ); pNew->SetTop( lcl_GetValue( aTopMF, eUnit ) ); pNew->SetBottom( lcl_GetValue( aBottomMF, eUnit ) ); bModified |= 0 != rSet.Put( *pNew ); delete pNew; } if( aZoomConstRB.GetSavedValue() != aZoomConstRB.IsChecked() ) { bModified |= 0 != rSet.Put( SfxBoolItem( rPool.GetWhich( SID_ATTR_GRAF_KEEP_ZOOM), aZoomConstRB.IsChecked() ) ); } bInitialized = sal_False; return bModified; } void SvxGrfCropPage::ActivatePage(const SfxItemSet& rSet) { #ifdef DBG_UTIL SfxItemPool* pPool = GetItemSet().GetPool(); DBG_ASSERT( pPool, "Wo ist der Pool" ); #endif bSetOrigSize = sal_False; // Size Size aSize; const SfxPoolItem* pItem; if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_GRAF_FRMSIZE, sal_False, &pItem ) ) aSize = ((const SvxSizeItem*)pItem)->GetSize(); nOldWidth = aSize.Width(); nOldHeight = aSize.Height(); sal_Int64 nWidth = aWidthMF.Normalize(nOldWidth); sal_Int64 nHeight = aHeightMF.Normalize(nOldHeight); if (nWidth != aWidthMF.GetValue(FUNIT_TWIP)) { if(!bReset) { // Wert wurde von Umlauf-Tabpage geaendert und muss // mit Modify-Flag gesetzt werden aWidthMF.SetUserValue(nWidth, FUNIT_TWIP); } else aWidthMF.SetValue(nWidth, FUNIT_TWIP); } aWidthMF.SaveValue(); if (nHeight != aHeightMF.GetValue(FUNIT_TWIP)) { if (!bReset) { // Wert wurde von Umlauf-Tabpage geaendert und muss // mit Modify-Flag gesetzt werden aHeightMF.SetUserValue(nHeight, FUNIT_TWIP); } else aHeightMF.SetValue(nHeight, FUNIT_TWIP); } aHeightMF.SaveValue(); bInitialized = sal_True; if( SFX_ITEM_SET == rSet.GetItemState( SID_ATTR_GRAF_GRAPHIC, sal_False, &pItem ) ) { const SvxBrushItem& rBrush = *(SvxBrushItem*)pItem; if( rBrush.GetGraphicLink() && aGraphicName != *rBrush.GetGraphicLink() ) aGraphicName = *rBrush.GetGraphicLink(); const Graphic* pGrf = rBrush.GetGraphic(); if( pGrf ) { aExampleWN.SetGraphic( *pGrf ); aOrigSize = GetGrfOrigSize( *pGrf ); aExampleWN.SetFrameSize(aOrigSize); GraphicHasChanged( aOrigSize.Width() && aOrigSize.Height() ); CalcMinMaxBorder(); } else GraphicHasChanged( sal_False ); } CalcZoom(); } int SvxGrfCropPage::DeactivatePage(SfxItemSet *_pSet) { if ( _pSet ) FillItemSet( *_pSet ); return sal_True; } /*-------------------------------------------------------------------- Beschreibung: Massstab geaendert, Groesse anpassen --------------------------------------------------------------------*/ IMPL_LINK( SvxGrfCropPage, ZoomHdl, MetricField *, pField ) { SfxItemPool* pPool = GetItemSet().GetPool(); DBG_ASSERT( pPool, "Wo ist der Pool" ); FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich( SID_ATTR_GRAF_CROP ) ) ); if( pField == &aWidthZoomMF ) { long nLRBorders = lcl_GetValue(aLeftMF, eUnit) +lcl_GetValue(aRightMF, eUnit); aWidthMF.SetValue( aWidthMF.Normalize( ((aOrigSize.Width() - nLRBorders) * pField->GetValue())/100L), eUnit); } else { long nULBorders = lcl_GetValue(aTopMF, eUnit) +lcl_GetValue(aBottomMF, eUnit); aHeightMF.SetValue( aHeightMF.Normalize( ((aOrigSize.Height() - nULBorders ) * pField->GetValue())/100L) , eUnit ); } return 0; } /*-------------------------------------------------------------------- Beschreibung: Groesse aendern, Massstab anpassen --------------------------------------------------------------------*/ IMPL_LINK( SvxGrfCropPage, SizeHdl, MetricField *, pField ) { SfxItemPool* pPool = GetItemSet().GetPool(); DBG_ASSERT( pPool, "Wo ist der Pool" ); FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich( SID_ATTR_GRAF_CROP ) ) ); Size aSize( lcl_GetValue(aWidthMF, eUnit), lcl_GetValue(aHeightMF, eUnit) ); if(pField == &aWidthMF) { long nWidth = aOrigSize.Width() - ( lcl_GetValue(aLeftMF, eUnit) + lcl_GetValue(aRightMF, eUnit) ); if(!nWidth) nWidth++; sal_uInt16 nZoom = (sal_uInt16)( aSize.Width() * 100L / nWidth); aWidthZoomMF.SetValue(nZoom); } else { long nHeight = aOrigSize.Height() - ( lcl_GetValue(aTopMF, eUnit) + lcl_GetValue(aBottomMF, eUnit)); if(!nHeight) nHeight++; sal_uInt16 nZoom = (sal_uInt16)( aSize.Height() * 100L/ nHeight); aHeightZoomMF.SetValue(nZoom); } return 0; } /*-------------------------------------------------------------------- Beschreibung: Raender auswerten --------------------------------------------------------------------*/ IMPL_LINK( SvxGrfCropPage, CropHdl, const MetricField *, pField ) { SfxItemPool* pPool = GetItemSet().GetPool(); DBG_ASSERT( pPool, "Wo ist der Pool" ); FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich( SID_ATTR_GRAF_CROP ) ) ); sal_Bool bZoom = aZoomConstRB.IsChecked(); if( pField == &aLeftMF || pField == &aRightMF ) { long nLeft = lcl_GetValue( aLeftMF, eUnit ); long nRight = lcl_GetValue( aRightMF, eUnit ); long nWidthZoom = static_cast(aWidthZoomMF.GetValue()); if(bZoom && ( ( ( aOrigSize.Width() - (nLeft + nRight )) * nWidthZoom ) / 100 >= aPageSize.Width() ) ) { if(pField == &aLeftMF) { nLeft = aOrigSize.Width() - ( aPageSize.Width() * 100 / nWidthZoom + nRight ); aLeftMF.SetValue( aLeftMF.Normalize( nLeft ), eUnit ); } else { nRight = aOrigSize.Width() - ( aPageSize.Width() * 100 / nWidthZoom + nLeft ); aRightMF.SetValue( aRightMF.Normalize( nRight ), eUnit ); } } aExampleWN.SetLeft(nLeft); aExampleWN.SetRight(nRight); if(bZoom) { //Massstab bleibt -> Breite neu berechnen ZoomHdl(&aWidthZoomMF); } } else { long nTop = lcl_GetValue( aTopMF, eUnit ); long nBottom = lcl_GetValue( aBottomMF, eUnit ); long nHeightZoom = static_cast(aHeightZoomMF.GetValue()); if(bZoom && ( ( ( aOrigSize.Height() - (nTop + nBottom )) * nHeightZoom) / 100 >= aPageSize.Height())) { if(pField == &aTopMF) { nTop = aOrigSize.Height() - ( aPageSize.Height() * 100 / nHeightZoom + nBottom); aTopMF.SetValue( aWidthMF.Normalize( nTop ), eUnit ); } else { nBottom = aOrigSize.Height() - ( aPageSize.Height() * 100 / nHeightZoom + nTop); aBottomMF.SetValue( aWidthMF.Normalize( nBottom ), eUnit ); } } aExampleWN.SetTop( nTop ); aExampleWN.SetBottom( nBottom ); if(bZoom) { //Massstab bleibt -> Hoehe neu berechnen ZoomHdl(&aHeightZoomMF); } } aExampleWN.Invalidate(); //Groesse und Raender veraendert -> Massstab neu berechnen if(!bZoom) CalcZoom(); CalcMinMaxBorder(); return 0; } /*-------------------------------------------------------------------- Beschreibung: Originalgroesse einstellen --------------------------------------------------------------------*/ IMPL_LINK( SvxGrfCropPage, OrigSizeHdl, PushButton *, EMPTYARG ) { SfxItemPool* pPool = GetItemSet().GetPool(); DBG_ASSERT( pPool, "Wo ist der Pool" ); FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich( SID_ATTR_GRAF_CROP ) ) ); long nWidth = aOrigSize.Width() - lcl_GetValue( aLeftMF, eUnit ) - lcl_GetValue( aRightMF, eUnit ); aWidthMF.SetValue( aWidthMF.Normalize( nWidth ), eUnit ); long nHeight = aOrigSize.Height() - lcl_GetValue( aTopMF, eUnit ) - lcl_GetValue( aBottomMF, eUnit ); aHeightMF.SetValue( aHeightMF.Normalize( nHeight ), eUnit ); aWidthZoomMF.SetValue(100); aHeightZoomMF.SetValue(100); bSetOrigSize = sal_True; return 0; } /*-------------------------------------------------------------------- Beschreibung: Massstab berechnen --------------------------------------------------------------------*/ void SvxGrfCropPage::CalcZoom() { SfxItemPool* pPool = GetItemSet().GetPool(); DBG_ASSERT( pPool, "Wo ist der Pool" ); FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich( SID_ATTR_GRAF_CROP ) ) ); long nWidth = lcl_GetValue( aWidthMF, eUnit ); long nHeight = lcl_GetValue( aHeightMF, eUnit ); long nLRBorders = lcl_GetValue( aLeftMF, eUnit ) + lcl_GetValue( aRightMF, eUnit ); long nULBorders = lcl_GetValue( aTopMF, eUnit ) + lcl_GetValue( aBottomMF, eUnit ); sal_uInt16 nZoom = 0; long nDen; if( (nDen = aOrigSize.Width() - nLRBorders) > 0) nZoom = (sal_uInt16)((( nWidth * 1000L / nDen )+5)/10); aWidthZoomMF.SetValue(nZoom); if( (nDen = aOrigSize.Height() - nULBorders) > 0) nZoom = (sal_uInt16)((( nHeight * 1000L / nDen )+5)/10); else nZoom = 0; aHeightZoomMF.SetValue(nZoom); } /*-------------------------------------------------------------------- Beschreibung: Minimal-/Maximalwerte fuer die Raender setzen --------------------------------------------------------------------*/ void SvxGrfCropPage::CalcMinMaxBorder() { SfxItemPool* pPool = GetItemSet().GetPool(); DBG_ASSERT( pPool, "Wo ist der Pool" ); FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich( SID_ATTR_GRAF_CROP ) ) ); long nR = lcl_GetValue(aRightMF, eUnit ); long nMinWidth = (aOrigSize.Width() * 10) /11; long nMin = nMinWidth - (nR >= 0 ? nR : 0); aLeftMF.SetMax( aLeftMF.Normalize(nMin), eUnit ); long nL = lcl_GetValue(aLeftMF, eUnit ); nMin = nMinWidth - (nL >= 0 ? nL : 0); aRightMF.SetMax( aRightMF.Normalize(nMin), eUnit ); long nUp = lcl_GetValue( aTopMF, eUnit ); long nMinHeight = (aOrigSize.Height() * 10) /11; nMin = nMinHeight - (nUp >= 0 ? nUp : 0); aBottomMF.SetMax( aBottomMF.Normalize(nMin), eUnit ); long nLow = lcl_GetValue(aBottomMF, eUnit ); nMin = nMinHeight - (nLow >= 0 ? nLow : 0); aTopMF.SetMax( aTopMF.Normalize(nMin), eUnit ); } /*-------------------------------------------------------------------- Beschreibung: Spinsize auf 1/20 der Originalgroesse setzen, FixedText mit der Originalgroesse fuellen --------------------------------------------------------------------*/ void SvxGrfCropPage::GraphicHasChanged( sal_Bool bFound ) { if( bFound ) { SfxItemPool* pPool = GetItemSet().GetPool(); DBG_ASSERT( pPool, "Wo ist der Pool" ); FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich( SID_ATTR_GRAF_CROP ) )); sal_Int64 nSpin = aLeftMF.Normalize(aOrigSize.Width()) / 20; nSpin = MetricField::ConvertValue( nSpin, aOrigSize.Width(), 0, eUnit, aLeftMF.GetUnit()); // Ist der Rand zu gross, wird er auf beiden Seiten auf 1/3 eingestellt. long nR = lcl_GetValue( aRightMF, eUnit ); long nL = lcl_GetValue( aLeftMF, eUnit ); if((nL + nR) < - aOrigSize.Width()) { long nVal = aOrigSize.Width() / -3; aRightMF.SetValue( aRightMF.Normalize( nVal ), eUnit ); aLeftMF.SetValue( aLeftMF.Normalize( nVal ), eUnit ); aExampleWN.SetLeft(nVal); aExampleWN.SetRight(nVal); } long nUp = lcl_GetValue(aTopMF, eUnit ); long nLow = lcl_GetValue(aBottomMF, eUnit ); if((nUp + nLow) < - aOrigSize.Height()) { long nVal = aOrigSize.Height() / -3; aTopMF.SetValue( aTopMF.Normalize( nVal ), eUnit ); aBottomMF.SetValue( aBottomMF.Normalize( nVal ), eUnit ); aExampleWN.SetTop(nVal); aExampleWN.SetBottom(nVal); } aLeftMF.SetSpinSize(nSpin); aRightMF.SetSpinSize(nSpin); nSpin = aTopMF.Normalize(aOrigSize.Height()) / 20; nSpin = MetricField::ConvertValue( nSpin, aOrigSize.Width(), 0, eUnit, aLeftMF.GetUnit() ); aTopMF.SetSpinSize(nSpin); aBottomMF.SetSpinSize(nSpin); //Originalgroesse anzeigen const FieldUnit eMetric = GetModuleFieldUnit( GetItemSet() ); MetricField aFld(this, WB_HIDE); SetFieldUnit( aFld, eMetric ); aFld.SetDecimalDigits( aWidthMF.GetDecimalDigits() ); aFld.SetMax( LONG_MAX - 1 ); aFld.SetValue( aFld.Normalize( aOrigSize.Width() ), eUnit ); String sTemp = aFld.GetText(); aFld.SetValue( aFld.Normalize( aOrigSize.Height() ), eUnit ); sTemp += UniString::CreateFromAscii(" x "); sTemp += aFld.GetText(); aOrigSizeFT.SetText(sTemp); } aLeftFT .Enable(bFound); aLeftMF .Enable(bFound); aRightFT .Enable(bFound); aRightMF .Enable(bFound); aTopFT .Enable(bFound); aTopMF .Enable(bFound); aBottomFT .Enable(bFound); aBottomMF .Enable(bFound); aSizeConstRB .Enable(bFound); aZoomConstRB .Enable(bFound); aWidthFT .Enable(bFound); aWidthMF .Enable(bFound); aHeightFT .Enable(bFound); aHeightMF .Enable(bFound); aWidthZoomFT .Enable(bFound); aWidthZoomMF .Enable(bFound); aHeightZoomFT .Enable(bFound); aHeightZoomMF .Enable(bFound); aExampleWN .Enable(bFound); aOrigSizePB .Enable(bFound); aOrigSizeFT .Enable(bFound); } IMPL_LINK( SvxGrfCropPage, Timeout, Timer *, EMPTYARG ) { DBG_ASSERT(pLastCropField,"Timeout ohne Feld?"); CropHdl(pLastCropField); pLastCropField = 0; return 0; } IMPL_LINK( SvxGrfCropPage, CropLoseFocusHdl, MetricField*, pField ) { aTimer.Stop(); CropHdl(pField); pLastCropField = 0; return 0; } IMPL_LINK( SvxGrfCropPage, CropModifyHdl, MetricField *, pField ) { aTimer.Start(); pLastCropField = pField; return 0; } Size SvxGrfCropPage::GetGrfOrigSize( const Graphic& rGrf ) const { const MapMode aMapTwip( MAP_TWIP ); Size aSize( rGrf.GetPrefSize() ); if( MAP_PIXEL == rGrf.GetPrefMapMode().GetMapUnit() ) aSize = PixelToLogic( aSize, aMapTwip ); else aSize = OutputDevice::LogicToLogic( aSize, rGrf.GetPrefMapMode(), aMapTwip ); return aSize; } /*****************************************************************/ SvxGrfCropPage::SvxCropExample::SvxCropExample( Window* pPar, const ResId& rResId ) : Window( pPar, rResId ), aFrameSize( OutputDevice::LogicToLogic( Size( CM_1_TO_TWIP / 2, CM_1_TO_TWIP / 2 ), MapMode( MAP_TWIP ), GetMapMode() )), aTopLeft(0,0), aBottomRight(0,0) { SetBorderStyle( WINDOW_BORDER_MONO ); } void SvxGrfCropPage::SvxCropExample::Paint( const Rectangle& ) { Size aWinSize( PixelToLogic(GetOutputSizePixel() )); SetLineColor(); SetFillColor( GetSettings().GetStyleSettings().GetWindowColor() ); SetRasterOp( ROP_OVERPAINT ); DrawRect( Rectangle( Point(), aWinSize ) ); SetLineColor( Color( COL_WHITE ) ); Rectangle aRect(Point((aWinSize.Width() - aFrameSize.Width())/2, (aWinSize.Height() - aFrameSize.Height())/2), aFrameSize ); aGrf.Draw( this, aRect.TopLeft(), aRect.GetSize() ); Size aSz( 2, 0 ); aSz = PixelToLogic( aSz ); SetFillColor( Color( COL_TRANSPARENT ) ); SetRasterOp( ROP_INVERT ); aRect.Left() += aTopLeft.Y(); aRect.Top() += aTopLeft.X(); aRect.Right() -= aBottomRight.Y(); aRect.Bottom() -= aBottomRight.X(); DrawRect( aRect ); } void SvxGrfCropPage::SvxCropExample::SetFrameSize( const Size& rSz ) { aFrameSize = rSz; if(!aFrameSize.Width()) aFrameSize.Width() = 1; if(!aFrameSize.Height()) aFrameSize.Height() = 1; Size aWinSize( GetOutputSizePixel() ); Fraction aXScale( aWinSize.Width() * 4, aFrameSize.Width() * 5 ); Fraction aYScale( aWinSize.Height() * 4, aFrameSize.Height() * 5 ); if( aYScale < aXScale ) aXScale = aYScale; MapMode aMapMode( GetMapMode() ); aMapMode.SetScaleX( aXScale ); aMapMode.SetScaleY( aXScale ); SetMapMode( aMapMode ); Invalidate(); } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */