summaryrefslogtreecommitdiff
path: root/inputmethods/handwriting/qimpenchar.cpp
Unidiff
Diffstat (limited to 'inputmethods/handwriting/qimpenchar.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--inputmethods/handwriting/qimpenchar.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/inputmethods/handwriting/qimpenchar.cpp b/inputmethods/handwriting/qimpenchar.cpp
index b83b2a4..96a0502 100644
--- a/inputmethods/handwriting/qimpenchar.cpp
+++ b/inputmethods/handwriting/qimpenchar.cpp
@@ -281,165 +281,179 @@ QIMPenCharSet::QIMPenCharSet()
281 281
282/*! 282/*!
283 Construct and load a characters set from file \a fn. 283 Construct and load a characters set from file \a fn.
284 */ 284 */
285QIMPenCharSet::QIMPenCharSet( const QString &fn ) 285QIMPenCharSet::QIMPenCharSet( const QString &fn )
286{ 286{
287 chars.setAutoDelete( TRUE ); 287 chars.setAutoDelete( TRUE );
288 desc = "Unnamed"; 288 desc = "Unnamed";
289 csTitle = "abc"; 289 csTitle = "abc";
290 csType = Unknown; 290 csType = Unknown;
291 maxStrokes = 0; 291 maxStrokes = 0;
292 load( fn, System ); 292 load( fn, System );
293} 293}
294 294
295const QString &QIMPenCharSet::filename( Domain d ) const 295const QString &QIMPenCharSet::filename( Domain d ) const
296{ 296{
297 if ( d == System ) 297 if ( d == System )
298 return sysFilename; 298 return sysFilename;
299 else 299 else
300 return userFilename; 300 return userFilename;
301} 301}
302 302
303void QIMPenCharSet::setFilename( const QString &fn, Domain d ) 303void QIMPenCharSet::setFilename( const QString &fn, Domain d )
304{ 304{
305 if ( d == System ) 305 if ( d == System )
306 sysFilename = fn; 306 sysFilename = fn;
307 else if ( d == User ) 307 else if ( d == User )
308 userFilename = fn; 308 userFilename = fn;
309} 309}
310 310
311/*! 311/*!
312 Load a character set from file \a fn. 312 Load a character set from file \a fn.
313 */ 313 */
314bool QIMPenCharSet::load( const QString &fn, Domain d ) 314bool QIMPenCharSet::load( const QString &fn, Domain d )
315{ 315{
316 setFilename( fn, d ); 316 setFilename( fn, d );
317 317
318 bool ok = FALSE; 318 bool ok = FALSE;
319 QFile file( fn ); 319 QFile file( fn );
320 if ( file.open( IO_ReadOnly ) ) { 320 if ( file.open( IO_ReadOnly ) ) {
321 QDataStream ds( &file ); 321 QDataStream ds( &file );
322 QString version; 322 QString version;
323 ds >> version; 323 ds >> version;
324 ds >> csTitle; 324 ds >> csTitle;
325 ds >> desc; 325 ds >> desc;
326 int major = version.mid( 4, 1 ).toInt(); 326 int major = version.mid( 4, 1 ).toInt();
327 int minor = version.mid( 6 ).toInt(); 327 int minor = version.mid( 6 ).toInt();
328 if ( major >= 1 && minor > 0 ) { 328 if ( major >= 1 && minor > 0 ) {
329 ds >> (Q_INT8 &)csType; 329 ds >> (Q_INT8 &)csType;
330 } else { 330 } else {
331 if ( csTitle == "abc" ) 331 if ( csTitle == "abc" )
332 csType = Lower; 332 csType = Lower;
333 else if ( csTitle == "ABC" ) 333 else if ( csTitle == "ABC" )
334 csType = Upper; 334 csType = Upper;
335 else if ( csTitle == "123" ) 335 else if ( csTitle == "123" )
336 csType = Numeric; 336 csType = Numeric;
337 else if ( fn == "Combining" ) 337 else if ( fn == "Combining" )
338 csType = Combining; 338 csType = Combining;
339 } 339 }
340 while ( !ds.atEnd() ) { 340 while ( !ds.atEnd() ) {
341 QIMPenChar *pc = new QIMPenChar; 341 QIMPenChar *pc = new QIMPenChar;
342 ds >> *pc; 342 ds >> *pc;
343 if ( d == User ) 343 if ( d == User )
344 markDeleted( pc->character() ); // override system 344 markDeleted( pc->character() ); // override system
345 addChar( pc ); 345 if ( !pc->testFlag( QIMPenChar::Deleted ) )
346 addChar( pc );
346 } 347 }
347 if ( file.status() == IO_Ok ) 348 if ( file.status() == IO_Ok )
348 ok = TRUE; 349 ok = TRUE;
349 } 350 }
350 setHidden ( false ); 351 setHidden ( false );
351 return ok; 352 return ok;
352} 353}
353 354
354/*! 355/*!
355 Save this character set. 356 Save this character set.
356 */ 357 */
357bool QIMPenCharSet::save( Domain d ) 358bool QIMPenCharSet::save( Domain d )
358{ 359{
359 if ( filename( d ).isEmpty() ) 360 if ( filename( d ).isEmpty() )
360 return FALSE; 361 return FALSE;
361 362
362 if ( hidden() ) 363 if ( hidden() )
363 return TRUE; 364 return TRUE;
364 365
365 bool ok = FALSE; 366 bool ok = FALSE;
366 367
367 QString fn = filename( d ); 368 QString fn = filename( d );
368 QString tmpFn = fn + ".new"; 369 QString tmpFn = fn + ".new";
369 QFile file( tmpFn ); 370 QFile file( tmpFn );
370 if ( file.open( IO_WriteOnly|IO_Raw ) ) { 371 if ( file.open( IO_WriteOnly|IO_Raw ) ) {
371 QByteArray buf; 372 QByteArray buf;
372 QDataStream ds( buf, IO_WriteOnly ); 373 QDataStream ds( buf, IO_WriteOnly );
373 ds << QString( "QPT 1.1" ); 374 ds << QString( "QPT 1.1" );
374 ds << csTitle; 375 ds << csTitle;
375 ds << desc; 376 ds << desc;
376 ds << (Q_INT8)csType; 377 ds << (Q_INT8)csType;
377 QIMPenCharIterator ci( chars ); 378 QIMPenCharIterator ci( chars );
378 for ( ; ci.current(); ++ci ) { 379 for ( ; ci.current(); ++ci ) {
379 QIMPenChar *pc = ci.current(); 380 QIMPenChar *pc = ci.current();
380 if ( ( ( (d == System) && pc->testFlag( QIMPenChar::System ) ) || 381/*
381 ( (d == User) && !pc->testFlag( QIMPenChar::System ) ) ) && 382 * If the Domain is System and the Char is marked System - OR
383 * the domain is User, the Char is User and it's not deleted - OR
384 * the domain is User, the Char is System and it is deleted - AND
385 * the character is not an automated Combined Character
386 *
387 * This is required to ensure that we don't save user defined chars that have been deleted, but
388 * we *DO* save System chars that have been deleted. There is still the issue of deleted combined
389 * chars but I'm not sure how to tackle that yet
390 *
391 */
392
393 if ( ( ( (d == System) && pc->testFlag( QIMPenChar::System ) ) ||
394 ( (d == User) && !pc->testFlag( QIMPenChar::System ) && !pc->testFlag( QIMPenChar::Deleted ) ) ||
395 ( (d == User) && pc->testFlag( QIMPenChar::System ) && pc->testFlag( QIMPenChar::Deleted ) ) ) &&
382 ( !pc->testFlag (QIMPenChar::Combined ) ) ) { 396 ( !pc->testFlag (QIMPenChar::Combined ) ) ) {
383 ds << *pc; 397 ds << *pc;
384 } 398 }
385 } 399 }
386 400
387 file.writeBlock( buf ); 401 file.writeBlock( buf );
388 file.close(); 402 file.close();
389 if ( file.status() == IO_Ok ) 403 if ( file.status() == IO_Ok )
390 ok = TRUE; 404 ok = TRUE;
391 } 405 }
392 406
393 if ( ok ) { 407 if ( ok ) {
394 if ( ::rename( tmpFn.latin1(), fn.latin1() ) < 0 ) { 408 if ( ::rename( tmpFn.latin1(), fn.latin1() ) < 0 ) {
395 owarn << "problem renaming file " <<tmpFn.latin1() << " to "<< fn.latin1() 409 owarn << "problem renaming file " <<tmpFn.latin1() << " to "<< fn.latin1()
396 << ", errno: " << errno << oendl; 410 << ", errno: " << errno << oendl;
397 // remove the tmp file, otherwise, it will just lay around... 411 // remove the tmp file, otherwise, it will just lay around...
398 QFile::remove( tmpFn.latin1() ); 412 QFile::remove( tmpFn.latin1() );
399 ok = FALSE; 413 ok = FALSE;
400 } 414 }
401 } 415 }
402 416
403 return ok; 417 return ok;
404} 418}
405 419
406QIMPenChar *QIMPenCharSet::at( int i ) 420QIMPenChar *QIMPenCharSet::at( int i )
407{ 421{
408 return chars.at(i); 422 return chars.at(i);
409} 423}
410 424
411void QIMPenCharSet::markDeleted( uint ch ) 425void QIMPenCharSet::markDeleted( uint ch )
412{ 426{
413 QIMPenCharIterator ci( chars ); 427 QIMPenCharIterator ci( chars );
414 for ( ; ci.current(); ++ci ) { 428 for ( ; ci.current(); ++ci ) {
415 QIMPenChar *pc = ci.current(); 429 QIMPenChar *pc = ci.current();
416 if ( pc->character() == ch && pc->testFlag( QIMPenChar::System ) ) 430 if ( pc->character() == ch && pc->testFlag( QIMPenChar::System ) )
417 pc->setFlag( QIMPenChar::Deleted ); 431 pc->setFlag( QIMPenChar::Deleted );
418 } 432 }
419} 433}
420 434
421/*! 435/*!
422 Find the best matches for \a ch in this character set. 436 Find the best matches for \a ch in this character set.
423 */ 437 */
424QIMPenCharMatchList QIMPenCharSet::match( QIMPenChar *ch ) 438QIMPenCharMatchList QIMPenCharSet::match( QIMPenChar *ch )
425{ 439{
426 QIMPenCharMatchList matches; 440 QIMPenCharMatchList matches;
427 441
428 QIMPenCharIterator ci( chars ); 442 QIMPenCharIterator ci( chars );
429 for ( ; ci.current(); ++ci ) { 443 for ( ; ci.current(); ++ci ) {
430 QIMPenChar *tmplChar = ci.current(); 444 QIMPenChar *tmplChar = ci.current();
431 if ( tmplChar->testFlag( QIMPenChar::Deleted ) ) { 445 if ( tmplChar->testFlag( QIMPenChar::Deleted ) ) {
432 continue; 446 continue;
433 } 447 }
434 int err; 448 int err;
435 if ( ch->penStrokes().count() <= tmplChar->penStrokes().count() ) { 449 if ( ch->penStrokes().count() <= tmplChar->penStrokes().count() ) {
436 err = ch->match( tmplChar ); 450 err = ch->match( tmplChar );
437 if ( err <= QIMPEN_MATCH_THRESHOLD ) { 451 if ( err <= QIMPEN_MATCH_THRESHOLD ) {
438 if (tmplChar->penStrokes().count() != ch->penStrokes().count()) 452 if (tmplChar->penStrokes().count() != ch->penStrokes().count())
439 err = QMIN(err*3, QIMPEN_MATCH_THRESHOLD); 453 err = QMIN(err*3, QIMPEN_MATCH_THRESHOLD);
440 QIMPenCharMatchList::Iterator it; 454 QIMPenCharMatchList::Iterator it;
441 for ( it = matches.begin(); it != matches.end(); ++it ) { 455 for ( it = matches.begin(); it != matches.end(); ++it ) {
442 if ( (*it).penChar->character() == tmplChar->character() && 456 if ( (*it).penChar->character() == tmplChar->character() &&
443 (*it).penChar->penStrokes().count() == tmplChar->penStrokes().count() ) { 457 (*it).penChar->penStrokes().count() == tmplChar->penStrokes().count() ) {
444 if ( (*it).error > err ) 458 if ( (*it).error > err )
445 (*it).error = err; 459 (*it).error = err;