You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdegraphics/kooka/kocrocrad.cpp

264 lines
7.6 KiB

/***************************************************************************
kocrocrad.cpp - ocrad dialog
-------------------
begin : Tue Jul 15 2003
copyright : (C) 2003 by Klaas Freitag
email : freitag@suse.de
***************************************************************************/
/***************************************************************************
* *
* This file may be distributed and/or modified under the terms of the *
* GNU General Public License version 2 as published by the Free Software *
* Foundation and appearing in the file COPYING included in the *
* packaging of this file. *
*
* As a special exception, permission is given to link this program *
* with any version of the KADMOS ocr/icr engine of reRecognition GmbH, *
* Kreuzlingen and distribute the resulting executable without *
* including the source code for KADMOS in the source distribution. *
*
* As a special exception, permission is given to link this program *
* with any edition of TQt, and distribute the resulting executable, *
* without including the source code for TQt in the source distribution. *
* *
***************************************************************************/
/* $Id$ */
#include <tqlayout.h>
#include <tqlabel.h>
#include <tqfileinfo.h>
#include <tqtooltip.h>
#include <tqregexp.h>
#include <kapplication.h>
#include <kconfig.h>
#include <kglobal.h>
#include <kdebug.h>
#include <klocale.h>
#include <kanimwidget.h>
#include <kseparator.h>
#include <kmessagebox.h>
#include <kurlrequester.h>
#include <kprocess.h>
#include "resource.h"
#include "kocrocrad.h"
#include <kscanslider.h>
#include "kookaimage.h"
#include "kookapref.h"
#include <tqvbox.h>
#include <tqhbox.h>
#include <tqcombobox.h>
ocradDialog::ocradDialog( TQWidget *parent, KSpellConfig *spellConfig )
:KOCRBase( parent, spellConfig, KDialogBase::Tabbed ),
m_ocrCmd( TQString()),
m_orfUrlRequester(0L),
m_layoutMode(0),
m_binaryLabel(0),
m_proc(0),
m_version(0)
{
kdDebug(28000) << "Starting ocrad-Start-Dialog!" << endl;
// Layout-Boxes
}
TQString ocradDialog::ocrEngineLogo() const
{
return "ocrad.png";
}
TQString ocradDialog::ocrEngineName() const
{
return i18n("ocrad" );
}
TQString ocradDialog::ocrEngineDesc() const
{
return i18n("ocrad is a Free Software project "
"for optical character recognition.<p>"
"The author of ocrad is <b>Antonio Diaz</b><br>"
"For more information about ocrad see "
"<A HREF=\"http://www.gnu.org/software/ocrad/ocrad.html\">"
"http://www.gnu.org/software/ocrad/ocrad.html</A><p>"
"Images should be scanned in black/white mode for ocrad.<br>"
"Best results are achieved if the characters are at least 20 pixels high.<p>"
"Problems arise, as usual, with very bold or very light or broken characters, "
"the same with merged character groups.");
}
int ocradDialog::layoutDetectionMode() const
{
return m_layoutMode->currentItem();
}
EngineError ocradDialog::setupGui()
{
KOCRBase::setupGui();
TQVBox *page = ocrPage();
Q_CHECK_PTR( page );
KConfig *conf = KGlobal::config ();
conf->setGroup( CFG_GROUP_OCR_DIA );
//Qt::Horizontal line
// (void) new KSeparator( KSeparator::HLine, page);
// Entry-Field.
TQString res = conf->readPathEntry( CFG_OCRAD_BINARY, "notFound" );
if( res == "notFound" )
{
res = KookaPreferences::tryFindBinary("ocrad", CFG_OCRAD_BINARY);
if( res.isEmpty() )
{
/* Popup here telling that the config needs to be called */
KMessageBox::sorry( this, i18n( "The path to the ocrad binary is not configured yet.\n"
"Please go to the Kooka configuration and enter the path manually."),
i18n("OCR Software Not Found") );
}
}
if( res.isEmpty() )
res = i18n("Not found");
else
m_ocrCmd = res;
/** layout detection button **/
conf->setGroup( CFG_GROUP_OCRAD );
int layoutDetect = conf->readNumEntry( CFG_OCRAD_LAYOUT_DETECTION, 0 );
kdDebug(28000) << "Layout detection from config: " << layoutDetect << endl;
(void) new KSeparator( KSeparator::HLine, page);
TQHBox *hb1 = new TQHBox(page);
hb1->setSpacing( KDialog::spacingHint() );
(void) new TQLabel( i18n("OCRAD layout analysis mode: "), hb1);
m_layoutMode = new TQComboBox(hb1);
m_layoutMode->insertItem(i18n("No Layout Detection"), 0 );
m_layoutMode->insertItem(i18n("Column Detection"), 1 );
m_layoutMode->insertItem(i18n("Full Layout Detection"), 2);
m_layoutMode->setCurrentItem(layoutDetect);
/** stating the ocrad binary **/
(void) new KSeparator( KSeparator::HLine, page);
TQHBox *hb = new TQHBox(page);
hb->setSpacing( KDialog::spacingHint());
m_binaryLabel = new TQLabel( i18n("Using ocrad binary: ") + res, hb );
// retrieve Program version and display
version(res);
getAnimation(hb);
/* This is for a 'work-in-progress'-Animation */
return ENG_OK;
}
void ocradDialog::introduceImage( KookaImage *img )
{
if( !img ) return;
KOCRBase::introduceImage( img );
}
ocradDialog::~ocradDialog()
{
if( m_proc )
delete m_proc;
}
void ocradDialog::writeConfig( void )
{
KConfig *conf = KGlobal::config ();
conf->setGroup( CFG_GROUP_OCR_DIA );
conf->writeEntry( CFG_OCRAD_BINARY, TQString(getOCRCmd()));
conf->setGroup( CFG_GROUP_OCRAD );
conf->writeEntry( CFG_OCRAD_LAYOUT_DETECTION, m_layoutMode->currentItem());
}
void ocradDialog::enableFields(bool )
{
kdDebug(28000) << "About to disable the entry fields" << endl;
}
/* Later: Allow interactive loading of orf files
* for now, return emty string
*/
TQString ocradDialog::orfUrl() const
{
if( m_orfUrlRequester )
return m_orfUrlRequester->url();
else
return TQString();
}
void ocradDialog::version( const TQString& exe )
{
if( m_proc ) delete m_proc;
m_proc = new KProcess;
kdDebug(28000) << "Using " << exe << " as command" << endl;
*m_proc << exe;
*m_proc << TQString("-V");
connect( m_proc, TQT_SIGNAL(receivedStdout(KProcess *, char *, int )),
this, TQT_SLOT(slReceiveStdIn(KProcess *, char *, int )));
if( ! m_proc->start( KProcess::NotifyOnExit, KProcess::Stdout ) )
{
slReceiveStdIn( 0, (char*) "unknown", 7 );
}
}
void ocradDialog::slReceiveStdIn( KProcess*, char *buffer, int buflen)
{
TQString vstr = TQString::fromUtf8(buffer, buflen);
kdDebug(28000) << "Got input: "<< buffer << endl;
TQRegExp rx;
rx.setPattern("GNU Ocrad version ([\\d\\.]+)");
if( rx.search( vstr ) > -1 )
{
TQString vStr = rx.cap(1);
vStr.remove(0,2);
m_version = vStr.toInt();
TQString v = i18n("Version: ") + rx.cap(1);
if( m_binaryLabel )
{
m_binaryLabel->setText(m_binaryLabel->text() + "\n" + v );
m_binaryLabel->update();
}
}
}
/*
* returns the numeric version of the ocrad program. It is queried in the slot
* slReceiveStdIn, which parses the output of the ocrad -V call.
*
* Attention: This method returns 10 for ocrad v. 0.10 and 8 for ocrad-0.8
*/
int ocradDialog::getNumVersion()
{
return m_version;
}
#include "kocrocrad.moc"
/* The End ;) */