kdeui Library API Documentation

keditcl2.cpp

00001 /* This file is part of the KDE libraries
00002 
00003    Copyright (C) 1997 Bernd Johannes Wuebben <wuebben@math.cornell.edu>
00004    Copyright (C) 2000 Waldo Bastian <bastian@kde.org>
00005 
00006    This library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Library General Public
00008    License as published by the Free Software Foundation; either
00009    version 2 of the License, or (at your option) any later version.
00010 
00011    This library is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Library General Public License for more details.
00015 
00016    You should have received a copy of the GNU Library General Public License
00017    along with this library; see the file COPYING.LIB.  If not, write to
00018    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00019    Boston, MA 02111-1307, USA.
00020 */
00021 
00022 #include <limits.h> // INT_MAX
00023 
00024 #include <qframe.h>
00025 #include <qlabel.h>
00026 #include <qlayout.h>
00027 #include <qlineedit.h>
00028 #include <qvbuttongroup.h>
00029 #include <qcheckbox.h>
00030 #include <qlayout.h>
00031 #include <qpushbutton.h>
00032 #include <qhbox.h>
00033 
00034 #include <kapplication.h>
00035 #include <kcombobox.h>
00036 #include <knuminput.h>
00037 #include <kmessagebox.h>
00038 #include <knotifyclient.h>
00039 #include <klocale.h>
00040 #include <kdebug.h>
00041 
00042 #include "keditcl.h"
00043 
00044 
00046 //
00047 // Find Methods
00048 //
00049 
00050 void KEdit::search(){
00051 
00052   if( replace_dialog != 0 && replace_dialog->isVisible() == true )
00053   {
00054     replace_dialog->hide();
00055   }
00056 
00057   if( srchdialog == 0 )
00058   {
00059     srchdialog = new KEdFind( this, "searchdialog", false);
00060     connect(srchdialog,SIGNAL(search()),this,SLOT(search_slot()));
00061     connect(srchdialog,SIGNAL(done()),this,SLOT(searchdone_slot()));
00062   }
00063 
00064   // If we already searched / replaced something before make sure it shows
00065   // up in the find dialog line-edit.
00066 
00067   QString string;
00068   string = srchdialog->getText();
00069   srchdialog->setText(string.isEmpty() ? pattern : string);
00070 
00071   deselect();
00072   last_search = NONE;
00073 
00074   srchdialog->show();
00075   srchdialog->result();
00076 }
00077 
00078 
00079 void KEdit::search_slot(){
00080 
00081   int line, col;
00082 
00083   if (!srchdialog)
00084     return;
00085 
00086   QString to_find_string = srchdialog->getText();
00087   getCursorPosition(&line,&col);
00088 
00089   // srchdialog->get_direction() is true if searching backward
00090 
00091   if (last_search != NONE && srchdialog->get_direction()){
00092     col = col  - pattern.length() - 1 ;
00093   }
00094 
00095 again:
00096   int  result = doSearch(to_find_string, srchdialog->case_sensitive(),
00097              FALSE, (!srchdialog->get_direction()),line,col);
00098 
00099   if(result == 0){
00100     if(!srchdialog->get_direction()){ // forward search
00101 
00102       int query = KMessageBox::questionYesNo(
00103             srchdialog,
00104                         i18n("End of document reached.\n"\
00105                              "Continue from the beginning?"),
00106                         i18n("Find"));
00107       if (query == KMessageBox::Yes){
00108     line = 0;
00109     col = 0;
00110     goto again;
00111       }
00112     }
00113     else{ //backward search
00114 
00115       int query = KMessageBox::questionYesNo(
00116             srchdialog,
00117                         i18n("Beginning of document reached.\n"\
00118                              "Continue from the end?"),
00119                         i18n("Find"));
00120       if (query == KMessageBox::Yes){
00121     QString string = textLine( numLines() - 1 );
00122     line = numLines() - 1;
00123     col  = string.length();
00124     last_search = BACKWARD;
00125     goto again;
00126       }
00127     }
00128   }
00129   else{
00130     emit CursorPositionChanged();
00131   }
00132 }
00133 
00134 
00135 
00136 void KEdit::searchdone_slot(){
00137 
00138   if (!srchdialog)
00139     return;
00140 
00141   srchdialog->hide();
00142   setFocus();
00143   last_search = NONE;
00144 }
00145 
00146 int KEdit::doSearch(QString s_pattern, bool case_sensitive,
00147             bool wildcard, bool forward, int line, int col){
00148 
00149   (void) wildcard; // reserved for possible extension to regex
00150 
00151 
00152   int i, length;
00153   int pos = -1;
00154 
00155   if(forward){
00156 
00157     QString string;
00158 
00159     for(i = line; i < numLines(); i++) {
00160 
00161       string = textLine(i);
00162 
00163       pos = string.find(s_pattern, i == line ? col : 0, case_sensitive);
00164 
00165       if( pos != -1){
00166 
00167     length = s_pattern.length();
00168 
00169     setCursorPosition(i,pos,FALSE);
00170 
00171     for(int l = 0 ; l < length; l++){
00172       cursorRight(TRUE);
00173     }
00174 
00175     setCursorPosition( i , pos + length, TRUE );
00176     pattern = s_pattern;
00177     last_search = FORWARD;
00178 
00179     return 1;
00180       }
00181     }
00182   }
00183   else{ // searching backwards
00184 
00185     QString string;
00186 
00187     for(i = line; i >= 0; i--) {
00188 
00189       string = textLine(i);
00190       int line_length = string.length();
00191 
00192       pos = string.findRev(s_pattern, line == i ? col : line_length , case_sensitive);
00193 
00194       if (pos != -1){
00195 
00196     length = s_pattern.length();
00197 
00198     if( ! (line == i && pos > col ) ){
00199 
00200       setCursorPosition(i ,pos ,FALSE );
00201 
00202       for(int l = 0 ; l < length; l++){
00203         cursorRight(TRUE);
00204       }
00205 
00206       setCursorPosition(i ,pos + length ,TRUE );
00207       pattern = s_pattern;
00208       last_search = BACKWARD;
00209       return 1;
00210 
00211     }
00212       }
00213 
00214     }
00215   }
00216 
00217   return 0;
00218 
00219 }
00220 
00221 
00222 
00223 bool KEdit::repeatSearch() {
00224 
00225   if(!srchdialog || pattern.isEmpty())
00226   {
00227       search();
00228       return true;
00229   }
00230 
00231   search_slot();
00232 
00233   setFocus();
00234   return true;
00235 
00236 }
00237 
00238 
00240 //
00241 // Replace Methods
00242 //
00243 
00244 
00245 void KEdit::replace()
00246 {
00247   if( srchdialog != 0 && srchdialog->isVisible() == true)
00248   {
00249     srchdialog->hide();
00250   }
00251 
00252   if( replace_dialog == 0 )
00253   {
00254     replace_dialog = new KEdReplace( this, "replace_dialog", false );
00255     connect(replace_dialog,SIGNAL(find()),this,SLOT(replace_search_slot()));
00256     connect(replace_dialog,SIGNAL(replace()),this,SLOT(replace_slot()));
00257     connect(replace_dialog,SIGNAL(replaceAll()),this,SLOT(replace_all_slot()));
00258     connect(replace_dialog,SIGNAL(done()),this,SLOT(replacedone_slot()));
00259   }
00260 
00261   QString string = replace_dialog->getText();
00262   replace_dialog->setText(string.isEmpty() ? pattern : string);
00263 
00264 
00265   deselect();
00266   last_replace = NONE;
00267 
00268   replace_dialog->show();
00269   replace_dialog->result();
00270 }
00271 
00272 
00273 void KEdit::replace_slot(){
00274 
00275   if (!replace_dialog)
00276     return;
00277 
00278   if(!can_replace){
00279     KNotifyClient::beep();
00280     return;
00281   }
00282 
00283   int line,col, length;
00284 
00285   QString string = replace_dialog->getReplaceText();
00286   length = string.length();
00287 
00288   this->cut();
00289 
00290   getCursorPosition(&line,&col);
00291 
00292   insertAt(string,line,col);
00293   setModified(true);
00294   can_replace = FALSE;
00295 
00296   if (replace_dialog->get_direction())
00297   {
00298     // Backward
00299     setCursorPosition(line,col+length);
00300     for( int k = 0; k < length; k++){
00301       cursorLeft(TRUE);
00302     }
00303   }
00304   else
00305   {
00306     // Forward
00307     setCursorPosition(line,col);
00308     for( int k = 0; k < length; k++){
00309       cursorRight(TRUE);
00310     }
00311   }
00312 }
00313 
00314 void KEdit::replace_all_slot(){
00315 
00316   if (!replace_dialog)
00317     return;
00318 
00319   QString to_find_string = replace_dialog->getText();
00320 
00321   int lineFrom, lineTo, colFrom, colTo;
00322   getSelection(&lineFrom, &colFrom, &lineTo, &colTo);
00323 
00324   // replace_dialog->get_direction() is true if searching backward
00325   if (replace_dialog->get_direction())
00326   {
00327     if (colTo != -1)
00328     {
00329       replace_all_col = colTo - to_find_string.length();
00330       replace_all_line = lineTo;
00331     }
00332     else
00333     {
00334       getCursorPosition(&replace_all_line,&replace_all_col);
00335       replace_all_col--;
00336     }
00337   }
00338   else
00339   {
00340     if (colFrom != -1)
00341     {
00342       replace_all_col = colFrom;
00343       replace_all_line = lineFrom;
00344     }
00345     else
00346     {
00347       getCursorPosition(&replace_all_line,&replace_all_col);
00348     }
00349   }
00350 
00351   deselect();
00352 
00353 again:
00354 
00355   setAutoUpdate(FALSE);
00356   int result = 1;
00357 
00358   while(result){
00359 
00360     result = doReplace(to_find_string, replace_dialog->case_sensitive(),
00361                FALSE, (!replace_dialog->get_direction()),
00362                replace_all_line,replace_all_col,TRUE);
00363 
00364   }
00365 
00366   setAutoUpdate(TRUE);
00367   update();
00368 
00369   if(!replace_dialog->get_direction()){ // forward search
00370 
00371     int query = KMessageBox::questionYesNo(
00372             srchdialog,
00373                         i18n("End of document reached.\n"\
00374                              "Continue from the beginning?"),
00375                         i18n("Find"));
00376     if (query == KMessageBox::Yes){
00377       replace_all_line = 0;
00378       replace_all_col = 0;
00379       goto again;
00380     }
00381   }
00382   else{ //backward search
00383 
00384     int query = KMessageBox::questionYesNo(
00385             srchdialog,
00386                         i18n("Beginning of document reached.\n"\
00387                              "Continue from the end?"),
00388                         i18n("Find"));
00389     if (query == KMessageBox::Yes){
00390       QString string = textLine( numLines() - 1 );
00391       replace_all_line = numLines() - 1;
00392       replace_all_col  = string.length();
00393       last_replace = BACKWARD;
00394       goto again;
00395     }
00396   }
00397 
00398   emit CursorPositionChanged();
00399 
00400 }
00401 
00402 
00403 void KEdit::replace_search_slot(){
00404 
00405   int line, col;
00406 
00407   if (!replace_dialog)
00408     return;
00409 
00410   QString to_find_string = replace_dialog->getText();
00411 
00412   int lineFrom, lineTo, colFrom, colTo;
00413   getSelection(&lineFrom, &colFrom, &lineTo, &colTo);
00414 
00415   // replace_dialog->get_direction() is true if searching backward
00416   if (replace_dialog->get_direction())
00417   {
00418     if (colFrom != -1)
00419     {
00420       col = colFrom - to_find_string.length();
00421       line = lineFrom;
00422     }
00423     else
00424     {
00425       getCursorPosition(&line,&col);
00426       col--;
00427     }
00428   }
00429   else
00430   {
00431     if (colTo != -1)
00432     {
00433       col = colTo;
00434       line = lineTo;
00435     }
00436     else
00437     {
00438       getCursorPosition(&line,&col);
00439     }
00440   }
00441 
00442 again:
00443 
00444   int  result = doReplace(to_find_string, replace_dialog->case_sensitive(),
00445              FALSE, (!replace_dialog->get_direction()), line, col, FALSE );
00446 
00447   if(result == 0){
00448     if(!replace_dialog->get_direction()){ // forward search
00449 
00450      int query = KMessageBox::questionYesNo(
00451             replace_dialog,
00452                         i18n("End of document reached.\n"\
00453                              "Continue from the beginning?"),
00454                         i18n("Replace"));
00455      if (query == KMessageBox::Yes){
00456     line = 0;
00457     col = 0;
00458     goto again;
00459       }
00460     }
00461     else{ //backward search
00462 
00463      int query = KMessageBox::questionYesNo(
00464             replace_dialog,
00465                         i18n("Beginning of document reached.\n"\
00466                              "Continue from the end?"),
00467                         i18n("Replace"));
00468       if (query == KMessageBox::Yes){
00469     QString string = textLine( numLines() - 1 );
00470     line = numLines() - 1;
00471     col  = string.length();
00472     last_replace = BACKWARD;
00473     goto again;
00474       }
00475     }
00476   }
00477   else{
00478 
00479     emit CursorPositionChanged();
00480   }
00481 }
00482 
00483 
00484 
00485 void KEdit::replacedone_slot(){
00486 
00487   if (!replace_dialog)
00488     return;
00489 
00490   replace_dialog->hide();
00491   //  replace_dialog->clearFocus();
00492 
00493   setFocus();
00494 
00495   last_replace = NONE;
00496   can_replace  = FALSE;
00497 
00498 }
00499 
00500 
00501 
00502 int KEdit::doReplace(QString s_pattern, bool case_sensitive,
00503        bool wildcard, bool forward, int line, int col, bool replace_all){
00504 
00505 
00506   (void) wildcard; // reserved for possible extension to regex
00507 
00508   int line_counter, length;
00509   int pos = -1;
00510 
00511   QString string;
00512   QString stringnew;
00513   QString replacement;
00514 
00515   replacement = replace_dialog->getReplaceText();
00516   line_counter = line;
00517   replace_all_col = col;
00518 
00519   if(forward){
00520 
00521     int num_lines = numLines();
00522 
00523     while (line_counter < num_lines){
00524 
00525       string = textLine(line_counter);
00526 
00527       if (replace_all){
00528     pos = string.find(s_pattern, replace_all_col, case_sensitive);
00529       }
00530       else{
00531     pos = string.find(s_pattern, line_counter == line ? col : 0, case_sensitive);
00532       }
00533 
00534       if (pos == -1 ){
00535     line_counter++;
00536     replace_all_col = 0;
00537     replace_all_line = line_counter;
00538       }
00539 
00540       if( pos != -1){
00541 
00542     length = s_pattern.length();
00543 
00544     if(replace_all){ // automatic
00545 
00546       stringnew = string.copy();
00547       stringnew.replace(pos,length,replacement);
00548 
00549       removeLine(line_counter);
00550       insertLine(stringnew,line_counter);
00551 
00552       replace_all_col = pos + replacement.length();
00553       replace_all_line = line_counter;
00554 
00555       setModified(true);
00556     }
00557     else{ // interactive
00558 
00559       setCursorPosition( line_counter , pos, FALSE );
00560 
00561       for(int l = 0 ; l < length; l++){
00562         cursorRight(TRUE);
00563       }
00564 
00565       setCursorPosition( line_counter , pos + length, TRUE );
00566       pattern = s_pattern;
00567       last_replace = FORWARD;
00568       can_replace = TRUE;
00569 
00570       return 1;
00571 
00572     }
00573 
00574       }
00575     }
00576   }
00577   else{ // searching backwards
00578 
00579     while(line_counter >= 0){
00580 
00581       string = textLine(line_counter);
00582 
00583       int line_length = string.length();
00584 
00585       if( replace_all ){
00586         if (replace_all_col < 0)
00587           pos = -1;
00588         else
00589           pos = string.findRev(s_pattern, replace_all_col , case_sensitive);
00590       }
00591       else{
00592         if ((line == line_counter) && (col < 0))
00593           pos = -1;
00594         else 
00595           pos = string.findRev(s_pattern,
00596                line == line_counter ? col : line_length , case_sensitive);
00597       }
00598 
00599       if (pos == -1 ){
00600     line_counter--;
00601 
00602         replace_all_col = 0;
00603     if(line_counter >= 0){
00604       string = textLine(line_counter);
00605       replace_all_col = string.length();
00606 
00607     }
00608     replace_all_line = line_counter;
00609       }
00610 
00611 
00612       if (pos != -1){
00613     length = s_pattern.length();
00614 
00615     if(replace_all){ // automatic
00616 
00617       stringnew = string.copy();
00618       stringnew.replace(pos,length,replacement);
00619 
00620       removeLine(line_counter);
00621       insertLine(stringnew,line_counter);
00622 
00623       replace_all_col = pos-length;
00624       replace_all_line = line_counter;
00625       if (replace_all_col < 0)
00626       {
00627              line_counter--;
00628 
00629              if(line_counter >= 0){
00630                 string = textLine(line_counter);
00631                 replace_all_col = string.length();
00632              }
00633              replace_all_line = line_counter;
00634       }
00635 
00636       setModified(true);
00637     }
00638     else{ // interactive
00639 
00640       //      printf("line_counter %d pos %d col %d\n",line_counter, pos,col);
00641       if( ! (line == line_counter && pos > col ) ){
00642 
00643         setCursorPosition(line_counter, pos + length ,FALSE );
00644 
00645         for(int l = 0 ; l < length; l++){
00646           cursorLeft(TRUE);
00647         }
00648 
00649         setCursorPosition(line_counter, pos ,TRUE );
00650         pattern = s_pattern;
00651 
00652         last_replace = BACKWARD;
00653         can_replace = TRUE;
00654 
00655         return 1;
00656       }
00657     }
00658       }
00659     }
00660   }
00661 
00662   return 0;
00663 
00664 }
00665 
00666 
00667 
00668 
00669 
00671 //
00672 // Find Dialog
00673 //
00674 
00675 class KEdFind::KEdFindPrivate
00676 {
00677 public:
00678     KEdFindPrivate( QWidget *parent ) {
00679     combo = new KHistoryCombo( parent, "value" );
00680     combo->setMaxCount( 20 ); // just some default
00681     }
00682     ~KEdFindPrivate() {
00683     delete combo;
00684     }
00685 
00686     KHistoryCombo *combo;
00687 };
00688 
00689 
00690 KEdFind::KEdFind( QWidget *parent, const char *name, bool modal )
00691   :KDialogBase( parent, name, modal, i18n("Find"),
00692         modal ? User1|Cancel : User1|Close, User1, false, i18n("&Find") )
00693 {
00694   setWFlags( WType_TopLevel );
00695 
00696   QWidget *page = new QWidget( this );
00697   setMainWidget(page);
00698   QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
00699 
00700   d = new KEdFindPrivate( page );
00701 
00702   QString text = i18n("Find:");
00703   QLabel *label = new QLabel( text, page , "find" );
00704   topLayout->addWidget( label );
00705 
00706   d->combo->setMinimumWidth(fontMetrics().maxWidth()*20);
00707   d->combo->setFocus();
00708 
00709   connect(d->combo, SIGNAL(textChanged ( const QString & )),
00710           this,SLOT(textSearchChanged ( const QString & )));
00711 
00712   topLayout->addWidget(d->combo);
00713 
00714   group = new QVButtonGroup( i18n("Options"), page );
00715   topLayout->addWidget( group );
00716 
00717   QHBox* row1 = new QHBox( group );
00718   
00719   text = i18n("Case &sensitive");
00720   sensitive = new QCheckBox( text, row1, "case");
00721   text = i18n("Find &backwards");
00722   direction = new QCheckBox( text, row1, "direction" );
00723 
00724   
00725   enableButton( KDialogBase::User1, !d->combo->currentText().isEmpty() );
00726 
00727   if ( !modal )
00728     connect( this, SIGNAL( closeClicked() ), this, SLOT( slotCancel() ) );
00729 }
00730 
00731 KEdFind::~KEdFind()
00732 {
00733     delete d;
00734 }
00735 
00736 void KEdFind::textSearchChanged ( const QString &text )
00737 {
00738    enableButton( KDialogBase::User1, !text.isEmpty() );
00739 }
00740 
00741 void KEdFind::slotCancel( void )
00742 {
00743   emit done();
00744   KDialogBase::slotCancel();
00745 }
00746 
00747 void KEdFind::slotUser1( void )
00748 {
00749   if( !d->combo->currentText().isEmpty() )
00750   {
00751     d->combo->addToHistory( d->combo->currentText() );
00752     emit search();
00753   }
00754 }
00755 
00756 
00757 QString KEdFind::getText() const
00758 {
00759     return d->combo->currentText();
00760 }
00761 
00762 
00763 void KEdFind::setText(QString string)
00764 {
00765   d->combo->setEditText(string);
00766   d->combo->lineEdit()->selectAll();
00767 }
00768 
00769 void KEdFind::setCaseSensitive( bool b )
00770 {
00771   sensitive->setChecked( b );
00772 }
00773 
00774 bool KEdFind::case_sensitive() const
00775 {
00776   return sensitive->isChecked();
00777 }
00778 
00779 void KEdFind::setDirection( bool b )
00780 {
00781   direction->setChecked( b );
00782 }
00783 
00784 bool KEdFind::get_direction() const
00785 {
00786   return direction->isChecked();
00787 }
00788 
00789 KHistoryCombo * KEdFind::searchCombo() const
00790 {
00791     return d->combo;
00792 }
00793 
00794 
00795 
00797 //
00798 //  Replace Dialog
00799 //
00800 
00801 class KEdReplace::KEdReplacePrivate
00802 {
00803 public:
00804     KEdReplacePrivate( QWidget *parent ) {
00805     searchCombo = new KHistoryCombo( parent, "value" );
00806     replaceCombo = new KHistoryCombo( parent, "replace_value" );
00807 
00808     searchCombo->setMaxCount( 20 ); // just some defaults
00809     replaceCombo->setMaxCount( 20 );
00810     }
00811     ~KEdReplacePrivate() {
00812     delete searchCombo;
00813     delete replaceCombo;
00814     }
00815 
00816     KHistoryCombo *searchCombo, *replaceCombo;
00817 };
00818 
00819 KEdReplace::KEdReplace( QWidget *parent, const char *name, bool modal )
00820   :KDialogBase( parent, name, modal, i18n("Replace"),
00821         modal ? User3|User2|User1|Cancel : User3|User2|User1|Close,
00822                 User3, false,
00823         i18n("Replace &All"), i18n("&Replace"), i18n("&Find") )
00824 {
00825   setWFlags( WType_TopLevel );
00826 
00827   setButtonBoxOrientation( Vertical );
00828 
00829   QFrame *page = makeMainWidget();
00830   QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
00831 
00832   d = new KEdReplacePrivate( page );
00833 
00834   QString text = i18n("Find:");
00835   QLabel *label = new QLabel( text, page, "find" );
00836   topLayout->addWidget( label );
00837 
00838   d->searchCombo->setMinimumWidth(fontMetrics().maxWidth()*20);
00839   d->searchCombo->setFocus();
00840   topLayout->addWidget(d->searchCombo);
00841 
00842   text = i18n("Replace with:");
00843   label = new QLabel( text, page, "replace" );
00844   topLayout->addWidget( label );
00845 
00846   d->replaceCombo->setMinimumWidth(fontMetrics().maxWidth()*20);
00847   topLayout->addWidget(d->replaceCombo);
00848 
00849   connect(d->searchCombo, SIGNAL(textChanged ( const QString & )),
00850           this,SLOT(textSearchChanged ( const QString & )));
00851 
00852   QButtonGroup *group = new QButtonGroup( i18n("Options"), page );
00853   topLayout->addWidget( group );
00854 
00855   QGridLayout *gbox = new QGridLayout( group, 3, 2, spacingHint() );
00856   gbox->addRowSpacing( 0, fontMetrics().lineSpacing() );
00857 
00858   text = i18n("Case &sensitive");
00859   sensitive = new QCheckBox( text, group, "case");
00860   text = i18n("Find &backwards");
00861   direction = new QCheckBox( text, group, "direction" );
00862   gbox->addWidget( sensitive, 1, 0 );
00863   gbox->addWidget( direction, 1, 1 );
00864   gbox->setRowStretch( 2, 10 );
00865 }
00866 
00867 
00868 KEdReplace::~KEdReplace()
00869 {
00870     delete d;
00871 }
00872 
00873 void KEdReplace::textSearchChanged ( const QString &text )
00874 {
00875     bool state=text.isEmpty();
00876     enableButton( KDialogBase::User1, !state );
00877     enableButton( KDialogBase::User2, !state );
00878     enableButton( KDialogBase::User3, !state );
00879 }
00880 
00881 void KEdReplace::slotCancel( void )
00882 {
00883   emit done();
00884   d->searchCombo->clearEdit();
00885   d->replaceCombo->clearEdit();
00886   KDialogBase::slotCancel();
00887 }
00888 
00889 void KEdReplace::slotClose( void )
00890 {
00891   slotCancel();
00892 }
00893 
00894 void KEdReplace::slotUser1( void )
00895 {
00896     if( !d->searchCombo->currentText().isEmpty() )
00897     {
00898         d->replaceCombo->addToHistory( d->replaceCombo->currentText() );
00899         emit replaceAll();
00900     }
00901 }
00902 
00903 
00904 void KEdReplace::slotUser2( void )
00905 {
00906     if( !d->searchCombo->currentText().isEmpty() )
00907     {
00908         d->replaceCombo->addToHistory( d->replaceCombo->currentText() );
00909         emit replace();
00910     }
00911 }
00912 
00913 void KEdReplace::slotUser3( void )
00914 {
00915   if( !d->searchCombo->currentText().isEmpty() )
00916   {
00917     d->searchCombo->addToHistory( d->searchCombo->currentText() );
00918     emit find();
00919   }
00920 }
00921 
00922 
00923 QString KEdReplace::getText()
00924 {
00925     return d->searchCombo->currentText();
00926 }
00927 
00928 
00929 QString KEdReplace::getReplaceText()
00930 {
00931     return d->replaceCombo->currentText();
00932 }
00933 
00934 
00935 void KEdReplace::setText(QString string)
00936 {
00937   d->searchCombo->setEditText(string);
00938   d->searchCombo->lineEdit()->selectAll();
00939 }
00940 
00941 
00942 bool KEdReplace::case_sensitive()
00943 {
00944   return sensitive->isChecked();
00945 }
00946 
00947 
00948 bool KEdReplace::get_direction()
00949 {
00950   return direction->isChecked();
00951 }
00952 
00953 KHistoryCombo * KEdReplace::searchCombo() const
00954 {
00955     return d->searchCombo;
00956 }
00957 
00958 KHistoryCombo * KEdReplace::replaceCombo() const
00959 {
00960     return d->replaceCombo;
00961 }
00962 
00963 
00964 KEdGotoLine::KEdGotoLine( QWidget *parent, const char *name, bool modal )
00965   :KDialogBase( parent, name, modal, i18n("Goto Line"), modal ? Ok|Cancel : Ok|Close, Ok, false )
00966 {
00967   QWidget *page = new QWidget( this );
00968   setMainWidget(page);
00969   QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
00970 
00971   lineNum = new KIntNumInput( 1, page);
00972   lineNum->setRange(1, 1000000, 1, false);
00973   lineNum->setLabel(i18n("Goto line:"), AlignVCenter | AlignLeft);
00974 //  lineNum->setMinimumWidth(fontMetrics().maxWidth()*20);
00975   topLayout->addWidget( lineNum );
00976 
00977   topLayout->addStretch(10);
00978   lineNum->setFocus();
00979 }
00980 
00981 
00982 void KEdGotoLine::selected(int)
00983 {
00984   accept();
00985 }
00986 
00987 
00988 int KEdGotoLine::getLineNumber()
00989 {
00990   return lineNum->value();
00991 }
00992 
00993 
00995 //
00996 // Spell Checking
00997 //
00998 
00999 void KEdit::spellcheck_start()
01000 {
01001    saved_readonlystate = isReadOnly();
01002    setReadOnly(true);
01003 }
01004 
01005 void KEdit::misspelling (const QString &word, const QStringList &, unsigned int pos)
01006 {
01007 
01008   unsigned int l = 0;
01009   unsigned int cnt = 0;
01010   posToRowCol (pos, l, cnt);
01011   setSelection(l, cnt, l, cnt+word.length());
01012 
01013   /*
01014   if (cursorPoint().y()>height()/2)
01015     kspell->moveDlg (10, height()/2-kspell->heightDlg()-15);
01016   else
01017     kspell->moveDlg (10, height()/2 + 15);
01018   */
01019 
01020 }
01021 
01022 //need to use pos for insert, not cur, so forget cur altogether
01023 void KEdit::corrected (const QString &originalword, const QString &newword, unsigned int pos)
01024 {
01025   //we'll reselect the original word in case the user has played with
01026   //the selection in eframe or the word was auto-replaced
01027 
01028   unsigned int l = 0;
01029   unsigned int cnt = 0;
01030 
01031   if( newword != originalword )
01032   {
01033     posToRowCol (pos, l, cnt);
01034     setSelection(l, cnt, l, cnt+originalword.length());
01035 
01036     setReadOnly ( false );
01037     removeSelectedText();
01038     insert(newword);
01039     setReadOnly ( true );
01040   }
01041   else 
01042   {
01043     deselect();
01044   }
01045 }
01046 
01047 void KEdit::posToRowCol(unsigned int pos, unsigned int &line, unsigned int &col)
01048 {
01049   for (line = 0; line < static_cast<uint>(numLines()) && col <= pos; line++)
01050   {
01051     col += lineLength(line)+1;
01052   }
01053   line--;
01054   col = pos - col + lineLength(line) + 1;
01055 }
01056 
01057 void KEdit::spellcheck_stop()
01058 {
01059   deselect();
01060 
01061   setReadOnly ( saved_readonlystate);
01062 }
01063 
01064 
01065 
KDE Logo
This file is part of the documentation for kdelibs Version 3.1.4.
Documentation copyright © 1996-2002 the KDE developers.
Generated on Sun Feb 27 22:15:03 2005 by doxygen 1.3.4 written by Dimitri van Heesch, © 1997-2001