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: */
|