LCOV - code coverage report
Current view: top level - extensions/source/scanner - sanedlg.cxx (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 786 0.0 %
Date: 2012-08-25 Functions: 0 38 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 1557 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
       2                 :            : /*************************************************************************
       3                 :            :  *
       4                 :            :  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       5                 :            :  *
       6                 :            :  * Copyright 2000, 2010 Oracle and/or its affiliates.
       7                 :            :  *
       8                 :            :  * OpenOffice.org - a multi-platform office productivity suite
       9                 :            :  *
      10                 :            :  * This file is part of OpenOffice.org.
      11                 :            :  *
      12                 :            :  * OpenOffice.org is free software: you can redistribute it and/or modify
      13                 :            :  * it under the terms of the GNU Lesser General Public License version 3
      14                 :            :  * only, as published by the Free Software Foundation.
      15                 :            :  *
      16                 :            :  * OpenOffice.org is distributed in the hope that it will be useful,
      17                 :            :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      18                 :            :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      19                 :            :  * GNU Lesser General Public License version 3 for more details
      20                 :            :  * (a copy is included in the LICENSE file that accompanied this code).
      21                 :            :  *
      22                 :            :  * You should have received a copy of the GNU Lesser General Public License
      23                 :            :  * version 3 along with OpenOffice.org.  If not, see
      24                 :            :  * <http://www.openoffice.org/license.html>
      25                 :            :  * for a copy of the LGPLv3 License.
      26                 :            :  *
      27                 :            :  ************************************************************************/
      28                 :            : 
      29                 :            : 
      30                 :            : #include <stdio.h>
      31                 :            : #include <stdlib.h>
      32                 :            : #include <tools/config.hxx>
      33                 :            : 
      34                 :            : #include <vcl/msgbox.hxx>
      35                 :            : #include <sanedlg.hxx>
      36                 :            : #include <sanedlg.hrc>
      37                 :            : #include <grid.hxx>
      38                 :            : #include <math.h>
      39                 :            : #include <sal/macros.h>
      40                 :            : #include <rtl/strbuf.hxx>
      41                 :            : 
      42                 :          0 : ResId SaneResId( sal_uInt32 nID )
      43                 :            : {
      44 [ #  # ][ #  # ]:          0 :     static ResMgr* pResMgr = ResMgr::CreateResMgr( "scn" );
         [ #  # ][ #  # ]
      45                 :          0 :     return ResId( nID, *pResMgr );
      46                 :            : }
      47                 :            : 
      48                 :          0 : SaneDlg::SaneDlg( Window* pParent, Sane& rSane, bool bScanEnabled ) :
      49                 :            :         ModalDialog( pParent, SaneResId( RID_SANE_DIALOG ) ),
      50                 :            :         mrSane( rSane ),
      51                 :            :         mbIsDragging( sal_False ),
      52                 :            :         mbScanEnabled( bScanEnabled ),
      53                 :            :         mbDragDrawn( sal_False ),
      54                 :            :         maMapMode( MAP_APPFONT ),
      55                 :            :         maOKButton( this, SaneResId( RID_SCAN_OK ) ),
      56                 :            :         maCancelButton( this, SaneResId( RID_SCAN_CANCEL ) ),
      57                 :            :         maDeviceInfoButton( this, SaneResId( RID_DEVICEINFO_BTN ) ),
      58                 :            :         maPreviewButton( this, SaneResId( RID_PREVIEW_BTN ) ),
      59                 :            :         maScanButton( this, SaneResId( RID_SCAN_BTN ) ),
      60                 :            :         maButtonOption( this, SaneResId( RID_SCAN_BUTTON_OPTION_BTN ) ),
      61                 :            :         maOptionsTxt( this, SaneResId( RID_SCAN_OPTION_TXT ) ),
      62                 :            :         maOptionTitle( this, SaneResId( RID_SCAN_OPTIONTITLE_TXT ) ),
      63                 :            :         maOptionDescTxt( this, SaneResId( RID_SCAN_OPTION_DESC_TXT ) ),
      64                 :            :         maVectorTxt( this, SaneResId( RID_SCAN_NUMERIC_VECTOR_TXT ) ),
      65                 :            :         maScanLeftTxt( this, SaneResId( RID_SCAN_LEFT_TXT ) ),
      66                 :            :         maLeftField( this, SaneResId( RID_SCAN_LEFT_BOX ) ),
      67                 :            :         maScanTopTxt( this, SaneResId( RID_SCAN_TOP_TXT ) ),
      68                 :            :         maTopField( this, SaneResId( RID_SCAN_TOP_BOX ) ),
      69                 :            :         maRightTxt( this, SaneResId( RID_SCAN_RIGHT_TXT ) ),
      70                 :            :         maRightField( this, SaneResId( RID_SCAN_RIGHT_BOX ) ),
      71                 :            :         maBottomTxt( this, SaneResId( RID_SCAN_BOTTOM_TXT ) ),
      72                 :            :         maBottomField( this, SaneResId( RID_SCAN_BOTTOM_BOX ) ),
      73                 :            :         maDeviceBoxTxt( this, SaneResId( RID_DEVICE_BOX_TXT ) ),
      74                 :            :         maDeviceBox( this, SaneResId( RID_DEVICE_BOX ) ),
      75                 :            :         maReslTxt( this, SaneResId( RID_SCAN_RESOLUTION_TXT ) ),
      76                 :            :         maReslBox( this, SaneResId( RID_SCAN_RESOLUTION_BOX ) ),
      77                 :            :         maAdvancedTxt( this, SaneResId( RID_SCAN_ADVANCED_TXT ) ),
      78                 :            :         maAdvancedBox( this, SaneResId( RID_SCAN_ADVANCED_BOX ) ),
      79                 :            :         maVectorBox( this, SaneResId( RID_SCAN_NUMERIC_VECTOR_BOX ) ),
      80                 :            :         maQuantumRangeBox( this, SaneResId( RID_SCAN_QUANTUM_RANGE_BOX ) ),
      81                 :            :         maStringRangeBox( this, SaneResId( RID_SCAN_STRING_RANGE_BOX ) ),
      82                 :            :         maPreviewBox( this, SaneResId( RID_PREVIEW_BOX ) ),
      83                 :            :         maAreaBox( this, SaneResId( RID_SCANAREA_BOX ) ),
      84                 :            :         maBoolCheckBox( this, SaneResId( RID_SCAN_BOOL_OPTION_BOX ) ),
      85                 :            :         maStringEdit( this, SaneResId( RID_SCAN_STRING_OPTION_EDT ) ),
      86                 :            :         maNumericEdit( this, SaneResId( RID_SCAN_NUMERIC_OPTION_EDT ) ),
      87                 :            :         maOptionBox( this, SaneResId( RID_SCAN_OPTION_BOX ) ),
      88                 :            :         mpRange( 0 ),
      89 [ #  # ][ #  # ]:          0 :         doScan( false )
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
      90                 :            : {
      91         [ #  # ]:          0 :     if( Sane::IsSane() )
      92                 :            :     {
      93         [ #  # ]:          0 :         InitDevices(); // opens first sane device
      94         [ #  # ]:          0 :         DisableOption();
      95         [ #  # ]:          0 :         InitFields();
      96                 :            :     }
      97                 :            : 
      98         [ #  # ]:          0 :     maDeviceInfoButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
      99         [ #  # ]:          0 :     maPreviewButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
     100         [ #  # ]:          0 :     maScanButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
     101         [ #  # ]:          0 :     maButtonOption.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
     102         [ #  # ]:          0 :     maDeviceBox.SetSelectHdl( LINK( this, SaneDlg, SelectHdl ) );
     103         [ #  # ]:          0 :     maOptionBox.SetSelectHdl( LINK( this, SaneDlg, OptionsBoxSelectHdl ) );
     104         [ #  # ]:          0 :     maOKButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
     105         [ #  # ]:          0 :     maCancelButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
     106         [ #  # ]:          0 :     maBoolCheckBox.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
     107         [ #  # ]:          0 :     maStringEdit.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) );
     108         [ #  # ]:          0 :     maNumericEdit.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) );
     109         [ #  # ]:          0 :     maVectorBox.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) );
     110         [ #  # ]:          0 :     maReslBox.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) );
     111         [ #  # ]:          0 :     maStringRangeBox.SetSelectHdl( LINK( this, SaneDlg, SelectHdl ) );
     112         [ #  # ]:          0 :     maQuantumRangeBox.SetSelectHdl( LINK( this, SaneDlg, SelectHdl ) );
     113         [ #  # ]:          0 :     maLeftField.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) );
     114         [ #  # ]:          0 :     maRightField.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) );
     115         [ #  # ]:          0 :     maTopField.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) );
     116         [ #  # ]:          0 :     maBottomField.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) );
     117         [ #  # ]:          0 :     maAdvancedBox.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
     118                 :            : 
     119         [ #  # ]:          0 :     maOldLink = mrSane.SetReloadOptionsHdl( LINK( this, SaneDlg, ReloadSaneOptionsHdl ) );
     120                 :            : 
     121                 :            :     maOptionBox.SetNodeBitmaps(
     122                 :            :         Bitmap( SaneResId( RID_SCAN_BITMAP_PLUS ) ),
     123                 :            :         Bitmap( SaneResId( RID_SCAN_BITMAP_MINUS ) )
     124 [ #  # ][ #  # ]:          0 :         );
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     125         [ #  # ]:          0 :     maOptionBox.SetStyle( maOptionBox.GetStyle()|
     126                 :            :                           WB_HASLINES           |
     127                 :            :                           WB_HASBUTTONS         |
     128                 :            :                           WB_NOINITIALSELECTION |
     129                 :            :                           WB_HASBUTTONSATROOT   |
     130                 :            :                           WB_HASLINESATROOT
     131         [ #  # ]:          0 :                         );
     132         [ #  # ]:          0 :     FreeResource();
     133                 :          0 : }
     134                 :            : 
     135 [ #  # ][ #  # ]:          0 : SaneDlg::~SaneDlg()
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
                 [ #  # ]
     136                 :            : {
     137                 :          0 :     mrSane.SetReloadOptionsHdl( maOldLink );
     138         [ #  # ]:          0 : }
     139                 :            : 
     140                 :          0 : short SaneDlg::Execute()
     141                 :            : {
     142         [ #  # ]:          0 :     if( ! Sane::IsSane() )
     143                 :            :     {
     144                 :            :         ErrorBox aErrorBox( NULL, WB_OK | WB_DEF_OK,
     145 [ #  # ][ #  # ]:          0 :                             String( SaneResId( RID_SANE_NOSANELIB_TXT ) ) );
         [ #  # ][ #  # ]
     146         [ #  # ]:          0 :         aErrorBox.Execute();
     147         [ #  # ]:          0 :         return sal_False;
     148                 :            :     }
     149                 :          0 :     LoadState();
     150                 :          0 :     return ModalDialog::Execute();
     151                 :            : }
     152                 :            : 
     153                 :          0 : void SaneDlg::InitDevices()
     154                 :            : {
     155         [ #  # ]:          0 :     if( ! Sane::IsSane() )
     156                 :          0 :         return;
     157                 :            : 
     158         [ #  # ]:          0 :     if( mrSane.IsOpen() )
     159                 :          0 :         mrSane.Close();
     160                 :          0 :     mrSane.ReloadDevices();
     161                 :          0 :     maDeviceBox.Clear();
     162         [ #  # ]:          0 :     for( int i = 0; i < Sane::CountDevices(); i++ )
     163         [ #  # ]:          0 :         maDeviceBox.InsertEntry( Sane::GetName( i ) );
     164         [ #  # ]:          0 :     if( Sane::CountDevices() )
     165                 :            :     {
     166                 :          0 :         mrSane.Open( 0 );
     167         [ #  # ]:          0 :         maDeviceBox.SelectEntry( Sane::GetName( 0 ) );
     168                 :            : 
     169                 :            :     }
     170                 :            : }
     171                 :            : 
     172                 :          0 : void SaneDlg::InitFields()
     173                 :            : {
     174         [ #  # ]:          0 :     if( ! Sane::IsSane() )
     175                 :            :         return;
     176                 :            : 
     177                 :            :     int nOption, i, nValue;
     178                 :            :     double fValue;
     179                 :          0 :     sal_Bool bSuccess = sal_False;
     180                 :            :     const char *ppSpecialOptions[] = {
     181                 :            :         "resolution",
     182                 :            :         "tl-x",
     183                 :            :         "tl-y",
     184                 :            :         "br-x",
     185                 :            :         "br-y",
     186                 :            :         "preview"
     187                 :          0 :     };
     188                 :            : 
     189                 :          0 :     mbDragEnable = sal_True;
     190         [ #  # ]:          0 :     maReslBox.Clear();
     191                 :          0 :     maMinTopLeft = Point( 0, 0 );
     192                 :          0 :     maMaxBottomRight = Point( PREVIEW_WIDTH,  PREVIEW_HEIGHT );
     193         [ #  # ]:          0 :     maScanButton.Show( mbScanEnabled );
     194                 :            : 
     195         [ #  # ]:          0 :     if( ! mrSane.IsOpen() )
     196                 :            :         return;
     197                 :            : 
     198                 :            :     // set Resolution
     199         [ #  # ]:          0 :     nOption = mrSane.GetOptionByName( "resolution" );
     200         [ #  # ]:          0 :     if( nOption != -1 )
     201                 :            :     {
     202                 :            :         double fRes;
     203                 :            : 
     204         [ #  # ]:          0 :         bSuccess = mrSane.GetOptionValue( nOption, fRes );
     205         [ #  # ]:          0 :         if( bSuccess )
     206                 :            :         {
     207         [ #  # ]:          0 :             maReslBox.Enable( sal_True );
     208                 :            : 
     209         [ #  # ]:          0 :             maReslBox.SetValue( (long)fRes );
     210                 :          0 :             double *pDouble = NULL;
     211         [ #  # ]:          0 :             nValue = mrSane.GetRange( nOption, pDouble );
     212         [ #  # ]:          0 :             if( nValue > -1 )
     213                 :            :             {
     214         [ #  # ]:          0 :                 if( nValue )
     215                 :            :                 {
     216         [ #  # ]:          0 :                     maReslBox.SetMin( (long)pDouble[0] );
     217         [ #  # ]:          0 :                     maReslBox.SetMax( (long)pDouble[ nValue-1 ] );
     218         [ #  # ]:          0 :                     for( i=0; i<nValue; i++ )
     219                 :            :                     {
     220 [ #  # ][ #  # ]:          0 :                         if( i == 0 || i == nValue-1 || ! ( ((int)pDouble[i]) % 20) )
                 [ #  # ]
     221         [ #  # ]:          0 :                             maReslBox.InsertValue( (long)pDouble[i] );
     222                 :            :                     }
     223                 :            :                 }
     224                 :            :                 else
     225                 :            :                 {
     226         [ #  # ]:          0 :                     maReslBox.SetMin( (long)pDouble[0] );
     227         [ #  # ]:          0 :                     maReslBox.SetMax( (long)pDouble[1] );
     228         [ #  # ]:          0 :                     maReslBox.InsertValue( (long)pDouble[0] );
     229                 :            :                     // Can only select 75 and 2400 dpi in Scanner dialogue
     230                 :            :                     // scanner allows random setting of dpi resolution, a slider might be useful
     231                 :            :                     // support that
     232                 :            :                     // workaround: offer at least some more standard dpi resolution between
     233                 :            :                     // min and max value
     234                 :          0 :                     int bGot300 = 0;
     235         [ #  # ]:          0 :                     for ( int nRes = (long) pDouble[0] * 2; nRes < (long) pDouble[1]; nRes = nRes * 2 )
     236                 :            :                     {
     237 [ #  # ][ #  # ]:          0 :                         if ( !bGot300 && nRes > 300 ) {
     238                 :          0 :                             nRes = 300; bGot300 = 1;
     239                 :            :                         }
     240         [ #  # ]:          0 :                         maReslBox.InsertValue(nRes);
     241                 :            :                     }
     242         [ #  # ]:          0 :                     maReslBox.InsertValue( (long)pDouble[1] );
     243                 :            :                 }
     244         [ #  # ]:          0 :                 if( pDouble )
     245         [ #  # ]:          0 :                     delete [] pDouble;
     246                 :            :             }
     247                 :            :             else
     248         [ #  # ]:          0 :                 maReslBox.Enable( sal_False );
     249                 :            :         }
     250                 :            :     }
     251                 :            :     else
     252         [ #  # ]:          0 :         maReslBox.Enable( sal_False );
     253                 :            : 
     254                 :            :     // set scan area
     255         [ #  # ]:          0 :     for( i = 0; i < 4; i++ )
     256                 :            :     {
     257                 :          0 :         char const *pOptionName = NULL;
     258                 :          0 :         MetricField* pField = NULL;
     259   [ #  #  #  #  :          0 :         switch( i )
                      # ]
     260                 :            :         {
     261                 :            :             case 0:
     262                 :          0 :                 pOptionName = "tl-x";
     263                 :          0 :                 pField = &maLeftField;
     264                 :          0 :                 break;
     265                 :            :             case 1:
     266                 :          0 :                 pOptionName = "tl-y";
     267                 :          0 :                 pField = &maTopField;
     268                 :          0 :                 break;
     269                 :            :             case 2:
     270                 :          0 :                 pOptionName = "br-x";
     271                 :          0 :                 pField = &maRightField;
     272                 :          0 :                 break;
     273                 :            :             case 3:
     274                 :          0 :                 pOptionName = "br-y";
     275                 :          0 :                 pField = &maBottomField;
     276                 :            :         }
     277 [ #  # ][ #  # ]:          0 :         nOption = pOptionName ? mrSane.GetOptionByName( pOptionName ) : -1;
     278                 :          0 :         bSuccess = sal_False;
     279         [ #  # ]:          0 :         if( nOption != -1 )
     280                 :            :         {
     281         [ #  # ]:          0 :             bSuccess = mrSane.GetOptionValue( nOption, fValue, 0 );
     282         [ #  # ]:          0 :             if( bSuccess )
     283                 :            :             {
     284         [ #  # ]:          0 :                 if( mrSane.GetOptionUnit( nOption ) == SANE_UNIT_MM )
     285                 :            :                 {
     286         [ #  # ]:          0 :                     pField->SetUnit( FUNIT_MM );
     287         [ #  # ]:          0 :                     pField->SetValue( (int)fValue, FUNIT_MM );
     288                 :            :                 }
     289                 :            :                 else // SANE_UNIT_PIXEL
     290                 :            :                 {
     291         [ #  # ]:          0 :                     pField->SetValue( (int)fValue, FUNIT_CUSTOM );
     292 [ #  # ][ #  # ]:          0 :                     pField->SetCustomUnitText(rtl::OUString("Pixel"));
                 [ #  # ]
     293                 :            :                 }
     294   [ #  #  #  #  :          0 :                 switch( i ) {
                      # ]
     295                 :          0 :                     case 0: maTopLeft.X() = (int)fValue;break;
     296                 :          0 :                     case 1: maTopLeft.Y() = (int)fValue;break;
     297                 :          0 :                     case 2: maBottomRight.X() = (int)fValue;break;
     298                 :          0 :                     case 3: maBottomRight.Y() = (int)fValue;break;
     299                 :            :                 }
     300                 :            :             }
     301                 :          0 :             double *pDouble = NULL;
     302         [ #  # ]:          0 :             nValue = mrSane.GetRange( nOption, pDouble );
     303         [ #  # ]:          0 :             if( nValue > -1 )
     304                 :            :             {
     305         [ #  # ]:          0 :                 if( pDouble )
     306                 :            :                 {
     307         [ #  # ]:          0 :                     pField->SetMin( (long)pDouble[0] );
     308         [ #  # ]:          0 :                     if( nValue )
     309         [ #  # ]:          0 :                         pField->SetMax( (long)pDouble[ nValue-1 ] );
     310                 :            :                     else
     311         [ #  # ]:          0 :                         pField->SetMax( (long)pDouble[ 1 ] );
     312         [ #  # ]:          0 :                     delete [] pDouble;
     313                 :            :                 }
     314   [ #  #  #  #  :          0 :                 switch( i ) {
                      # ]
     315                 :          0 :                     case 0: maMinTopLeft.X() = pField->GetMin();break;
     316                 :          0 :                     case 1: maMinTopLeft.Y() = pField->GetMin();break;
     317                 :          0 :                     case 2: maMaxBottomRight.X() = pField->GetMax();break;
     318                 :          0 :                     case 3: maMaxBottomRight.Y() = pField->GetMax();break;
     319                 :            :                 }
     320                 :            :             }
     321                 :            :             else
     322                 :            :             {
     323   [ #  #  #  #  :          0 :                 switch( i ) {
                      # ]
     324                 :          0 :                     case 0: maMinTopLeft.X() = (int)fValue;break;
     325                 :          0 :                     case 1: maMinTopLeft.Y() = (int)fValue;break;
     326                 :          0 :                     case 2: maMaxBottomRight.X() = (int)fValue;break;
     327                 :          0 :                     case 3: maMaxBottomRight.Y() = (int)fValue;break;
     328                 :            :                 }
     329                 :            :             }
     330         [ #  # ]:          0 :             pField->Enable( sal_True );
     331                 :            :         }
     332                 :            :         else
     333                 :            :         {
     334                 :          0 :             mbDragEnable = sal_False;
     335         [ #  # ]:          0 :             pField->SetMin( 0 );
     336   [ #  #  #  #  :          0 :             switch( i ) {
                      # ]
     337                 :            :                 case 0:
     338                 :          0 :                     maMinTopLeft.X() = 0;
     339                 :          0 :                     maTopLeft.X() = 0;
     340         [ #  # ]:          0 :                     pField->SetMax( PREVIEW_WIDTH );
     341         [ #  # ]:          0 :                     pField->SetValue( 0 );
     342                 :          0 :                     break;
     343                 :            :                 case 1:
     344                 :          0 :                     maMinTopLeft.Y() = 0;
     345                 :          0 :                     maTopLeft.Y() = 0;
     346         [ #  # ]:          0 :                     pField->SetMax( PREVIEW_HEIGHT );
     347         [ #  # ]:          0 :                     pField->SetValue( 0 );
     348                 :          0 :                     break;
     349                 :            :                 case 2:
     350                 :          0 :                     maMaxBottomRight.X() = PREVIEW_WIDTH;
     351                 :          0 :                     maBottomRight.X() = PREVIEW_WIDTH;
     352         [ #  # ]:          0 :                     pField->SetMax( PREVIEW_WIDTH );
     353         [ #  # ]:          0 :                     pField->SetValue( PREVIEW_WIDTH );
     354                 :          0 :                     break;
     355                 :            :                 case 3:
     356                 :          0 :                     maMaxBottomRight.Y() = PREVIEW_HEIGHT;
     357                 :          0 :                     maBottomRight.Y() = PREVIEW_HEIGHT;
     358         [ #  # ]:          0 :                     pField->SetMax( PREVIEW_HEIGHT );
     359         [ #  # ]:          0 :                     pField->SetValue( PREVIEW_HEIGHT );
     360                 :          0 :                     break;
     361                 :            :             }
     362         [ #  # ]:          0 :             pField->Enable( sal_False );
     363                 :            :         }
     364                 :            :     }
     365         [ #  # ]:          0 :     maTopLeft = GetPixelPos( maTopLeft );
     366         [ #  # ]:          0 :     maBottomRight = GetPixelPos( maBottomRight );
     367                 :            :     maPreviewRect = Rectangle( maTopLeft,
     368                 :          0 :                                Size( maBottomRight.X() - maTopLeft.X(),
     369                 :          0 :                                      maBottomRight.Y() - maTopLeft.Y() )
     370         [ #  # ]:          0 :                                );
     371                 :            :     // fill OptionBox
     372         [ #  # ]:          0 :     maOptionBox.Clear();
     373                 :          0 :     SvLBoxEntry* pParentEntry = 0;
     374                 :          0 :     sal_Bool bGroupRejected = sal_False;
     375         [ #  # ]:          0 :     for( i = 1; i < mrSane.CountOptions(); i++ )
     376                 :            :     {
     377         [ #  # ]:          0 :         String aOption=mrSane.GetOptionName( i );
     378                 :            :         sal_Bool bInsertAdvanced =
     379                 :          0 :             mrSane.GetOptionCap( i ) & SANE_CAP_ADVANCED &&
     380 [ #  # ][ #  # ]:          0 :             ! maAdvancedBox.IsChecked() ? sal_False : sal_True;
                 [ #  # ]
     381         [ #  # ]:          0 :         if( mrSane.GetOptionType( i ) == SANE_TYPE_GROUP )
     382                 :            :         {
     383         [ #  # ]:          0 :             if( bInsertAdvanced )
     384                 :            :             {
     385 [ #  # ][ #  # ]:          0 :                 aOption = mrSane.GetOptionTitle( i );
                 [ #  # ]
     386         [ #  # ]:          0 :                 pParentEntry = maOptionBox.InsertEntry( aOption );
     387                 :          0 :                 bGroupRejected = sal_False;
     388                 :            :             }
     389                 :            :             else
     390                 :          0 :                 bGroupRejected = sal_True;
     391                 :            :         }
     392   [ #  #  #  # ]:          0 :         else if( aOption.Len() &&
         [ #  # ][ #  # ]
                 [ #  # ]
     393                 :          0 :                  ! ( mrSane.GetOptionCap( i ) &
     394                 :            :                      (
     395                 :            :                          SANE_CAP_HARD_SELECT |
     396                 :            :                          SANE_CAP_INACTIVE
     397                 :          0 :                          ) ) &&
     398                 :            :                  bInsertAdvanced && ! bGroupRejected )
     399                 :            :         {
     400                 :          0 :             sal_Bool bIsSpecial = sal_False;
     401 [ #  # ][ #  # ]:          0 :             for( size_t n = 0; !bIsSpecial &&
                 [ #  # ]
     402                 :            :                      n < SAL_N_ELEMENTS(ppSpecialOptions); n++ )
     403                 :            :             {
     404 [ #  # ][ #  # ]:          0 :                 if( aOption.EqualsAscii( ppSpecialOptions[n] ) )
     405                 :          0 :                     bIsSpecial=sal_True;
     406                 :            :             }
     407         [ #  # ]:          0 :             if( ! bIsSpecial )
     408                 :            :             {
     409         [ #  # ]:          0 :                 if( pParentEntry )
     410         [ #  # ]:          0 :                     maOptionBox.InsertEntry( aOption, pParentEntry );
     411                 :            :                 else
     412         [ #  # ]:          0 :                     maOptionBox.InsertEntry( aOption );
     413                 :            :             }
     414                 :            :         }
     415         [ #  # ]:          0 :     }
     416                 :            : }
     417                 :            : 
     418                 :          0 : IMPL_LINK( SaneDlg, ClickBtnHdl, Button*, pButton )
     419                 :            : {
     420         [ #  # ]:          0 :     if( mrSane.IsOpen() )
     421                 :            :     {
     422         [ #  # ]:          0 :         if( pButton == &maDeviceInfoButton )
     423                 :            :         {
     424 [ #  # ][ #  # ]:          0 :             String aString( SaneResId( RID_SANE_DEVICEINFO_TXT ) );
     425         [ #  # ]:          0 :             String aSR( RTL_CONSTASCII_USTRINGPARAM( "%s" ) );
     426 [ #  # ][ #  # ]:          0 :             aString.SearchAndReplace( aSR, Sane::GetName( mrSane.GetDeviceNumber() ) );
                 [ #  # ]
     427 [ #  # ][ #  # ]:          0 :             aString.SearchAndReplace( aSR, Sane::GetVendor( mrSane.GetDeviceNumber() ) );
                 [ #  # ]
     428 [ #  # ][ #  # ]:          0 :             aString.SearchAndReplace( aSR, Sane::GetModel( mrSane.GetDeviceNumber() ) );
                 [ #  # ]
     429 [ #  # ][ #  # ]:          0 :             aString.SearchAndReplace( aSR, Sane::GetType( mrSane.GetDeviceNumber() ) );
                 [ #  # ]
     430         [ #  # ]:          0 :             InfoBox aInfoBox( this, aString );
     431 [ #  # ][ #  # ]:          0 :             aInfoBox.Execute();
         [ #  # ][ #  # ]
     432                 :            :         }
     433         [ #  # ]:          0 :         else if( pButton == &maPreviewButton )
     434                 :          0 :             AcquirePreview();
     435         [ #  # ]:          0 :         else if( pButton == &maBoolCheckBox )
     436                 :            :         {
     437                 :            :             mrSane.SetOptionValue( mnCurrentOption,
     438                 :          0 :                                    maBoolCheckBox.IsChecked() ?
     439         [ #  # ]:          0 :                                    (sal_Bool)sal_True : (sal_Bool)sal_False );
     440                 :            :         }
     441         [ #  # ]:          0 :         else if( pButton == &maButtonOption )
     442                 :            :         {
     443                 :            : 
     444                 :          0 :             SANE_Value_Type nType = mrSane.GetOptionType( mnCurrentOption );
     445   [ #  #  #  # ]:          0 :             switch( nType )
     446                 :            :             {
     447                 :            :                 case SANE_TYPE_BUTTON:
     448                 :          0 :                     mrSane.ActivateButtonOption( mnCurrentOption );
     449                 :          0 :                     break;
     450                 :            :                 case SANE_TYPE_FIXED:
     451                 :            :                 case SANE_TYPE_INT:
     452                 :            :                 {
     453                 :          0 :                     int nElements = mrSane.GetOptionElements( mnCurrentOption );
     454         [ #  # ]:          0 :                     double* x = new double[ nElements ];
     455         [ #  # ]:          0 :                     double* y = new double[ nElements ];
     456         [ #  # ]:          0 :                     for( int i = 0; i < nElements; i++ )
     457                 :          0 :                         x[ i ] = (double)i;
     458         [ #  # ]:          0 :                     mrSane.GetOptionValue( mnCurrentOption, y );
     459                 :            : 
     460         [ #  # ]:          0 :                     GridWindow aGrid( x, y, nElements, this );
     461 [ #  # ][ #  # ]:          0 :                     aGrid.SetText( mrSane.GetOptionName( mnCurrentOption ) );
                 [ #  # ]
     462         [ #  # ]:          0 :                     aGrid.setBoundings( 0, mfMin, nElements, mfMax );
     463 [ #  # ][ #  # ]:          0 :                     if( aGrid.Execute() && aGrid.getNewYValues() )
         [ #  # ][ #  # ]
     464         [ #  # ]:          0 :                         mrSane.SetOptionValue( mnCurrentOption, aGrid.getNewYValues() );
     465                 :            : 
     466         [ #  # ]:          0 :                     delete [] x;
     467 [ #  # ][ #  # ]:          0 :                     delete [] y;
     468                 :            :                 }
     469                 :          0 :                 break;
     470                 :            :                 case SANE_TYPE_BOOL:
     471                 :            :                 case SANE_TYPE_STRING:
     472                 :            :                 case SANE_TYPE_GROUP:
     473                 :          0 :                     break;
     474                 :            :             }
     475                 :            :         }
     476         [ #  # ]:          0 :         else if( pButton == &maAdvancedBox )
     477                 :            :         {
     478                 :          0 :             ReloadSaneOptionsHdl( NULL );
     479                 :            :         }
     480                 :            :     }
     481 [ #  # ][ #  # ]:          0 :     if( pButton == &maOKButton || pButton == &maScanButton )
     482                 :            :     {
     483                 :          0 :         double fRes = (double)maReslBox.GetValue();
     484                 :          0 :         SetAdjustedNumericalValue( "resolution", fRes );
     485                 :          0 :         UpdateScanArea( sal_True );
     486                 :          0 :         SaveState();
     487         [ #  # ]:          0 :         EndDialog( mrSane.IsOpen() ? 1 : 0 );
     488                 :          0 :         doScan = (pButton == &maScanButton);
     489                 :            :     }
     490         [ #  # ]:          0 :     else if( pButton == &maCancelButton )
     491                 :            :     {
     492                 :          0 :         mrSane.Close();
     493                 :          0 :         EndDialog( 0 );
     494                 :            :     }
     495                 :          0 :     return 0;
     496                 :            : }
     497                 :            : 
     498                 :          0 : IMPL_LINK( SaneDlg, SelectHdl, ListBox*, pListBox )
     499                 :            : {
     500 [ #  # ][ #  # ]:          0 :     if( pListBox == &maDeviceBox && Sane::IsSane() && Sane::CountDevices() )
         [ #  # ][ #  # ]
     501                 :            :     {
     502         [ #  # ]:          0 :         String aNewDevice = maDeviceBox.GetSelectEntry();
     503                 :            :         int nNumber;
     504 [ #  # ][ #  # ]:          0 :         if( aNewDevice.Equals( Sane::GetName( nNumber = mrSane.GetDeviceNumber() ) ) )
         [ #  # ][ #  # ]
     505                 :            :         {
     506         [ #  # ]:          0 :             mrSane.Close();
     507         [ #  # ]:          0 :             mrSane.Open( nNumber );
     508         [ #  # ]:          0 :             InitFields();
     509         [ #  # ]:          0 :         }
     510                 :            :     }
     511         [ #  # ]:          0 :     if( mrSane.IsOpen() )
     512                 :            :     {
     513         [ #  # ]:          0 :         if( pListBox == &maQuantumRangeBox )
     514                 :            :         {
     515                 :            :             rtl::OString aValue(rtl::OUStringToOString(maQuantumRangeBox.GetSelectEntry(),
     516 [ #  # ][ #  # ]:          0 :                 osl_getThreadTextEncoding()));
         [ #  # ][ #  # ]
                 [ #  # ]
     517                 :          0 :             double fValue = atof(aValue.getStr());
     518         [ #  # ]:          0 :             mrSane.SetOptionValue( mnCurrentOption, fValue, mnCurrentElement );
     519                 :            :         }
     520         [ #  # ]:          0 :         else if( pListBox == &maStringRangeBox )
     521                 :            :         {
     522         [ #  # ]:          0 :             mrSane.SetOptionValue( mnCurrentOption, maStringRangeBox.GetSelectEntry() );
     523                 :            :         }
     524                 :            :     }
     525                 :          0 :     return 0;
     526                 :            : }
     527                 :            : 
     528                 :          0 : IMPL_LINK( SaneDlg, OptionsBoxSelectHdl, SvTreeListBox*, pBox )
     529                 :            : {
     530 [ #  # ][ #  # ]:          0 :     if( pBox == &maOptionBox && Sane::IsSane() )
                 [ #  # ]
     531                 :            :     {
     532                 :            :         String aOption =
     533 [ #  # ][ #  # ]:          0 :             maOptionBox.GetEntryText( maOptionBox.FirstSelected() );
     534                 :            :         int nOption = mrSane.GetOptionByName(rtl::OUStringToOString(aOption,
     535 [ #  # ][ #  # ]:          0 :             osl_getThreadTextEncoding()).getStr());
         [ #  # ][ #  # ]
     536 [ #  # ][ #  # ]:          0 :         if( nOption != -1 && nOption != mnCurrentOption )
     537                 :            :         {
     538         [ #  # ]:          0 :             DisableOption();
     539                 :          0 :             mnCurrentOption = nOption;
     540 [ #  # ][ #  # ]:          0 :             maOptionTitle.SetText( mrSane.GetOptionTitle( mnCurrentOption ) );
                 [ #  # ]
     541                 :          0 :             SANE_Value_Type nType = mrSane.GetOptionType( mnCurrentOption );
     542                 :            :             SANE_Constraint_Type nConstraint;
     543   [ #  #  #  #  :          0 :             switch( nType )
                      # ]
     544                 :            :             {
     545         [ #  # ]:          0 :                 case SANE_TYPE_BOOL:    EstablishBoolOption();break;
     546                 :            :                 case SANE_TYPE_STRING:
     547                 :          0 :                     nConstraint = mrSane.GetOptionConstraintType( mnCurrentOption );
     548         [ #  # ]:          0 :                     if( nConstraint == SANE_CONSTRAINT_STRING_LIST )
     549         [ #  # ]:          0 :                         EstablishStringRange();
     550                 :            :                     else
     551         [ #  # ]:          0 :                         EstablishStringOption();
     552                 :          0 :                     break;
     553                 :            :                 case SANE_TYPE_FIXED:
     554                 :            :                 case SANE_TYPE_INT:
     555                 :            :                 {
     556                 :          0 :                     nConstraint = mrSane.GetOptionConstraintType( mnCurrentOption );
     557                 :          0 :                     int nElements = mrSane.GetOptionElements( mnCurrentOption );
     558                 :          0 :                     mnCurrentElement = 0;
     559 [ #  # ][ #  # ]:          0 :                     if( nConstraint == SANE_CONSTRAINT_RANGE ||
     560                 :            :                         nConstraint == SANE_CONSTRAINT_WORD_LIST )
     561         [ #  # ]:          0 :                         EstablishQuantumRange();
     562                 :            :                     else
     563                 :            :                     {
     564                 :          0 :                         mfMin = mfMax = 0.0;
     565         [ #  # ]:          0 :                         EstablishNumericOption();
     566                 :            :                     }
     567         [ #  # ]:          0 :                     if( nElements > 1 )
     568                 :            :                     {
     569         [ #  # ]:          0 :                         if( nElements <= 10 )
     570                 :            :                         {
     571         [ #  # ]:          0 :                             maVectorBox.SetValue( 1 );
     572         [ #  # ]:          0 :                             maVectorBox.SetMin( 1 );
     573                 :            :                             maVectorBox.SetMax(
     574         [ #  # ]:          0 :                                 mrSane.GetOptionElements( mnCurrentOption ) );
     575         [ #  # ]:          0 :                             maVectorBox.Show( sal_True );
     576         [ #  # ]:          0 :                             maVectorTxt.Show( sal_True );
     577                 :            :                         }
     578                 :            :                         else
     579                 :            :                         {
     580         [ #  # ]:          0 :                             DisableOption();
     581                 :            :                             // bring up dialog only on button click
     582         [ #  # ]:          0 :                             EstablishButtonOption();
     583                 :            :                         }
     584                 :            :                     }
     585                 :            :                 }
     586                 :          0 :                 break;
     587                 :            :                 case SANE_TYPE_BUTTON:
     588         [ #  # ]:          0 :                     EstablishButtonOption();
     589                 :          0 :                     break;
     590                 :          0 :                 default: break;
     591                 :            :             }
     592         [ #  # ]:          0 :         }
     593                 :            :     }
     594                 :          0 :     return 0;
     595                 :            : }
     596                 :            : 
     597                 :          0 : IMPL_LINK( SaneDlg, ModifyHdl, Edit*, pEdit )
     598                 :            : {
     599         [ #  # ]:          0 :     if( mrSane.IsOpen() )
     600                 :            :     {
     601         [ #  # ]:          0 :         if( pEdit == &maStringEdit )
     602                 :            :         {
     603         [ #  # ]:          0 :             mrSane.SetOptionValue( mnCurrentOption, maStringEdit.GetText() );
     604                 :            :         }
     605         [ #  # ]:          0 :         else if( pEdit == &maReslBox )
     606                 :            :         {
     607                 :          0 :             double fRes = (double)maReslBox.GetValue();
     608                 :          0 :             int nOption = mrSane.GetOptionByName( "resolution" );
     609         [ #  # ]:          0 :             if( nOption != -1 )
     610                 :            :             {
     611                 :          0 :                 double* pDouble = NULL;
     612         [ #  # ]:          0 :                 int nValues = mrSane.GetRange( nOption, pDouble );
     613         [ #  # ]:          0 :                 if( nValues > 0 )
     614                 :            :                 {
     615                 :            :                     int i;
     616         [ #  # ]:          0 :                     for( i = 0; i < nValues; i++ )
     617                 :            :                     {
     618         [ #  # ]:          0 :                         if( fRes == pDouble[i] )
     619                 :          0 :                             break;
     620                 :            :                     }
     621         [ #  # ]:          0 :                     if( i >= nValues )
     622                 :          0 :                         fRes = pDouble[0];
     623                 :            :                 }
     624         [ #  # ]:          0 :                 else if( nValues == 0 )
     625                 :            :                 {
     626         [ #  # ]:          0 :                     if( fRes < pDouble[ 0 ] )
     627                 :          0 :                         fRes = pDouble[ 0 ];
     628         [ #  # ]:          0 :                     if( fRes > pDouble[ 1 ] )
     629                 :          0 :                         fRes = pDouble[ 1 ];
     630                 :            :                 }
     631         [ #  # ]:          0 :                 maReslBox.SetValue( (sal_uLong)fRes );
     632                 :            :             }
     633                 :            :         }
     634         [ #  # ]:          0 :         else if( pEdit == &maNumericEdit )
     635                 :            :         {
     636                 :            :             double fValue;
     637                 :            :             char pBuf[256];
     638                 :            :             rtl::OString aContents(rtl::OUStringToOString(maNumericEdit.GetText(),
     639 [ #  # ][ #  # ]:          0 :                 osl_getThreadTextEncoding()));
         [ #  # ][ #  # ]
                 [ #  # ]
     640                 :          0 :             fValue = atof(aContents.getStr());
     641 [ #  # ][ #  # ]:          0 :             if( mfMin != mfMax && ( fValue < mfMin || fValue > mfMax ) )
                 [ #  # ]
     642                 :            :             {
     643         [ #  # ]:          0 :                 if( fValue < mfMin )
     644                 :          0 :                     fValue = mfMin;
     645         [ #  # ]:          0 :                 else if( fValue > mfMax )
     646                 :          0 :                 fValue = mfMax;
     647                 :          0 :                 sprintf( pBuf, "%g", fValue );
     648 [ #  # ][ #  # ]:          0 :                 maNumericEdit.SetText( String( pBuf, osl_getThreadTextEncoding() ) );
         [ #  # ][ #  # ]
     649                 :            :             }
     650         [ #  # ]:          0 :             mrSane.SetOptionValue( mnCurrentOption, fValue, mnCurrentElement );
     651                 :            :         }
     652         [ #  # ]:          0 :         else if( pEdit == &maVectorBox )
     653                 :            :         {
     654                 :            :             char pBuf[256];
     655         [ #  # ]:          0 :             mnCurrentElement = maVectorBox.GetValue()-1;
     656                 :            :             double fValue;
     657         [ #  # ]:          0 :             mrSane.GetOptionValue( mnCurrentOption, fValue, mnCurrentElement );
     658                 :          0 :             sprintf( pBuf, "%g", fValue );
     659 [ #  # ][ #  # ]:          0 :             String aValue( pBuf, osl_getThreadTextEncoding() );
     660         [ #  # ]:          0 :             maNumericEdit.SetText( aValue );
     661 [ #  # ][ #  # ]:          0 :             maQuantumRangeBox.SelectEntry( aValue );
     662                 :            :         }
     663         [ #  # ]:          0 :         else if( pEdit == &maTopField )
     664                 :            :         {
     665         [ #  # ]:          0 :             Point aPoint( 0, maTopField.GetValue() );
     666         [ #  # ]:          0 :             aPoint = GetPixelPos( aPoint );
     667                 :          0 :             maTopLeft.Y() = aPoint.Y();
     668         [ #  # ]:          0 :             DrawDrag();
     669                 :            :         }
     670         [ #  # ]:          0 :         else if( pEdit == &maLeftField )
     671                 :            :         {
     672         [ #  # ]:          0 :             Point aPoint( maLeftField.GetValue(), 0 );
     673         [ #  # ]:          0 :             aPoint = GetPixelPos( aPoint );
     674                 :          0 :             maTopLeft.X() = aPoint.X();
     675         [ #  # ]:          0 :             DrawDrag();
     676                 :            :         }
     677         [ #  # ]:          0 :         else if( pEdit == &maBottomField )
     678                 :            :         {
     679         [ #  # ]:          0 :             Point aPoint( 0, maBottomField.GetValue() );
     680         [ #  # ]:          0 :             aPoint = GetPixelPos( aPoint );
     681                 :          0 :             maBottomRight.Y() = aPoint.Y();
     682         [ #  # ]:          0 :             DrawDrag();
     683                 :            :         }
     684         [ #  # ]:          0 :         else if( pEdit == &maRightField )
     685                 :            :         {
     686         [ #  # ]:          0 :             Point aPoint( maRightField.GetValue(), 0 );
     687         [ #  # ]:          0 :             aPoint = GetPixelPos( aPoint );
     688                 :          0 :             maBottomRight.X() = aPoint.X();
     689         [ #  # ]:          0 :             DrawDrag();
     690                 :            :         }
     691                 :            :     }
     692                 :          0 :     return 0;
     693                 :            : }
     694                 :            : 
     695                 :          0 : IMPL_LINK( SaneDlg, ReloadSaneOptionsHdl, Sane*, /*pSane*/ )
     696                 :            : {
     697                 :          0 :     mnCurrentOption = -1;
     698                 :          0 :     mnCurrentElement = 0;
     699         [ #  # ]:          0 :     DisableOption();
     700                 :            :     // #92024# preserve preview rect, should only be set
     701                 :            :     // initially or in AcquirePreview
     702                 :          0 :     Rectangle aPreviewRect = maPreviewRect;
     703         [ #  # ]:          0 :     InitFields();
     704                 :          0 :     maPreviewRect = aPreviewRect;
     705 [ #  # ][ #  # ]:          0 :     Rectangle aDummyRect( Point( 0, 0 ), GetSizePixel() );
     706         [ #  # ]:          0 :     Paint( aDummyRect );
     707                 :          0 :     return 0;
     708                 :            : }
     709                 :            : 
     710                 :          0 : void SaneDlg::AcquirePreview()
     711                 :            : {
     712         [ #  # ]:          0 :     if( ! mrSane.IsOpen() )
     713                 :            :         return;
     714                 :            : 
     715         [ #  # ]:          0 :     UpdateScanArea( sal_True );
     716                 :            :     // set small resolution for preview
     717         [ #  # ]:          0 :     double fResl = (double)maReslBox.GetValue();
     718         [ #  # ]:          0 :     SetAdjustedNumericalValue( "resolution", 30.0 );
     719                 :            : 
     720         [ #  # ]:          0 :     int nOption = mrSane.GetOptionByName( "preview" );
     721         [ #  # ]:          0 :     if( nOption == -1 )
     722                 :            :     {
     723 [ #  # ][ #  # ]:          0 :         String aString( SaneResId( RID_SANE_NORESOLUTIONOPTION_TXT ) );
     724         [ #  # ]:          0 :         WarningBox aBox( this, WB_OK_CANCEL | WB_DEF_OK, aString );
     725 [ #  # ][ #  # ]:          0 :         if( aBox.Execute() == RET_CANCEL )
     726 [ #  # ][ #  # ]:          0 :             return;
         [ #  # ][ #  # ]
     727                 :            :     }
     728                 :            :     else
     729         [ #  # ]:          0 :         mrSane.SetOptionValue( nOption, (sal_Bool)sal_True );
     730                 :            : 
     731         [ #  # ]:          0 :     BitmapTransporter aTransporter;
     732 [ #  # ][ #  # ]:          0 :     if( ! mrSane.Start( aTransporter ) )
     733                 :            :     {
     734                 :            :         ErrorBox aErrorBox( this, WB_OK | WB_DEF_OK,
     735 [ #  # ][ #  # ]:          0 :                             String( SaneResId( RID_SANE_SCANERROR_TXT ) ) );
         [ #  # ][ #  # ]
     736 [ #  # ][ #  # ]:          0 :         aErrorBox.Execute();
     737                 :            :     }
     738                 :            :     else
     739                 :            :     {
     740                 :            : #if OSL_DEBUG_LEVEL > 1
     741                 :            :         aTransporter.getStream().Seek( STREAM_SEEK_TO_END );
     742                 :            :         fprintf( stderr, "Previewbitmapstream contains %d bytes\n", (int)aTransporter.getStream().Tell() );
     743                 :            : #endif
     744         [ #  # ]:          0 :         aTransporter.getStream().Seek( STREAM_SEEK_TO_BEGIN );
     745         [ #  # ]:          0 :         maPreviewBitmap.Read( aTransporter.getStream(), sal_True );
     746                 :            :     }
     747                 :            : 
     748         [ #  # ]:          0 :     SetAdjustedNumericalValue( "resolution", fResl );
     749         [ #  # ]:          0 :     maReslBox.SetValue( (sal_uLong)fResl );
     750                 :            : 
     751         [ #  # ]:          0 :     if( mbDragEnable )
     752                 :            :     {
     753                 :            :         maPreviewRect = Rectangle( maTopLeft,
     754                 :          0 :                                    Size( maBottomRight.X() - maTopLeft.X(),
     755                 :          0 :                                          maBottomRight.Y() - maTopLeft.Y() )
     756         [ #  # ]:          0 :                                    );
     757                 :            :     }
     758                 :            :     else
     759                 :            :     {
     760         [ #  # ]:          0 :         Size aBMSize( maPreviewBitmap.GetSizePixel() );
     761 [ #  # ][ #  # ]:          0 :         if( aBMSize.Width() > aBMSize.Height() && aBMSize.Width() )
                 [ #  # ]
     762                 :            :         {
     763                 :          0 :             int nVHeight = (maBottomRight.X() - maTopLeft.X()) * aBMSize.Height() / aBMSize.Width();
     764                 :          0 :             maPreviewRect = Rectangle( Point( maTopLeft.X(), ( maTopLeft.Y() + maBottomRight.Y() )/2 - nVHeight/2 ),
     765                 :          0 :                                        Size( maBottomRight.X() - maTopLeft.X(),
     766         [ #  # ]:          0 :                                              nVHeight ) );
     767                 :            :         }
     768         [ #  # ]:          0 :         else if (aBMSize.Height())
     769                 :            :         {
     770                 :          0 :             int nVWidth = (maBottomRight.Y() - maTopLeft.Y()) * aBMSize.Width() / aBMSize.Height();
     771                 :          0 :             maPreviewRect = Rectangle( Point( ( maTopLeft.X() + maBottomRight.X() )/2 - nVWidth/2, maTopLeft.Y() ),
     772                 :            :                                        Size( nVWidth,
     773         [ #  # ]:          0 :                                              maBottomRight.Y() - maTopLeft.Y() ) );
     774                 :            :         }
     775                 :            :     }
     776                 :            : 
     777 [ #  # ][ #  # ]:          0 :     Paint( Rectangle( Point( 0, 0 ), GetSizePixel() ) );
         [ #  # ][ #  # ]
     778                 :            : }
     779                 :            : 
     780                 :          0 : void SaneDlg::Paint( const Rectangle& rRect )
     781                 :            : {
     782                 :          0 :     SetMapMode( maMapMode );
     783         [ #  # ]:          0 :     SetFillColor( Color( COL_WHITE ) );
     784         [ #  # ]:          0 :     SetLineColor( Color( COL_WHITE ) );
     785                 :            :     DrawRect( Rectangle( Point( PREVIEW_UPPER_LEFT, PREVIEW_UPPER_TOP ),
     786 [ #  # ][ #  # ]:          0 :                          Size( PREVIEW_WIDTH, PREVIEW_HEIGHT ) ) );
     787         [ #  # ]:          0 :     SetMapMode( MapMode( MAP_PIXEL ) );
     788                 :            :     // check for sane values
     789                 :          0 :     DrawBitmap( maPreviewRect.TopLeft(), maPreviewRect.GetSize(),
     790         [ #  # ]:          0 :                 maPreviewBitmap );
     791                 :            : 
     792                 :          0 :     mbDragDrawn = sal_False;
     793                 :          0 :     DrawDrag();
     794                 :            : 
     795                 :          0 :     ModalDialog::Paint( rRect );
     796                 :          0 : }
     797                 :            : 
     798                 :          0 : void SaneDlg::DisableOption()
     799                 :            : {
     800                 :          0 :     maBoolCheckBox.Show( sal_False );
     801                 :          0 :     maStringEdit.Show( sal_False );
     802                 :          0 :     maNumericEdit.Show( sal_False );
     803                 :          0 :     maQuantumRangeBox.Show( sal_False );
     804                 :          0 :     maStringRangeBox.Show( sal_False );
     805                 :          0 :     maButtonOption.Show( sal_False );
     806                 :          0 :     maVectorBox.Show( sal_False );
     807                 :          0 :     maVectorTxt.Show( sal_False );
     808                 :          0 :     maOptionDescTxt.Show( sal_False );
     809                 :          0 : }
     810                 :            : 
     811                 :          0 : void SaneDlg::EstablishBoolOption()
     812                 :            : {
     813                 :            :     sal_Bool bSuccess, bValue;
     814                 :            : 
     815         [ #  # ]:          0 :     bSuccess = mrSane.GetOptionValue( mnCurrentOption, bValue );
     816         [ #  # ]:          0 :     if( bSuccess )
     817                 :            :     {
     818 [ #  # ][ #  # ]:          0 :         maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) );
                 [ #  # ]
     819         [ #  # ]:          0 :         maOptionDescTxt.Show( sal_True );
     820         [ #  # ]:          0 :         maBoolCheckBox.Check( bValue );
     821         [ #  # ]:          0 :         maBoolCheckBox.Show( sal_True );
     822                 :            :     }
     823                 :          0 : }
     824                 :            : 
     825                 :          0 : void SaneDlg::EstablishStringOption()
     826                 :            : {
     827                 :            :     sal_Bool bSuccess;
     828                 :          0 :     rtl::OString aValue;
     829                 :            : 
     830         [ #  # ]:          0 :     bSuccess = mrSane.GetOptionValue( mnCurrentOption, aValue );
     831         [ #  # ]:          0 :     if( bSuccess )
     832                 :            :     {
     833 [ #  # ][ #  # ]:          0 :         maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) );
                 [ #  # ]
     834         [ #  # ]:          0 :         maOptionDescTxt.Show( sal_True );
     835 [ #  # ][ #  # ]:          0 :         maStringEdit.SetText(rtl::OStringToOUString(aValue, osl_getThreadTextEncoding()));
         [ #  # ][ #  # ]
                 [ #  # ]
     836         [ #  # ]:          0 :         maStringEdit.Show( sal_True );
     837                 :          0 :     }
     838                 :          0 : }
     839                 :            : 
     840                 :          0 : void SaneDlg::EstablishStringRange()
     841                 :            : {
     842                 :          0 :     const char** ppStrings = mrSane.GetStringConstraint( mnCurrentOption );
     843         [ #  # ]:          0 :     maStringRangeBox.Clear();
     844         [ #  # ]:          0 :     for( int i = 0; ppStrings[i] != 0; i++ )
     845 [ #  # ][ #  # ]:          0 :         maStringRangeBox.InsertEntry( String( ppStrings[i], osl_getThreadTextEncoding() ) );
         [ #  # ][ #  # ]
     846                 :          0 :     rtl::OString aValue;
     847         [ #  # ]:          0 :     mrSane.GetOptionValue( mnCurrentOption, aValue );
     848 [ #  # ][ #  # ]:          0 :     maStringRangeBox.SelectEntry(rtl::OStringToOUString(aValue, osl_getThreadTextEncoding()));
         [ #  # ][ #  # ]
                 [ #  # ]
     849         [ #  # ]:          0 :     maStringRangeBox.Show( sal_True );
     850 [ #  # ][ #  # ]:          0 :     maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) );
                 [ #  # ]
     851         [ #  # ]:          0 :     maOptionDescTxt.Show( sal_True );
     852                 :          0 : }
     853                 :            : 
     854                 :          0 : void SaneDlg::EstablishQuantumRange()
     855                 :            : {
     856         [ #  # ]:          0 :     if( mpRange )
     857                 :            :     {
     858         [ #  # ]:          0 :         delete [] mpRange;
     859                 :          0 :         mpRange = 0;
     860                 :            :     }
     861                 :          0 :     int nValues = mrSane.GetRange( mnCurrentOption, mpRange );
     862         [ #  # ]:          0 :     if( nValues == 0 )
     863                 :            :     {
     864                 :          0 :         mfMin = mpRange[ 0 ];
     865                 :          0 :         mfMax = mpRange[ 1 ];
     866         [ #  # ]:          0 :         delete [] mpRange;
     867                 :          0 :         mpRange = 0;
     868                 :          0 :         EstablishNumericOption();
     869                 :            :     }
     870         [ #  # ]:          0 :     else if( nValues > 0 )
     871                 :            :     {
     872                 :            :         char pBuf[ 256 ];
     873         [ #  # ]:          0 :         maQuantumRangeBox.Clear();
     874                 :          0 :         mfMin = mpRange[ 0 ];
     875                 :          0 :         mfMax = mpRange[ nValues-1 ];
     876         [ #  # ]:          0 :         for( int i = 0; i < nValues; i++ )
     877                 :            :         {
     878                 :          0 :             sprintf( pBuf, "%g", mpRange[ i ] );
     879 [ #  # ][ #  # ]:          0 :             maQuantumRangeBox.InsertEntry( String( pBuf, osl_getThreadTextEncoding() ) );
         [ #  # ][ #  # ]
     880                 :            :         }
     881                 :            :         double fValue;
     882 [ #  # ][ #  # ]:          0 :         if( mrSane.GetOptionValue( mnCurrentOption, fValue, mnCurrentElement ) )
     883                 :            :         {
     884                 :          0 :             sprintf( pBuf, "%g", fValue );
     885 [ #  # ][ #  # ]:          0 :             maQuantumRangeBox.SelectEntry( String( pBuf, osl_getThreadTextEncoding() ) );
         [ #  # ][ #  # ]
     886                 :            :         }
     887         [ #  # ]:          0 :         maQuantumRangeBox.Show( sal_True );
     888         [ #  # ]:          0 :         String aText( mrSane.GetOptionName( mnCurrentOption ) );
     889         [ #  # ]:          0 :         aText += ' ';
     890 [ #  # ][ #  # ]:          0 :         aText += mrSane.GetOptionUnitName( mnCurrentOption );
                 [ #  # ]
     891         [ #  # ]:          0 :         maOptionDescTxt.SetText( aText );
     892 [ #  # ][ #  # ]:          0 :         maOptionDescTxt.Show( sal_True );
     893                 :            :     }
     894                 :          0 : }
     895                 :            : 
     896                 :          0 : void SaneDlg::EstablishNumericOption()
     897                 :            : {
     898                 :            :     sal_Bool bSuccess;
     899                 :            :     double fValue;
     900                 :            : 
     901         [ #  # ]:          0 :     bSuccess = mrSane.GetOptionValue( mnCurrentOption, fValue );
     902         [ #  # ]:          0 :     if( ! bSuccess )
     903                 :          0 :         return;
     904                 :            : 
     905                 :            :     char pBuf[256];
     906         [ #  # ]:          0 :     String aText( mrSane.GetOptionName( mnCurrentOption ) );
     907         [ #  # ]:          0 :     aText += ' ';
     908 [ #  # ][ #  # ]:          0 :     aText += mrSane.GetOptionUnitName( mnCurrentOption );
                 [ #  # ]
     909         [ #  # ]:          0 :     if( mfMin != mfMax )
     910                 :            :     {
     911                 :          0 :         sprintf( pBuf, " < %g ; %g >", mfMin, mfMax );
     912 [ #  # ][ #  # ]:          0 :         aText += String( pBuf, osl_getThreadTextEncoding() );
         [ #  # ][ #  # ]
     913                 :            :     }
     914         [ #  # ]:          0 :     maOptionDescTxt.SetText( aText );
     915         [ #  # ]:          0 :     maOptionDescTxt.Show( sal_True );
     916                 :          0 :     sprintf( pBuf, "%g", fValue );
     917 [ #  # ][ #  # ]:          0 :     maNumericEdit.SetText( String( pBuf, osl_getThreadTextEncoding() ) );
         [ #  # ][ #  # ]
     918 [ #  # ][ #  # ]:          0 :     maNumericEdit.Show( sal_True );
     919                 :            : }
     920                 :            : 
     921                 :          0 : void SaneDlg::EstablishButtonOption()
     922                 :            : {
     923         [ #  # ]:          0 :     maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) );
     924                 :          0 :     maOptionDescTxt.Show( sal_True );
     925                 :          0 :     maButtonOption.Show( sal_True );
     926                 :          0 : }
     927                 :            : 
     928                 :            : #define RECT_SIZE_PIX 7
     929                 :            : 
     930                 :          0 : void SaneDlg::MouseMove( const MouseEvent& rMEvt )
     931                 :            : {
     932         [ #  # ]:          0 :     if( mbIsDragging )
     933                 :            :     {
     934                 :          0 :         Point aMousePos = rMEvt.GetPosPixel();
     935                 :            :         // move into valid area
     936         [ #  # ]:          0 :         Point aLogicPos = GetLogicPos( aMousePos );
     937         [ #  # ]:          0 :         aMousePos = GetPixelPos( aLogicPos );
     938   [ #  #  #  #  :          0 :         switch( meDragDirection )
             #  #  #  #  
                      # ]
     939                 :            :         {
     940                 :          0 :             case TopLeft:       maTopLeft = aMousePos; break;
     941                 :          0 :             case Top:           maTopLeft.Y() = aMousePos.Y(); break;
     942                 :            :             case TopRight:
     943                 :          0 :                 maTopLeft.Y() = aMousePos.Y();
     944                 :          0 :                 maBottomRight.X() = aMousePos.X();
     945                 :          0 :                 break;
     946                 :          0 :             case Right:         maBottomRight.X() = aMousePos.X(); break;
     947                 :          0 :             case BottomRight:   maBottomRight = aMousePos; break;
     948                 :          0 :             case Bottom:        maBottomRight.Y() = aMousePos.Y(); break;
     949                 :            :             case BottomLeft:
     950                 :          0 :                 maTopLeft.X() = aMousePos.X();
     951                 :          0 :                 maBottomRight.Y() = aMousePos.Y();
     952                 :          0 :                 break;
     953                 :          0 :             case Left:          maTopLeft.X() = aMousePos.X(); break;
     954                 :          0 :             default: break;
     955                 :            :         }
     956                 :            :         int nSwap;
     957         [ #  # ]:          0 :         if( maTopLeft.X() > maBottomRight.X() )
     958                 :            :         {
     959                 :          0 :             nSwap = maTopLeft.X();
     960                 :          0 :             maTopLeft.X() = maBottomRight.X();
     961                 :          0 :             maBottomRight.X() = nSwap;
     962                 :            :         }
     963         [ #  # ]:          0 :         if( maTopLeft.Y() > maBottomRight.Y() )
     964                 :            :         {
     965                 :          0 :             nSwap = maTopLeft.Y();
     966                 :          0 :             maTopLeft.Y() = maBottomRight.Y();
     967                 :          0 :             maBottomRight.Y() = nSwap;
     968                 :            :         }
     969         [ #  # ]:          0 :         DrawDrag();
     970         [ #  # ]:          0 :         UpdateScanArea( sal_False );
     971                 :            :     }
     972                 :          0 :     ModalDialog::MouseMove( rMEvt );
     973                 :          0 : }
     974                 :            : 
     975                 :          0 : void SaneDlg::MouseButtonDown( const MouseEvent& rMEvt )
     976                 :            : {
     977                 :          0 :     Point aMousePixel = rMEvt.GetPosPixel();
     978                 :            : 
     979 [ #  # ][ #  # ]:          0 :     if( ! mbIsDragging  && mbDragEnable )
     980                 :            :     {
     981                 :          0 :         int nMiddleX = ( maBottomRight.X() - maTopLeft.X() ) / 2 - RECT_SIZE_PIX/2 + maTopLeft.X();
     982                 :          0 :         int nMiddleY = ( maBottomRight.Y() - maTopLeft.Y() ) / 2 - RECT_SIZE_PIX/2 + maTopLeft.Y();
     983         [ #  # ]:          0 :         if( aMousePixel.Y() >= maTopLeft.Y() &&
           [ #  #  #  # ]
     984                 :          0 :             aMousePixel.Y() < maTopLeft.Y() + RECT_SIZE_PIX )
     985                 :            :         {
     986   [ #  #  #  # ]:          0 :             if( aMousePixel.X() >= maTopLeft.X() &&
                 [ #  # ]
     987                 :          0 :                 aMousePixel.X() < maTopLeft.X() + RECT_SIZE_PIX )
     988                 :            :             {
     989                 :          0 :                 meDragDirection = TopLeft;
     990                 :          0 :                 aMousePixel = maTopLeft;
     991                 :          0 :                 mbIsDragging = sal_True;
     992                 :            :             }
     993   [ #  #  #  # ]:          0 :             else if( aMousePixel.X() >= nMiddleX &&
                 [ #  # ]
     994                 :          0 :                      aMousePixel.X() < nMiddleX + RECT_SIZE_PIX )
     995                 :            :             {
     996                 :          0 :                 meDragDirection = Top;
     997                 :          0 :                 aMousePixel.Y() = maTopLeft.Y();
     998                 :          0 :                 mbIsDragging = sal_True;
     999                 :            :             }
    1000   [ #  #  #  # ]:          0 :             else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX &&
                 [ #  # ]
    1001                 :          0 :                      aMousePixel.X() <= maBottomRight.X() )
    1002                 :            :             {
    1003                 :          0 :                 meDragDirection = TopRight;
    1004                 :          0 :                 aMousePixel = Point( maBottomRight.X(), maTopLeft.Y() );
    1005                 :          0 :                 mbIsDragging = sal_True;
    1006                 :            :             }
    1007                 :            :         }
    1008   [ #  #  #  # ]:          0 :         else if( aMousePixel.Y() >= nMiddleY &&
                 [ #  # ]
    1009                 :          0 :                  aMousePixel.Y() < nMiddleY + RECT_SIZE_PIX )
    1010                 :            :         {
    1011   [ #  #  #  # ]:          0 :             if( aMousePixel.X() >= maTopLeft.X() &&
                 [ #  # ]
    1012                 :          0 :                 aMousePixel.X() < maTopLeft.X() + RECT_SIZE_PIX )
    1013                 :            :             {
    1014                 :          0 :                 meDragDirection = Left;
    1015                 :          0 :                 aMousePixel.X() = maTopLeft.X();
    1016                 :          0 :                 mbIsDragging = sal_True;
    1017                 :            :             }
    1018   [ #  #  #  # ]:          0 :             else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX &&
                 [ #  # ]
    1019                 :          0 :                      aMousePixel.X() <= maBottomRight.X() )
    1020                 :            :             {
    1021                 :          0 :                 meDragDirection = Right;
    1022                 :          0 :                 aMousePixel.X() = maBottomRight.X();
    1023                 :          0 :                 mbIsDragging = sal_True;
    1024                 :            :             }
    1025                 :            :         }
    1026   [ #  #  #  # ]:          0 :         else if( aMousePixel.Y() <= maBottomRight.Y() &&
                 [ #  # ]
    1027                 :          0 :                  aMousePixel.Y() > maBottomRight.Y() - RECT_SIZE_PIX )
    1028                 :            :         {
    1029   [ #  #  #  # ]:          0 :             if( aMousePixel.X() >= maTopLeft.X() &&
                 [ #  # ]
    1030                 :          0 :                 aMousePixel.X() < maTopLeft.X() + RECT_SIZE_PIX )
    1031                 :            :             {
    1032                 :          0 :                 meDragDirection = BottomLeft;
    1033                 :          0 :                 aMousePixel = Point( maTopLeft.X(), maBottomRight.Y() );
    1034                 :          0 :                 mbIsDragging = sal_True;
    1035                 :            :             }
    1036   [ #  #  #  # ]:          0 :             else if( aMousePixel.X() >= nMiddleX &&
                 [ #  # ]
    1037                 :          0 :                      aMousePixel.X() < nMiddleX + RECT_SIZE_PIX )
    1038                 :            :             {
    1039                 :          0 :                 meDragDirection = Bottom;
    1040                 :          0 :                 aMousePixel.Y() = maBottomRight.Y();
    1041                 :          0 :                 mbIsDragging = sal_True;
    1042                 :            :             }
    1043   [ #  #  #  # ]:          0 :             else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX &&
                 [ #  # ]
    1044                 :          0 :                      aMousePixel.X() <= maBottomRight.X() )
    1045                 :            :             {
    1046                 :          0 :                 meDragDirection = BottomRight;
    1047                 :          0 :                 aMousePixel = maBottomRight;
    1048                 :          0 :                 mbIsDragging = sal_True;
    1049                 :            :             }
    1050                 :            :         }
    1051                 :            :     }
    1052         [ #  # ]:          0 :     if( mbIsDragging )
    1053                 :            :     {
    1054         [ #  # ]:          0 :         SetPointerPosPixel( aMousePixel );
    1055         [ #  # ]:          0 :         DrawDrag();
    1056                 :            :     }
    1057         [ #  # ]:          0 :     ModalDialog::MouseButtonDown( rMEvt );
    1058                 :          0 : }
    1059                 :            : 
    1060                 :          0 : void SaneDlg::MouseButtonUp( const MouseEvent& rMEvt )
    1061                 :            : {
    1062         [ #  # ]:          0 :     if( mbIsDragging )
    1063                 :            :     {
    1064                 :          0 :         UpdateScanArea( sal_True );
    1065                 :            :     }
    1066                 :          0 :     mbIsDragging = sal_False;
    1067                 :            : 
    1068                 :          0 :     ModalDialog::MouseButtonUp( rMEvt );
    1069                 :          0 : }
    1070                 :            : 
    1071                 :          0 : void SaneDlg::DrawRectangles( Point& rUL, Point& rBR )
    1072                 :            : {
    1073                 :            :     int nMiddleX, nMiddleY;
    1074                 :          0 :     Point aBL, aUR;
    1075                 :            : 
    1076                 :          0 :     aUR = Point( rBR.X(), rUL.Y() );
    1077                 :          0 :     aBL = Point( rUL.X(), rBR.Y() );
    1078                 :          0 :     nMiddleX = ( rBR.X() - rUL.X() ) / 2 + rUL.X();
    1079                 :          0 :     nMiddleY = ( rBR.Y() - rUL.Y() ) / 2 + rUL.Y();
    1080                 :            : 
    1081         [ #  # ]:          0 :     DrawLine( rUL, aBL );
    1082         [ #  # ]:          0 :     DrawLine( aBL, rBR );
    1083         [ #  # ]:          0 :     DrawLine( rBR, aUR );
    1084         [ #  # ]:          0 :     DrawLine( aUR, rUL );
    1085 [ #  # ][ #  # ]:          0 :     DrawRect( Rectangle( rUL, Size( RECT_SIZE_PIX,RECT_SIZE_PIX ) ) );
    1086 [ #  # ][ #  # ]:          0 :     DrawRect( Rectangle( aBL, Size( RECT_SIZE_PIX, -RECT_SIZE_PIX ) ) );
    1087 [ #  # ][ #  # ]:          0 :     DrawRect( Rectangle( rBR, Size( -RECT_SIZE_PIX, -RECT_SIZE_PIX ) ) );
    1088 [ #  # ][ #  # ]:          0 :     DrawRect( Rectangle( aUR, Size( -RECT_SIZE_PIX, RECT_SIZE_PIX ) ) );
    1089 [ #  # ][ #  # ]:          0 :     DrawRect( Rectangle( Point( nMiddleX - RECT_SIZE_PIX/2, rUL.Y() ), Size( RECT_SIZE_PIX, RECT_SIZE_PIX ) ) );
    1090 [ #  # ][ #  # ]:          0 :     DrawRect( Rectangle( Point( nMiddleX - RECT_SIZE_PIX/2, rBR.Y() ), Size( RECT_SIZE_PIX, -RECT_SIZE_PIX ) ) );
    1091 [ #  # ][ #  # ]:          0 :     DrawRect( Rectangle( Point( rUL.X(), nMiddleY - RECT_SIZE_PIX/2 ), Size( RECT_SIZE_PIX, RECT_SIZE_PIX ) ) );
    1092 [ #  # ][ #  # ]:          0 :     DrawRect( Rectangle( Point( rBR.X(), nMiddleY - RECT_SIZE_PIX/2 ), Size( -RECT_SIZE_PIX, RECT_SIZE_PIX ) ) );
    1093                 :          0 : }
    1094                 :            : 
    1095                 :          0 : void SaneDlg::DrawDrag()
    1096                 :            : {
    1097 [ #  # ][ #  # ]:          0 :     static Point aLastUL, aLastBR;
         [ #  # ][ #  # ]
    1098                 :            : 
    1099         [ #  # ]:          0 :     if( ! mbDragEnable )
    1100                 :          0 :         return;
    1101                 :            : 
    1102                 :          0 :     RasterOp eROP = GetRasterOp();
    1103                 :          0 :     SetRasterOp( ROP_INVERT );
    1104         [ #  # ]:          0 :     SetMapMode( MapMode( MAP_PIXEL ) );
    1105                 :            : 
    1106         [ #  # ]:          0 :     if( mbDragDrawn )
    1107                 :          0 :         DrawRectangles( aLastUL, aLastBR );
    1108                 :            : 
    1109                 :          0 :     aLastUL = maTopLeft;
    1110                 :          0 :     aLastBR = maBottomRight;
    1111                 :          0 :     DrawRectangles( maTopLeft, maBottomRight );
    1112                 :            : 
    1113                 :          0 :     mbDragDrawn = sal_True;
    1114                 :          0 :     SetRasterOp( eROP );
    1115                 :          0 :     SetMapMode( maMapMode );
    1116                 :            : }
    1117                 :            : 
    1118                 :          0 : Point SaneDlg::GetPixelPos( const Point& rIn )
    1119                 :            : {
    1120                 :            :     Point aConvert(
    1121                 :          0 :         ( ( rIn.X() * PREVIEW_WIDTH ) /
    1122                 :          0 :           ( maMaxBottomRight.X() - maMinTopLeft.X() ) )
    1123                 :            :         + PREVIEW_UPPER_LEFT,
    1124                 :          0 :         ( ( rIn.Y() * PREVIEW_HEIGHT )
    1125                 :          0 :           / ( maMaxBottomRight.Y() - maMinTopLeft.Y() ) )
    1126                 :          0 :         + PREVIEW_UPPER_TOP );
    1127                 :            : 
    1128         [ #  # ]:          0 :     return LogicToPixel( aConvert, maMapMode );
    1129                 :            : }
    1130                 :            : 
    1131                 :          0 : Point SaneDlg::GetLogicPos( const Point& rIn )
    1132                 :            : {
    1133                 :          0 :     Point aConvert = PixelToLogic( rIn, maMapMode );
    1134                 :          0 :     aConvert.X() -= PREVIEW_UPPER_LEFT;
    1135                 :          0 :     aConvert.Y() -= PREVIEW_UPPER_TOP;
    1136         [ #  # ]:          0 :     if( aConvert.X() < 0 )
    1137                 :          0 :         aConvert.X() = 0;
    1138         [ #  # ]:          0 :     if( aConvert.X() >= PREVIEW_WIDTH )
    1139                 :          0 :         aConvert.X() = PREVIEW_WIDTH-1;
    1140         [ #  # ]:          0 :     if( aConvert.Y() < 0 )
    1141                 :          0 :         aConvert.Y() = 0;
    1142         [ #  # ]:          0 :     if( aConvert.Y() >= PREVIEW_HEIGHT )
    1143                 :          0 :         aConvert.Y() = PREVIEW_HEIGHT-1;
    1144                 :            : 
    1145                 :          0 :     aConvert.X() *= ( maMaxBottomRight.X() - maMinTopLeft.X() );
    1146                 :          0 :     aConvert.X() /= PREVIEW_WIDTH;
    1147                 :          0 :     aConvert.Y() *= ( maMaxBottomRight.Y() - maMinTopLeft.Y() );
    1148                 :          0 :     aConvert.Y() /= PREVIEW_HEIGHT;
    1149                 :          0 :     return aConvert;
    1150                 :            : }
    1151                 :            : 
    1152                 :          0 : void SaneDlg::UpdateScanArea( sal_Bool bSend )
    1153                 :            : {
    1154         [ #  # ]:          0 :     if( ! mbDragEnable )
    1155                 :            :         return;
    1156                 :            : 
    1157         [ #  # ]:          0 :     Point aUL = GetLogicPos( maTopLeft );
    1158         [ #  # ]:          0 :     Point aBR = GetLogicPos( maBottomRight );
    1159                 :            : 
    1160         [ #  # ]:          0 :     maLeftField.SetValue( aUL.X() );
    1161         [ #  # ]:          0 :     maTopField.SetValue( aUL.Y() );
    1162         [ #  # ]:          0 :     maRightField.SetValue( aBR.X() );
    1163         [ #  # ]:          0 :     maBottomField.SetValue( aBR.Y() );
    1164                 :            : 
    1165         [ #  # ]:          0 :     if( ! bSend )
    1166                 :            :         return;
    1167                 :            : 
    1168         [ #  # ]:          0 :     if( mrSane.IsOpen() )
    1169                 :            :     {
    1170         [ #  # ]:          0 :         SetAdjustedNumericalValue( "tl-x", (double)aUL.X() );
    1171         [ #  # ]:          0 :         SetAdjustedNumericalValue( "tl-y", (double)aUL.Y() );
    1172         [ #  # ]:          0 :         SetAdjustedNumericalValue( "br-x", (double)aBR.X() );
    1173         [ #  # ]:          0 :         SetAdjustedNumericalValue( "br-y", (double)aBR.Y() );
    1174                 :            :     }
    1175                 :            : }
    1176                 :            : 
    1177                 :          0 : sal_Bool SaneDlg::LoadState()
    1178                 :            : {
    1179                 :            :     int i;
    1180                 :            : 
    1181         [ #  # ]:          0 :     if( ! Sane::IsSane() )
    1182                 :          0 :         return sal_False;
    1183                 :            : 
    1184                 :          0 :     const char* pEnv = getenv("HOME");
    1185 [ #  # ][ #  # ]:          0 :     String aFileName( pEnv ? pEnv : "", osl_getThreadTextEncoding() );
                 [ #  # ]
    1186 [ #  # ][ #  # ]:          0 :     aFileName += String( RTL_CONSTASCII_USTRINGPARAM( "/.so_sane_state" ) );
                 [ #  # ]
    1187 [ #  # ][ #  # ]:          0 :     Config aConfig( aFileName );
    1188 [ #  # ][ #  # ]:          0 :     if( ! aConfig.HasGroup( "SANE" ) )
    1189                 :          0 :         return sal_False;
    1190                 :            : 
    1191         [ #  # ]:          0 :     aConfig.SetGroup( "SANE" );
    1192         [ #  # ]:          0 :     rtl::OString aString = aConfig.ReadKey( "SO_LastSaneDevice" );
    1193 [ #  # ][ #  # ]:          0 :     for( i = 0; i < Sane::CountDevices() && !aString.equals(rtl::OUStringToOString(Sane::GetName(i), osl_getThreadTextEncoding())); i++ ) ;
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
           [ #  #  #  #  
             #  #  #  # ]
    1194         [ #  # ]:          0 :     if( i == Sane::CountDevices() )
    1195                 :          0 :         return sal_False;
    1196                 :            : 
    1197         [ #  # ]:          0 :     mrSane.Close();
    1198         [ #  # ]:          0 :     mrSane.Open( aString.getStr() );
    1199                 :            : 
    1200         [ #  # ]:          0 :     DisableOption();
    1201         [ #  # ]:          0 :     InitFields();
    1202                 :            : 
    1203         [ #  # ]:          0 :     if( mrSane.IsOpen() )
    1204                 :            :     {
    1205         [ #  # ]:          0 :         int iMax = aConfig.GetKeyCount();
    1206         [ #  # ]:          0 :         for (i = 0; i < iMax; ++i)
    1207                 :            :         {
    1208         [ #  # ]:          0 :             aString = aConfig.GetKeyName( i );
    1209         [ #  # ]:          0 :             rtl::OString aValue = aConfig.ReadKey( i );
    1210         [ #  # ]:          0 :             int nOption = mrSane.GetOptionByName( aString.getStr() );
    1211         [ #  # ]:          0 :             if( nOption == -1 )
    1212                 :          0 :                 continue;
    1213                 :            : 
    1214         [ #  # ]:          0 :             if (aValue.matchL(RTL_CONSTASCII_STRINGPARAM("BOOL=")))
    1215                 :            :             {
    1216                 :          0 :                 aValue = aValue.copy(RTL_CONSTASCII_LENGTH("BOOL="));
    1217                 :          0 :                 sal_Bool aBOOL = (sal_Bool)aValue.toInt32();
    1218         [ #  # ]:          0 :                 mrSane.SetOptionValue( nOption, aBOOL );
    1219                 :            :             }
    1220         [ #  # ]:          0 :             else if (aValue.matchL(RTL_CONSTASCII_STRINGPARAM("STRING=")))
    1221                 :            :             {
    1222                 :          0 :                 aValue = aValue.copy(RTL_CONSTASCII_LENGTH("STRING="));
    1223 [ #  # ][ #  # ]:          0 :                 mrSane.SetOptionValue(nOption,rtl::OStringToOUString(aValue, osl_getThreadTextEncoding()) );
         [ #  # ][ #  # ]
                 [ #  # ]
    1224                 :            :             }
    1225         [ #  # ]:          0 :             else if (aValue.matchL(RTL_CONSTASCII_STRINGPARAM("NUMERIC=")))
    1226                 :            :             {
    1227                 :          0 :                 aValue = aValue.copy(RTL_CONSTASCII_LENGTH("NUMERIC="));
    1228                 :            : 
    1229                 :          0 :                 sal_Int32 nIndex = 0;
    1230                 :          0 :                 int n = 0;
    1231         [ #  # ]:          0 :                 do
    1232                 :            :                 {
    1233                 :          0 :                     rtl::OString aSub = aValue.getToken(0, ':', nIndex);
    1234                 :          0 :                     double fValue=0.0;
    1235                 :          0 :                     sscanf(aSub.getStr(), "%lg", &fValue);
    1236         [ #  # ]:          0 :                     SetAdjustedNumericalValue(aString.getStr(), fValue, n++);
    1237                 :            :                 }
    1238                 :            :                 while ( nIndex >= 0 );
    1239                 :            :             }
    1240         [ #  # ]:          0 :         }
    1241                 :            :     }
    1242                 :            : 
    1243         [ #  # ]:          0 :     DisableOption();
    1244         [ #  # ]:          0 :     InitFields();
    1245                 :            : 
    1246 [ #  # ][ #  # ]:          0 :     return sal_True;
    1247                 :            : }
    1248                 :            : 
    1249                 :          0 : void SaneDlg::SaveState()
    1250                 :            : {
    1251         [ #  # ]:          0 :     if( ! Sane::IsSane() )
    1252                 :          0 :         return;
    1253                 :            : 
    1254                 :          0 :     const char* pEnv = getenv( "HOME" );
    1255 [ #  # ][ #  # ]:          0 :     String aFileName( pEnv ? pEnv : "", osl_getThreadTextEncoding() );
                 [ #  # ]
    1256         [ #  # ]:          0 :     aFileName.AppendAscii( "/.so_sane_state" );
    1257                 :            : 
    1258 [ #  # ][ #  # ]:          0 :     Config aConfig( aFileName );
    1259         [ #  # ]:          0 :     aConfig.DeleteGroup( "SANE" );
    1260         [ #  # ]:          0 :     aConfig.SetGroup( "SANE" );
    1261                 :            :     aConfig.WriteKey( "SO_LastSANEDevice",
    1262 [ #  # ][ #  # ]:          0 :         rtl::OUStringToOString(maDeviceBox.GetSelectEntry(), RTL_TEXTENCODING_UTF8) );
         [ #  # ][ #  # ]
                 [ #  # ]
    1263                 :            : 
    1264                 :            :     static char const* pSaveOptions[] = {
    1265                 :            :         "resolution",
    1266                 :            :         "tl-x",
    1267                 :            :         "tl-y",
    1268                 :            :         "br-x",
    1269                 :            :         "br-y"
    1270                 :            :     };
    1271         [ #  # ]:          0 :     for( size_t i = 0; i < SAL_N_ELEMENTS(pSaveOptions); ++i )
    1272                 :            :     {
    1273                 :          0 :         rtl::OString aOption = pSaveOptions[i];
    1274         [ #  # ]:          0 :         int nOption = mrSane.GetOptionByName( pSaveOptions[i] );
    1275         [ #  # ]:          0 :         if( nOption > -1 )
    1276                 :            :         {
    1277                 :          0 :             SANE_Value_Type nType = mrSane.GetOptionType( nOption );
    1278   [ #  #  #  # ]:          0 :             switch( nType )
    1279                 :            :             {
    1280                 :            :                 case SANE_TYPE_BOOL:
    1281                 :            :                 {
    1282                 :            :                     sal_Bool bValue;
    1283 [ #  # ][ #  # ]:          0 :                     if( mrSane.GetOptionValue( nOption, bValue ) )
    1284                 :            :                     {
    1285                 :            :                         rtl::OStringBuffer aString(RTL_CONSTASCII_STRINGPARAM(
    1286         [ #  # ]:          0 :                             "BOOL="));
    1287         [ #  # ]:          0 :                         aString.append(static_cast<sal_Int32>(bValue));
    1288         [ #  # ]:          0 :                         aConfig.WriteKey(aOption, aString.makeStringAndClear());
    1289                 :            :                     }
    1290                 :            :                 }
    1291                 :          0 :                 break;
    1292                 :            :                 case SANE_TYPE_STRING:
    1293                 :            :                 {
    1294                 :          0 :                     rtl::OString aValue;
    1295 [ #  # ][ #  # ]:          0 :                     if( mrSane.GetOptionValue( nOption, aValue ) )
    1296                 :            :                     {
    1297         [ #  # ]:          0 :                         rtl::OStringBuffer aString(RTL_CONSTASCII_STRINGPARAM("STRING="));
    1298         [ #  # ]:          0 :                         aString.append(aValue);
    1299         [ #  # ]:          0 :                         aConfig.WriteKey( aOption, aString.makeStringAndClear() );
    1300                 :          0 :                     }
    1301                 :            :                 }
    1302                 :          0 :                 break;
    1303                 :            :                 case SANE_TYPE_FIXED:
    1304                 :            :                 case SANE_TYPE_INT:
    1305                 :            :                 {
    1306         [ #  # ]:          0 :                     rtl::OStringBuffer aString(RTL_CONSTASCII_STRINGPARAM("NUMERIC="));
    1307                 :            :                     double fValue;
    1308                 :            :                     char buf[256];
    1309                 :            :                     int n;
    1310                 :            : 
    1311         [ #  # ]:          0 :                     for( n = 0; n < mrSane.GetOptionElements( nOption ); n++ )
    1312                 :            :                     {
    1313 [ #  # ][ #  # ]:          0 :                         if( ! mrSane.GetOptionValue( nOption, fValue, n ) )
    1314                 :          0 :                             break;
    1315         [ #  # ]:          0 :                         if( n > 0 )
    1316         [ #  # ]:          0 :                             aString.append(':');
    1317                 :          0 :                         sprintf( buf, "%lg", fValue );
    1318         [ #  # ]:          0 :                         aString.append(buf);
    1319                 :            :                     }
    1320         [ #  # ]:          0 :                     if( n >= mrSane.GetOptionElements( nOption ) )
    1321         [ #  # ]:          0 :                         aConfig.WriteKey( aOption, aString.makeStringAndClear() );
    1322                 :            :                 }
    1323                 :          0 :                 break;
    1324                 :            :                 default:
    1325                 :          0 :                     break;
    1326                 :            :             }
    1327                 :            :         }
    1328 [ #  # ][ #  # ]:          0 :     }
    1329                 :            : }
    1330                 :            : 
    1331                 :          0 : sal_Bool SaneDlg::SetAdjustedNumericalValue(
    1332                 :            :     const char* pOption,
    1333                 :            :     double fValue,
    1334                 :            :     int nElement )
    1335                 :            : {
    1336                 :            :     int nOption;
    1337 [ #  # ][ #  # ]:          0 :     if( ! Sane::IsSane() || ! mrSane.IsOpen() || ( nOption = mrSane.GetOptionByName( pOption ) ) == -1 )
         [ #  # ][ #  # ]
                 [ #  # ]
    1338                 :          0 :         return sal_False;
    1339                 :            : 
    1340 [ #  # ][ #  # ]:          0 :     if( nElement < 0 || nElement >= mrSane.GetOptionElements( nOption ) )
                 [ #  # ]
    1341                 :          0 :         return sal_False;
    1342                 :            : 
    1343                 :          0 :     double* pValues = NULL;
    1344                 :            :     int nValues;
    1345 [ #  # ][ #  # ]:          0 :     if( ( nValues = mrSane.GetRange( nOption, pValues ) ) < 0 )
    1346                 :          0 :         return sal_False;
    1347                 :            : 
    1348                 :            : #if OSL_DEBUG_LEVEL > 1
    1349                 :            :     fprintf( stderr, "SaneDlg::SetAdjustedNumericalValue( \"%s\", %lg ) ",
    1350                 :            :              pOption, fValue );
    1351                 :            : #endif
    1352                 :            : 
    1353         [ #  # ]:          0 :     if( nValues )
    1354                 :            :     {
    1355                 :          0 :         int nNearest = 0;
    1356                 :          0 :         double fNearest = 1e6;
    1357         [ #  # ]:          0 :         for( int i = 0; i < nValues; i++ )
    1358                 :            :         {
    1359         [ #  # ]:          0 :             if( fabs( fValue - pValues[ i ] ) < fNearest )
    1360                 :            :             {
    1361                 :          0 :                 fNearest = fabs( fValue - pValues[ i ] );
    1362                 :          0 :                 nNearest = i;
    1363                 :            :             }
    1364                 :            :         }
    1365                 :          0 :         fValue = pValues[ nNearest ];
    1366                 :            :     }
    1367                 :            :     else
    1368                 :            :     {
    1369         [ #  # ]:          0 :         if( fValue < pValues[0] )
    1370                 :          0 :             fValue = pValues[0];
    1371         [ #  # ]:          0 :         if( fValue > pValues[1] )
    1372                 :          0 :             fValue = pValues[1];
    1373                 :            :     }
    1374         [ #  # ]:          0 :     delete [] pValues;
    1375         [ #  # ]:          0 :     mrSane.SetOptionValue( nOption, fValue, nElement );
    1376                 :            : #if OSL_DEBUG_LEVEL > 1
    1377                 :            :     fprintf( stderr, "yields %lg\n", fValue );
    1378                 :            : #endif
    1379                 :            : 
    1380                 :            : 
    1381                 :          0 :     return sal_True;
    1382                 :            : }
    1383                 :            : 
    1384                 :          0 : bool SaneDlg::getDoScan()
    1385                 :            : {
    1386                 :          0 :     return doScan;
    1387                 :            : }
    1388                 :            : 
    1389                 :            : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10