| # kate Library API Documentation
Overview | Class Hierarchy | Classes | Classes (annotated) | Members | Namespaces | Source Files

# katedialogs.cpp

    00001 /* This file is part of the KDE libraries
    00002    Copyright (C) 2002, 2003 Anders Lund <anders.lund@lund.tdcadsl.dk>
    00003    Copyright (C) 2003 Christoph Cullmann <cullmann@kde.org>
    00004    Copyright (C) 2001 Joseph Wenninger <jowenn@kde.org>
    00005
    00006    Based on work of:
    00007      Copyright (C) 1999 Jochen Wilhelmy <digisnap@cs.tu-berlin.de>
    00008
    00009    This library is free software; you can redistribute it and/or
    00010    modify it under the terms of the GNU Library General Public
    00011    License version 2 as published by the Free Software Foundation.
    00012
    00013    This library is distributed in the hope that it will be useful,
    00014    but WITHOUT ANY WARRANTY; without even the implied warranty of
    00015    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    00016    Library General Public License for more details.
    00017
    00018    You should have received a copy of the GNU Library General Public License
    00019    along with this library; see the file COPYING.LIB.  If not, write to
    00020    the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    00021    Boston, MA 02111-1307, USA.
    00022 */
    00023
    00024 //BEGIN Includes
    00025 #include "katedialogs.h"
    00026 #include "katedialogs.moc"
    00027
    00028 #include "kateautoindent.h"
    00029 #include "katebuffer.h"
    00030 #include "kateconfig.h"
    00031 #include "katedocument.h"
    00032 #include "katefactory.h"
    00033 #include "kateschema.h"
    00034 #include "katesyntaxdocument.h"
    00035 #include "kateview.h"
    00036
    00037
    00038 #include <ktexteditor/configinterfaceextension.h>
    00039 #include <ktexteditor/plugin.h>
    00040
    00041 #include <kio/job.h>
    00042 #include <kio/jobclasses.h>
    00043 #include <kio/netaccess.h>
    00044
    00045 #include <kaccel.h>
    00046 #include <kapplication.h>
    00047 #include <kbuttonbox.h>
    00048 #include <kcharsets.h>
    00049 #include <kcolorbutton.h>
    00050 #include <kcolorcombo.h>
    00051 #include <kcolordialog.h>
    00052 #include <kcombobox.h>
    00053 #include <kconfig.h>
    00054 #include <kdebug.h>
    00055 #include <kfontdialog.h>
    00056 #include <kglobal.h>
    00057 #include <kglobalsettings.h>
    00058 #include <kiconloader.h>
    00059 #include <kkeybutton.h>
    00060 #include <kkeydialog.h>
    00061 #include <klineedit.h>
    00062 #include <klistview.h>
    00063 #include <klocale.h>
    00064 #include <kmessagebox.h>
    00065 #include <kmimetypechooser.h>
    00066 #include <knuminput.h>
    00067 #include <kparts/componentfactory.h>
    00068 #include <kpopupmenu.h>
    00069 #include <kprocess.h>
    00070 #include <kprocio.h>
    00071 #include <kregexpeditorinterface.h>
    00072 #include <krun.h>
    00073 #include <kspell.h>
    00074 #include <kstandarddirs.h>
    00075 #include <ktempfile.h>
    00076
    00077 #include <qbuttongroup.h>
    00078 #include <qcheckbox.h>
    00079 #include <qcombobox.h>
    00080 #include <qdialog.h>
    00081 #include <qdom.h>
    00082 #include <qfile.h>
    00083 #include <qgrid.h>
    00084 #include <qgroupbox.h>
    00085 #include <qhbox.h>
    00086 #include <qheader.h>
    00087 #include <qhgroupbox.h>
    00088 #include <qlabel.h>
    00089 #include <qlayout.h>
    00090 #include <qlineedit.h>
    00091 #include <qlistbox.h>
    00092 #include <qlistview.h>
    00093 #include <qmap.h>
    00094 #include <qobjectlist.h>
    00095 #include <qpainter.h>
    00096 #include <qpointarray.h>
    00097 #include <qptrcollection.h>
    00098 #include <qpushbutton.h>
    00099 #include <qradiobutton.h>
    00100 #include <qslider.h>
    00101 #include <qspinbox.h>
    00102 #include <qstringlist.h>
    00103 #include <qtabwidget.h>
    00104 #include <qtextcodec.h>
    00105 #include <qtoolbutton.h>
    00106 #include <qvbox.h>
    00107 #include <qvgroupbox.h>
    00108 #include <qwhatsthis.h>
    00109 #include <qwidgetstack.h>
    00110
    00111 // trailing slash is important
    00112 #define HLDOWNLOADPATH "http://www.kde.org/apps/kate/syntax/"
    00113
    00114 //END
    00115
    00116 //BEGIN KateConfigPage
    00117 KateConfigPage::KateConfigPage ( QWidget *parent, const char *name )
    00118   : Kate::ConfigPage (parent, name)
    00119   , m_changed (false)
    00120 {
    00121   connect (this, SIGNAL(changed()), this, SLOT(somethingHasChanged ()));
    00122 }
    00123
    00124 KateConfigPage::~KateConfigPage ()
    00125 {
    00126 }
    00127
    00128 void KateConfigPage::somethingHasChanged ()
    00129 {
    00130   m_changed = true;
    00131   kdDebug (13000) << "TEST: something changed on the config page: " << this << endl;
    00132 }
    00133 //END KateConfigPage
    00134
    00135 //BEGIN KateSpellConfigPage
    00136 KateSpellConfigPage::KateSpellConfigPage( QWidget* parent )
    00137   : KateConfigPage( parent)
    00138 {
    00139   QVBoxLayout* l = new QVBoxLayout( this );
    00140   cPage = new KSpellConfig( this, 0L, 0L, false );
    00141   l->addWidget( cPage );
    00142   connect( cPage, SIGNAL( configChanged() ), this, SLOT( slotChanged() ) );
    00143 }
    00144
    00145 void KateSpellConfigPage::apply ()
    00146 {
    00147   // nothing changed, no need to apply stuff
    00148   if (!changed())
    00149     return;
    00150
    00151   m_changed = false;
    00152   // kspell
    00153   cPage->writeGlobalSettings ();
    00154 }
    00155 //END KateSpellConfigPage
    00156
    00157 //BEGIN KateIndentConfigTab
    00158 const int KateIndentConfigTab::flags[] = {
    00159     KateDocument::cfSpaceIndent,
    00160     KateDocument::cfKeepIndentProfile,
    00161     KateDocument::cfKeepExtraSpaces,
    00162     KateDocument::cfTabIndents,
    00163     KateDocument::cfBackspaceIndents,
    00164     KateDocumentConfig::cfDoxygenAutoTyping,
    00165     KateDocumentConfig::cfMixedIndent
    00166 };
    00167
    00168 KateIndentConfigTab::KateIndentConfigTab(QWidget *parent)
    00169   : KateConfigPage(parent)
    00170 {
    00171   QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint() );
    00172   int configFlags = KateDocumentConfig::global()->configFlags();
    00173
    00174   QVGroupBox *gbAuto = new QVGroupBox(i18n("Automatic Indentation"), this);
    00175
    00176   QHBox *indentLayout = new QHBox(gbAuto);
    00177   QLabel *indentLabel = new QLabel(i18n("&Indentation mode:"), indentLayout);
    00178   m_indentMode = new KComboBox (indentLayout);
    00179   m_indentMode->insertStringList (KateAutoIndent::listModes());
    00180   indentLabel->setBuddy(m_indentMode);
    00181
    00182   opt[5] = new QCheckBox(i18n("Insert leading Doxygen \"*\" when typing"), gbAuto);
    00183
    00184   QVGroupBox *gbSpaces = new QVGroupBox(i18n("Indentation with Spaces"), this);
    00185   QVBox *spaceLayout = new QVBox(gbSpaces);
    00186   opt[0] = new QCheckBox(i18n("Use &spaces instead of tabs to indent"), spaceLayout );
    00187   opt[6] = new QCheckBox(i18n("Emacs style mixed mode"), spaceLayout);
    00188
    00189   indentationWidth = new KIntNumInput(KateDocumentConfig::global()->indentationWidth(), spaceLayout);
    00190   indentationWidth->setRange(1, 16, 1, false);
    00191   indentationWidth->setLabel(i18n("Number of spaces:"), AlignVCenter);
    00192
    00193   opt[1] = new QCheckBox(i18n("Keep indent &profile"), this);
    00194   opt[2] = new QCheckBox(i18n("&Keep extra spaces"), this);
    00195
    00196   QVGroupBox *keys = new QVGroupBox(i18n("Keys to Use"), this);
    00197   opt[3] = new QCheckBox(i18n("&Tab key indents"), keys);
    00198   opt[4] = new QCheckBox(i18n("&Backspace key indents"), keys);
    00199
    00200   QRadioButton *rb1, *rb2, *rb3;
    00201   m_tabs = new QButtonGroup( 1, Qt::Horizontal, i18n("Tab Key Mode if Nothing Selected"), this );
    00202   m_tabs->setRadioButtonExclusive( true );
    00203   m_tabs->insert( rb1=new QRadioButton( i18n("Insert indent &characters"), m_tabs ), 0 );
    00204   m_tabs->insert( rb2=new QRadioButton( i18n("I&nsert tab character"), m_tabs ), 1 );
    00205   m_tabs->insert( rb3=new QRadioButton( i18n("Indent current &line"), m_tabs ), 2 );
    00206
    00207   opt[0]->setChecked(configFlags & flags[0]);
    00208   opt[1]->setChecked(configFlags & flags[1]);
    00209   opt[2]->setChecked(configFlags & flags[2]);
    00210   opt[3]->setChecked(configFlags & flags[3]);
    00211   opt[4]->setChecked(configFlags & flags[4]);
    00212   opt[5]->setChecked(configFlags & flags[5]);
    00213   opt[6]->setChecked(configFlags & flags[6]);
    00214
    00215   layout->addWidget(gbAuto);
    00216   layout->addWidget(gbSpaces);
    00217   layout->addWidget(opt[1]);
    00218   layout->addWidget(opt[2]);
    00219   layout->addWidget(keys);
    00220   layout->addWidget(m_tabs, 0);
    00221
    00222   layout->addStretch();
    00223
    00224   // What is this? help
    00225   QWhatsThis::add(opt[0], i18n(
    00226         "Check this if you want to indent with spaces rather than tabs."));
    00227   QWhatsThis::add(opt[2], i18n(
    00228         "Indentations of more than the selected number of spaces will not be "
    00229         "shortened."));
    00230   QWhatsThis::add(opt[3], i18n(
    00231         "This allows the <b>Tab</b> key to be used to increase the indentation "
    00232         "level."));
    00233   QWhatsThis::add(opt[4], i18n(
    00234         "This allows the <b>Backspace</b> key to be used to decrease the "
    00235         "indentation level."));
    00236   QWhatsThis::add(opt[5], i18n(
    00237         "Automatically inserts a leading \"*\" while typing within a Doxygen "
    00238         "style comment."));
    00239   QWhatsThis::add( opt[6], i18n(
    00240       "Use a mix of tab and space characters for indentation.") );
    00241   QWhatsThis::add(indentationWidth, i18n("The number of spaces to indent with."));
    00242
    00243   reload ();
    00244
    00245   //
    00246   // after initial reload, connect the stuff for the changed () signal
    00247   //
    00248
    00249   connect(m_indentMode, SIGNAL(activated(int)), this, SLOT(slotChanged()));
    00250   connect(m_indentMode, SIGNAL(activated(int)), this, SLOT(indenterSelected(int)));
    00251
    00252   connect( opt[0], SIGNAL(toggled(bool)), this, SLOT(somethingToggled()));
    00253
    00254   connect( opt[0], SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00255   connect( opt[1], SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00256   connect( opt[2], SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00257   connect( opt[3], SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00258   connect( opt[4], SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00259   connect( opt[5], SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00260   connect( opt[6], SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00261
    00262   connect(indentationWidth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
    00263
    00264   connect(rb1, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00265   connect(rb2, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00266   connect(rb3, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00267 }
    00268
    00269 void KateIndentConfigTab::somethingToggled() {
    00270   indentationWidth->setEnabled(opt[0]->isChecked());
    00271   opt[6]->setEnabled(opt[0]->isChecked());
    00272 }
    00273
    00274 void KateIndentConfigTab::indenterSelected (int index)
    00275 {
    00276   if (index == KateDocumentConfig::imCStyle || index == KateDocumentConfig::imCSAndS)
    00277     opt[5]->setEnabled(true);
    00278   else
    00279     opt[5]->setEnabled(false);
    00280 }
    00281
    00282 void KateIndentConfigTab::apply ()
    00283 {
    00284   // nothing changed, no need to apply stuff
    00285   if (!changed())
    00286     return;
    00287   m_changed = false;
    00288
    00289   KateDocumentConfig::global()->configStart ();
    00290
    00291   int configFlags, z;
    00292
    00293   configFlags = KateDocumentConfig::global()->configFlags();
    00294   for (z = 0; z < numFlags; z++) {
    00295     configFlags &= ~flags[z];
    00296     if (opt[z]->isChecked()) configFlags |= flags[z];
    00297   }
    00298
    00299   KateDocumentConfig::global()->setConfigFlags(configFlags);
    00300   KateDocumentConfig::global()->setIndentationWidth(indentationWidth->value());
    00301
    00302   KateDocumentConfig::global()->setIndentationMode(m_indentMode->currentItem());
    00303
    00304   KateDocumentConfig::global()->setConfigFlags (KateDocumentConfig::cfTabIndentsMode, 2 == m_tabs->id (m_tabs->selected()));
    00305   KateDocumentConfig::global()->setConfigFlags (KateDocumentConfig::cfTabInsertsTab, 1 == m_tabs->id (m_tabs->selected()));
    00306
    00307   KateDocumentConfig::global()->configEnd ();
    00308 }
    00309
    00310 void KateIndentConfigTab::reload ()
    00311 {
    00312   if (KateDocumentConfig::global()->configFlags() & KateDocumentConfig::cfTabIndentsMode)
    00313     m_tabs->setButton (2);
    00314   else if (KateDocumentConfig::global()->configFlags() & KateDocumentConfig::cfTabInsertsTab)
    00315     m_tabs->setButton (1);
    00316   else
    00317     m_tabs->setButton (0);
    00318
    00319   m_indentMode->setCurrentItem (KateDocumentConfig::global()->indentationMode());
    00320
    00321   somethingToggled ();
    00322   indenterSelected (m_indentMode->currentItem());
    00323 }
    00324 //END KateIndentConfigTab
    00325
    00326 //BEGIN KateSelectConfigTab
    00327 KateSelectConfigTab::KateSelectConfigTab(QWidget *parent)
    00328   : KateConfigPage(parent)
    00329 {
    00330   QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint() );
    00331
    00332   QRadioButton *rb1, *rb2;
    00333
    00334   m_tabs = new QButtonGroup( 1, Qt::Horizontal, i18n("Selection Mode"), this );
    00335   layout->add (m_tabs);
    00336
    00337   m_tabs->setRadioButtonExclusive( true );
    00338   m_tabs->insert( rb1=new QRadioButton( i18n("&Normal"), m_tabs ), 0 );
    00339   m_tabs->insert( rb2=new QRadioButton( i18n("&Persistent"), m_tabs ), 1 );
    00340
    00341
    00342   layout->addStretch();
    00343
    00344   QWhatsThis::add(rb1, i18n(
    00345         "Selections will be overwritten by typed text and will be lost on "
    00346         "cursor movement."));
    00347   QWhatsThis::add(rb2, i18n(
    00348         "Selections will stay even after cursor movement and typing."));
    00349
    00350   reload ();
    00351
    00352   //
    00353   // after initial reload, connect the stuff for the changed () signal
    00354   //
    00355
    00356   connect(rb1, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00357   connect(rb2, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00358 }
    00359
    00360 void KateSelectConfigTab::apply ()
    00361 {
    00362   // nothing changed, no need to apply stuff
    00363   if (!changed())
    00364     return;
    00365   m_changed = false;
    00366
    00367   KateDocumentConfig::global()->configStart ();
    00368
    00369   int configFlags = KateDocumentConfig::global()->configFlags();
    00370
    00371   configFlags &= ~KateDocumentConfig::cfPersistent; // clear persistent
    00372
    00373   if (m_tabs->id (m_tabs->selected()) == 1)
    00374     configFlags |= KateDocumentConfig::cfPersistent; // set flag if checked
    00375
    00376   KateDocumentConfig::global()->setConfigFlags(configFlags);
    00377
    00378   KateDocumentConfig::global()->configEnd ();
    00379 }
    00380
    00381 void KateSelectConfigTab::reload ()
    00382 {
    00383   if (KateDocumentConfig::global()->configFlags() & KateDocumentConfig::cfPersistent)
    00384     m_tabs->setButton (1);
    00385   else
    00386     m_tabs->setButton (0);
    00387 }
    00388 //END KateSelectConfigTab
    00389
    00390 //BEGIN KateEditConfigTab
    00391 const int KateEditConfigTab::flags[] = {KateDocument::cfWordWrap,
    00392   KateDocument::cfAutoBrackets, KateDocument::cfShowTabs, KateDocument::cfSmartHome,
    00393   KateDocument::cfWrapCursor, KateDocumentConfig::cfReplaceTabsDyn, KateDocumentConfig::cfRemoveTrailingDyn};
    00394
    00395 KateEditConfigTab::KateEditConfigTab(QWidget *parent)
    00396   : KateConfigPage(parent)
    00397 {
    00398   QVBoxLayout *mainLayout = new QVBoxLayout(this, 0, KDialog::spacingHint() );
    00399   int configFlags = KateDocumentConfig::global()->configFlags();
    00400
    00401   QVGroupBox *gbWhiteSpace = new QVGroupBox(i18n("Tabulators"), this);
    00402
    00403   opt[2] = new QCheckBox(i18n("&Show tabs"), gbWhiteSpace);
    00404   opt[2]->setChecked(configFlags & flags[2]);
    00405   connect(opt[2], SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00406
    00407   opt[5] = new QCheckBox( i18n("&Replace tabs with spaces"), gbWhiteSpace );
    00408   opt[5]->setChecked( configFlags & KateDocumentConfig::cfReplaceTabsDyn );
    00409   connect( opt[5], SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
    00410
    00411   e2 = new KIntNumInput(KateDocumentConfig::global()->tabWidth(), gbWhiteSpace);
    00412   e2->setRange(1, 16, 1, false);
    00413   e2->setLabel(i18n("Tab width:"), AlignVCenter);
    00414   connect(e2, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
    00415
    00416   mainLayout->addWidget(gbWhiteSpace);
    00417
    00418   QVGroupBox *gbWordWrap = new QVGroupBox(i18n("Static Word Wrap"), this);
    00419
    00420   opt[0] = new QCheckBox(i18n("Enable static &word wrap"), gbWordWrap);
    00421   opt[0]->setChecked(KateDocumentConfig::global()->wordWrap());
    00422   connect(opt[0], SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00423
    00424   e1 = new KIntNumInput(KateDocumentConfig::global()->wordWrapAt(), gbWordWrap);
    00425   e1->setRange(20, 200, 1, false);
    00426   e1->setLabel(i18n("Wrap words at:"), AlignVCenter);
    00427   connect(e1, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
    00428
    00429   mainLayout->addWidget(gbWordWrap);
    00430
    00431   QVGroupBox *gbCursor = new QVGroupBox(i18n("Text Cursor Movement"), this);
    00432
    00433   opt[3] = new QCheckBox(i18n("Smart ho&me"), gbCursor);
    00434   opt[3]->setChecked(configFlags & flags[3]);
    00435   connect(opt[3], SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00436
    00437   opt[4] = new QCheckBox(i18n("Wrap c&ursor"), gbCursor);
    00438   opt[4]->setChecked(configFlags & flags[4]);
    00439   connect(opt[4], SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00440
    00441   e6 = new QCheckBox(i18n("&PageUp/PageDown moves cursor"), gbCursor);
    00442   e6->setChecked(KateDocumentConfig::global()->pageUpDownMovesCursor());
    00443   connect(e6, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00444
    00445   e4 = new KIntNumInput(KateViewConfig::global()->autoCenterLines(), gbCursor);
    00446   e4->setRange(0, 1000000, 1, false);
    00447   e4->setLabel(i18n("Autocenter cursor (lines):"), AlignVCenter);
    00448   connect(e4, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
    00449
    00450   mainLayout->addWidget(gbCursor);
    00451
    00452   opt[6] = new QCheckBox( i18n("Remove &trailing spaces"), this );
    00453   mainLayout->addWidget( opt[6] );
    00454   opt[6]->setChecked( configFlags & KateDocumentConfig::cfRemoveTrailingDyn );
    00455   connect( opt[6], SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
    00456
    00457   opt[1] = new QCheckBox(i18n("Auto &brackets"), this);
    00458   mainLayout->addWidget(opt[1]);
    00459   opt[1]->setChecked(configFlags & flags[1]);
    00460   connect(opt[1], SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00461
    00462   e3 = new KIntNumInput(e2, KateDocumentConfig::global()->undoSteps(), this);
    00463   e3->setRange(0, 1000000, 1, false);
    00464   e3->setSpecialValueText( i18n("Unlimited") );
    00465   e3->setLabel(i18n("Maximum undo steps:"), AlignVCenter);
    00466   mainLayout->addWidget(e3);
    00467   connect(e3, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
    00468
    00469   QHBoxLayout *e5Layout = new QHBoxLayout(mainLayout);
    00470   QLabel *e5Label = new QLabel(i18n("Smart search t&ext from:"), this);
    00471   e5Layout->addWidget(e5Label);
    00472   e5 = new KComboBox (this);
    00473   e5->insertItem( i18n("Nowhere") );
    00474   e5->insertItem( i18n("Selection Only") );
    00475   e5->insertItem( i18n("Selection, then Current Word") );
    00476   e5->insertItem( i18n("Current Word Only") );
    00477   e5->insertItem( i18n("Current Word, then Selection") );
    00478   e5->setCurrentItem(KateViewConfig::global()->textToSearchMode());
    00479   e5Layout->addWidget(e5);
    00480   e5Label->setBuddy(e5);
    00481   connect(e5, SIGNAL(activated(int)), this, SLOT(slotChanged()));
    00482
    00483   mainLayout->addStretch();
    00484
    00485   // What is this? help
    00486   QWhatsThis::add(opt[0], i18n(
    00487         "Automatically start a new line of text when the current line exceeds "
    00488         "the length specified by the <b>Wrap words at:</b> option."
    00489         "<p>This option does not wrap existing lines of text - use the <b>Apply "
    00490         "Static Word Wrap</b> option in the <b>Tools</b> menu for that purpose."
    00491         "<p>If you want lines to be <i>visually wrapped</i> instead, according "
    00492         "to the width of the view, enable <b>Dynamic Word Wrap</b> in the "
    00493         "<b>View Defaults</b> config page."));
    00494   QWhatsThis::add(e1, i18n(
    00495         "If the Word Wrap option is selected this entry determines the length "
    00496         "(in characters) at which the editor will automatically start a new line."));
    00497   QWhatsThis::add(opt[1], i18n(
    00498         "When the user types a left bracket ([,(, or {) KateView automatically "
    00499         "enters the right bracket (}, ), or ]) to the right of the cursor."));
    00500   QWhatsThis::add(opt[2], i18n(
    00501         "The editor will display a symbol to indicate the presence of a tab in "
    00502         "the text."));
    00503   QWhatsThis::add(opt[3], i18n(
    00504         "When selected, pressing the home key will cause the cursor to skip "
    00505         "whitespace and go to the start of a line's text."));
    00506   QWhatsThis::add(e3, i18n(
    00507         "Sets the number of undo/redo steps to record. More steps uses more memory."));
    00508   QWhatsThis::add(e4, i18n(
    00509         "Sets the number of lines to maintain visible above and below the "
    00510         "cursor when possible."));
    00511   QWhatsThis::add(opt[4], i18n(
    00512         "When on, moving the insertion cursor using the <b>Left</b> and "
    00513         "<b>Right</b> keys will go on to previous/next line at beginning/end of "
    00514         "the line, similar to most editors.<p>When off, the insertion cursor "
    00515         "cannot be moved left of the line start, but it can be moved off the "
    00516         "line end, which can be very handy for programmers."));
    00517   QWhatsThis::add(e6, i18n("Selects whether the PageUp and PageDown keys should alter the vertical position of the cursor relative to the top of the view."));
    00518   QString gstfwt = i18n(
    00519         "This determines where KateView will get the search text from "
    00520         "(this will be automatically entered into the Find Text dialog): "
    00521         "<br>"
    00522         "<ul>"
    00523         "<li><b>Nowhere:</b> Don't guess the search text."
    00524         "</li>"
    00525         "<li><b>Selection Only:</b> Use the current text selection, "
    00526         "if available."
    00527         "</li>"
    00528         "<li><b>Selection, then Current Word:</b> Use the current "
    00529         "selection if available, otherwise use the current word."
    00530         "</li>"
    00531         "<li><b>Current Word Only:</b> Use the word that the cursor "
    00532         "is currently resting on, if available."
    00533         "</li>"
    00534         "<li><b>Current Word, then Selection:</b> Use the current "
    00535         "word if available, otherwise use the current selection."
    00536         "</li>"
    00537         "</ul>"
    00538         "Note that, in all the above modes, if a search string has "
    00539         "not been or cannot be determined, then the Find Text Dialog "
    00540         "will fall back to the last search text.");
    00541   QWhatsThis::add(e5Label, gstfwt);
    00542   QWhatsThis::add(e5, gstfwt);
    00543   QWhatsThis::add( opt[5], i18n(
    00544       "If this is enabled, the editor will calculate the number of spaces up to "
    00545       "the next tab position as defined by the tab width, and insert that number "
    00546       "of spaces instead of a TAB character." ) );
    00547   QWhatsThis::add( opt[6], i18n(
    00548       "If this is enabled, the editor will remove any trailing whitespace on "
    00549       "lines when they are left by the insertion cursor.") );
    00550 }
    00551
    00552 void KateEditConfigTab::apply ()
    00553 {
    00554   // nothing changed, no need to apply stuff
    00555   if (!changed())
    00556     return;
    00557   m_changed = false;
    00558
    00559   KateViewConfig::global()->configStart ();
    00560   KateDocumentConfig::global()->configStart ();
    00561
    00562   int configFlags, z;
    00563
    00564   configFlags = KateDocumentConfig::global()->configFlags();
    00565   for (z = 1; z < numFlags; z++) {
    00566     configFlags &= ~flags[z];
    00567     if (opt[z]->isChecked()) configFlags |= flags[z];
    00568   }
    00569   KateDocumentConfig::global()->setConfigFlags(configFlags);
    00570
    00571   KateDocumentConfig::global()->setWordWrapAt(e1->value());
    00572   KateDocumentConfig::global()->setWordWrap (opt[0]->isChecked());
    00573   KateDocumentConfig::global()->setTabWidth(e2->value());
    00574
    00575   if (e3->value() <= 0)
    00576     KateDocumentConfig::global()->setUndoSteps(0);
    00577   else
    00578     KateDocumentConfig::global()->setUndoSteps(e3->value());
    00579
    00580   KateViewConfig::global()->setAutoCenterLines(QMAX(0, e4->value()));
    00581   KateViewConfig::global()->setTextToSearchMode(e5->currentItem());
    00582   KateDocumentConfig::global()->setPageUpDownMovesCursor(e6->isChecked());
    00583
    00584   KateDocumentConfig::global()->configEnd ();
    00585   KateViewConfig::global()->configEnd ();
    00586 }
    00587
    00588 void KateEditConfigTab::reload ()
    00589 {
    00590
    00591 }
    00592 //END KateEditConfigTab
    00593
    00594 //BEGIN KateViewDefaultsConfig
    00595 KateViewDefaultsConfig::KateViewDefaultsConfig(QWidget *parent)
    00596   :KateConfigPage(parent)
    00597 {
    00598   QRadioButton *rb1;
    00599   QRadioButton *rb2;
    00600
    00601   QVBoxLayout *blay=new QVBoxLayout(this,0,KDialog::spacingHint());
    00602
    00603   QVGroupBox *gbWordWrap = new QVGroupBox(i18n("Word Wrap"), this);
    00604
    00605   m_dynwrap=new QCheckBox(i18n("&Dynamic word wrap"),gbWordWrap);
    00606
    00607   QHBox *m_dynwrapIndicatorsLay = new QHBox (gbWordWrap);
    00608   m_dynwrapIndicatorsLabel = new QLabel( i18n("Dynamic word wrap indicators (if applicable):"), m_dynwrapIndicatorsLay );
    00609   m_dynwrapIndicatorsCombo = new KComboBox( m_dynwrapIndicatorsLay );
    00610   m_dynwrapIndicatorsCombo->insertItem( i18n("Off") );
    00611   m_dynwrapIndicatorsCombo->insertItem( i18n("Follow Line Numbers") );
    00612   m_dynwrapIndicatorsCombo->insertItem( i18n("Always On") );
    00613   m_dynwrapIndicatorsLabel->setBuddy(m_dynwrapIndicatorsCombo);
    00614
    00615   m_dynwrapAlignLevel = new KIntNumInput(gbWordWrap);
    00616   m_dynwrapAlignLevel->setLabel(i18n("Vertically align dynamically wrapped lines to indentation depth:"));
    00617   m_dynwrapAlignLevel->setRange(0, 80, 10);
    00618   // xgettext:no-c-format
    00619   m_dynwrapAlignLevel->setSuffix(i18n("% of View Width"));
    00620   m_dynwrapAlignLevel->setSpecialValueText(i18n("Disabled"));
    00621
    00622   m_wwmarker = new QCheckBox( i18n("&Show static word wrap marker (if applicable)"), gbWordWrap );
    00623
    00624   blay->addWidget(gbWordWrap);
    00625
    00626   QVGroupBox *gbFold = new QVGroupBox(i18n("Code Folding"), this);
    00627
    00628   m_folding=new QCheckBox(i18n("Show &folding markers (if available)"), gbFold );
    00629   m_collapseTopLevel = new QCheckBox( i18n("Collapse toplevel folding nodes"), gbFold );
    00630   m_collapseTopLevel->hide ();
    00631
    00632   blay->addWidget(gbFold);
    00633
    00634   QVGroupBox *gbBar = new QVGroupBox(i18n("Borders"), this);
    00635
    00636   m_icons=new QCheckBox(i18n("Show &icon border"),gbBar);
    00637   m_line=new QCheckBox(i18n("Show &line numbers"),gbBar);
    00638   m_scrollBarMarks=new QCheckBox(i18n("Show &scrollbar marks"),gbBar);
    00639
    00640   blay->addWidget(gbBar);
    00641
    00642   m_bmSort = new QButtonGroup( 1, Qt::Horizontal, i18n("Sort Bookmarks Menu"), this );
    00643   m_bmSort->setRadioButtonExclusive( true );
    00644   m_bmSort->insert( rb1=new QRadioButton( i18n("By &position"), m_bmSort ), 0 );
    00645   m_bmSort->insert( rb2=new QRadioButton( i18n("By c&reation"), m_bmSort ), 1 );
    00646
    00647   blay->addWidget(m_bmSort, 0 );
    00648   blay->addStretch(1000);
    00649
    00650   QWhatsThis::add(m_dynwrap,i18n(
    00651         "If this option is checked, the text lines will be wrapped at the view "
    00652         "border on the screen."));
    00653   QString wtstr = i18n("Choose when the Dynamic Word Wrap Indicators should be displayed");
    00654   QWhatsThis::add(m_dynwrapIndicatorsLabel, wtstr);
    00655   QWhatsThis::add(m_dynwrapIndicatorsCombo, wtstr);
    00656   // xgettext:no-c-format
    00657   QWhatsThis::add(m_dynwrapAlignLevel, i18n(
    00658         "<p>Enables the start of dynamically wrapped lines to be aligned "
    00659         "vertically to the indentation level of the first line.  This can help "
    00660         "to make code and markup more readable.</p><p>Additionally, this allows "
    00661         "you to set a maximum width of the screen, as a percentage, after which "
    00662         "dynamically wrapped lines will no longer be vertically aligned.  For "
    00663         "example, at 50%, lines whose indentation levels are deeper than 50% of "
    00664         "the width of the screen will not have vertical alignment applied to "
    00665         "subsequent wrapped lines.</p>"));
    00666   QWhatsThis::add( m_wwmarker, i18n(
    00667         "<p>If this option is checked, a vertical line will be drawn at the word "
    00668         "wrap column as defined in the <strong>Editing</strong> properties."
    00669         "<p>Note that the word wrap marker is only drawn if you use a fixed "
    00670         "pitch font." ));
    00671   QWhatsThis::add(m_line,i18n(
    00672         "If this option is checked, every new view will display line numbers "
    00673         "on the left hand side."));
    00674   QWhatsThis::add(m_icons,i18n(
    00675         "If this option is checked, every new view will display an icon border "
    00676         "on the left hand side.<br><br>The icon border shows bookmark signs, "
    00677         "for instance."));
    00678   QWhatsThis::add(m_scrollBarMarks,i18n(
    00679         "If this option is checked, every new view will show marks on the "
    00680         "vertical scrollbar.<br><br>These marks will, for instance, show "
    00681         "bookmarks."));
    00682   QWhatsThis::add(m_folding,i18n(
    00683         "If this option is checked, every new view will display marks for code "
    00684         "folding, if code folding is available."));
    00685   QWhatsThis::add(m_bmSort,i18n(
    00686         "Choose how the bookmarks should be ordered in the <b>Bookmarks</b> menu."));
    00687   QWhatsThis::add(rb1,i18n(
    00688         "The bookmarks will be ordered by the line numbers they are placed at."));
    00689   QWhatsThis::add(rb2,i18n(
    00690         "Each new bookmark will be added to the bottom, independently from "
    00691         "where it is placed in the document."));
    00692
    00693   reload();
    00694
    00695   //
    00696   // after initial reload, connect the stuff for the changed () signal
    00697   //
    00698
    00699   connect(m_dynwrap, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00700   connect(m_dynwrapIndicatorsCombo, SIGNAL(activated(int)), this, SLOT(slotChanged()));
    00701   connect(m_dynwrapAlignLevel, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
    00702   connect(m_wwmarker, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00703   connect(m_icons, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00704   connect(m_scrollBarMarks, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00705   connect(m_line, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00706   connect(m_folding, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00707   connect(m_collapseTopLevel, SIGNAL(toggled(bool)), this, SLOT(slotChanged()) );
    00708   connect(rb1, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00709   connect(rb2, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00710 }
    00711
    00712 KateViewDefaultsConfig::~KateViewDefaultsConfig()
    00713 {
    00714 }
    00715
    00716 void KateViewDefaultsConfig::apply ()
    00717 {
    00718   // nothing changed, no need to apply stuff
    00719   if (!changed())
    00720     return;
    00721   m_changed = false;
    00722
    00723   KateViewConfig::global()->configStart ();
    00724   KateRendererConfig::global()->configStart ();
    00725
    00726   KateViewConfig::global()->setDynWordWrap (m_dynwrap->isChecked());
    00727   KateViewConfig::global()->setDynWordWrapIndicators (m_dynwrapIndicatorsCombo->currentItem ());
    00728   KateViewConfig::global()->setDynWordWrapAlignIndent(m_dynwrapAlignLevel->value());
    00729   KateRendererConfig::global()->setWordWrapMarker (m_wwmarker->isChecked());
    00730   KateViewConfig::global()->setLineNumbers (m_line->isChecked());
    00731   KateViewConfig::global()->setIconBar (m_icons->isChecked());
    00732   KateViewConfig::global()->setScrollBarMarks (m_scrollBarMarks->isChecked());
    00733   KateViewConfig::global()->setFoldingBar (m_folding->isChecked());
    00734   KateViewConfig::global()->setBookmarkSort (m_bmSort->id (m_bmSort->selected()));
    00735
    00736   KateRendererConfig::global()->configEnd ();
    00737   KateViewConfig::global()->configEnd ();
    00738 }
    00739
    00740 void KateViewDefaultsConfig::reload ()
    00741 {
    00742   m_dynwrap->setChecked(KateViewConfig::global()->dynWordWrap());
    00743   m_dynwrapIndicatorsCombo->setCurrentItem( KateViewConfig::global()->dynWordWrapIndicators() );
    00744   m_dynwrapAlignLevel->setValue(KateViewConfig::global()->dynWordWrapAlignIndent());
    00745   m_wwmarker->setChecked( KateRendererConfig::global()->wordWrapMarker() );
    00746   m_line->setChecked(KateViewConfig::global()->lineNumbers());
    00747   m_icons->setChecked(KateViewConfig::global()->iconBar());
    00748   m_scrollBarMarks->setChecked(KateViewConfig::global()->scrollBarMarks());
    00749   m_folding->setChecked(KateViewConfig::global()->foldingBar());
    00750   m_bmSort->setButton( KateViewConfig::global()->bookmarkSort()  );
    00751 }
    00752
    00753 void KateViewDefaultsConfig::reset () {;}
    00754
    00755 void KateViewDefaultsConfig::defaults (){;}
    00756 //END KateViewDefaultsConfig
    00757
    00758 //BEGIN KateEditKeyConfiguration
    00759
    00760 KateEditKeyConfiguration::KateEditKeyConfiguration( QWidget* parent, KateDocument* doc )
    00761   : KateConfigPage( parent )
    00762 {
    00763   m_doc = doc;
    00764   m_ready = false;
    00765 }
    00766
    00767 void KateEditKeyConfiguration::showEvent ( QShowEvent * )
    00768 {
    00769   if (!m_ready)
    00770   {
    00771     (new QVBoxLayout(this))->setAutoAdd(true);
    00772     KateView* view = (KateView*)m_doc->views().at(0);
    00773     m_ac = view->editActionCollection();
    00774     m_keyChooser = new KKeyChooser( m_ac, this, false );
    00775     connect( m_keyChooser, SIGNAL( keyChange() ), this, SLOT( slotChanged() ) );
    00776     m_keyChooser->show ();
    00777
    00778     m_ready = true;
    00779   }
    00780
    00781   QWidget::show ();
    00782 }
    00783
    00784 void KateEditKeyConfiguration::apply()
    00785 {
    00786   if ( ! changed() )
    00787     return;
    00788   m_changed = false;
    00789
    00790   if (m_ready)
    00791   {
    00792     m_keyChooser->commitChanges();
    00793     m_ac->writeShortcutSettings( "Katepart Shortcuts" );
    00794   }
    00795 }
    00796 //END KateEditKeyConfiguration
    00797
    00798 //BEGIN KateSaveConfigTab
    00799 KateSaveConfigTab::KateSaveConfigTab( QWidget *parent )
    00800   : KateConfigPage( parent )
    00801 {
    00802   int configFlags = KateDocumentConfig::global()->configFlags();
    00803   QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint() );
    00804
    00805   QVGroupBox *gbEnc = new QVGroupBox(i18n("File Format"), this);
    00806   layout->addWidget( gbEnc );
    00807
    00808   QHBox *e5Layout = new QHBox(gbEnc);
    00809   QLabel *e5Label = new QLabel(i18n("&Encoding:"), e5Layout);
    00810   m_encoding = new KComboBox (e5Layout);
    00811   e5Label->setBuddy(m_encoding);
    00812
    00813   e5Layout = new QHBox(gbEnc);
    00814   e5Label = new QLabel(i18n("End &of line:"), e5Layout);
    00815   m_eol = new KComboBox (e5Layout);
    00816   e5Label->setBuddy(m_eol);
    00817
    00818   m_eol->insertItem (i18n("UNIX"));
    00819   m_eol->insertItem (i18n("DOS/Windows"));
    00820   m_eol->insertItem (i18n("Macintosh"));
    00821
    00822   QVGroupBox *gbMem = new QVGroupBox(i18n("Memory Usage"), this);
    00823   layout->addWidget( gbMem );
    00824
    00825   e5Layout = new QHBox(gbMem);
    00826   e5Layout->setSpacing (32);
    00827   blockCountLabel = new QLabel(i18n("Maximum loaded &blocks per file:"), e5Layout);
    00828   blockCount = new QSpinBox (4, 512, 4, e5Layout);
    00829
    00830   blockCount->setValue (KateBuffer::maxLoadedBlocks());
    00831   blockCountLabel->setBuddy(blockCount);
    00832
    00833   QVGroupBox *gbWhiteSpace = new QVGroupBox(i18n("Automatic Cleanups on Save"), this);
    00834   layout->addWidget( gbWhiteSpace );
    00835
    00836   replaceTabs = new QCheckBox(i18n("Replace &tabs with spaces"), gbWhiteSpace);
    00837   replaceTabs->setChecked(configFlags & KateDocument::cfReplaceTabs);
    00838
    00839   removeSpaces = new QCheckBox(i18n("Re&move trailing spaces"), gbWhiteSpace);
    00840   removeSpaces->setChecked(configFlags & KateDocument::cfRemoveSpaces);
    00841
    00842   QVGroupBox *dirConfigBox = new QVGroupBox(i18n("Folder Config File"), this);
    00843   layout->addWidget( dirConfigBox );
    00844
    00845   dirSearchDepth = new KIntNumInput(KateDocumentConfig::global()->searchDirConfigDepth(), dirConfigBox);
    00846   dirSearchDepth->setRange(-1, 64, 1, false);
    00847   dirSearchDepth->setSpecialValueText( i18n("Do not use config file") );
    00848   dirSearchDepth->setLabel(i18n("Se&arch depth for config file:"), AlignVCenter);
    00849
    00850   QGroupBox *gb = new QGroupBox( 1, Qt::Horizontal, i18n("Backup on Save"), this );
    00851   layout->addWidget( gb );
    00852   cbLocalFiles = new QCheckBox( i18n("&Local files"), gb );
    00853   cbRemoteFiles = new QCheckBox( i18n("&Remote files"), gb );
    00854
    00855   QHBox *hbBuPrefix = new QHBox( gb );
    00856   QLabel *lBuPrefix = new QLabel( i18n("&Prefix:"), hbBuPrefix );
    00857   leBuPrefix = new QLineEdit( hbBuPrefix );
    00858   lBuPrefix->setBuddy( leBuPrefix );
    00859
    00860   QHBox *hbBuSuffix = new QHBox( gb );
    00861   QLabel *lBuSuffix = new QLabel( i18n("&Suffix:"), hbBuSuffix );
    00862   leBuSuffix = new QLineEdit( hbBuSuffix );
    00863   lBuSuffix->setBuddy( leBuSuffix );
    00864
    00865   layout->addStretch();
    00866
    00867   QWhatsThis::add(replaceTabs, i18n(
    00868         "KateView will replace any tabs with the number of spaces indicated in "
    00869         "the Tab Width: entry."));
    00870   QWhatsThis::add(removeSpaces, i18n(
    00871         "KateView will automatically eliminate extra spaces at the ends of "
    00872         "lines of text."));
    00873   QWhatsThis::add( gb, i18n(
    00874         "<p>Backing up on save will cause Kate to copy the disk file to "
    00875         "'&lt;prefix&gt;&lt;filename&gt;&lt;suffix&gt;' before saving changes."
    00876         "<p>The suffix defaults to <strong>~</strong> and prefix is empty by default" ) );
    00877   QWhatsThis::add( cbLocalFiles, i18n(
    00878         "Check this if you want backups of local files when saving") );
    00879   QWhatsThis::add( cbRemoteFiles, i18n(
    00880         "Check this if you want backups of remote files when saving") );
    00881   QWhatsThis::add( leBuPrefix, i18n(
    00882         "Enter the prefix to prepend to the backup file names" ) );
    00883   QWhatsThis::add( leBuSuffix, i18n(
    00884         "Enter the suffix to add to the backup file names" ) );
    00885   QWhatsThis::add(dirSearchDepth, i18n(
    00886         "The editor will search the given number of folder levels upwards for .kateconfig file"
    00887         " and load the settings line from it." ));
    00888   QWhatsThis::add(blockCount, i18n(
    00889         "The editor will load given number of blocks (of around 2048 lines) of text into memory;"
    00890         " if the filesize is bigger than this the other blocks are swapped "
    00891         " to disk and loaded transparently as-needed.<br>"
    00892         " This can cause little delays while navigating in the document; a larger block count"
    00893         " increases the editing speed at the cost of memory. <br>For normal usage, just choose the highest possible"
    00894         " block count: limit it only if you have problems with the memory usage."));
    00895
    00896   reload();
    00897
    00898   //
    00899   // after initial reload, connect the stuff for the changed () signal
    00900   //
    00901
    00902   connect(m_encoding, SIGNAL(activated(int)), this, SLOT(slotChanged()));
    00903   connect(m_eol, SIGNAL(activated(int)), this, SLOT(slotChanged()));
    00904   connect(blockCount, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
    00905   connect(replaceTabs, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00906   connect(removeSpaces, SIGNAL(toggled(bool)), this, SLOT(slotChanged()));
    00907   connect( cbLocalFiles, SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00908   connect( cbRemoteFiles, SIGNAL( toggled(bool) ), this, SLOT( slotChanged() ) );
    00909   connect(dirSearchDepth, SIGNAL(valueChanged(int)), this, SLOT(slotChanged()));
    00910   connect( leBuPrefix, SIGNAL( textChanged ( const QString & ) ), this, SLOT( slotChanged() ) );
    00911   connect( leBuSuffix, SIGNAL( textChanged ( const QString & ) ), this, SLOT( slotChanged() ) );
    00912 }
    00913
    00914 void KateSaveConfigTab::apply()
    00915 {
    00916   // nothing changed, no need to apply stuff
    00917   if (!changed())
    00918     return;
    00919   m_changed = false;
    00920
    00921   KateBuffer::setMaxLoadedBlocks (blockCount->value());
    00922
    00923   KateDocumentConfig::global()->configStart ();
    00924
    00925   if ( leBuSuffix->text().isEmpty() && leBuPrefix->text().isEmpty() ) {
    00926     KMessageBox::information(
    00927                 this,
    00928                 i18n("You did not provide a backup suffix or prefix. Using default suffix: '~'"),
    00929                 i18n("No Backup Suffix or Prefix")
    00930                         );
    00931     leBuSuffix->setText( "~" );
    00932   }
    00933
    00934   uint f( 0 );
    00935   if ( cbLocalFiles->isChecked() )
    00936     f |= KateDocumentConfig::LocalFiles;
    00937   if ( cbRemoteFiles->isChecked() )
    00938     f |= KateDocumentConfig::RemoteFiles;
    00939
    00940   KateDocumentConfig::global()->setBackupFlags(f);
    00941   KateDocumentConfig::global()->setBackupPrefix(leBuPrefix->text());
    00942   KateDocumentConfig::global()->setBackupSuffix(leBuSuffix->text());
    00943
    00944   KateDocumentConfig::global()->setSearchDirConfigDepth(dirSearchDepth->value());
    00945
    00946   int configFlags = KateDocumentConfig::global()->configFlags();
    00947
    00948   configFlags &= ~KateDocument::cfReplaceTabs; // clear flag
    00949   if (replaceTabs->isChecked()) configFlags |= KateDocument::cfReplaceTabs; // set flag if checked
    00950
    00951   configFlags &= ~KateDocument::cfRemoveSpaces; // clear flag
    00952   if (removeSpaces->isChecked()) configFlags |= KateDocument::cfRemoveSpaces; // set flag if checked
    00953
    00954   KateDocumentConfig::global()->setConfigFlags(configFlags);
    00955
    00956   KateDocumentConfig::global()->setEncoding((m_encoding->currentItem() == 0) ? "" : KGlobal::charsets()->encodingForName(m_encoding->currentText()));
    00957
    00958   KateDocumentConfig::global()->setEol(m_eol->currentItem());
    00959
    00960   KateDocumentConfig::global()->configEnd ();
    00961 }
    00962
    00963 void KateSaveConfigTab::reload()
    00964 {
    00965   // encoding
    00966   m_encoding->clear ();
    00967   m_encoding->insertItem (i18n("KDE Default"));
    00968   m_encoding->setCurrentItem(0);
    00969   QStringList encodings (KGlobal::charsets()->descriptiveEncodingNames());
    00970   int insert = 1;
    00971   for (uint i=0; i < encodings.count(); i++)
    00972   {
    00973     bool found = false;
    00974     QTextCodec *codecForEnc = KGlobal::charsets()->codecForName(KGlobal::charsets()->encodingForName(encodings[i]), found);
    00975
    00976     if (found)
    00977     {
    00978       m_encoding->insertItem (encodings[i]);
    00979
    00980       if ( codecForEnc->name() == KateDocumentConfig::global()->encoding() )
    00981       {
    00982         m_encoding->setCurrentItem(insert);
    00983       }
    00984
    00985       insert++;
    00986     }
    00987   }
    00988
    00989   // eol
    00990   m_eol->setCurrentItem(KateDocumentConfig::global()->eol());
    00991
    00992   dirSearchDepth->setValue(KateDocumentConfig::global()->searchDirConfigDepth());
    00993
    00994   // other stuff
    00995   uint f ( KateDocumentConfig::global()->backupFlags() );
    00996   cbLocalFiles->setChecked( f & KateDocumentConfig::LocalFiles );
    00997   cbRemoteFiles->setChecked( f & KateDocumentConfig::RemoteFiles );
    00998   leBuPrefix->setText( KateDocumentConfig::global()->backupPrefix() );
    00999   leBuSuffix->setText( KateDocumentConfig::global()->backupSuffix() );
    01000 }
    01001
    01002 void KateSaveConfigTab::reset()
    01003 {
    01004 }
    01005
    01006 void KateSaveConfigTab::defaults()
    01007 {
    01008   cbLocalFiles->setChecked( true );
    01009   cbRemoteFiles->setChecked( false );
    01010   leBuPrefix->setText( "" );
    01011   leBuSuffix->setText( "~" );
    01012 }
    01013
    01014 //END KateSaveConfigTab
    01015
    01016 //BEGIN PluginListItem
    01017 class KatePartPluginListItem : public QCheckListItem
    01018 {
    01019   public:
    01020     KatePartPluginListItem(bool checked, uint i, const QString &name, QListView *parent);
    01021     uint pluginIndex () const { return index; }
    01022
    01023   protected:
    01024     void stateChange(bool);
    01025
    01026   private:
    01027     uint index;
    01028     bool silentStateChange;
    01029 };
    01030
    01031 KatePartPluginListItem::KatePartPluginListItem(bool checked, uint i, const QString &name, QListView *parent)
    01032   : QCheckListItem(parent, name, CheckBox)
    01033   , index(i)
    01034   , silentStateChange(false)
    01035 {
    01036   silentStateChange = true;
    01037   setOn(checked);
    01038   silentStateChange = false;
    01039 }
    01040
    01041 void KatePartPluginListItem::stateChange(bool b)
    01042 {
    01043   if(!silentStateChange)
    01044     static_cast<KatePartPluginListView *>(listView())->stateChanged(this, b);
    01045 }
    01046 //END
    01047
    01048 //BEGIN PluginListView
    01049 KatePartPluginListView::KatePartPluginListView(QWidget *parent, const char *name)
    01050   : KListView(parent, name)
    01051 {
    01052 }
    01053
    01054 void KatePartPluginListView::stateChanged(KatePartPluginListItem *item, bool b)
    01055 {
    01056   emit stateChange(item, b);
    01057 }
    01058 //END
    01059
    01060 //BEGIN KatePartPluginConfigPage
    01061 KatePartPluginConfigPage::KatePartPluginConfigPage (QWidget *parent) : KateConfigPage (parent, "")
    01062 {
    01063   // sizemanagment
    01064   QGridLayout *grid = new QGridLayout( this, 1, 1 );
    01065   grid->setSpacing( KDialogBase::spacingHint() );
    01066
    01067   listView = new KatePartPluginListView(this);
    01068   listView->addColumn(i18n("Name"));
    01069   listView->addColumn(i18n("Comment"));
    01070
    01071   grid->addWidget( listView, 0, 0);
    01072
    01073   for (uint i=0; i<KateFactory::self()->plugins().count(); i++)
    01074   {
    01075     KatePartPluginListItem *item = new KatePartPluginListItem(KateDocumentConfig::global()->plugin(i), i, (KateFactory::self()->plugins())[i]->name(), listView);
    01076     item->setText(0, (KateFactory::self()->plugins())[i]->name());
    01077     item->setText(1, (KateFactory::self()->plugins())[i]->comment());
    01078
    01079     m_items.append (item);
    01080   }
    01081
    01082   // configure button
    01083
    01084   btnConfigure = new QPushButton( i18n("Configure..."), this );
    01085   btnConfigure->setEnabled( false );
    01086   grid->addWidget( btnConfigure, 1, 0, Qt::AlignRight );
    01087   connect( btnConfigure, SIGNAL(clicked()), this, SLOT(slotConfigure()) );
    01088
    01089   connect( listView, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(slotCurrentChanged(QListViewItem*)) );
    01090   connect( listView, SIGNAL(stateChange(KatePartPluginListItem *, bool)),
    01091     this, SLOT(slotStateChanged(KatePartPluginListItem *, bool)));
    01092   connect(listView, SIGNAL(stateChange(KatePartPluginListItem *, bool)), this, SLOT(slotChanged()));
    01093 }
    01094
    01095 KatePartPluginConfigPage::~KatePartPluginConfigPage ()
    01096 {
    01097 }
    01098
    01099 void KatePartPluginConfigPage::apply ()
    01100 {
    01101   // nothing changed, no need to apply stuff
    01102   if (!changed())
    01103     return;
    01104   m_changed = false;
    01105
    01106   KateDocumentConfig::global()->configStart ();
    01107
    01108   for (uint i=0; i < m_items.count(); i++)
    01109     KateDocumentConfig::global()->setPlugin (m_items.at(i)->pluginIndex(), m_items.at(i)->isOn());
    01110
    01111   KateDocumentConfig::global()->configEnd ();
    01112 }
    01113
    01114 void KatePartPluginConfigPage::slotStateChanged( KatePartPluginListItem *item, bool b )
    01115 {
    01116   if ( b )
    01117     slotCurrentChanged( (QListViewItem*)item );
    01118 }
    01119
    01120 void KatePartPluginConfigPage::slotCurrentChanged( QListViewItem* i )
    01121 {
    01122   KatePartPluginListItem *item = static_cast<KatePartPluginListItem *>(i);
    01123   if ( ! item ) return;
    01124
    01125     bool b = false;
    01126   if ( item->isOn() )
    01127   {
    01128
    01129     // load this plugin, and see if it has config pages
    01130     KTextEditor::Plugin *plugin = KTextEditor::createPlugin(QFile::encodeName((KateFactory::self()->plugins())[item->pluginIndex()]->library()));
    01131     if ( plugin ) {
    01132       KTextEditor::ConfigInterfaceExtension *cie = KTextEditor::configInterfaceExtension( plugin );
    01133       b = ( cie && cie->configPages() );
    01134     }
    01135
    01136   }
    01137     btnConfigure->setEnabled( b );
    01138 }
    01139
    01140 void KatePartPluginConfigPage::slotConfigure()
    01141 {
    01142   KatePartPluginListItem *item = static_cast<KatePartPluginListItem*>(listView->currentItem());
    01143   KTextEditor::Plugin *plugin =
    01144     KTextEditor::createPlugin(QFile::encodeName((KateFactory::self()->plugins())[item->pluginIndex()]->library()));
    01145
    01146   if ( ! plugin ) return;
    01147
    01148   KTextEditor::ConfigInterfaceExtension *cife =
    01149     KTextEditor::configInterfaceExtension( plugin );
    01150
    01151   if ( ! cife )
    01152     return;
    01153
    01154   if ( ! cife->configPages() )
    01155     return;
    01156
    01157   // If we have only one page, we use a simple dialog, else an icon list type
    01158   KDialogBase::DialogType dt =
    01159     cife->configPages() > 1 ?
    01160       KDialogBase::IconList :     // still untested
    01161       KDialogBase::Plain;
    01162
    01163   QString name = (KateFactory::self()->plugins())[item->pluginIndex()]->name();
    01164   KDialogBase *kd = new KDialogBase ( dt,
    01165               i18n("Configure %1").arg( name ),
    01166               KDialogBase::Ok | KDialogBase::Cancel | KDialogBase::Help,
    01167               KDialogBase::Ok,
    01168               this );
    01169
    01170   QPtrList<KTextEditor::ConfigPage> editorPages;
    01171
    01172   for (uint i = 0; i < cife->configPages (); i++)
    01173   {
    01174     QWidget *page;
    01175     if ( dt == KDialogBase::IconList )
    01176     {
    01177       QStringList path;
    01178       path.clear();
    01179       path << cife->configPageName( i );
    01180       page = kd->addVBoxPage( path, cife->configPageFullName (i),
    01181                                 cife->configPagePixmap(i, KIcon::SizeMedium) );
    01182     }
    01183     else
    01184     {
    01185       page = kd->plainPage();
    01186       QVBoxLayout *_l = new QVBoxLayout( page );
    01187       _l->setAutoAdd( true );
    01188     }
    01189
    01190     editorPages.append( cife->configPage( i, page ) );
    01191   }
    01192
    01193   if (kd->exec())
    01194   {
    01195
    01196     for( uint i=0; i<editorPages.count(); i++ )
    01197     {
    01198       editorPages.at( i )->apply();
    01199     }
    01200   }
    01201
    01202   delete kd;
    01203 }
    01204 //END KatePartPluginConfigPage
    01205
    01206 //BEGIN KateHlConfigPage
    01207 KateHlConfigPage::KateHlConfigPage (QWidget *parent)
    01208  : KateConfigPage (parent, "")
    01209  , hlData (0)
    01210 {
    01211   QVBoxLayout *layout = new QVBoxLayout(this, 0, KDialog::spacingHint() );
    01212
    01213   // hl chooser
    01214   QHBox *hbHl = new QHBox( this );
    01215   layout->add (hbHl);
    01216
    01217   hbHl->setSpacing( KDialog::spacingHint() );
    01218   QLabel *lHl = new QLabel( i18n("H&ighlight:"), hbHl );
    01219   hlCombo = new QComboBox( false, hbHl );
    01220   lHl->setBuddy( hlCombo );
    01221   connect( hlCombo, SIGNAL(activated(int)),
    01222            this, SLOT(hlChanged(int)) );
    01223
    01224   for( int i = 0; i < KateHlManager::self()->highlights(); i++) {
    01225     if (KateHlManager::self()->hlSection(i).length() > 0)
    01226       hlCombo->insertItem(KateHlManager::self()->hlSection(i) + QString ("/") + KateHlManager::self()->hlNameTranslated(i));
    01227     else
    01228       hlCombo->insertItem(KateHlManager::self()->hlNameTranslated(i));
    01229   }
    01230   hlCombo->setCurrentItem(0);
    01231
    01232   QGroupBox *gbInfo = new QGroupBox( 1, Qt::Horizontal, i18n("Information"), this );
    01233   layout->add (gbInfo);
    01234
    01235   // author
    01236   QHBox *hb1 = new QHBox( gbInfo);
    01237   new QLabel( i18n("Author:"), hb1 );
    01238   author  = new QLabel (hb1);
    01239   author->setTextFormat (Qt::RichText);
    01240
    01241   // license
    01242   QHBox *hb2 = new QHBox( gbInfo);
    01243   new QLabel( i18n("License:"), hb2 );
    01244   license  = new QLabel (hb2);
    01245
    01246   QGroupBox *gbProps = new QGroupBox( 1, Qt::Horizontal, i18n("Properties"), this );
    01247   layout->add (gbProps);
    01248
    01249   // file & mime types
    01250   QHBox *hbFE = new QHBox( gbProps);
    01251   QLabel *lFileExts = new QLabel( i18n("File e&xtensions:"), hbFE );
    01252   wildcards  = new QLineEdit( hbFE );
    01253   lFileExts->setBuddy( wildcards );
    01254
    01255   QHBox *hbMT = new QHBox( gbProps );
    01256   QLabel *lMimeTypes = new QLabel( i18n("MIME &types:"), hbMT);
    01257   mimetypes = new QLineEdit( hbMT );
    01258   lMimeTypes->setBuddy( mimetypes );
    01259
    01260   QHBox *hbMT2 = new QHBox( gbProps );
    01261   QLabel *lprio = new QLabel( i18n("Prio&rity:"), hbMT2);
    01262   priority = new KIntNumInput( hbMT2 );
    01263
    01264   lprio->setBuddy( priority );
    01265
    01266   QToolButton *btnMTW = new QToolButton(hbMT);
    01267   btnMTW->setIconSet(QIconSet(SmallIcon("wizard")));
    01268   connect(btnMTW, SIGNAL(clicked()), this, SLOT(showMTDlg()));
    01269
    01270   // download/new buttons
    01271   QHBox *hbBtns = new QHBox( this );
    01272   layout->add (hbBtns);
    01273
    01274   ((QBoxLayout*)hbBtns->layout())->addStretch(1); // hmm.
    01275   hbBtns->setSpacing( KDialog::spacingHint() );
    01276   QPushButton *btnDl = new QPushButton(i18n("Do&wnload..."), hbBtns);
    01277   connect( btnDl, SIGNAL(clicked()), this, SLOT(hlDownload()) );
    01278
    01279   hlCombo->setCurrentItem( 0 );
    01280   hlChanged(0);
    01281
    01282   QWhatsThis::add( hlCombo, i18n(
    01283         "Choose a <em>Syntax Highlight mode</em> from this list to view its "
    01284         "properties below.") );
    01285   QWhatsThis::add( wildcards, i18n(
    01286         "The list of file extensions used to determine which files to highlight "
    01287         "using the current syntax highlight mode.") );
    01288   QWhatsThis::add( mimetypes, i18n(
    01289         "The list of Mime Types used to determine which files to highlight "
    01290         "using the current highlight mode.<p>Click the wizard button on the "
    01291         "left of the entry field to display the MimeType selection dialog.") );
    01292   QWhatsThis::add( btnMTW, i18n(
    01293         "Display a dialog with a list of all available mime types to choose from."
    01294         "<p>The <strong>File Extensions</strong> entry will automatically be "
    01295         "edited as well.") );
    01296   QWhatsThis::add( btnDl, i18n(
    01297         "Click this button to download new or updated syntax highlight "
    01298         "descriptions from the Kate website.") );
    01299
    01300   layout->addStretch ();
    01301
    01302   connect( wildcards, SIGNAL( textChanged ( const QString & ) ), this, SLOT( slotChanged() ) );
    01303   connect( mimetypes, SIGNAL( textChanged ( const QString & ) ), this, SLOT( slotChanged() ) );
    01304   connect( priority, SIGNAL( valueChanged ( int ) ), this, SLOT( slotChanged() ) );
    01305 }
    01306
    01307 KateHlConfigPage::~KateHlConfigPage ()
    01308 {
    01309 }
    01310
    01311 void KateHlConfigPage::apply ()
    01312 {
    01313   // nothing changed, no need to apply stuff
    01314   if (!changed())
    01315     return;
    01316   m_changed = false;
    01317
    01318   writeback();
    01319
    01320   for ( QIntDictIterator<KateHlData> it( hlDataDict ); it.current(); ++it )
    01321     KateHlManager::self()->getHl( it.currentKey() )->setData( it.current() );
    01322
    01323   KateHlManager::self()->getKConfig()->sync ();
    01324 }
    01325
    01326 void KateHlConfigPage::reload ()
    01327 {
    01328 }
    01329
    01330 void KateHlConfigPage::hlChanged(int z)
    01331 {
    01332   writeback();
    01333
    01334   KateHighlighting *hl = KateHlManager::self()->getHl( z );
    01335
    01336   if (!hl)
    01337   {
    01338     hlData = 0;
    01339     return;
    01340   }
    01341
    01342   if ( !hlDataDict.find( z ) )
    01343     hlDataDict.insert( z, hl->getData() );
    01344
    01345   hlData = hlDataDict.find( z );
    01346   wildcards->setText(hlData->wildcards);
    01347   mimetypes->setText(hlData->mimetypes);
    01348   priority->setValue(hlData->priority);
    01349
    01350   // split author string if needed into multiple lines !
    01351   QStringList l= QStringList::split (QRegExp("[,;]"), hl->author());
    01352   author->setText (l.join ("<br>"));
    01353
    01354   license->setText (hl->license());
    01355 }
    01356
    01357 void KateHlConfigPage::writeback()
    01358 {
    01359   if (hlData)
    01360   {
    01361     hlData->wildcards = wildcards->text();
    01362     hlData->mimetypes = mimetypes->text();
    01363     hlData->priority = priority->value();
    01364   }
    01365 }
    01366
    01367 void KateHlConfigPage::hlDownload()
    01368 {
    01369   KateHlDownloadDialog diag(this,"hlDownload",true);
    01370   diag.exec();
    01371 }
    01372
    01373 void KateHlConfigPage::showMTDlg()
    01374 {
    01375   QString text = i18n("Select the MimeTypes you want highlighted using the '%1' syntax highlight rules.\nPlease note that this will automatically edit the associated file extensions as well.").arg( hlCombo->currentText() );
    01376   QStringList list = QStringList::split( QRegExp("\\s*;\\s*"), mimetypes->text() );
    01377   KMimeTypeChooserDialog *d = new KMimeTypeChooserDialog( i18n("Select Mime Types"), text, list, "text", this );
    01378
    01379   if ( d->exec() == KDialogBase::Accepted ) {
    01380     // do some checking, warn user if mime types or patterns are removed.
    01381     // if the lists are empty, and the fields not, warn.
    01382     wildcards->setText(d->chooser()->patterns().join(";"));
    01383     mimetypes->setText(d->chooser()->mimeTypes().join(";"));
    01384   }
    01385 }
    01386 //END KateHlConfigPage
    01387
    01388 //BEGIN KateHlDownloadDialog
    01389 KateHlDownloadDialog::KateHlDownloadDialog(QWidget *parent, const char *name, bool modal)
    01390   :KDialogBase(KDialogBase::Swallow, i18n("Highlight Download"), User1|Close, User1, parent, name, modal, true, i18n("&Install"))
    01391 {
    01392   QVBox* vbox = new QVBox(this);
    01393   setMainWidget(vbox);
    01394   vbox->setSpacing(spacingHint());
    01395   new QLabel(i18n("Select the syntax highlighting files you want to update:"), vbox);
    01396   list = new QListView(vbox);
    01397   list->addColumn("");
    01398   list->addColumn(i18n("Name"));
    01399   list->addColumn(i18n("Installed"));
    01400   list->addColumn(i18n("Latest"));
    01401   list->setSelectionMode(QListView::Multi);
    01402   list->setAllColumnsShowFocus(true);
    01403
    01404   new QLabel(i18n("<b>Note:</b> New versions are selected automatically."), vbox);
    01405   actionButton (User1)->setIconSet(SmallIconSet("ok"));
    01406
    01407   transferJob = KIO::get(
    01408     KURL(QString(HLDOWNLOADPATH)
    01409        + QString("update-")
    01410        + QString(KATEPART_VERSION)
    01411        + QString(".xml")), true, true );
    01412   connect(transferJob, SIGNAL(data(KIO::Job *, const QByteArray &)),
    01413     this, SLOT(listDataReceived(KIO::Job *, const QByteArray &)));
    01414 //        void data( KIO::Job *, const QByteArray &data);
    01415   resize(450, 400);
    01416 }
    01417
    01418 KateHlDownloadDialog::~KateHlDownloadDialog(){}
    01419
    01420 void KateHlDownloadDialog::listDataReceived(KIO::Job *, const QByteArray &data)
    01421 {
    01422   if (!transferJob || transferJob->isErrorPage())
    01423   {
    01424     actionButton(User1)->setEnabled(false);
    01425     return;
    01426   }
    01427
    01428   listData+=QString(data);
    01429   kdDebug(13000)<<QString("CurrentListData: ")<<listData<<endl<<endl;
    01430   kdDebug(13000)<<QString("Data length: %1").arg(data.size())<<endl;
    01431   kdDebug(13000)<<QString("listData length: %1").arg(listData.length())<<endl;
    01432   if (data.size()==0)
    01433   {
    01434     if (listData.length()>0)
    01435     {
    01436       QString installedVersion;
    01437       KateHlManager *hlm=KateHlManager::self();
    01438       QDomDocument doc;
    01439       doc.setContent(listData);
    01440       QDomElement DocElem=doc.documentElement();
    01441       QDomNode n=DocElem.firstChild();
    01442       KateHighlighting *hl = 0;
    01443
    01444       if (n.isNull()) kdDebug(13000)<<"There is no usable childnode"<<endl;
    01445       while (!n.isNull())
    01446       {
    01447         installedVersion="    --";
    01448
    01449         QDomElement e=n.toElement();
    01450         if (!e.isNull())
    01451         kdDebug(13000)<<QString("NAME: ")<<e.tagName()<<QString(" - ")<<e.attribute("name")<<endl;
    01452         n=n.nextSibling();
    01453
    01454         QString Name=e.attribute("name");
    01455
    01456         for (int i=0;i<hlm->highlights();i++)
    01457         {
    01458           hl=hlm->getHl(i);
    01459           if (hl && hl->name()==Name)
    01460           {
    01461             installedVersion="    "+hl->version();
    01462             break;
    01463           }
    01464           else hl = 0;
    01465         }
    01466
    01467         // autoselect entry if new or updated.
    01468         QListViewItem* entry = new QListViewItem(
    01469           list, "", e.attribute("name"), installedVersion,
    01470           e.attribute("version"),e.attribute("url"));
    01471         if (!hl || hl->version() < e.attribute("version"))
    01472         {
    01473           entry->setSelected(true);
    01474           entry->setPixmap(0, SmallIcon(("knewstuff")));
    01475         }
    01476       }
    01477     }
    01478   }
    01479 }
    01480
    01481 void KateHlDownloadDialog::slotUser1()
    01482 {
    01483   QString destdir=KGlobal::dirs()->saveLocation("data","katepart/syntax/");
    01484   for (QListViewItem *it=list->firstChild();it;it=it->nextSibling())
    01485   {
    01486     if (list->isSelected(it))
    01487     {
    01488       KURL src(it->text(4));
    01489       QString filename=src.fileName(false);
    01490       QString dest = destdir+filename;
    01491
    01492       KIO::NetAccess::download(src,dest, this);
    01493     }
    01494   }
    01495
    01496   // update Config !!
    01497   KateSyntaxDocument doc (true);
    01498 }
    01499 //END KateHlDownloadDialog
    01500
    01501 //BEGIN KateGotoLineDialog
    01502 KateGotoLineDialog::KateGotoLineDialog(QWidget *parent, int line, int max)
    01503   : KDialogBase(parent, 0L, true, i18n("Go to Line"), Ok | Cancel, Ok) {
    01504
    01505   QWidget *page = new QWidget(this);
    01506   setMainWidget(page);
    01507
    01508   QVBoxLayout *topLayout = new QVBoxLayout( page, 0, spacingHint() );
    01509   e1 = new KIntNumInput(line, page);
    01510   e1->setRange(1, max);
    01511   e1->setEditFocus(true);
    01512
    01513   QLabel *label = new QLabel( e1,i18n("&Go to line:"), page );
    01514   topLayout->addWidget(label);
    01515   topLayout->addWidget(e1);
    01516   topLayout->addSpacing(spacingHint()); // A little bit extra space
    01517   topLayout->addStretch(10);
    01518   e1->setFocus();
    01519 }
    01520
    01521 int KateGotoLineDialog::getLine() {
    01522   return e1->value();
    01523 }
    01524 //END KateGotoLineDialog
    01525
    01526 //BEGIN KateModOnHdPrompt
    01527 KateModOnHdPrompt::KateModOnHdPrompt( KateDocument *doc,
    01528                                       int modtype,
    01529                                       const QString &reason,
    01530                                       QWidget *parent )
    01531   : KDialogBase( parent, "", true, "", Ok|Apply|Cancel|User1 ),
    01532     m_doc( doc ),
    01533     m_modtype ( modtype ),
    01534     m_tmpfile( 0 )
    01535 {
    01536   QString title, btnOK, whatisok;
    01537   if ( modtype == 3 ) // deleted
    01538   {
    01539     title = i18n("File Was Deleted on Disk");
    01540     btnOK = i18n("&Save File As...");
    01541     whatisok = i18n("Lets you select a location and save the file again.");
    01542   } else {
    01543     title = i18n("File Changed on Disk");
    01544     btnOK = i18n("&Reload File");
    01545     whatisok = i18n("Reload the file from disk. If you have unsaved changes, "
    01546         "they will be lost.");
    01547   }
    01548
    01549   setButtonText( Ok, btnOK);
    01550   setButtonText( Apply, i18n("&Ignore") );
    01551
    01552   setButtonWhatsThis( Ok, whatisok );
    01553   setButtonWhatsThis( Apply, i18n("Ignore the changes. You will not be prompted again.") );
    01554   setButtonWhatsThis( Cancel, i18n("Do nothing. Next time you focus the file, "
    01555       "or try to save it or close it, you will be prompted again.") );
    01556
    01557   enableButtonSeparator( true );
    01558   setCaption( title );
    01559
    01560   QFrame *w = makeMainWidget();
    01561   QVBoxLayout *lo = new QVBoxLayout( w );
    01562   QHBoxLayout *lo1 = new QHBoxLayout( lo );
    01563   QLabel *icon = new QLabel( w );
    01564   icon->setPixmap( DesktopIcon("messagebox_warning" ) );
    01565   lo1->addWidget( icon );
    01566   lo1->addWidget( new QLabel( reason + "\n\n" + i18n("What do you want to do?"), w ) );
    01567
    01568   // If the file isn't deleted, present a diff button, and a overwrite action.
    01569   if ( modtype != 3 )
    01570   {
    01571     QHBoxLayout *lo2 = new QHBoxLayout( lo );
    01572     QPushButton *btnDiff = new QPushButton( i18n("&View Difference"), w );
    01573     lo2->addStretch( 1 );
    01574     lo2->addWidget( btnDiff );
    01575     connect( btnDiff, SIGNAL(clicked()), this, SLOT(slotDiff()) );
    01576     QWhatsThis::add( btnDiff, i18n(
    01577         "Calculates the difference between the editor contents and the disk "
    01578         "file using diff(1) and opens the diff file with the default application "
    01579         "for that.") );
    01580
    01581     setButtonText( User1, i18n("Overwrite") );
    01582     setButtonWhatsThis( User1, i18n("Overwrite the disk file with the editor content.") );
    01583   }
    01584   else
    01585     showButton( User1, false );
    01586 }
    01587
    01588 KateModOnHdPrompt::~KateModOnHdPrompt()
    01589 {
    01590 }
    01591
    01592 void KateModOnHdPrompt::slotDiff()
    01593 {
    01594   // Start a KProcess that creates a diff
    01595   KProcIO *p = new KProcIO();
    01596   p->setComm( KProcess::All );
    01597   *p << "diff" << "-ub" << "-" <<  m_doc->url().path();
    01598   connect( p, SIGNAL(processExited(KProcess*)), this, SLOT(slotPDone(KProcess*)) );
    01599   connect( p, SIGNAL(readReady(KProcIO*)), this, SLOT(slotPRead(KProcIO*)) );
    01600
    01601   setCursor( WaitCursor );
    01602
    01603   p->start( KProcess::NotifyOnExit, true );
    01604
    01605   uint lastln =  m_doc->numLines();
    01606   for ( uint l = 0; l <  lastln; l++ )
    01607     p->writeStdin(  m_doc->textLine( l ), l < lastln );
    01608
    01609   p->closeWhenDone();
    01610 }
    01611
    01612 void KateModOnHdPrompt::slotPRead( KProcIO *p)
    01613 {
    01614   // create a file for the diff if we haven't one allready
    01615   if ( ! m_tmpfile )
    01616     m_tmpfile = new KTempFile();
    01617   // put all the data we have in it
    01618   QString stmp;
    01619   while ( p->readln( stmp, false ) > -1 )
    01620     *m_tmpfile->textStream() << stmp << endl;
    01621
    01622   p->ackRead();
    01623 }
    01624
    01625 void KateModOnHdPrompt::slotPDone( KProcess *p )
    01626 {
    01627   setCursor( ArrowCursor );
    01628   m_tmpfile->close();
    01629
    01630   if ( ! p->normalExit() /*|| p->exitStatus()*/ )
    01631   {
    01632     KMessageBox::sorry( this,
    01633                         i18n("The diff command failed. Please make sure that "
    01634                              "diff(1) is installed and in your PATH."),
    01635                         i18n("Error Creating Diff") );
    01636     return;
    01637   }
    01638
    01639   KRun::runURL( m_tmpfile->name(), "text/x-diff", true );
    01640   delete m_tmpfile;
    01641   m_tmpfile = 0;
    01642 }
    01643
    01644 void KateModOnHdPrompt::slotApply()
    01645 {
    01646   if ( KMessageBox::warningContinueCancel(
    01647        this,
    01648        i18n("Ignoring means that you will not be warned again (unless "
    01649             "the disk file changes once more): if you save the document, you "
    01650             "will overwrite the file on disk; if you do not save then the disk file "
    01651             "(if present) is what you have."),
    01652        i18n("You Are on Your Own"),
    01653        KStdGuiItem::cont(),
    01654        "kate_ignore_modonhd" ) != KMessageBox::Continue )
    01655     return;
    01656
    01657   done(Ignore);
    01658 }
    01659
    01660 void KateModOnHdPrompt::slotOk()
    01661 {
    01662   done( m_modtype == 3 ? Save : Reload );
    01663 }
    01664
    01665 void KateModOnHdPrompt::slotUser1()
    01666 {
    01667   done( Overwrite );
    01668 }
    01669
    01670 //END KateModOnHdPrompt
    01671
    01672 // kate: space-indent on; indent-width 2; replace-tabs on;

This file is part of the documentation for kate Library Version 3.4.1.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Sat Jun 11 20:36:32 2005 by doxygen 1.4.1 written by Dimitri van Heesch, © 1997-2003