LCOV - code coverage report
Current view: top level - cui/source/tabpages - grfpage.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 0 499 0.0 %
Date: 2015-06-13 12:38:46 Functions: 0 36 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2             : /*
       3             :  * This file is part of the LibreOffice project.
       4             :  *
       5             :  * This Source Code Form is subject to the terms of the Mozilla Public
       6             :  * License, v. 2.0. If a copy of the MPL was not distributed with this
       7             :  * file, You can obtain one at http://mozilla.org/MPL/2.0/.
       8             :  *
       9             :  * This file incorporates work covered by the following license notice:
      10             :  *
      11             :  *   Licensed to the Apache Software Foundation (ASF) under one or more
      12             :  *   contributor license agreements. See the NOTICE file distributed
      13             :  *   with this work for additional information regarding copyright
      14             :  *   ownership. The ASF licenses this file to you under the Apache
      15             :  *   License, Version 2.0 (the "License"); you may not use this file
      16             :  *   except in compliance with the License. You may obtain a copy of
      17             :  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
      18             :  */
      19             : 
      20             : #include <svl/eitem.hxx>
      21             : #include <svl/stritem.hxx>
      22             : #include <sfx2/app.hxx>
      23             : #include <sfx2/module.hxx>
      24             : #include <sfx2/sfxsids.hrc>
      25             : #include <dialmgr.hxx>
      26             : #include <svx/dlgutil.hxx>
      27             : #include <editeng/sizeitem.hxx>
      28             : #include <editeng/brushitem.hxx>
      29             : #include <grfpage.hxx>
      30             : #include <svx/grfcrop.hxx>
      31             : #include <rtl/ustring.hxx>
      32             : #include <cuires.hrc>
      33             : #include <tools/fract.hxx>
      34             : #include <svx/dialogs.hrc>
      35             : #include <vcl/builderfactory.hxx>
      36             : #include <vcl/settings.hxx>
      37             : #include <boost/scoped_ptr.hpp>
      38             : 
      39             : #define CM_1_TO_TWIP        567
      40             : #define TWIP_TO_INCH        1440
      41             : 
      42             : 
      43           0 : static inline long lcl_GetValue( MetricField& rMetric, FieldUnit eUnit )
      44             : {
      45           0 :     return static_cast<long>(rMetric.Denormalize( rMetric.GetValue( eUnit )));
      46             : }
      47             : 
      48             : /*--------------------------------------------------------------------
      49             :     description: crop graphic
      50             :  --------------------------------------------------------------------*/
      51             : 
      52           0 : SvxGrfCropPage::SvxGrfCropPage ( vcl::Window *pParent, const SfxItemSet &rSet )
      53             :     : SfxTabPage(pParent, "CropPage", "cui/ui/croppage.ui", &rSet)
      54             :     , pLastCropField(0)
      55             :     , nOldWidth(0)
      56             :     , nOldHeight(0)
      57             :     , bReset(false)
      58             :     , bInitialized(false)
      59           0 :     , bSetOrigSize(false)
      60             : {
      61           0 :     get(m_pCropFrame, "cropframe");
      62           0 :     get(m_pScaleFrame, "scaleframe");
      63           0 :     get(m_pSizeFrame, "sizeframe");
      64           0 :     get(m_pOrigSizeGrid, "origsizegrid");
      65           0 :     get(m_pZoomConstRB, "keepscale");
      66           0 :     get(m_pSizeConstRB, "keepsize");
      67           0 :     get(m_pOrigSizeFT, "origsizeft");
      68           0 :     get(m_pOrigSizePB, "origsize");
      69           0 :     get(m_pLeftMF, "left");
      70           0 :     get(m_pRightMF, "right");
      71           0 :     get(m_pTopMF, "top");
      72           0 :     get(m_pBottomMF, "bottom");
      73           0 :     get(m_pWidthZoomMF, "widthzoom");
      74           0 :     get(m_pHeightZoomMF, "heightzoom");
      75           0 :     get(m_pWidthMF, "width");
      76           0 :     get(m_pHeightMF, "height");
      77           0 :     get(m_pExampleWN, "preview");
      78             : 
      79           0 :     SetExchangeSupport();
      80             : 
      81             :     // set the correct metric
      82           0 :     const FieldUnit eMetric = GetModuleFieldUnit( rSet );
      83             : 
      84           0 :     SetFieldUnit( *m_pWidthMF, eMetric );
      85           0 :     SetFieldUnit( *m_pHeightMF, eMetric );
      86           0 :     SetFieldUnit( *m_pLeftMF, eMetric );
      87           0 :     SetFieldUnit( *m_pRightMF, eMetric );
      88           0 :     SetFieldUnit( *m_pTopMF , eMetric );
      89           0 :     SetFieldUnit( *m_pBottomMF, eMetric );
      90             : 
      91           0 :     Link<> aLk = LINK(this, SvxGrfCropPage, SizeHdl);
      92           0 :     m_pWidthMF->SetModifyHdl( aLk );
      93           0 :     m_pHeightMF->SetModifyHdl( aLk );
      94             : 
      95           0 :     aLk = LINK(this, SvxGrfCropPage, ZoomHdl);
      96           0 :     m_pWidthZoomMF->SetModifyHdl( aLk );
      97           0 :     m_pHeightZoomMF->SetModifyHdl( aLk );
      98             : 
      99           0 :     aLk = LINK(this, SvxGrfCropPage, CropHdl);
     100           0 :     m_pLeftMF->SetDownHdl( aLk );
     101           0 :     m_pRightMF->SetDownHdl( aLk );
     102           0 :     m_pTopMF->SetDownHdl( aLk );
     103           0 :     m_pBottomMF->SetDownHdl( aLk );
     104           0 :     m_pLeftMF->SetUpHdl( aLk );
     105           0 :     m_pRightMF->SetUpHdl( aLk );
     106           0 :     m_pTopMF->SetUpHdl( aLk );
     107           0 :     m_pBottomMF->SetUpHdl( aLk );
     108             : 
     109           0 :     aLk = LINK(this, SvxGrfCropPage, CropModifyHdl);
     110           0 :     m_pLeftMF->SetModifyHdl( aLk );
     111           0 :     m_pRightMF->SetModifyHdl( aLk );
     112           0 :     m_pTopMF->SetModifyHdl( aLk );
     113           0 :     m_pBottomMF->SetModifyHdl( aLk );
     114             : 
     115           0 :     aLk = LINK(this, SvxGrfCropPage, CropLoseFocusHdl);
     116           0 :     m_pLeftMF->SetLoseFocusHdl( aLk );
     117           0 :     m_pRightMF->SetLoseFocusHdl( aLk );
     118           0 :     m_pTopMF->SetLoseFocusHdl( aLk );
     119           0 :     m_pBottomMF->SetLoseFocusHdl( aLk );
     120             : 
     121           0 :     aLk = LINK(this, SvxGrfCropPage, OrigSizeHdl);
     122           0 :     m_pOrigSizePB->SetClickHdl( aLk );
     123             : 
     124           0 :     aTimer.SetTimeoutHdl(LINK(this, SvxGrfCropPage, Timeout));
     125           0 :     aTimer.SetTimeout( 1500 );
     126           0 : }
     127             : 
     128           0 : SvxGrfCropPage::~SvxGrfCropPage()
     129             : {
     130           0 :     disposeOnce();
     131           0 : }
     132             : 
     133           0 : void SvxGrfCropPage::dispose()
     134             : {
     135           0 :     aTimer.Stop();
     136           0 :     m_pCropFrame.clear();
     137           0 :     m_pZoomConstRB.clear();
     138           0 :     m_pSizeConstRB.clear();
     139           0 :     m_pLeftMF.clear();
     140           0 :     m_pRightMF.clear();
     141           0 :     m_pTopMF.clear();
     142           0 :     m_pBottomMF.clear();
     143           0 :     m_pScaleFrame.clear();
     144           0 :     m_pWidthZoomMF.clear();
     145           0 :     m_pHeightZoomMF.clear();
     146           0 :     m_pSizeFrame.clear();
     147           0 :     m_pWidthMF.clear();
     148           0 :     m_pHeightMF.clear();
     149           0 :     m_pOrigSizeGrid.clear();
     150           0 :     m_pOrigSizeFT.clear();
     151           0 :     m_pOrigSizePB.clear();
     152           0 :     m_pExampleWN.clear();
     153           0 :     pLastCropField.clear();
     154           0 :     SfxTabPage::dispose();
     155           0 : }
     156             : 
     157           0 : VclPtr<SfxTabPage> SvxGrfCropPage::Create(vcl::Window *pParent, const SfxItemSet *rSet)
     158             : {
     159           0 :     return VclPtr<SvxGrfCropPage>::Create( pParent, *rSet );
     160             : }
     161             : 
     162           0 : void SvxGrfCropPage::Reset( const SfxItemSet *rSet )
     163             : {
     164             :     const SfxPoolItem* pItem;
     165           0 :     const SfxItemPool& rPool = *rSet->GetPool();
     166             : 
     167           0 :     if(SfxItemState::SET == rSet->GetItemState( rPool.GetWhich(
     168           0 :                                     SID_ATTR_GRAF_KEEP_ZOOM ), true, &pItem ))
     169             :     {
     170           0 :         if( static_cast<const SfxBoolItem*>(pItem)->GetValue() )
     171           0 :             m_pZoomConstRB->Check();
     172             :         else
     173           0 :             m_pSizeConstRB->Check();
     174           0 :         m_pZoomConstRB->SaveValue();
     175             :     }
     176             : 
     177           0 :     sal_uInt16 nW = rPool.GetWhich( SID_ATTR_GRAF_CROP );
     178           0 :     if( SfxItemState::SET == rSet->GetItemState( nW, true, &pItem))
     179             :     {
     180           0 :         FieldUnit eUnit = MapToFieldUnit( rSet->GetPool()->GetMetric( nW ));
     181             : 
     182           0 :         const SvxGrfCrop* pCrop = static_cast<const SvxGrfCrop*>(pItem);
     183             : 
     184           0 :         m_pExampleWN->SetLeft(     pCrop->GetLeft());
     185           0 :         m_pExampleWN->SetRight(    pCrop->GetRight());
     186           0 :         m_pExampleWN->SetTop(      pCrop->GetTop());
     187           0 :         m_pExampleWN->SetBottom(   pCrop->GetBottom());
     188             : 
     189           0 :         m_pLeftMF->SetValue( m_pLeftMF->Normalize( pCrop->GetLeft()), eUnit );
     190           0 :         m_pRightMF->SetValue( m_pRightMF->Normalize( pCrop->GetRight()), eUnit );
     191           0 :         m_pTopMF->SetValue( m_pTopMF->Normalize( pCrop->GetTop()), eUnit );
     192           0 :         m_pBottomMF->SetValue( m_pBottomMF->Normalize( pCrop->GetBottom()), eUnit );
     193             :     }
     194             :     else
     195             :     {
     196           0 :         m_pLeftMF->SetValue( 0 );
     197           0 :         m_pRightMF->SetValue( 0 );
     198           0 :         m_pTopMF->SetValue( 0 );
     199           0 :         m_pBottomMF->SetValue( 0 );
     200             :     }
     201             : 
     202           0 :     nW = rPool.GetWhich( SID_ATTR_PAGE_SIZE );
     203           0 :     if ( SfxItemState::SET == rSet->GetItemState( nW, false, &pItem ) )
     204             :     {
     205             :         // orientation and size from the PageItem
     206           0 :         FieldUnit eUnit = MapToFieldUnit( rSet->GetPool()->GetMetric( nW ));
     207             : 
     208           0 :         aPageSize = static_cast<const SvxSizeItem*>(pItem)->GetSize();
     209             : 
     210           0 :         sal_Int64 nTmp = m_pHeightMF->Normalize(aPageSize.Height());
     211           0 :         m_pHeightMF->SetMax( nTmp, eUnit );
     212           0 :         nTmp = m_pWidthMF->Normalize(aPageSize.Width());
     213           0 :         m_pWidthMF->SetMax( nTmp, eUnit );
     214           0 :         nTmp = m_pWidthMF->Normalize( 23 );
     215           0 :         m_pHeightMF->SetMin( nTmp, eUnit );
     216           0 :         m_pWidthMF->SetMin( nTmp, eUnit );
     217             :     }
     218             :     else
     219             :     {
     220             :         aPageSize = OutputDevice::LogicToLogic(
     221             :                         Size( CM_1_TO_TWIP,  CM_1_TO_TWIP ),
     222             :                         MapMode( MAP_TWIP ),
     223           0 :                         MapMode( (MapUnit)rSet->GetPool()->GetMetric( nW ) ) );
     224             :     }
     225             : 
     226           0 :     bool bFound = false;
     227           0 :     if( SfxItemState::SET == rSet->GetItemState( SID_ATTR_GRAF_GRAPHIC, false, &pItem ) )
     228             :     {
     229           0 :         OUString referer;
     230             :         SfxStringItem const * it = static_cast<SfxStringItem const *>(
     231           0 :             rSet->GetItem(SID_REFERER));
     232           0 :         if (it != 0) {
     233           0 :             referer = it->GetValue();
     234             :         }
     235           0 :         const Graphic* pGrf = static_cast<const SvxBrushItem*>(pItem)->GetGraphic(referer);
     236           0 :         if( pGrf )
     237             :         {
     238           0 :             aOrigSize = GetGrfOrigSize( *pGrf );
     239           0 :             if (pGrf->GetType() == GRAPHIC_BITMAP && aOrigSize.Width() && aOrigSize.Height())
     240             :             {
     241           0 :                 Bitmap aBitmap = pGrf->GetBitmap();
     242           0 :                 aOrigPixelSize = aBitmap.GetSizePixel();
     243             :             }
     244             : 
     245           0 :             if( aOrigSize.Width() && aOrigSize.Height() )
     246             :             {
     247           0 :                 CalcMinMaxBorder();
     248           0 :                 m_pExampleWN->SetGraphic( *pGrf );
     249           0 :                 m_pExampleWN->SetFrameSize( aOrigSize );
     250             : 
     251           0 :                 bFound = true;
     252           0 :                 if( !static_cast<const SvxBrushItem*>(pItem)->GetGraphicLink().isEmpty() )
     253           0 :                     aGraphicName = static_cast<const SvxBrushItem*>(pItem)->GetGraphicLink();
     254             :             }
     255           0 :         }
     256             :     }
     257             : 
     258           0 :     GraphicHasChanged( bFound );
     259           0 :     bReset = true;
     260           0 :     ActivatePage( *rSet );
     261           0 :     bReset = false;
     262           0 : }
     263             : 
     264           0 : bool SvxGrfCropPage::FillItemSet(SfxItemSet *rSet)
     265             : {
     266           0 :     const SfxItemPool& rPool = *rSet->GetPool();
     267           0 :     bool bModified = false;
     268           0 :     if( m_pWidthMF->IsValueChangedFromSaved() ||
     269           0 :         m_pHeightMF->IsValueChangedFromSaved() )
     270             :     {
     271           0 :         sal_uInt16 nW = rPool.GetWhich( SID_ATTR_GRAF_FRMSIZE );
     272           0 :         FieldUnit eUnit = MapToFieldUnit( rSet->GetPool()->GetMetric( nW ));
     273             : 
     274           0 :         SvxSizeItem aSz( nW );
     275             : 
     276             :         // size could already have been set from another page
     277             :         // #44204#
     278           0 :         const SfxItemSet* pExSet = GetTabDialog() ? GetTabDialog()->GetExampleSet() : NULL;
     279           0 :         const SfxPoolItem* pItem = 0;
     280           0 :         if( pExSet && SfxItemState::SET ==
     281           0 :                 pExSet->GetItemState( nW, false, &pItem ) )
     282           0 :             aSz = *static_cast<const SvxSizeItem*>(pItem);
     283             :         else
     284           0 :             aSz = static_cast<const SvxSizeItem&>(GetItemSet().Get( nW ));
     285             : 
     286           0 :         Size aTmpSz( aSz.GetSize() );
     287           0 :         if( m_pWidthMF->IsValueChangedFromSaved() )
     288           0 :             aTmpSz.Width() = lcl_GetValue( *m_pWidthMF, eUnit );
     289           0 :         if( m_pHeightMF->IsValueChangedFromSaved() )
     290           0 :             aTmpSz.Height() = lcl_GetValue( *m_pHeightMF, eUnit );
     291           0 :         aSz.SetSize( aTmpSz );
     292           0 :         m_pWidthMF->SaveValue();
     293           0 :         m_pHeightMF->SaveValue();
     294             : 
     295           0 :         bModified |= 0 != rSet->Put( aSz );
     296             : 
     297           0 :         if( bSetOrigSize )
     298             :         {
     299             :             bModified |= 0 != rSet->Put( SvxSizeItem( rPool.GetWhich(
     300           0 :                         SID_ATTR_GRAF_FRMSIZE_PERCENT ), Size( 0, 0 )) );
     301           0 :         }
     302             :     }
     303           0 :     if( m_pLeftMF->IsModified() || m_pRightMF->IsModified() ||
     304           0 :         m_pTopMF->IsModified()  || m_pBottomMF->IsModified() )
     305             :     {
     306           0 :         sal_uInt16 nW = rPool.GetWhich( SID_ATTR_GRAF_CROP );
     307           0 :         FieldUnit eUnit = MapToFieldUnit( rSet->GetPool()->GetMetric( nW ));
     308           0 :         boost::scoped_ptr<SvxGrfCrop> pNew(static_cast<SvxGrfCrop*>(rSet->Get( nW ).Clone()));
     309             : 
     310           0 :         pNew->SetLeft( lcl_GetValue( *m_pLeftMF, eUnit ) );
     311           0 :         pNew->SetRight( lcl_GetValue( *m_pRightMF, eUnit ) );
     312           0 :         pNew->SetTop( lcl_GetValue( *m_pTopMF, eUnit ) );
     313           0 :         pNew->SetBottom( lcl_GetValue( *m_pBottomMF, eUnit ) );
     314           0 :         bModified |= 0 != rSet->Put( *pNew );
     315             :     }
     316             : 
     317           0 :     if( m_pZoomConstRB->IsValueChangedFromSaved() )
     318             :     {
     319             :         bModified |= 0 != rSet->Put( SfxBoolItem( rPool.GetWhich(
     320           0 :                     SID_ATTR_GRAF_KEEP_ZOOM), m_pZoomConstRB->IsChecked() ) );
     321             :     }
     322             : 
     323           0 :     bInitialized = false;
     324             : 
     325           0 :     return bModified;
     326             : }
     327             : 
     328           0 : void SvxGrfCropPage::ActivatePage(const SfxItemSet& rSet)
     329             : {
     330             : #ifdef DBG_UTIL
     331             :     SfxItemPool* pPool = GetItemSet().GetPool();
     332             :     DBG_ASSERT( pPool, "Wo ist der Pool" );
     333             : #endif
     334             : 
     335           0 :     bSetOrigSize = false;
     336             : 
     337             :     // Size
     338           0 :     Size aSize;
     339             :     const SfxPoolItem* pItem;
     340           0 :     if( SfxItemState::SET == rSet.GetItemState( SID_ATTR_GRAF_FRMSIZE, false, &pItem ) )
     341           0 :         aSize = static_cast<const SvxSizeItem*>(pItem)->GetSize();
     342             : 
     343           0 :     nOldWidth = aSize.Width();
     344           0 :     nOldHeight = aSize.Height();
     345             : 
     346           0 :     sal_Int64 nWidth = m_pWidthMF->Normalize(nOldWidth);
     347           0 :     sal_Int64 nHeight = m_pHeightMF->Normalize(nOldHeight);
     348             : 
     349           0 :     if (nWidth != m_pWidthMF->GetValue(FUNIT_TWIP))
     350             :     {
     351           0 :         if(!bReset)
     352             :         {
     353             :             // value was changed by wrap-tabpage and has to
     354             :             // be set with modify-flag
     355           0 :             m_pWidthMF->SetUserValue(nWidth, FUNIT_TWIP);
     356             :         }
     357             :         else
     358           0 :             m_pWidthMF->SetValue(nWidth, FUNIT_TWIP);
     359             :     }
     360           0 :     m_pWidthMF->SaveValue();
     361             : 
     362           0 :     if (nHeight != m_pHeightMF->GetValue(FUNIT_TWIP))
     363             :     {
     364           0 :         if (!bReset)
     365             :         {
     366             :             // value was changed by wrap-tabpage and has to
     367             :             // be set with modify-flag
     368           0 :             m_pHeightMF->SetUserValue(nHeight, FUNIT_TWIP);
     369             :         }
     370             :         else
     371           0 :             m_pHeightMF->SetValue(nHeight, FUNIT_TWIP);
     372             :     }
     373           0 :     m_pHeightMF->SaveValue();
     374           0 :     bInitialized = true;
     375             : 
     376           0 :     if( SfxItemState::SET == rSet.GetItemState( SID_ATTR_GRAF_GRAPHIC, false, &pItem ) )
     377             :     {
     378           0 :         const SvxBrushItem& rBrush = *static_cast<const SvxBrushItem*>(pItem);
     379           0 :         if( !rBrush.GetGraphicLink().isEmpty() &&
     380           0 :             aGraphicName != rBrush.GetGraphicLink() )
     381           0 :             aGraphicName = rBrush.GetGraphicLink();
     382             : 
     383           0 :         OUString referer;
     384             :         SfxStringItem const * it = static_cast<SfxStringItem const *>(
     385           0 :             rSet.GetItem(SID_REFERER));
     386           0 :         if (it != 0) {
     387           0 :             referer = it->GetValue();
     388             :         }
     389           0 :         const Graphic* pGrf = rBrush.GetGraphic(referer);
     390           0 :         if( pGrf )
     391             :         {
     392           0 :             m_pExampleWN->SetGraphic( *pGrf );
     393           0 :             aOrigSize = GetGrfOrigSize( *pGrf );
     394           0 :             if (pGrf->GetType() == GRAPHIC_BITMAP && aOrigSize.Width() > 1 && aOrigSize.Height() > 1) {
     395           0 :                 Bitmap aBitmap = pGrf->GetBitmap();
     396           0 :                 aOrigPixelSize = aBitmap.GetSizePixel();
     397             :             }
     398           0 :             m_pExampleWN->SetFrameSize(aOrigSize);
     399           0 :             GraphicHasChanged( aOrigSize.Width() && aOrigSize.Height() );
     400           0 :             CalcMinMaxBorder();
     401             :         }
     402             :         else
     403           0 :             GraphicHasChanged( false );
     404             :     }
     405             : 
     406           0 :     CalcZoom();
     407           0 : }
     408             : 
     409           0 : SfxTabPage::sfxpg SvxGrfCropPage::DeactivatePage(SfxItemSet *_pSet)
     410             : {
     411           0 :     if ( _pSet )
     412           0 :         FillItemSet( _pSet );
     413           0 :     return LEAVE_PAGE;
     414             : }
     415             : 
     416             : /*--------------------------------------------------------------------
     417             :     description: scale changed, adjust size
     418             :  --------------------------------------------------------------------*/
     419             : 
     420           0 : IMPL_LINK( SvxGrfCropPage, ZoomHdl, MetricField *, pField )
     421             : {
     422           0 :     SfxItemPool* pPool = GetItemSet().GetPool();
     423             :     DBG_ASSERT( pPool, "Wo ist der Pool" );
     424             :     FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich(
     425           0 :                                                     SID_ATTR_GRAF_CROP ) ) );
     426             : 
     427           0 :     if( pField == m_pWidthZoomMF )
     428             :     {
     429           0 :         long nLRBorders = lcl_GetValue(*m_pLeftMF, eUnit)
     430           0 :                          +lcl_GetValue(*m_pRightMF, eUnit);
     431           0 :         m_pWidthMF->SetValue( m_pWidthMF->Normalize(
     432           0 :             ((aOrigSize.Width() - nLRBorders) * pField->GetValue())/100L),
     433           0 :             eUnit);
     434             :     }
     435             :     else
     436             :     {
     437           0 :         long nULBorders = lcl_GetValue(*m_pTopMF, eUnit)
     438           0 :                          +lcl_GetValue(*m_pBottomMF, eUnit);
     439           0 :         m_pHeightMF->SetValue( m_pHeightMF->Normalize(
     440           0 :             ((aOrigSize.Height() - nULBorders ) * pField->GetValue())/100L) ,
     441           0 :             eUnit );
     442             :     }
     443             : 
     444           0 :     return 0;
     445             : }
     446             : 
     447             : /*--------------------------------------------------------------------
     448             :     description: change size, adjust scale
     449             :  --------------------------------------------------------------------*/
     450             : 
     451           0 : IMPL_LINK( SvxGrfCropPage, SizeHdl, MetricField *, pField )
     452             : {
     453           0 :     SfxItemPool* pPool = GetItemSet().GetPool();
     454             :     DBG_ASSERT( pPool, "Wo ist der Pool" );
     455             :     FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich(
     456           0 :                                                     SID_ATTR_GRAF_CROP ) ) );
     457             : 
     458           0 :     Size aSize( lcl_GetValue(*m_pWidthMF, eUnit),
     459           0 :                 lcl_GetValue(*m_pHeightMF, eUnit) );
     460             : 
     461           0 :     if(pField == m_pWidthMF)
     462             :     {
     463           0 :         long nWidth = aOrigSize.Width() -
     464           0 :                 ( lcl_GetValue(*m_pLeftMF, eUnit) +
     465           0 :                   lcl_GetValue(*m_pRightMF, eUnit) );
     466           0 :         if(!nWidth)
     467           0 :             nWidth++;
     468           0 :         sal_uInt16 nZoom = (sal_uInt16)( aSize.Width() * 100L / nWidth);
     469           0 :         m_pWidthZoomMF->SetValue(nZoom);
     470             :     }
     471             :     else
     472             :     {
     473           0 :         long nHeight = aOrigSize.Height() -
     474           0 :                 ( lcl_GetValue(*m_pTopMF, eUnit) +
     475           0 :                   lcl_GetValue(*m_pBottomMF, eUnit));
     476           0 :         if(!nHeight)
     477           0 :             nHeight++;
     478           0 :         sal_uInt16 nZoom = (sal_uInt16)( aSize.Height() * 100L/ nHeight);
     479           0 :         m_pHeightZoomMF->SetValue(nZoom);
     480             :     }
     481             : 
     482           0 :     return 0;
     483             : }
     484             : 
     485             : /*--------------------------------------------------------------------
     486             :     description: evaluate border
     487             :  --------------------------------------------------------------------*/
     488             : 
     489           0 : IMPL_LINK( SvxGrfCropPage, CropHdl, const MetricField *, pField )
     490             : {
     491           0 :     SfxItemPool* pPool = GetItemSet().GetPool();
     492             :     DBG_ASSERT( pPool, "Wo ist der Pool" );
     493             :     FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich(
     494           0 :                                                     SID_ATTR_GRAF_CROP ) ) );
     495             : 
     496           0 :     bool bZoom = m_pZoomConstRB->IsChecked();
     497           0 :     if( pField == m_pLeftMF || pField == m_pRightMF )
     498             :     {
     499           0 :         long nLeft = lcl_GetValue( *m_pLeftMF, eUnit );
     500           0 :         long nRight = lcl_GetValue( *m_pRightMF, eUnit );
     501           0 :         long nWidthZoom = static_cast<long>(m_pWidthZoomMF->GetValue());
     502           0 :         if(bZoom && ( ( ( aOrigSize.Width() - (nLeft + nRight )) * nWidthZoom )
     503           0 :                             / 100 >= aPageSize.Width() ) )
     504             :         {
     505           0 :             if(pField == m_pLeftMF)
     506             :             {
     507           0 :                 nLeft = aOrigSize.Width() -
     508           0 :                             ( aPageSize.Width() * 100 / nWidthZoom + nRight );
     509           0 :                 m_pLeftMF->SetValue( m_pLeftMF->Normalize( nLeft ), eUnit );
     510             :             }
     511             :             else
     512             :             {
     513           0 :                 nRight = aOrigSize.Width() -
     514           0 :                             ( aPageSize.Width() * 100 / nWidthZoom + nLeft );
     515           0 :                 m_pRightMF->SetValue( m_pRightMF->Normalize( nRight ), eUnit );
     516             :             }
     517             :         }
     518           0 :         if (AllSettings::GetLayoutRTL())
     519             :         {
     520           0 :             m_pExampleWN->SetLeft(nRight);
     521           0 :             m_pExampleWN->SetRight(nLeft);
     522             :         }
     523             :         else
     524             :         {
     525           0 :             m_pExampleWN->SetLeft(nLeft);
     526           0 :             m_pExampleWN->SetRight(nRight);
     527             :         }
     528           0 :         if(bZoom)
     529             :         {
     530             :             // scale stays, recompute width
     531           0 :             ZoomHdl(m_pWidthZoomMF);
     532             :         }
     533             :     }
     534             :     else
     535             :     {
     536           0 :         long nTop = lcl_GetValue( *m_pTopMF, eUnit );
     537           0 :         long nBottom = lcl_GetValue( *m_pBottomMF, eUnit );
     538           0 :         long nHeightZoom = static_cast<long>(m_pHeightZoomMF->GetValue());
     539           0 :         if(bZoom && ( ( ( aOrigSize.Height() - (nTop + nBottom )) * nHeightZoom)
     540           0 :                                             / 100 >= aPageSize.Height()))
     541             :         {
     542           0 :             if(pField == m_pTopMF)
     543             :             {
     544           0 :                 nTop = aOrigSize.Height() -
     545           0 :                             ( aPageSize.Height() * 100 / nHeightZoom + nBottom);
     546           0 :                 m_pTopMF->SetValue( m_pWidthMF->Normalize( nTop ), eUnit );
     547             :             }
     548             :             else
     549             :             {
     550           0 :                 nBottom = aOrigSize.Height() -
     551           0 :                             ( aPageSize.Height() * 100 / nHeightZoom + nTop);
     552           0 :                 m_pBottomMF->SetValue( m_pWidthMF->Normalize( nBottom ), eUnit );
     553             :             }
     554             :         }
     555           0 :         m_pExampleWN->SetTop( nTop );
     556           0 :         m_pExampleWN->SetBottom( nBottom );
     557           0 :         if(bZoom)
     558             :         {
     559             :             // scale stays, recompute height
     560           0 :             ZoomHdl(m_pHeightZoomMF);
     561             :         }
     562             :     }
     563           0 :     m_pExampleWN->Invalidate();
     564             :     // size and border changed -> recompute scale
     565           0 :     if(!bZoom)
     566           0 :         CalcZoom();
     567           0 :     CalcMinMaxBorder();
     568           0 :     return 0;
     569             : }
     570             : /*--------------------------------------------------------------------
     571             :     description: set original size
     572             :  --------------------------------------------------------------------*/
     573             : 
     574           0 : IMPL_LINK_NOARG(SvxGrfCropPage, OrigSizeHdl)
     575             : {
     576           0 :     SfxItemPool* pPool = GetItemSet().GetPool();
     577             :     DBG_ASSERT( pPool, "Wo ist der Pool" );
     578             :     FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich(
     579           0 :                                                     SID_ATTR_GRAF_CROP ) ) );
     580             : 
     581           0 :     long nWidth = aOrigSize.Width() -
     582           0 :         lcl_GetValue( *m_pLeftMF, eUnit ) -
     583           0 :         lcl_GetValue( *m_pRightMF, eUnit );
     584           0 :     m_pWidthMF->SetValue( m_pWidthMF->Normalize( nWidth ), eUnit );
     585           0 :     long nHeight = aOrigSize.Height() -
     586           0 :         lcl_GetValue( *m_pTopMF, eUnit ) -
     587           0 :         lcl_GetValue( *m_pBottomMF, eUnit );
     588           0 :     m_pHeightMF->SetValue( m_pHeightMF->Normalize( nHeight ), eUnit );
     589           0 :     m_pWidthZoomMF->SetValue(100);
     590           0 :     m_pHeightZoomMF->SetValue(100);
     591           0 :     bSetOrigSize = true;
     592           0 :     return 0;
     593             : }
     594             : /*--------------------------------------------------------------------
     595             :     description: compute scale
     596             :  --------------------------------------------------------------------*/
     597             : 
     598           0 : void SvxGrfCropPage::CalcZoom()
     599             : {
     600           0 :     SfxItemPool* pPool = GetItemSet().GetPool();
     601             :     DBG_ASSERT( pPool, "Wo ist der Pool" );
     602             :     FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich(
     603           0 :                                                     SID_ATTR_GRAF_CROP ) ) );
     604             : 
     605           0 :     long nWidth = lcl_GetValue( *m_pWidthMF, eUnit );
     606           0 :     long nHeight = lcl_GetValue( *m_pHeightMF, eUnit );
     607           0 :     long nLRBorders = lcl_GetValue( *m_pLeftMF, eUnit ) +
     608           0 :                       lcl_GetValue( *m_pRightMF, eUnit );
     609           0 :     long nULBorders = lcl_GetValue( *m_pTopMF, eUnit ) +
     610           0 :                       lcl_GetValue( *m_pBottomMF, eUnit );
     611           0 :     sal_uInt16 nZoom = 0;
     612             :     long nDen;
     613           0 :     if( (nDen = aOrigSize.Width() - nLRBorders) > 0)
     614           0 :         nZoom = (sal_uInt16)((( nWidth  * 1000L / nDen )+5)/10);
     615           0 :     m_pWidthZoomMF->SetValue(nZoom);
     616           0 :     if( (nDen = aOrigSize.Height() - nULBorders) > 0)
     617           0 :         nZoom = (sal_uInt16)((( nHeight * 1000L / nDen )+5)/10);
     618             :     else
     619           0 :         nZoom = 0;
     620           0 :     m_pHeightZoomMF->SetValue(nZoom);
     621           0 : }
     622             : 
     623             : /*--------------------------------------------------------------------
     624             :     description: set minimum/maximum values for the margins
     625             :  --------------------------------------------------------------------*/
     626             : 
     627           0 : void SvxGrfCropPage::CalcMinMaxBorder()
     628             : {
     629           0 :     SfxItemPool* pPool = GetItemSet().GetPool();
     630             :     DBG_ASSERT( pPool, "Wo ist der Pool" );
     631             :     FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich(
     632           0 :                                                     SID_ATTR_GRAF_CROP ) ) );
     633           0 :     long nR = lcl_GetValue(*m_pRightMF, eUnit );
     634           0 :     long nMinWidth = (aOrigSize.Width() * 10) /11;
     635           0 :     long nMin = nMinWidth - (nR >= 0 ? nR : 0);
     636           0 :     m_pLeftMF->SetMax( m_pLeftMF->Normalize(nMin), eUnit );
     637             : 
     638           0 :     long nL = lcl_GetValue(*m_pLeftMF, eUnit );
     639           0 :     nMin = nMinWidth - (nL >= 0 ? nL : 0);
     640           0 :     m_pRightMF->SetMax( m_pRightMF->Normalize(nMin), eUnit );
     641             : 
     642           0 :     long nUp  = lcl_GetValue( *m_pTopMF, eUnit );
     643           0 :     long nMinHeight = (aOrigSize.Height() * 10) /11;
     644           0 :     nMin = nMinHeight - (nUp >= 0 ? nUp : 0);
     645           0 :     m_pBottomMF->SetMax( m_pBottomMF->Normalize(nMin), eUnit );
     646             : 
     647           0 :     long nLow = lcl_GetValue(*m_pBottomMF, eUnit );
     648           0 :     nMin = nMinHeight - (nLow >= 0 ? nLow : 0);
     649           0 :     m_pTopMF->SetMax( m_pTopMF->Normalize(nMin), eUnit );
     650           0 : }
     651             : /*--------------------------------------------------------------------
     652             :     description:   set spinsize to 1/20 of the original size,
     653             :                    fill FixedText with the original size
     654             :  --------------------------------------------------------------------*/
     655             : 
     656           0 : void SvxGrfCropPage::GraphicHasChanged( bool bFound )
     657             : {
     658           0 :     if( bFound )
     659             :     {
     660           0 :         SfxItemPool* pPool = GetItemSet().GetPool();
     661             :         DBG_ASSERT( pPool, "Wo ist der Pool" );
     662             :         FieldUnit eUnit = MapToFieldUnit( pPool->GetMetric( pPool->GetWhich(
     663           0 :                                                     SID_ATTR_GRAF_CROP ) ));
     664             : 
     665           0 :         sal_Int64 nSpin = m_pLeftMF->Normalize(aOrigSize.Width()) / 20;
     666           0 :         nSpin = MetricField::ConvertValue( nSpin, aOrigSize.Width(), 0,
     667           0 :                                                eUnit, m_pLeftMF->GetUnit());
     668             : 
     669             :         // if the margin is too big, it is set to 1/3 on both pages
     670           0 :         long nR = lcl_GetValue( *m_pRightMF, eUnit );
     671           0 :         long nL = lcl_GetValue( *m_pLeftMF, eUnit );
     672           0 :         if((nL + nR) < - aOrigSize.Width())
     673             :         {
     674           0 :             long nVal = aOrigSize.Width() / -3;
     675           0 :             m_pRightMF->SetValue( m_pRightMF->Normalize( nVal ), eUnit );
     676           0 :             m_pLeftMF->SetValue( m_pLeftMF->Normalize( nVal ), eUnit );
     677           0 :             m_pExampleWN->SetLeft(nVal);
     678           0 :             m_pExampleWN->SetRight(nVal);
     679             :         }
     680           0 :         long nUp  = lcl_GetValue(*m_pTopMF, eUnit );
     681           0 :         long nLow = lcl_GetValue(*m_pBottomMF, eUnit );
     682           0 :         if((nUp + nLow) < - aOrigSize.Height())
     683             :         {
     684           0 :             long nVal = aOrigSize.Height() / -3;
     685           0 :             m_pTopMF->SetValue( m_pTopMF->Normalize( nVal ), eUnit );
     686           0 :             m_pBottomMF->SetValue( m_pBottomMF->Normalize( nVal ), eUnit );
     687           0 :             m_pExampleWN->SetTop(nVal);
     688           0 :             m_pExampleWN->SetBottom(nVal);
     689             :         }
     690             : 
     691           0 :         m_pLeftMF->SetSpinSize(nSpin);
     692           0 :         m_pRightMF->SetSpinSize(nSpin);
     693           0 :         nSpin = m_pTopMF->Normalize(aOrigSize.Height()) / 20;
     694           0 :         nSpin = MetricField::ConvertValue( nSpin, aOrigSize.Width(), 0,
     695           0 :                                                eUnit, m_pLeftMF->GetUnit() );
     696           0 :         m_pTopMF->SetSpinSize(nSpin);
     697           0 :         m_pBottomMF->SetSpinSize(nSpin);
     698             : 
     699             :         // display original size
     700           0 :         const FieldUnit eMetric = GetModuleFieldUnit( GetItemSet() );
     701             : 
     702           0 :         ScopedVclPtrInstance< MetricField > aFld(this, WB_HIDE);
     703           0 :         SetFieldUnit( *aFld.get(), eMetric );
     704           0 :         aFld->SetDecimalDigits( m_pWidthMF->GetDecimalDigits() );
     705           0 :         aFld->SetMax( LONG_MAX - 1 );
     706             : 
     707           0 :         aFld->SetValue( aFld->Normalize( aOrigSize.Width() ), eUnit );
     708           0 :         OUString sTemp = aFld->GetText();
     709           0 :         aFld->SetValue( aFld->Normalize( aOrigSize.Height() ), eUnit );
     710             :         // multiplication sign (U+00D7)
     711           0 :         sTemp += OUString( sal_Unicode (0x00D7) );
     712           0 :         sTemp += aFld->GetText();
     713             : 
     714           0 :         if ( aOrigPixelSize.Width() && aOrigPixelSize.Height() ) {
     715           0 :              sal_Int32 ax = sal_Int32(floor((float)aOrigPixelSize.Width() /
     716           0 :                         ((float)aOrigSize.Width()/TWIP_TO_INCH)+0.5));
     717           0 :              sal_Int32 ay = sal_Int32(floor((float)aOrigPixelSize.Height() /
     718           0 :                         ((float)aOrigSize.Height()/TWIP_TO_INCH)+0.5));
     719           0 :              sTemp += " ";
     720           0 :              sTemp += CUI_RESSTR( RID_SVXSTR_PPI );
     721           0 :              OUString sPPI = OUString::number(ax);
     722           0 :              if (abs(ax - ay) > 1) {
     723           0 :                 sPPI += OUString( sal_Unicode (0x00D7) );
     724           0 :                 sPPI += OUString::number(ay);
     725             :              }
     726           0 :              sTemp = sTemp.replaceAll("%1", sPPI);
     727             :         }
     728           0 :         m_pOrigSizeFT->SetText( sTemp );
     729             :     }
     730             : 
     731           0 :     m_pCropFrame->Enable(bFound);
     732           0 :     m_pScaleFrame->Enable(bFound);
     733           0 :     m_pSizeFrame->Enable(bFound);
     734           0 :     m_pOrigSizeGrid->Enable(bFound);
     735           0 :     m_pZoomConstRB->Enable(bFound);
     736           0 : }
     737             : 
     738           0 : IMPL_LINK_NOARG_TYPED(SvxGrfCropPage, Timeout, Timer *, void)
     739             : {
     740             :     DBG_ASSERT(pLastCropField,"Timeout ohne Feld?");
     741           0 :     CropHdl(pLastCropField);
     742           0 :     pLastCropField = 0;
     743           0 : }
     744             : 
     745             : 
     746           0 : IMPL_LINK( SvxGrfCropPage, CropLoseFocusHdl, MetricField*, pField )
     747             : {
     748           0 :     aTimer.Stop();
     749           0 :     CropHdl(pField);
     750           0 :     pLastCropField = 0;
     751           0 :     return 0;
     752             : }
     753             : 
     754             : 
     755           0 : IMPL_LINK( SvxGrfCropPage, CropModifyHdl, MetricField *, pField )
     756             : {
     757           0 :     aTimer.Start();
     758           0 :     pLastCropField = pField;
     759           0 :     return 0;
     760             : }
     761             : 
     762           0 : Size SvxGrfCropPage::GetGrfOrigSize( const Graphic& rGrf ) const
     763             : {
     764           0 :     const MapMode aMapTwip( MAP_TWIP );
     765           0 :     Size aSize( rGrf.GetPrefSize() );
     766           0 :     if( MAP_PIXEL == rGrf.GetPrefMapMode().GetMapUnit() )
     767           0 :         aSize = PixelToLogic( aSize, aMapTwip );
     768             :     else
     769             :         aSize = OutputDevice::LogicToLogic( aSize,
     770           0 :                                         rGrf.GetPrefMapMode(), aMapTwip );
     771           0 :     return aSize;
     772             : }
     773             : 
     774             : /*****************************************************************/
     775             : 
     776           0 : SvxCropExample::SvxCropExample( vcl::Window* pPar, WinBits nStyle )
     777             :     : Window( pPar, nStyle)
     778             :     , aFrameSize( OutputDevice::LogicToLogic(
     779             :                             Size( CM_1_TO_TWIP / 2, CM_1_TO_TWIP / 2 ),
     780           0 :                             MapMode( MAP_TWIP ), GetMapMode() ))
     781             :     , aTopLeft(0,0)
     782           0 :     , aBottomRight(0,0)
     783             : {
     784           0 :     SetBorderStyle( WindowBorderStyle::MONO );
     785           0 : }
     786             : 
     787           0 : Size SvxCropExample::GetOptimalSize() const
     788             : {
     789           0 :     return LogicToPixel(Size(78, 78), MAP_APPFONT);
     790             : }
     791             : 
     792           0 : VCL_BUILDER_DECL_FACTORY(SvxCropExample)
     793             : {
     794           0 :     WinBits nWinStyle = 0;
     795           0 :     OString sBorder = VclBuilder::extractCustomProperty(rMap);
     796           0 :     if (!sBorder.isEmpty())
     797           0 :         nWinStyle |= WB_BORDER;
     798           0 :     rRet = VclPtr<SvxCropExample>::Create(pParent, nWinStyle);
     799           0 : }
     800             : 
     801           0 : void SvxCropExample::Paint(vcl::RenderContext& rRenderContext, const Rectangle&)
     802             : {
     803           0 :     Size aWinSize(rRenderContext.PixelToLogic(rRenderContext.GetOutputSizePixel()));
     804           0 :     rRenderContext.SetLineColor();
     805           0 :     rRenderContext.SetFillColor(rRenderContext.GetSettings().GetStyleSettings().GetWindowColor());
     806           0 :     rRenderContext.SetRasterOp(ROP_OVERPAINT);
     807           0 :     rRenderContext.DrawRect(Rectangle(Point(), aWinSize));
     808             : 
     809           0 :     rRenderContext.SetLineColor(Color(COL_WHITE));
     810           0 :     Rectangle aRect(Point((aWinSize.Width() - aFrameSize.Width())/2,
     811           0 :                           (aWinSize.Height() - aFrameSize.Height())/2),
     812           0 :                           aFrameSize);
     813           0 :     aGrf.Draw(&rRenderContext, aRect.TopLeft(), aRect.GetSize());
     814             : 
     815           0 :     Size aSz(2, 0);
     816           0 :     aSz = rRenderContext.PixelToLogic(aSz);
     817           0 :     rRenderContext.SetFillColor(Color(COL_TRANSPARENT));
     818           0 :     rRenderContext.SetRasterOp(ROP_INVERT);
     819           0 :     aRect.Left()    += aTopLeft.Y();
     820           0 :     aRect.Top()     += aTopLeft.X();
     821           0 :     aRect.Right()   -= aBottomRight.Y();
     822           0 :     aRect.Bottom()  -= aBottomRight.X();
     823           0 :     rRenderContext.DrawRect(aRect);
     824           0 : }
     825             : 
     826           0 : void SvxCropExample::Resize()
     827             : {
     828           0 :     SetFrameSize(aFrameSize);
     829           0 : }
     830             : 
     831           0 : void SvxCropExample::SetFrameSize( const Size& rSz )
     832             : {
     833           0 :     aFrameSize = rSz;
     834           0 :     if(!aFrameSize.Width())
     835           0 :         aFrameSize.Width() = 1;
     836           0 :     if(!aFrameSize.Height())
     837           0 :         aFrameSize.Height() = 1;
     838           0 :     Size aWinSize( GetOutputSizePixel() );
     839           0 :     Fraction aXScale( aWinSize.Width() * 4, aFrameSize.Width() * 5 );
     840           0 :     Fraction aYScale( aWinSize.Height() * 4, aFrameSize.Height() * 5 );
     841             : 
     842           0 :     if( aYScale < aXScale )
     843           0 :         aXScale = aYScale;
     844             : 
     845           0 :     MapMode aMapMode( GetMapMode() );
     846             : 
     847           0 :     aMapMode.SetScaleX( aXScale );
     848           0 :     aMapMode.SetScaleY( aXScale );
     849             : 
     850           0 :     SetMapMode( aMapMode );
     851           0 :     Invalidate();
     852           0 : }
     853             : 
     854             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11