Files
libreoffice/extensions/source/scanner/sanedlg.cxx

1390 lines
47 KiB
C++
Raw Normal View History

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2000-09-18 15:18:56 +00:00
/*************************************************************************
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
2000-09-18 15:18:56 +00:00
*
* Copyright 2000, 2010 Oracle and/or its affiliates.
2000-09-18 15:18:56 +00:00
*
* OpenOffice.org - a multi-platform office productivity suite
2000-09-18 15:18:56 +00:00
*
* This file is part of OpenOffice.org.
2000-09-18 15:18:56 +00:00
*
* 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.
2000-09-18 15:18:56 +00:00
*
* 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).
2000-09-18 15:18:56 +00:00
*
* 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.
2000-09-18 15:18:56 +00:00
*
************************************************************************/
2000-09-18 15:18:56 +00:00
#include <stdio.h>
#include <stdlib.h>
#include <tools/config.hxx>
2000-09-18 15:18:56 +00:00
#include <vcl/msgbox.hxx>
#include <sanedlg.hxx>
#include <sanedlg.hrc>
#include <grid.hxx>
#include <math.h>
2010-10-15 18:15:35 +01:00
#include <sal/macros.h>
2011-07-17 22:52:33 +01:00
#include <rtl/strbuf.hxx>
2000-09-18 15:18:56 +00:00
ResId SaneResId( sal_uInt32 nID )
2000-09-18 15:18:56 +00:00
{
static ResMgr* pResMgr = ResMgr::CreateResMgr( "san" );
return ResId( nID, *pResMgr );
2000-09-18 15:18:56 +00:00
}
2011-10-20 21:25:46 +02:00
SaneDlg::SaneDlg( Window* pParent, Sane& rSane, bool bScanEnabled ) :
2000-09-18 15:18:56 +00:00
ModalDialog( pParent, SaneResId( RID_SANE_DIALOG ) ),
mrSane( rSane ),
mbIsDragging( sal_False ),
2011-10-20 21:25:46 +02:00
mbScanEnabled( bScanEnabled ),
mbDragDrawn( sal_False ),
maMapMode( MAP_APPFONT ),
2000-09-18 15:18:56 +00:00
maOKButton( this, SaneResId( RID_SCAN_OK ) ),
maCancelButton( this, SaneResId( RID_SCAN_CANCEL ) ),
maDeviceInfoButton( this, SaneResId( RID_DEVICEINFO_BTN ) ),
maPreviewButton( this, SaneResId( RID_PREVIEW_BTN ) ),
2011-10-20 21:25:46 +02:00
maScanButton( this, SaneResId( RID_SCAN_BTN ) ),
maButtonOption( this, SaneResId( RID_SCAN_BUTTON_OPTION_BTN ) ),
2000-09-18 15:18:56 +00:00
maOptionsTxt( this, SaneResId( RID_SCAN_OPTION_TXT ) ),
maOptionTitle( this, SaneResId( RID_SCAN_OPTIONTITLE_TXT ) ),
2000-09-18 15:18:56 +00:00
maOptionDescTxt( this, SaneResId( RID_SCAN_OPTION_DESC_TXT ) ),
maVectorTxt( this, SaneResId( RID_SCAN_NUMERIC_VECTOR_TXT ) ),
maScanLeftTxt( this, SaneResId( RID_SCAN_LEFT_TXT ) ),
2000-09-18 15:18:56 +00:00
maLeftField( this, SaneResId( RID_SCAN_LEFT_BOX ) ),
maScanTopTxt( this, SaneResId( RID_SCAN_TOP_TXT ) ),
2000-09-18 15:18:56 +00:00
maTopField( this, SaneResId( RID_SCAN_TOP_BOX ) ),
maRightTxt( this, SaneResId( RID_SCAN_RIGHT_TXT ) ),
2000-09-18 15:18:56 +00:00
maRightField( this, SaneResId( RID_SCAN_RIGHT_BOX ) ),
maBottomTxt( this, SaneResId( RID_SCAN_BOTTOM_TXT ) ),
2000-09-18 15:18:56 +00:00
maBottomField( this, SaneResId( RID_SCAN_BOTTOM_BOX ) ),
maDeviceBoxTxt( this, SaneResId( RID_DEVICE_BOX_TXT ) ),
2000-09-18 15:18:56 +00:00
maDeviceBox( this, SaneResId( RID_DEVICE_BOX ) ),
maReslTxt( this, SaneResId( RID_SCAN_RESOLUTION_TXT ) ),
2000-09-18 15:18:56 +00:00
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 ) ),
2000-09-18 15:18:56 +00:00
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 ) ),
2000-09-18 15:18:56 +00:00
maNumericEdit( this, SaneResId( RID_SCAN_NUMERIC_OPTION_EDT ) ),
maOptionBox( this, SaneResId( RID_SCAN_OPTION_BOX ) ),
2011-10-20 21:25:46 +02:00
mpRange( 0 ),
doScan( false )
2000-09-18 15:18:56 +00:00
{
if( Sane::IsSane() )
{
InitDevices(); // opens first sane device
DisableOption();
InitFields();
}
maDeviceInfoButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
maPreviewButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
2011-10-20 21:25:46 +02:00
maScanButton.SetClickHdl( LINK( this, SaneDlg, ClickBtnHdl ) );
2000-09-18 15:18:56 +00:00
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
);
2000-09-18 15:18:56 +00:00
FreeResource();
}
SaneDlg::~SaneDlg()
{
mrSane.SetReloadOptionsHdl( maOldLink );
2000-09-18 15:18:56 +00:00
}
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;
2000-09-18 15:18:56 +00:00
}
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;
2000-09-18 15:18:56 +00:00
double fValue;
sal_Bool bSuccess = sal_False;
const char *ppSpecialOptions[] = {
2000-09-18 15:18:56 +00:00
"resolution",
"tl-x",
"tl-y",
"br-x",
"br-y",
"preview"
};
mbDragEnable = sal_True;
2000-09-18 15:18:56 +00:00
maReslBox.Clear();
maMinTopLeft = Point( 0, 0 );
maMaxBottomRight = Point( PREVIEW_WIDTH, PREVIEW_HEIGHT );
2011-10-20 21:25:46 +02:00
maScanButton.Show( mbScanEnabled );
2000-09-18 15:18:56 +00:00
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 );
2000-09-18 15:18:56 +00:00
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);
}
2000-09-18 15:18:56 +00:00
maReslBox.InsertValue( (long)pDouble[1] );
}
if( pDouble )
delete [] pDouble;
2000-09-18 15:18:56 +00:00
}
else
maReslBox.Enable( sal_False );
2000-09-18 15:18:56 +00:00
}
}
else
maReslBox.Enable( sal_False );
2000-09-18 15:18:56 +00:00
// set scan area
for( i = 0; i < 4; i++ )
{
char const *pOptionName = NULL;
MetricField* pField = NULL;
2000-09-18 15:18:56 +00:00
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;
2000-09-18 15:18:56 +00:00
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;
2000-09-18 15:18:56 +00:00
}
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 );
2000-09-18 15:18:56 +00:00
}
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 );
}
2000-09-18 15:18:56 +00:00
}
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;
2000-09-18 15:18:56 +00:00
for( i = 1; i < mrSane.CountOptions(); i++ )
{
String aOption=mrSane.GetOptionName( i );
sal_Bool bInsertAdvanced =
2000-09-18 15:18:56 +00:00
mrSane.GetOptionCap( i ) & SANE_CAP_ADVANCED &&
! maAdvancedBox.IsChecked() ? sal_False : sal_True;
2000-09-18 15:18:56 +00:00
if( mrSane.GetOptionType( i ) == SANE_TYPE_GROUP )
{
if( bInsertAdvanced )
{
aOption = mrSane.GetOptionTitle( i );
pParentEntry = maOptionBox.InsertEntry( aOption );
bGroupRejected = sal_False;
2000-09-18 15:18:56 +00:00
}
else
bGroupRejected = sal_True;
2000-09-18 15:18:56 +00:00
}
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 &&
2010-10-15 18:15:35 +01:00
n < SAL_N_ELEMENTS(ppSpecialOptions); n++ )
2000-09-18 15:18:56 +00:00
{
if( aOption.EqualsAscii( ppSpecialOptions[n] ) )
bIsSpecial=sal_True;
2000-09-18 15:18:56 +00:00
}
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 );
2000-09-18 15:18:56 +00:00
}
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;
}
2000-09-18 15:18:56 +00:00
}
else if( pButton == &maAdvancedBox )
{
ReloadSaneOptionsHdl( NULL );
}
}
2011-10-20 21:25:46 +02:00
if( pButton == &maOKButton || pButton == &maScanButton )
2000-09-18 15:18:56 +00:00
{
double fRes = (double)maReslBox.GetValue();
SetAdjustedNumericalValue( "resolution", fRes );
UpdateScanArea( sal_True );
2000-09-18 15:18:56 +00:00
SaveState();
EndDialog( mrSane.IsOpen() ? 1 : 0 );
2011-10-20 21:25:46 +02:00
doScan = (pButton == &maScanButton);
2000-09-18 15:18:56 +00:00
}
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 )
{
2011-11-07 11:37:01 +00:00
rtl::OString aValue(rtl::OUStringToOString(maQuantumRangeBox.GetSelectEntry(),
osl_getThreadTextEncoding()));
double fValue = atof(aValue.getStr());
2000-09-18 15:18:56 +00:00
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() );
2011-11-07 11:37:01 +00:00
int nOption = mrSane.GetOptionByName(rtl::OUStringToOString(aOption,
osl_getThreadTextEncoding()).getStr());
2000-09-18 15:18:56 +00:00
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 );
2000-09-18 15:18:56 +00:00
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 );
2000-09-18 15:18:56 +00:00
}
else
{
DisableOption();
// bring up dialog only on button click
EstablishButtonOption();
2000-09-18 15:18:56 +00:00
}
}
}
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 );
2000-09-18 15:18:56 +00:00
}
}
else if( pEdit == &maNumericEdit )
{
double fValue;
char pBuf[256];
2011-11-07 11:37:01 +00:00
rtl::OString aContents(rtl::OUStringToOString(maNumericEdit.GetText(),
osl_getThreadTextEncoding()));
fValue = atof(aContents.getStr());
2000-09-18 15:18:56 +00:00
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() ) );
2000-09-18 15:18:56 +00:00
}
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() );
2000-09-18 15:18:56 +00:00
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*/ )
2000-09-18 15:18:56 +00:00
{
mnCurrentOption = -1;
mnCurrentElement = 0;
DisableOption();
// #92024# preserve preview rect, should only be set
// initially or in AcquirePreview
Rectangle aPreviewRect = maPreviewRect;
2000-09-18 15:18:56 +00:00
InitFields();
maPreviewRect = aPreviewRect;
2000-09-18 15:18:56 +00:00
Rectangle aDummyRect( Point( 0, 0 ), GetSizePixel() );
Paint( aDummyRect );
return 0;
}
void SaneDlg::AcquirePreview()
{
if( ! mrSane.IsOpen() )
return;
UpdateScanArea( sal_True );
2000-09-18 15:18:56 +00:00
// 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 );
2000-09-18 15:18:56 +00:00
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
2000-09-18 15:18:56 +00:00
aTransporter.getStream().Seek( STREAM_SEEK_TO_END );
CWS-TOOLING: integrate CWS evoab2def 2009-05-28 16:00:19 +0200 fs r272412 : don't use createFalse - Evo 2.22 simply hangs when ask for all contacts without a first name. Instead, in the WHERE 0=1 case, simply create an empty result set 2009-05-22 14:25:51 +0200 fs r272193 : #i10000# 2009-05-22 14:25:37 +0200 fs r272192 : oops, ENABLE_EVOAB2 for some platforms only, not generically 2009-05-22 14:19:00 +0200 fs r272191 : #i10000# 2009-05-22 12:42:38 +0200 fs r272183 : when sorting, properly use a syslocale collator, instead of comparing the numerical values of the string's UTF-16 code points 2009-05-20 15:09:00 +0200 fs r272131 : clear/getWarnings: also allowed without cache 2009-05-20 14:11:19 +0200 fs r272128 : removed debug traces 2009-05-20 14:03:31 +0200 fs r272126 : #i55701# +STR_SORT_BY_COL_ONLY 2009-05-20 14:02:29 +0200 fs r272125 : implement sorting 2009-05-20 10:10:19 +0200 fs r272107 : #i10000# 2009-05-19 16:02:17 +0200 fs r272089 : #i10000# 2009-05-19 16:02:02 +0200 fs r272088 : #i55701# strings for new error condition DATA_CANNOT_SELECT_UNFILTERED 2009-05-19 16:01:31 +0200 fs r272087 : #i55701# use DATA_CANNOT_SELECT_UNFILTERED as standardized error code 2009-05-19 15:59:59 +0200 fs r272086 : #i55701# +DATA_CANNOT_SELECT_UNFILTERED 2009-05-19 15:46:12 +0200 fs r272084 : #i55701# recognize the DATA_CANNOT_SELECT_UNFILTERED error condition, and allow filtering in this case, even when the result set is empty 2009-05-19 09:06:50 +0200 fs r272059 : merging changes from CWS dba32b, to prevent future conflicts with upcoming local changes 2009-05-18 21:48:58 +0200 fs r272054 : accessing a non-local unfiltered address book now returns an empty result set, and reports a warning, instead of ungracefully failing 2009-05-18 21:48:42 +0200 fs r272053 : accessing a non-local unfiltered address book now returns an empty result set, and reports a warning, instead of ungracefully failing 2009-05-18 21:47:41 +0200 fs r272052 : +setExternalWarnings 2009-05-18 21:47:12 +0200 fs r272051 : #i55701# when re/loading the form, display any possible warnings 2009-05-18 21:43:26 +0200 fs r272050 : #i55701# implement XWarningsSupplier, exposing the warnings of our result set 2009-05-18 21:42:51 +0200 fs r272049 : #i55701# implement XWarningsSupplier, exposing the warnings of our aggregate RowSet 2009-05-18 17:53:59 +0200 fs r272041 : #i55701# moved the (I)WarningsContainer from dbaccess to connectivity, to be able to use it in the latter module, too 2009-05-18 17:24:10 +0200 fs r272040 : #i55701# properly enable the various Evolution types 2009-05-18 14:52:19 +0200 fs r272024 : #i55701# properly enable the Evolution types 2009-05-18 13:57:10 +0200 fs r272018 : fixed/extended whereAnalysis (column searching still not enabled, as neither LIKE nor = seem to work with my (somewhat older) Evolution version) 2009-05-18 13:56:08 +0200 fs r272017 : extended showParseTree 2009-05-18 13:55:25 +0200 fs r272016 : extended showParseTree 2009-05-18 11:40:16 +0200 fs r272008 : #i55701# 2009-05-18 11:39:02 +0200 fs r272006 : let the PreparedStatement return proper meta data, too 2009-05-18 10:05:37 +0200 fs r271999 : moved the XStatement interface to from OCommonStatement to OStatement - the former class is also the base for other classes which should not have this interface 2009-05-15 21:53:22 +0200 fs r271973 : collectColumnInformation: report invalid meta data as assertion 2009-05-15 21:51:40 +0200 fs r271972 : showParseTree should be const 2009-05-15 21:51:26 +0200 fs r271971 : showParseTree should be const 2009-05-15 21:51:03 +0200 fs r271970 : properly recognize the 'WHERE 0 = 1' clause, this way having proper statement meta data, this way saving much much calls from the DBA framework 2009-05-15 20:29:03 +0200 fs r271969 : cleaned up the mess with the statement classes 2009-05-15 15:51:11 +0200 fs r271944 : let the result set properly init its meta data 2009-05-15 15:29:54 +0200 fs r271939 : proper property implementations for the resultset class 2009-05-15 15:01:31 +0200 fs r271936 : proper property implementations for the statement class 2009-05-08 14:46:33 +0200 fs r271717 : component_foo must be PUBLIC 2009-05-06 09:20:05 +0200 fs r271565 : #i10000# (warnings on unxlngi6) 2009-05-06 09:01:30 +0200 fs r271564 : #i101493# 2009-05-05 23:08:12 +0200 fs r271560 : #i55701# merging the changes from the ancient (CVS-based) CWS evoab2default into this CWS here
2009-06-05 12:31:05 +00:00
fprintf( stderr, "Previewbitmapstream contains %d bytes\n", (int)aTransporter.getStream().Tell() );
2000-09-18 15:18:56 +00:00
#endif
aTransporter.getStream().Seek( STREAM_SEEK_TO_BEGIN );
maPreviewBitmap.Read( aTransporter.getStream(), sal_True );
2000-09-18 15:18:56 +00:00
}
SetAdjustedNumericalValue( "resolution", fResl );
maReslBox.SetValue( (sal_uLong)fResl );
2000-09-18 15:18:56 +00:00
if( mbDragEnable )
2010-11-27 16:28:14 +00:00
{
maPreviewRect = Rectangle( maTopLeft,
Size( maBottomRight.X() - maTopLeft.X(),
maBottomRight.Y() - maTopLeft.Y() )
);
2010-11-27 16:28:14 +00:00
}
else
{
Size aBMSize( maPreviewBitmap.GetSizePixel() );
2010-11-27 16:28:14 +00:00
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 ) );
}
2010-11-27 16:28:14 +00:00
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() ) );
}
}
2000-09-18 15:18:56 +00:00
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;
2000-09-18 15:18:56 +00:00
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 );
2000-09-18 15:18:56 +00:00
}
void SaneDlg::EstablishBoolOption()
{
sal_Bool bSuccess, bValue;
2000-09-18 15:18:56 +00:00
bSuccess = mrSane.GetOptionValue( mnCurrentOption, bValue );
if( bSuccess )
{
maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) );
maOptionDescTxt.Show( sal_True );
2000-09-18 15:18:56 +00:00
maBoolCheckBox.Check( bValue );
maBoolCheckBox.Show( sal_True );
2000-09-18 15:18:56 +00:00
}
}
void SaneDlg::EstablishStringOption()
{
sal_Bool bSuccess;
2011-11-07 11:37:01 +00:00
rtl::OString aValue;
2000-09-18 15:18:56 +00:00
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 );
2000-09-18 15:18:56 +00:00
}
}
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() ) );
2011-11-07 11:37:01 +00:00
rtl::OString aValue;
2000-09-18 15:18:56 +00:00
mrSane.GetOptionValue( mnCurrentOption, aValue );
maStringRangeBox.SelectEntry( String( aValue, osl_getThreadTextEncoding() ) );
maStringRangeBox.Show( sal_True );
2000-09-18 15:18:56 +00:00
maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) );
maOptionDescTxt.Show( sal_True );
2000-09-18 15:18:56 +00:00
}
void SaneDlg::EstablishQuantumRange()
{
if( mpRange )
{
delete [] mpRange;
2000-09-18 15:18:56 +00:00
mpRange = 0;
}
int nValues = mrSane.GetRange( mnCurrentOption, mpRange );
if( nValues == 0 )
{
mfMin = mpRange[ 0 ];
mfMax = mpRange[ 1 ];
delete [] mpRange;
2000-09-18 15:18:56 +00:00
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() ) );
2000-09-18 15:18:56 +00:00
}
double fValue;
if( mrSane.GetOptionValue( mnCurrentOption, fValue, mnCurrentElement ) )
{
sprintf( pBuf, "%g", fValue );
maQuantumRangeBox.SelectEntry( String( pBuf, osl_getThreadTextEncoding() ) );
2000-09-18 15:18:56 +00:00
}
maQuantumRangeBox.Show( sal_True );
2000-09-18 15:18:56 +00:00
String aText( mrSane.GetOptionName( mnCurrentOption ) );
aText += ' ';
aText += mrSane.GetOptionUnitName( mnCurrentOption );
maOptionDescTxt.SetText( aText );
maOptionDescTxt.Show( sal_True );
2000-09-18 15:18:56 +00:00
}
}
void SaneDlg::EstablishNumericOption()
{
sal_Bool bSuccess;
2000-09-18 15:18:56 +00:00
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() );
2000-09-18 15:18:56 +00:00
}
maOptionDescTxt.SetText( aText );
maOptionDescTxt.Show( sal_True );
2000-09-18 15:18:56 +00:00
sprintf( pBuf, "%g", fValue );
maNumericEdit.SetText( String( pBuf, osl_getThreadTextEncoding() ) );
maNumericEdit.Show( sal_True );
2000-09-18 15:18:56 +00:00
}
void SaneDlg::EstablishButtonOption()
{
maOptionDescTxt.SetText( mrSane.GetOptionName( mnCurrentOption ) );
maOptionDescTxt.Show( sal_True );
maButtonOption.Show( sal_True );
2000-09-18 15:18:56 +00:00
}
#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 );
2000-09-18 15:18:56 +00:00
}
ModalDialog::MouseMove( rMEvt );
}
void SaneDlg::MouseButtonDown( const MouseEvent& rMEvt )
{
Point aMousePixel = rMEvt.GetPosPixel();
if( ! mbIsDragging && mbDragEnable )
2000-09-18 15:18:56 +00:00
{
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;
2000-09-18 15:18:56 +00:00
}
else if( aMousePixel.X() >= nMiddleX &&
aMousePixel.X() < nMiddleX + RECT_SIZE_PIX )
{
meDragDirection = Top;
aMousePixel.Y() = maTopLeft.Y();
mbIsDragging = sal_True;
2000-09-18 15:18:56 +00:00
}
else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX &&
aMousePixel.X() <= maBottomRight.X() )
{
meDragDirection = TopRight;
aMousePixel = Point( maBottomRight.X(), maTopLeft.Y() );
mbIsDragging = sal_True;
2000-09-18 15:18:56 +00:00
}
}
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;
2000-09-18 15:18:56 +00:00
}
else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX &&
aMousePixel.X() <= maBottomRight.X() )
{
meDragDirection = Right;
aMousePixel.X() = maBottomRight.X();
mbIsDragging = sal_True;
2000-09-18 15:18:56 +00:00
}
}
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;
2000-09-18 15:18:56 +00:00
}
else if( aMousePixel.X() >= nMiddleX &&
aMousePixel.X() < nMiddleX + RECT_SIZE_PIX )
{
meDragDirection = Bottom;
aMousePixel.Y() = maBottomRight.Y();
mbIsDragging = sal_True;
2000-09-18 15:18:56 +00:00
}
else if( aMousePixel.X() > maBottomRight.X() - RECT_SIZE_PIX &&
aMousePixel.X() <= maBottomRight.X() )
{
meDragDirection = BottomRight;
aMousePixel = maBottomRight;
mbIsDragging = sal_True;
2000-09-18 15:18:56 +00:00
}
}
}
if( mbIsDragging )
{
SetPointerPosPixel( aMousePixel );
DrawDrag();
}
ModalDialog::MouseButtonDown( rMEvt );
}
void SaneDlg::MouseButtonUp( const MouseEvent& rMEvt )
{
if( mbIsDragging )
{
UpdateScanArea( sal_True );
2000-09-18 15:18:56 +00:00
}
mbIsDragging = sal_False;
2000-09-18 15:18:56 +00:00
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;
2000-09-18 15:18:56 +00:00
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;
2000-09-18 15:18:56 +00:00
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 )
2000-09-18 15:18:56 +00:00
{
if( ! mbDragEnable )
return;
2000-09-18 15:18:56 +00:00
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()
2000-09-18 15:18:56 +00:00
{
int i;
if( ! Sane::IsSane() )
return sal_False;
2000-09-18 15:18:56 +00:00
const char* pEnv = getenv("HOME");
String aFileName( pEnv ? pEnv : "", osl_getThreadTextEncoding() );
2000-09-18 15:18:56 +00:00
aFileName += String( RTL_CONSTASCII_USTRINGPARAM( "/.so_sane_state" ) );
Config aConfig( aFileName );
if( ! aConfig.HasGroup( "SANE" ) )
return sal_False;
2000-09-18 15:18:56 +00:00
aConfig.SetGroup( "SANE" );
2011-11-07 11:37:01 +00:00
rtl::OString aString = aConfig.ReadKey( "SO_LastSaneDevice" );
for( i = 0; i < Sane::CountDevices() && !aString.equals(rtl::OUStringToOString(Sane::GetName(i), osl_getThreadTextEncoding())); i++ ) ;
2000-09-18 15:18:56 +00:00
if( i == Sane::CountDevices() )
return sal_False;
2000-09-18 15:18:56 +00:00
mrSane.Close();
2011-11-07 11:37:01 +00:00
mrSane.Open( aString.getStr() );
2000-09-18 15:18:56 +00:00
DisableOption();
InitFields();
if( mrSane.IsOpen() )
{
int iMax = aConfig.GetKeyCount();
2011-08-21 01:09:00 +01:00
for (i = 0; i < iMax; ++i)
2000-09-18 15:18:56 +00:00
{
aString = aConfig.GetKeyName( i );
2011-08-21 01:09:00 +01:00
rtl::OString aValue = aConfig.ReadKey( i );
2011-11-07 11:37:01 +00:00
int nOption = mrSane.GetOptionByName( aString.getStr() );
2011-08-21 01:09:00 +01:00
if( nOption == -1 )
continue;
if (aValue.matchL(RTL_CONSTASCII_STRINGPARAM("BOOL=")))
2000-09-18 15:18:56 +00:00
{
2011-08-21 01:09:00 +01:00
aValue = aValue.copy(RTL_CONSTASCII_LENGTH("BOOL="));
sal_Bool aBOOL = (sal_Bool)aValue.toInt32();
mrSane.SetOptionValue( nOption, aBOOL );
}
else if (aValue.matchL(RTL_CONSTASCII_STRINGPARAM("STRING=")))
2011-08-21 01:09:00 +01:00
{
aValue = aValue.copy(RTL_CONSTASCII_LENGTH("STRING="));
mrSane.SetOptionValue(nOption,rtl::OStringToOUString(aValue, osl_getThreadTextEncoding()) );
}
else if (aValue.matchL(RTL_CONSTASCII_STRINGPARAM("NUMERIC=")))
2011-08-21 01:09:00 +01:00
{
aValue = aValue.copy(RTL_CONSTASCII_LENGTH("NUMERIC="));
sal_Int32 nIndex = 0;
int n = 0;
do
2000-09-18 15:18:56 +00:00
{
2011-08-21 01:09:00 +01:00
rtl::OString aSub = aValue.getToken(0, ':', nIndex);
2000-09-18 15:18:56 +00:00
double fValue=0.0;
2011-08-21 01:09:00 +01:00
sscanf(aSub.getStr(), "%lg", &fValue);
2011-11-07 11:37:01 +00:00
SetAdjustedNumericalValue(aString.getStr(), fValue, n++);
2000-09-18 15:18:56 +00:00
}
2011-08-21 01:09:00 +01:00
while ( nIndex >= 0 );
2000-09-18 15:18:56 +00:00
}
}
}
DisableOption();
InitFields();
return sal_True;
2000-09-18 15:18:56 +00:00
}
void SaneDlg::SaveState()
{
if( ! Sane::IsSane() )
return;
const char* pEnv = getenv( "HOME" );
String aFileName( pEnv ? pEnv : "", osl_getThreadTextEncoding() );
2000-09-18 15:18:56 +00:00
aFileName.AppendAscii( "/.so_sane_state" );
Config aConfig( aFileName );
aConfig.DeleteGroup( "SANE" );
aConfig.SetGroup( "SANE" );
2011-11-07 11:37:01 +00:00
aConfig.WriteKey( "SO_LastSANEDevice",
rtl::OUStringToOString(maDeviceBox.GetSelectEntry(), RTL_TEXTENCODING_UTF8) );
2000-09-18 15:18:56 +00:00
static char const* pSaveOptions[] = {
2000-09-18 15:18:56 +00:00
"resolution",
"tl-x",
"tl-y",
"br-x",
"br-y"
};
2011-11-07 11:37:01 +00:00
for( size_t i = 0; i < SAL_N_ELEMENTS(pSaveOptions); ++i )
2000-09-18 15:18:56 +00:00
{
2011-11-07 11:37:01 +00:00
rtl::OString aOption = pSaveOptions[i];
2000-09-18 15:18:56 +00:00
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;
2000-09-18 15:18:56 +00:00
if( mrSane.GetOptionValue( nOption, bValue ) )
{
2011-07-17 22:52:33 +01:00
rtl::OStringBuffer aString(RTL_CONSTASCII_STRINGPARAM(
"BOOL="));
aString.append(static_cast<sal_Int32>(bValue));
aConfig.WriteKey(aOption, aString.makeStringAndClear());
2000-09-18 15:18:56 +00:00
}
}
break;
case SANE_TYPE_STRING:
{
2011-11-07 11:37:01 +00:00
rtl::OString aValue;
2000-09-18 15:18:56 +00:00
if( mrSane.GetOptionValue( nOption, aValue ) )
{
2011-11-07 11:37:01 +00:00
rtl::OStringBuffer aString(RTL_CONSTASCII_STRINGPARAM("STRING="));
aString.append(aValue);
aConfig.WriteKey( aOption, aString.makeStringAndClear() );
2000-09-18 15:18:56 +00:00
}
}
break;
case SANE_TYPE_FIXED:
case SANE_TYPE_INT:
{
2011-11-07 11:37:01 +00:00
rtl::OStringBuffer aString(RTL_CONSTASCII_STRINGPARAM("NUMERIC="));
2000-09-18 15:18:56 +00:00
double fValue;
char buf[256];
int n;
for( n = 0; n < mrSane.GetOptionElements( nOption ); n++ )
2000-09-18 15:18:56 +00:00
{
if( ! mrSane.GetOptionValue( nOption, fValue, n ) )
break;
if( n > 0 )
2011-11-07 11:37:01 +00:00
aString.append(':');
2000-09-18 15:18:56 +00:00
sprintf( buf, "%lg", fValue );
2011-11-07 11:37:01 +00:00
aString.append(buf);
2000-09-18 15:18:56 +00:00
}
if( n >= mrSane.GetOptionElements( nOption ) )
2011-11-07 11:37:01 +00:00
aConfig.WriteKey( aOption, aString.makeStringAndClear() );
2000-09-18 15:18:56 +00:00
}
break;
default:
break;
}
}
}
}
sal_Bool SaneDlg::SetAdjustedNumericalValue(
2000-09-18 15:18:56 +00:00
const char* pOption,
double fValue,
int nElement )
{
int nOption;
if( ! Sane::IsSane() || ! mrSane.IsOpen() || ( nOption = mrSane.GetOptionByName( pOption ) ) == -1 )
return sal_False;
2000-09-18 15:18:56 +00:00
if( nElement < 0 || nElement >= mrSane.GetOptionElements( nOption ) )
return sal_False;
2000-09-18 15:18:56 +00:00
double* pValues = NULL;
int nValues;
if( ( nValues = mrSane.GetRange( nOption, pValues ) ) < 0 )
return sal_False;
2000-09-18 15:18:56 +00:00
#if OSL_DEBUG_LEVEL > 1
2000-09-18 15:18:56 +00:00
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;
2000-09-18 15:18:56 +00:00
mrSane.SetOptionValue( nOption, fValue, nElement );
#if OSL_DEBUG_LEVEL > 1
2000-09-18 15:18:56 +00:00
fprintf( stderr, "yields %lg\n", fValue );
#endif
return sal_True;
2000-09-18 15:18:56 +00:00
}
2011-10-20 21:25:46 +02:00
bool SaneDlg::getDoScan()
{
return doScan;
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */