diff options
author | Michael Stahl <mstahl@redhat.com> | 2012-01-28 20:52:45 +0100 |
---|---|---|
committer | Michael Stahl <mstahl@redhat.com> | 2012-01-28 20:52:45 +0100 |
commit | 2e626373db2412ac22e8c5c27a60d11cd29e875b (patch) | |
tree | 9e9f67205cd5b72f1031721273e1534a3a1e5b0f /extensions/source/scanner/sanedlg.cxx | |
parent | f7ee7bbd5174b084f018c2ec94d8c70c98ee04da (diff) |
replace obsolete "master" branch with README that points at new repoHEADmaster-deletedmaster
Diffstat (limited to 'extensions/source/scanner/sanedlg.cxx')
-rw-r--r-- | extensions/source/scanner/sanedlg.cxx | 1373 |
1 files changed, 0 insertions, 1373 deletions
diff --git a/extensions/source/scanner/sanedlg.cxx b/extensions/source/scanner/sanedlg.cxx deleted file mode 100644 index 9d6ef73bd..000000000 --- a/extensions/source/scanner/sanedlg.cxx +++ /dev/null @@ -1,1373 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_extensions.hxx" - -#include <stdio.h> -#include <stdlib.h> -#include <tools/config.hxx> - -#include <vcl/msgbox.hxx> -#include <sanedlg.hxx> -#include <sanedlg.hrc> -#include <grid.hxx> -#include <math.h> -#include <sal/macros.h> -#include <rtl/strbuf.hxx> - -ResId SaneResId( sal_uInt32 nID ) -{ - static ResMgr* pResMgr = ResMgr::CreateResMgr( "san" ); - return ResId( nID, *pResMgr ); -} - -SaneDlg::SaneDlg( Window* pParent, Sane& rSane ) : - ModalDialog( pParent, SaneResId( RID_SANE_DIALOG ) ), - mrSane( rSane ), - mbIsDragging( sal_False ), - mbDragDrawn( sal_False ), - maMapMode( MAP_APPFONT ), - maOKButton( this, SaneResId( RID_SCAN_OK ) ), - maCancelButton( this, SaneResId( RID_SCAN_CANCEL ) ), - maDeviceInfoButton( this, SaneResId( RID_DEVICEINFO_BTN ) ), - maPreviewButton( this, SaneResId( RID_PREVIEW_BTN ) ), - maButtonOption( this, SaneResId( RID_SCAN_BUTTON_OPTION_BTN ) ), - maOptionsTxt( this, SaneResId( RID_SCAN_OPTION_TXT ) ), - maOptionTitle( this, SaneResId( RID_SCAN_OPTIONTITLE_TXT ) ), - maOptionDescTxt( this, SaneResId( RID_SCAN_OPTION_DESC_TXT ) ), - maVectorTxt( this, SaneResId( RID_SCAN_NUMERIC_VECTOR_TXT ) ), - maScanLeftTxt( this, SaneResId( RID_SCAN_LEFT_TXT ) ), - maLeftField( this, SaneResId( RID_SCAN_LEFT_BOX ) ), - maScanTopTxt( this, SaneResId( RID_SCAN_TOP_TXT ) ), - maTopField( this, SaneResId( RID_SCAN_TOP_BOX ) ), - maRightTxt( this, SaneResId( RID_SCAN_RIGHT_TXT ) ), - maRightField( this, SaneResId( RID_SCAN_RIGHT_BOX ) ), - maBottomTxt( this, SaneResId( RID_SCAN_BOTTOM_TXT ) ), - maBottomField( this, SaneResId( RID_SCAN_BOTTOM_BOX ) ), - maDeviceBoxTxt( this, SaneResId( RID_DEVICE_BOX_TXT ) ), - maDeviceBox( this, SaneResId( RID_DEVICE_BOX ) ), - maReslTxt( this, SaneResId( RID_SCAN_RESOLUTION_TXT ) ), - maReslBox( this, SaneResId( RID_SCAN_RESOLUTION_BOX ) ), - maAdvancedTxt( this, SaneResId( RID_SCAN_ADVANCED_TXT ) ), - maAdvancedBox( this, SaneResId( RID_SCAN_ADVANCED_BOX ) ), - maVectorBox( this, SaneResId( RID_SCAN_NUMERIC_VECTOR_BOX ) ), - maQuantumRangeBox( this, SaneResId( RID_SCAN_QUANTUM_RANGE_BOX ) ), - maStringRangeBox( this, SaneResId( RID_SCAN_STRING_RANGE_BOX ) ), - maPreviewBox( this, SaneResId( RID_PREVIEW_BOX ) ), - maAreaBox( this, SaneResId( RID_SCANAREA_BOX ) ), - maBoolCheckBox( this, SaneResId( RID_SCAN_BOOL_OPTION_BOX ) ), - maStringEdit( this, SaneResId( RID_SCAN_STRING_OPTION_EDT ) ), - maNumericEdit( this, SaneResId( RID_SCAN_NUMERIC_OPTION_EDT ) ), - maOptionBox( this, SaneResId( RID_SCAN_OPTION_BOX ) ), - mpRange( 0 ) -{ - if( Sane::IsSane() ) - { - InitDevices(); // opens first sane device - DisableOption(); - InitFields(); - } - - maDeviceInfoButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) ); - maPreviewButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) ); - maButtonOption.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) ); - maDeviceBox.SetSelectHdl( LINK( this, SaneDlg, SelectHdl ) ); - maOptionBox.SetSelectHdl( LINK( this, SaneDlg, OptionsBoxSelectHdl ) ); - maOKButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) ); - maCancelButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) ); - maBoolCheckBox.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) ); - maStringEdit.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) ); - maNumericEdit.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) ); - maVectorBox.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) ); - maReslBox.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) ); - maStringRangeBox.SetSelectHdl( LINK( this, SaneDlg, SelectHdl ) ); - maQuantumRangeBox.SetSelectHdl( LINK( this, SaneDlg, SelectHdl ) ); - maLeftField.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) ); - maRightField.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) ); - maTopField.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) ); - maBottomField.SetModifyHdl( LINK( this, SaneDlg, ModifyHdl ) ); - maAdvancedBox.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) ); - - maOldLink = mrSane.SetReloadOptionsHdl( LINK( this, SaneDlg, ReloadSaneOptionsHdl ) ); - - maOptionBox.SetNodeBitmaps( - Bitmap( SaneResId( RID_SCAN_BITMAP_PLUS ) ), - Bitmap( SaneResId( RID_SCAN_BITMAP_MINUS ) ) - ); - maOptionBox.SetStyle( maOptionBox.GetStyle()| - WB_HASLINES | - WB_HASBUTTONS | - WB_NOINITIALSELECTION | - WB_HASBUTTONSATROOT | - WB_HASLINESATROOT - ); - FreeResource(); -} - -SaneDlg::~SaneDlg() -{ - mrSane.SetReloadOptionsHdl( maOldLink ); -} - -short SaneDlg::Execute() -{ - if( ! Sane::IsSane() ) - { - ErrorBox aErrorBox( NULL, WB_OK | WB_DEF_OK, - String( SaneResId( RID_SANE_NOSANELIB_TXT ) ) ); - aErrorBox.Execute(); - return sal_False; - } - LoadState(); - return ModalDialog::Execute(); -} - -void SaneDlg::InitDevices() -{ - if( ! Sane::IsSane() ) - return; - - if( mrSane.IsOpen() ) - mrSane.Close(); - mrSane.ReloadDevices(); - maDeviceBox.Clear(); - for( int i = 0; i < Sane::CountDevices(); i++ ) - maDeviceBox.InsertEntry( Sane::GetName( i ) ); - if( Sane::CountDevices() ) - { - mrSane.Open( 0 ); - maDeviceBox.SelectEntry( Sane::GetName( 0 ) ); - - } -} - -void SaneDlg::InitFields() -{ - if( ! Sane::IsSane() ) - return; - - int nOption, i, nValue; - double fValue; - sal_Bool bSuccess = sal_False; - const char *ppSpecialOptions[] = { - "resolution", - "tl-x", - "tl-y", - "br-x", - "br-y", - "preview" - }; - - mbDragEnable = sal_True; - maReslBox.Clear(); - maMinTopLeft = Point( 0, 0 ); - maMaxBottomRight = Point( PREVIEW_WIDTH, PREVIEW_HEIGHT ); - - if( ! mrSane.IsOpen() ) - return; - - // set Resolution - nOption = mrSane.GetOptionByName( "resolution" ); - if( nOption != -1 ) - { - double fRes; - - bSuccess = mrSane.GetOptionValue( nOption, fRes ); - if( bSuccess ) - { - maReslBox.Enable( sal_True ); - - maReslBox.SetValue( (long)fRes ); - double *pDouble = NULL; - nValue = mrSane.GetRange( nOption, pDouble ); - if( nValue > -1 ) - { - if( nValue ) - { - maReslBox.SetMin( (long)pDouble[0] ); - maReslBox.SetMax( (long)pDouble[ nValue-1 ] ); - for( i=0; i<nValue; i++ ) - { - if( i == 0 || i == nValue-1 || ! ( ((int)pDouble[i]) % 20) ) - maReslBox.InsertValue( (long)pDouble[i] ); - } - } - else - { - maReslBox.SetMin( (long)pDouble[0] ); - maReslBox.SetMax( (long)pDouble[1] ); - maReslBox.InsertValue( (long)pDouble[0] ); - // Can only select 75 and 2400 dpi in Scanner dialogue - // scanner allows random setting of dpi resolution, a slider might be useful - // support that - // workaround: offer at least some more standard dpi resolution between - // min and max value - int bGot300 = 0; - for ( int nRes = (long) pDouble[0] * 2; nRes < (long) pDouble[1]; nRes = nRes * 2 ) - { - if ( !bGot300 && nRes > 300 ) { - nRes = 300; bGot300 = 1; - } - maReslBox.InsertValue(nRes); - } - maReslBox.InsertValue( (long)pDouble[1] ); - } - if( pDouble ) - delete [] pDouble; - } - else - maReslBox.Enable( sal_False ); - } - } - else - maReslBox.Enable( sal_False ); - - // set scan area - for( i = 0; i < 4; i++ ) - { - char const *pOptionName = NULL; - MetricField* pField = NULL; - switch( i ) - { - case 0: - pOptionName = "tl-x"; - pField = &maLeftField; - break; - case 1: - pOptionName = "tl-y"; - pField = &maTopField; - break; - case 2: - pOptionName = "br-x"; - pField = &maRightField; - break; - case 3: - pOptionName = "br-y"; - pField = &maBottomField; - } - nOption = pOptionName ? mrSane.GetOptionByName( pOptionName ) : -1; - bSuccess = sal_False; - if( nOption != -1 ) - { - bSuccess = mrSane.GetOptionValue( nOption, fValue, 0 ); - if( bSuccess ) - { - if( mrSane.GetOptionUnit( nOption ) == SANE_UNIT_MM ) - { - pField->SetUnit( FUNIT_MM ); - pField->SetValue( (int)fValue, FUNIT_MM ); - } - else // SANE_UNIT_PIXEL - { - pField->SetValue( (int)fValue, FUNIT_CUSTOM ); - pField->SetCustomUnitText( String::CreateFromAscii( "Pixel" ) ); - } - switch( i ) { - case 0: maTopLeft.X() = (int)fValue;break; - case 1: maTopLeft.Y() = (int)fValue;break; - case 2: maBottomRight.X() = (int)fValue;break; - case 3: maBottomRight.Y() = (int)fValue;break; - } - } - double *pDouble = NULL; - nValue = mrSane.GetRange( nOption, pDouble ); - if( nValue > -1 ) - { - if( pDouble ) - { - pField->SetMin( (long)pDouble[0] ); - if( nValue ) - pField->SetMax( (long)pDouble[ nValue-1 ] ); - else - pField->SetMax( (long)pDouble[ 1 ] ); - delete [] pDouble; - } - switch( i ) { - case 0: maMinTopLeft.X() = pField->GetMin();break; - case 1: maMinTopLeft.Y() = pField->GetMin();break; - case 2: maMaxBottomRight.X() = pField->GetMax();break; - case 3: maMaxBottomRight.Y() = pField->GetMax();break; - } - } - else - { - switch( i ) { - case 0: maMinTopLeft.X() = (int)fValue;break; - case 1: maMinTopLeft.Y() = (int)fValue;break; - case 2: maMaxBottomRight.X() = (int)fValue;break; - case 3: maMaxBottomRight.Y() = (int)fValue;break; - } - } - pField->Enable( sal_True ); - } - else - { - mbDragEnable = sal_False; - pField->SetMin( 0 ); - switch( i ) { - case 0: - maMinTopLeft.X() = 0; - maTopLeft.X() = 0; - pField->SetMax( PREVIEW_WIDTH ); - pField->SetValue( 0 ); - break; - case 1: - maMinTopLeft.Y() = 0; - maTopLeft.Y() = 0; - pField->SetMax( PREVIEW_HEIGHT ); - pField->SetValue( 0 ); - break; - case 2: - maMaxBottomRight.X() = PREVIEW_WIDTH; - maBottomRight.X() = PREVIEW_WIDTH; - pField->SetMax( PREVIEW_WIDTH ); - pField->SetValue( PREVIEW_WIDTH ); - break; - case 3: - maMaxBottomRight.Y() = PREVIEW_HEIGHT; - maBottomRight.Y() = PREVIEW_HEIGHT; - pField->SetMax( PREVIEW_HEIGHT ); - pField->SetValue( PREVIEW_HEIGHT ); - break; - } - pField->Enable( sal_False ); - } - } - maTopLeft = GetPixelPos( maTopLeft ); - maBottomRight = GetPixelPos( maBottomRight ); - maPreviewRect = Rectangle( maTopLeft, - Size( maBottomRight.X() - maTopLeft.X(), - maBottomRight.Y() - maTopLeft.Y() ) - ); - // fill OptionBox - maOptionBox.Clear(); - SvLBoxEntry* pParentEntry = 0; - sal_Bool bGroupRejected = sal_False; - for( i = 1; i < mrSane.CountOptions(); i++ ) - { - String aOption=mrSane.GetOptionName( i ); - sal_Bool bInsertAdvanced = - mrSane.GetOptionCap( i ) & SANE_CAP_ADVANCED && - ! maAdvancedBox.IsChecked() ? sal_False : sal_True; - if( mrSane.GetOptionType( i ) == SANE_TYPE_GROUP ) - { - if( bInsertAdvanced ) - { - aOption = mrSane.GetOptionTitle( i ); - pParentEntry = maOptionBox.InsertEntry( aOption ); - bGroupRejected = sal_False; - } - else - bGroupRejected = sal_True; - } - else if( aOption.Len() && - ! ( mrSane.GetOptionCap( i ) & - ( - SANE_CAP_HARD_SELECT | - SANE_CAP_INACTIVE - ) ) && - bInsertAdvanced && ! bGroupRejected ) - { - sal_Bool bIsSpecial = sal_False; - for( size_t n = 0; !bIsSpecial && - n < SAL_N_ELEMENTS(ppSpecialOptions); n++ ) - { - if( aOption.EqualsAscii( ppSpecialOptions[n] ) ) - bIsSpecial=sal_True; - } - if( ! bIsSpecial ) - { - if( pParentEntry ) - maOptionBox.InsertEntry( aOption, pParentEntry ); - else - maOptionBox.InsertEntry( aOption ); - } - } - } -} - -IMPL_LINK( SaneDlg, ClickBtnHdl, Button*, pButton ) -{ - if( mrSane.IsOpen() ) - { - if( pButton == &maDeviceInfoButton ) - { - String aString( SaneResId( RID_SANE_DEVICEINFO_TXT ) ); - String aSR( RTL_CONSTASCII_USTRINGPARAM( "%s" ) ); - aString.SearchAndReplace( aSR, Sane::GetName( mrSane.GetDeviceNumber() ) ); - aString.SearchAndReplace( aSR, Sane::GetVendor( mrSane.GetDeviceNumber() ) ); - aString.SearchAndReplace( aSR, Sane::GetModel( mrSane.GetDeviceNumber() ) ); - aString.SearchAndReplace( aSR, Sane::GetType( mrSane.GetDeviceNumber() ) ); - InfoBox aInfoBox( this, aString ); - aInfoBox.Execute(); - } - else if( pButton == &maPreviewButton ) - AcquirePreview(); - else if( pButton == &maBoolCheckBox ) - { - mrSane.SetOptionValue( mnCurrentOption, - maBoolCheckBox.IsChecked() ? - (sal_Bool)sal_True : (sal_Bool)sal_False ); - } - else if( pButton == &maButtonOption ) - { - - SANE_Value_Type nType = mrSane.GetOptionType( mnCurrentOption ); - switch( nType ) - { - case SANE_TYPE_BUTTON: - mrSane.ActivateButtonOption( mnCurrentOption ); - break; - case SANE_TYPE_FIXED: - case SANE_TYPE_INT: - { - int nElements = mrSane.GetOptionElements( mnCurrentOption ); - double* x = new double[ nElements ]; - double* y = new double[ nElements ]; - for( int i = 0; i < nElements; i++ ) - x[ i ] = (double)i; - mrSane.GetOptionValue( mnCurrentOption, y ); - - GridWindow aGrid( x, y, nElements, this ); - aGrid.SetText( mrSane.GetOptionName( mnCurrentOption ) ); - aGrid.setBoundings( 0, mfMin, nElements, mfMax ); - if( aGrid.Execute() && aGrid.getNewYValues() ) - mrSane.SetOptionValue( mnCurrentOption, aGrid.getNewYValues() ); - - delete [] x; - delete [] y; - } - break; - case SANE_TYPE_BOOL: - case SANE_TYPE_STRING: - case SANE_TYPE_GROUP: - break; - } - } - else if( pButton == &maAdvancedBox ) - { - ReloadSaneOptionsHdl( NULL ); - } - } - if( pButton == &maOKButton ) - { - double fRes = (double)maReslBox.GetValue(); - SetAdjustedNumericalValue( "resolution", fRes ); - UpdateScanArea( sal_True ); - SaveState(); - EndDialog( mrSane.IsOpen() ? 1 : 0 ); - } - else if( pButton == &maCancelButton ) - { - mrSane.Close(); - EndDialog( 0 ); - } - return 0; -} - -IMPL_LINK( SaneDlg, SelectHdl, ListBox*, pListBox ) -{ - if( pListBox == &maDeviceBox && Sane::IsSane() && Sane::CountDevices() ) - { - String aNewDevice = maDeviceBox.GetSelectEntry(); - int nNumber; - if( aNewDevice.Equals( Sane::GetName( nNumber = mrSane.GetDeviceNumber() ) ) ) - { - mrSane.Close(); - mrSane.Open( nNumber ); - InitFields(); - } - } - if( mrSane.IsOpen() ) - { - if( pListBox == &maQuantumRangeBox ) - { - ByteString aValue( maQuantumRangeBox.GetSelectEntry(), osl_getThreadTextEncoding() ); - double fValue = atof( aValue.GetBuffer() ); - mrSane.SetOptionValue( mnCurrentOption, fValue, mnCurrentElement ); - } - else if( pListBox == &maStringRangeBox ) - { - mrSane.SetOptionValue( mnCurrentOption, maStringRangeBox.GetSelectEntry() ); - } - } - return 0; -} - -IMPL_LINK( SaneDlg, OptionsBoxSelectHdl, SvTreeListBox*, pBox ) -{ - if( pBox == &maOptionBox && Sane::IsSane() ) - { - String aOption = - maOptionBox.GetEntryText( maOptionBox.FirstSelected() ); - int nOption = mrSane.GetOptionByName( ByteString( aOption, osl_getThreadTextEncoding() ).GetBuffer() ); - if( nOption != -1 && nOption != mnCurrentOption ) - { - DisableOption(); - mnCurrentOption = nOption; - maOptionTitle.SetText( mrSane.GetOptionTitle( mnCurrentOption ) ); - SANE_Value_Type nType = mrSane.GetOptionType( mnCurrentOption ); - SANE_Constraint_Type nConstraint; - switch( nType ) - { - case SANE_TYPE_BOOL: EstablishBoolOption();break; - case SANE_TYPE_STRING: - nConstraint = mrSane.GetOptionConstraintType( mnCurrentOption ); - if( nConstraint == SANE_CONSTRAINT_STRING_LIST ) - EstablishStringRange(); - else - EstablishStringOption(); - break; - case SANE_TYPE_FIXED: - case SANE_TYPE_INT: - { - nConstraint = mrSane.GetOptionConstraintType( mnCurrentOption ); - int nElements = mrSane.GetOptionElements( mnCurrentOption ); - mnCurrentElement = 0; - if( nConstraint == SANE_CONSTRAINT_RANGE || - nConstraint == SANE_CONSTRAINT_WORD_LIST ) - EstablishQuantumRange(); - else - { - mfMin = mfMax = 0.0; - EstablishNumericOption(); - } - if( nElements > 1 ) - { - if( nElements <= 10 ) - { - maVectorBox.SetValue( 1 ); - maVectorBox.SetMin( 1 ); - maVectorBox.SetMax( - mrSane.GetOptionElements( mnCurrentOption ) ); - maVectorBox.Show( sal_True ); - maVectorTxt.Show( sal_True ); - } - else - { - DisableOption(); - // bring up dialog only on button click - EstablishButtonOption(); - } - } - } - break; - case SANE_TYPE_BUTTON: - EstablishButtonOption(); - break; - default: break; - } - } - } - return 0; -} - -IMPL_LINK( SaneDlg, ModifyHdl, Edit*, pEdit ) -{ - if( mrSane.IsOpen() ) - { - if( pEdit == &maStringEdit ) - { - mrSane.SetOptionValue( mnCurrentOption, maStringEdit.GetText() ); - } - else if( pEdit == &maReslBox ) - { - double fRes = (double)maReslBox.GetValue(); - int nOption = mrSane.GetOptionByName( "resolution" ); - if( nOption != -1 ) - { - double* pDouble = NULL; - int nValues = mrSane.GetRange( nOption, pDouble ); - if( nValues > 0 ) - { - int i; - for( i = 0; i < nValues; i++ ) - { - if( fRes == pDouble[i] ) - break; - } - if( i >= nValues ) - fRes = pDouble[0]; - } - else if( nValues == 0 ) - { - if( fRes < pDouble[ 0 ] ) - fRes = pDouble[ 0 ]; - if( fRes > pDouble[ 1 ] ) - fRes = pDouble[ 1 ]; - } - maReslBox.SetValue( (sal_uLong)fRes ); - } - } - else if( pEdit == &maNumericEdit ) - { - double fValue; - char pBuf[256]; - ByteString aContents( maNumericEdit.GetText(), osl_getThreadTextEncoding() ); - fValue = atof( aContents.GetBuffer() ); - if( mfMin != mfMax && ( fValue < mfMin || fValue > mfMax ) ) - { - if( fValue < mfMin ) - fValue = mfMin; - else if( fValue > mfMax ) - fValue = mfMax; - sprintf( pBuf, "%g", fValue ); - maNumericEdit.SetText( String( pBuf, osl_getThreadTextEncoding() ) ); - } - mrSane.SetOptionValue( mnCurrentOption, fValue, mnCurrentElement ); - } - else if( pEdit == &maVectorBox ) - { - char pBuf[256]; - mnCurrentElement = maVectorBox.GetValue()-1; - double fValue; - mrSane.GetOptionValue( mnCurrentOption, fValue, mnCurrentElement ); - sprintf( pBuf, "%g", fValue ); - String aValue( pBuf, osl_getThreadTextEncoding() ); - maNumericEdit.SetText( aValue ); - maQuantumRangeBox.SelectEntry( aValue ); - } - else if( pEdit == &maTopField ) - { - Point aPoint( 0, maTopField.GetValue() ); - aPoint = GetPixelPos( aPoint ); - maTopLeft.Y() = aPoint.Y(); - DrawDrag(); - } - else if( pEdit == &maLeftField ) - { - Point aPoint( maLeftField.GetValue(), 0 ); - aPoint = GetPixelPos( aPoint ); - maTopLeft.X() = aPoint.X(); - DrawDrag(); - } - else if( pEdit == &maBottomField ) - { - Point aPoint( 0, maBottomField.GetValue() ); - aPoint = GetPixelPos( aPoint ); - maBottomRight.Y() = aPoint.Y(); - DrawDrag(); - } - else if( pEdit == &maRightField ) - { - Point aPoint( maRightField.GetValue(), 0 ); - aPoint = GetPixelPos( aPoint ); - maBottomRight.X() = aPoint.X(); - DrawDrag(); - } - } - return 0; -} - -IMPL_LINK( SaneDlg, ReloadSaneOptionsHdl, Sane*, /*pSane*/ ) -{ - mnCurrentOption = -1; - mnCurrentElement = 0; - DisableOption(); - // #92024# preserve preview rect, should only be set - // initially or in AcquirePreview - Rectangle aPreviewRect = maPreviewRect; - InitFields(); - maPreviewRect = aPreviewRect; - Rectangle aDummyRect( Point( 0, 0 ), GetSizePixel() ); - Paint( aDummyRect ); - return 0; -} - -void SaneDlg::AcquirePreview() -{ - if( ! mrSane.IsOpen() ) - return; - - UpdateScanArea( sal_True ); - // set small resolution for preview - double fResl = (double)maReslBox.GetValue(); - SetAdjustedNumericalValue( "resolution", 30.0 ); - - int nOption = mrSane.GetOptionByName( "preview" ); - if( nOption == -1 ) - { - String aString( SaneResId( RID_SANE_NORESOLUTIONOPTION_TXT ) ); - WarningBox aBox( this, WB_OK_CANCEL | WB_DEF_OK, aString ); - if( aBox.Execute() == RET_CANCEL ) - return; - } - else - mrSane.SetOptionValue( nOption, (sal_Bool)sal_True ); - - BitmapTransporter aTransporter; - if( ! mrSane.Start( aTransporter ) ) - { - ErrorBox aErrorBox( this, WB_OK | WB_DEF_OK, - String( SaneResId( RID_SANE_SCANERROR_TXT ) ) ); - aErrorBox.Execute(); - } - else - { -#if OSL_DEBUG_LEVEL > 1 - aTransporter.getStream().Seek( STREAM_SEEK_TO_END ); - fprintf( stderr, "Previewbitmapstream contains %d bytes\n", (int)aTransporter.getStream().Tell() ); -#endif - aTransporter.getStream().Seek( STREAM_SEEK_TO_BEGIN ); - maPreviewBitmap.Read( aTransporter.getStream(), sal_True ); - } - - SetAdjustedNumericalValue( "resolution", fResl ); - maReslBox.SetValue( (sal_uLong)fResl ); - - if( mbDragEnable ) - { - maPreviewRect = Rectangle( maTopLeft, - Size( maBottomRight.X() - maTopLeft.X(), - maBottomRight.Y() - maTopLeft.Y() ) - ); - } - else - { - Size aBMSize( maPreviewBitmap.GetSizePixel() ); - if( aBMSize.Width() > aBMSize.Height() && aBMSize.Width() ) - { - int nVHeight = (maBottomRight.X() - maTopLeft.X()) * aBMSize.Height() / aBMSize.Width(); - maPreviewRect = Rectangle( Point( maTopLeft.X(), ( maTopLeft.Y() + maBottomRight.Y() )/2 - nVHeight/2 ), - Size( maBottomRight.X() - maTopLeft.X(), - nVHeight ) ); - } - else if (aBMSize.Height()) - { - int nVWidth = (maBottomRight.Y() - maTopLeft.Y()) * aBMSize.Width() / aBMSize.Height(); - maPreviewRect = Rectangle( Point( ( maTopLeft.X() + maBottomRight.X() )/2 - nVWidth/2, maTopLeft.Y() ), - Size( nVWidth, - maBottomRight.Y() - maTopLeft.Y() ) ); - } - } - - Paint( Rectangle( Point( 0, 0 ), GetSizePixel() ) ); -} - -void SaneDlg::Paint( const Rectangle& rRect ) -{ - SetMapMode( maMapMode ); - SetFillColor( Color( COL_WHITE ) ); - SetLineColor( Color( COL_WHITE ) ); - DrawRect( Rectangle( Point( PREVIEW_UPPER_LEFT, PREVIEW_UPPER_TOP ), - Size( PREVIEW_WIDTH, PREVIEW_HEIGHT ) ) ); - SetMapMode( MapMode( MAP_PIXEL ) ); - // check for sane values - DrawBitmap( maPreviewRect.TopLeft(), maPreviewRect.GetSize(), - maPreviewBitmap ); - - mbDragDrawn = sal_False; - DrawDrag(); - - ModalDialog::Paint( rRect ); -} - -void SaneDlg::DisableOption() -{ - maBoolCheckBox.Show( sal_False ); - maStringEdit.Show( sal_False ); - maNumericEdit.Show( sal_False ); - maQuantumRangeBox.Show( sal_False ); - maStringRangeBox.Show( sal_False ); - maButtonOption.Show( sal_False ); - maVectorBox.Show( sal_False ); - maVectorTxt.Show( sal_False ); - maOptionDescTxt.Show( sal_False ); -} - -void SaneDlg::EstablishBoolOption() -{ - sal_Bool bSuccess, bValue; - - bSuccess = mrSane.GetOptionValue( mnCurrentOption, bValue ); - if( bSuccess ) - { - maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) ); - maOptionDescTxt.Show( sal_True ); - maBoolCheckBox.Check( bValue ); - maBoolCheckBox.Show( sal_True ); - } -} - -void SaneDlg::EstablishStringOption() -{ - sal_Bool bSuccess; - ByteString aValue; - - bSuccess = mrSane.GetOptionValue( mnCurrentOption, aValue ); - if( bSuccess ) - { - maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) ); - maOptionDescTxt.Show( sal_True ); - maStringEdit.SetText( String( aValue, osl_getThreadTextEncoding() ) ); - maStringEdit.Show( sal_True ); - } -} - -void SaneDlg::EstablishStringRange() -{ - const char** ppStrings = mrSane.GetStringConstraint( mnCurrentOption ); - maStringRangeBox.Clear(); - for( int i = 0; ppStrings[i] != 0; i++ ) - maStringRangeBox.InsertEntry( String( ppStrings[i], osl_getThreadTextEncoding() ) ); - ByteString aValue; - mrSane.GetOptionValue( mnCurrentOption, aValue ); - maStringRangeBox.SelectEntry( String( aValue, osl_getThreadTextEncoding() ) ); - maStringRangeBox.Show( sal_True ); - maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) ); - maOptionDescTxt.Show( sal_True ); -} - -void SaneDlg::EstablishQuantumRange() -{ - if( mpRange ) - { - delete [] mpRange; - mpRange = 0; - } - int nValues = mrSane.GetRange( mnCurrentOption, mpRange ); - if( nValues == 0 ) - { - mfMin = mpRange[ 0 ]; - mfMax = mpRange[ 1 ]; - delete [] mpRange; - mpRange = 0; - EstablishNumericOption(); - } - else if( nValues > 0 ) - { - char pBuf[ 256 ]; - maQuantumRangeBox.Clear(); - mfMin = mpRange[ 0 ]; - mfMax = mpRange[ nValues-1 ]; - for( int i = 0; i < nValues; i++ ) - { - sprintf( pBuf, "%g", mpRange[ i ] ); - maQuantumRangeBox.InsertEntry( String( pBuf, osl_getThreadTextEncoding() ) ); - } - double fValue; - if( mrSane.GetOptionValue( mnCurrentOption, fValue, mnCurrentElement ) ) - { - sprintf( pBuf, "%g", fValue ); - maQuantumRangeBox.SelectEntry( String( pBuf, osl_getThreadTextEncoding() ) ); - } - maQuantumRangeBox.Show( sal_True ); - String aText( mrSane.GetOptionName( mnCurrentOption ) ); - aText += ' '; - aText += mrSane.GetOptionUnitName( mnCurrentOption ); - maOptionDescTxt.SetText( aText ); - maOptionDescTxt.Show( sal_True ); - } -} - -void SaneDlg::EstablishNumericOption() -{ - sal_Bool bSuccess; - double fValue; - - bSuccess = mrSane.GetOptionValue( mnCurrentOption, fValue ); - if( ! bSuccess ) - return; - - char pBuf[256]; - String aText( mrSane.GetOptionName( mnCurrentOption ) ); - aText += ' '; - aText += mrSane.GetOptionUnitName( mnCurrentOption ); - if( mfMin != mfMax ) - { - sprintf( pBuf, " < %g ; %g >", mfMin, mfMax ); - aText += String( pBuf, osl_getThreadTextEncoding() ); - } - maOptionDescTxt.SetText( aText ); - maOptionDescTxt.Show( sal_True ); - sprintf( pBuf, "%g", fValue ); - maNumericEdit.SetText( String( pBuf, osl_getThreadTextEncoding() ) ); - maNumericEdit.Show( sal_True ); -} - -void SaneDlg::EstablishButtonOption() -{ - maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) ); - maOptionDescTxt.Show( sal_True ); - maButtonOption.Show( sal_True ); -} - -#define RECT_SIZE_PIX 7 - -void SaneDlg::MouseMove( const MouseEvent& rMEvt ) -{ - if( mbIsDragging ) - { - Point aMousePos = rMEvt.GetPosPixel(); - // move into valid area - Point aLogicPos = GetLogicPos( aMousePos ); - aMousePos = GetPixelPos( aLogicPos ); - switch( meDragDirection ) - { - case TopLeft: maTopLeft = aMousePos; break; - case Top: maTopLeft.Y() = aMousePos.Y(); break; - case TopRight: - maTopLeft.Y() = aMousePos.Y(); - maBottomRight.X() = aMousePos.X(); - break; - case Right: maBottomRight.X() = aMousePos.X(); break; - case BottomRight: maBottomRight = aMousePos; break; - case Bottom: maBottomRight.Y() = aMousePos.Y(); break; - case BottomLeft: - maTopLeft.X() = aMousePos.X(); - maBottomRight.Y() = aMousePos.Y(); - break; - case Left: maTopLeft.X() = aMousePos.X(); break; - default: break; - } - int nSwap; - if( maTopLeft.X() > maBottomRight.X() ) - { - nSwap = maTopLeft.X(); - maTopLeft.X() = maBottomRight.X(); - maBottomRight.X() = nSwap; - } - if( maTopLeft.Y() > maBottomRight.Y() ) - { - nSwap = maTopLeft.Y(); - maTopLeft.Y() = maBottomRight.Y(); - maBottomRight.Y() = nSwap; - } - DrawDrag(); - UpdateScanArea( sal_False ); - } - ModalDialog::MouseMove( rMEvt ); -} - -void SaneDlg::MouseButtonDown( const MouseEvent& rMEvt ) -{ - Point aMousePixel = rMEvt.GetPosPixel(); - - if( ! mbIsDragging && mbDragEnable ) - { - int nMiddleX = ( maBottomRight.X() - maTopLeft.X() ) / 2 - RECT_SIZE_PIX/2 + maTopLeft.X(); - int nMiddleY = ( maBottomRight.Y() - maTopLeft.Y() ) / 2 - RECT_SIZE_PIX/2 + maTopLeft.Y(); - if( aMousePixel.Y() >= maTopLeft.Y() && - aMousePixel.Y() < maTopLeft.Y() + RECT_SIZE_PIX ) - { - if( aMousePixel.X() >= maTopLeft.X() && - aMousePixel.X() < maTopLeft.X() + RECT_SIZE_PIX ) - { - meDragDirection = TopLeft; - aMousePixel = maTopLeft; - mbIsDragging = sal_True; - } - else if( aMousePixel.X() >= nMiddleX && - aMousePixel.X() < nMiddleX + RECT_SIZE_PIX ) - { - meDragDirection = Top; - aMousePixel.Y() = maTopLeft.Y(); - mbIsDragging = sal_True; - } - else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX && - aMousePixel.X() <= maBottomRight.X() ) - { - meDragDirection = TopRight; - aMousePixel = Point( maBottomRight.X(), maTopLeft.Y() ); - mbIsDragging = sal_True; - } - } - else if( aMousePixel.Y() >= nMiddleY && - aMousePixel.Y() < nMiddleY + RECT_SIZE_PIX ) - { - if( aMousePixel.X() >= maTopLeft.X() && - aMousePixel.X() < maTopLeft.X() + RECT_SIZE_PIX ) - { - meDragDirection = Left; - aMousePixel.X() = maTopLeft.X(); - mbIsDragging = sal_True; - } - else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX && - aMousePixel.X() <= maBottomRight.X() ) - { - meDragDirection = Right; - aMousePixel.X() = maBottomRight.X(); - mbIsDragging = sal_True; - } - } - else if( aMousePixel.Y() <= maBottomRight.Y() && - aMousePixel.Y() > maBottomRight.Y() - RECT_SIZE_PIX ) - { - if( aMousePixel.X() >= maTopLeft.X() && - aMousePixel.X() < maTopLeft.X() + RECT_SIZE_PIX ) - { - meDragDirection = BottomLeft; - aMousePixel = Point( maTopLeft.X(), maBottomRight.Y() ); - mbIsDragging = sal_True; - } - else if( aMousePixel.X() >= nMiddleX && - aMousePixel.X() < nMiddleX + RECT_SIZE_PIX ) - { - meDragDirection = Bottom; - aMousePixel.Y() = maBottomRight.Y(); - mbIsDragging = sal_True; - } - else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX && - aMousePixel.X() <= maBottomRight.X() ) - { - meDragDirection = BottomRight; - aMousePixel = maBottomRight; - mbIsDragging = sal_True; - } - } - } - if( mbIsDragging ) - { - SetPointerPosPixel( aMousePixel ); - DrawDrag(); - } - ModalDialog::MouseButtonDown( rMEvt ); -} - -void SaneDlg::MouseButtonUp( const MouseEvent& rMEvt ) -{ - if( mbIsDragging ) - { - UpdateScanArea( sal_True ); - } - mbIsDragging = sal_False; - - ModalDialog::MouseButtonUp( rMEvt ); -} - -void SaneDlg::DrawRectangles( Point& rUL, Point& rBR ) -{ - int nMiddleX, nMiddleY; - Point aBL, aUR; - - aUR = Point( rBR.X(), rUL.Y() ); - aBL = Point( rUL.X(), rBR.Y() ); - nMiddleX = ( rBR.X() - rUL.X() ) / 2 + rUL.X(); - nMiddleY = ( rBR.Y() - rUL.Y() ) / 2 + rUL.Y(); - - DrawLine( rUL, aBL ); - DrawLine( aBL, rBR ); - DrawLine( rBR, aUR ); - DrawLine( aUR, rUL ); - DrawRect( Rectangle( rUL, Size( RECT_SIZE_PIX,RECT_SIZE_PIX ) ) ); - DrawRect( Rectangle( aBL, Size( RECT_SIZE_PIX, -RECT_SIZE_PIX ) ) ); - DrawRect( Rectangle( rBR, Size( -RECT_SIZE_PIX, -RECT_SIZE_PIX ) ) ); - DrawRect( Rectangle( aUR, Size( -RECT_SIZE_PIX, RECT_SIZE_PIX ) ) ); - DrawRect( Rectangle( Point( nMiddleX - RECT_SIZE_PIX/2, rUL.Y() ), Size( RECT_SIZE_PIX, RECT_SIZE_PIX ) ) ); - DrawRect( Rectangle( Point( nMiddleX - RECT_SIZE_PIX/2, rBR.Y() ), Size( RECT_SIZE_PIX, -RECT_SIZE_PIX ) ) ); - DrawRect( Rectangle( Point( rUL.X(), nMiddleY - RECT_SIZE_PIX/2 ), Size( RECT_SIZE_PIX, RECT_SIZE_PIX ) ) ); - DrawRect( Rectangle( Point( rBR.X(), nMiddleY - RECT_SIZE_PIX/2 ), Size( -RECT_SIZE_PIX, RECT_SIZE_PIX ) ) ); -} - -void SaneDlg::DrawDrag() -{ - static Point aLastUL, aLastBR; - - if( ! mbDragEnable ) - return; - - RasterOp eROP = GetRasterOp(); - SetRasterOp( ROP_INVERT ); - SetMapMode( MapMode( MAP_PIXEL ) ); - - if( mbDragDrawn ) - DrawRectangles( aLastUL, aLastBR ); - - aLastUL = maTopLeft; - aLastBR = maBottomRight; - DrawRectangles( maTopLeft, maBottomRight ); - - mbDragDrawn = sal_True; - SetRasterOp( eROP ); - SetMapMode( maMapMode ); -} - -Point SaneDlg::GetPixelPos( const Point& rIn ) -{ - Point aConvert( - ( ( rIn.X() * PREVIEW_WIDTH ) / - ( maMaxBottomRight.X() - maMinTopLeft.X() ) ) - + PREVIEW_UPPER_LEFT, - ( ( rIn.Y() * PREVIEW_HEIGHT ) - / ( maMaxBottomRight.Y() - maMinTopLeft.Y() ) ) - + PREVIEW_UPPER_TOP ); - - return LogicToPixel( aConvert, maMapMode ); -} - -Point SaneDlg::GetLogicPos( const Point& rIn ) -{ - Point aConvert = PixelToLogic( rIn, maMapMode ); - aConvert.X() -= PREVIEW_UPPER_LEFT; - aConvert.Y() -= PREVIEW_UPPER_TOP; - if( aConvert.X() < 0 ) - aConvert.X() = 0; - if( aConvert.X() >= PREVIEW_WIDTH ) - aConvert.X() = PREVIEW_WIDTH-1; - if( aConvert.Y() < 0 ) - aConvert.Y() = 0; - if( aConvert.Y() >= PREVIEW_HEIGHT ) - aConvert.Y() = PREVIEW_HEIGHT-1; - - aConvert.X() *= ( maMaxBottomRight.X() - maMinTopLeft.X() ); - aConvert.X() /= PREVIEW_WIDTH; - aConvert.Y() *= ( maMaxBottomRight.Y() - maMinTopLeft.Y() ); - aConvert.Y() /= PREVIEW_HEIGHT; - return aConvert; -} - -void SaneDlg::UpdateScanArea( sal_Bool bSend ) -{ - if( ! mbDragEnable ) - return; - - Point aUL = GetLogicPos( maTopLeft ); - Point aBR = GetLogicPos( maBottomRight ); - - maLeftField.SetValue( aUL.X() ); - maTopField.SetValue( aUL.Y() ); - maRightField.SetValue( aBR.X() ); - maBottomField.SetValue( aBR.Y() ); - - if( ! bSend ) - return; - - if( mrSane.IsOpen() ) - { - SetAdjustedNumericalValue( "tl-x", (double)aUL.X() ); - SetAdjustedNumericalValue( "tl-y", (double)aUL.Y() ); - SetAdjustedNumericalValue( "br-x", (double)aBR.X() ); - SetAdjustedNumericalValue( "br-y", (double)aBR.Y() ); - } -} - -sal_Bool SaneDlg::LoadState() -{ - int i; - - if( ! Sane::IsSane() ) - return sal_False; - - const char* pEnv = getenv("HOME"); - String aFileName( pEnv ? pEnv : "", osl_getThreadTextEncoding() ); - aFileName += String( RTL_CONSTASCII_USTRINGPARAM( "/.so_sane_state" ) ); - Config aConfig( aFileName ); - if( ! aConfig.HasGroup( "SANE" ) ) - return sal_False; - - aConfig.SetGroup( "SANE" ); - ByteString aString = aConfig.ReadKey( "SO_LastSaneDevice" ); - for( i = 0; i < Sane::CountDevices() && ! aString.Equals( ByteString( Sane::GetName( i ), osl_getThreadTextEncoding() ) ); i++ ) ; - if( i == Sane::CountDevices() ) - return sal_False; - - mrSane.Close(); - mrSane.Open( aString.GetBuffer() ); - - DisableOption(); - InitFields(); - - if( mrSane.IsOpen() ) - { - int iMax = aConfig.GetKeyCount(); - for( i = 0; i < iMax; i++ ) - { - aString = aConfig.GetKeyName( i ); - ByteString aValue = aConfig.ReadKey( i ); - int nOption = mrSane.GetOptionByName( aString.GetBuffer() ); - if( nOption != -1 ) - { - if( aValue.CompareTo( "BOOL=", 5 ) == COMPARE_EQUAL ) - { - aValue.Erase( 0, 5 ); - sal_Bool aBOOL = (sal_Bool)aValue.ToInt32(); - mrSane.SetOptionValue( nOption, aBOOL ); - } - else if( aValue.CompareTo( "STRING=", 7 ) == COMPARE_EQUAL ) - { - aValue.Erase( 0, 7 ); - mrSane.SetOptionValue( nOption, String( aValue, osl_getThreadTextEncoding() ) ); - } - else if( aValue.CompareTo( "NUMERIC=", 8 ) == COMPARE_EQUAL ) - { - aValue.Erase( 0, 8 ); - int nMax = aValue.GetTokenCount( ':' ); - double fValue=0.0; - for( int n = 0; n < nMax ; n++ ) - { - ByteString aSub = aValue.GetToken( n, ':' ); - sscanf( aSub.GetBuffer(), "%lg", &fValue ); - SetAdjustedNumericalValue( aString.GetBuffer(), fValue, n ); - } - } - } - } - } - - DisableOption(); - InitFields(); - - return sal_True; -} - -void SaneDlg::SaveState() -{ - if( ! Sane::IsSane() ) - return; - - const char* pEnv = getenv( "HOME" ); - String aFileName( pEnv ? pEnv : "", osl_getThreadTextEncoding() ); - aFileName.AppendAscii( "/.so_sane_state" ); - - Config aConfig( aFileName ); - aConfig.DeleteGroup( "SANE" ); - aConfig.SetGroup( "SANE" ); - aConfig.WriteKey( "SO_LastSANEDevice", ByteString( maDeviceBox.GetSelectEntry(), RTL_TEXTENCODING_UTF8 ) ); - - static char const* pSaveOptions[] = { - "resolution", - "tl-x", - "tl-y", - "br-x", - "br-y" - }; - for( size_t i = 0; i < SAL_N_ELEMENTS(pSaveOptions); i++ ) - { - ByteString aOption = pSaveOptions[i]; - int nOption = mrSane.GetOptionByName( pSaveOptions[i] ); - if( nOption > -1 ) - { - SANE_Value_Type nType = mrSane.GetOptionType( nOption ); - switch( nType ) - { - case SANE_TYPE_BOOL: - { - sal_Bool bValue; - if( mrSane.GetOptionValue( nOption, bValue ) ) - { - rtl::OStringBuffer aString(RTL_CONSTASCII_STRINGPARAM( - "BOOL=")); - aString.append(static_cast<sal_Int32>(bValue)); - aConfig.WriteKey(aOption, aString.makeStringAndClear()); - } - } - break; - case SANE_TYPE_STRING: - { - ByteString aString( "STRING=" ); - ByteString aValue; - if( mrSane.GetOptionValue( nOption, aValue ) ) - { - aString += aValue; - aConfig.WriteKey( aOption, aString ); - } - } - break; - case SANE_TYPE_FIXED: - case SANE_TYPE_INT: - { - ByteString aString( "NUMERIC=" ); - double fValue; - char buf[256]; - int n; - - for( n = 0; n < mrSane.GetOptionElements( nOption ); n++ ) - { - if( ! mrSane.GetOptionValue( nOption, fValue, n ) ) - break; - if( n > 0 ) - aString += ":"; - sprintf( buf, "%lg", fValue ); - aString += buf; - } - if( n >= mrSane.GetOptionElements( nOption ) ) - aConfig.WriteKey( aOption, aString ); - } - break; - default: - break; - } - } - } -} - -sal_Bool SaneDlg::SetAdjustedNumericalValue( - const char* pOption, - double fValue, - int nElement ) -{ - int nOption; - if( ! Sane::IsSane() || ! mrSane.IsOpen() || ( nOption = mrSane.GetOptionByName( pOption ) ) == -1 ) - return sal_False; - - if( nElement < 0 || nElement >= mrSane.GetOptionElements( nOption ) ) - return sal_False; - - double* pValues = NULL; - int nValues; - if( ( nValues = mrSane.GetRange( nOption, pValues ) ) < 0 ) - return sal_False; - -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "SaneDlg::SetAdjustedNumericalValue( \"%s\", %lg ) ", - pOption, fValue ); -#endif - - if( nValues ) - { - int nNearest = 0; - double fNearest = 1e6; - for( int i = 0; i < nValues; i++ ) - { - if( fabs( fValue - pValues[ i ] ) < fNearest ) - { - fNearest = fabs( fValue - pValues[ i ] ); - nNearest = i; - } - } - fValue = pValues[ nNearest ]; - } - else - { - if( fValue < pValues[0] ) - fValue = pValues[0]; - if( fValue > pValues[1] ) - fValue = pValues[1]; - } - delete [] pValues; - mrSane.SetOptionValue( nOption, fValue, nElement ); -#if OSL_DEBUG_LEVEL > 1 - fprintf( stderr, "yields %lg\n", fValue ); -#endif - - - return sal_True; -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |